コード例 #1
0
 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));
 }
コード例 #2
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;
 }
コード例 #3
0
        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));
        }
コード例 #4
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;
 }
コード例 #5
0
        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);
        }
コード例 #6
0
 /// <summary>
 /// Builds a new RelationshipObject with linkage only
 /// </summary>
 public RelationshipObject(IResourceLinkage linkage, IMetadata metadata = null)
 {
     Linkage  = linkage;
     Metadata = metadata;
 }
コード例 #7
0
        /// <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));
        }
コード例 #8
0
 /// <summary>
 /// Builds a new RelationshipObject with linkage only
 /// </summary>
 public RelationshipObject(IResourceLinkage linkage, IMetadata metadata = null)
 {
     Linkage = linkage;
     Metadata = metadata;
 }