Ejemplo n.º 1
0
        public static object DecodeMap(this MapSchema schema, JToken value)
        {
            var jobject = value as JObject;

            if (jobject != null)
            {
                var valueSchema = schema.ValueSchema;
                var valueType   = GetNativeType(valueSchema);
                var valueDict   = typeof(IDictionary <,>)
                                  .MakeGenericType(typeof(string), valueType)
                                  .GetConstructor(new Type[0])
                                  .Invoke(null);

                var magicDict = MagicMarker.GetStringDictionaryFactory(valueType).Invoke(valueDict);

                foreach (var property in jobject.Properties())
                {
                    magicDict[property.Name] = DecodeAny(valueSchema, property.Value);
                }

                return(valueDict);
            }

            throw new ArgumentException("invalid value type: " + value.GetType().FullName);
        }
Ejemplo n.º 2
0
        public static bool IsExistsIndexedValue(Object value, int index)
        {
            if (value == null)
            {
                return(false);
            }

            var asArray = value as Array;

            if (asArray != null)
            {
                return(asArray.Length > index);
            }

            var asString = value as string;

            if (asString != null)
            {
                return(asString.Length > index);
            }

            var asType        = value.GetType();
            var asGenericList = asType.FindGenericInterface(typeof(IList <>));

            if (asGenericList != null)
            {
                var asList = MagicMarker.GetListFactory(value.GetType()).Invoke(value);
                return(asList.Count > index);
            }

            return(false);
        }
        public Object GetBeanPropInternal(Object @object, Object key)
        {
            try {
                var result = _field.GetValue(@object);
                if (result == null) {
                    return null;
                }

                if (result is Map) {
                    return ((Map) result).Get(key);
                }

                var resultType = result.GetType();
                if (resultType.IsGenericDictionary()) {
                    return MagicMarker
                        .GetDictionaryFactory(resultType)
                        .Invoke(result)
                        .Get(key);
                }

                return null;
            }
            catch (PropertyAccessException) {
                throw;
            }
            catch (InvalidCastException e) {
                throw PropertyUtility.GetMismatchException(_field, @object, e);
            }
            catch (ArgumentException e) {
                throw PropertyUtility.GetIllegalArgumentException(_field, e);
            }
            catch (Exception e) {
                throw PropertyUtility.GetAccessExceptionField(_field, e);
            }
        }
        public Object GetBeanPropInternal(Object @object, Object key)
        {
            try {
                var result = _fastMethod.Invoke(@object, null);
                if (result == null) {
                    return null;
                }

                if (result is Map) {
                    return ((Map) result).Get(key);
                }

                if (result.GetType().IsGenericDictionary()) {
                    return MagicMarker
                        .GetDictionaryFactory(result.GetType())
                        .Invoke(result)
                        .Get(key);
                }

                return null;
            }
            catch (PropertyAccessException) {
                throw;
            }
            catch (InvalidCastException e) {
                throw PropertyUtility.GetMismatchException(_fastMethod.Target, @object, e);
            }
            catch (TargetInvocationException e) {
                throw PropertyUtility.GetInvocationTargetException(_fastMethod.Target, e);
            }
            catch (Exception e) {
                throw PropertyUtility.GetAccessExceptionMethod(_fastMethod.Target, e);
            }
        }
Ejemplo n.º 5
0
        public static Object GetMappedValue(object map, string key)
        {
            if (map == null)
            {
                return null;
            }

            var magicMap = MagicMarker.GetStringDictionary(map);
            return magicMap.Get(key);
        }
Ejemplo n.º 6
0
        protected override Object Call(DynamicPropertyDescriptor descriptor, Object underlying)
        {
            try
            {
                if (descriptor.HasParameters)
                {
                    return(descriptor.GetMethod().Invoke(underlying, _paramList));
                }

                var result = descriptor.GetMethod().Invoke(underlying, null);
                if (result == null)
                {
                    return(null);
                }

                if (result is DataMap)
                {
                    var resultDictionary = (DataMap)result;
                    return(resultDictionary.Get(_paramList[0]));
                }

                Func <object, DataMap> resultFactory = null;

                var resultType = result.GetType();
                if (ReferenceEquals(resultType, _lastResultType))
                {
                    resultFactory = _lastResultFactory;
                }
                else
                {
                    _lastResultFactory = resultFactory = MagicMarker.GetStringDictionaryFactory(resultType);
                    _lastResultType    = resultType;
                }

                if (resultFactory != null)
                {
                    var resultDictionary = resultFactory.Invoke(result);
                    return(resultDictionary.Get(_paramList[0]));
                }

                return(null);
            }
            catch (InvalidCastException e)
            {
                throw PropertyUtility.GetMismatchException(descriptor.GetMethod().Target, underlying, e);
            }
            catch (PropertyAccessException)
            {
                throw;
            }
            catch (Exception e)
            {
                throw new PropertyAccessException(e);
            }
        }
Ejemplo n.º 7
0
            public void Add(ICollection<Object> constants, Object value)
            {
                IEnumerable<object> mapKeys;

                if (value.GetType().IsGenericDictionary())
                    mapKeys = MagicMarker.GetDictionaryFactory(value.GetType()).Invoke(value).Keys;
                else
                    throw new ArgumentException("invalid value", nameof(value));

                constants.AddAll(mapKeys);
            }
Ejemplo n.º 8
0
        public static IDictionary <string, object> UnwrapStringDictionary(this object value)
        {
            if (value == null)
            {
                return(null);
            }

            if (value is IDictionary <string, object> )
            {
                return((IDictionary <string, object>)value);
            }

            var valueType = value.GetType();

            if (valueType.IsGenericStringDictionary())
            {
                return(MagicMarker.GetStringDictionaryFactory(valueType).Invoke(value));
            }

            if (value is IEnumerable <KeyValuePair <string, object> > )
            {
                var valueDataMap = new Dictionary <string, object>();
                foreach (var valueKeyValuePair in (IEnumerable <KeyValuePair <string, object> >)value)
                {
                    valueDataMap[valueKeyValuePair.Key] = valueKeyValuePair.Value;
                }

                return(valueDataMap);
            }

            if (value is KeyValuePair <string, object> )
            {
                var valueDataMap      = new Dictionary <string, object>();
                var valueKeyValuePair = (KeyValuePair <string, object>)value;
                valueDataMap[valueKeyValuePair.Key] = valueKeyValuePair.Value;
                return(valueDataMap);
            }

            // use this sparingly since its more expensive... we may need to write
            // a more generalized method if this becomes commonplace.

            var dictType = valueType.FindGenericInterface(typeof(IDictionary <,>));

            if (dictType != null)
            {
                var magicDictionary = MagicMarker.GetDictionaryFactory(valueType).Invoke(value);
                return(magicDictionary.Transform(
                           ki => Convert.ToString(ki),
                           ke => ke));
            }

            throw new ArgumentException("unable to convert input to string dictionary");
        }
Ejemplo n.º 9
0
            public void Add(ICollection<Object> constants, Object value)
            {
                ICollection<object> collection;

                if (value is ICollection<object>)
                    collection = (ICollection<object>)value;
                else if (value.GetType().IsGenericCollection())
                    collection = MagicMarker.GetCollectionFactory(value.GetType()).Invoke(value);
                else
                    throw new ArgumentException("invalid value", nameof(value));

                constants.AddAll(collection);
            }
Ejemplo n.º 10
0
        private JObject EncodeMap(MapSchema schema, object value)
        {
            var valueType = schema.ValueSchema;
            var valueDict = MagicMarker.GetStringDictionary(value);
            var jvalue    = new JObject();

            foreach (var valueKeyPair in valueDict)
            {
                jvalue.Add(new JProperty(valueKeyPair.Key, Encode(valueType, valueKeyPair.Value)));
            }

            return(jvalue);
        }
Ejemplo n.º 11
0
        public static Object GetIndexedValue(Object value, int index)
        {
            if (value == null)
            {
                return(null);
            }

            var asArray = value as Array;

            if (asArray != null)
            {
                if (asArray.Length <= index)
                {
                    return(null);
                }

                return(asArray.GetValue(index));
            }

            var asString = value as string;

            if (asString != null)
            {
                if (asString.Length <= index)
                {
                    return(null);
                }

                return(asString[index]);
            }

            var asType        = value.GetType();
            var asGenericList = asType.FindGenericInterface(typeof(IList <>));

            if (asGenericList != null)
            {
                var asList = MagicMarker.GetListFactory(value.GetType()).Invoke(value);
                if (asList.Count <= index)
                {
                    return(null);
                }

                return(asList[index]);
            }

            return(null);
        }
Ejemplo n.º 12
0
        public static bool GetMappedPropertyExists(Object value, String key)
        {
            if (value == null)
            {
                return(false);
            }
            if (value is DataMap)
            {
                return(((DataMap)value).ContainsKey(key));
            }
            if (value.GetType().IsGenericStringDictionary())
            {
                return(MagicMarker.GetStringDictionary(value).ContainsKey(key));
            }

            return(false);
        }
Ejemplo n.º 13
0
        public static Object GetMappedPropertyValue(Object value, String key)
        {
            if (value == null)
            {
                return(null);
            }
            if (value is DataMap)
            {
                return(((DataMap)value).Get(key));
            }
            if (value.GetType().IsGenericStringDictionary())
            {
                return(MagicMarker.GetStringDictionary(value).Get(key));
            }

            return(null);
        }
Ejemplo n.º 14
0
        public static IDictionary <string, object> AsStringDictionary(this object value)
        {
            if (value == null)
            {
                return(null);
            }
            if (value is IDictionary <string, object> )
            {
                return((IDictionary <string, object>)value);
            }
            if (value.GetType().IsGenericDictionary())
            {
                return(MagicMarker.GetStringDictionary(value));
            }

            throw new ArgumentException("invalid value for string dictionary", "value");
        }
Ejemplo n.º 15
0
        public static IList <object> AsObjectList(this object value)
        {
            if (value == null)
            {
                return(null);
            }
            else if (value is IList <object> asList)
            {
                return(asList);
            }
            else if (value.GetType().IsGenericList())
            {
                return(MagicMarker
                       .GetListFactory(value.GetType())
                       .Invoke(value));
            }

            throw new ArgumentException("invalid value for object list");
        }
Ejemplo n.º 16
0
        public static IDictionary <string, object> UnwrapDictionary(this object value)
        {
            var valueDataMap = value as IDictionary <string, object>;

            if (valueDataMap == null)
            {
                var valueType = value.GetType();
                if (valueType.IsGenericStringDictionary())
                {
                    valueDataMap = MagicMarker.GetStringDictionaryFactory(valueType).Invoke(value);
                }
                else
                {
                    throw new ArgumentException("unable to convert input to string dictionary");
                }
            }

            return(valueDataMap);
        }
Ejemplo n.º 17
0
        public static string Render <K, V>(this IEnumerable <KeyValuePair <K, V> > source)
        {
            var fieldDelimiter = string.Empty;

            var builder = new StringBuilder();

            builder.Append('[');

            if (source != null)
            {
                foreach (var current in source)
                {
                    builder.Append(fieldDelimiter);
                    builder.Append(RenderAny(current.Key));
                    builder.Append('=');
                    if (ReferenceEquals(current.Value, null))
                    {
                        builder.Append("null");
                    }
                    else if (current.Value.GetType().IsGenericDictionary())
                    {
                        builder.Append(MagicMarker.GetDictionaryFactory(current.Value.GetType()).Invoke(current.Value));
                    }
                    else if (current.Value is string)
                    {
                        builder.Append(RenderAny(current.Value));
                    }
                    else if (current.Value is IEnumerable)
                    {
                        builder.Append(Render((IEnumerable)current.Value));
                    }
                    else
                    {
                        builder.Append(RenderAny(current.Value));
                    }

                    fieldDelimiter = ", ";
                }
            }

            builder.Append(']');
            return(builder.ToString());
        }
Ejemplo n.º 18
0
        public static IDictionary <object, object> UnwrapDictionary(this object value)
        {
            if (value == null)
            {
                return(null);
            }

            if (value is IDictionary <object, object> )
            {
                return((IDictionary <object, object>)value);
            }

            var valueType = value.GetType();

            if (valueType.IsGenericDictionary())
            {
                return(MagicMarker.GetDictionaryFactory(valueType).Invoke(value));
            }

            if (value is IEnumerable <KeyValuePair <object, object> > )
            {
                var valueDataMap = new Dictionary <object, object>();
                foreach (var valueKeyValuePair in (IEnumerable <KeyValuePair <string, object> >)value)
                {
                    valueDataMap[valueKeyValuePair.Key] = valueKeyValuePair.Value;
                }

                return(valueDataMap);
            }

            if (value is KeyValuePair <object, object> )
            {
                var valueDataMap      = new Dictionary <object, object>();
                var valueKeyValuePair = (KeyValuePair <object, object>)value;
                valueDataMap[valueKeyValuePair.Key] = valueKeyValuePair.Value;
                return(valueDataMap);
            }

            throw new ArgumentException("unable to convert input to string dictionary");
        }
Ejemplo n.º 19
0
        private static bool AreCollectionsEqual(Object expected, Object actual)
        {
            var magicExpected = MagicMarker.GetCollectionFactory(expected.GetType())
                                .Invoke(expected);
            var magicActual = MagicMarker.GetCollectionFactory(actual.GetType())
                              .Invoke(actual);

            if (magicExpected.Count == magicActual.Count)
            {
                using (var magicExpectedEnum = magicExpected.GetEnumerator())
                {
                    using (var magicActualEnum = magicActual.GetEnumerator())
                    {
                        while (true)
                        {
                            var mvExpected = magicExpectedEnum.MoveNext();
                            var mvActual   = magicActualEnum.MoveNext();
                            if (mvExpected && mvActual)
                            {
                                if (!Equals(magicExpectedEnum.Current, magicActualEnum.Current))
                                {
                                    break;
                                }
                            }
                            else if (!mvExpected && !mvActual)
                            {
                                return(true);
                            }
                            else
                            {
                                throw new IllegalStateException("collection has been modified");
                            }
                        }
                    }
                }
            }

            return(false);
        }
        public ICollection <object> Convert(Object result)
        {
            if (result == null)
            {
                return(null);
            }

            if (result is ICollection <object> )
            {
                return((ICollection <object>)result);
            }
            if (result.GetType().IsGenericCollection())
            {
                return(MagicMarker.GetCollectionFactory(result.GetType()).Invoke(result));
            }
            if (result is ICollection)
            {
                return(((ICollection)result).Cast <object>().ToList());
            }

            Log.Warn("Expected collection-type input from method '{0}' but received {1}", _methodName,
                     result.GetType().FullName);
            return(null);
        }
Ejemplo n.º 21
0
        public override ExprNode Validate(ExprValidationContext validationContext)
        {
            // Must have 2 child nodes
            var childNodes = ChildNodes;

            if (childNodes.Count < 1)
            {
                throw new IllegalStateException("Group relational op node must have 1 or more parameters");
            }

            _evaluators = ExprNodeUtility.GetEvaluators(childNodes);

            var typeOne = _evaluators[0].ReturnType.GetBoxedType();

            // collections, array or map not supported
            if ((typeOne.IsArray) ||
                (typeOne.IsGenericCollection()) ||
                (typeOne.IsGenericDictionary()))
            {
                throw new ExprValidationException(
                          "Collection or array comparison is not allowed for the IN, ANY, SOME or ALL keywords");
            }

            _transformList = new Func <object, object> [childNodes.Count];

            var comparedTypes = new List <Type>();

            comparedTypes.Add(typeOne);
            _hasCollectionOrArray = false;
            for (int i = 1; i < childNodes.Count; i++)
            {
                var propType = _evaluators[i].ReturnType;
                if (propType.IsArray)
                {
                    _hasCollectionOrArray = true;
                    if (propType.GetElementType() != typeof(Object))
                    {
                        comparedTypes.Add(propType.GetElementType());
                    }
                }
                else if (propType.IsGenericDictionary())
                {
                    var baseTransform = MagicMarker.GetDictionaryFactory(propType);
                    _transformList[i]     = o => baseTransform(o);
                    _hasCollectionOrArray = true;
                }
                else if (propType.IsGenericCollection())
                {
                    var baseTransform = MagicMarker.GetCollectionFactory(propType);
                    _transformList[i]     = o => baseTransform(o);
                    _hasCollectionOrArray = true;
                }
                else
                {
                    comparedTypes.Add(propType);
                }
            }

            // Determine common denominator type
            Type coercionType;

            try
            {
                coercionType = TypeHelper.GetCommonCoercionType(comparedTypes.ToArray());
            }
            catch (CoercionException ex)
            {
                throw new ExprValidationException("Implicit conversion not allowed: " + ex.Message);
            }

            // Must be either numeric or string
            if (coercionType != typeof(String))
            {
                if (!coercionType.IsNumeric())
                {
                    throw new ExprValidationException(string.Format("Implicit conversion from datatype '{0}' to numeric is not allowed", Name.Clean(coercionType)));
                }
            }

            _computer = _relationalOp.GetComputer(coercionType, coercionType, coercionType);

            return(null);
        }
Ejemplo n.º 22
0
        public void ValidateWithoutContext()
        {
            if (ChildNodes.Length < 2)
            {
                throw new ExprValidationException("The IN operator requires at least 2 child expressions");
            }
            _evaluators = ExprNodeUtility.GetEvaluators(ChildNodes);

            // Must be the same boxed type returned by expressions under this
            var typeOne = _evaluators[0].ReturnType.GetBoxedType();

            // collections, array or map not supported
            if ((typeOne.IsArray) ||
                (typeOne.IsGenericCollection()) ||
                (typeOne.IsGenericDictionary()))
            {
                throw new ExprValidationException("Collection or array comparison is not allowed for the IN, ANY, SOME or ALL keywords");
            }

            _transformList = new Func <object, object> [_evaluators.Length];

            var comparedTypes = new List <Type> {
                typeOne
            };

            _hasCollectionOrArray = false;

            var length = ChildNodes.Length - 1;

            for (int i = 1; i <= length; i++)
            {
                var propType = _evaluators[i].ReturnType;
                if (propType == null)
                {
                    continue;
                }
                if (propType.IsArray)
                {
                    _hasCollectionOrArray = true;
                    if (propType.GetElementType() != typeof(Object))
                    {
                        comparedTypes.Add(propType.GetElementType());
                    }
                }
                else if (propType.IsGenericDictionary())
                {
                    var baseTransform = MagicMarker.GetDictionaryFactory(propType);
                    _transformList[i]     = o => baseTransform(o);
                    _hasCollectionOrArray = true;
                }
                else if (propType.IsGenericCollection())
                {
                    var baseTransform = MagicMarker.GetCollectionFactory(propType);
                    _transformList[i]     = o => baseTransform(o);
                    _hasCollectionOrArray = true;
                }
                else
                {
                    comparedTypes.Add(propType);
                }
            }

            // Determine common denominator type
            Type coercionType;

            try {
                coercionType = TypeHelper.GetCommonCoercionType(comparedTypes);
            }
            catch (CoercionException ex)
            {
                throw new ExprValidationException("Implicit conversion not allowed: " + ex.Message);
            }

            // Check if we need to coerce
            _mustCoerce = false;
            if (coercionType.IsNumeric())
            {
                foreach (Type compareType in comparedTypes)
                {
                    if (coercionType != compareType.GetBoxedType())
                    {
                        _mustCoerce = true;
                    }
                }
                if (_mustCoerce)
                {
                    _coercer = CoercerFactory.GetCoercer(null, coercionType.GetBoxedType());
                }
            }
        }
Ejemplo n.º 23
0
        public override ExprNode Validate(ExprValidationContext validationContext)
        {
            // Must have 2 child nodes
            var childNodes = ChildNodes;

            if (childNodes.Length < 1)
            {
                throw new IllegalStateException("Equals group node does not have 1 or more parameters");
            }

            _evaluators = ExprNodeUtility.GetEvaluators(ChildNodes);

            // Must be the same boxed type returned by expressions under this
            Type typeOne = _evaluators[0].ReturnType.GetBoxedType();

            // collections, array or map not supported
            if ((typeOne.IsArray) ||
                (typeOne.IsGenericCollection()) ||
                (typeOne.IsGenericDictionary()))
            {
                throw new ExprValidationException(
                          "Collection or array comparison is not allowed for the IN, ANY, SOME or ALL keywords");
            }

            _transformList = new Func <object, object> [childNodes.Length];

            var comparedTypes = new List <Type>();

            comparedTypes.Add(typeOne);
            _hasCollectionOrArray = false;
            for (int i = 1; i < childNodes.Length; i++)
            {
                Type propType = _evaluators[i].ReturnType;
                if (propType.IsArray)
                {
                    _hasCollectionOrArray = true;
                    if (propType.GetElementType() != typeof(Object))
                    {
                        comparedTypes.Add(propType.GetElementType());
                    }
                }
                else if (propType.IsGenericDictionary())
                {
                    var baseTransform = MagicMarker.GetDictionaryFactory(propType);
                    _transformList[i]     = o => baseTransform(o);
                    _hasCollectionOrArray = true;
                }
                else if (propType.IsGenericCollection())
                {
                    var baseTransform = MagicMarker.GetCollectionFactory(propType);
                    _transformList[i]     = o => baseTransform(o);
                    _hasCollectionOrArray = true;
                }
                else
                {
                    comparedTypes.Add(propType);
                }
            }

            // Determine common denominator type
            Type coercionType;

            try
            {
                coercionType = TypeHelper.GetCommonCoercionType(comparedTypes);
            }
            catch (CoercionException ex)
            {
                throw new ExprValidationException("Implicit conversion not allowed: " + ex.Message);
            }

            // Check if we need to coerce
            _mustCoerce = false;
            if (coercionType.IsNumeric())
            {
                foreach (Type compareType in comparedTypes)
                {
                    if (coercionType != compareType.GetBoxedType())
                    {
                        _mustCoerce = true;
                    }
                }
                if (_mustCoerce)
                {
                    _coercer = CoercerFactory.GetCoercer(null, coercionType.GetBoxedType());
                }
            }

            return(null);
        }
Ejemplo n.º 24
0
        private static void RecursiveRender(EventBean theEvent, StringBuilder buf, int level, RendererMeta meta, RendererMetaOptions rendererOptions)
        {
            var delimiter = "";

            var renderActions = new SortedList <string, Action>();

            // simple properties
            var simpleProps = meta.SimpleProperties;

            if (rendererOptions.Renderer == null)
            {
                foreach (var simpleProp in simpleProps.OrderBy(prop => prop.Name))
                {
                    var name  = simpleProp.Name;
                    var value = simpleProp.Getter.Get(theEvent);
                    renderActions.Add(name, () =>
                    {
                        WriteDelimitedIndentedProp(buf, delimiter, level, name);
                        simpleProp.Output.Render(value, buf);
                        delimiter = COMMA_DELIMITER_NEWLINE;
                    });
                }
            }
            else
            {
                var context = rendererOptions.RendererContext;
                context.SetStringBuilderAndReset(buf);
                foreach (var simpleProp in simpleProps.OrderBy(prop => prop.Name))
                {
                    var name  = simpleProp.Name;
                    var value = simpleProp.Getter.Get(theEvent);
                    renderActions.Add(name, () =>
                    {
                        WriteDelimitedIndentedProp(buf, delimiter, level, simpleProp.Name);
                        context.DefaultRenderer = simpleProp.Output;
                        context.PropertyName    = simpleProp.Name;
                        context.PropertyValue   = value;
                        rendererOptions.Renderer.Render(context);
                        delimiter = COMMA_DELIMITER_NEWLINE;
                    });
                }
            }

            var indexProps = meta.IndexProperties;

            foreach (var indexProp in indexProps.OrderBy(prop => prop.Name))
            {
                var name = indexProp.Name;

                renderActions.Add(
                    name, () =>
                {
                    WriteDelimitedIndentedProp(buf, delimiter, level, name);

                    var value = indexProp.Getter.Get(theEvent);
                    if (value == null)
                    {
                        buf.Append("null");
                    }
                    else if (value is string)
                    {
                        if (rendererOptions.Renderer == null)
                        {
                            indexProp.Output.Render(value, buf);
                        }
                        else
                        {
                            var context = rendererOptions.RendererContext;
                            context.SetStringBuilderAndReset(buf);
                            context.DefaultRenderer = indexProp.Output;
                            context.PropertyName    = name;
                            context.PropertyValue   = value;
                            rendererOptions.Renderer.Render(context);
                        }
                    }
                    else
                    {
                        var asArray = value as Array;
                        if (asArray == null)
                        {
                            buf.Append("[]");
                        }
                        else
                        {
                            buf.Append('[');

                            var arrayDelimiter = "";

                            if (rendererOptions.Renderer == null)
                            {
                                for (var i = 0; i < asArray.Length; i++)
                                {
                                    var arrayItem = asArray.GetValue(i);
                                    buf.Append(arrayDelimiter);
                                    indexProp.Output.Render(arrayItem, buf);
                                    arrayDelimiter = ", ";
                                }
                            }
                            else
                            {
                                var context = rendererOptions.RendererContext;
                                context.SetStringBuilderAndReset(buf);
                                for (var i = 0; i < asArray.Length; i++)
                                {
                                    var arrayItem = asArray.GetValue(i);
                                    buf.Append(arrayDelimiter);
                                    context.PropertyName         = indexProp.Name;
                                    context.PropertyValue        = arrayItem;
                                    context.IndexedPropertyIndex = i;
                                    context.DefaultRenderer      = indexProp.Output;
                                    rendererOptions.Renderer.Render(context);
                                    arrayDelimiter = ", ";
                                }
                            }

                            buf.Append(']');
                        }
                    }

                    delimiter = COMMA_DELIMITER_NEWLINE;
                });
            }

            var mappedProps = meta.MappedProperties;

            foreach (var mappedProp in mappedProps.OrderBy(prop => prop.Name))
            {
                var name  = mappedProp.Name;
                var value = mappedProp.Getter.Get(theEvent);

                if ((value != null) && (!(value.GetType().IsGenericStringDictionary())))
                {
                    Log.Warn("Property '" + mappedProp.Name + "' expected to return Map and returned " + value.GetType() + " instead");
                    continue;
                }

                renderActions.Add(
                    name, () =>
                {
                    WriteDelimitedIndentedProp(buf, delimiter, level, mappedProp.Name);

                    if (value == null)
                    {
                        buf.Append("null");
                        buf.Append(NEWLINE);
                    }
                    else
                    {
                        var map = MagicMarker.GetStringDictionary(value);
                        if (map.IsEmpty())
                        {
                            buf.Append("{}");
                            buf.Append(NEWLINE);
                        }
                        else
                        {
                            buf.Append('{');
                            buf.Append(NEWLINE);

                            var localDelimiter = "";
                            foreach (var entry in map)
                            {
                                if (entry.Key == null)
                                {
                                    continue;
                                }

                                buf.Append(localDelimiter);
                                Ident(buf, level + 1);
                                buf.Append('\"');
                                buf.Append(entry.Key);
                                buf.Append("\": ");

                                if (entry.Value == null)
                                {
                                    buf.Append("null");
                                }
                                else
                                {
                                    var outRenderer =
                                        OutputValueRendererFactory.GetOutputValueRenderer(
                                            entry.Value.GetType(), rendererOptions);
                                    if (rendererOptions.Renderer == null)
                                    {
                                        outRenderer.Render(entry.Value, buf);
                                    }
                                    else
                                    {
                                        var context = rendererOptions.RendererContext;
                                        context.SetStringBuilderAndReset(buf);
                                        context.PropertyName      = mappedProp.Name;
                                        context.PropertyValue     = entry.Value;
                                        context.MappedPropertyKey = entry.Key;
                                        context.DefaultRenderer   = outRenderer;
                                        rendererOptions.Renderer.Render(context);
                                    }
                                }

                                localDelimiter = COMMA_DELIMITER_NEWLINE;
                            }

                            buf.Append(NEWLINE);
                            Ident(buf, level);
                            buf.Append('}');
                        }
                    }

                    delimiter = COMMA_DELIMITER_NEWLINE;
                });
            }

            var nestedProps = meta.NestedProperties;

            foreach (var nestedProp in nestedProps.OrderBy(prop => prop.Name))
            {
                var name  = nestedProp.Name;
                var value = nestedProp.Getter.GetFragment(theEvent);

                renderActions.Add(
                    name, () =>
                {
                    WriteDelimitedIndentedProp(buf, delimiter, level, nestedProp.Name);

                    if (value == null)
                    {
                        buf.Append("null");
                    }
                    else if (!nestedProp.IsArray)
                    {
                        if (!(value is EventBean))
                        {
                            Log.Warn(
                                "Property '" + nestedProp.Name + "' expected to return EventBean and returned " +
                                value.GetType() + " instead");
                            buf.Append("null");
                            return;
                        }

                        var nestedEventBean = (EventBean)value;
                        buf.Append('{');
                        buf.Append(NEWLINE);

                        RecursiveRender(nestedEventBean, buf, level + 1, nestedProp.Metadata, rendererOptions);

                        Ident(buf, level);
                        buf.Append('}');
                    }
                    else
                    {
                        if (!(value is EventBean[]))
                        {
                            Log.Warn(
                                "Property '" + nestedProp.Name + "' expected to return EventBean[] and returned " +
                                value.GetType() + " instead");
                            buf.Append("null");
                            return;
                        }

                        var arrayDelimiterBuf = new StringBuilder();
                        arrayDelimiterBuf.Append(',');
                        arrayDelimiterBuf.Append(NEWLINE);
                        Ident(arrayDelimiterBuf, level + 1);

                        var nestedEventArray = (EventBean[])value;
                        var arrayDelimiter   = "";
                        buf.Append('[');

                        for (var i = 0; i < nestedEventArray.Length; i++)
                        {
                            var arrayItem = nestedEventArray[i];
                            buf.Append(arrayDelimiter);
                            arrayDelimiter = arrayDelimiterBuf.ToString();

                            buf.Append('{');
                            buf.Append(NEWLINE);

                            RecursiveRender(arrayItem, buf, level + 2, nestedProp.Metadata, rendererOptions);

                            Ident(buf, level + 1);
                            buf.Append('}');
                        }

                        buf.Append(']');
                    }

                    delimiter = COMMA_DELIMITER_NEWLINE;
                });
            }

            foreach (var entry in renderActions)
            {
                entry.Value.Invoke();
            }

            buf.Append(NEWLINE);
        }