public override object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args) {

            if (name == "Xml") {
                if (args.Positional.Count() == 0) {
                    dynamic dself = self;
                    // Build an XElement
                    var x = new XElement(
                        (string)dself.Stereotype(),
                        XContents(dself)
                    );
                    return x;
                }
                else {
                    // Deserialize
                    foreach (var p in args.Positional) {
                        if (p is string) {
                            var x = XElement.Parse((string)p);
                            MeldXml(self,x);
                        }
                        else if (p is XElement) {
                            MeldXml(self, (XElement)p);
                        }

                    }
                    return self;
                }

            }
            return proceed();

        }
        public async Task <object> InvokeAsync(string name, INamedEnumerable <object> parameters)
        {
            if (!string.IsNullOrEmpty(name))
            {
                return(await ShapeTypeExecuteAsync(name, parameters));
            }

            if (parameters.Positional.Count() == 1)
            {
                return(await ShapeExecuteAsync(parameters.Positional.First()));
            }

            if (parameters.Positional.Any())
            {
                var htmlContents = await ShapeExecuteAsync(parameters.Positional);

                var htmlContentBuilder = new HtmlContentBuilder();
                foreach (var htmlContent in htmlContents)
                {
                    htmlContentBuilder.AppendHtml(htmlContent);
                }
            }

            // zero args - no display to execute
            return(null);
        }
        public override object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args) {

            // Call to Json function
            // Stuff.Json() -> serialize to string
            // Stuff.Json(string foo) -> meld from Json string
            if (name == "Json") {
                if (args.Positional.Count() == 0) {
                    // Serialize
                    var serializer = new JavaScriptSerializer();
                    serializer.RegisterConverters(new[] { new ClayJavaScriptConverter() });
                    dynamic dself = self;
                    return serializer.Serialize(dself.Get());
                }
                else {
                    var serializer = new JavaScriptSerializer();
                    serializer.RegisterConverters(new[] { new ClayJavaScriptConverter() });
                    dynamic stuff = self;
                    // TODO: Accept some named parameters?
                    foreach (var p in args.Positional) {
                        // Deserialize and meld each Json string
                        // TODO: Throw parameter error if p is not a string
                        stuff.Meld(serializer.Deserialize((String)p, typeof(Stuff)));
                    }
                    return self;
                }
            }

            return proceed();
        }
Beispiel #4
0
        private static void MergeAttributes(INamedEnumerable <object> args, IDictionary <string, string> attributes)
        {
            var arg = args.Positional.SingleOrDefault();

            if (arg != null)
            {
                if (arg is IDictionary)
                {
                    var dictionary = arg as IDictionary;
                    foreach (var key in dictionary.Keys)
                    {
                        attributes[Convert.ToString(key)] = Convert.ToString(dictionary[key]);
                    }
                }
                else
                {
                    foreach (var prop in arg.GetType().GetProperties())
                    {
                        attributes[TranslateIdentifier(prop.Name)] = Convert.ToString(prop.GetValue(arg, null));
                    }
                }
            }
            foreach (var named in args.Named)
            {
                attributes[named.Key] = Convert.ToString(named.Value);
            }
        }
        public static async ValueTask <IShape> CreateAsync <T>(
            this IShapeFactory factory,
            string shapeType,
            INamedEnumerable <T> parameters)
        {
            if (parameters == null ! || parameters == Arguments.Empty)
            {
                return(await factory.CreateAsync(shapeType, NewShape));
            }

            var shape = (Shape)await factory.CreateAsync(shapeType, NewShape);

            var initializer = parameters.Positional.SingleOrDefault();

            // If only one non-Type, use it as the source object to copy.
            if (initializer != null)
            {
                // Use the Arguments class to optimize reflection code.
                var arguments = Arguments.From(initializer);

                foreach (var prop in arguments.Named)
                {
                    shape.Properties[prop.Key] = prop.Value;
                }
            }
            else
            {
                foreach (var(key, value) in parameters.Named)
                {
                    shape.Properties[key] = value !;
                }
            }

            return(shape);
        }
Beispiel #6
0
        public static IShape Create(this IShapeFactory factory, string shapeType, INamedEnumerable <object> parameters)
        {
            return(factory.Create(shapeType, () =>
            {
                var shape = new Shape();

                // If only one non-Type, use it as the source object to copy
                if (parameters != null)
                {
                    var initializer = parameters.Positional.SingleOrDefault();
                    if (initializer != null)
                    {
                        foreach (var prop in initializer.GetType().GetProperties())
                        {
                            shape.Properties[prop.Name] = prop.GetValue(initializer, null);
                        }
                    }
                    else
                    {
                        foreach (var kv in parameters.Named)
                        {
                            shape.Properties[kv.Key] = kv.Value;
                        }
                    }
                }

                return shape;
            }));
        }
 public override object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args) {
     switch (name) {
         case "ContainsKey":
             if (args.Positional.Count() == 1 && args.Positional.First().GetType() == typeof(String)) {
                 return ((dynamic)self)[args.Positional.First()] != null;
             }
             break;
     }
     return proceed();
 }
Beispiel #8
0
        public override object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args) {

            if (name == "Meld") {
                // Perform meld
                foreach (var o in args.Positional) {
                    Meld(self, o);
                }
                return null;
            }

            return proceed();
        }
        public override object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args) {

            // Intercept Add() and inject the prefix into the incoming shape
            if (name == "Add" && (args.Positional.Count() == 1 || args.Positional.Count() == 2)
                && (typeof(IShape).IsInstanceOfType(args.Positional.First()))) {
                dynamic added = args.Positional.First();
                if (added.Prefix != null) {
                    added.Prefix = _prefix + "." + ((string)added.Prefix);
                }
            }
            return proceed();
        }
 public override object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args) {
     if (name == "Invert") {
         if (args.Count() == 0) {
             Inverted = true;
         }
         else {
             Inverted = (bool)(args.First());
         }
         return null;
     }
     return proceed();
 }
        public IShape Create(string shapeType, INamedEnumerable<object> parameters, Func<dynamic> createShape)
        {
            dynamic shape = createShape();

            if (parameters != null)
            {
                foreach (KeyValuePair<string, object> parameter in parameters.Named)
                {
                    shape.Data[parameter.Key] = parameter.Value;
                }
            }

            return shape;
        }
Beispiel #12
0
        /// <summary>
        /// 调用。
        /// </summary>
        /// <param name="name">名称。</param>
        /// <param name="parameters">参数。</param>
        /// <returns>结果。</returns>
        public object Invoke(string name, INamedEnumerable <object> parameters)
        {
            if (!string.IsNullOrEmpty(name))
            {
                return(ShapeTypeExecute(name, parameters));
            }

            if (parameters.Positional.Count() == 1)
            {
                return(ShapeExecute(parameters.Positional.Single()));
            }

            return(parameters.Positional.Any() ? new Combined(ShapeExecute(parameters.Positional)) : null);
        }
Beispiel #13
0
        public object Invoke(string name, INamedEnumerable<object> parameters) {
            if (!string.IsNullOrEmpty(name)) {
                return ShapeTypeExecute(name, parameters);
            }

            if (parameters.Positional.Count() == 1) {
                return ShapeExecute(parameters.Positional.Single());
            }

            if (parameters.Positional.Any()) {
                return new Combined(ShapeExecute(parameters.Positional));
            }

            // zero args - no display to execute
            return null;
        }
Beispiel #14
0
        public override object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args) {

            if (name == "Supertype") {

                if (args.Count() == 0) {
                    return _superType;
                }
                if (args.Positional.Count()==1) {
                    var param = args.Positional.First();
                    if (param is Type) {
                        _superType = ((Type)param).Name;
                    }
                    else {
                        _superType = param.ToString();
                    }
                    return self;
                }

            }

            if (name == "Stereotype") {

                if (args.Count() == 0) {
                    return _stereoType;
                }
                if (args.Positional.Count() == 1) {
                    var param = args.Positional.First();
                    if (param is Type) {
                        _stereoType = ((Type)param).Name;
                    }
                    else {
                        _stereoType = param.ToString();
                    }
                    return self;
                }
            }

            // TODO: Slow lookup, convert to a dict
            // Converts to Array supertype if we use any of the array manipulation methods
            if (_arrayMethods.Contains(name)) {
                dynamic dself = self;
                dself.Supertype("Array");
            }
            return proceed();

        }
Beispiel #15
0
        public Task <IHtmlContent> InvokeAsync(string name, INamedEnumerable <object> parameters)
        {
            if (!String.IsNullOrEmpty(name))
            {
                return(ShapeTypeExecuteAsync(name, parameters));
            }

            if (parameters.Positional.Count == 1)
            {
                return(ShapeExecuteAsync(parameters.Positional.First() as IShape));
            }

            if (parameters.Positional.Count > 0)
            {
                return(ShapeExecuteAsync(parameters.Positional.Cast <IShape>()));
            }

            // zero args - no display to execute
            return(Task.FromResult <IHtmlContent>(null));
        }
Beispiel #16
0
        public Task <IHtmlContent> InvokeAsync(string name, INamedEnumerable <object> parameters)
        {
            if (!string.IsNullOrEmpty(name))
            {
                return(ShapeTypeExecuteAsync(name, parameters));
            }

            if (parameters.Positional.Count() == 1)
            {
                return(ShapeExecuteAsync(parameters.Positional.First()));
            }

            if (parameters.Positional.Any())
            {
                return(ShapeExecuteAsync(parameters.Positional));
            }

            // zero args - no display to execute
            return(null);
        }
Beispiel #17
0
        public async Task<object> InvokeAsync(string name, INamedEnumerable<object> parameters)
        {
            if (!string.IsNullOrEmpty(name))
            {
                return await ShapeTypeExecuteAsync(name, parameters);
            }

            if (parameters.Positional.Count() == 1)
            {
                return await ShapeExecuteAsync(parameters.Positional.First());
            }

            if (parameters.Positional.Any())
            {
                return new Combined(await ShapeExecuteAsync(parameters.Positional));
            }

            // zero args - no display to execute
            return null;
        }
        public override object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args) {

            // Add a header row
            if (name == "Header") {
                var row = _rowFactory();
            }

            // This function adds a row
            if (name == "Row") {
                var row = _rowFactory();
                foreach (var p in args.Positional) {
                    row.Cell(p);
                }
                foreach (var n in args.Named) {
                    row.Cell(n.Key, n.Value);
                }
                ((dynamic)self).Rows.Add(row);
                return row;
            }

            return proceed();
        }
Beispiel #19
0
 private static void MergeClasses(INamedEnumerable <object> args, IList <string> classes)
 {
     foreach (var arg in args)
     {
         // look for string first, because the "string" type is also an IEnumerable of char
         if (arg is string)
         {
             classes.Add(arg as string);
         }
         else if (arg is IEnumerable)
         {
             foreach (var item in arg as IEnumerable)
             {
                 classes.Add(Convert.ToString(item));
             }
         }
         else
         {
             classes.Add(Convert.ToString(arg));
         }
     }
 }
Beispiel #20
0
 private static void MergeItems(INamedEnumerable <object> args, dynamic shape)
 {
     foreach (var arg in args)
     {
         // look for string first, because the "string" type is also an IEnumerable of char
         if (arg is string)
         {
             shape.Add(arg as string);
         }
         else if (arg is IEnumerable)
         {
             foreach (var item in arg as IEnumerable)
             {
                 shape.Add(item);
             }
         }
         else
         {
             shape.Add(Convert.ToString(arg));
         }
     }
 }
        public IShape Create(string shapeType, INamedEnumerable<object> parameters)
        {
            dynamic shape;

            Func<dynamic> factory;
            if (_mocks.TryGetValue(shapeType, out factory))
            {
                shape = factory();
            }
            else
            {
                shape = new ShapeMock(shapeType);
            }

            if (parameters != null)
            {
                foreach (KeyValuePair<string, object> parameter in parameters.Named)
                {
                    shape.Data[parameter.Key] = parameter.Value;
                }
            }

            return shape;
        }
Beispiel #22
0
        private object ShapeTypeExecute(string name, INamedEnumerable <object> parameters)
        {
            var shape = _shapeFactory.Create(name, parameters);

            return(ShapeExecute(shape));
        }
 public IShape Create(string shapeType, INamedEnumerable <object> parameters)
 {
     return(Create(shapeType, parameters, () => new Shape()));
 }
Beispiel #24
0
 private Task<IHtmlContent> ShapeTypeExecuteAsync(string name, INamedEnumerable<object> parameters)
 {
     var shape = _shapeFactory.Create(name, parameters);
     return ShapeExecuteAsync(shape);
 }
Beispiel #25
0
 private object ShapeTypeExecute(string name, INamedEnumerable<object> parameters) {
     var shape = _shapeFactory.Create(name, parameters);
     return ShapeExecute(shape);
 }
 public override object InvokeMember(Func <object> proceed, object target, string name, INamedEnumerable <object> args)
 {
     return(((DefaultShapeFactory)target).Create(name, args));
 }
            public override object InvokeMember(Func <object> proceed, object self, string name, INamedEnumerable <object> args)
            {
                var argsCount = args.Count();

                if (name == "Add" && (argsCount == 1 || argsCount == 2))
                {
                    // pszmyd: Ignore null shapes
                    if (args.First() == null)
                    {
                        return(_parent);
                    }

                    dynamic parent = _parent;

                    dynamic zone = _zoneFactory();
                    zone.Parent   = _parent;
                    zone.ZoneName = _potentialZoneName;
                    parent[_potentialZoneName] = zone;

                    if (argsCount == 1)
                    {
                        return(zone.Add(args.Single()));
                    }

                    return(zone.Add(args.First(), (string)args.Last()));
                }
                return(proceed());
            }
Beispiel #28
0
 private static void MergeAttributes(INamedEnumerable<object> args, IDictionary<string, string> attributes) {
     var arg = args.Positional.SingleOrDefault();
     if (arg != null) {
         if (arg is IDictionary) {
             var dictionary = arg as IDictionary;
             foreach (var key in dictionary.Keys) {
                 attributes[System.Convert.ToString(key)] = System.Convert.ToString(dictionary[key]);
             }
         }
         else {
             foreach (var prop in arg.GetType().GetProperties()) {
                 attributes[TranslateIdentifier(prop.Name)] = System.Convert.ToString(prop.GetValue(arg, null));
             }
         }
     }
     foreach (var named in args.Named) {
         attributes[named.Key] = System.Convert.ToString(named.Value);
     }
 }
Beispiel #29
0
 public override object InvokeMember(Func<object> proceed, dynamic self, string name, INamedEnumerable<object> args) {
     if (name.Equals("Id")) {
         // need to mutate the actual type
         var s = self as Shape;
         if (s != null) {
             s.Id = System.Convert.ToString(args.FirstOrDefault());
         }
         return self;
     }
     if (name.Equals("Classes") && !args.Named.Any()) {
         MergeClasses(args, self.Classes);
         return self;
     }
     if (name.Equals("Attributes") && args.Positional.Count() <= 1) {
         MergeAttributes(args, self.Attributes);
         return self;
     }
     if (name.Equals("Items")) {
         MergeItems(args, self);
         return self;
     }
     return proceed();
 }
 public override object InvokeMemberMissing(Func <object> proceed, object self, string name, INamedEnumerable <object> args)
 {
     Trace.WriteLine("Returning length of " + name);
     return(name.Length);
 }
Beispiel #31
0
 public IShape Create(string shapeType, INamedEnumerable <object> parameters, Func <dynamic> createShape)
 {
     throw new NotImplementedException();
 }
Beispiel #32
0
        public override object InvokeMember(Func <object> proceed, object self, string name, INamedEnumerable <object> args)
        {
            // Add a header row
            if (name == "Header")
            {
                var row = _rowFactory();
            }

            // This function adds a row
            if (name == "Row")
            {
                var row = _rowFactory();
                foreach (var p in args.Positional)
                {
                    row.Cell(p);
                }
                foreach (var n in args.Named)
                {
                    row.Cell(n.Key, n.Value);
                }
                ((dynamic)self).Rows.Add(row);
                return(row);
            }

            return(proceed());
        }
        public IShape Create(string shapeType, INamedEnumerable <object> parameters, IEnumerable <IClayBehavior> behaviors)
        {
            var             defaultShapeTable = _shapeTableLocator.Value.Lookup(null);
            ShapeDescriptor shapeDescriptor;

            defaultShapeTable.Descriptors.TryGetValue(shapeType, out shapeDescriptor);

            var creatingContext = new ShapeCreatingContext {
                New          = this,
                ShapeFactory = this,
                ShapeType    = shapeType,
                OnCreated    = new List <Action <ShapeCreatedContext> >()
            };
            var positional = parameters.Positional;

            creatingContext.BaseType = positional.Take(1).OfType <Type>().SingleOrDefault();
            if (creatingContext.BaseType == null)
            {
                // default to common base class
                creatingContext.BaseType = typeof(Shape);
            }
            else
            {
                // consume the first argument
                positional = positional.Skip(1);
            }

            if (creatingContext.BaseType == typeof(Array))
            {
                // array is a hint - not an intended base class
                creatingContext.BaseType  = typeof(Shape);
                creatingContext.Behaviors = new List <IClayBehavior> {
                    new ClaySharp.Behaviors.InterfaceProxyBehavior(),
                    new ClaySharp.Behaviors.PropBehavior(),
                    new ClaySharp.Behaviors.ArrayBehavior(),
                    new ClaySharp.Behaviors.NilResultBehavior(),
                };
            }
            else
            {
                creatingContext.Behaviors = new List <IClayBehavior> {
                    new ClaySharp.Behaviors.InterfaceProxyBehavior(),
                    new ClaySharp.Behaviors.PropBehavior(),
                    new ClaySharp.Behaviors.NilResultBehavior(),
                    new Shape.ShapeBehavior(),
                };
            }

            if (behaviors != null && behaviors.Any())
            {
                // include behaviors passed in by caller, if any
                creatingContext.Behaviors = creatingContext.Behaviors.Concat(behaviors).ToList();
            }

            // "creating" events may add behaviors and alter base type)
            foreach (var ev in _events)
            {
                ev.Value.Creating(creatingContext);
            }
            if (shapeDescriptor != null)
            {
                foreach (var ev in shapeDescriptor.Creating)
                {
                    ev(creatingContext);
                }
            }

            // create the new instance
            var createdContext = new ShapeCreatedContext {
                New       = creatingContext.New,
                ShapeType = creatingContext.ShapeType,
                Shape     = ClayActivator.CreateInstance(creatingContext.BaseType, creatingContext.Behaviors)
            };
            var shapeMetadata = new ShapeMetadata {
                Type = shapeType
            };

            createdContext.Shape.Metadata = shapeMetadata;

            if (shapeDescriptor != null)
            {
                shapeMetadata.Wrappers = shapeMetadata.Wrappers.Concat(shapeDescriptor.Wrappers).ToList();
            }

            // "created" events provides default values and new object initialization
            foreach (var ev in _events)
            {
                ev.Value.Created(createdContext);
            }
            if (shapeDescriptor != null)
            {
                foreach (var ev in shapeDescriptor.Created)
                {
                    ev(createdContext);
                }
            }
            foreach (var ev in creatingContext.OnCreated)
            {
                ev(createdContext);
            }


            // other properties passed with call overlay any defaults, so are after the created events

            // only one non-Type, non-named argument is allowed
            var initializer = positional.SingleOrDefault();

            if (initializer != null)
            {
                foreach (var prop in initializer.GetType().GetProperties())
                {
                    createdContext.Shape[prop.Name] = prop.GetValue(initializer, null);
                }
            }

            foreach (var kv in parameters.Named)
            {
                createdContext.Shape[kv.Key] = kv.Value;
            }

            return(createdContext.Shape);
        }
 public IShape Create(string shapeType, INamedEnumerable <object> parameters)
 {
     return(Create(shapeType, parameters, Enumerable.Empty <IClayBehavior>()));
 }
Beispiel #35
0
 private static void MergeItems(INamedEnumerable<object> args, dynamic shape) {
     foreach (var arg in args) {
         // look for string first, because the "string" type is also an IEnumerable of char
         if (arg is string) {
             shape.Add(arg as string);
         }
         else if (arg is IEnumerable) {
             foreach (var item in arg as IEnumerable) {
                 shape.Add(item);
             }
         }
         else {
             shape.Add(System.Convert.ToString(arg));
         }
     }
 }
Beispiel #36
0
        public static Task <IShape> CreateAsync <T>(this IShapeFactory factory, string shapeType, INamedEnumerable <T> parameters = null)
        {
            return(factory.CreateAsync(shapeType, NewShape, null, createdContext =>
            {
                var shape = (Shape)createdContext.Shape;

                // If only one non-Type, use it as the source object to copy
                if (parameters != null && parameters != Arguments.Empty)
                {
                    var initializer = parameters.Positional.SingleOrDefault();

                    if (initializer != null)
                    {
                        // Use the Arguments class to optimize reflection code
                        var arguments = Arguments.From(initializer);

                        foreach (var prop in arguments.Named)
                        {
                            shape.Properties[prop.Key] = prop.Value;
                        }
                    }
                    else
                    {
                        foreach (var kv in parameters.Named)
                        {
                            shape.Properties[kv.Key] = kv.Value;
                        }
                    }
                }
            }));
        }
 public override object InvokeMember(Func<object> proceed, dynamic self, string name, INamedEnumerable<object> args)
 {
     if (args.Count() == 1 && args.Named.Count() == 0)
         Patch(self, name, args.Single());
     return proceed();
 }
        public override object InvokeMember(Func <object> proceed, object self, string name, INamedEnumerable <object> args)
        {
            Stuff stuff = ((dynamic)_parent)[_parentName] = new Stuff();

            return((stuff as IClayBehaviorProvider).Behavior.InvokeMember(proceed, self, name, args));
        }
Beispiel #39
0
 public override object InvokeMember(Func <object> proceed, object self, string name, INamedEnumerable <object> args)
 {
     return(string.Format("[name:{0}] [count:{1}]", name ?? "<null>", args.Count()));
 }
Beispiel #40
0
 public override object InvokeMember(Func<object> proceed, object target, string name, INamedEnumerable<object> args) {
     return ((DisplayHelper)target).Invoke(name, args);
 }
        public IShape Create(string shapeType, INamedEnumerable<object> parameters, Func<dynamic> createShape)
        {
            var defaultShapeTable = _shapeTableLocator.Value.Lookup(null);
            ShapeDescriptor shapeDescriptor;
            defaultShapeTable.Descriptors.TryGetValue(shapeType, out shapeDescriptor);

            parameters = parameters ?? Arguments.Empty();

            var creatingContext = new ShapeCreatingContext
            {
                New = this,
                ShapeFactory = this,
                ShapeType = shapeType,
                OnCreated = new List<Action<ShapeCreatedContext>>()
            };

            IEnumerable<object> positional = parameters.Positional.ToList();
            var baseType = positional.FirstOrDefault() as Type;

            if (baseType == null)
            {
                creatingContext.Create = createShape ?? (() => new Shape());
            }
            else
            {
                positional = positional.Skip(1);
                creatingContext.Create = () => Activator.CreateInstance(baseType);
            }

            foreach (var ev in _events)
            {
                ev.Value.Creating(creatingContext);
            }
            if (shapeDescriptor != null)
            {
                foreach (var ev in shapeDescriptor.Creating)
                {
                    ev(creatingContext);
                }
            }

            var createdContext = new ShapeCreatedContext
            {
                New = creatingContext.New,
                ShapeType = creatingContext.ShapeType,
                Shape = creatingContext.Create()
            };

            if (!(createdContext.Shape is IShape))
            {
                throw new InvalidOperationException("无限的形状基本类型: " + createdContext.Shape.GetType().ToString());
            }

            ShapeMetadata shapeMetadata = createdContext.Shape.Metadata;
            createdContext.Shape.Metadata.Type = shapeType;

            if (shapeDescriptor != null)
                shapeMetadata.Wrappers = shapeMetadata.Wrappers.Concat(shapeDescriptor.Wrappers).ToList();

            foreach (var ev in _events)
            {
                ev.Value.Created(createdContext);
            }
            if (shapeDescriptor != null)
            {
                foreach (var ev in shapeDescriptor.Created)
                {
                    ev(createdContext);
                }
            }
            foreach (var ev in creatingContext.OnCreated)
            {
                ev(createdContext);
            }

            var initializer = positional.SingleOrDefault();
            if (initializer != null)
            {
                foreach (var prop in initializer.GetType().GetProperties())
                {
                    createdContext.Shape[prop.Name] = prop.GetValue(initializer, null);
                }
            }

            foreach (var kv in parameters.Named)
            {
                createdContext.Shape[kv.Key] = kv.Value;
            }

            return createdContext.Shape;
        }
 public override object InvokeMember(Func<object> proceed, object target, string name, INamedEnumerable<object> args) {
     return ((DefaultShapeFactory)target).Create(name, args);
 }
Beispiel #43
0
        public override object InvokeMember(Func <object> proceed, object self, string name, INamedEnumerable <object> args)
        {
            if (args.Any())
            {
                return(proceed());
            }

            return(proceed() ?? Nil.Instance);
        }
Beispiel #44
0
 public override object InvokeMember(Func <object> proceed, object self, string name, INamedEnumerable <object> args)
 {
     return(name == "Sample" ? "Data" : proceed());
 }
        public IShape Create(string shapeType, INamedEnumerable<object> parameters, IEnumerable<IClayBehavior> behaviors) {
            var defaultShapeTable = _shapeTableLocator.Value.Lookup(null);
            ShapeDescriptor shapeDescriptor;
            defaultShapeTable.Descriptors.TryGetValue(shapeType, out shapeDescriptor);

            var creatingContext = new ShapeCreatingContext {
                New = this,
                ShapeFactory = this,
                ShapeType = shapeType,
                OnCreated = new List<Action<ShapeCreatedContext>>()
            };
            var positional = parameters.Positional;

            creatingContext.BaseType = positional.Take(1).OfType<Type>().SingleOrDefault();
            if (creatingContext.BaseType == null) {
                // default to common base class
                creatingContext.BaseType = typeof(Shape);
            }
            else {
                // consume the first argument
                positional = positional.Skip(1);
            }

            if (creatingContext.BaseType == typeof(Array)) {
                // array is a hint - not an intended base class
                creatingContext.BaseType = typeof(Shape);
                creatingContext.Behaviors = new List<IClayBehavior> {
                    new ClaySharp.Behaviors.InterfaceProxyBehavior(),
                    new ClaySharp.Behaviors.PropBehavior(),
                    new ClaySharp.Behaviors.ArrayBehavior(),
                    new ClaySharp.Behaviors.NilResultBehavior(),
                };
            }
            else {
                creatingContext.Behaviors = new List<IClayBehavior> {
                    new ClaySharp.Behaviors.InterfaceProxyBehavior(),
                    new ClaySharp.Behaviors.PropBehavior(),
                    new ClaySharp.Behaviors.NilResultBehavior(),
                    new Shape.ShapeBehavior(),
                };
            }
            
            if (behaviors != null && behaviors.Any()) {
                // include behaviors passed in by caller, if any
                creatingContext.Behaviors = creatingContext.Behaviors.Concat(behaviors).ToList();
            }

            // "creating" events may add behaviors and alter base type)
            foreach (var ev in _events) {
                ev.Value.Creating(creatingContext);
            }
            if (shapeDescriptor != null) {
                foreach (var ev in shapeDescriptor.Creating) {
                    ev(creatingContext);
                }
            }

            // create the new instance
            var createdContext = new ShapeCreatedContext {
                New = creatingContext.New,
                ShapeType = creatingContext.ShapeType,
                Shape = ClayActivator.CreateInstance(creatingContext.BaseType, creatingContext.Behaviors)
            };
            var shapeMetadata = new ShapeMetadata { Type = shapeType };
            createdContext.Shape.Metadata = shapeMetadata;

            if (shapeDescriptor != null)
                shapeMetadata.Wrappers = shapeMetadata.Wrappers.Concat(shapeDescriptor.Wrappers).ToList();

            // "created" events provides default values and new object initialization
            foreach (var ev in _events) {
                ev.Value.Created(createdContext);
            }
            if (shapeDescriptor != null) {
                foreach (var ev in shapeDescriptor.Created) {
                    ev(createdContext);
                }
            }
            foreach (var ev in creatingContext.OnCreated) {
                ev(createdContext);
            }


            // other properties passed with call overlay any defaults, so are after the created events

            // only one non-Type, non-named argument is allowed
            var initializer = positional.SingleOrDefault();
            if (initializer != null) {
                foreach (var prop in initializer.GetType().GetProperties()) {
                    createdContext.Shape[prop.Name] = prop.GetValue(initializer, null);
                }
            }

            foreach (var kv in parameters.Named) {
                createdContext.Shape[kv.Key] = kv.Value;
            }

            return createdContext.Shape;
        }
Beispiel #46
0
 public override object InvokeMember(Func <object> proceed, object self, string name, INamedEnumerable <object> args)
 {
     return(proceed() + "-");
 }
 public IShape Create(string shapeType, INamedEnumerable<object> parameters) {
     return Create(shapeType, parameters, Enumerable.Empty<IClayBehavior>());
 }
Beispiel #48
0
 public override object InvokeMemberMissing(Func <object> proceed, object self, string name, INamedEnumerable <object> args)
 {
     if (name == "Foo")
     {
         return("Bar");
     }
     return(proceed());
 }
Beispiel #49
0
 public virtual object InvokeMember(Func <object> proceed, object self, string name, INamedEnumerable <object> args)
 {
     return(proceed());
 }
 public override object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args) {
     Stuff stuff = ((dynamic)_parent)[_parentName] = new Stuff();
     return (stuff as IClayBehaviorProvider).Behavior.InvokeMember(proceed, self, name, args);
 }
Beispiel #51
0
    private void BindObject(object obj, TreeNode root)
    {
        int index = 0;

        if (obj is DataRow)
        {
            // DataRow source, bind column names
            DataRow dr = (DataRow)obj;

            // Create tree structure
            foreach (DataColumn col in dr.Table.Columns)
            {
                // Stop on max nodes
                if (index++ >= MacroResolver.MaxMacroNodes)
                {
                    AppendMore(root);
                    break;
                }

                // Add the column
                object childObj = dr[col.ColumnName];
                AppendChild(root, col.ColumnName, childObj, false);
            }
        }
        else if (obj is DataRowView)
        {
            // DataRowView source, bind column names
            DataRowView dr = (DataRowView)obj;

            // Create tree structure
            foreach (DataColumn col in dr.DataView.Table.Columns)
            {
                // Stop on max nodes
                if (index++ >= MacroResolver.MaxMacroNodes)
                {
                    AppendMore(root);
                    break;
                }

                // Add the column
                object childObj = dr[col.ColumnName];
                AppendChild(root, col.ColumnName, childObj, false);
            }
        }
        else if (obj is AbstractContext)
        {
            AbstractContext context = (AbstractContext)obj;

            // Create tree structure
            foreach (string col in context.Properties)
            {
                // Stop on max nodes
                if (index >= MacroResolver.MaxMacroNodes)
                {
                    AppendMore(root);
                    break;
                }

                // Add the property
                object childObj = context.GetProperty(col);
                AppendChild(root, col, childObj, false);
            }
        }
        else if (obj is IHierarchicalObject)
        {
            // Data container source
            IHierarchicalObject hc = (IHierarchicalObject)obj;

            // Create tree structure
            foreach (string col in hc.Properties)
            {
                // Stop on max nodes
                if (index++ >= MacroResolver.MaxMacroNodes)
                {
                    AppendMore(root);
                    break;
                }

                // Add the property
                object childObj = null;
                try
                {
                    hc.TryGetProperty(col, out childObj);
                }
                catch
                {
                }

                AppendChild(root, col, childObj, false);
            }
        }
        else if (obj is IDataContainer)
        {
            // Data container source
            IDataContainer dc = (IDataContainer)obj;

            // Create tree structure
            foreach (string col in dc.ColumnNames)
            {
                // Stop on max nodes
                if (index++ >= MacroResolver.MaxMacroNodes)
                {
                    AppendMore(root);
                    break;
                }

                // Add the column
                object childObj = null;
                dc.TryGetValue(col, out childObj);

                AppendChild(root, col, childObj, false);
            }
        }

        // Enumerable objects
        if ((obj is IEnumerable) && !(obj is string))
        {
            IEnumerable collection = (IEnumerable)obj;
            IEnumerator enumerator = null;

            bool indexByName = false;

            INamedEnumerable namedCol = null;
            if (obj is INamedEnumerable)
            {
                // Collection with name enumerator
                namedCol = (INamedEnumerable)collection;
                if (namedCol.ItemsHaveNames)
                {
                    enumerator  = namedCol.GetNamedEnumerator();
                    indexByName = true;
                }
            }

            if (!indexByName)
            {
                // Standard collection
                enumerator = collection.GetEnumerator();
            }

            int i = 0;

            while (enumerator.MoveNext())
            {
                // Stop on max nodes
                if (index++ >= MacroResolver.MaxMacroNodes)
                {
                    AppendMore(root);
                    break;
                }

                // Add the item
                object item = SqlHelperClass.EncapsulateObject(enumerator.Current);
                if (indexByName)
                {
                    // Convert the name with dot to indexer
                    string name = namedCol.GetObjectName(item);
                    if (!ValidationHelper.IsIdentifier(name))
                    {
                        name = "[\"" + name + "\"]";
                    }

                    AppendChild(root, name, item, false);
                }
                else
                {
                    // Indexed item
                    AppendChild(root, i.ToString(), item, true);
                }

                i++;
            }
        }
    }
Beispiel #52
0
    private void BindObject(object obj, TreeNode root, bool isPriorityTree)
    {
        int index = 0;

        try
        {
            if (obj is DataRow)
            {
                // DataRow source, bind column names
                DataRow dr = (DataRow)obj;

                // Create tree structure
                foreach (DataColumn col in dr.Table.Columns)
                {
                    // Stop on max nodes
                    if (index++ >= MacroResolver.MaxMacroNodes)
                    {
                        AppendMore(root);
                        break;
                    }

                    // Add the column
                    object childObj = dr[col.ColumnName];
                    AppendChild(root, col.ColumnName, childObj, false, isPriorityTree);
                }
            }
            else if (obj is DataRowView)
            {
                // DataRowView source, bind column names
                DataRowView dr = (DataRowView)obj;

                // Create tree structure
                foreach (DataColumn col in dr.DataView.Table.Columns)
                {
                    // Stop on max nodes
                    if (index++ >= MacroResolver.MaxMacroNodes)
                    {
                        AppendMore(root);
                        break;
                    }

                    // Add the column
                    object childObj = dr[col.ColumnName];
                    AppendChild(root, col.ColumnName, childObj, false, isPriorityTree);
                }
            }
            else if (obj is IHierarchicalObject)
            {
                // Data container source
                IHierarchicalObject hc = (IHierarchicalObject)obj;

                // Create tree structure
                foreach (string col in hc.Properties)
                {
                    // Stop on max nodes
                    if (index++ >= MacroResolver.MaxMacroNodes)
                    {
                        AppendMore(root);
                        break;
                    }

                    // Add the property
                    object childObj = null;
                    try
                    {
                        ContextResolver.GetObjectValue(hc, col, ref childObj);

                        // Append the child value
                        AppendChild(root, col, childObj, false, isPriorityTree);
                    }
                    catch (Exception ex)
                    {
                        EventLogProvider.LogException("MacroTree", "EXPAND", ex);

                        // Append the exception as child value
                        AppendChild(root, col, ex, false, isPriorityTree);
                    }
                }
            }
            else if (obj is IDataContainer)
            {
                // Data container source
                IDataContainer dc = (IDataContainer)obj;

                // Create tree structure
                foreach (string col in dc.ColumnNames)
                {
                    // Stop on max nodes
                    if (index++ >= MacroResolver.MaxMacroNodes)
                    {
                        AppendMore(root);
                        break;
                    }

                    // Add the column
                    object childObj = null;
                    dc.TryGetValue(col, out childObj);

                    AppendChild(root, col, childObj, false, isPriorityTree);
                }
            }

            // Enumerable objects
            if ((obj is IEnumerable) && !(obj is string))
            {
                IEnumerable collection = (IEnumerable)obj;
                IEnumerator enumerator = null;

                bool indexByName = false;

                INamedEnumerable namedCol = null;
                if (obj is INamedEnumerable)
                {
                    // Collection with name enumerator
                    namedCol = (INamedEnumerable)collection;
                    if (namedCol.ItemsHaveNames)
                    {
                        enumerator  = namedCol.GetNamedEnumerator();
                        indexByName = true;
                    }
                }

                if (!indexByName)
                {
                    // Standard collection
                    enumerator = collection.GetEnumerator();
                }

                int i = 0;

                List <string> addedItems = new List <string>();
                addedItems.Add("trees");
                addedItems.Add("documents");

                while (enumerator.MoveNext())
                {
                    // Stop on max nodes
                    if (index++ >= MacroResolver.MaxMacroNodes)
                    {
                        AppendMore(root);
                        break;
                    }

                    // Add the item
                    object item = SqlHelperClass.EncapsulateObject(enumerator.Current);
                    if (indexByName)
                    {
                        // Convert the name with dot to indexer
                        string name = namedCol.GetObjectName(item);
                        if (!ValidationHelper.IsIdentifier(name))
                        {
                            name = "[\"" + name + "\"]";
                        }

                        string nameToLower = name.ToLowerCSafe();
                        if (!addedItems.Contains(nameToLower))
                        {
                            addedItems.Add(nameToLower);
                            AppendChild(root, name, item, false, isPriorityTree);
                        }
                    }
                    else
                    {
                        // Indexed item
                        AppendChild(root, i.ToString(), item, true, isPriorityTree);
                    }

                    i++;
                }
            }
        }
        catch (Exception ex)
        {
            EventLogProvider.LogException("MacroTree", "EXPAND", ex);

            throw ex;
        }
    }
        public IShape Create(string shapeType, INamedEnumerable <object> parameters, Func <dynamic> createShape)
        {
            var             defaultShapeTable = _shapeTableLocator.Value.Lookup(null);
            ShapeDescriptor shapeDescriptor;

            defaultShapeTable.Descriptors.TryGetValue(shapeType, out shapeDescriptor);

            parameters = parameters ?? Arguments.Empty();

            var creatingContext = new ShapeCreatingContext {
                New          = this,
                ShapeFactory = this,
                ShapeType    = shapeType,
                OnCreated    = new List <Action <ShapeCreatedContext> >()
            };

            IEnumerable <object> positional = parameters.Positional.ToList();
            var baseType = positional.FirstOrDefault() as Type;

            if (baseType == null)
            {
                // default to common base class
                creatingContext.Create = createShape ?? (() => new Shape());
            }
            else
            {
                // consume the first argument
                positional             = positional.Skip(1);
                creatingContext.Create = () => Activator.CreateInstance(baseType);
            }

            // "creating" events may add behaviors and alter base type)
            foreach (var ev in _events)
            {
                ev.Value.Creating(creatingContext);
            }
            if (shapeDescriptor != null)
            {
                foreach (var ev in shapeDescriptor.Creating)
                {
                    ev(creatingContext);
                }
            }

            // create the new instance
            var createdContext = new ShapeCreatedContext {
                New       = creatingContext.New,
                ShapeType = creatingContext.ShapeType,
                Shape     = creatingContext.Create()
            };

            if (!(createdContext.Shape is IShape))
            {
                throw new InvalidOperationException("Invalid base type for shape: " + createdContext.Shape.GetType().ToString());
            }

            ShapeMetadata shapeMetadata = createdContext.Shape.Metadata;

            createdContext.Shape.Metadata.Type = shapeType;

            if (shapeDescriptor != null)
            {
                shapeMetadata.Wrappers = shapeMetadata.Wrappers.Concat(shapeDescriptor.Wrappers).ToList();
            }

            // "created" events provides default values and new object initialization
            foreach (var ev in _events)
            {
                ev.Value.Created(createdContext);
            }
            if (shapeDescriptor != null)
            {
                foreach (var ev in shapeDescriptor.Created)
                {
                    ev(createdContext);
                }
            }
            foreach (var ev in creatingContext.OnCreated)
            {
                ev(createdContext);
            }


            // other properties passed with call overlay any defaults, so are after the created events

            // only one non-Type, non-named argument is allowed
            var initializer = positional.SingleOrDefault();

            if (initializer != null)
            {
                foreach (var prop in initializer.GetType().GetProperties())
                {
                    createdContext.Shape[prop.Name] = prop.GetValue(initializer, null);
                }
            }

            foreach (var kv in parameters.Named)
            {
                createdContext.Shape[kv.Key] = kv.Value;
            }

            return(createdContext.Shape);
        }
Beispiel #54
0
 private static void MergeClasses(INamedEnumerable<object> args, IList<string> classes) {
     foreach (var arg in args) {
         // look for string first, because the "string" type is also an IEnumerable of char
         if (arg is string) {
             classes.Add(arg as string);
         }
         else if (arg is IEnumerable) {
             foreach (var item in arg as IEnumerable) {
                 classes.Add(System.Convert.ToString(item));
             }
         }
         else {
             classes.Add(System.Convert.ToString(arg));
         }
     }
 }
Beispiel #55
0
 public override object InvokeMemberMissing(Func<object> proceed, object self, string name, INamedEnumerable<object> args) {
     Trace.WriteLine("Returning length of " + name);
     return name.Length;
 }
            public override object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args) {
                var argsCount = args.Count();
                if (name == "Add" && (argsCount == 1 || argsCount == 2)) {
                    // pszmyd: Ignore null shapes
                    if (args.First() == null)
                        return _parent;

                    dynamic parent = _parent;

                    dynamic zone = _zoneFactory();
                    zone.Parent = _parent;
                    zone.ZoneName = _potentialZoneName;
                    parent[_potentialZoneName] = zone;

                    if (argsCount == 1)
                        return zone.Add(args.Single());

                    return zone.Add(args.First(), (string)args.Last());
                }
                return proceed();
            }
        public IShape Create(string shapeType, INamedEnumerable<object> parameters, Func<dynamic> createShape)
        {
            var defaultShapeTable = _shapeTableManager.GetShapeTable(null);
            ShapeDescriptor shapeDescriptor;
            defaultShapeTable.Descriptors.TryGetValue(shapeType, out shapeDescriptor);

            parameters = parameters ?? Arguments.Empty();

            var creatingContext = new ShapeCreatingContext {
                New = this,
                ShapeFactory = this,
                ShapeType = shapeType,
                OnCreated = new List<Action<ShapeCreatedContext>>()
            };

            IEnumerable<object> positional = parameters.Positional.ToList();
            var baseType = positional.FirstOrDefault() as Type;

            if (baseType == null) {
                // default to common base class
                creatingContext.Create = createShape ?? (() => new Shape());
            }
            else {
                // consume the first argument
                positional = positional.Skip(1);
                creatingContext.Create = () => Activator.CreateInstance(baseType);
            }

            // "creating" events may add behaviors and alter base type)
            foreach (var ev in _events) {
                ev.Creating(creatingContext);
            }
            if (shapeDescriptor != null) {
                foreach (var ev in shapeDescriptor.Creating) {
                    ev(creatingContext);
                }
            }

            // create the new instance
            var createdContext = new ShapeCreatedContext {
                New = creatingContext.New,
                ShapeType = creatingContext.ShapeType,
                Shape = creatingContext.Create()
            };

            if (!(createdContext.Shape is IShape)) {
                throw new InvalidOperationException("Invalid base type for shape: " + createdContext.Shape.GetType().ToString());
            }

            ShapeMetadata shapeMetadata = createdContext.Shape.Metadata;
            createdContext.Shape.Metadata.Type = shapeType;

            if (shapeDescriptor != null)
                shapeMetadata.Wrappers = shapeMetadata.Wrappers.Concat(shapeDescriptor.Wrappers).ToList();

            // "created" events provides default values and new object initialization
            foreach (var ev in _events) {
                ev.Created(createdContext);
            }
            if (shapeDescriptor != null) {
                foreach (var ev in shapeDescriptor.Created) {
                    ev(createdContext);
                }
            }
            foreach (var ev in creatingContext.OnCreated) {
                ev(createdContext);
            }

            // other properties passed with call overlay any defaults, so are after the created events

            // only one non-Type, non-named argument is allowed
            var initializer = positional.SingleOrDefault();
            if (initializer != null) {
                foreach (var prop in initializer.GetType().GetProperties()) {
                    createdContext.Shape[prop.Name] = prop.GetValue(initializer, null);
                }
            }

            foreach (var kv in parameters.Named) {
                createdContext.Shape[kv.Key] = kv.Value;
            }

            return createdContext.Shape;
        }
Beispiel #58
0
        private Task <IHtmlContent> ShapeTypeExecuteAsync(string name, INamedEnumerable <object> parameters)
        {
            var shape = _shapeFactory.Create(name, parameters);

            return(ShapeExecuteAsync(shape));
        }
 public IShape Create(string shapeType, INamedEnumerable<object> parameters)
 {
     return Create(shapeType, parameters, () => new Shape());
 }
Beispiel #60
-21
        public async Task<object> InvokeAsync(string name, INamedEnumerable<object> parameters)
        {
            if (!string.IsNullOrEmpty(name))
            {
                return await ShapeTypeExecuteAsync(name, parameters);
            }

            if (parameters.Positional.Count() == 1)
            {
                return await ShapeExecuteAsync(parameters.Positional.First());
            }

            if (parameters.Positional.Any())
            {
                var htmlContents = await ShapeExecuteAsync(parameters.Positional);
                var htmlContentBuilder = new HtmlContentBuilder();
                foreach (var htmlContent in htmlContents)
                {
                    htmlContentBuilder.AppendHtml(htmlContent);
                }
            }

            // zero args - no display to execute
            return null;
        }