コード例 #1
0
        private static async Task <IHydraResource> GatherLinks(
            ITypedEntity resource,
            Statement statement,
            ProcessingState processingState,
            IHydraResource hydraResource,
            CancellationToken cancellationToken)
        {
            var relationResource = await resource.Context.Load <IDereferencableLink>(statement.Predicate, cancellationToken);

            var @object = await resource.Context.Load <IResource>(statement.Object, cancellationToken);

            var linkType = relationResource.GetLinkType() ?? @object.GetLinkType(processingState.LinksPolicy, processingState.Root);

            if (linkType != null)
            {
                hydraResource = hydraResource ?? resource.ActLike <IHydraResource>();
                var owner = hydraResource;
                processingState.MarkAsOwned(relationResource.Iri);
                processingState.MarkAsOwned(@object.Iri);
                processingState.ProcessingCompleted +=
                    (sender, e) => CreateRelationHandler((ProcessingState)sender, owner, relationResource, @object, linkType);
            }

            return(hydraResource);
        }
コード例 #2
0
        public override async Task TheTest()
        {
            await base.TheTest();

            Markus = Result.OfType <IHydraResource>().Where(_ => _.Iri.ToString().Contains("/markus")).First();
            Karol  = Markus.Links.WithRelationOf(schema.knows).First().Target.ActLike <IHydraResource>();
        }
コード例 #3
0
        private static void GatherOperationTargets(IHydraResource resource, ProcessingState processingState)
        {
            IEnumerable <IOperation> operations = resource.Operations;
            var supportedOperationsContainer    = OperationContainers.Where(_ => resource.Type.Contains(_.Key)).Select(_ => _.Value).FirstOrDefault();

            if (supportedOperationsContainer != null)
            {
                operations = operations.Concat(supportedOperationsContainer(resource));
            }

            foreach (var operation in operations)
            {
                var proxy = operation.Unwrap();
                proxy.SetProperty(ResourceExtensions.TargetPropertyInfo, resource);
                proxy.SetProperty(ResourceExtensions.OriginatingMediaTypeProperty, processingState.OriginatingMediaType);
            }
        }
コード例 #4
0
        private static void CreateRelationHandler(
            ProcessingState processingState,
            IHydraResource owner,
            IDereferencableLink relationResource,
            IResource @object,
            Iri type)
        {
            var handlers = relationResource.SupportedOperations.Any() && @object != null
                ? CreateTemplatedOperation(owner, relationResource, @object, hydra.Operation)
                : (IEnumerable)CreateLink(owner, relationResource, @object, type);

            foreach (IResource handler in handlers)
            {
                var proxy = handler.Unwrap();
                proxy.SetProperty(ResourceExtensions.BaseUrlPropertyInfo, (Uri)processingState.BaseUrl);
                processingState.ForbiddenHypermeda.Add(handler.Iri);
            }
        }
コード例 #5
0
 private static IEnumerable <IOperation> CreateTemplatedOperation(
     IHydraResource owner,
     IDereferencableLink relationResource,
     IEntity @object,
     Iri type)
 {
     foreach (var operation in relationResource.SupportedOperations)
     {
         var result = operation.Copy(GetNextIri("Operation"));
         result.Type.AddIfNotExist(type);
         result.Type.AddIfNotExist(hydra.IriTemplate);
         var templatedOperation = result.ActLike <ITemplatedOperation>();
         var proxy = templatedOperation.Unwrap();
         proxy.SetProperty(IriTemplatePropertyInfo, @object.ActLike <IIriTemplate>());
         result = templatedOperation;
         owner.Operations.Add(result);
         yield return(result);
     }
 }
コード例 #6
0
        private static async Task <IResource> ResourceInitializer(
            ITypedEntity resource,
            IHydraClient client,
            ProcessingState processingState,
            CancellationToken cancellationToken)
        {
            IHydraResource hydraResource = resource as IHydraResource
                                           ?? (resource.Is(hydra.Resource) ? resource.ActLike <IHydraResource>() : null);

            bool hasView = false;

            foreach (var statement in processingState.StatementsOf(resource.Iri))
            {
                hydraResource = await GatherLinks(resource, statement, processingState, hydraResource, cancellationToken);

                if (statement.Predicate == hydra.view)
                {
                    hasView = true;
                }
            }

            if (hydraResource != null && processingState.NumberOfStatementsOf(resource.Iri) > 0)
            {
                GatherOperationTargets(hydraResource, processingState);
                if (hasView)
                {
                    hydraResource = hydraResource.ActLike <IResourceView>();
                }

                var addToHypermedia = !processingState.ForbiddenHypermeda.Contains(hydraResource.Iri) &&
                                      (!hydraResource.Iri.IsBlank || IsHydraDependent(hydraResource));
                if (addToHypermedia)
                {
                    processingState.AllHypermedia.Add(hydraResource.Iri);
                }
            }

            return(hydraResource);
        }
コード例 #7
0
        private static IEnumerable <IDereferencableLink> CreateLink(
            IHydraResource owner,
            IDereferencableLink relationResource,
            IResource @object,
            Iri type)
        {
            var result = relationResource.Copy(GetNextIri(type.ToString().Replace(hydra.Namespace, String.Empty)));
            var proxy  = result.Unwrap();

            proxy.SetProperty(ResourceExtensions.TargetPropertyInfo, @object);
            result.Type.AddIfNotExist(type);
            result.Type.Remove(type == hydra.TemplatedLink ? hydra.Link : hydra.TemplatedLink);
            if (type == hydra.TemplatedLink && @object != null)
            {
                var templatedLink = result.ActLike <ITemplatedLink>();
                proxy.SetProperty(IriTemplatePropertyInfo, @object.ActLike <IIriTemplate>());
                result = templatedLink;
            }

            owner.Links.Add(result);
            return(new[] { result });
        }