private void AddResourceLinkage(IServiceModel serviceModel, Type fromClrResourceType, object fromClrResource, string fromApiRel, Type toClrResourceType, IEnumerable <object> toClrResourceCollection)
        {
            Contract.Requires(serviceModel != null);
            Contract.Requires(String.IsNullOrWhiteSpace(fromApiRel));

            if (fromClrResourceType == null || fromClrResource == null)
            {
                return;
            }

            // Create ResourceLinkageKey from ToManyIncludedResources.
            var fromResourceType          = serviceModel.GetResourceType(fromClrResourceType);
            var fromApiResourceIdentifier = fromResourceType.GetApiResourceIdentifier(fromClrResource);
            var apiResourceLinkageKey     = new ApiResourceLinkageKey(fromApiResourceIdentifier, fromApiRel);

            // Create ResourceLinkage from ToManyIncludedResources.
            var toApiResourceIdentifierCollection = Enumerable.Empty <ResourceIdentifier>()
                                                    .ToList();

            if (toClrResourceType != null && toClrResourceCollection != null)
            {
                var toResourceType = serviceModel.GetResourceType(toClrResourceType);
                toApiResourceIdentifierCollection = toClrResourceCollection.Select(toResourceType.GetApiResourceIdentifier)
                                                    .ToList();
            }

            var apiResourceLinkage = new ApiResourceLinkage(toApiResourceIdentifierCollection);

            // Add ResourceLinkage to this DocumentBuilderContext
            this.AddResourceLinkage(apiResourceLinkageKey, apiResourceLinkage);
        }
        // PRIVATE METHODS //////////////////////////////////////////////////
        #region Methods
        private void AddResourceLinkage(IServiceModel serviceModel, Type fromClrResourceType, object fromClrResource, string fromApiRel, Type toClrResourceType, object toClrResource)
        {
            Contract.Requires(serviceModel != null);
            Contract.Requires(String.IsNullOrWhiteSpace(fromApiRel));

            if (fromClrResourceType == null || fromClrResource == null)
            {
                return;
            }

            // Create ResourceLinkageKey from ToOneIncludedResource.
            var fromResourceType          = serviceModel.GetResourceType(fromClrResourceType);
            var fromApiResourceIdentifier = fromResourceType.GetApiResourceIdentifier(fromClrResource);
            var apiResourceLinkageKey     = new ApiResourceLinkageKey(fromApiResourceIdentifier, fromApiRel);

            // Create ResourceLinkage from ToOneIncludedResource
            var toApiResourceIdentifier = default(ResourceIdentifier);

            if (toClrResourceType != null && toClrResource != null)
            {
                var toResourceType = serviceModel.GetResourceType(toClrResourceType);
                toApiResourceIdentifier = toResourceType.GetApiResourceIdentifier(toClrResource);
            }

            var apiResourceLinkage = new ApiResourceLinkage(toApiResourceIdentifier);

            // Add ResourceLinkage to this DocumentBuilderContext
            this.AddResourceLinkage(apiResourceLinkageKey, apiResourceLinkage);
        }
Esempio n. 3
0
        // PROTECTED CONSTRUCTORS ///////////////////////////////////////////
        #region Constructors
        protected ResourceIdentifierBuilder(IServiceModel serviceModel, IContainerNode <DomNodeType> domContainerNode, Type clrResourceType, object clrResource)
        {
            Contract.Requires(serviceModel != null);
            Contract.Requires(domContainerNode != null);

            this.DomContainerNode = domContainerNode;

            if (clrResourceType == null)
            {
                return;
            }

            this.BuildingResourceIdentifier = true;

            var resourceType = serviceModel.GetResourceType(clrResourceType);

            this.ResourceType = resourceType;

            if (clrResource == null)
            {
                return;
            }

            this.CreateAndAddDomReadWriteResourceIdentifierIfNeeded();
            this.DomReadWriteResourceIdentifier.SetDomIdFromClrResource(this.ResourceType, clrResource);
        }
Esempio n. 4
0
        // INTERNAL CONSTRUCTORS ////////////////////////////////////////////
        #region Constructors
        internal RelationshipsCollectionBuilder(TParentBuilder parentBuilder, IServiceModel serviceModel, IReadOnlyCollection <IContainerNode <DomNodeType> > domContainerNodeCollection, IReadOnlyList <TResource> clrResourceCollection)
        {
            Contract.Requires(parentBuilder != null);
            Contract.Requires(serviceModel != null);
            Contract.Requires(domContainerNodeCollection != null);

            var domReadWriteRelationshipsCollectionCount = domContainerNodeCollection.Count;
            var clrResourceCollectionCount = clrResourceCollection.Count;

            if (clrResourceCollectionCount != domReadWriteRelationshipsCollectionCount)
            {
                var detail = ServerErrorStrings
                             .InternalErrorExceptionDetailCollectionCountMismatch
                             .FormatWith("DOM read-write relationships collection", domReadWriteRelationshipsCollectionCount, "CLR resource collection", clrResourceCollectionCount);
                throw new InternalErrorException(detail);
            }

            this.ParentBuilder = parentBuilder;

            this.ServiceModel = serviceModel;

            var resourceType = serviceModel.GetResourceType <TResource>();

            this.ResourceType = resourceType;

            var domReadWriteRelationshipsCollection = domContainerNodeCollection
                                                      .Select(x => x.GetOrAddNode(DomNodeType.Relationships, () => DomReadWriteRelationships.Create()))
                                                      .ToList();

            this.DomReadWriteRelationshipsCollection = domReadWriteRelationshipsCollection;

            this.ClrResourceCollection = clrResourceCollection;
        }
Esempio n. 5
0
        public void TestServiceModelNonGenericGetResourceType(string name, bool resourceTypeExists, IServiceModel serviceModel, string apiResourceType, IResourceType expected)
        {
            this.Output.WriteLine("Test Name: {0}", name);
            this.Output.WriteLine(String.Empty);

            // Arrange

            // Act
            if (!resourceTypeExists)
            {
                Assert.Throws <ServiceModelException>(() => serviceModel.GetResourceType(apiResourceType));
                return;
            }
            var actual = serviceModel.GetResourceType(apiResourceType);

            // Assert
            ResourceTypeAssert.Equal(expected, actual);
        }
Esempio n. 6
0
        // INTERNAL CONSTRUCTORS ////////////////////////////////////////////
        #region Constructors
        internal RelationshipCollectionBuilder(TParentBuilder parentBuilder, IServiceModel serviceModel, IReadOnlyList <DomReadWriteRelationships> domReadWriteRelationshipsCollection, IReadOnlyList <TResource> clrResourceCollection, string rel, Func <TResource, bool> predicate)
        {
            Contract.Requires(parentBuilder != null);
            Contract.Requires(serviceModel != null);
            Contract.Requires(domReadWriteRelationshipsCollection != null);
            Contract.Requires(clrResourceCollection != null);
            Contract.Requires(String.IsNullOrWhiteSpace(rel) == false);

            var domReadWriteRelationshipsCollectionCount = domReadWriteRelationshipsCollection.Count;
            var clrResourceCollectionCount = clrResourceCollection.Count;

            if (clrResourceCollectionCount != domReadWriteRelationshipsCollectionCount)
            {
                var detail = ServerErrorStrings
                             .InternalErrorExceptionDetailCollectionCountMismatch
                             .FormatWith("DOM read-write relationships collection", domReadWriteRelationshipsCollectionCount, "CLR resource collection", clrResourceCollectionCount);
                throw new InternalErrorException(detail);
            }

            this.ParentBuilder = parentBuilder;

            this.ServiceModel = serviceModel;

            var resourceType = serviceModel.GetResourceType <TResource>();

            this.ResourceType = resourceType;

            this.Rel = rel;

            var domReadWriteRelationshipCollection = new List <DomReadWriteRelationship>();
            var clrResourceCollectionFiltered      = new List <TResource>();

            var count = clrResourceCollectionCount;

            for (var i = 0; i < count; ++i)
            {
                var clrResource        = clrResourceCollection[i];
                var canAddRelationship = predicate == null || predicate(clrResource);
                if (canAddRelationship == false)
                {
                    continue;
                }

                var domReadWriteRelationships = domReadWriteRelationshipsCollection[i];
                var domReadWriteRelationship  = domReadWriteRelationships.AddDomReadWriteRelationship(rel);
                domReadWriteRelationshipCollection.Add(domReadWriteRelationship);

                clrResourceCollectionFiltered.Add(clrResource);
            }

            this.DomReadWriteRelationshipCollection = domReadWriteRelationshipCollection;
            this.ClrResourceCollection = clrResourceCollectionFiltered;
        }
Esempio n. 7
0
        public void AddResourceLinkage <TFromResource, TToResource>(IServiceModel serviceModel, IToManyIncludedResources <TFromResource, TToResource> toManyIncludedResources)
            where TFromResource : class, IResource
            where TToResource : class, IResource
        {
            Contract.Requires(serviceModel != null);
            Contract.Requires(toManyIncludedResources != null);

            // Create ResourceLinkageKey from ToManyIncludedResources.
            var fromClrResourceType = typeof(TFromResource);
            var fromResourceType    = serviceModel.GetResourceType(fromClrResourceType);

            var fromClrResource           = toManyIncludedResources.FromResource;
            var fromApiResourceIdentifier = fromResourceType.GetApiResourceIdentifier(fromClrResource);

            var fromApiRel = toManyIncludedResources.FromRel;

            var apiResourceLinkageKey = new ApiResourceLinkageKey(fromApiResourceIdentifier, fromApiRel);

            // Create ResourceLinkage from ToManyIncludedResources.
            var toApiResourceIdentifierCollection = Enumerable.Empty <ResourceIdentifier>()
                                                    .ToList();

            var toClrResourceCollection = toManyIncludedResources.ToResourceCollection;

            if (toClrResourceCollection != null)
            {
                var toClrResourceType = typeof(TToResource);
                var toResourceType    = serviceModel.GetResourceType(toClrResourceType);

                toApiResourceIdentifierCollection = toClrResourceCollection.Select(toResourceType.GetApiResourceIdentifier)
                                                    .ToList();
            }

            var apiResourceLinkage = new ApiResourceLinkage(toApiResourceIdentifierCollection);

            // Add ResourceLinkage to this DocumentBuilderContext
            this.AddResourceLinkage(apiResourceLinkageKey, apiResourceLinkage);
        }
Esempio n. 8
0
        public void AddResourceLinkage <TFromResource, TToResource>(IServiceModel serviceModel, IToOneIncludedResource <TFromResource, TToResource> toOneIncludedResource)
            where TFromResource : class, IResource
            where TToResource : class, IResource
        {
            Contract.Requires(serviceModel != null);
            Contract.Requires(toOneIncludedResource != null);

            // Create ResourceLinkageKey from ToOneIncludedResource.
            var fromClrResourceType = typeof(TFromResource);
            var fromResourceType    = serviceModel.GetResourceType(fromClrResourceType);

            var fromClrResource           = toOneIncludedResource.FromResource;
            var fromApiResourceIdentifier = fromResourceType.GetApiResourceIdentifier(fromClrResource);

            var fromApiRel = toOneIncludedResource.FromRel;

            var apiResourceLinkageKey = new ApiResourceLinkageKey(fromApiResourceIdentifier, fromApiRel);

            // Create ResourceLinkage from ToOneIncludedResource
            var toApiResourceIdentifier = default(ResourceIdentifier);

            var toClrResource = toOneIncludedResource.ToResource;

            if (toClrResource != null)
            {
                var toClrResourceType = typeof(TToResource);
                var toResourceType    = serviceModel.GetResourceType(toClrResourceType);

                toApiResourceIdentifier = toResourceType.GetApiResourceIdentifier(toClrResource);
            }

            var apiResourceLinkage = new ApiResourceLinkage(toApiResourceIdentifier);

            // Add ResourceLinkage to this DocumentBuilderContext
            this.AddResourceLinkage(apiResourceLinkageKey, apiResourceLinkage);
        }
        // INTERNAL CONSTRUCTORS ////////////////////////////////////////////
        #region Constructors
        internal RelationshipsBuilder(TParentBuilder parentBuilder, IServiceModel serviceModel, IContainerNode <DomNodeType> domContainerNode)
        {
            Contract.Requires(parentBuilder != null);
            Contract.Requires(serviceModel != null);
            Contract.Requires(domContainerNode != null);

            this.ParentBuilder = parentBuilder;

            this.ServiceModel = serviceModel;

            var resourceType = serviceModel.GetResourceType <TResource>();

            this.ResourceType = resourceType;

            var domReadWriteRelationships = domContainerNode.GetOrAddNode(DomNodeType.Relationships, () => DomReadWriteRelationships.Create());

            this.DomReadWriteRelationships = domReadWriteRelationships;
        }
Esempio n. 10
0
        // INTERNAL CONSTRUCTORS ////////////////////////////////////////////
        #region Constructors
        internal RelationshipBuilderBase(IServiceModel serviceModel, IContainerNode <DomNodeType> domContainerNode, string rel)
        {
            Contract.Requires(serviceModel != null);
            Contract.Requires(domContainerNode != null);
            Contract.Requires(String.IsNullOrWhiteSpace(rel) == false);

            this.ServiceModel = serviceModel;

            var resourceType = serviceModel.GetResourceType <TResource>();

            this.ResourceType = resourceType;

            this.Rel = rel;

            var domReadWriteRelationships = (DomReadWriteRelationships)domContainerNode;
            var domReadWriteRelationship  = domReadWriteRelationships.AddDomReadWriteRelationship(rel);

            this.DomReadWriteRelationship = domReadWriteRelationship;
        }
Esempio n. 11
0
        // INTERNAL CONSTRUCTORS ////////////////////////////////////////////
        #region Constructors
        internal RelationshipCollectionBuilder(TParentBuilder parentBuilder, IServiceModel serviceModel, IReadOnlyList <DomReadWriteRelationships> domReadWriteRelationshipsCollection, Type clrResourceType, string rel)
        {
            Contract.Requires(parentBuilder != null);
            Contract.Requires(serviceModel != null);
            Contract.Requires(domReadWriteRelationshipsCollection != null);
            Contract.Requires(String.IsNullOrWhiteSpace(rel) == false);

            this.ParentBuilder = parentBuilder;

            this.ServiceModel = serviceModel;

            var resourceType = serviceModel.GetResourceType(clrResourceType);

            this.ResourceType = resourceType;

            this.Rel = rel;

            var domReadWriteRelationshipCollection = domReadWriteRelationshipsCollection.Select(x => x.AddDomReadWriteRelationship(rel))
                                                     .ToList();

            this.DomReadWriteRelationshipCollection = domReadWriteRelationshipCollection;
        }
Esempio n. 12
0
        // PROTECTED CONSTRUCTORS ///////////////////////////////////////////
        #region Constructors
        protected ResourceIdentifierCollectionBuilder(IServiceModel serviceModel, IContainerNode <DomNodeType> domContainerNode, Type clrResourceType, IEnumerable <object> clrResourceCollection)
        {
            Contract.Requires(serviceModel != null);
            Contract.Requires(domContainerNode != null);

            this.DomContainerNode = domContainerNode;

            if (clrResourceType == null)
            {
                return;
            }

            this.BuildingResourceIdentifierCollection = true;

            var resourceType = serviceModel.GetResourceType(clrResourceType);

            this.ResourceType = resourceType;

            if (clrResourceCollection == null)
            {
                return;
            }

            var clrResourceReadOnlyList      = clrResourceCollection.SafeToReadOnlyList();
            var clrResourceReadOnlyListCount = clrResourceReadOnlyList.Count;

            this.CreateAndAddDomReadWriteResourceIdentifierCollectionIfNeeded(clrResourceReadOnlyListCount);

            for (var i = 0; i < clrResourceReadOnlyListCount; ++i)
            {
                var domReadWriteResourceIdentifier = this.DomReadWriteResourceIdentifierCollection[i];

                var clrResource = clrResourceReadOnlyList[i];
                domReadWriteResourceIdentifier.SetDomIdFromClrResource(this.ResourceType, clrResource);
            }
        }
Esempio n. 13
0
        // INTERNAL CONSTRUCTORS ////////////////////////////////////////////
        #region Constructors
        internal RelationshipsCollectionBuilder(TParentBuilder parentBuilder, IServiceModel serviceModel, IReadOnlyCollection <IContainerNode <DomNodeType> > domContainerNodeCollection, Type clrResourceType, IReadOnlyList <object> clrResourceCollection)
        {
            Contract.Requires(parentBuilder != null);
            Contract.Requires(serviceModel != null);
            Contract.Requires(domContainerNodeCollection != null);
            Contract.Requires(clrResourceType != null);
            Contract.Requires(clrResourceCollection != null);

            this.ParentBuilder = parentBuilder;

            this.ServiceModel = serviceModel;

            var resourceType = serviceModel.GetResourceType(clrResourceType);

            this.ResourceType = resourceType;

            var domReadWriteRelationshipsCollection = domContainerNodeCollection
                                                      .Select(x => x.GetOrAddNode(DomNodeType.Relationships, () => DomReadWriteRelationships.Create()))
                                                      .ToList();

            this.DomReadWriteRelationshipsCollection = domReadWriteRelationshipsCollection;

            this.ClrResourceCollection = clrResourceCollection;
        }
Esempio n. 14
0
        public static IResourceType GetResourceType <TResource>(this IServiceModel serviceModel)
        {
            Contract.Requires(serviceModel != null);

            return(serviceModel.GetResourceType(typeof(TResource)));
        }
Esempio n. 15
0
        private static bool NextIteration(IServiceModel serviceModel, IEnumerator <string> urlPathSegmentsEnumerator, ICollection <IHypermediaPath> documentSelfPath)
        {
            // Parse for the next relationship CLR resource type represented as
            // either a to-many resource collection, to-many resource, or to-one resource
            // in the URL path.
            var previousResourceTypePath = documentSelfPath.Last(x => x.HasClrResourceType());
            var previousClrResourceType  = previousResourceTypePath.GetClrResourceType();
            var previousResourceType     = serviceModel.GetResourceType(previousClrResourceType);

            var relationship                        = default(IRelationshipInfo);
            var nonResourcePathSegments             = default(List <string>);
            var pathSegmentToRelationshipDictionary = default(IDictionary <string, IRelationshipInfo>);

            while (urlPathSegmentsEnumerator.MoveNext())
            {
                var currentUrlPathSegment = urlPathSegmentsEnumerator.Current;

                pathSegmentToRelationshipDictionary = pathSegmentToRelationshipDictionary ?? previousResourceType
                                                      .RelationshipsInfo
                                                      .Collection
                                                      .ToDictionary(x => x.ApiRelPathSegment, StringComparer.OrdinalIgnoreCase);

                // Iterate over URL path segments until the current URL path segment
                // represents a relationship path segment.
                if (pathSegmentToRelationshipDictionary.TryGetValue(currentUrlPathSegment, out relationship))
                {
                    // Done iterating.
                    break;
                }

                // Keep iterating.
                nonResourcePathSegments = nonResourcePathSegments ?? new List <string>();
                nonResourcePathSegments.Add(currentUrlPathSegment);
            }

            // Add any non-resource path segments if needed.
            var nonResourcePathSegmentsFound = nonResourcePathSegments != null;

            if (nonResourcePathSegmentsFound)
            {
                var nonResourceTypePath = new NonResourceHypermediaPath(nonResourcePathSegments);
                documentSelfPath.Add(nonResourceTypePath);
            }

            // If no relationship path segments found, then done.
            var noRelationshipPathSegments = relationship == null;

            if (noRelationshipPathSegments)
            {
                return(false);
            }

            // Iterate one more URL path segment for a possible resource identifier.
            var clrResourceType = relationship.ToClrType;
            var apiRelationshipRelPathSegment = urlPathSegmentsEnumerator.Current;
            var apiRelationshipCardinality    = relationship.ToCardinality;

            bool continueIterating;

            switch (apiRelationshipCardinality)
            {
            case RelationshipCardinality.ToOne:
            {
                continueIterating = true;

                var toOneResourcePath = new ToOneResourceHypermediaPath(clrResourceType, apiRelationshipRelPathSegment);
                documentSelfPath.Add(toOneResourcePath);
            }
            break;

            case RelationshipCardinality.ToMany:
            {
                var moreUrlPathSegments = urlPathSegmentsEnumerator.MoveNext();
                continueIterating = moreUrlPathSegments;

                if (!moreUrlPathSegments)
                {
                    var toManyResourceCollectionPath = new ToManyResourceCollectionHypermediaPath(clrResourceType, apiRelationshipRelPathSegment);
                    documentSelfPath.Add(toManyResourceCollectionPath);
                }
                else
                {
                    var apiId = urlPathSegmentsEnumerator.Current;
                    var toManyResourcePath = new ToManyResourceHypermediaPath(clrResourceType, apiRelationshipRelPathSegment, apiId);
                    documentSelfPath.Add(toManyResourcePath);
                }
            }
            break;

            default:
            {
                var detail = InfrastructureErrorStrings.InternalErrorExceptionDetailUnknownEnumerationValue
                             .FormatWith(typeof(RelationshipCardinality).Name, apiRelationshipCardinality);
                throw new InternalErrorException(detail);
            }
            }

            return(continueIterating);
        }