[teiid-commits] teiid SVN: r562 - in trunk: embedded/src/main/java/com/metamatrix/dqp/embedded and 7 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Sat Mar 14 15:42:40 EDT 2009
Author: rareddy
Date: 2009-03-14 15:42:40 -0400 (Sat, 14 Mar 2009)
New Revision: 562
Modified:
trunk/connector-api/src/main/java/org/teiid/connector/internal/ConnectorPropertyNames.java
trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/DQPEmbeddedProperties.java
trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/admin/DQPConfigAdminImpl.java
trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/services/EmbeddedConfigurationService.java
trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/services/EmbeddedDataService.java
trunk/engine/src/main/java/com/metamatrix/dqp/service/ConfigurationService.java
trunk/server/src/main/java/com/metamatrix/admin/server/ServerConfigAdminImpl.java
trunk/server/src/main/java/com/metamatrix/server/connector/service/ConnectorService.java
trunk/server/src/main/java/com/metamatrix/server/query/service/QueryService.java
trunk/server/src/main/java/com/metamatrix/server/util/ServerPropertyNames.java
Log:
TEIID-418: added a two properties "ConnectorTypeProperties" and "CommonExtensionClassPath" to system. Common extension is defined user when they add a udf, or membership domain etc, they can modify this using console. ConnectorTypeClasspath defined by build process for defining the classpath for a connector. If user wants to add driver they can add either to extension classpath, or previous connector classpath.
Modified: trunk/connector-api/src/main/java/org/teiid/connector/internal/ConnectorPropertyNames.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/internal/ConnectorPropertyNames.java 2009-03-14 17:34:13 UTC (rev 561)
+++ trunk/connector-api/src/main/java/org/teiid/connector/internal/ConnectorPropertyNames.java 2009-03-14 19:42:40 UTC (rev 562)
@@ -95,6 +95,8 @@
public static final String USING_CUSTOM_CLASSLOADER = "UsingCustomClassloader"; //$NON-NLS-1$
public static final String CONNECTOR_CLASSPATH = "ConnectorClassPath"; //$NON-NLS-1$
+
+ public static final String CONNECTOR_TYPE_CLASSPATH = "ConnectorTypeClassPath"; //$NON-NLS-1$
public static final String IS_XA = "IsXA"; //$NON-NLS-1$
Modified: trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/DQPEmbeddedProperties.java
===================================================================
--- trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/DQPEmbeddedProperties.java 2009-03-14 17:34:13 UTC (rev 561)
+++ trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/DQPEmbeddedProperties.java 2009-03-14 19:42:40 UTC (rev 562)
@@ -35,7 +35,7 @@
public static final String DQP_METADATA_SYSTEMURL = "dqp.metadata.systemURL"; //$NON-NLS-1$
public static final String VDB_DEFINITION = "vdb.definition"; //$NON-NLS-1$
public static final String USER_DEFINED_FUNCTIONS = "dqp.userDefinedFunctionsFile"; //$NON-NLS-1$
- public static final String USER_DEFINED_FUNCTIONS_CLASPATH = "dqp.userDefinedFunctionsClasspath"; //$NON-NLS-1$
+ public static final String COMMON_EXTENSION_CLASPATH = "dqp.extension.CommonClasspath"; //$NON-NLS-1$
public static final String DQP_KEYSTORE = "dqp.keystore"; //$NON-NLS-1$
public static final String DQP_IDENTITY = "dqp.identity"; //$NON-NLS-1$
public static final String DQP_TMPDIR = "mm.io.tmpdir"; //$NON-NLS-1$
Modified: trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/admin/DQPConfigAdminImpl.java
===================================================================
--- trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/admin/DQPConfigAdminImpl.java 2009-03-14 17:34:13 UTC (rev 561)
+++ trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/admin/DQPConfigAdminImpl.java 2009-03-14 19:42:40 UTC (rev 562)
@@ -28,6 +28,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
+import java.util.StringTokenizer;
import com.metamatrix.admin.api.embedded.EmbeddedConfigAdmin;
import com.metamatrix.admin.api.exception.AdminComponentException;
@@ -208,7 +209,7 @@
saveConnectorType(type);
}
else {
- throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.Connector_type_exists", new Object[] {deployName})); //$NON-NLS-1$
+ throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.Connector_type_exists", deployName)); //$NON-NLS-1$
}
} catch (MetaMatrixComponentException e) {
throw new AdminComponentException(e);
@@ -259,7 +260,7 @@
if (bindingExists(deployName)) {
// Based on users preference, either add or replace or ignore
if (options.containsOption(AdminOptions.OnConflict.EXCEPTION)) {
- throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.addBindingEixists", new String[] {deployName})); //$NON-NLS-1$
+ throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.addBindingEixists", deployName)); //$NON-NLS-1$
}
else if (options.containsOption(AdminOptions.OnConflict.IGNORE)) {
binding = getDataService().getConnectorBinding(deployName);
@@ -270,7 +271,7 @@
// Get the connector type
ConnectorBindingType ctype = getConfigurationService().getConnectorType(type);
if (ctype == null) {
- throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.connector_type_not_exists", new String[] {type})); //$NON-NLS-1$
+ throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.connector_type_not_exists", type)); //$NON-NLS-1$
}
// Build the connector binding with informatin we know.
@@ -330,7 +331,7 @@
if (bindingExists(deployName)) {
// Based on users preference, either add or replace or ignore
if (options.containsOption(AdminOptions.OnConflict.EXCEPTION)) {
- throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.addBindingEixists", new String[] {deployName})); //$NON-NLS-1$
+ throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.addBindingEixists", deployName)); //$NON-NLS-1$
}
else if (options.containsOption(AdminOptions.OnConflict.IGNORE)) {
binding = getDataService().getConnectorBinding(deployName);
@@ -347,7 +348,7 @@
// preferences in the admin options, same rules apply as binding.
if (bindingTypeExists(type.getName())) {
if (options.containsOption(AdminOptions.OnConflict.EXCEPTION)) {
- throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.addBinding_type_exists", new String[] {deployName, type.getName()})); //$NON-NLS-1$
+ throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.addBinding_type_exists", deployName, type.getName())); //$NON-NLS-1$
}
}
@@ -528,7 +529,7 @@
if (bindingExists(deployName)) {
if (options.containsOption(AdminOptions.OnConflict.EXCEPTION)) {
- throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.addBindingEixists", new String[] {binding.getDeployedName()})); //$NON-NLS-1$
+ throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.addBindingEixists", binding.getDeployedName())); //$NON-NLS-1$
}
}
@@ -636,7 +637,7 @@
getConfigurationService().saveExtensionModule(extModule);
}
else {
- throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.extension_module_exists", new Object[] {sourceName})); //$NON-NLS-1$
+ throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.extension_module_exists", sourceName)); //$NON-NLS-1$
}
} catch (MetaMatrixComponentException e) {
throw new AdminComponentException(e);
@@ -867,7 +868,7 @@
// if not asked to overwrite/skip writing them
if (options.containsOption(AdminOptions.OnConflict.EXCEPTION)) {
- throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.Connector_type_exists", new Object[] {connectorName})); //$NON-NLS-1$
+ throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.Connector_type_exists", connectorName)); //$NON-NLS-1$
} else if (options.containsOption(AdminOptions.OnConflict.IGNORE)) {
continue;
} else if (options.containsOption(AdminOptions.OnConflict.OVERWRITE)){
@@ -933,7 +934,7 @@
// if we found it take approprite action.
if(previousModule != null && options.containsOption(AdminOptions.OnConflict.EXCEPTION)) {
- throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.extension_module_exists", new Object[] {previousModule.getFullName()})); //$NON-NLS-1$
+ throw new AdminProcessingException(DQPEmbeddedPlugin.Util.getString("Admin.extension_module_exists", previousModule.getFullName())); //$NON-NLS-1$
}
else if (previousModule != null && options.containsOption(AdminOptions.OnConflict.IGNORE)) {
add = false;
@@ -1030,9 +1031,24 @@
// add the function definitions as extension modules
addExtensionModule(ExtensionModule.FUNCTION_DEFINITION_TYPE,ConfigurationService.USER_DEFINED_FUNCTION_MODEL,modelFileContents, "User Defined Functions File"); //$NON-NLS-1$
+ String commonpath = getConfigurationService().getSystemProperties().getProperty(DQPEmbeddedProperties.COMMON_EXTENSION_CLASPATH, ""); //$NON-NLS-1$
+
+ StringBuilder sb = new StringBuilder();
+ if (classpath != null && classpath.length() > 0 ) {
+ StringTokenizer st = new StringTokenizer(classpath, ";"); //$NON-NLS-1$
+ while (st.hasMoreTokens()) {
+ String partpath = st.nextToken();
+ if (commonpath.indexOf(partpath) == -1) {
+ sb.append(partpath).append(";"); //$NON-NLS-1$
+ }
+ }
+ }
+ setSystemProperty(DQPEmbeddedProperties.COMMON_EXTENSION_CLASPATH, sb.toString()+commonpath);
+
+
// then update the properties
Properties p = new Properties();
- p.setProperty(DQPEmbeddedProperties.USER_DEFINED_FUNCTIONS_CLASPATH,classpath);
+ p.setProperty(DQPEmbeddedProperties.COMMON_EXTENSION_CLASPATH, classpath);
getConfigurationService().updateSystemProperties(p);
// reload the new UDF
getConfigurationService().loadUDF();
Modified: trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/services/EmbeddedConfigurationService.java
===================================================================
--- trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/services/EmbeddedConfigurationService.java 2009-03-14 17:34:13 UTC (rev 561)
+++ trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/services/EmbeddedConfigurationService.java 2009-03-14 19:42:40 UTC (rev 562)
@@ -218,10 +218,10 @@
}
/**
- * @see com.metamatrix.dqp.service.ConfigurationService#getUDFClasspath()
+ * @see com.metamatrix.dqp.service.ConfigurationService#getCommonExtensionClasspath()
*/
- public URL[] getUDFClasspath() {
- String classpath= userPreferences.getProperty(DQPEmbeddedProperties.USER_DEFINED_FUNCTIONS_CLASPATH);
+ public URL[] getCommonExtensionClasspath() {
+ String classpath= userPreferences.getProperty(DQPEmbeddedProperties.COMMON_EXTENSION_CLASPATH);
if (valid(classpath)) {
try {
URL context = getExtensionPath();
@@ -929,7 +929,7 @@
public void loadUDF() throws MetaMatrixComponentException {
URL udfFile = getUDFFile();
if(udfFile != null && exists(udfFile)) {
- URL[] urls = getUDFClasspath();
+ URL[] urls = getCommonExtensionClasspath();
try {
this.udfSource = new UDFSource(udfFile, urls);
FunctionLibraryManager.registerSource(this.udfSource);
Modified: trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/services/EmbeddedDataService.java
===================================================================
--- trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/services/EmbeddedDataService.java 2009-03-14 17:34:13 UTC (rev 561)
+++ trunk/embedded/src/main/java/com/metamatrix/dqp/embedded/services/EmbeddedDataService.java 2009-03-14 19:42:40 UTC (rev 562)
@@ -53,6 +53,7 @@
import com.metamatrix.common.vdb.api.VDBDefn;
import com.metamatrix.core.vdb.VDBStatus;
import com.metamatrix.dqp.embedded.DQPEmbeddedPlugin;
+import com.metamatrix.dqp.embedded.DQPEmbeddedProperties;
import com.metamatrix.dqp.embedded.configuration.ExtensionModuleReader;
import com.metamatrix.dqp.internal.datamgr.ConnectorID;
import com.metamatrix.dqp.internal.datamgr.impl.ConnectorManager;
@@ -563,8 +564,8 @@
try {
// Ask the configuration if we can use the extension class loader.
- boolean useExtensionClassPath = (getConfigurationService().useExtensionClasspath());
- String classPath = connectorProperties.getProperty(ConnectorPropertyNames.CONNECTOR_CLASSPATH);
+ boolean useExtensionClassPath = (getConfigurationService().useExtensionClasspath());
+ String classPath = buildClasspath(connectorProperties);
if (classPath == null || classPath.length() == 0) {
useExtensionClassPath = false;
}
@@ -587,4 +588,21 @@
}
}
+ private String buildClasspath(Properties connectorProperties) {
+ StringBuilder sb = new StringBuilder();
+ appendlasspath(connectorProperties.getProperty(ConnectorPropertyNames.CONNECTOR_CLASSPATH), sb); // this is user defined, could be very specific to the binding
+ appendlasspath(connectorProperties.getProperty(DQPEmbeddedProperties.COMMON_EXTENSION_CLASPATH), sb); // this is common to the engine
+ appendlasspath(connectorProperties.getProperty(ConnectorPropertyNames.CONNECTOR_TYPE_CLASSPATH), sb); // this is system defined; type classpath
+ return sb.toString();
+ }
+
+ private void appendlasspath(String path, StringBuilder builder) {
+ if (path != null && path.length() > 0) {
+ builder.append(path);
+ if (!path.endsWith(";")) { //$NON-NLS-1$
+ builder.append(";"); //$NON-NLS-1$
+ }
+ }
+ }
+
}
Modified: trunk/engine/src/main/java/com/metamatrix/dqp/service/ConfigurationService.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/dqp/service/ConfigurationService.java 2009-03-14 17:34:13 UTC (rev 561)
+++ trunk/engine/src/main/java/com/metamatrix/dqp/service/ConfigurationService.java 2009-03-14 19:42:40 UTC (rev 562)
@@ -98,11 +98,11 @@
public URL getUDFFile();
/**
- * Get the user defined function's implementation jar file classpath. The jar
+ * Get the user defined extension file classpath. The jar
* files are loaded usually as the extension modules.
* @return URL[] - Classpath for the UDF jar files
*/
- public URL[] getUDFClasspath();
+ public URL[] getCommonExtensionClasspath();
/**
* URL to Log file name
Modified: trunk/server/src/main/java/com/metamatrix/admin/server/ServerConfigAdminImpl.java
===================================================================
--- trunk/server/src/main/java/com/metamatrix/admin/server/ServerConfigAdminImpl.java 2009-03-14 17:34:13 UTC (rev 561)
+++ trunk/server/src/main/java/com/metamatrix/admin/server/ServerConfigAdminImpl.java 2009-03-14 19:42:40 UTC (rev 562)
@@ -38,6 +38,7 @@
import java.util.Map;
import java.util.Properties;
import java.util.Set;
+import java.util.StringTokenizer;
import com.metamatrix.admin.AdminPlugin;
import com.metamatrix.admin.api.exception.AdminComponentException;
@@ -122,6 +123,7 @@
import com.metamatrix.platform.service.api.exception.ServiceException;
import com.metamatrix.server.admin.apiimpl.MaterializationLoadScriptsImpl;
import com.metamatrix.server.admin.apiimpl.RuntimeMetadataHelper;
+import com.metamatrix.server.util.ServerPropertyNames;
/**
* @since 4.3
@@ -677,7 +679,7 @@
Collection existingBindings = parent.getConnectorBindingsInVDB(vdb.getName());
// AdminOptions checking here.
- Collection totalBindings = getBindingNamesToUpdate(existingBindings, newBindingNames, options);
+ getBindingNamesToUpdate(existingBindings, newBindingNames, options);
// Update connector bindings only if OVERWRITE option given. VDBDefnImport will take
// care of adding any bindings that are new to the VDB.
@@ -2238,6 +2240,7 @@
* @see com.metamatrix.admin.api.core.CoreConfigAdmin#addUDF(byte[], java.lang.String)
*/
public void addUDF(byte[] modelFileContents, String classpath) throws AdminException {
+ classpath = classpath.trim();
try {
deleteExtensionModule(FUNCTION_DEFINITIONS_MODEL);
} catch (AdminException e) {
@@ -2245,8 +2248,20 @@
}
// add the function definitions as extension modules
- addExtensionModule(ExtensionModule.FUNCTION_DEFINITION_TYPE, FUNCTION_DEFINITIONS_MODEL, modelFileContents, "User Defined Functions File"); //$NON-NLS-1$
- setSystemProperty("metamatrix.server.UDFClasspath", classpath); //$NON-NLS-1$
+ addExtensionModule(ExtensionModule.FUNCTION_DEFINITION_TYPE, FUNCTION_DEFINITIONS_MODEL, modelFileContents, "User Defined Functions File"); //$NON-NLS-1$
+ String commonpath = CurrentConfiguration.getInstance().getProperties().getProperty(ServerPropertyNames.COMMON_EXTENSION_CLASPATH, ""); //$NON-NLS-1$
+
+ StringBuilder sb = new StringBuilder();
+ if (classpath != null && classpath.length() > 0 ) {
+ StringTokenizer st = new StringTokenizer(classpath, ";"); //$NON-NLS-1$
+ while (st.hasMoreTokens()) {
+ String partpath = st.nextToken();
+ if (commonpath.indexOf(partpath) == -1) {
+ sb.append(partpath).append(";"); //$NON-NLS-1$
+ }
+ }
+ }
+ setSystemProperty(ServerPropertyNames.COMMON_EXTENSION_CLASPATH, sb.toString()+commonpath);
}
/**
@@ -2254,7 +2269,6 @@
*/
public void deleteUDF() throws AdminException {
deleteExtensionModule(FUNCTION_DEFINITIONS_MODEL);
- setSystemProperty("metamatrix.server.UDFClasspath", ""); //$NON-NLS-1$ //$NON-NLS-2$
}
@Override
Modified: trunk/server/src/main/java/com/metamatrix/server/connector/service/ConnectorService.java
===================================================================
--- trunk/server/src/main/java/com/metamatrix/server/connector/service/ConnectorService.java 2009-03-14 17:34:13 UTC (rev 561)
+++ trunk/server/src/main/java/com/metamatrix/server/connector/service/ConnectorService.java 2009-03-14 19:42:40 UTC (rev 562)
@@ -264,7 +264,7 @@
// Decrypt masked properties
Properties deMaskedProps = decryptMaskedProperties(props);
- String urls = deMaskedProps.getProperty(ConnectorPropertyNames.CONNECTOR_CLASSPATH);
+ String urls = buildClasspath(deMaskedProps);
ClassLoader loader = getCustomClassLoader(urls);
// Build a Connector manager using the custom class loader and initialize
@@ -307,6 +307,23 @@
}
}
+ private String buildClasspath(Properties connectorProperties) {
+ StringBuilder sb = new StringBuilder();
+ appendlasspath(connectorProperties.getProperty(ConnectorPropertyNames.CONNECTOR_CLASSPATH), sb); // this is user defined, could be very specific to the binding
+ appendlasspath(connectorProperties.getProperty(ServerPropertyNames.COMMON_EXTENSION_CLASPATH), sb); // this is common to the engine
+ appendlasspath(connectorProperties.getProperty(ConnectorPropertyNames.CONNECTOR_TYPE_CLASSPATH), sb); // this is system defined; type classpath
+ return sb.toString();
+ }
+
+ private void appendlasspath(String path, StringBuilder builder) {
+ if (path != null && path.length() > 0) {
+ builder.append(path);
+ if (!path.endsWith(";")) { //$NON-NLS-1$
+ builder.append(";"); //$NON-NLS-1$
+ }
+ }
+ }
+
/**
* Close the service to new work if applicable. After this method is called
* the service should no longer accept new work to perform but should continue
@@ -484,10 +501,7 @@
try {
propValue = CryptoUtil.stringDecrypt(propValue);
} catch (CryptoException e) {
- throw new ApplicationInitializationException(e,
- ServerPlugin.Util.getString(
- "ConnectorService.Failed_decrypting_masked_prop", //$NON-NLS-1$
- propName));
+ throw new ApplicationInitializationException(e,ServerPlugin.Util.getString("ConnectorService.Failed_decrypting_masked_prop", propName)); //$NON-NLS-1$
}
}
result.setProperty(propName, propValue);
Modified: trunk/server/src/main/java/com/metamatrix/server/query/service/QueryService.java
===================================================================
--- trunk/server/src/main/java/com/metamatrix/server/query/service/QueryService.java 2009-03-14 17:34:13 UTC (rev 561)
+++ trunk/server/src/main/java/com/metamatrix/server/query/service/QueryService.java 2009-03-14 19:42:40 UTC (rev 562)
@@ -61,6 +61,7 @@
import com.metamatrix.server.ServerPlugin;
import com.metamatrix.server.dqp.config.PlatformConfigSource;
import com.metamatrix.server.util.LogConstants;
+import com.metamatrix.server.util.ServerPropertyNames;
/**
* Wraps up a QueryServiceEngine to tie it into the platform concept of services. Is a remote object.
@@ -71,7 +72,6 @@
*/
public class QueryService extends AbstractService implements QueryServiceInterface {
- private static final String UDF_CLASSPATH_PROPERTY = "metamatrix.server.UDFClasspath"; //$NON-NLS-1$
private static final String CLASSPATH_DELIMITER = ";"; //$NON-NLS-1$
private static final String CODE_TABLE_CACHE_NAME = "CodeTableCache"; //$NON-NLS-1$
private static final String PLAN_CACHE_NAME = "PreparedPlanCache"; //$NON-NLS-1$
@@ -107,7 +107,7 @@
private void registerUDFSource(String udfSource) throws IOException {
URL[] urls = null;
- String extensionClasspath = CurrentConfiguration.getInstance().getProperties().getProperty(UDF_CLASSPATH_PROPERTY);
+ String extensionClasspath = CurrentConfiguration.getInstance().getProperties().getProperty(ServerPropertyNames.COMMON_EXTENSION_CLASPATH);
if (extensionClasspath != null && extensionClasspath.trim().length() > 0){
try {
urls = URLFactory.parseURLs(extensionClasspath, CLASSPATH_DELIMITER);
Modified: trunk/server/src/main/java/com/metamatrix/server/util/ServerPropertyNames.java
===================================================================
--- trunk/server/src/main/java/com/metamatrix/server/util/ServerPropertyNames.java 2009-03-14 17:34:13 UTC (rev 561)
+++ trunk/server/src/main/java/com/metamatrix/server/util/ServerPropertyNames.java 2009-03-14 19:42:40 UTC (rev 562)
@@ -44,5 +44,5 @@
*/
public static final String CACHE_CLASS_LOADERS = "metamatrix.server.cacheConnectorClassLoaders"; //$NON-NLS-1$
-
+ public static final String COMMON_EXTENSION_CLASPATH = "metamatrix.extension.CommonClasspath"; //$NON-NLS-1$
}
More information about the teiid-commits
mailing list