public void NewType(EventType type)
        {
            try {
                EventTypeUtility.ValidateModifiers(type.Name, type.Metadata.BusModifier, type.Metadata.AccessModifier);
            } catch (ExprValidationException e) {
                throw new ArgumentException(e.Message, e);
            }
            
            if (type.Metadata.AccessModifier == NameAccessModifier.PRECONFIGURED) {
                if (type.Metadata.ApplicationType != EventTypeApplicationType.XML) {
                    throw new ArgumentException("Preconfigured-visibility is not allowed here");
                }

                _eventTypeRepositoryPreconfigured.AddType(type);
            }

            if (_moduleTypesAdded.ContainsKey(type.Name)) {
                throw new ArgumentException("Event type '" + type.Name + "' has already been added by the module");
            }

            if (type.Metadata.AccessModifier == NameAccessModifier.PRIVATE ||
                type.Metadata.AccessModifier == NameAccessModifier.INTERNAL ||
                type.Metadata.AccessModifier == NameAccessModifier.PUBLIC) {
                _moduleTypesAdded.Put(type.Name, type);
            }

            // We allow private types to register multiple times, the first one counts (i.e. rollup with multiple select-clauses active)
            if (!_newTypesAdded.ContainsKey(type.Name)) {
                _newTypesAdded.Put(type.Name, type);
            }
            else {
                throw new ArgumentException("Event type '" + type.Name + "' has already been added by the module");
            }
        }
Example #2
0
        private EventType HandleVariantType(
            CreateSchemaDesc spec,
            StatementCompileTimeServices services)
        {
            if (spec.CopyFrom != null && !spec.CopyFrom.IsEmpty()) {
                throw new ExprValidationException("Copy-from types are not allowed with variant types");
            }

            var eventTypeName = spec.SchemaName;

            // determine typing
            var isAny = false;
            ISet<EventType> types = new LinkedHashSet<EventType>();
            foreach (var typeName in spec.Types) {
                if (typeName.Trim().Equals("*")) {
                    isAny = true;
                }
                else {
                    var eventType = services.EventTypeCompileTimeResolver.GetTypeByName(typeName);
                    if (eventType == null) {
                        throw new ExprValidationException(
                            "Event type by name '" +
                            typeName +
                            "' could not be found for use in variant stream by name '" +
                            eventTypeName +
                            "'");
                    }

                    types.Add(eventType);
                }
            }

            var eventTypes = types.ToArray();
            var variantSpec = new VariantSpec(eventTypes, isAny ? TypeVariance.ANY : TypeVariance.PREDEFINED);

            var visibility =
                services.ModuleVisibilityRules.GetAccessModifierEventType(@base.StatementRawInfo, spec.SchemaName);
            var eventBusVisibility =
                services.ModuleVisibilityRules.GetBusModifierEventType(@base.StatementRawInfo, eventTypeName);
            EventTypeUtility.ValidateModifiers(spec.SchemaName, eventBusVisibility, visibility);

            var metadata = new EventTypeMetadata(
                eventTypeName,
                @base.ModuleName,
                EventTypeTypeClass.VARIANT,
                EventTypeApplicationType.VARIANT,
                visibility,
                eventBusVisibility,
                false,
                EventTypeIdPair.Unassigned());
            var variantEventType = new VariantEventType(metadata, variantSpec);
            services.EventTypeCompileTimeRegistry.NewType(variantEventType);
            return variantEventType;
        }