diff --git a/NEsper/NEsper/client/Configuration.cs b/NEsper/NEsper/client/Configuration.cs index deb98d2a4..24f38284b 100644 --- a/NEsper/NEsper/client/Configuration.cs +++ b/NEsper/NEsper/client/Configuration.cs @@ -5,12 +5,14 @@ // 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. / /////////////////////////////////////////////////////////////////////////////////////// + using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Reflection; using System.Xml; + using com.espertech.esper.client.annotation; using com.espertech.esper.client.hook; using com.espertech.esper.collection; @@ -21,6 +23,7 @@ using com.espertech.esper.dataflow.ops; using com.espertech.esper.events; using com.espertech.esper.util; + namespace com.espertech.esper.client { /// @@ -43,14 +46,16 @@ public class Configuration : ConfigurationOperations , ConfigurationInformation { + private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + /// Default name of the configuration file. + internal static readonly string ESPER_DEFAULT_CONFIG = "esper.cfg.xml"; + /// /// Import name of the package that hosts the annotation classes. /// - public readonly static String ANNOTATION_IMPORT = typeof(NameAttribute).Namespace; - /// Default name of the configuration file. - internal static readonly string ESPER_DEFAULT_CONFIG = "esper.cfg.xml"; - private static readonly ILog Log = - LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public static readonly String ANNOTATION_IMPORT = typeof(NameAttribute).Namespace; + /// Map of event name and fully-qualified class name. private IDictionary _eventClasses; /// Map of event type name and XML DOM configuration. @@ -148,6 +153,18 @@ public class Configuration private IDictionary _variantStreams; [NonSerialized] private IDictionary _transientConfiguration; [NonSerialized] private IContainer _container; + + /// + /// Initializes a new instance of the class. + /// + public Configuration() + { + _container = ContainerExtensions.CreateDefaultContainer(false) + .InitializeDefaultServices() + .InitializeDatabaseDrivers(); + Reset(); + } + /// /// Constructs an empty configuration. The auto import values /// are set by default to System, System.Collections and @@ -159,6 +176,7 @@ public Configuration(IContainer container) _container = container; Reset(); } + /// /// Get the configuration file as an InputStream. Might be overridden /// by subclasses to allow the configuration to be located by some arbitrary @@ -174,6 +192,7 @@ internal Stream GetConfigurationInputStream(string resource) { return GetResourceAsStream(resource); } + /// /// Returns an input stream from an application resource in the classpath. /// @@ -213,6 +232,7 @@ internal Stream GetResourceAsStream(String resource) } return stream; } + public string EPServicesContextFactoryClassName => _epServicesContextFactoryClassName; /// /// Sets the class name of the services context factory class to use. @@ -222,6 +242,7 @@ public void SetEPServicesContextFactoryClassName(string epServicesContextFactory { _epServicesContextFactoryClassName = epServicesContextFactoryClassName; } + public void AddPlugInAggregationFunctionFactory(string functionName, string aggregationFactoryClassName) { var entry = new ConfigurationPlugInAggregationFunction(); @@ -229,6 +250,7 @@ public void AddPlugInAggregationFunctionFactory(string functionName, string aggr entry.FactoryClassName = aggregationFactoryClassName; _plugInAggregationFunctions.Add(entry); } + /// /// Adds a plug-in aggregation function given a EPL function name and an aggregation factory class name. /// @@ -241,6 +263,7 @@ public void AddPlugInAggregationFunctionFactory(String functionName, Type aggreg { AddPlugInAggregationFunctionFactory(functionName, aggregationFactoryClass.AssemblyQualifiedName); } + /// /// Adds the plug in aggregation function factory. /// @@ -250,23 +273,28 @@ public void AddPlugInAggregationFunctionFactory(String functionName) where T { AddPlugInAggregationFunctionFactory(functionName, typeof(T).AssemblyQualifiedName); } + public void AddPlugInAggregationMultiFunction(ConfigurationPlugInAggregationMultiFunction config) { _plugInAggregationMultiFunctions.Add(config); } + public void AddPlugInSingleRowFunction(ConfigurationPlugInSingleRowFunction singleRowFunction) { _plugInSingleRowFunctions.Add(singleRowFunction); } + public void AddPlugInSingleRowFunction(string functionName, Type clazz, string methodName) { AddPlugInSingleRowFunction(functionName, clazz.AssemblyQualifiedName, methodName); } + public void AddPlugInSingleRowFunction(string functionName, string className, string methodName) { AddPlugInSingleRowFunction( functionName, className, methodName, ValueCacheEnum.DISABLED); } + public void AddPlugInSingleRowFunction( string functionName, Type clazz, @@ -275,6 +303,7 @@ public void AddPlugInSingleRowFunction( { AddPlugInSingleRowFunction(functionName, clazz.AssemblyQualifiedName, methodName, valueCache); } + public void AddPlugInSingleRowFunction( string functionName, string className, @@ -284,6 +313,7 @@ public void AddPlugInSingleRowFunction( AddPlugInSingleRowFunction( functionName, className, methodName, valueCache, FilterOptimizableEnum.ENABLED); } + public void AddPlugInSingleRowFunction( string functionName, Type clazz, @@ -292,6 +322,7 @@ public void AddPlugInSingleRowFunction( { AddPlugInSingleRowFunction(functionName, clazz.AssemblyQualifiedName, methodName, filterOptimizable); } + public void AddPlugInSingleRowFunction( string functionName, string className, @@ -301,6 +332,7 @@ public void AddPlugInSingleRowFunction( AddPlugInSingleRowFunction( functionName, className, methodName, ValueCacheEnum.DISABLED, filterOptimizable); } + /// /// Returns transient configuration, i.e. information that is passed along as a reference and not as a value /// @@ -310,10 +342,13 @@ public IDictionary TransientConfiguration get => _transientConfiguration; set => _transientConfiguration = value; } - public IContainer Container { + + public IContainer Container + { get => _container; set => _container = value; } + public IResourceManager ResourceManager => _container.ResourceManager(); /// /// Add single-row function with configurations. @@ -333,6 +368,7 @@ public void AddPlugInSingleRowFunction( { AddPlugInSingleRowFunction(functionName, className, methodName, valueCache, filterOptimizable, false); } + public void AddPlugInSingleRowFunction( string functionName, Type clazz, @@ -343,6 +379,7 @@ public void AddPlugInSingleRowFunction( { AddPlugInSingleRowFunction(functionName, clazz.AssemblyQualifiedName, methodName, valueCache, filterOptimizable, rethrowExceptions); } + /// /// Add single-row function with configurations. /// @@ -370,6 +407,7 @@ public void AddPlugInSingleRowFunction( entry.IsRethrowExceptions = rethrowExceptions; AddPlugInSingleRowFunction(entry); } + /// /// Checks if an event type has already been registered for that name. /// @@ -385,6 +423,7 @@ public bool IsEventTypeExists(string eventTypeName) || _eventTypesAvro.ContainsKey(eventTypeName); //note: no need to check legacy as they get added as class event type } + /// /// Add an name for an event type represented by object events. /// Note that when adding multiple names for the same class the names represent an @@ -396,6 +435,7 @@ public void AddEventType(string eventTypeName, string eventClassName) { _eventClasses[eventTypeName] = eventClassName; } + /// /// Add an name for an event type represented by plain-old object events. /// Note that when adding multiple names for the same class the names represent an @@ -407,6 +447,7 @@ public void AddEventType(string eventTypeName, Type eventClass) { AddEventType(eventTypeName, eventClass.AssemblyQualifiedName); } + /// /// Add event type represented by plain-old object events, /// and the name is the simple class name of the class. @@ -416,6 +457,7 @@ public void AddEventType(Type eventClass) { AddEventType(eventClass.Name, eventClass.AssemblyQualifiedName); } + /// /// Adds a name for an event type represented by the type parameter. /// @@ -425,6 +467,7 @@ public void AddEventType(String eventTypeName) { AddEventType(eventTypeName, typeof(T).AssemblyQualifiedName); } + /// /// Adds a name for an event type represented by the type parameter. /// @@ -433,6 +476,7 @@ public void AddEventType() { AddEventType(typeof(T).Name, typeof(T).AssemblyQualifiedName); } + /// /// Add an name for an event type that represents IDictionary events. /// @@ -449,10 +493,12 @@ public void AddEventType(string eventTypeName, Properties typeMap) { _mapNames.Put(eventTypeName, typeMap); } + public void AddEventType(string eventTypeName, IDictionary typeMap) { _nestableMapNames.Put(eventTypeName, new Dictionary(typeMap)); } + public void AddEventType(string eventTypeName, IDictionary typeMap, string[] superTypes) { _nestableMapNames.Put(eventTypeName, new Dictionary(typeMap)); @@ -464,6 +510,7 @@ public void AddEventType(string eventTypeName, IDictionary typeM } } } + public void AddEventType( string eventTypeName, IDictionary typeMap, @@ -472,6 +519,7 @@ public void AddEventType( _nestableMapNames.Put(eventTypeName, new Dictionary(typeMap)); _mapTypeConfigurations.Put(eventTypeName, mapConfig); } + /// /// Add, for a given Map event type identified by the first parameter, the supertype (by its event type name). /// @@ -491,6 +539,7 @@ public void AddMapSuperType(string mapeventTypeName, string mapSupertypeName) ICollection superTypes = current.SuperTypes; superTypes.Add(mapSupertypeName); } + /// /// Add, for a given Object-array event type identified by the first parameter, the supertype (by its event type name). /// @@ -514,6 +563,7 @@ public void AddObjectArraySuperType(string eventTypeName, string supertypeName) } superTypes.Add(supertypeName); } + /// /// Add configuration for a map event type. /// @@ -523,6 +573,7 @@ public void AddMapConfiguration(string mapeventTypeName, ConfigurationEventTypeM { _mapTypeConfigurations.Put(mapeventTypeName, config); } + /// /// Add configuration for a object array event type. /// @@ -534,6 +585,7 @@ public void AddObjectArrayConfiguration( { _objectArrayTypeConfigurations.Put(objectArrayeventTypeName, config); } + /// /// Add an name for an event type that represents org.w3c.dom.Node events. /// @@ -543,12 +595,14 @@ public void AddEventType(string eventTypeName, ConfigurationEventTypeXMLDOM xmlD { _eventTypesXmldom.Put(eventTypeName, xmlDOMEventTypeDesc); } + public void AddEventType(string eventTypeName, string[] propertyNames, Object[] propertyTypes) { var propertyTypesMap = EventTypeUtility.ValidateObjectArrayDef( propertyNames, propertyTypes); _nestableObjectArrayNames.Put(eventTypeName, propertyTypesMap); } + public void AddEventType( string eventTypeName, string[] propertyNames, @@ -564,12 +618,14 @@ public void AddEventType( throw new ConfigurationException(ConfigurationEventTypeObjectArray.SINGLE_SUPERTYPE_MSG); } } + public void AddRevisionEventType( string revisioneventTypeName, ConfigurationRevisionEventType revisionEventTypeConfig) { _revisionEventTypes.Put(revisioneventTypeName, revisionEventTypeConfig); } + /// /// Add a database reference with a given database name. /// @@ -579,14 +635,17 @@ public void AddDatabaseReference(string name, ConfigurationDBRef configurationDB { _databaseReferences.Put(name, configurationDBRef); } + public void AddEventType(ConfigurationEventTypeLegacy legacyEventTypeDesc) { AddEventType(typeof(T).Name, typeof(T).AssemblyQualifiedName, legacyEventTypeDesc); } + public void AddEventType(string eventTypeName, ConfigurationEventTypeLegacy legacyEventTypeDesc) { AddEventType(eventTypeName, typeof(T).AssemblyQualifiedName, legacyEventTypeDesc); } + /// /// Add an name for an event type that represents legacy object type events. /// Note that when adding multiple names for the same class the names represent an @@ -604,6 +663,7 @@ public void AddEventType( _eventClasses.Put(eventTypeName, eventClass); _eventTypesLegacy.Put(eventTypeName, legacyEventTypeDesc); } + public void AddEventType( string eventTypeName, Type eventClass, @@ -611,6 +671,7 @@ public void AddEventType( { AddEventType(eventTypeName, eventClass.AssemblyQualifiedName, legacyEventTypeDesc); } + /// /// Add a namespace. Adding will suppress the use of the default namespaces. /// @@ -619,7 +680,7 @@ public void AddEventType( /// ConfigurationException if incorrect package or class names are encountered /// public void AddImport(string importName) - { + { string[] importParts = importName.Split(','); if (importParts.Length == 1) { @@ -630,6 +691,7 @@ public void AddImport(string importName) AddImport(importParts[0], importName.Substring(importParts[0].Length + 1).TrimStart()); } } + /// /// Adds the class or namespace (importName) ot the list of automatically imported types. /// @@ -639,6 +701,7 @@ public void AddImport(String importName, String assemblyNameOrFile) { _imports.Add(new AutoImportDesc(importName, assemblyNameOrFile)); } + /// /// Adds an import for a specific type. /// @@ -647,6 +710,7 @@ public void AddImport(Type importClass) { AddImport(importClass.AssemblyQualifiedName); } + /// /// Adds the import. /// @@ -655,6 +719,7 @@ public void AddImport() { AddImport(typeof(T)); } + /// /// Adds an import for the namespace associated with the given type. /// @@ -663,6 +728,7 @@ public void AddNamespaceImport() { AddImport(typeof(T).Namespace); } + /// /// Adds the annotation import. /// @@ -672,6 +738,7 @@ public void AddAnnotationImport(String importName, String assemblyNameOrFile) { _annotationImports.Add(new AutoImportDesc(importName, assemblyNameOrFile)); } + /// /// Adds the annotation import. /// @@ -689,6 +756,7 @@ public void AddAnnotationImport(string autoImport) AddAnnotationImport(importParts[0], importParts[1]); } } + /// /// Adds the annotation import. /// @@ -697,6 +765,7 @@ public void AddAnnotationImport(Type autoImport) { AddAnnotationImport(autoImport.FullName, autoImport.Assembly.FullName); } + /// /// Adds the annotation import. /// @@ -713,6 +782,7 @@ public void AddAnnotationImport(bool importNamespace = false) AddAnnotationImport(typeof(T).FullName, typeof(T).Assembly.FullName); } } + /// /// Remove an import. /// @@ -721,6 +791,7 @@ public void RemoveImport(AutoImportDesc autoImportDesc) { _imports.Remove(autoImportDesc); } + /// /// Adds a cache configuration for a class providing methods for use in the from-clause. /// @@ -730,6 +801,7 @@ public void AddMethodRef(string className, ConfigurationMethodRef methodInvocati { _methodInvocationReferences.Put(className, methodInvocationConfig); } + /// /// Adds a cache configuration for a class providing methods for use in the from-clause. /// @@ -739,6 +811,7 @@ public void AddMethodRef(Type clazz, ConfigurationMethodRef methodInvocationConf { _methodInvocationReferences.Put(clazz.FullName, methodInvocationConfig); } + public IDictionary EventTypeNames => _eventClasses; public IDictionary EventTypesMapEvents => _mapNames; public IDictionary> EventTypesNestableMapEvents => _nestableMapNames; @@ -761,6 +834,7 @@ public void AddMethodRef(Type clazz, ConfigurationMethodRef methodInvocationConf public IDictionary MethodInvocationReferences => _methodInvocationReferences; public IDictionary RevisionEventTypes => _revisionEventTypes; public IDictionary MapTypeConfigurations => _mapTypeConfigurations; + /// /// Add a plugin loader (f.e. an input/output adapter loader). /// @@ -774,6 +848,7 @@ public void AddPluginLoader(string loaderName, string className, Properties conf { AddPluginLoader(loaderName, className, configuration, null); } + /// /// Add a plugin loader (f.e. an input/output adapter loader) without any additional loader configuration /// @@ -786,6 +861,7 @@ public void AddPluginLoader(string loaderName, string className) { AddPluginLoader(loaderName, className, null, null); } + /// /// Add a plugin loader (f.e. an input/output adapter loader). /// @@ -809,6 +885,7 @@ public void AddPluginLoader( pluginLoader.ConfigurationXML = configurationXML; _pluginLoaders.Add(pluginLoader); } + /// /// Add a view for plug-in. /// @@ -823,10 +900,12 @@ public void AddPlugInView(string @namespace, string name, string viewFactoryClas configurationPlugInView.FactoryClassName = viewFactoryClass; _plugInViews.Add(configurationPlugInView); } + public void AddPlugInView(string @namespace, string name, Type viewFactoryClass) { AddPlugInView(@namespace, name, viewFactoryClass.AssemblyQualifiedName); } + /// /// Add a virtual data window for plug-in. /// @@ -837,6 +916,7 @@ public void AddPlugInVirtualDataWindow(string @namespace, string name, string fa { AddPlugInVirtualDataWindow(@namespace, name, factoryClass, null); } + /// /// Add a virtual data window for plug-in. /// @@ -857,6 +937,7 @@ public void AddPlugInVirtualDataWindow( configurationPlugInVirtualDataWindow.Config = customConfigurationObject; _plugInVirtualDataWindows.Add(configurationPlugInVirtualDataWindow); } + /// /// Add a pattern event observer for plug-in. /// @@ -872,6 +953,7 @@ public void AddPlugInPatternObserver(string @namespace, string name, string obse entry.PatternObjectType = ConfigurationPlugInPatternObject.PatternObjectTypeEnum.OBSERVER; _plugInPatternObjects.Add(entry); } + /// /// Add a pattern guard for plug-in. /// @@ -882,6 +964,7 @@ public void AddPlugInPatternGuard(string @namespace, string name, Type guardFact { AddPlugInPatternGuard(@namespace, name, guardFactoryClass.AssemblyQualifiedName); } + /// /// Add a pattern guard for plug-in. /// @@ -897,18 +980,22 @@ public void AddPlugInPatternGuard(string @namespace, string name, string guardFa entry.PatternObjectType = ConfigurationPlugInPatternObject.PatternObjectTypeEnum.GUARD; _plugInPatternObjects.Add(entry); } + public void AddEventTypeAutoName(string @namespace) { _eventTypeAutoNamePackages.Add(@namespace); } + public void AddVariable(string variableName, TValue initializationValue) { AddVariable(variableName, typeof(TValue).FullName, initializationValue, false); } + public void AddVariable(string variableName, Type type, Object initializationValue) { AddVariable(variableName, type.FullName, initializationValue, false); } + /// /// Add variable that can be a constant. /// @@ -920,10 +1007,12 @@ public void AddVariable(string variableName, Type type, Object initializationVal { AddVariable(variableName, type.FullName, initializationValue, constant); } + public void AddVariable(string variableName, string type, Object initializationValue) { AddVariable(variableName, type, initializationValue, false); } + public void AddVariable(string variableName, string type, Object initializationValue, bool constant) { var configVar = new ConfigurationVariable(); @@ -932,6 +1021,7 @@ public void AddVariable(string variableName, string type, Object initializationV configVar.IsConstant = constant; _variables.Put(variableName, configVar); } + /// /// Adds an event representation responsible for creating event types (event metadata) and event bean instances (events) for /// a certain kind of object representation that holds the event property values. @@ -952,6 +1042,7 @@ public void AddPlugInEventRepresentation( config.Initializer = initializer; _plugInEventRepresentation.Put(eventRepresentationRootUri, config); } + /// /// Adds an event representation responsible for creating event types (event metadata) and event bean instances (events) for /// a certain kind of object representation that holds the event property values. @@ -972,6 +1063,7 @@ public void AddPlugInEventRepresentation( eventRepresentationClass.AssemblyQualifiedName, initializer); } + public void AddPlugInEventType(string eventTypeName, Uri[] resolutionURIs, object initializer) { var config = new ConfigurationPlugInEventType(); @@ -979,76 +1071,95 @@ public void AddPlugInEventType(string eventTypeName, Uri[] resolutionURIs, objec config.Initializer = initializer; _plugInEventTypes.Put(eventTypeName, config); } + public IList PlugInEventTypeResolutionURIs { get => _plugInEventTypeResolutionUris; set => _plugInEventTypeResolutionUris = value; } + public IDictionary PlugInEventRepresentation => _plugInEventRepresentation; public IDictionary PlugInEventTypes => _plugInEventTypes; public ISet EventTypeAutoNamePackages => _eventTypeAutoNamePackages; public ConfigurationEngineDefaults EngineDefaults => _engineDefaults; + public void AddVariantStream(string variantStreamName, ConfigurationVariantStream variantStreamConfig) { _variantStreams.Put(variantStreamName, variantStreamConfig); } + public IDictionary VariantStreams => _variantStreams; + public void UpdateMapEventType(string mapeventTypeName, IDictionary typeMap) { throw new UnsupportedOperationException("Map type update is only available in runtime configuration"); } + public void UpdateObjectArrayEventType(string myEvent, string[] namesNew, Object[] typesNew) { throw new UnsupportedOperationException( "Object-array type update is only available in runtime configuration"); } + public void ReplaceXMLEventType(string xmlEventTypeName, ConfigurationEventTypeXMLDOM config) { throw new UnsupportedOperationException("XML type update is only available in runtime configuration"); } + public ICollection GetEventTypeNameUsedBy(string eventTypeName) { throw new UnsupportedOperationException("Get event type by name is only available in runtime configuration"); } + public bool IsVariantStreamExists(string name) { return _variantStreams.ContainsKey(name); } + public void SetMetricsReportingInterval(string stmtGroupName, long newIntervalMSec) { EngineDefaults.MetricsReporting.SetStatementGroupInterval(stmtGroupName, newIntervalMSec); } + public void SetMetricsReportingStmtEnabled(string statementName) { throw new UnsupportedOperationException( "Statement metric reporting can only be enabled or disabled at runtime"); } + public void SetMetricsReportingStmtDisabled(string statementName) { throw new UnsupportedOperationException( "Statement metric reporting can only be enabled or disabled at runtime"); } + public EventType GetEventType(string eventTypeName) { throw new UnsupportedOperationException("Obtaining an event type by name is only available at runtime"); } + public ICollection EventTypes => throw new UnsupportedOperationException("Obtaining event types is only available at runtime"); + public void SetMetricsReportingEnabled() { EngineDefaults.MetricsReporting.IsEnableMetricsReporting = true; } + public void SetMetricsReportingDisabled() { EngineDefaults.MetricsReporting.IsEnableMetricsReporting = false; } + public long PatternMaxSubexpressions { set => EngineDefaults.Patterns.MaxSubexpressions = value; } + public long? MatchRecognizeMaxStates { set => EngineDefaults.MatchRecognize.MaxStates = value; } + /// /// Use the configuration specified in an application /// resource named esper.cfg.xml. @@ -1060,6 +1171,7 @@ public Configuration Configure() Configure('/' + ESPER_DEFAULT_CONFIG); return this; } + /// /// Use the configuration specified in the given application /// resource. The format of the resource is defined in @@ -1086,6 +1198,7 @@ public Configuration Configure(string resource) .DoConfigure(this, stream, resource); return this; } + /// /// Use the configuration specified by the given URL. /// The format of the document obtained from the URL is defined in @@ -1111,6 +1224,7 @@ public Configuration Configure(Uri url) throw new EPException("could not configure from URL: " + url, ioe); } } + /// /// Use the configuration specified in the given application /// file. The format of the file is defined in @@ -1138,6 +1252,7 @@ public Configuration Configure(FileInfo configFile) } return this; } + public bool RemoveEventType(string eventTypeName, bool force) { _eventClasses.Remove(eventTypeName); @@ -1152,19 +1267,23 @@ public bool RemoveEventType(string eventTypeName, bool force) _variantStreams.Remove(eventTypeName); return true; } + public ICollection GetVariableNameUsedBy(string variableName) { throw new UnsupportedOperationException( "Get variable use information is only available in runtime configuration"); } + public bool RemoveVariable(string name, bool force) { return _variables.Remove(name); } + public void AddEventTypeAvro(string eventTypeName, ConfigurationEventTypeAvro avro) { _eventTypesAvro.Put(eventTypeName, avro); } + /// /// Use the mappings and properties specified in the given XML document. /// The format of the file is defined in @@ -1184,7 +1303,10 @@ public Configuration Configure(XmlDocument document) _container.Resolve().DoConfigure(this, document); return this; } - /// Reset to an empty configuration. + + /// + /// Reset to an empty configuration. + /// protected void Reset() { _eventClasses = new Dictionary(); @@ -1217,7 +1339,10 @@ protected void Reset() _objectArrayTypeConfigurations = new Dictionary(); _transientConfiguration = new Dictionary(); } - /// Use these imports until the user specifies something else. + + /// + /// Use these imports until the user specifies something else. + /// private void AddDefaultImports() { _imports.Add(new AutoImportDesc("System")); @@ -1227,6 +1352,7 @@ private void AddDefaultImports() _imports.Add(new AutoImportDesc(typeof(BeaconSource).Namespace, (string) null)); } } + public static class ConfigurationExtensions { public static void AddPlugInVirtualDataWindow( @@ -1238,6 +1364,7 @@ public static void AddPlugInVirtualDataWindow( configuration.AddPlugInVirtualDataWindow( @namespace, name, factoryClass.AssemblyQualifiedName); } + public static void AddPlugInVirtualDataWindow( this Configuration configuration, string @namespace,