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);
        }
Exemplo n.º 2
0
        public void TestDomReadOnlyLinkCreate(string name, string expectedRel, Link expectedLink)
        {
            // Arrange

            // Act
            var actual = DomReadOnlyLink.Create(expectedRel, expectedLink);

            this.Output.WriteLine("Test Name: {0}", name);
            this.Output.WriteLine(String.Empty);
            this.OutputDomTree(actual);

            // Assert
            DomReadOnlyLinkAssert.Equal(expectedRel, expectedLink, actual);
        }
Exemplo n.º 3
0
        // PUBLIC METHODS ///////////////////////////////////////////////////
        #region Assert Methods
        public static void Equal(string expectedRel, Link expectedLink, DomReadOnlyLink actual)
        {
            if (String.IsNullOrWhiteSpace(expectedRel))
            {
                Assert.Null(actual);
                return;
            }
            Assert.NotNull(actual);
            Assert.NotNull(expectedLink);

            Assert.Equal(DomNodeType.Link, actual.NodeType);

            // Rel
            var actualRel = actual.Rel;

            Assert.Equal(expectedRel, actualRel);

            // Link
            var actualLink = actual.Link;

            LinkAssert.Equal(expectedLink, actualLink);
        }
        private void ResolveDocumentHypermedia()
        {
            var documentPathContext = GetDocumentPathContext(this.DomDocument);

            if (documentPathContext == null)
            {
                return;
            }

            var hypermediaAssembler = this.HypermediaAssemblerRegistry.SafeGetAssembler(documentPathContext.DocumentSelfPath);

            var domLinks = (IDomLinks)this.DomDocument.GetNode(DomNodeType.Links);

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

            var domReadWriteLinks = (DomReadWriteLinks)domLinks;

            foreach (var domLink in domReadWriteLinks.Nodes().Cast <IDomLink>())
            {
                if (domLink.IsReadOnly)
                {
                    continue;
                }

                // Resolve read-write 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);

                var apiDocumentType = this.GetDocumentType();
                switch (apiDocumentType)
                {
                case DocumentType.Document:
                case DocumentType.ErrorsDocument:
                {
                    var apiDocumentLink = hypermediaAssembler.CreateDocumentLink(this.HypermediaContext, documentPathContext, apiDocumentType, linkContext);
                    var domReadOnlyLink = DomReadOnlyLink.Create(apiLinkRel, apiDocumentLink);
                    domReadWriteLinks.ReplaceNode(domReadWriteLink, domReadOnlyLink);
                }
                break;

                case DocumentType.EmptyDocument:
                {
                    var apiDocumentLink = hypermediaAssembler.CreateDocumentLink(this.HypermediaContext, documentPathContext, apiDocumentType, null, Enumerable.Empty <object>(), linkContext);
                    var domReadOnlyLink = DomReadOnlyLink.Create(apiLinkRel, apiDocumentLink);
                    domReadWriteLinks.ReplaceNode(domReadWriteLink, domReadOnlyLink);
                }
                break;

                case DocumentType.NullDocument:
                {
                    var apiDocumentLink = hypermediaAssembler.CreateDocumentLink(this.HypermediaContext, documentPathContext, apiDocumentType, null, null, linkContext);
                    var domReadOnlyLink = DomReadOnlyLink.Create(apiLinkRel, apiDocumentLink);
                    domReadWriteLinks.ReplaceNode(domReadWriteLink, domReadOnlyLink);
                }
                break;

                case DocumentType.ResourceCollectionDocument:
                {
                    var domResourceCollection = this.DomDocument
                                                .DomResources(false)
                                                .ToList();
                    var clrResourceType = domResourceCollection.Any()
                                ? domResourceCollection.First().ClrResourceType
                                : default(Type);
                    var clrResourceCollection = domResourceCollection.Select(x => x.ClrResource)
                                                .ToList();

                    var apiDocumentLink = hypermediaAssembler.CreateDocumentLink(this.HypermediaContext, documentPathContext, apiDocumentType, clrResourceType, clrResourceCollection, linkContext);
                    var domReadOnlyLink = DomReadOnlyLink.Create(apiLinkRel, apiDocumentLink);
                    domReadWriteLinks.ReplaceNode(domReadWriteLink, domReadOnlyLink);
                }
                break;

                case DocumentType.ResourceDocument:
                {
                    var domResource = this.DomDocument
                                      .DomResources(false)
                                      .SingleOrDefault();
                    var clrResourceType = domResource != null ? domResource.ClrResourceType : default(Type);
                    var clrResource     = domResource != null ? domResource.ClrResource : default(object);
                    var apiDocumentLink = hypermediaAssembler.CreateDocumentLink(this.HypermediaContext, documentPathContext, apiDocumentType, clrResourceType, clrResource, linkContext);
                    var domReadOnlyLink = DomReadOnlyLink.Create(apiLinkRel, apiDocumentLink);
                    domReadWriteLinks.ReplaceNode(domReadWriteLink, domReadOnlyLink);
                }
                break;

                case DocumentType.ResourceIdentifierCollectionDocument:
                {
                    var domResourceIdentifierCollection = this.DomDocument
                                                          .DomResourceIdentitifiers()
                                                          .ToList();
                    var clrResourceType = domResourceIdentifierCollection.Any()
                                ? domResourceIdentifierCollection.First().ClrResourceType
                                : default(Type);
                    var clrResourceCollection = Enumerable.Empty <object>();
                    if (clrResourceType != null)
                    {
                        var resourceType = this.ServiceModel.GetResourceType(clrResourceType);
                        clrResourceCollection = domResourceIdentifierCollection
                                                .Select(domResourceIdentifier =>
                            {
                                var clrResource = resourceType.CreateClrObject();

                                var apiResourceId = domResourceIdentifier.ApiResourceId;
                                resourceType.SetClrId(clrResource, apiResourceId);
                                return(clrResource);
                            })
                                                .ToList();
                    }

                    var apiDocumentLink = hypermediaAssembler.CreateDocumentLink(this.HypermediaContext, documentPathContext, apiDocumentType, clrResourceType, clrResourceCollection, linkContext);
                    var domReadOnlyLink = DomReadOnlyLink.Create(apiLinkRel, apiDocumentLink);
                    domReadWriteLinks.ReplaceNode(domReadWriteLink, domReadOnlyLink);
                }
                break;

                case DocumentType.ResourceIdentifierDocument:
                {
                    var domResourceIdentifier = this.DomDocument
                                                .DomResourceIdentitifiers()
                                                .SingleOrDefault();
                    var clrResourceType = domResourceIdentifier != null ? domResourceIdentifier.ClrResourceType : default(Type);
                    var clrResource     = default(object);
                    if (clrResourceType != null)
                    {
                        var resourceType = this.ServiceModel.GetResourceType(clrResourceType);
                        clrResource = resourceType.CreateClrObject();

                        var apiResourceId = domResourceIdentifier.ApiResourceId;
                        resourceType.SetClrId(clrResource, apiResourceId);
                    }

                    var apiDocumentLink = hypermediaAssembler.CreateDocumentLink(this.HypermediaContext, documentPathContext, apiDocumentType, clrResourceType, clrResource, linkContext);
                    var domReadOnlyLink = DomReadOnlyLink.Create(apiLinkRel, apiDocumentLink);
                    domReadWriteLinks.ReplaceNode(domReadWriteLink, domReadOnlyLink);
                }
                break;

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