private static void ResolveResourceLink(IDomLink domLink,
                                                IHypermediaContext hypermediaContext,
                                                IHypermediaAssembler hypermediaAssembler,
                                                IResourcePathContext resourcePathContext,
                                                Type clrResourceType,
                                                object clrResource,
                                                DomReadWriteLinks domReadWriteLinks)
        {
            if (domLink.IsReadOnly)
            {
                return;
            }

            // Resolve read-write resource link
            var domReadWriteLink = (DomReadWriteLink)domLink;
            var apiLinkRel       = domReadWriteLink.Rel;

            var apiLinkMeta = default(Meta);
            var domLinkMeta = (IDomMeta)domReadWriteLink.GetNode(DomNodeType.Meta);

            if (domLinkMeta != null)
            {
                apiLinkMeta = domLinkMeta.Meta;
            }

            // Create link.
            var linkContext     = new LinkContext(apiLinkRel, apiLinkMeta);
            var apiResourceLink = hypermediaAssembler.CreateResourceLink(hypermediaContext, resourcePathContext, clrResourceType, clrResource, linkContext);

            // Replace the old DOM read-write link node with a new DOM read-only link created by the framework.
            var domReadOnlyLink = DomReadOnlyLink.Create(apiLinkRel, apiResourceLink);

            domReadWriteLinks.ReplaceNode(domReadWriteLink, domReadOnlyLink);
        }
        private void ResolveResourceRelationships(DomReadWriteResource domReadWriteResource,
                                                  IHypermediaContext hypermediaContext,
                                                  IHypermediaAssembler hypermediaAssembler,
                                                  IResourcePathContext resourcePathContext,
                                                  Type clrResourceType,
                                                  object clrResource)
        {
            var domRelationships = (IDomRelationships)domReadWriteResource.GetNode(DomNodeType.Relationships);

            if (domRelationships == null || domRelationships.IsReadOnly)
            {
                return;
            }

            var domReadWriteRelationships = (DomReadWriteRelationships)domRelationships;

            foreach (var domRelationship in domReadWriteRelationships.Nodes().Cast <IDomRelationship>())
            {
                this.ResolveResourceRelationship(domRelationship, hypermediaContext, hypermediaAssembler, resourcePathContext, clrResourceType, clrResource, domReadWriteRelationships);
            }
        }
        private static void ResolveResourceLinks(DomReadWriteResource domReadWriteResource,
                                                 IHypermediaContext hypermediaContext,
                                                 IHypermediaAssembler hypermediaAssembler,
                                                 IResourcePathContext resourcePathContext,
                                                 Type clrResourceType,
                                                 object clrResource)
        {
            var domLinks = (IDomLinks)domReadWriteResource.GetNode(DomNodeType.Links);

            if (domLinks == null || domLinks.IsReadOnly)
            {
                return;
            }

            var domReadWriteLinks = (DomReadWriteLinks)domLinks;

            foreach (var domLink in domReadWriteLinks.Nodes().Cast <IDomLink>())
            {
                ResolveResourceLink(domLink, hypermediaContext, hypermediaAssembler, resourcePathContext, clrResourceType, clrResource, domReadWriteLinks);
            }
        }
        private void ResolveResourceRelationship(IDomRelationship domRelationship,
                                                 IHypermediaContext hypermediaContext,
                                                 IHypermediaAssembler hypermediaAssembler,
                                                 IResourcePathContext resourcePathContext,
                                                 Type clrResourceType,
                                                 object clrResource,
                                                 DomReadWriteRelationships domReadWriteRelationships)
        {
            if (domRelationship.IsReadOnly)
            {
                return;
            }

            // Resolve read-write relationship
            var domReadWriteRelationship = (DomReadWriteRelationship)domRelationship;

            // .. Rel
            var apiRelationshipRel = domReadWriteRelationship.Rel;

            // .. Links
            var linkContexts         = new List <ILinkContext>();
            var domRelationshipLinks = (IDomLinks)domReadWriteRelationship.GetNode(DomNodeType.Links);

            if (domRelationshipLinks != null)
            {
                if (domRelationshipLinks.IsReadOnly)
                {
                    // A read-write relationship contains unexpected read-only relationship links.
                    var detail = ServerErrorStrings.DomExceptionDetailReadWriteNodeHasUnexpectedReadOnlyChildNode
                                 .FormatWith(DomNodeType.Relationship, DomNodeType.Links);
                    throw new DomException(detail);
                }

                var domReadWriteRelationshipLinks = (DomReadWriteLinks)domRelationshipLinks;
                foreach (var domLink in domReadWriteRelationshipLinks.Nodes().Cast <IDomLink>())
                {
                    if (domLink.IsReadOnly)
                    {
                        // A read-write relationship contains unexpected read-only relationship link.
                        var detail = ServerErrorStrings.DomExceptionDetailReadWriteNodeHasUnexpectedReadOnlyChildNode
                                     .FormatWith(DomNodeType.Relationship, DomNodeType.Link);
                        throw new DomException(detail);
                    }

                    // Resolve read-write relationship link
                    var domReadWriteLink = (DomReadWriteLink)domLink;
                    var apiLinkRel       = domReadWriteLink.Rel;

                    var apiLinkMeta = default(Meta);
                    var domMeta     = (IDomMeta)domReadWriteLink.GetNode(DomNodeType.Meta);
                    if (domMeta != null)
                    {
                        apiLinkMeta = domMeta.Meta;
                    }

                    var linkContext = new LinkContext(apiLinkRel, apiLinkMeta);
                    linkContexts.Add(linkContext);
                }
            }

            // .. Data
            var resourceType = this.ServiceModel.GetResourceType(clrResourceType);
            var fromApiResourceIdentifier = resourceType.GetApiResourceIdentifier(clrResource);

            var             resourceLinkageKey = new ResourceLinkageKey(fromApiResourceIdentifier, apiRelationshipRel);
            ResourceLinkage resourceLinkage;
            var             hasResourceLinkage = this.DocumentBuilderContext.TryGetResourceLinkage(resourceLinkageKey, out resourceLinkage);

            // .. Meta
            var apiRelationshipMeta = default(Meta);
            var domRelationshipMeta = (IDomMeta)domReadWriteRelationship.GetNode(DomNodeType.Meta);

            if (domRelationshipMeta != null)
            {
                apiRelationshipMeta = domRelationshipMeta.Meta;
            }

            // Create the correct relationship context based on resource linkage (if any).
            RelationshipContext relationshipContext;

            if (hasResourceLinkage)
            {
                var resourceLinkageType = resourceLinkage.Type;
                switch (resourceLinkageType)
                {
                case ResourceLinkageType.ToOneResourceLinkage:
                {
                    var toOneResourceLinkage = resourceLinkage.ToOneResourceLinkage;
                    relationshipContext = new ToOneRelationshipContext(apiRelationshipRel, linkContexts, toOneResourceLinkage, apiRelationshipMeta);
                }
                break;

                case ResourceLinkageType.ToManyResourceLinkage:
                {
                    var toManyResourceLinkage = resourceLinkage.ToManyResourceLinkage;
                    relationshipContext = new ToManyRelationshipContext(apiRelationshipRel, linkContexts, toManyResourceLinkage, apiRelationshipMeta);
                }
                break;

                default:
                {
                    var detail = InfrastructureErrorStrings.InternalErrorExceptionDetailUnknownEnumerationValue
                                 .FormatWith(typeof(ResourceLinkageType).Name, resourceLinkageType);
                    throw new InternalErrorException(detail);
                }
                }
            }
            else
            {
                relationshipContext = new RelationshipContext(apiRelationshipRel, linkContexts, apiRelationshipMeta);
            }

            // Create relationship.
            var apiResourceRelationship = hypermediaAssembler.CreateResourceRelationship(hypermediaContext, resourcePathContext, clrResourceType, clrResource, relationshipContext);

            // Replace the old DOM read-write relationship node with a new DOM read-only relationship created by the framework.
            var domReadOnlyRelationship = DomReadOnlyRelationship.Create(apiRelationshipRel, apiResourceRelationship);

            domReadWriteRelationships.ReplaceNode(domReadWriteRelationship, domReadOnlyRelationship);
        }
        public void TestHypermediaAssemblerRegistryGetAssembler(string name, IEnumerable <IHypermediaAssembler> hypermediaAssemblers, Func <IHypermediaAssemblerRegistry, IHypermediaAssembler> getAssemblerFunc, IHypermediaAssembler expectedHypermediaAssembler)
        {
            this.Output.WriteLine("Test Name: {0}", name);
            this.Output.WriteLine(String.Empty);

            // Arrange
            var hypermediaAssemblerRegistry = new HypermediaAssemblerRegistry(hypermediaAssemblers);

            // Act
            var actualHypermediaAssembler = getAssemblerFunc(hypermediaAssemblerRegistry);

            // Assert
            HypermediaAssemblerAssert.Equal(expectedHypermediaAssembler, actualHypermediaAssembler);
        }
Exemple #6
0
        // PUBLIC METHODS ///////////////////////////////////////////////////
        #region Assert Methods
        public static void Equal(IHypermediaAssembler expected, IHypermediaAssembler actual)
        {
            if (expected == null)
            {
                Assert.Null(actual);
                return;
            }
            Assert.NotNull(actual);

            var expectedType = expected.GetType();

            Assert.IsType(expectedType, actual);

            if (expectedType.IsImplementationOf(typeof(IHypermediaAssembler <, , , , , ,>)))
            {
                var expectedTypes = GetHypermediaAssemblerTypes7(expectedType, expected);
                var actualTypes   = GetHypermediaAssemblerTypes7(expectedType, expected);

                Assert.Equal(expectedTypes.Item1, actualTypes.Item1);
                Assert.Equal(expectedTypes.Item2, actualTypes.Item2);
                Assert.Equal(expectedTypes.Item3, actualTypes.Item3);
                Assert.Equal(expectedTypes.Item4, actualTypes.Item4);
                Assert.Equal(expectedTypes.Item5, actualTypes.Item5);
                Assert.Equal(expectedTypes.Item6, actualTypes.Item6);
                Assert.Equal(expectedTypes.Item7, actualTypes.Item7);
            }
            else if (expectedType.IsImplementationOf(typeof(IHypermediaAssembler <, , , , ,>)))
            {
                var expectedTypes = GetHypermediaAssemblerTypes6(expectedType, expected);
                var actualTypes   = GetHypermediaAssemblerTypes6(expectedType, expected);

                Assert.Equal(expectedTypes.Item1, actualTypes.Item1);
                Assert.Equal(expectedTypes.Item2, actualTypes.Item2);
                Assert.Equal(expectedTypes.Item3, actualTypes.Item3);
                Assert.Equal(expectedTypes.Item4, actualTypes.Item4);
                Assert.Equal(expectedTypes.Item5, actualTypes.Item5);
                Assert.Equal(expectedTypes.Item6, actualTypes.Item6);
            }
            else if (expectedType.IsImplementationOf(typeof(IHypermediaAssembler <, , , ,>)))
            {
                var expectedTypes = GetHypermediaAssemblerTypes5(expectedType, expected);
                var actualTypes   = GetHypermediaAssemblerTypes5(expectedType, expected);

                Assert.Equal(expectedTypes.Item1, actualTypes.Item1);
                Assert.Equal(expectedTypes.Item2, actualTypes.Item2);
                Assert.Equal(expectedTypes.Item3, actualTypes.Item3);
                Assert.Equal(expectedTypes.Item4, actualTypes.Item4);
                Assert.Equal(expectedTypes.Item5, actualTypes.Item5);
            }
            else if (expectedType.IsImplementationOf(typeof(IHypermediaAssembler <, , ,>)))
            {
                var expectedTypes = GetHypermediaAssemblerTypes4(expectedType, expected);
                var actualTypes   = GetHypermediaAssemblerTypes4(expectedType, expected);

                Assert.Equal(expectedTypes.Item1, actualTypes.Item1);
                Assert.Equal(expectedTypes.Item2, actualTypes.Item2);
                Assert.Equal(expectedTypes.Item3, actualTypes.Item3);
                Assert.Equal(expectedTypes.Item4, actualTypes.Item4);
            }
            else if (expectedType.IsImplementationOf(typeof(IHypermediaAssembler <, ,>)))
            {
                var expectedTypes = GetHypermediaAssemblerTypes3(expectedType, expected);
                var actualTypes   = GetHypermediaAssemblerTypes3(expectedType, expected);

                Assert.Equal(expectedTypes.Item1, actualTypes.Item1);
                Assert.Equal(expectedTypes.Item2, actualTypes.Item2);
                Assert.Equal(expectedTypes.Item3, actualTypes.Item3);
            }
            else if (expectedType.IsImplementationOf(typeof(IHypermediaAssembler <,>)))
            {
                var expectedTypes = GetHypermediaAssemblerTypes2(expectedType, expected);
                var actualTypes   = GetHypermediaAssemblerTypes2(expectedType, expected);

                Assert.Equal(expectedTypes.Item1, actualTypes.Item1);
                Assert.Equal(expectedTypes.Item2, actualTypes.Item2);
            }
            else if (expectedType.IsImplementationOf(typeof(IHypermediaAssembler <>)))
            {
                var expectedTypes = GetHypermediaAssemblerTypes1(expectedType, expected);
                var actualTypes   = GetHypermediaAssemblerTypes1(expectedType, expected);

                Assert.Equal(expectedTypes.Item1, actualTypes.Item1);
            }
            else if (expectedType == DefaultHypermediaAssemblerType)
            {
                // NOOP
            }
            else
            {
                Assert.True(false, "Unknown hypermedia assembler types.");
            }
        }