Ejemplo n.º 1
0
        private static object GenerateForEmbeddedRule(EntityRule rule, IActionConfiguration actionConfiguration,
                                                      Dictionary <string, List <string> > routeRelations, object originalObject)
        {
            var actionExecutedContext     = ActionCallContext.Get <HttpActionExecutedContext>();
            var entityActionConfiguration = HypermediaControllerConfiguration.Instance.GetcontrollerActionConfiguration(rule.ControllerType, rule.ControllerAction, actionExecutedContext.Request.Headers.Accept);

            if (entityActionConfiguration == null)
            {
                return(null);
            }

            var referencedObject = rule.GetReferencedObjectInstance(originalObject);

            if (referencedObject == null)
            {
                return(null);
            }

            var transformed = ActionResponseTransformer.TransformPayload(entityActionConfiguration, referencedObject);

            if (transformed == null)
            {
                return(null);
            }

            if (transformed is IEnumerable)
            {
                throw new Exception(string.Format("Unable to generate enumerable entity object from controller {0} action {1}. Consider using outer object.", actionConfiguration.ControllerType.FullName, actionConfiguration.ActionMethodInfo));
            }

            AssignRelName(transformed, rule.Rel);

            return(transformed);
        }
Ejemplo n.º 2
0
        public static MetadataPlainObjects.Actions Generate(IActionConfiguration actionConfiguration, Dictionary <string, List <string> > routeRelations, object originalObject)
        {
            var result = new MetadataPlainObjects.Actions();

            var mappingRules = actionConfiguration.MappingRules;

            var routeNameSubstitution = new DefaultRouteValueSubstitution();

            result.AddRange(from mappingRule in mappingRules
                            let apiDescription = mappingRule.ApiDescriptions.OrderBy(d => d.RelativePath.Length).FirstOrDefault()
                                                 let isAction = mappingRule.Type == MappingRule.RuleType.ActionRule || (mappingRule.Type == MappingRule.RuleType.Default && apiDescription.HttpMethod != HttpMethod.Get)
                                                                where apiDescription != null && isAction
                                                                let absolutePath = LinkHelper.MakeAbsolutePath(routeNameSubstitution.Substitute(apiDescription.RelativePath, mappingRule, originalObject))
                                                                                   let routeNames = routeRelations[apiDescription.ID]
                                                                                                    select new MetadataPlainObjects.Action()
            {
                Href         = absolutePath,
                Method       = apiDescription.HttpMethod.Method,
                Title        = apiDescription.Documentation,
                ActionName   = routeNames.FirstOrDefault(),
                ActionFields = ActionFieldsGenerator.Generate(mappingRule, apiDescription, originalObject),
                ContentType  = DeduceContentType(mappingRule, apiDescription, originalObject),
                Class        = GetClassArray(mappingRule)
            });

            return(result);
        }
Ejemplo n.º 3
0
        private static object GenerateForEmbeddedRule(EntityRule rule, IActionConfiguration actionConfiguration,
            Dictionary<string, List<string>> routeRelations, object originalObject)
        {
            var actionExecutedContext = ActionCallContext.Get<HttpActionExecutedContext>();
            var entityActionConfiguration = HypermediaControllerConfiguration.Instance.GetcontrollerActionConfiguration(rule.ControllerType, rule.ControllerAction, actionExecutedContext.Request.Headers.Accept);
            if (entityActionConfiguration == null)
                return null;

            var referencedObject = rule.GetReferencedObjectInstance(originalObject);

            if (referencedObject == null)
                return null;

            var transformed = ActionResponseTransformer.TransformPayload(entityActionConfiguration, referencedObject);

            if (transformed == null)
                return null;

            if (transformed is IEnumerable)
                throw new Exception(string.Format("Unable to generate enumerable entity object from controller {0} action {1}. Consider using outer object.", actionConfiguration.ControllerType.FullName, actionConfiguration.ActionMethodInfo));

            AssignRelName(transformed, rule.Rel);

            return transformed;
        }
Ejemplo n.º 4
0
        public static MetadataPlainObjects.Actions Generate(IActionConfiguration actionConfiguration, Dictionary<string, List<string>> routeRelations, object originalObject)
        {
            var result = new MetadataPlainObjects.Actions();

            var mappingRules = actionConfiguration.MappingRules;

            var routeNameSubstitution = new DefaultRouteValueSubstitution();

            result.AddRange(from mappingRule in mappingRules
                let apiDescription = mappingRule.ApiDescriptions.OrderBy(d => d.RelativePath.Length).FirstOrDefault()
                let isAction = mappingRule.Type == MappingRule.RuleType.ActionRule || (mappingRule.Type == MappingRule.RuleType.Default && apiDescription.HttpMethod != HttpMethod.Get)
                where apiDescription != null && isAction
                let absolutePath = LinkHelper.MakeAbsolutePath(routeNameSubstitution.Substitute(apiDescription.RelativePath, mappingRule, originalObject))
                let routeNames = routeRelations[apiDescription.ID]
                select new MetadataPlainObjects.Action()
                {
                    Href = absolutePath,
                    Method = apiDescription.HttpMethod.Method,
                    Title = apiDescription.Documentation,
                    ActionName = routeNames.FirstOrDefault(),
                    ActionFields = ActionFieldsGenerator.Generate(mappingRule, apiDescription, originalObject),
                    ContentType = DeduceContentType(mappingRule, apiDescription, originalObject),
                    Class = GetClassArray(mappingRule)
                });

            return result;
        }
Ejemplo n.º 5
0
        public override void ActivateInstance(object proxyInstance, object originalInstance,
            IActionConfiguration actionConfiguration)
        {
            var routes = (Dictionary<string, string>)actionConfiguration.MetadataProvider.GetMetadataByType(typeof(Dictionary<string, string>), originalInstance);

            proxyInstance.GetType().GetProperties().Where(p => routes.ContainsKey(p.Name)).ToList()
                .ForEach(prop => prop.SetValue(proxyInstance, routes[prop.Name]));
        }
Ejemplo n.º 6
0
        public override void ActivateInstance(object proxyInstance, object originalInstance,
                                              IActionConfiguration actionConfiguration)
        {
            var routes = (Dictionary <string, string>)actionConfiguration.MetadataProvider.GetMetadataByType(typeof(Dictionary <string, string>), originalInstance);

            proxyInstance.GetType().GetProperties().Where(p => routes.ContainsKey(p.Name)).ToList()
            .ForEach(prop => prop.SetValue(proxyInstance, routes[prop.Name]));
        }
Ejemplo n.º 7
0
        private static object GenerateForRule(EntityRule rule, IActionConfiguration actionConfiguration,
                                              Dictionary <string, List <string> > routeRelations, object originalObject)
        {
            if (rule.EntityEmbeddingRule == EntityRule.EmbeddingRule.Embedded)
            {
                return(GenerateForEmbeddedRule(rule, actionConfiguration, routeRelations, originalObject));
            }

            return(GenerateForLinkedRule(rule, actionConfiguration, routeRelations, originalObject));
        }
        public static object TransformPayload(IActionConfiguration actionConfiguration, object payload)
        {
            var responseTransformer = actionConfiguration.ResponseTransformerFactory.Get(payload);

            if (responseTransformer == null)
            {
                throw new Exception(string.Format("Unable to get response transformer for response type {0}", payload.GetType()));
            }

            return responseTransformer.Transform(actionConfiguration, payload);
        }
Ejemplo n.º 9
0
        public static MetadataPlainObjects.Entities Generate(IActionConfiguration actionConfiguration,
            Dictionary<string, List<string>> routeRelations, object originalObject)
        {
            var rules = new MetadataPlainObjects.Entities();
            actionConfiguration.EntityRules.ToList()
                .ForEach(rule => rules.Add(GenerateForRule(rule, actionConfiguration, routeRelations, originalObject)));

            var result = new Entities();
            result.AddRange(rules.Where(r => r != null).ToList());
            return result;
        }
        public static object TransformPayload(IActionConfiguration actionConfiguration, object payload)
        {
            var responseTransformer = actionConfiguration.ResponseTransformerFactory.Get(payload);

            if (responseTransformer == null)
            {
                throw new Exception(string.Format("Unable to get response transformer for response type {0}", payload.GetType()));
            }

            return(responseTransformer.Transform(actionConfiguration, payload));
        }
Ejemplo n.º 11
0
        public override void ActivateInstance(object proxyInstance, object originalInstance, IActionConfiguration actionConfiguration)
        {
            var aggregateFieldInfo = proxyInstance.GetType().GetField(PropertyVisitor.PropertyFieldName(_propertyName),
                         BindingFlags.NonPublic |
                         BindingFlags.Instance);

            if (aggregateFieldInfo == null)
                throw new Exception("Unable to activate instance");

            aggregateFieldInfo.SetValue(proxyInstance, originalInstance);
        }
Ejemplo n.º 12
0
        public void Setup()
        {
            _fixture = new Fixture();
            _fixture.Customize(new AutoMoqCustomization());
            _fixture.Customize(new RandomNumericSequenceCustomization());

            Expression <Func <ControllerSample, ModelSample, IEnumerable <ModelSample> > > lambda = (c, m)
                                                                                                    => c.ControllerQueryMethod(m.Id, m.Name, QueryParameter.Is <string>(), QueryParameter.Is <int>());

            Expression <Func <ControllerSample, ModelSample, ModelSample> > lambda2 = (c, m)
                                                                                      => c.ControllerMethodPut(m.Id, m);

            var apiExplorerMoq = new Mock <IApiExplorer>();

            apiExplorerMoq.Setup(_ => _.ApiDescriptions).Returns(new Collection <ApiDescription>()
            {
                new ApiDescription()
                {
                }
            });

            var actionConfiguration = new Mock <IActionConfiguration>();

            actionConfiguration.Setup(_ => _.MappingRules).Returns(() => new List <MappingRule>
            {
                new MappingRule((MethodCallExpression)lambda.Body, apiExplorerMoq.Object)
                {
                    ApiDescriptions = new List <ApiDescription>()
                    {
                        new ApiDescription()
                        {
                            RelativePath = "/api/{id}?query={query}",
                            HttpMethod   = HttpMethod.Get
                        }
                    },
                    Type = MappingRule.RuleType.Default
                },
                new MappingRule((MethodCallExpression)lambda2.Body, apiExplorerMoq.Object)
                {
                    ApiDescriptions = new List <ApiDescription>()
                    {
                        new ApiDescription()
                        {
                            RelativePath = "/api/prod/{id}",
                            HttpMethod   = HttpMethod.Put
                        }
                    },
                    Type = MappingRule.RuleType.Default
                }
            });

            _actionConfiguration = actionConfiguration.Object;
        }
Ejemplo n.º 13
0
        public static MetadataPlainObjects.Entities Generate(IActionConfiguration actionConfiguration,
                                                             Dictionary <string, List <string> > routeRelations, object originalObject)
        {
            var rules = new MetadataPlainObjects.Entities();

            actionConfiguration.EntityRules.ToList()
            .ForEach(rule => rules.Add(GenerateForRule(rule, actionConfiguration, routeRelations, originalObject)));

            var result = new Entities();

            result.AddRange(rules.Where(r => r != null).ToList());
            return(result);
        }
Ejemplo n.º 14
0
        public object Transform(IActionConfiguration actionConfiguration, object payload)
        {
            var strategyFactory = actionConfiguration.StrategyBuilderFactory;

            var strategy = strategyFactory.Build(actionConfiguration, payload.GetType());

            var typeBuilder = new TypeBuilder(payload.GetType(), strategy);

            var proxyType = typeBuilder.BuildType();

            var newinstance = Activator.CreateInstance(proxyType);

            strategy.ActivateInstance(newinstance, payload, actionConfiguration);

            return newinstance;
        }
Ejemplo n.º 15
0
        public object Transform(IActionConfiguration actionConfiguration, object payload)
        {
            var strategyFactory = actionConfiguration.StrategyBuilderFactory;

            var strategy = strategyFactory.Build(actionConfiguration, payload.GetType());

            var typeBuilder = new TypeBuilder(payload.GetType(), strategy);

            var proxyType = typeBuilder.BuildType();

            var newinstance = Activator.CreateInstance(proxyType);

            strategy.ActivateInstance(newinstance, payload, actionConfiguration);

            return(newinstance);
        }
        public void Setup()
        {
            _responseTransformerFactory = new ResponseTransformerFactory();
            var strategy = new Mock<ITypeBuilderStrategy>();
            strategy.Setup(_ => _.ClassKey(It.IsAny<Type>())).Returns((Type t) => t.Name);

            var strategyFactory = new Mock<IStrategyBuilderFactory>();
            strategyFactory.Setup(_ => _.Build(It.IsAny<IActionConfiguration>(), It.IsAny<Type>()))
                .Returns(() => strategy.Object);

            var actionConfiguration = new Mock<IActionConfiguration>();
            actionConfiguration.Setup(_ => _.StrategyBuilderFactory).Returns(() => strategyFactory.Object);
            actionConfiguration.Setup(_ => _.ResponseTransformerFactory).Returns(_responseTransformerFactory);

            _actionConfiguration = actionConfiguration.Object;
        }
Ejemplo n.º 17
0
        private static object GenerateForLinkedRule(EntityRule rule,
                                                    IActionConfiguration actionConfiguration,
                                                    Dictionary <string, List <string> > routeRelations, object originalObject)
        {
            var actionExecutedContext     = ActionCallContext.Get <HttpActionExecutedContext>();
            var entityActionConfiguration = HypermediaControllerConfiguration.Instance.GetcontrollerActionConfiguration(rule.ControllerType, rule.ControllerAction, actionExecutedContext.Request.Headers.Accept);

            if (entityActionConfiguration == null)
            {
                return(null);
            }

            var referencedObject = rule.GetReferencedObjectInstance(originalObject);

            if (referencedObject == null)
            {
                return(null);
            }
            var selfRule = entityActionConfiguration.MappingRules.FirstOrDefault(r => r.Names.Contains("self"));

            if (selfRule == null)
            {
                throw new Exception(string.Format("Unable to generate link to entity object from controller {0} action {1}. Can't find self rel.", actionConfiguration.ControllerType.FullName, actionConfiguration.ActionMethodInfo));
            }

            var selfApi = selfRule.ApiDescriptions.OrderBy(d => d.RelativePath.Length).FirstOrDefault();

            if (selfApi == null)
            {
                throw new Exception(string.Format("Unable to generate link to entity object from controller {0} action {1}. Can't find self API.", actionConfiguration.ControllerType.FullName, actionConfiguration.ActionMethodInfo));
            }

            var routeNameSubstitution = new DefaultRouteValueSubstitution();

            var absolutePath =
                LinkHelper.MakeAbsolutePath(routeNameSubstitution.Substitute(selfApi.RelativePath, selfRule,
                                                                             referencedObject));

            return(new LinkedEntity()
            {
                Rels = rule.Rel,
                ClassName = entityActionConfiguration.Class,
                Href = absolutePath
            });
        }
        public void Setup()
        {
            _responseTransformerFactory = new ResponseTransformerFactory();
            var strategy = new Mock <ITypeBuilderStrategy>();

            strategy.Setup(_ => _.ClassKey(It.IsAny <Type>())).Returns((Type t) => t.Name);

            var strategyFactory = new Mock <IStrategyBuilderFactory>();

            strategyFactory.Setup(_ => _.Build(It.IsAny <IActionConfiguration>(), It.IsAny <Type>()))
            .Returns(() => strategy.Object);

            var actionConfiguration = new Mock <IActionConfiguration>();

            actionConfiguration.Setup(_ => _.StrategyBuilderFactory).Returns(() => strategyFactory.Object);
            actionConfiguration.Setup(_ => _.ResponseTransformerFactory).Returns(_responseTransformerFactory);

            _actionConfiguration = actionConfiguration.Object;
        }
Ejemplo n.º 19
0
        public object Transform(IActionConfiguration actionConfiguration, object payload)
        {
            var enumerable = payload as IEnumerable;

            if (enumerable == null)
            {
                return(null);
            }

            IResponseTransformer innerTransformer = null;

            IList resultList = null;

            foreach (var item in enumerable)
            {
                if (innerTransformer == null)
                {
                    innerTransformer = actionConfiguration.ResponseTransformerFactory.Get(item);
                    if (innerTransformer == null)
                    {
                        throw new Exception(string.Format("Unable to get response transformer for response type {0}", item.GetType()));
                    }
                }

                var transformed = innerTransformer.Transform(actionConfiguration, item);

                if (transformed == null)
                {
                    continue;
                }

                if (resultList == null)
                {
                    var resultType = typeof(List <>).MakeGenericType(new [] { transformed.GetType() });

                    resultList = (IList)Activator.CreateInstance(resultType);
                }

                resultList.Add(transformed);
            }

            return(resultList);
        }
        public ITypeBuilderStrategy Build(IActionConfiguration actionConfiguration, Type returnType)
        {
            string key = actionConfiguration.ActionMethodInfo.ToString() + returnType.ToString();

            return StrategyCache.GetCachedOrAdd(key,
                () =>
                {
                    var sirenMetadataTypes = actionConfiguration.MetadataProvider.GetRegisteredMetadataTypes().ToList();

                    Func<CustomAttributeBuilder> jsonPropAttrNullValueHandling = () =>
                    {
                        var type = typeof (JsonPropertyAttribute);

                        var ctor = type.GetConstructor(Type.EmptyTypes);

                        return new CustomAttributeBuilder(ctor,
                            new object[] {},
                            new[] {type.GetProperty("NullValueHandling")}, new object[] {NullValueHandling.Ignore});
                    };

                    // Do not use IActionConfiguration from parameter list as configuration might be altered on call
                    Action<object, object, IActionConfiguration> classNameAssigner =
                        (proxyObject, originalObject, configuration) =>
                        {
                            var classProp = proxyObject.GetType().GetProperty("class");
                            classProp.SetValue(proxyObject, configuration.Class);
                        };

                    var strategyBuilder = new StrategyBuilder()
                        .For(returnType)
                        .WithPayloadPropertyStrategy(returnType, "properties")
                        .WithSimpleAttributedPropertyStrategy(typeof(string[]), "class", new [] { jsonPropAttrNullValueHandling })
                        .WithSimpleAttributedPropertyStrategy(typeof(string), "href", new[] { jsonPropAttrNullValueHandling })
                        .WithSimpleAttributedPropertyStrategy(typeof(string[]), "rel", new[] { jsonPropAttrNullValueHandling })
                        .WithCustomActivationStrategy(classNameAssigner);

                    sirenMetadataTypes.ForEach(metadataType => strategyBuilder.WithTypedMetadataProperty(metadataType, metadataType.Name.ToLower()));

                    return strategyBuilder.Build();
                });
        }
        public ITypeBuilderStrategy Build(IActionConfiguration actionConfiguration, Type returnType)
        {
            string key = actionConfiguration.ActionMethodInfo.ToString() + returnType.ToString();

            return(StrategyCache.GetCachedOrAdd(key,
                                                () =>
            {
                var sirenMetadataTypes = actionConfiguration.MetadataProvider.GetRegisteredMetadataTypes().ToList();

                Func <CustomAttributeBuilder> jsonPropAttrNullValueHandling = () =>
                {
                    var type = typeof(JsonPropertyAttribute);

                    var ctor = type.GetConstructor(Type.EmptyTypes);

                    return new CustomAttributeBuilder(ctor,
                                                      new object[] {},
                                                      new[] { type.GetProperty("NullValueHandling") }, new object[] { NullValueHandling.Ignore });
                };

                // Do not use IActionConfiguration from parameter list as configuration might be altered on call
                Action <object, object, IActionConfiguration> classNameAssigner =
                    (proxyObject, originalObject, configuration) =>
                {
                    var classProp = proxyObject.GetType().GetProperty("class");
                    classProp.SetValue(proxyObject, configuration.Class);
                };

                var strategyBuilder = new StrategyBuilder()
                                      .For(returnType)
                                      .WithPayloadPropertyStrategy(returnType, "properties")
                                      .WithSimpleAttributedPropertyStrategy(typeof(string[]), "class", new [] { jsonPropAttrNullValueHandling })
                                      .WithSimpleAttributedPropertyStrategy(typeof(string), "href", new[] { jsonPropAttrNullValueHandling })
                                      .WithSimpleAttributedPropertyStrategy(typeof(string[]), "rel", new[] { jsonPropAttrNullValueHandling })
                                      .WithCustomActivationStrategy(classNameAssigner);

                sirenMetadataTypes.ForEach(metadataType => strategyBuilder.WithTypedMetadataProperty(metadataType, metadataType.Name.ToLower()));

                return strategyBuilder.Build();
            }));
        }
Ejemplo n.º 22
0
        public static MetadataPlainObjects.Links Generate(IActionConfiguration actionConfiguration, Dictionary<string, List<string>> routeRelations, object originalObject)
        {
            var result = new MetadataPlainObjects.Links();

            var mappingRules = actionConfiguration.MappingRules;

            var routeNameSubstitution = new DefaultRouteValueSubstitution();

            result.AddRange(from mappingRule in mappingRules
                let apiDescription = mappingRule.ApiDescriptions.OrderBy(d => d.RelativePath.Length).FirstOrDefault()
                let isLink = mappingRule.Type == MappingRule.RuleType.LinkRule || (mappingRule.Type == MappingRule.RuleType.Default && apiDescription.HttpMethod == HttpMethod.Get)
                where apiDescription != null && isLink
                let absolutePath = LinkHelper.MakeAbsolutePath(routeNameSubstitution.Substitute(apiDescription.RelativePath, mappingRule, originalObject))
                select new MetadataPlainObjects.SirenLink()
                {
                    Href = absolutePath,
                    RelList = GetRelList(mappingRule, apiDescription, routeRelations[apiDescription.ID])
                });

            return result;
        }
Ejemplo n.º 23
0
        public static MetadataPlainObjects.Links Generate(IActionConfiguration actionConfiguration, Dictionary <string, List <string> > routeRelations, object originalObject)
        {
            var result = new MetadataPlainObjects.Links();

            var mappingRules = actionConfiguration.MappingRules;

            var routeNameSubstitution = new DefaultRouteValueSubstitution();

            result.AddRange(from mappingRule in mappingRules
                            let apiDescription = mappingRule.ApiDescriptions.OrderBy(d => d.RelativePath.Length).FirstOrDefault()
                                                 let isLink = mappingRule.Type == MappingRule.RuleType.LinkRule || (mappingRule.Type == MappingRule.RuleType.Default && apiDescription.HttpMethod == HttpMethod.Get)
                                                              where apiDescription != null && isLink
                                                              let absolutePath = LinkHelper.MakeAbsolutePath(routeNameSubstitution.Substitute(apiDescription.RelativePath, mappingRule, originalObject))
                                                                                 select new MetadataPlainObjects.SirenLink()
            {
                Href    = absolutePath,
                RelList = GetRelList(mappingRule, apiDescription, routeRelations[apiDescription.ID])
            });

            return(result);
        }
        public ITypeBuilderStrategy Build(IActionConfiguration actionConfiguration, Type returnType)
        {
            string key = actionConfiguration.ActionMethodInfo.ToString() + returnType.ToString();

            return(StrategyCache.GetCachedOrAdd(key,
                                                () =>
            {
                var rels =
                    (Dictionary <string, IList <string> >)
                    actionConfiguration.MetadataProvider.GetMetadataByType(
                        typeof(Dictionary <string, IList <string> >));

                IList <string> topRels = rels.Values.ToList().ConvertAll(c => c.FirstOrDefault());

                var strategyBuilder = new StrategyBuilder()
                                      .For(returnType)
                                      .WithSimpleProperties()
                                      .WithPlainRouteInformation(topRels);

                return strategyBuilder.Build();
            }));
        }
        public ITypeBuilderStrategy Build(IActionConfiguration actionConfiguration, Type returnType)
        {
            string key = actionConfiguration.ActionMethodInfo.ToString() + returnType.ToString();

            return StrategyCache.GetCachedOrAdd(key,
                () =>
                {
                    var rels =
                        (Dictionary<string, IList<string>>)
                            actionConfiguration.MetadataProvider.GetMetadataByType(
                                typeof (Dictionary<string, IList<string>>));

                    IList<string> topRels = rels.Values.ToList().ConvertAll(c => c.FirstOrDefault());

                    var strategyBuilder = new StrategyBuilder()
                        .For(returnType)
                        .WithSimpleProperties()
                        .WithPlainRouteInformation(topRels);

                    return strategyBuilder.Build();
                });
        }
Ejemplo n.º 26
0
        public object Transform(IActionConfiguration actionConfiguration, object payload)
        {
            var enumerable = payload as IEnumerable;

            if (enumerable == null)
                return null;

            IResponseTransformer innerTransformer = null;

            IList resultList = null;

            foreach (var item in enumerable)
            {
                if (innerTransformer == null)
                {
                    innerTransformer = actionConfiguration.ResponseTransformerFactory.Get(item);
                    if (innerTransformer == null)
                        throw new Exception(string.Format("Unable to get response transformer for response type {0}", item.GetType()));
                }

                var transformed = innerTransformer.Transform(actionConfiguration, item);

                if (transformed == null)
                    continue;

                if (resultList == null)
                {
                    var resultType = typeof (List<>).MakeGenericType(new [] {transformed.GetType()});

                    resultList = (IList)Activator.CreateInstance(resultType);
                }

                resultList.Add(transformed);
            }

            return resultList;
        }
 public static IActionConfiguration WithStatus(this IActionConfiguration source, Status status)
 {
     return(new CompositeActionConfiguration(source, Status(status)));
 }
Ejemplo n.º 28
0
        private static object GenerateForRule(EntityRule rule, IActionConfiguration actionConfiguration,
            Dictionary<string, List<string>> routeRelations, object originalObject)
        {
            if (rule.EntityEmbeddingRule == EntityRule.EmbeddingRule.Embedded)
                return GenerateForEmbeddedRule(rule, actionConfiguration, routeRelations, originalObject);

            return GenerateForLinkedRule(rule, actionConfiguration, routeRelations, originalObject);
        }
Ejemplo n.º 29
0
 public override void ActivateInstance(object proxyInstance, object originalInstance, IActionConfiguration actionConfiguration)
 {
     _compositeStrategiesList.ForEach(a => a.ActivateInstance(proxyInstance, originalInstance, actionConfiguration));
 }
        public override void ActivateInstance(object proxyInstance, object originalInstance, IActionConfiguration actionConfiguration)
        {
            var aggregateFieldInfo = proxyInstance.GetType().GetField(AggregateFieldName,
                                                                      BindingFlags.NonPublic |
                                                                      BindingFlags.Instance);

            if (aggregateFieldInfo == null)
            {
                throw new Exception("Unable to activate instance");
            }

            aggregateFieldInfo.SetValue(proxyInstance, originalInstance);
        }
Ejemplo n.º 31
0
 public override void ActivateInstance(object proxyInstance, object originalInstance, IActionConfiguration actionConfiguration)
 {
     _compositeStrategiesList.ForEach(a => a.ActivateInstance(proxyInstance, originalInstance, actionConfiguration));
 }
Ejemplo n.º 32
0
 public override void ActivateInstance(object proxyInstance, object originalInstance, IActionConfiguration actionConfiguration)
 {
     if (_customActivator != null)
         _customActivator(proxyInstance, originalInstance, actionConfiguration);
 }
Ejemplo n.º 33
0
 public virtual void ActivateInstance(object proxyInstance, object originalInstance, IActionConfiguration actionConfiguration)
 {
 }
Ejemplo n.º 34
0
        public SimpleMetadataProvider(IActionConfiguration actionConfiguration)
        {
            _actionConfiguration = actionConfiguration;

            GenerateLinkNames();
        }
Ejemplo n.º 35
0
 public virtual void ActivateInstance(object proxyInstance, object originalInstance, IActionConfiguration actionConfiguration)
 {
 }
Ejemplo n.º 36
0
        private static object GenerateForLinkedRule(EntityRule rule,
            IActionConfiguration actionConfiguration,
            Dictionary<string, List<string>> routeRelations, object originalObject)
        {
            var actionExecutedContext = ActionCallContext.Get<HttpActionExecutedContext>();
            var entityActionConfiguration = HypermediaControllerConfiguration.Instance.GetcontrollerActionConfiguration(rule.ControllerType, rule.ControllerAction, actionExecutedContext.Request.Headers.Accept);
            if (entityActionConfiguration == null)
                return null;

            var referencedObject = rule.GetReferencedObjectInstance(originalObject);

            if (referencedObject == null)
                return null;
            var selfRule = entityActionConfiguration.MappingRules.FirstOrDefault(r => r.Names.Contains("self"));

            if (selfRule == null)
                throw new Exception(string.Format("Unable to generate link to entity object from controller {0} action {1}. Can't find self rel.", actionConfiguration.ControllerType.FullName, actionConfiguration.ActionMethodInfo));

            var selfApi = selfRule.ApiDescriptions.OrderBy(d => d.RelativePath.Length).FirstOrDefault();

            if (selfApi == null)
                throw new Exception(string.Format("Unable to generate link to entity object from controller {0} action {1}. Can't find self API.", actionConfiguration.ControllerType.FullName, actionConfiguration.ActionMethodInfo));

            var routeNameSubstitution = new DefaultRouteValueSubstitution();

            var absolutePath =
                LinkHelper.MakeAbsolutePath(routeNameSubstitution.Substitute(selfApi.RelativePath, selfRule,
                    referencedObject));

            return new LinkedEntity()
            {
                Rels = rule.Rel,
                ClassName = entityActionConfiguration.Class,
                Href = absolutePath
            };
        }
Ejemplo n.º 37
0
        public void Setup()
        {
            _fixture = new Fixture();
            _fixture.Customize(new AutoMoqCustomization());
            _fixture.Customize(new RandomNumericSequenceCustomization());

            Expression<Func<ControllerSample, ModelSample, IEnumerable<ModelSample>>> lambda = (c, m)
               => c.ControllerQueryMethod(m.Id, m.Name, QueryParameter.Is<string>(), QueryParameter.Is<int>());

            Expression<Func<ControllerSample, ModelSample, ModelSample>> lambda2 = (c, m)
               => c.ControllerMethodPut(m.Id, m);

            var apiExplorerMoq = new Mock<IApiExplorer>();
            apiExplorerMoq.Setup(_ => _.ApiDescriptions).Returns(new Collection<ApiDescription>()
            {
                new ApiDescription()
                {
                }
            });

            var actionConfiguration = new Mock<IActionConfiguration>();
            actionConfiguration.Setup(_ => _.MappingRules).Returns(() => new List<MappingRule>
            {
                new MappingRule( (MethodCallExpression)lambda.Body, apiExplorerMoq.Object)
                {
                    ApiDescriptions = new List<ApiDescription>()
                    {
                        new ApiDescription()
                        {
                            RelativePath = "/api/{id}?query={query}",
                            HttpMethod = HttpMethod.Get
                        }
                    },
                    Type = MappingRule.RuleType.Default

                },
                new MappingRule( (MethodCallExpression)lambda2.Body, apiExplorerMoq.Object)
                {
                    ApiDescriptions = new List<ApiDescription>()
                    {
                        new ApiDescription()
                        {
                            RelativePath = "/api/prod/{id}",
                            HttpMethod = HttpMethod.Put
                        }
                    },
                    Type = MappingRule.RuleType.Default

                }
            });

            _actionConfiguration = actionConfiguration.Object;
        }
 // Next, some extension methods which allow you to chain things together
 // This is really the glue that makes this whole solution easy to use
 public static IActionConfiguration WithDamage(this IActionConfiguration source, int strength)
 {
     return(new CompositeActionConfiguration(source, Damage(strength)));
 }
Ejemplo n.º 39
0
        public SimpleMetadataProvider(IActionConfiguration actionConfiguration)
        {
            _actionConfiguration = actionConfiguration;

            GenerateLinkNames();
        }
Ejemplo n.º 40
0
 public override void ActivateInstance(object proxyInstance, object originalInstance, IActionConfiguration actionConfiguration)
 {
     if (_customActivator != null)
     {
         _customActivator(proxyInstance, originalInstance, actionConfiguration);
     }
 }
        public override void ActivateInstance(object proxyInstance, object originalInstance, IActionConfiguration actionConfiguration)
        {
            var aggregateFieldInfo = proxyInstance.GetType().GetField(PropertyVisitor.PropertyFieldName(_propertyName),
                                                                      BindingFlags.NonPublic |
                                                                      BindingFlags.Instance);

            if (aggregateFieldInfo == null)
            {
                throw new Exception("Unable to activate instance");
            }

            aggregateFieldInfo.SetValue(proxyInstance, actionConfiguration.MetadataProvider.GetMetadataByType(_propertyType, originalInstance));
        }