public SelectEvalInsertCoercionJson(
     JsonEventType source,
     JsonEventType target)
 {
     this.source = source;
     this.target = target;
 }
 public SelectEvalJoinWildcardProcessorJson(
     string[] streamNames,
     JsonEventType resultEventType)
 {
     this.streamNames = streamNames;
     this.resultEventType = resultEventType;
 }
Exemple #3
0
 public SelectEvalNoWildcardJson(
     SelectExprForgeContext selectContext,
     JsonEventType jsonEventType)
 {
     this._selectContext = selectContext;
     this._jsonEventType = jsonEventType;
 }
 public EventBeanManufacturerJsonForge(
     JsonEventType jsonEventType,
     WriteablePropertyDescriptor[] writables)
 {
     _jsonEventType = jsonEventType;
     _writables     = writables;
 }
Exemple #5
0
 public EventBeanFactoryJson(
     JsonEventType type,
     EventBeanTypedEventFactory factory)
 {
     _type = type;
     _factory = factory;
 }
Exemple #6
0
 public JsonEventBeanCopyMethod(
     JsonEventType eventType,
     EventBeanTypedEventFactory eventBeanTypedEventFactory)
 {
     _eventType = eventType;
     _eventBeanTypedEventFactory = eventBeanTypedEventFactory;
 }
        public static JsonForgeDesc ForgeNonArray(
            string fieldName,
            JsonEventType other)
        {
            JsonDeserializerForge deserializerForge = new JsonDeserializerForgeByClassName(
                other.Detail.DeserializerClassName);

            JsonSerializerForge serializerForge;

            if (other.Detail.OptionalUnderlyingProvided == null)
            {
                serializerForge = new JsonSerializerForgeByMethod("WriteNested");
            }
            else
            {
                serializerForge = new ProxyJsonSerializerForge(
                    (
                        refs,
                        method,
                        classScope) =>
                    StaticMethod(
                        typeof(JsonSerializerUtil),
                        "WriteNested",
                        refs.Context,
                        refs.Field,
                        NewInstanceInner(other.Detail.SerializerClassName)
                        ));
                // NewInstanceInner(other.Detail.DeserializerFactoryClassName)));
            }

            return(new JsonForgeDesc(deserializerForge, serializerForge));
        }
Exemple #8
0
        /// <summary>
        /// Ctor.
        /// </summary>
        /// <param name="jsonEventType">target type</param>
        /// <param name="service">factory for events</param>
        /// <param name="properties">written properties</param>
        /// <param name="classpathImportService">for resolving write methods</param>
        /// <throws>EventBeanManufactureException if the write method lookup fail</throws>
        public EventBeanManufacturerJsonProvided(
            JsonEventType jsonEventType,
            EventBeanTypedEventFactory service,
            WriteablePropertyDescriptor[] properties,
            ImportService classpathImportService)
        {
            this._jsonEventType = jsonEventType;
            this._service       = service;

            _beanInstantiator = new BeanInstantiatorForgeByNewInstanceReflection(jsonEventType.UnderlyingType);

            _writeFieldsReflection = new FieldInfo[properties.Length];
            var primitiveTypeCheck = false;

            _primitiveType = new bool[properties.Length];
            for (var i = 0; i < properties.Length; i++)
            {
                var propertyName = properties[i].PropertyName;
                var field        = jsonEventType.Detail.FieldDescriptors.Get(propertyName);
                _writeFieldsReflection[i] = field.OptionalField;
                _primitiveType[i]         = properties[i].PropertyType.IsPrimitive;
                primitiveTypeCheck       |= _primitiveType[i];
            }

            _hasPrimitiveTypes = primitiveTypeCheck;
        }
Exemple #9
0
 /// <summary>
 ///     Ctor.
 /// </summary>
 /// <param name="jsonEventType">type to create</param>
 /// <param name="eventAdapterService">event factory</param>
 /// <param name="nativeKeys">native keys</param>
 public EventBeanManufacturerJson(
     JsonEventType jsonEventType,
     EventBeanTypedEventFactory eventAdapterService,
     string[] nativeKeys)
 {
     _eventAdapterService = eventAdapterService;
     _jsonEventType = jsonEventType;
     _nativeKeys = nativeKeys;
 }
Exemple #10
0
 internal JsonInsertProcessorStraightFieldAssign(
     int underlyingStreamNumber,
     JsonEventType sourceType,
     JsonEventType resultType)
 {
     this.underlyingStreamNumber = underlyingStreamNumber;
     this.sourceType             = sourceType;
     this.resultType             = resultType;
 }
Exemple #11
0
        private static IDictionary <string, JsonUnderlyingField> ComputeFields(
            IDictionary <string, object> compiledTyping,
            IDictionary <string, string> fieldNames,
            JsonEventType optionalSuperType,
            IDictionary <string, FieldInfo> fields)
        {
            IDictionary <string, JsonUnderlyingField> allFieldsInclSupertype = new LinkedHashMap <string, JsonUnderlyingField>();

            var index = 0;

            if (optionalSuperType != null)
            {
                allFieldsInclSupertype.PutAll(optionalSuperType.Detail.FieldDescriptors);
                index = allFieldsInclSupertype.Count;
            }

            foreach (var entry in compiledTyping)
            {
                var propertyName = entry.Key;
                var fieldName    = fieldNames.Get(entry.Key);

                var  type = entry.Value;
                Type assignedType;
                if (type == null)
                {
                    assignedType = typeof(object);
                }
                else if (type is Type)
                {
                    assignedType = (Type)type;
                }
                else if (type is TypeBeanOrUnderlying)
                {
                    var other = ((TypeBeanOrUnderlying)type).EventType;
                    ValidateJsonOrMapType(other);
                    assignedType = GetAssignedType(other);
                }
                else if (type is TypeBeanOrUnderlying[])
                {
                    var other = ((TypeBeanOrUnderlying[])type)[0].EventType;
                    ValidateJsonOrMapType(other);
                    assignedType = TypeHelper.GetArrayType(GetAssignedType(other));
                }
                else
                {
                    throw new IllegalStateException("Unrecognized type " + type);
                }

                allFieldsInclSupertype.Put(entry.Key, new JsonUnderlyingField(
                                               fieldName, propertyName, assignedType, fields.Get(fieldName)));
                index++;
            }

            return(allFieldsInclSupertype);
        }
Exemple #12
0
        internal static int[] FindPropertyIndexes(
            JsonEventType jsonEventType,
            WriteablePropertyDescriptor[] writables)
        {
            var nativeNums = new int[writables.Length];
            for (var i = 0; i < writables.Length; i++) {
                nativeNums[i] = FindPropertyIndex(jsonEventType, writables[i].PropertyName);
            }

            return nativeNums;
        }
Exemple #13
0
 internal JsonInsertProcessorExpressions(
     int underlyingStreamNumber,
     Item[] items,
     JsonEventType sourceType,
     JsonEventType resultType)
 {
     this.underlyingStreamNumber = underlyingStreamNumber;
     this.items      = items;
     this.sourceType = sourceType;
     this.resultType = resultType;
 }
Exemple #14
0
 /// <summary>
 ///     Ctor.
 /// </summary>
 /// <param name="runtimeEventSender">for processing events</param>
 /// <param name="eventType">the event type</param>
 /// <param name="threadingService">for inbound threading</param>
 /// <param name="eventBeanTypedEventFactory">for event bean creation</param>
 public EventSenderJsonImpl(
     EPRuntimeEventProcessWrapped runtimeEventSender,
     JsonEventType eventType,
     EventBeanTypedEventFactory eventBeanTypedEventFactory,
     ThreadingCommon threadingService)
 {
     _runtimeEventSender = runtimeEventSender;
     _eventType = eventType;
     _threadingService = threadingService;
     _eventBeanTypedEventFactory = eventBeanTypedEventFactory;
 }
Exemple #15
0
        private static bool DetermineDynamic(
            JsonSchemaAttribute jsonSchema,
            JsonEventType optionalSuperType,
            StatementRawInfo raw)
        {
            if (optionalSuperType != null && optionalSuperType.Detail.IsDynamic)
            {
                return(true);
            }

            return(jsonSchema != null && jsonSchema.Dynamic);
        }
 public StmtClassForgeableJsonDesc(
     IDictionary<string, object> propertiesThisType,
     IDictionary<string, JsonUnderlyingField> fieldDescriptorsInclSupertype,
     bool dynamic,
     int numFieldsSupertype,
     JsonEventType optionalSupertype,
     IDictionary<string, JsonForgeDesc> forges)
 {
     PropertiesThisType = propertiesThisType;
     FieldDescriptorsInclSupertype = fieldDescriptorsInclSupertype;
     IsDynamic = dynamic;
     NumFieldsSupertype = numFieldsSupertype;
     OptionalSupertype = optionalSupertype;
     Forges = forges;
 }
Exemple #17
0
        internal static int FindPropertyIndex(
            JsonEventType jsonEventType,
            string propertyName)
        {
            var types = jsonEventType.Types;
            var index = 0;
            foreach (var entry in types) {
                if (entry.Key.Equals(propertyName)) {
                    return index;
                }

                index++;
            }

            throw new IllegalStateException("Failed to find writable property '" + propertyName + "'");
        }
Exemple #18
0
        public static Type GetNestedUnderlyingType(
            JsonEventType eventType,
            string propertyName)
        {
            object    type = eventType.Types.Get(propertyName);
            EventType innerType;

            if (type is TypeBeanOrUnderlying)
            {
                innerType = ((TypeBeanOrUnderlying)type).EventType;
            }
            else
            {
                innerType = ((TypeBeanOrUnderlying[])type)[0].EventType;
            }

            return(innerType.UnderlyingType);
        }
 public void RegisterJson(
     EventTypeMetadata metadata,
     IDictionary<string, object> properties,
     string[] superTypes,
     string startTimestampPropertyName,
     string endTimestampPropertyName,
     JsonEventTypeDetail detail)
 {
     JsonEventType eventType = _eventTypeFactory.CreateJson(
         metadata,
         properties,
         superTypes,
         startTimestampPropertyName,
         endTimestampPropertyName,
         _beanEventTypeFactory,
         _eventTypeNameResolver,
         detail);
     eventType.Initialize(_classLoader);
     HandleRegister(eventType);
 }
Exemple #20
0
        public static JsonEventType MakeJsonTypeCompileTimeExistingType(
            EventTypeMetadata metadata,
            JsonEventType existingType,
            StatementCompileTimeServices services)
        {
            var getterFactoryJson = new EventTypeNestableGetterFactoryJson(existingType.Detail);

            return(new JsonEventType(
                       metadata,
                       existingType.Types,
                       null,
                       EmptySet <EventType> .Instance,
                       existingType.StartTimestampPropertyName,
                       existingType.EndTimestampPropertyName,
                       getterFactoryJson,
                       services.BeanEventTypeFactoryPrivate,
                       existingType.Detail,
                       existingType.UnderlyingType,
                       existingType.UnderlyingTypeIsTransient));
        }
Exemple #21
0
        /// <summary>
        /// Ctor.
        /// </summary>
        /// <param name="jsonEventType">target type</param>
        /// <param name="properties">written properties</param>
        /// <param name="importService">for resolving write methods</param>
        /// <throws>EventBeanManufactureException if the write method lookup fail</throws>
        public EventBeanManufacturerJsonProvidedForge(
            JsonEventType jsonEventType,
            WriteablePropertyDescriptor[] properties,
            ImportService importService)
        {
            _jsonEventType = jsonEventType;
            _properties    = properties;
            _importService = importService;

            _beanInstantiator = new BeanInstantiatorForgeByNewInstanceReflection(jsonEventType.UnderlyingType);

            _writeFieldReflection = new FieldInfo[properties.Length];

            _primitiveType = new bool[properties.Length];
            for (var i = 0; i < properties.Length; i++)
            {
                var propertyName = properties[i].PropertyName;
                var field        = jsonEventType.Detail.FieldDescriptors.Get(propertyName);
                _writeFieldReflection[i] = field.OptionalField;
                _primitiveType[i]        = properties[i].PropertyType.IsPrimitive;
            }
        }
        public static JsonForgeDesc ForgeArray(
            string fieldName,
            JsonEventType other)
        {
            var deserializerForge = new JsonDeserializerForgeArray(
                new JsonDeserializerForgeByClassName(other.Detail.DeserializerClassName),
                other.UnderlyingType);

            // JsonAllocatorForge startArray = new JsonAllocatorForgeWithAllocatorFactoryArray(
            //     other.Detail.DeserializerFactoryClassName,
            //     other.UnderlyingType);
            // JsonEndValueForge end = new JsonEndValueForgeCast(TypeHelper.GetArrayType(other.UnderlyingType));

            JsonSerializerForge serializerForge;

            if (other.Detail.OptionalUnderlyingProvided == null)
            {
                serializerForge = new JsonSerializerForgeByMethod("WriteNestedArray");
            }
            else
            {
                serializerForge = new ProxyJsonSerializerForge(
                    (
                        refs,
                        method,
                        classScope) =>
                    StaticMethod(
                        typeof(JsonSerializerUtil),
                        "WriteNestedArray",
                        refs.Context,
                        refs.Field,
                        NewInstanceInner(other.Detail.SerializerClassName)
                        ));
            }

            return(new JsonForgeDesc(deserializerForge, serializerForge));
        }
Exemple #23
0
        // The create window command:
        //      create window windowName[.window_view_list] as [select properties from] type
        //
        // This section expected s single FilterStreamSpecCompiled representing the selected type.
        // It creates a new event type representing the window type and a sets the type selected on the filter stream spec.
        protected internal static CreateWindowCompileResult HandleCreateWindow(
            StatementBaseInfo @base,
            StatementCompileTimeServices services)
        {
            var createWindowDesc = @base.StatementSpec.Raw.CreateWindowDesc;
            var columns = createWindowDesc.Columns;
            var typeName = createWindowDesc.WindowName;
            EventType targetType;

            // determine that the window name is not already in use as an event type name
            var existingType = services.EventTypeCompileTimeResolver.GetTypeByName(typeName);
            if (existingType != null && existingType.Metadata.TypeClass != EventTypeTypeClass.NAMED_WINDOW) {
                throw new ExprValidationException(
                    "Error starting statement: An event type or schema by name '" + typeName + "' already exists");
            }

            // Determine select-from
            var optionalSelectFrom = GetOptionalSelectFrom(createWindowDesc, services);

            // Create Map or Wrapper event type from the select clause of the window.
            // If no columns selected, simply create a wrapper type
            // Build a list of properties
            var newSelectClauseSpecRaw = new SelectClauseSpecRaw();
            LinkedHashMap<string, object> properties;
            var hasProperties = false;
            if (columns != null && !columns.IsEmpty()) {
                properties = EventTypeUtility.BuildType(
                    columns,
                    null,
                    services.ImportServiceCompileTime,
                    services.EventTypeCompileTimeResolver);
                hasProperties = true;
            }
            else {
                if (optionalSelectFrom == null) {
                    throw new IllegalStateException("Missing from-type information for create-window");
                }

                // Validate the select expressions which consists of properties only
                var select = CompileLimitedSelect(optionalSelectFrom, @base, services);

                properties = new LinkedHashMap<string, object>();
                foreach (var selectElement in select) {
                    if (selectElement.FragmentType != null) {
                        properties.Put(selectElement.AssignedName, selectElement.FragmentType);
                    }
                    else {
                        properties.Put(selectElement.AssignedName, selectElement.SelectExpressionType);
                    }

                    // Add any properties to the new select clause for use by consumers to the statement itself
                    newSelectClauseSpecRaw.Add(
                        new SelectClauseExprRawSpec(new ExprIdentNodeImpl(selectElement.AssignedName), null, false));
                    hasProperties = true;
                }
            }

            // Create Map or Wrapper event type from the select clause of the window.
            // If no columns selected, simply create a wrapper type
            var isOnlyWildcard = @base.StatementSpec.Raw.SelectClauseSpec.IsOnlyWildcard;
            var isWildcard = @base.StatementSpec.Raw.SelectClauseSpec.IsUsingWildcard;
            var namedWindowVisibility = services.ModuleVisibilityRules.GetAccessModifierNamedWindow(@base, typeName);
            var additionalForgeables = new List<StmtClassForgeableFactory>();
            
            try {
                if (isWildcard && !isOnlyWildcard) {
                    var metadata = new EventTypeMetadata(
                        typeName,
                        @base.ModuleName,
                        EventTypeTypeClass.NAMED_WINDOW,
                        EventTypeApplicationType.WRAPPER,
                        namedWindowVisibility,
                        EventTypeBusModifier.NONBUS,
                        false,
                        EventTypeIdPair.Unassigned());
                    targetType = WrapperEventTypeUtil.MakeWrapper(
                        metadata,
                        optionalSelectFrom.EventType,
                        properties,
                        null,
                        services.BeanEventTypeFactoryPrivate,
                        services.EventTypeCompileTimeResolver);
                }
                else {
                    // Some columns selected, use the types of the columns
                    Func<EventTypeApplicationType, EventTypeMetadata> metadata = type => new EventTypeMetadata(
                        typeName,
                        @base.ModuleName,
                        EventTypeTypeClass.NAMED_WINDOW,
                        type,
                        namedWindowVisibility,
                        EventTypeBusModifier.NONBUS,
                        false,
                        EventTypeIdPair.Unassigned());

                    if (hasProperties && !isOnlyWildcard) {
                        var compiledProperties = EventTypeUtility.CompileMapTypeProperties(
                            properties,
                            services.EventTypeCompileTimeResolver);
                        var representation = EventRepresentationUtil.GetRepresentation(
                            @base.StatementSpec.Annotations,
                            services.Configuration,
                            AssignedType.NONE);

                        if (representation == EventUnderlyingType.MAP) {
                            targetType = BaseNestableEventUtil.MakeMapTypeCompileTime(
                                metadata.Invoke(EventTypeApplicationType.MAP),
                                compiledProperties,
                                null,
                                null,
                                null,
                                null,
                                services.BeanEventTypeFactoryPrivate,
                                services.EventTypeCompileTimeResolver);
                        }
                        else if (representation == EventUnderlyingType.OBJECTARRAY) {
                            targetType = BaseNestableEventUtil.MakeOATypeCompileTime(
                                metadata.Invoke(EventTypeApplicationType.OBJECTARR),
                                compiledProperties,
                                null,
                                null,
                                null,
                                null,
                                services.BeanEventTypeFactoryPrivate,
                                services.EventTypeCompileTimeResolver);
                        }
                        else if (representation == EventUnderlyingType.AVRO) {
                            targetType = services.EventTypeAvroHandler.NewEventTypeFromNormalized(
                                metadata.Invoke(EventTypeApplicationType.AVRO),
                                services.EventTypeCompileTimeResolver,
                                services.BeanEventTypeFactoryPrivate.EventBeanTypedEventFactory,
                                compiledProperties,
                                @base.StatementRawInfo.Annotations,
                                null,
                                null,
                                null,
                                @base.StatementName);
                        } else if (representation == EventUnderlyingType.JSON) {
                            EventTypeForgeablesPair pair = JsonEventTypeUtility.MakeJsonTypeCompileTimeNewType(
                                metadata.Invoke(EventTypeApplicationType.JSON),
                                compiledProperties,
                                null,
                                null,
                                @base.StatementRawInfo,
                                services);
                            targetType = pair.EventType;
                            additionalForgeables.AddRange(pair.AdditionalForgeables);
                        }
                        else {
                            throw new IllegalStateException("Unrecognized representation " + representation);
                        }
                    }
                    else {
                        if (optionalSelectFrom == null) {
                            throw new IllegalStateException("Missing from-type information for create-window");
                        }

                        var selectFromType = optionalSelectFrom.EventType;

                        // No columns selected, no wildcard, use the type as is or as a wrapped type
                        if (selectFromType is ObjectArrayEventType) {
                            var oaType = (ObjectArrayEventType) selectFromType;
                            targetType = BaseNestableEventUtil.MakeOATypeCompileTime(
                                metadata.Invoke(EventTypeApplicationType.OBJECTARR),
                                oaType.Types,
                                null,
                                null,
                                oaType.StartTimestampPropertyName,
                                oaType.EndTimestampPropertyName,
                                services.BeanEventTypeFactoryPrivate,
                                services.EventTypeCompileTimeResolver);
                        }
                        else if (selectFromType is AvroSchemaEventType) {
                            var avroSchemaEventType = (AvroSchemaEventType) selectFromType;
                            var avro = new ConfigurationCommonEventTypeAvro();
                            avro.AvroSchema = avroSchemaEventType.Schema;
                            targetType = services.EventTypeAvroHandler.NewEventTypeFromSchema(
                                metadata.Invoke(EventTypeApplicationType.AVRO),
                                services.BeanEventTypeFactoryPrivate.EventBeanTypedEventFactory,
                                avro,
                                null,
                                null);
                        } else if (selectFromType is JsonEventType) {
                            JsonEventType jsonType = (JsonEventType) selectFromType;
                            targetType = JsonEventTypeUtility.MakeJsonTypeCompileTimeExistingType(
                                metadata.Invoke(EventTypeApplicationType.JSON),
                                jsonType,
                                services);
                        }
                        else if (selectFromType is MapEventType) {
                            var mapType = (MapEventType) selectFromType;
                            targetType = BaseNestableEventUtil.MakeMapTypeCompileTime(
                                metadata.Invoke(EventTypeApplicationType.MAP),
                                mapType.Types,
                                null,
                                null,
                                mapType.StartTimestampPropertyName,
                                mapType.EndTimestampPropertyName,
                                services.BeanEventTypeFactoryPrivate,
                                services.EventTypeCompileTimeResolver);
                        }
                        else if (selectFromType is BeanEventType) {
                            var beanType = (BeanEventType) selectFromType;
                            targetType = new BeanEventType(
                                services.Container,
                                beanType.Stem,
                                metadata.Invoke(EventTypeApplicationType.CLASS),
                                services.BeanEventTypeFactoryPrivate,
                                null,
                                null,
                                beanType.StartTimestampPropertyName,
                                beanType.EndTimestampPropertyName);
                        }
                        else {
                            targetType = WrapperEventTypeUtil.MakeWrapper(
                                metadata.Invoke(EventTypeApplicationType.WRAPPER),
                                selectFromType,
                                new Dictionary<string, object>(),
                                null,
                                services.BeanEventTypeFactoryPrivate,
                                services.EventTypeCompileTimeResolver);
                        }
                    }
                }

                services.EventTypeCompileTimeRegistry.NewType(targetType);
            }
            catch (EPException ex) {
                throw new ExprValidationException(ex.Message, ex);
            }

            var filter = new FilterSpecCompiled(targetType, typeName, FilterSpecPlanForge.EMPTY, null);
            return new CreateWindowCompileResult(
                filter,
                newSelectClauseSpecRaw,
                optionalSelectFrom?.EventType,
                additionalForgeables);
        }
Exemple #24
0
        public static EventTypeForgeablesPair MakeJsonTypeCompileTimeNewType(
            EventTypeMetadata metadata,
            IDictionary <string, object> compiledTyping,
            Pair <EventType[], ISet <EventType> > superTypes,
            ConfigurationCommonEventTypeWithSupertype config,
            StatementRawInfo raw,
            StatementCompileTimeServices services)
        {
            if (metadata.ApplicationType != EventTypeApplicationType.JSON)
            {
                throw new IllegalStateException("Expected Json application type");
            }

            // determine supertype
            var optionalSuperType = (JsonEventType)
                                    (superTypes == null
                                        ? null
                                        : (superTypes.First == null || superTypes.First.Length == 0
                                                ? null
                                                : superTypes.First[0]));
            var numFieldsSuperType = optionalSuperType?.Detail.FieldDescriptors.Count ?? 0;

            // determine dynamic
            var jsonSchema = (JsonSchemaAttribute)AnnotationUtil.FindAnnotation(raw.Annotations, typeof(JsonSchemaAttribute));
            var dynamic    = DetermineDynamic(jsonSchema, optionalSuperType, raw);

            // determine json underlying type class
            var optionalUnderlyingProvided = DetermineUnderlyingProvided(jsonSchema, services);

            // determine properties
            IDictionary <string, object> properties;
            IDictionary <string, string> fieldNames;
            IDictionary <Type, JsonApplicationClassSerializationDesc> deepClasses;
            IDictionary <string, FieldInfo> fields;

            if (optionalUnderlyingProvided == null)
            {
                properties  = ResolvePropertyTypes(compiledTyping, services.EventTypeCompileTimeResolver);
                properties  = RemoveEventBeanTypes(properties);
                fieldNames  = ComputeFieldNames(properties);
                deepClasses = JsonEventTypeUtilityReflective.ComputeClassesDeep(properties, metadata.Name, raw.Annotations, services);
                fields      = EmptyDictionary <string, FieldInfo> .Instance;
            }
            else
            {
                if (dynamic)
                {
                    throw new ExprValidationException("The dynamic flag is not supported when used with a provided JSON event class");
                }

                if (optionalSuperType != null)
                {
                    throw new ExprValidationException("Specifying a supertype is not supported with a provided JSON event class");
                }

                if (!optionalUnderlyingProvided.IsPublic && !optionalUnderlyingProvided.IsNestedPublic)
                {
                    throw new ExprValidationException("Provided JSON event class is not public");
                }

                if (!optionalUnderlyingProvided.HasDefaultConstructor())
                {
                    throw new ExprValidationException("Provided JSON event class does not have a public default constructor or is a non-static inner class");
                }

                deepClasses = JsonEventTypeUtilityReflective.ComputeClassesDeep(optionalUnderlyingProvided, metadata.Name, raw.Annotations, services);
                fields      = new LinkedHashMap <string, FieldInfo>();
                deepClasses.Get(optionalUnderlyingProvided).Fields.ForEach(field => fields.Put(field.Name, field));
                properties     = ResolvePropertiesFromFields(fields);
                fieldNames     = ComputeFieldNamesFromProperties(properties);
                compiledTyping = ResolvePropertyTypes(compiledTyping, services.EventTypeCompileTimeResolver);
                ValidateFieldTypes(optionalUnderlyingProvided, fields, compiledTyping);

                // use the rich-type definition for properties that may come from events
                foreach (var compiledTypingEntry in compiledTyping)
                {
                    if (compiledTypingEntry.Value is TypeBeanOrUnderlying || compiledTypingEntry.Value is TypeBeanOrUnderlying[])
                    {
                        properties.Put(compiledTypingEntry.Key, compiledTypingEntry.Value);
                    }
                }
            }

            var fieldDescriptors = ComputeFields(properties, fieldNames, optionalSuperType, fields);
            // Computes a forge for each property presented.
            var forgesByProperty = ComputeValueForges(properties, fields, deepClasses, raw.Annotations, services);
            // Determines a name for the internal class representation for this json event.
            var jsonClassNameSimple = DetermineJsonClassName(metadata, raw, optionalUnderlyingProvided);

            var forgeableDesc = new StmtClassForgeableJsonDesc(properties, fieldDescriptors, dynamic, numFieldsSuperType, optionalSuperType, forgesByProperty);

            var underlyingClassNameSimple       = jsonClassNameSimple;
            var underlyingClassNameForReference = optionalUnderlyingProvided != null
                                ? optionalUnderlyingProvided.Name
                                : underlyingClassNameSimple;
            var underlyingClassNameFull = optionalUnderlyingProvided == null
                                ? $"{services.Namespace}.{underlyingClassNameSimple}"
                                : optionalUnderlyingProvided.FullName;

            var underlying = new ProxyStmtClassForgeableFactory()
            {
                ProcMake = (
                    namespaceScope,
                    classPostfix) => new StmtClassForgeableJsonUnderlying(
                    underlyingClassNameSimple,
                    underlyingClassNameFull,
                    namespaceScope,
                    forgeableDesc)
            };

            var delegateClassNameSimple = jsonClassNameSimple + "__Delegate";
            var @delegate = new ProxyStmtClassForgeableFactory()
            {
                ProcMake = (
                    namespaceScope,
                    classPostfix) => new StmtClassForgeableJsonDelegate(
                    CodegenClassType.JSONDELEGATE,
                    delegateClassNameSimple,
                    namespaceScope,
                    underlyingClassNameFull,
                    forgeableDesc)
            };

            var deserializerClassNameSimple = jsonClassNameSimple + "__Deserializer";
            var deserializer = new ProxyStmtClassForgeableFactory()
            {
                ProcMake = (
                    namespaceScope,
                    classPostfix) => new StmtClassForgeableJsonDeserializer(
                    CodegenClassType.JSONDESERIALIZER,
                    deserializerClassNameSimple,
                    namespaceScope,
                    underlyingClassNameFull,
                    forgeableDesc)
            };

            var serializerClassNameSimple = jsonClassNameSimple + "__Serializer";
            var serializer = new ProxyStmtClassForgeableFactory()
            {
                ProcMake = (
                    namespaceScope,
                    classPostfix) => new StmtClassForgeableJsonSerializer(
                    CodegenClassType.JSONSERIALIZER,
                    serializerClassNameSimple,
                    optionalUnderlyingProvided != null,
                    namespaceScope,
                    underlyingClassNameFull,
                    forgeableDesc)
            };

            var serializerClassNameFull   = $"{services.Namespace}.{serializerClassNameSimple}";
            var deserializerClassNameFull = $"{services.Namespace}.{deserializerClassNameSimple}";
            var delegateClassNameFull     = $"{services.Namespace}.{delegateClassNameSimple}";

            // include event type name as underlying-class may occur multiple times
            var serdeClassNameFull = $"{services.Namespace}.{jsonClassNameSimple}__{metadata.Name}__Serde";

            var detail = new JsonEventTypeDetail(
                underlyingClassNameFull,
                optionalUnderlyingProvided,
                delegateClassNameFull,
                deserializerClassNameFull,
                serializerClassNameFull,
                serdeClassNameFull,
                fieldDescriptors,
                dynamic,
                numFieldsSuperType);
            var getterFactoryJson = new EventTypeNestableGetterFactoryJson(detail);

            var isStandIn = optionalUnderlyingProvided == null;
            var standIn   = isStandIn
                                ? services.CompilerServices.CompileStandInClass(CodegenClassType.JSONEVENT, underlyingClassNameSimple, services.Services)
                                : optionalUnderlyingProvided;

            var eventType = new JsonEventType(
                metadata,
                properties,
                superTypes == null ? new EventType[0] : superTypes.First,
                superTypes == null ? EmptySet <EventType> .Instance : superTypes.Second,
                config?.StartTimestampPropertyName,
                config?.EndTimestampPropertyName,
                getterFactoryJson,
                services.BeanEventTypeFactoryPrivate,
                detail,
                standIn,
                isStandIn);

            var additionalForgeables = new List <StmtClassForgeableFactory>();

            // generate serializer, deserializer, and delegate forgeables for application classes
            GenerateApplicationClassForgables(
                optionalUnderlyingProvided, deepClasses, additionalForgeables, raw.Annotations, services);

            if (optionalUnderlyingProvided == null)
            {
                additionalForgeables.Add(underlying);
            }

            additionalForgeables.Add(@delegate);
            additionalForgeables.Add(deserializer);
            additionalForgeables.Add(serializer);

            return(new EventTypeForgeablesPair(eventType, additionalForgeables));
        }
        private static CodegenMethod RegisterEventTypeCodegen(
            EventType eventType,
            CodegenMethodScope parent,
            CodegenClassScope classScope,
            ModuleEventTypeInitializeSymbol symbols)
        {
            var method = parent.MakeChild(typeof(void), typeof(EPCompilerImpl), classScope);

            // metadata
            method.Block.DeclareVar<EventTypeMetadata>("metadata", eventType.Metadata.ToExpression());

            if (eventType is JsonEventType) {
                JsonEventType jsonEventType = (JsonEventType) eventType;
                method.Block.DeclareVar<LinkedHashMap<string, object>>(
                    "props",
                    LocalMethod(
                        MakePropsCodegen(
                            jsonEventType.Types,
                            method,
                            symbols,
                            classScope,
                            () => jsonEventType.DeepSuperTypes.GetEnumerator())));
                string[] superTypeNames = GetSupertypeNames(jsonEventType);
                var detailExpr = jsonEventType.Detail.ToExpression(method, classScope);
                method.Block.Expression(
                    ExprDotMethodChain(symbols.GetAddInitSvc(method))
                        .Get(EPModuleEventTypeInitServicesConstants.GETEVENTTYPECOLLECTOR)
                        .Add(
                            "RegisterJson",
                            Ref("metadata"),
                            Ref("props"),
                            Constant(superTypeNames),
                            Constant(jsonEventType.StartTimestampPropertyName),
                            Constant(jsonEventType.EndTimestampPropertyName),
                            detailExpr));
            }
            else if (eventType is BaseNestableEventType baseNestable) {
                method.Block.DeclareVar<LinkedHashMap<string, object>>(
                    "props",
                    LocalMethod(
                        MakePropsCodegen(
                            baseNestable.Types,
                            method,
                            symbols,
                            classScope,
                            () => baseNestable.DeepSuperTypes.GetEnumerator())));
                var registerMethodName = baseNestable is MapEventType ? "RegisterMap" : "RegisterObjectArray";
                var superTypeNames = GetSupertypeNames(baseNestable);

                method.Block
                    .Expression(
                        ExprDotMethodChain(symbols.GetAddInitSvc(method))
                            .Get(EPModuleEventTypeInitServicesConstants.GETEVENTTYPECOLLECTOR)
                            .Add(
                                registerMethodName,
                                Ref("metadata"),
                                Ref("props"),
                                Constant(superTypeNames),
                                Constant(baseNestable.StartTimestampPropertyName),
                                Constant(baseNestable.EndTimestampPropertyName)));
            }
            else if (eventType is WrapperEventType wrapper) {
                method.Block.DeclareVar<EventType>(
                    "inner",
                    EventTypeUtility.ResolveTypeCodegen(wrapper.UnderlyingEventType, symbols.GetAddInitSvc(method)));
                method.Block.DeclareVar<LinkedHashMap<string, object>>(
                    "props",
                    LocalMethod(
                        MakePropsCodegen(
                            wrapper.UnderlyingMapType.Types,
                            method,
                            symbols,
                            classScope,
                            () => wrapper.UnderlyingMapType.DeepSuperTypes.GetEnumerator())));
                method.Block
                    .Expression(
                        ExprDotMethodChain(symbols.GetAddInitSvc(method))
                            .Get(EPModuleEventTypeInitServicesConstants.GETEVENTTYPECOLLECTOR)
                            .Add("RegisterWrapper", Ref("metadata"), Ref("inner"), Ref("props")));
            }
            else if (eventType is BeanEventType beanType) {
                var superTypes = MakeSupertypes(beanType.SuperTypes, symbols.GetAddInitSvc(method));
                var deepSuperTypes = MakeDeepSupertypes(beanType.DeepSuperTypesCollection, method, symbols, classScope);
                method.Block
                    .Expression(
                        ExprDotMethodChain(symbols.GetAddInitSvc(method))
                            .Get(EPModuleEventTypeInitServicesConstants.GETEVENTTYPECOLLECTOR)
                            .Add(
                                "RegisterBean",
                                Ref("metadata"),
                                Typeof(beanType.UnderlyingType),
                                Constant(beanType.StartTimestampPropertyName),
                                Constant(beanType.EndTimestampPropertyName),
                                superTypes,
                                deepSuperTypes));
            }
            else if (eventType is SchemaXMLEventType xmlType && (xmlType.RepresentsFragmentOfProperty != null)) {
                method.Block
                    .Expression(
                        ExprDotMethodChain(symbols.GetAddInitSvc(method))
                            .Get(EPModuleEventTypeInitServicesConstants.GETEVENTTYPECOLLECTOR)
                            .Add(
                                "RegisterXML",
                                Ref("metadata"),
                                Constant(xmlType.RepresentsFragmentOfProperty),
                                Constant(xmlType.RepresentsOriginalTypeName)));
            }
Exemple #26
0
 public JsonEventBeanCopyMethodForge(JsonEventType eventType)
 {
     _eventType = eventType;
 }