Пример #1
0
        private void AddLinks(HypermediaObject hypermediaObject, JObject sirenJson)
        {
            var hypermediaLinks = hypermediaObject.Links;
            var jLinks          = new JArray();

            foreach (var hypermediaLink in hypermediaLinks)
            {
                var jLink = new JObject();

                var jRel = new JArray {
                    hypermediaLink.Key
                };
                jLink.Add("rel", jRel);

                var(resolvedRoute, avaialbleMediaTypes) = ResolveReferenceRoute(hypermediaLink.Value.Reference);

                jLink.Add("href", resolvedRoute);

                if (avaialbleMediaTypes.Any())
                {
                    jLink.Add("type", avaialbleMediaTypes);
                }

                jLinks.Add(jLink);
            }

            sirenJson.Add("links", jLinks);
        }
        public string ObjectToRoute(HypermediaObject hypermediaObject)
        {
            var lookupType = hypermediaObject.GetType();
            var routeKeys  = this.routeKeyFactory.GetHypermediaRouteKeys(hypermediaObject);

            return(this.GetRouteByType(lookupType, routeKeys));
        }
Пример #3
0
        private JObject CreateSirenInternal(HypermediaObject hypermediaObject, bool isEmbedded = false, IReadOnlyCollection <string> embeddedEntityRelations = null)
        {
            var sirenJson = new JObject();

            var hypermediaObjectAttribute = GetHypermediaObjectAttribute(hypermediaObject);

            AddClasses(hypermediaObject, sirenJson, hypermediaObjectAttribute);
            AddTitle(sirenJson, hypermediaObjectAttribute);

            if (isEmbedded)
            {
                if (embeddedEntityRelations == null)
                {
                    throw new HypermediaException("Embedded Entity has no relations.");
                }

                AddEmbeddedEntityRelations(sirenJson, embeddedEntityRelations);
            }

            AddProperties(hypermediaObject, sirenJson);
            SirenAddEntities(hypermediaObject, sirenJson);
            AddActions(hypermediaObject, sirenJson);
            AddLinks(hypermediaObject, sirenJson);

            return(sirenJson);
        }
Пример #4
0
        private void AddActions(HypermediaObject hypermediaObject, JObject sirenJson)
        {
            var properties = hypermediaObject.GetType().GetTypeInfo().GetProperties(BindingFlags.Public | BindingFlags.Instance);

            var jActions = new JArray();

            foreach (var property in properties)
            {
                if (PropertyHasIgnoreAttribute(property))
                {
                    continue;
                }
                if (!IsHypermediaAction(property))
                {
                    continue;
                }

                var action     = property.GetValue(hypermediaObject);
                var actionBase = (HypermediaActionBase)action;

                if (actionBase.CanExecute())
                {
                    var jAction       = new JObject();
                    var resolvedRoute = this.routeResolver.ActionToRoute(hypermediaObject, actionBase);
                    AddGeneralSirenActionProperties(jAction, property, resolvedRoute);
                    AddActionParameters(actionBase, jAction, resolvedRoute.AcceptableMediaType);

                    jActions.Add(jAction);
                }
            }

            sirenJson.Add("actions", jActions);
        }
        private void SirenAddEntities(HypermediaObject hypermediaObject, JObject sirenJson)
        {
            var embeddedEntities = hypermediaObject.Entities;
            var jEntities        = new JArray();

            foreach (var embeddedEntity in embeddedEntities)
            {
                if (embeddedEntity.Reference.IsResolved())
                {
                    var entitySiren = CreateSirenInternal(embeddedEntity.Reference.GetInstance(), true, embeddedEntity.Relations);
                    jEntities.Add(entitySiren);
                }
                else
                {
                    var jLink = new JObject();

                    var entityType = embeddedEntity.Reference.GetHypermediaType();
                    var hypermediaObjectAttribute = GetHypermediaObjectAttribute(entityType);
                    AddClasses(entityType, jLink, hypermediaObjectAttribute);
                    AddEmbeddedEntityRelations(jLink, embeddedEntity.Relations);

                    var resolvedAdress = ResolveReferenceRoute(embeddedEntity.Reference);
                    jLink.Add("href", resolvedAdress);
                    jEntities.Add(jLink);
                }
            }

            sirenJson.Add("entities", jEntities);
        }
        public string ActionToRoute(HypermediaObject hypermediaObject, HypermediaActionBase action)
        {
            var lookupType = action.GetType();
            var routeKeys  = routeKeyFactory.GetHypermediaRouteKeys(hypermediaObject);

            return(this.GetRouteByType(lookupType, routeKeys));
        }
        public ResolvedRoute ActionToRoute(HypermediaObject actionHostObject, HypermediaActionBase action)
        {
            var lookupType = action.GetType();
            var routeKeys  = routeKeyFactory.GetActionRouteKeys(action, actionHostObject);

            return(this.GetRouteByType(lookupType, routeKeys));
        }
Пример #8
0
        public object GetHypermediaRouteKeys(HypermediaObject hypermediaObject)
        {
            if (!this.routeRegister.TryGetKeyProducer(hypermediaObject.GetType(), out var keyProducer))
            {
                return(new { });
            }

            return(keyProducer.CreateFromHypermediaObject(hypermediaObject));
        }
Пример #9
0
        public HypermediaObjectReference(HypermediaObject hypermediaObject) : base(hypermediaObject.GetType())
        {
            if (hypermediaObject == null)
            {
                throw new HypermediaException("HypermediaObject is null.");
            }

            this.reference = hypermediaObject;
        }
Пример #10
0
        public object GetActionRouteKeys(HypermediaActionBase action, HypermediaObject actionHostObject)
        {
            if (!this.routeRegister.TryGetKeyProducer(action.GetType(), out IKeyProducer keyProducer) &&
                !this.routeRegister.TryGetKeyProducer(actionHostObject.GetType(), out keyProducer))
            {
                return(new { });
            }

            return(keyProducer.CreateFromHypermediaObject(actionHostObject));
        }
        public object CreateFromHypermediaObject(HypermediaObject hypermediaObject)
        {
            if (!(hypermediaObject is HypermediaCustomerHto customer))
            {
                throw new HypermediaException($"Passed object is not a {typeof(HypermediaCustomerHto)}");
            }

            // it is required by Web Api to return a anonymous object with a property named exactly as in teh route template and the method argument.
            return(new { key = customer.Id });
        }
        public object CreateFromHypermediaObject(HypermediaObject hypermediaObject)
        {
            var dynamic = new ExpandoObject();
            var dict    = (IDictionary <string, object>)dynamic;

            foreach (var accessor in keyAccessors)
            {
                dict.Add(accessor.TemplateParameterName, accessor.GetKey(hypermediaObject));
            }
            return(dynamic);
        }
Пример #13
0
        public object CreateFromHypermediaObject(HypermediaObject hypermediaObject)
        {
            var car = hypermediaObject as HypermediaCar;

            if (car == null)
            {
                throw new HypermediaException($"Passed object is not a {typeof(HypermediaCar)}");
            }

            return(new { brand = car.Brand, key = car.Id });
        }
        private void AddProperty(HypermediaObject hypermediaObject, PropertyInfo publicProperty, JObject jProperties)
        {
            if (PropertyHasIgnoreAttribute(publicProperty))
            {
                return;
            }
            if (IsHypermediaAction(publicProperty))
            {
                return;
            }

            var propertyType     = publicProperty.PropertyType;
            var propertyTypeInfo = propertyType.GetTypeInfo();

            if (propertyTypeInfo.IsClass && propertyType != typeof(string))
            {
                return;
            }

            var propertyName = GetPropertyName(publicProperty);
            var value        = publicProperty.GetValue(hypermediaObject);

            if (value == null)
            {
                if (configuration.WriteNullProperties)
                {
                    jProperties.Add(propertyName, null);
                }
                return;
            }

            if (propertyTypeInfo.IsValueType)
            {
                if (propertyTypeInfo.IsEnum)
                {
                    var enumAsString = EnumHelper.GetEnumMemberValue(propertyType, value);
                    jProperties.Add(propertyName, new JValue(enumAsString));
                }
                else
                {
                    jProperties.Add(propertyName, new JValue(value));
                }

                return;
            }

            if (IsTimeType(propertyType))
            {
                jProperties.Add(propertyName, ((IFormattable)value).ToString("o", CultureInfo.InvariantCulture));
                return;
            }

            jProperties.Add(propertyName, string.Format(CultureInfo.InvariantCulture, "{0}", value));
        }
        public object GetActionRouteKeys(HypermediaActionBase action, HypermediaObject actionHostObject)
        {
            var keyProducer = this.routeRegister.GetKeyProducer(action.GetType());

            if (keyProducer == null)
            {
                return(new { });
            }

            return(keyProducer.CreateFromHypermediaObject(actionHostObject));
        }
        public object GetHypermediaRouteKeys(HypermediaObject hypermediaObject)
        {
            var keyProducer = this.routeRegister.GetKeyProducer(hypermediaObject.GetType());

            if (keyProducer == null)
            {
                return(new { });
            }

            return(keyProducer.CreateFromHypermediaObject(hypermediaObject));
        }
        private void AddProperties(HypermediaObject hypermediaObject, JObject sirenJson)
        {
            var type             = hypermediaObject.GetType();
            var publicProperties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);

            var jProperties = new JObject();

            foreach (var publicProperty in publicProperties)
            {
                AddProperty(hypermediaObject, publicProperty, jProperties);
            }

            sirenJson.Add("properties", jProperties);
        }
Пример #18
0
        private void SirenAddEntities(HypermediaObject hypermediaObject, JObject sirenJson)
        {
            var embeddedEntities = hypermediaObject.Entities;
            var jEntities        = new JArray();

            foreach (var embeddedEntity in embeddedEntities)
            {
                if (embeddedEntity.Reference.IsResolved())
                {
                    var entitySiren = CreateSirenInternal(embeddedEntity.Reference.GetInstance(), true, embeddedEntity.Relations);
                    jEntities.Add(entitySiren);
                }
                else
                {
                    var jLink = new JObject();

                    string resolvedAddress;
                    if (embeddedEntity.Reference is HypermediaExternalObjectReference externalReference)
                    {
                        AddClasses("External", jLink, externalReference.Classes);
                        resolvedAddress = externalReference.Uri.ToString();
                    }
                    else
                    {
                        var entityType = embeddedEntity.Reference.GetHypermediaType();
                        var hypermediaObjectAttribute = GetHypermediaObjectAttribute(entityType);
                        AddClasses(entityType, jLink, hypermediaObjectAttribute);
                        var(resolvedRoute, avaialbleMediaTypes) = ResolveReferenceRoute(embeddedEntity.Reference);
                        resolvedAddress = resolvedRoute;
                        if (avaialbleMediaTypes.Any())
                        {
                            throw new Exception("Embedded entities can not have media types");
                        }
                    }

                    AddEmbeddedEntityRelations(jLink, embeddedEntity.Relations);
                    jLink.Add("href", resolvedAddress);
                    jEntities.Add(jLink);
                }
            }

            sirenJson.Add("entities", jEntities);
        }
        private void AddLinks(HypermediaObject hypermediaObject, JObject sirenJson)
        {
            var hypermediaLinks = hypermediaObject.Links;
            var jLinks          = new JArray();

            foreach (var hypermediaLink in hypermediaLinks)
            {
                var jLink = new JObject();

                var jRel = new JArray();
                jRel.Add(hypermediaLink.Key);
                jLink.Add("rel", jRel);

                var resolvedAdress = ResolveReferenceRoute(hypermediaLink.Value.Reference);

                jLink.Add("href", resolvedAdress);

                jLinks.Add(jLink);
            }

            sirenJson.Add("links", jLinks);
        }
Пример #20
0
 private void AddProperties(HypermediaObject hypermediaObject, JObject sirenJson)
 {
     sirenJson.Add("properties", SerializeObjectProperties(hypermediaObject));
 }
Пример #21
0
        public object CreateFromHypermediaObject(HypermediaObject hypermediaObject)
        {
            var ho = (LinkedHypermediaObjectWithKey)hypermediaObject;

            return(new { key = ho.Id });
        }
Пример #22
0
 public object CreateFromHypermediaObject(HypermediaObject hypermediaObject)
 {
     throw new NotImplementedException();
 }
Пример #23
0
 /// <summary>
 /// Returns a 201 Created and puts a Location in the header pointing to the HypermediaObject.
 /// </summary>
 /// <param name="controller"></param>
 /// <param name="hypermediaObject">The created HypermediaObject</param>
 /// <returns></returns>
 public static ActionResult Created(this ControllerBase controller, HypermediaObject hypermediaObject)
 {
     return(controller.Ok(new HypermediaEntityLocation(new HypermediaObjectReference(hypermediaObject), HttpStatusCode.Created)));
 }
        private void AddGeneralSirenActionProperties(JObject jAction, PropertyInfo property, HypermediaObject hypermediaObject, HypermediaActionBase actionBase)
        {
            var hypermediaActionAttribute = GetHypermediaActionAttribute(property);

            string actionName;

            if (!string.IsNullOrEmpty(hypermediaActionAttribute?.Name))
            {
                actionName = hypermediaActionAttribute.Name;
            }
            else
            {
                actionName = property.Name;
            }
            jAction.Add("name", actionName);

            if (!string.IsNullOrEmpty(hypermediaActionAttribute?.Title))
            {
                jAction.Add("title", hypermediaActionAttribute.Title);
            }

            jAction.Add("method", "POST");
            jAction.Add("href", routeResolver.ActionToRoute(hypermediaObject, actionBase));
        }
 /// <summary>
 /// Adds Entity using a list of realations.
 /// </summary>
 /// <param name="entitiesList">Entities List.</param>
 /// <param name="relations">Relations for the Entity.</param>
 /// <param name="entity">The added Entity.</param>
 public static void Add(this List <RelatedEntity> entitiesList, List <string> relations, HypermediaObject entity)
 {
     entitiesList.Add(new RelatedEntity(relations, new HypermediaObjectReference(entity)));
 }
Пример #26
0
 private static HypermediaObjectAttribute GetHypermediaObjectAttribute(HypermediaObject hypermediaObject)
 {
     return(GetHypermediaObjectAttribute(hypermediaObject.GetType()));
 }
Пример #27
0
        private static void AddClasses(HypermediaObject hypermediaObject, JObject sirenJson, HypermediaObjectAttribute hypermediaObjectAttribute)
        {
            var hmoType = hypermediaObject.GetType();

            AddClasses(hmoType, sirenJson, hypermediaObjectAttribute);
        }
Пример #28
0
 public JObject ConvertToJson(HypermediaObject hypermediaObject)
 {
     return(CreateSirenInternal(hypermediaObject));
 }
Пример #29
0
 public string ConvertToString(HypermediaObject hypermediaObject)
 {
     return(ConvertToJson(hypermediaObject).ToString());
 }