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); }
// 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); }
// 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; }
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); }
// 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; }
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); }
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; }
// 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; }
// 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; }
// 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); } }
// 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; }
public static IResourceType GetResourceType <TResource>(this IServiceModel serviceModel) { Contract.Requires(serviceModel != null); return(serviceModel.GetResourceType(typeof(TResource))); }
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); }