Example #1
0
        private static void AddSemanticItemsFromMethodInfo(MethodInfoNode methodInfoNode,
                                                           SemanticDocument representation)
        {
            var term             = TermFactory.From(methodInfoNode.MethodInfo);
            var methodParameters = methodInfoNode.GetParameters();
            var operation        = Operation.Create(methodInfoNode.Title, methodParameters, methodInfoNode.Uri, term);

            representation.Value.Add(operation);

            representation.AddLink(Links.CreateLink(methodInfoNode.Parent.Title, methodInfoNode.Parent.Uri, Terms.Parent));
        }
Example #2
0
        private static MethodHandler <SemanticDocument> BuildPostHandlerForMethodInfo(MethodInfoNode methodNode,
                                                                                      ServiceLocatorDelegate serviceLocator)
        {
            MethodHandler <SemanticDocument> .InvokeMethodDelegate invoke2 = async(submittedArgs) =>
            {
                var argsEnumerator = submittedArgs.GetEnumerator();
                var argsList       = methodNode.MethodInfo.GetParameters()
                                     .Select(pi =>
                {
                    if (pi.GetCustomAttribute <InjectAttribute>() != null)
                    {
                        if (serviceLocator == null)
                        {
                            throw new InvalidOperationException(
                                $"Cannot [Inject] parameter {pi.Name} for {methodNode.MethodInfo.DeclaringType.Name}.{methodNode.MethodInfo.DeclaringType.Name} Please set ServiceLocator at startup");
                        }
                        return(serviceLocator(pi.ParameterType));
                    }
                    else
                    {
                        argsEnumerator.MoveNext();
                        var current = argsEnumerator.Current;
                        if (current.Item1 != new UrlPart(pi.Name))
                        {
                            throw new ArgumentException("Mismatch: expected " + pi.Name + ", received" +
                                                        current.Item1.ToString());
                        }
                        return(Tuple.Create(current.Item2, null as Action));
                    }
                }).ToList();
                var parameters   = argsList.Select(a => a.Item1).ToArray();
                var invokeResult = methodNode.MethodInfo.Invoke(methodNode.Parent, parameters);
                foreach (var tuple in argsList)
                {
                    tuple.Item2?.Invoke();
                }

                if (methodNode.MethodInfo.ReturnType == typeof(void))
                {
                }
                var task = invokeResult as Task;
                if (task != null)
                {
                    await task;
                    invokeResult = task.GetType().GetRuntimeProperty("Result")?.GetValue(task) ?? invokeResult;
                }
                var representation = new SemanticDocument();


                //Add a link back to the thing that the action happened to
                {
                    OneOf.OneOf <Modified, Created> result = default(OneOf.OneOf <Modified, Created>);
                    if (invokeResult is Created)
                    {
                        result = (Created)invokeResult;
                    }
                    if (invokeResult is Modified)
                    {
                        result = (Modified)invokeResult;
                    }
                    if (invokeResult is AbstractNode)
                    {
                        result = new Created((AbstractNode)invokeResult);
                    }
                    result = new Modified(methodNode.Parent);

                    result.Switch(
                        modified => representation.AddLink(Links.CreateLink($"Modified \'{modified.Node.Title}\'",
                                                                            modified.Node.Uri, modified.Node.Term)),
                        created => representation.AddLink(Links.CreateLink($"Created \'{created.Node.Title}\'",
                                                                           created.Node.Uri, created.Node.Term)));
                }

                representation.Value.Add(SemanticProperty.CreateValue(Terms.Title, JToken.FromObject(methodNode.Title)));
                return(new InvokeResult <SemanticDocument> .RepresentationResult(representation));
            };

            var parameterInfo = methodNode.GetParameters();

            return(new MethodHandler <SemanticDocument>(new Method.Post(), parameterInfo, invoke2));
        }