Ejemplo n.º 1
0
        public void Init(
            ConfigurationCommonEventTypeMeta.AvroSettingsConfig avroSettings,
            ImportService importService)
        {
            _avroSettings = avroSettings;

            if (avroSettings.TypeRepresentationMapperClass != null) {
                _optionalTypeMapper = TypeHelper.Instantiate<TypeRepresentationMapper>(
                    avroSettings.TypeRepresentationMapperClass,
                    importService.ClassForNameProvider);
            }

            if (avroSettings.ObjectValueTypeWidenerFactoryClass != null) {
                _optionalWidenerFactory = TypeHelper.Instantiate<ObjectValueTypeWidenerFactory>(
                    avroSettings.ObjectValueTypeWidenerFactoryClass,
                    importService.ClassForNameProvider);
            }
        }
Ejemplo n.º 2
0
        public void Init(ConfigurationEngineDefaults.AvroSettings avroSettings, EngineImportService engineImportService)
        {
            _avroSettings = avroSettings;

            if (avroSettings.TypeRepresentationMapperClass != null)
            {
                _optionalTypeMapper = TypeHelper.Instantiate <TypeRepresentationMapper>(
                    avroSettings.TypeRepresentationMapperClass,
                    engineImportService.GetClassForNameProvider());
            }

            if (avroSettings.ObjectValueTypeWidenerFactoryClass != null)
            {
                _optionalWidenerFactory = TypeHelper.Instantiate <ObjectValueTypeWidenerFactory>(
                    avroSettings.ObjectValueTypeWidenerFactoryClass,
                    engineImportService.GetClassForNameProvider());
            }
        }
Ejemplo n.º 3
0
        private static Schema AssembleNestedSchema(
            MapEventType mapEventType,
            ConfigurationEngineDefaults.AvroSettings avroSettings,
            Attribute[] annotations,
            EventAdapterService eventAdapterService,
            string statementName,
            string engineURI,
            TypeRepresentationMapper optionalMapper)
        {
            var fields = new JArray();

            foreach (var prop in mapEventType.Types)
            {
                AssembleField(
                    prop.Key, prop.Value, fields, annotations, avroSettings, eventAdapterService, statementName,
                    engineURI, optionalMapper);
            }

            return SchemaBuilder.Record(mapEventType.Name, fields);
        }
Ejemplo n.º 4
0
        private static Schema AssembleNestedSchema(
            MapEventType mapEventType,
            ConfigurationCommonEventTypeMeta.AvroSettingsConfig avroSettings,
            Attribute[] annotations,
            EventTypeNameResolver eventTypeNameResolver,
            string statementName,
            TypeRepresentationMapper optionalMapper)
        {
            var fields = new JArray();

            foreach (var prop in mapEventType.Types) {
                AssembleField(
                    prop.Key,
                    prop.Value,
                    fields,
                    annotations,
                    avroSettings,
                    eventTypeNameResolver,
                    statementName,
                    optionalMapper);
            }

            return SchemaBuilder.Record(mapEventType.Name, fields);
        }
Ejemplo n.º 5
0
        internal static void AssembleField(
            string propertyName,
            Object propertyType,
            JArray assembler,
            Attribute[] annotations,
            ConfigurationEngineDefaults.AvroSettings avroSettings,
            EventAdapterService eventAdapterService,
            string statementName,
            string engineURI,
            TypeRepresentationMapper optionalMapper)
        {
            if (propertyName.Contains("."))
            {
                throw new EPException(
                    "Invalid property name as Avro does not allow dot '.' in field names (property '" + propertyName +
                    "')");
            }

            Schema schema = GetAnnotationSchema(propertyName, annotations);
            if (schema != null)
            {
                assembler.Add(TypeBuilder.Field(propertyName, schema));
                // assembler.Name(propertyName).Type(schema).NoDefault();
                return;
            }

            if (optionalMapper != null && propertyType is Type)
            {
                var result = (Schema) optionalMapper.Map(
                    new TypeRepresentationMapperContext(
                        (Type) propertyType, propertyName, statementName, engineURI));
                if (result != null)
                {
                    assembler.Add(TypeBuilder.Field(propertyName, result));
                    // assembler.Name(propertyName).Type(result).NoDefault();
                    return;
                }
            }

            if (propertyType == null)
            {
                assembler.Add(TypeBuilder.Field(propertyName, TypeBuilder.Null()));
                // assembler.Name(propertyName).Type("null");
            }
            else if (propertyType is string)
            {
                string propertyTypeName = propertyType.ToString();
                bool isArray = EventTypeUtility.IsPropertyArray(propertyTypeName);
                if (isArray)
                {
                    propertyTypeName = EventTypeUtility.GetPropertyRemoveArray(propertyTypeName);
                }

                // Add EventType itself as a property
                EventType eventType = eventAdapterService.GetEventTypeByName(propertyTypeName);
                if (!(eventType is AvroEventType))
                {
                    throw new EPException(
                        "Type definition encountered an unexpected property type name '"
                        + propertyType + "' for property '" + propertyName +
                        "', expected the name of a previously-declared Avro type");
                }
                schema = ((AvroEventType) eventType).SchemaAvro;

                if (!isArray)
                {
                    assembler.Add(TypeBuilder.Field(propertyName, schema));
                }
                else
                {
                    assembler.Add(TypeBuilder.Field(propertyName, TypeBuilder.Array(schema)));
                }
            }
            else if (propertyType is EventType)
            {
                var eventType = (EventType) propertyType;
                CheckCompatibleType(eventType);
                if (eventType is AvroEventType)
                {
                    schema = ((AvroEventType) eventType).SchemaAvro;
                    assembler.Add(TypeBuilder.Field(propertyName, schema));
                }
                else if (eventType is MapEventType)
                {
                    var mapEventType = (MapEventType) eventType;
                    var nestedSchema = AssembleNestedSchema(
                        mapEventType, avroSettings, annotations, eventAdapterService, statementName, engineURI,
                        optionalMapper);
                    assembler.Add(TypeBuilder.Field(propertyName, nestedSchema));
                }
                else
                {
                    throw new IllegalStateException("Unrecognized event type " + eventType);
                }
            }
            else if (propertyType is EventType[])
            {
                EventType eventType = ((EventType[]) propertyType)[0];
                CheckCompatibleType(eventType);
                if (eventType is AvroEventType)
                {
                    schema = ((AvroEventType) eventType).SchemaAvro;
                    assembler.Add(TypeBuilder.Field(propertyName, TypeBuilder.Array(schema)));
                }
                else if (eventType is MapEventType)
                {
                    var mapEventType = (MapEventType) eventType;
                    var nestedSchema = AssembleNestedSchema(
                        mapEventType, avroSettings, annotations, eventAdapterService, statementName, engineURI,
                        optionalMapper);

                    assembler.Add(TypeBuilder.Field(propertyName, TypeBuilder.Array(nestedSchema)));
                }
                else
                {
                    throw new IllegalStateException("Unrecognized event type " + eventType);
                }
            }
            else if (propertyType is Type)
            {
                var propertyClass = (Type) propertyType;
                var propertyClassBoxed = propertyClass.GetBoxedType();
                bool nullable = propertyClass == propertyClassBoxed;
                bool preferNonNull = avroSettings.IsEnableSchemaDefaultNonNull;
                if (propertyClassBoxed == typeof (bool?))
                {
                    AssemblePrimitive(nullable, REQ_BOOLEAN, OPT_BOOLEAN, assembler, propertyName, preferNonNull);
                }
                else if (propertyClassBoxed == typeof (int?) || propertyClassBoxed == typeof (byte?))
                {
                    AssemblePrimitive(nullable, REQ_INT, OPT_INT, assembler, propertyName, preferNonNull);
                }
                else if (propertyClassBoxed == typeof (long?))
                {
                    AssemblePrimitive(nullable, REQ_LONG, OPT_LONG, assembler, propertyName, preferNonNull);
                }
                else if (propertyClassBoxed == typeof (float?))
                {
                    AssemblePrimitive(nullable, REQ_FLOAT, OPT_FLOAT, assembler, propertyName, preferNonNull);
                }
                else if (propertyClassBoxed == typeof (double?))
                {
                    AssemblePrimitive(nullable, REQ_DOUBLE, OPT_DOUBLE, assembler, propertyName, preferNonNull);
                }
                else if (propertyClass == typeof (string))
                {
                    if (avroSettings.IsEnableNativeString)
                    {
                        if (preferNonNull)
                        {
                            assembler.Add(
                                TypeBuilder.Field(propertyName, 
                                    TypeBuilder.Primitive("string",
                                        TypeBuilder.Property(AvroConstant.PROP_STRING_KEY, AvroConstant.PROP_STRING_VALUE))));
                        }
                        else
                        {
                            assembler.Add(
                                TypeBuilder.Field(
                                    propertyName,
                                    TypeBuilder.Union(
                                        TypeBuilder.Null(),
                                        TypeBuilder.String(
                                            TypeBuilder.Property(
                                                AvroConstant.PROP_STRING_KEY, AvroConstant.PROP_STRING_VALUE)))));
                        }
                    }
                    else
                    {
                        AssemblePrimitive(nullable, REQ_STRING, OPT_STRING, assembler, propertyName, preferNonNull);
                    }
                }
                else if (propertyClass == typeof (byte[]))
                {
                    if (preferNonNull)
                    {
                        assembler.Add(TypeBuilder.RequiredBytes(propertyName));
                    }
                    else
                    {
                        assembler.Add(TypeBuilder.Field(propertyName, TypeBuilder.Union(
                            TypeBuilder.Null(), TypeBuilder.Bytes())));
                    }
                }
                else if (propertyClass.IsArray)
                {
                    var componentType = propertyClass.GetElementType();
                    var  componentTypeBoxed = componentType.GetBoxedType();
                    var nullableElements = componentType == componentTypeBoxed;

                    if (componentTypeBoxed == typeof (bool?))
                    {
                        AssembleArray(
                            nullableElements, ARRAY_OF_REQ_BOOLEAN, ARRAY_OF_OPT_BOOLEAN, assembler, propertyName, preferNonNull);
                    }
                    else if (componentTypeBoxed == typeof (int?))
                    {
                        AssembleArray(
                            nullableElements, ARRAY_OF_REQ_INT, ARRAY_OF_OPT_INT, assembler, propertyName, preferNonNull);
                    }
                    else if (componentTypeBoxed == typeof (long?))
                    {
                        AssembleArray(
                            nullableElements, ARRAY_OF_REQ_LONG, ARRAY_OF_OPT_LONG, assembler, propertyName, preferNonNull);
                    }
                    else if (componentTypeBoxed == typeof (float?))
                    {
                        AssembleArray(
                            nullableElements, ARRAY_OF_REQ_FLOAT, ARRAY_OF_OPT_FLOAT, assembler, propertyName, preferNonNull);
                    }
                    else if (componentTypeBoxed == typeof(double?))
                    {
                        AssembleArray(
                            nullableElements, ARRAY_OF_REQ_DOUBLE, ARRAY_OF_OPT_DOUBLE, assembler, propertyName, preferNonNull);
                    }
                    else if (componentTypeBoxed == typeof (byte?))
                    {
                        AssembleArray(
                            nullableElements, ARRAY_OF_REQ_INT, ARRAY_OF_OPT_INT, assembler, propertyName, preferNonNull);
                    }
                    else if (propertyClass == typeof (string[]))
                    {
                        JObject array;
                        if (avroSettings.IsEnableNativeString)
                        {
                            array = TypeBuilder.Array(TypeBuilder.String(TypeBuilder.Property(
                                AvroConstant.PROP_STRING_KEY, AvroConstant.PROP_STRING_VALUE)));
                        }
                        else
                        {
                            array = TypeBuilder.Array(TypeBuilder.String());
                        }

                        if (preferNonNull)
                        {
                            assembler.Add(TypeBuilder.Field(propertyName, array));
                        }
                        else
                        {
                            assembler.Add(TypeBuilder.Field(propertyName, TypeBuilder.Union(
                                TypeBuilder.Null(), array)));
                        }
                    }
                    else if (propertyClass.CanUnwrap<object>())
                    {

                    }
                    else
                    {
                        throw MakeEPException(propertyName, propertyType);
                    }
                }
                else if (propertyClass.IsGenericDictionary())
                {
                    JToken value;
                    if (avroSettings.IsEnableNativeString)
                    {
                        value = TypeBuilder.String(
                            TypeBuilder.Property(AvroConstant.PROP_STRING_KEY, AvroConstant.PROP_STRING_VALUE));
                    }
                    else
                    {
                        value = TypeBuilder.String();
                    }

                    if (preferNonNull)
                    {
                        assembler.Add(TypeBuilder.Field(propertyName, TypeBuilder.Map(value)));
                    }
                    else
                    {
                        assembler.Add(TypeBuilder.Field(propertyName, TypeBuilder.Union(
                            TypeBuilder.Null(), TypeBuilder.Map(value))));
                    }
                }
                else if (propertyClass.IsGenericCollection())
                {
                    AssembleFieldForCollection(propertyName, propertyType, assembler, avroSettings, propertyClass, preferNonNull);
                }
                else
                {
                    throw MakeEPException(propertyName, propertyType);
                }
            }
            else
            {
                throw MakeEPException(propertyName, propertyType);
            }
        }