Example #1
0
        private static Links CreateResourceRelationshipLinks(IHypermediaContext hypermediaContext,
                                                             IResourcePathContext resourcePathContext,
                                                             IResourceType resourceType,
                                                             object clrResource,
                                                             IRelationshipInfo relationship,
                                                             IRelationshipContext relationshipContext)
        {
            Contract.Requires(hypermediaContext != null);
            Contract.Requires(resourcePathContext != null);
            Contract.Requires(resourceType != null);
            Contract.Requires(clrResource != null);
            Contract.Requires(relationship != null);
            Contract.Requires(relationshipContext != null);

            var apiRelationshipHasLinks = relationshipContext.HasLinks();

            if (!apiRelationshipHasLinks)
            {
                return(null);
            }

            var links = relationshipContext.LinkContexts;
            var apiRelationshipRelToLinkDictionary = links
                                                     .Select(x =>
            {
                var rel        = x.Rel;
                var meta       = x.Meta;
                var isSelfLink = String.Compare(Keywords.Self, rel, StringComparison.Ordinal) == 0;
                var link       = CreateResourceRelationshipLink(hypermediaContext, resourcePathContext, resourceType, clrResource, isSelfLink, relationship, meta);
                return(new Tuple <string, Link>(rel, link));
            })
                                                     .ToDictionary(x => x.Item1, x => x.Item2);

            var apiRelationshipLinks = new Links(apiRelationshipRelToLinkDictionary);

            return(apiRelationshipLinks);
        }
Example #2
0
        private static Relationship CreateResourceRelationship(Links apiRelationshipLinks, IResourceType resourceType, IRelationshipInfo relationship, IRelationshipContext relationshipContext)
        {
            Contract.Requires(resourceType != null);
            Contract.Requires(relationship != null);
            Contract.Requires(relationshipContext != null);

            var apiRelationshipToCardinality = relationship.ToCardinality;
            var apiRelationshipMeta          = relationshipContext.Meta;
            var apiRelationshipType          = relationshipContext.GetRelationshipType();

            switch (apiRelationshipType)
            {
            case RelationshipType.Relationship:
            {
                var apiRelationship = new Relationship
                {
                    Links = apiRelationshipLinks,
                    Meta  = apiRelationshipMeta
                };
                return(apiRelationship);
            }

            case RelationshipType.ToOneRelationship:
            {
                if (apiRelationshipToCardinality != RelationshipCardinality.ToOne)
                {
                    var apiRel = relationshipContext.Rel;
                    var fromClrResourceTypeName = resourceType.ClrType.Name;
                    var toClrResourceTypeName   = relationship.ToClrType.Name;
                    var detail = ServerErrorStrings
                                 .DocumentBuildExceptionDetailBuildResourceRelationshipCardinalityMismatch
                                 .FormatWith(apiRel, fromClrResourceTypeName, toClrResourceTypeName, RelationshipCardinality.ToOne, apiRelationshipToCardinality);
                    throw new DocumentBuildException(detail);
                }

                var apiToOneResourceLinkage = relationshipContext.GetToOneResourceLinkage();
                var apiRelationship         = new ToOneRelationship
                {
                    Links = apiRelationshipLinks,
                    Data  = apiToOneResourceLinkage,
                    Meta  = apiRelationshipMeta
                };
                return(apiRelationship);
            }

            case RelationshipType.ToManyRelationship:
            {
                if (apiRelationshipToCardinality != RelationshipCardinality.ToMany)
                {
                    var apiRel = relationshipContext.Rel;
                    var fromClrResourceTypeName = resourceType.ClrType.Name;
                    var toClrResourceTypeName   = relationship.ToClrType.Name;
                    var detail = ServerErrorStrings
                                 .DocumentBuildExceptionDetailBuildResourceRelationshipCardinalityMismatch
                                 .FormatWith(apiRel, fromClrResourceTypeName, toClrResourceTypeName, RelationshipCardinality.ToMany, apiRelationshipToCardinality);
                    throw new DocumentBuildException(detail);
                }

                var apiToManyResourceLinkage = relationshipContext.GetToManyResourceLinkage()
                                               .SafeToList();
                var apiRelationship = new ToManyRelationship
                {
                    Links = apiRelationshipLinks,
                    Data  = apiToManyResourceLinkage,
                    Meta  = apiRelationshipMeta
                };
                return(apiRelationship);
            }

            default:
            {
                var detail = InfrastructureErrorStrings.InternalErrorExceptionDetailUnknownEnumerationValue
                             .FormatWith(typeof(RelationshipType).Name, apiRelationshipType);
                throw new InternalErrorException(detail);
            }
            }
        }
Example #3
0
        public Relationship CreateResourceRelationship(IHypermediaContext hypermediaContext, IResourcePathContext resourcePathContext, Type clrResourceType, object clrResource, IRelationshipContext relationshipContext)
        {
            Contract.Requires(hypermediaContext != null);
            Contract.Requires(resourcePathContext != null);
            Contract.Requires(clrResourceType != null);
            Contract.Requires(clrResource != null);
            Contract.Requires(relationshipContext != null);

            var apiRel = relationshipContext.Rel;

            var serviceModel = hypermediaContext.GetServiceModel();
            var resourceType = serviceModel.GetResourceType(clrResourceType);
            var relationship = resourceType.GetRelationshipInfo(apiRel);

            // Create the Links object of the relationship.
            var apiRelationshipLinks = CreateResourceRelationshipLinks(hypermediaContext, resourcePathContext, resourceType, clrResource, relationship, relationshipContext);

            // Create the relationship:
            var apiRelationship = CreateResourceRelationship(apiRelationshipLinks, resourceType, relationship, relationshipContext);

            return(apiRelationship);
        }
        // PUBLIC METHODS ///////////////////////////////////////////////////
        #region Extensions Methods
        public static bool HasLinks(this IRelationshipContext relationshipContext)
        {
            Contract.Requires(relationshipContext != null);

            return(relationshipContext.LinkContexts != null && relationshipContext.LinkContexts.Any());
        }