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));
        }
예제 #2
0
 public JsonLdCodecWriter(FastUriGenerator uris, ICommunicationContext context, IResponse responseMessage, IMetaModelRepository models)
 {
     _uris                 = uris;
     _context              = context;
     _responseMessage      = responseMessage;
     _models               = models;
     _apiDocumentationLink = uris.CreateUri <ApiDocumentation>(_context.ApplicationBaseUri);
 }
예제 #3
0
        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));
        }
예제 #4
0
        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));
        }