public Task Serialize(IResourceLinkage linkage, JsonWriter writer) { if (linkage.IsToMany) { writer.WriteStartArray(); foreach (var resourceIdentifier in linkage.Identifiers) { WriteResourceIdentifier(resourceIdentifier, writer); } writer.WriteEndArray(); } else { var initialIdentifier = linkage.Identifiers.FirstOrDefault(); if (initialIdentifier == null) { writer.WriteNull(); } else { WriteResourceIdentifier(initialIdentifier, writer); } } return(Task.FromResult(0)); }
/// <summary> /// Builds a new RelationshipObject with links and linkage /// </summary> public RelationshipObject(IResourceLinkage linkage, ILink selfLink, ILink relatedResourceLink, IMetadata metadata = null) { Linkage = linkage; SelfLink = selfLink; RelatedResourceLink = relatedResourceLink; Metadata = metadata; }
public async Task <IRelationshipObject> Deserialize(JsonReader reader, string currentPath) { if (reader.TokenType != JsonToken.StartObject) { throw new DeserializationException("Invalid relationship object", "Expected an object, but found " + reader.TokenType, currentPath); } IResourceLinkage linkage = null; IMetadata metadata = null; while (reader.Read()) { if (reader.TokenType == JsonToken.EndObject) { break; } var propertyName = (string)reader.Value; reader.Read(); switch (propertyName) { case LinkageKeyName: linkage = await _resourceLinkageFormatter.Deserialize(reader, currentPath + "/" + LinkageKeyName); break; case MetaKeyName: metadata = await _metadataFormatter.Deserialize(reader, currentPath + "/" + MetaKeyName); break; } } return(new RelationshipObject(linkage, metadata)); }
public Task Serialize(IResourceLinkage linkage, JsonWriter writer) { if (linkage.IsToMany) { writer.WriteStartArray(); foreach (var resourceIdentifier in linkage.Identifiers) { WriteResourceIdentifier(resourceIdentifier, writer); } writer.WriteEndArray(); } else { var initialIdentifier = linkage.Identifiers.FirstOrDefault(); if (initialIdentifier == null) writer.WriteNull(); else { WriteResourceIdentifier(initialIdentifier, writer); } } return Task.FromResult(0); }
/// <summary> /// Builds a new RelationshipObject with linkage only /// </summary> public RelationshipObject(IResourceLinkage linkage, IMetadata metadata = null) { Linkage = linkage; Metadata = metadata; }
/// <summary> /// Creates a JSON API resource object from the given CLR object /// </summary> /// <param name="modelObject"></param> /// <param name="idDictionariesByType"></param> /// <param name="currentPath"></param> /// <param name="includePathExpressions"></param> /// <param name="linkBaseUrl"></param> /// <param name="resourceObjectMetadata"></param> /// <returns></returns> protected ResourceObject CreateResourceObject(object modelObject, IDictionary <string, IDictionary <string, ResourceObject> > idDictionariesByType, string currentPath, string[] includePathExpressions, string linkBaseUrl, IDictionary <object, IMetadata> resourceObjectMetadata) { if (modelObject == null) { return(null); } var modelObjectRuntimeType = modelObject.GetType(); var resourceTypeRegistration = _resourceTypeRegistry.GetRegistrationForType(modelObjectRuntimeType); var attributes = new Dictionary <string, JToken>(); var relationships = new Dictionary <string, IRelationshipObject>(); foreach (var attribute in resourceTypeRegistration.Attributes) { var propertyValue = attribute.GetValue(modelObject); attributes[attribute.JsonKey] = propertyValue; } foreach (var modelRelationship in resourceTypeRegistration.Relationships) { IResourceLinkage linkage = null; var childPath = currentPath == null ? modelRelationship.JsonKey : (currentPath + "." + modelRelationship.JsonKey); if (includePathExpressions != null && includePathExpressions.Any(e => PathExpressionMatchesCurrentPath(childPath, e))) { if (modelRelationship.IsToMany) { var propertyValue = (IEnumerable <object>)modelRelationship.Property.GetValue(modelObject); if (propertyValue != null) { var identifiers = new List <IResourceIdentifier>(); foreach (var relatedResource in propertyValue) { var identifier = GetResourceIdentifierForResource(relatedResource); identifiers.Add(identifier); IDictionary <string, ResourceObject> idDictionary; if (!idDictionariesByType.TryGetValue(identifier.Type, out idDictionary)) { idDictionary = new Dictionary <string, ResourceObject>(); idDictionariesByType[identifier.Type] = idDictionary; } ResourceObject relatedResourceObject; if (!idDictionary.TryGetValue(identifier.Id, out relatedResourceObject)) { relatedResourceObject = CreateResourceObject(relatedResource, idDictionariesByType, childPath, includePathExpressions, linkBaseUrl, resourceObjectMetadata); idDictionary[identifier.Id] = relatedResourceObject; } } linkage = new ToManyResourceLinkage(identifiers.ToArray()); } } else { var relatedResource = modelRelationship.Property.GetValue(modelObject); if (relatedResource != null) { var identifier = GetResourceIdentifierForResource(relatedResource); IDictionary <string, ResourceObject> idDictionary; if (!idDictionariesByType.TryGetValue(identifier.Type, out idDictionary)) { idDictionary = new Dictionary <string, ResourceObject>(); idDictionariesByType[identifier.Type] = idDictionary; } ResourceObject relatedResourceObject; if (!idDictionary.TryGetValue(identifier.Id, out relatedResourceObject)) { relatedResourceObject = CreateResourceObject(relatedResource, idDictionariesByType, childPath, includePathExpressions, linkBaseUrl, resourceObjectMetadata); idDictionary[identifier.Id] = relatedResourceObject; } linkage = new ToOneResourceLinkage(identifier); } else { linkage = new ToOneResourceLinkage(null); } } } var selfLink = _linkConventions.GetRelationshipLink(modelObject, _resourceTypeRegistry, modelRelationship, linkBaseUrl); var relatedResourceLink = _linkConventions.GetRelatedResourceLink(modelObject, _resourceTypeRegistry, modelRelationship, linkBaseUrl); relationships[modelRelationship.JsonKey] = new RelationshipObject(linkage, selfLink, relatedResourceLink); } var resourceId = resourceTypeRegistration.GetIdForResource(modelObject); IMetadata thisResourceObjectsMetadata; if (resourceObjectMetadata != null) { resourceObjectMetadata.TryGetValue(modelObject, out thisResourceObjectsMetadata); } else { thisResourceObjectsMetadata = null; } return(new ResourceObject(resourceTypeRegistration.ResourceTypeName, resourceId, attributes, relationships, metadata: thisResourceObjectsMetadata)); }