/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * *************************************************************************************** */ package com.espertech.esper.event; import java.util.LinkedHashSet; import java.util.Set; /** * Provides metadata for event types. */ public class EventTypeMetadata { private final String publicName; private final String primaryName; private final Set<String> optionalSecondaryNames; private final TypeClass typeClass; private final boolean isApplicationPreConfiguredStatic; private final boolean isApplicationPreConfigured; private final boolean isApplicationConfigured; private final ApplicationType optionalApplicationType; private final boolean isPropertyAgnostic; // Type accepts any property name (i.e. no-schema XML type) /** * Ctor. * * @param primaryName the primary name by which the type became known. * @param secondaryNames a list of additional names for the type, such as fully-qualified class name * @param typeClass type of the type * @param applicationConfigured true if configured by the application * @param applicationType type of application class or null if not an application type * @param isPropertyAgnostic true for types that accept any property name as a valid property (unchecked type) * @param applicationPreConfigured preconfigured * @param isApplicationPreConfiguredStatic preconfigured via static config */ protected EventTypeMetadata(String primaryName, Set<String> secondaryNames, TypeClass typeClass, boolean isApplicationPreConfiguredStatic, boolean applicationPreConfigured, boolean applicationConfigured, ApplicationType applicationType, boolean isPropertyAgnostic) { this.publicName = primaryName; this.primaryName = primaryName; this.optionalSecondaryNames = secondaryNames; this.typeClass = typeClass; this.isApplicationConfigured = applicationConfigured; this.isApplicationPreConfigured = applicationPreConfigured; this.isApplicationPreConfiguredStatic = isApplicationPreConfiguredStatic; this.optionalApplicationType = applicationType; this.isPropertyAgnostic = isPropertyAgnostic; } /** * Factory for a value-add type. * * @param name type name * @param typeClass type of type * @return instance */ public static EventTypeMetadata createValueAdd(String name, TypeClass typeClass) { if ((typeClass != TypeClass.VARIANT) && (typeClass != TypeClass.REVISION)) { throw new IllegalArgumentException("Type class " + typeClass + " invalid"); } return new EventTypeMetadata(name, null, typeClass, true, true, true, null, false); } /** * Factory for a bean type. * * @param name type name * @param clazz java class * @param isConfigured whether the class was made known or is discovered * @param typeClass type of type * @param isPreConfigured preconfigured * @param isPreConfiguredStatic preconfigured via static config * @return instance */ public static EventTypeMetadata createBeanType(String name, Class clazz, boolean isPreConfiguredStatic, boolean isPreConfigured, boolean isConfigured, TypeClass typeClass) { Set<String> secondaryNames = null; if (name == null) { name = clazz.getName(); } else { if (!name.equals(clazz.getName())) { secondaryNames = new LinkedHashSet<String>(); secondaryNames.add(clazz.getName()); } } return new EventTypeMetadata(name, secondaryNames, typeClass, isPreConfiguredStatic, isPreConfigured, isConfigured, ApplicationType.CLASS, false); } /** * Factory for a XML type. * * @param name type name * @param isPropertyAgnostic true for types that accept any property name as a valid property (unchecked type) * @param isPreconfiguredStatic preconfigured via static config * @return instance */ public static EventTypeMetadata createXMLType(String name, boolean isPreconfiguredStatic, boolean isPropertyAgnostic) { return new EventTypeMetadata(name, null, TypeClass.APPLICATION, isPreconfiguredStatic, true, true, ApplicationType.XML, isPropertyAgnostic); } /** * Factory for an anonymous type. * * @param associationName what the type is associated with * @param applicationType type info * @return instance */ public static EventTypeMetadata createAnonymous(String associationName, ApplicationType applicationType) { return new EventTypeMetadata(associationName, null, TypeClass.ANONYMOUS, false, false, false, applicationType, false); } /** * Factory for an table type. * * @param tableName what the type is associated with * @return instance */ public static EventTypeMetadata createTable(String tableName) { return new EventTypeMetadata(tableName, null, TypeClass.TABLE, false, false, false, null, false); } /** * Factory for a wrapper type. * * @param eventTypeName insert-into of create-window name * @param namedWindow true for named window * @param insertInto true for insert-into * @param isPropertyAgnostic true for types that accept any property name as a valid property (unchecked type) * @return instance */ public static EventTypeMetadata createWrapper(String eventTypeName, boolean namedWindow, boolean insertInto, boolean isPropertyAgnostic) { TypeClass typeClass; if (namedWindow) { typeClass = TypeClass.NAMED_WINDOW; } else if (insertInto) { typeClass = TypeClass.STREAM; } else { throw new IllegalStateException("Unknown Wrapper type, cannot create metadata"); } return new EventTypeMetadata(eventTypeName, null, typeClass, false, false, false, null, isPropertyAgnostic); } /** * Factory for a map type. * * @param name insert-into of create-window name * @param namedWindow true for named window * @param insertInto true for insert-into * @param configured whether the made known or is discovered * @param preconfigured preconfigured * @param preconfiguredStatic preconfigured via static config * @param providedType type * @return instance */ public static EventTypeMetadata createNonPojoApplicationType(ApplicationType providedType, String name, boolean preconfiguredStatic, boolean preconfigured, boolean configured, boolean namedWindow, boolean insertInto) { TypeClass typeClass; ApplicationType applicationType = null; if (configured) { typeClass = TypeClass.APPLICATION; applicationType = providedType; } else if (namedWindow) { typeClass = TypeClass.NAMED_WINDOW; } else if (insertInto) { typeClass = TypeClass.STREAM; } else { typeClass = TypeClass.ANONYMOUS; } return new EventTypeMetadata(name, null, typeClass, preconfiguredStatic, preconfigured, configured, applicationType, false); } /** * Returns the name. * * @return name */ public String getPrimaryName() { return primaryName; } /** * Returns second names or null if none found. * * @return further names */ public Set<String> getOptionalSecondaryNames() { return optionalSecondaryNames; } /** * Returns the type of the type. * * @return meta type */ public TypeClass getTypeClass() { return typeClass; } /** * Returns true if the type originates in a configuration. * * @return indicator whether configured or not */ public boolean isApplicationConfigured() { return isApplicationConfigured; } /** * The type of the application event type or null if not an application event type. * * @return application event type */ public ApplicationType getOptionalApplicationType() { return optionalApplicationType; } /** * Returns the name provided through #EventType.getName. * * @return name or null if no public name */ public String getPublicName() { return publicName; } /** * Returns true for types that accept any property name as a valid property (unchecked type). * * @return indicator whether type is unchecked (agnostic to property) */ public boolean isPropertyAgnostic() { return isPropertyAgnostic; } /** * Returns true to indicate the type is pre-configured, i.e. added through static or runtime configuration. * * @return indicator */ public boolean isApplicationPreConfigured() { return isApplicationPreConfigured; } /** * Returns true to indicate the type is pre-configured, i.e. added through static configuration but not runtime configuation. * * @return indicator */ public boolean isApplicationPreConfiguredStatic() { return isApplicationPreConfiguredStatic; } /** * Metatype. */ public static enum TypeClass { /** * A type that represents the information made available via insert-into. */ STREAM(true), /** * A revision event type. */ REVISION(true), /** * A variant stream event type. */ VARIANT(true), /** * An application-defined event type such as JavaBean or legacy Java, XML or Map. */ APPLICATION(true), /** * A type representing a named window. */ NAMED_WINDOW(true), /** * A type representing a table. */ TABLE(false), /** * An anonymous event type. */ ANONYMOUS(false); private boolean isPublic; /** * Returns true to indicate this is a public type that may be queried for name. * * @return indicator public type versus anonymous */ public boolean isPublic() { return isPublic; } TypeClass(boolean isPublic) { this.isPublic = isPublic; } } /** * Application type. */ public static enum ApplicationType { /** * Xml type. */ XML, /** * Map type. */ MAP, /** * Object Array type. */ OBJECTARR, /** * Class type. */ CLASS, /** * Avro type. */ AVRO, /** * Wrapper type. */ WRAPPER } }