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$
}