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); }
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); }
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); } } } }