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)); }
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); }
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)); }
public object GetHypermediaRouteKeys(HypermediaObject hypermediaObject) { if (!this.routeRegister.TryGetKeyProducer(hypermediaObject.GetType(), out var keyProducer)) { return(new { }); } return(keyProducer.CreateFromHypermediaObject(hypermediaObject)); }
public HypermediaObjectReference(HypermediaObject hypermediaObject) : base(hypermediaObject.GetType()) { if (hypermediaObject == null) { throw new HypermediaException("HypermediaObject is null."); } this.reference = hypermediaObject; }
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); }
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); }
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); }
private void AddProperties(HypermediaObject hypermediaObject, JObject sirenJson) { sirenJson.Add("properties", SerializeObjectProperties(hypermediaObject)); }
public object CreateFromHypermediaObject(HypermediaObject hypermediaObject) { var ho = (LinkedHypermediaObjectWithKey)hypermediaObject; return(new { key = ho.Id }); }
public object CreateFromHypermediaObject(HypermediaObject hypermediaObject) { throw new NotImplementedException(); }
/// <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))); }
private static HypermediaObjectAttribute GetHypermediaObjectAttribute(HypermediaObject hypermediaObject) { return(GetHypermediaObjectAttribute(hypermediaObject.GetType())); }
private static void AddClasses(HypermediaObject hypermediaObject, JObject sirenJson, HypermediaObjectAttribute hypermediaObjectAttribute) { var hmoType = hypermediaObject.GetType(); AddClasses(hmoType, sirenJson, hypermediaObjectAttribute); }
public JObject ConvertToJson(HypermediaObject hypermediaObject) { return(CreateSirenInternal(hypermediaObject)); }
public string ConvertToString(HypermediaObject hypermediaObject) { return(ConvertToJson(hypermediaObject).ToString()); }