public Task WriteTo(object entity, IHttpEntity response, IEnumerable <string> codecParameters) { _responseMessage.Headers.Add("link", $"<{_apiDocumentationLink}>; rel=\"{_apiDocumentationRel}\""); var resourceSelectedByUri = _context.PipelineData.SelectedResource; var serializerFunc = resourceSelectedByUri.ResourceModel.Hydra().SerializeFunc; if (serializerFunc == null) { serializerFunc = GetFuncFromResponseResourceType(_context.Response.Entity.Instance); if (serializerFunc == null) { throw new InvalidOperationException($"Hydra serialiser not found for object of type {entity?.GetType()}"); } } var typeToTypeGen = _models.ResourceRegistrations .Where(res => res.ResourceType != null && res.Hydra().TypeFunc != null) .ToLookup(res => res.ResourceType, res => res.Hydra().TypeFunc); string renderTypeNode(object resource) { return(typeToTypeGen[resource.GetType()].First()(resource)); } return(serializerFunc(entity, new SerializationContext { BaseUri = BaseUri, UriGenerator = resource => _uris.CreateUri(resource, _context.ApplicationBaseUri), TypeGenerator = renderTypeNode }, response.Stream)); }
public JsonLdCodecWriter(FastUriGenerator uris, ICommunicationContext context, IResponse responseMessage, IMetaModelRepository models) { _uris = uris; _context = context; _responseMessage = responseMessage; _models = models; _apiDocumentationLink = uris.CreateUri <ApiDocumentation>(_context.ApplicationBaseUri); }
public Task WriteTo(object entity, IHttpEntity response, IEnumerable <string> codecParameters) { _responseMessage.Headers.Add("link", $"<{_apiDocumentationLink}>; rel=\"{_apiDocumentationRel}\""); if (entity == null) { return(Task.CompletedTask); } var resourceSelectedByUri = _context.PipelineData.SelectedResource; var resourceModel = resourceSelectedByUri.ResourceModel; if (resourceModel.ResourceType.IsInstanceOfType(entity) == false) { if (!_models.TryGetResourceModel(entity.GetType(), out resourceModel)) { throw new InvalidOperationException($"Hydra serialiser not found for object of type {entity.GetType()}"); } } var currentResourceModelName = resourceModel.Name; var serializerFunc = resourceModel.Hydra().SerializeFunc; var typeToTypeGen = _models.ResourceRegistrations .Where(res => res.ResourceType != null && res.Hydra().JsonLdTypeFunc != null) .ToLookup(res => res.ResourceType, res => res.Hydra().JsonLdTypeFunc); string renderTypeNode(object resource) { var convertedString = typeToTypeGen[resource.GetType()].First()(resource); if (convertedString.StartsWith("http://") || convertedString.StartsWith("https://") || IsCurie(convertedString)) { return(convertedString); } return(BaseUri + convertedString); } return(serializerFunc(entity, new SerializationContext { BaseUri = BaseUri, UriGenerator = resource => _uris.CreateUri(resource, _context.ApplicationBaseUri, currentResourceModelName), TypeGenerator = renderTypeNode }, response.Stream)); }
public Task WriteTo(object entity, IHttpEntity response, IEnumerable <string> codecParameters) { _responseMessage.Headers.Add("link", $"<{_apiDocumentationLink}>; rel=\"{_apiDocumentationRel}\""); var func = _context.PipelineData.SelectedResource.ResourceModel.Hydra().SerializeFunc; if (func == null) { throw new InvalidOperationException($"Hydra serialiser not found for object of type {entity?.GetType()}"); } return(func(entity, new SerializationContext { BaseUri = BaseUri, UriGenerator = resource => _uris.CreateUri(resource, _context.ApplicationBaseUri) }, response.Stream)); }