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