diff --git a/org.talend.core.repository/src/main/java/org/talend/core/repository/IDBMetadataProvider.java b/org.talend.core.repository/src/main/java/org/talend/core/repository/IDBMetadataProvider.java index ac84fe6b07..9dd80053dd 100644 --- a/org.talend.core.repository/src/main/java/org/talend/core/repository/IDBMetadataProvider.java +++ b/org.talend.core.repository/src/main/java/org/talend/core/repository/IDBMetadataProvider.java @@ -28,9 +28,9 @@ public interface IDBMetadataProvider { public Map getConnectionMap(); /** test connection used for test a connection,for example ,click "check" button on database wizard **/ - public ConnectionStatus testConnection(String dbType, String url, String username, String pwd, String schema, String server, - String port, final String driverClassName, final String driverJarPath, String dbVersionString, String additionalParam); + String port, final String driverClassName, final String driverJarPath, String dbVersionString, + String additionalParam, Map otherParameters); /** when check connection ,will update the package,this one no use for HBASE **/ public void updatePackage(IMetadataConnection metadataConnection); diff --git a/org.talend.core.runtime/META-INF/MANIFEST.MF b/org.talend.core.runtime/META-INF/MANIFEST.MF index 2494573694..52d154d7df 100644 --- a/org.talend.core.runtime/META-INF/MANIFEST.MF +++ b/org.talend.core.runtime/META-INF/MANIFEST.MF @@ -6,6 +6,7 @@ Bundle-Version: 2.2.0.qualifier Bundle-Localization: plugin Bundle-Vendor: .Talend SA. Export-Package: org.talend.core, + org.talend.core.classloader, org.talend.core.context, org.talend.core.database, org.talend.core.database.conn, diff --git a/org.talend.core.runtime/plugin.xml b/org.talend.core.runtime/plugin.xml index 0745abc826..31b0173fa0 100644 --- a/org.talend.core.runtime/plugin.xml +++ b/org.talend.core.runtime/plugin.xml @@ -8,6 +8,7 @@ + diff --git a/org.talend.core.runtime/schema/classloader_provider.exsd b/org.talend.core.runtime/schema/classloader_provider.exsd new file mode 100644 index 0000000000..c8a069c503 --- /dev/null +++ b/org.talend.core.runtime/schema/classloader_provider.exsd @@ -0,0 +1,106 @@ + + + + + + + + + [Enter description of this extension point.] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The index to search the classloader. + + + + + + + Libraries which classloader search class from. If have multiple values use semicolon to separate. + + + + + + + + + + + + [Enter the first release in which this extension point appears.] + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + diff --git a/org.talend.core.runtime/src/main/java/org/talend/core/classloader/ClassLoaderFactory.java b/org.talend.core.runtime/src/main/java/org/talend/core/classloader/ClassLoaderFactory.java new file mode 100644 index 0000000000..6cfd461479 --- /dev/null +++ b/org.talend.core.runtime/src/main/java/org/talend/core/classloader/ClassLoaderFactory.java @@ -0,0 +1,146 @@ +// ============================================================================ +// +// Copyright (C) 2006-2012 Talend Inc. - www.talend.com +// +// This source code is available under agreement available at +// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt +// +// You should have received a copy of the agreement +// along with this program; if not, write to Talend SA +// 9 rue Pages 92150 Suresnes, France +// +// ============================================================================ +package org.talend.core.classloader; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Platform; +import org.talend.commons.ui.runtime.exception.ExceptionHandler; +import org.talend.commons.utils.workbench.resources.ResourceUtils; +import org.talend.core.GlobalServiceRegister; +import org.talend.core.ILibraryManagerService; +import org.talend.core.model.general.Project; +import org.talend.repository.ProjectManager; +import org.talend.utils.io.FilesUtils; + +/** + * DOC ycbai class global comment. Detailled comment + */ +public class ClassLoaderFactory { + + private static Logger log = Logger.getLogger(ClassLoaderFactory.class); + + private final static String EXTENSION_POINT_ID = "org.talend.core.runtime.classloader_provider"; //$NON-NLS-1$ + + private static IConfigurationElement[] configurationElements = null; + + private final static String SEPARATOR = ";"; //$NON-NLS-1$ + + private final static String PATH_SEPARATOR = "/"; //$NON-NLS-1$ + + private static Map classLoadersMap = null; + + private static final String INDEX_ATTR = "index"; //$NON-NLS-1$ + + private static final String LIB_ATTR = "libraries"; //$NON-NLS-1$ + + static { + IExtensionRegistry registry = Platform.getExtensionRegistry(); + configurationElements = registry.getConfigurationElementsFor(EXTENSION_POINT_ID); + } + + public static ClassLoader getClassLoader(String index) { + if (classLoadersMap == null) { + initClassLoaders(); + } + + return classLoadersMap.get(index); + } + + private static void initClassLoaders() { + File tmpFolder = getTmpFolder(); + if (tmpFolder.exists()) { + FilesUtils.removeFolder(tmpFolder, true); + } + classLoadersMap = new HashMap(); + for (IConfigurationElement current : configurationElements) { + String index = current.getAttribute(INDEX_ATTR); + String libraries = current.getAttribute(LIB_ATTR); + if (StringUtils.isNotEmpty(index)) { + DynamicClassLoader classLoader = new DynamicClassLoader(); + if (StringUtils.isNotEmpty(libraries)) { + String[] librariesArray = libraries.split(SEPARATOR); + List jarPathList = retrieveJarPaths(librariesArray); + classLoader.addLibraries(jarPathList); + } + classLoadersMap.put(index, classLoader); + } + } + } + + private static List retrieveJarPaths(String[] driversArray) { + List jarPathList = new ArrayList(); + if (driversArray == null || driversArray.length == 0) { + return jarPathList; + } + + ILibraryManagerService librairesManagerService = (ILibraryManagerService) GlobalServiceRegister.getDefault().getService( + ILibraryManagerService.class); + String libPath = getLibPath(); + for (String driverName : driversArray) { + String jarPath = libPath + PATH_SEPARATOR + driverName; + File jarFile = new File(jarPath); + if (!jarFile.exists()) { + boolean retrieved = librairesManagerService.retrieve(driverName, libPath, new NullProgressMonitor()); + if (!retrieved) { + log.warn("Cannot retrieve lib: " + driverName); + } + } + jarPathList.add(jarFile.getAbsolutePath()); + } + + return jarPathList; + } + + private static String getLibPath() { + File tmpFolder = getTmpFolder(); + if (!tmpFolder.exists()) { + tmpFolder.mkdirs(); + } + try { + tmpFolder = File.createTempFile("libs", null, tmpFolder); //$NON-NLS-1$ + if (tmpFolder.exists() && tmpFolder.isFile()) { + tmpFolder.delete(); + tmpFolder.mkdirs(); + } + } catch (IOException e) { + } + return tmpFolder.getAbsolutePath(); + } + + private static File getTmpFolder() { + Project project = ProjectManager.getInstance().getCurrentProject(); + IProject physProject; + String tmpFolderPath = System.getProperty("user.dir"); //$NON-NLS-1$ + try { + physProject = ResourceUtils.getProject(project.getTechnicalLabel()); + tmpFolderPath = physProject.getFolder("temp").getLocation().toPortableString(); //$NON-NLS-1$ + } catch (Exception e) { + ExceptionHandler.process(e); + } + tmpFolderPath = tmpFolderPath + "/libraries"; //$NON-NLS-1$ + + return new File(tmpFolderPath); + } +} diff --git a/org.talend.core.runtime/src/main/java/org/talend/core/classloader/DynamicClassLoader.java b/org.talend.core.runtime/src/main/java/org/talend/core/classloader/DynamicClassLoader.java new file mode 100644 index 0000000000..ea1b430a8a --- /dev/null +++ b/org.talend.core.runtime/src/main/java/org/talend/core/classloader/DynamicClassLoader.java @@ -0,0 +1,54 @@ +// ============================================================================ +// +// Copyright (C) 2006-2012 Talend Inc. - www.talend.com +// +// This source code is available under agreement available at +// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt +// +// You should have received a copy of the agreement +// along with this program; if not, write to Talend SA +// 9 rue Pages 92150 Suresnes, France +// +// ============================================================================ +package org.talend.core.classloader; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.List; + +import org.talend.commons.ui.runtime.exception.ExceptionHandler; + +/** + * DOC ycbai class global comment. Detailled comment + */ +public class DynamicClassLoader extends URLClassLoader { + + /** + * DOC ycbai DynamicClassLoader constructor comment. + */ + public DynamicClassLoader() { + super(new URL[0], DynamicClassLoader.class.getClassLoader()); + } + + public void addLibraries(String lib) { + if (lib != null) { + File libFile = new File(lib); + try { + addURL(libFile.toURL()); + } catch (MalformedURLException e) { + ExceptionHandler.process(e); + } + } + } + + public void addLibraries(List libs) { + if (libs != null && libs.size() > 0) { + for (String lib : libs) { + addLibraries(lib); + } + } + } + +} diff --git a/org.talend.commons.runtime/src/org/talend/commons/utils/data/reflection/ReflectionUtils.java b/org.talend.core.runtime/src/main/java/org/talend/core/utils/ReflectionUtils.java similarity index 99% rename from org.talend.commons.runtime/src/org/talend/commons/utils/data/reflection/ReflectionUtils.java rename to org.talend.core.runtime/src/main/java/org/talend/core/utils/ReflectionUtils.java index 50694511b1..2aed9bb152 100644 --- a/org.talend.commons.runtime/src/org/talend/commons/utils/data/reflection/ReflectionUtils.java +++ b/org.talend.core.runtime/src/main/java/org/talend/core/utils/ReflectionUtils.java @@ -10,7 +10,7 @@ // 9 rue Pages 92150 Suresnes, France // // ============================================================================ -package org.talend.commons.utils.data.reflection; +package org.talend.core.utils; import java.lang.reflect.Array; import java.lang.reflect.Constructor; diff --git a/org.talend.metadata.managment.ui/src/main/java/org/talend/repository/ui/utils/ManagerConnection.java b/org.talend.metadata.managment.ui/src/main/java/org/talend/repository/ui/utils/ManagerConnection.java index 05f3596e60..279dbc1a49 100644 --- a/org.talend.metadata.managment.ui/src/main/java/org/talend/repository/ui/utils/ManagerConnection.java +++ b/org.talend.metadata.managment.ui/src/main/java/org/talend/repository/ui/utils/ManagerConnection.java @@ -76,6 +76,8 @@ public class ManagerConnection { private String driverJarPath; + private Map otherParameters; + IMetadataConnection oldConnection; /** @@ -111,6 +113,15 @@ public class ManagerConnection { } + public void setValue(Integer id, final String dbType, final String url, final String server, final String username, + final String password, final String sidOrDatabase, final String port, final String file, final String datasource, + final String schemaOracle, final String additionalParams, final String driverClassName, final String driverJarPath, + final String dbVersionString, Map otherParameters) { + setValue(id, dbType, url, server, username, password, sidOrDatabase, port, file, datasource, schemaOracle, + additionalParams, driverClassName, driverJarPath, dbVersionString); + this.otherParameters = otherParameters; + } + public void setValueProperties(final String sqlSyntax, final String strQuote, final String nullChar) { this.sqlSyntax = sqlSyntax; this.strQuote = strQuote; @@ -118,29 +129,29 @@ public class ManagerConnection { } /** - * Just for Hive embedded mode to check if a remote metastore db can be connected. - * Added by Marvin Wang on Oct 19, 2012. + * Just for Hive embedded mode to check if a remote metastore db can be connected. Added by Marvin Wang on Oct 19, + * 2012. + * * @param properties * @return */ - public boolean checkForHive(Map properties){ - driverJarPath = properties.get(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_DRIVER_JAR); - dbTypeString = properties.get("dbTypeString"); - urlConnectionString = properties.get("urlConnectionString"); - username = properties.get("username"); - password = properties.get("password"); - driverClassName = properties.get("driverClassName"); - dbVersionString = properties.get("dbVersionString"); - additionalParams = properties.get("additionalParams"); - - - ConnectionStatus testConnection = ExtractMetaDataFromDataBase.testConnection(dbTypeString, urlConnectionString, username, + public boolean checkForHive(Map properties) { + driverJarPath = properties.get(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_DRIVER_JAR); + dbTypeString = properties.get("dbTypeString"); + urlConnectionString = properties.get("urlConnectionString"); + username = properties.get("username"); + password = properties.get("password"); + driverClassName = properties.get("driverClassName"); + dbVersionString = properties.get("dbVersionString"); + additionalParams = properties.get("additionalParams"); + + ConnectionStatus testConnection = ExtractMetaDataFromDataBase.testConnection(dbTypeString, urlConnectionString, username, password, "", driverClassName, driverJarPath, dbVersionString, additionalParams); - isValide = testConnection.getResult(); + isValide = testConnection.getResult(); messageException = testConnection.getMessageException(); - return isValide; + return isValide; } - + /** * Check connexion from the fields form. * @@ -156,7 +167,8 @@ public class ManagerConnection { IDBMetadataProvider extractorToUse = ExtractMetaDataFromDataBase.getProviderByDbType(dbTypeString); if (extractorToUse != null) { testConnection = extractorToUse.testConnection(dbTypeString, urlConnectionString, username, password, - schemaOracle, server, port, driverClassName, driverJarPath, dbVersionString, additionalParams); + schemaOracle, server, port, driverClassName, driverJarPath, dbVersionString, additionalParams, + otherParameters); } } else { // MOD xqliu 2012-01-05 TDQ-4162 @@ -212,7 +224,8 @@ public class ManagerConnection { metadataConnection.getUsername(), metadataConnection.getPassword(), metadataConnection.getSchema(), metadataConnection.getServerName(), metadataConnection.getPort(), metadataConnection.getDriverClass(), metadataConnection.getDriverJarPath(), - metadataConnection.getDbVersionString(), metadataConnection.getAdditionalParams()); + metadataConnection.getDbVersionString(), metadataConnection.getAdditionalParams(), + metadataConnection.getOtherParameters()); } } else { if (EDatabaseTypeName.HIVE.getDisplayName().equals(metadataConnection.getDbType())) { diff --git a/org.talend.repository.metadata/src/main/java/org/talend/repository/ui/wizards/metadata/connection/database/DatabaseForm.java b/org.talend.repository.metadata/src/main/java/org/talend/repository/ui/wizards/metadata/connection/database/DatabaseForm.java index f11204eae7..5a0725e1a1 100644 --- a/org.talend.repository.metadata/src/main/java/org/talend/repository/ui/wizards/metadata/connection/database/DatabaseForm.java +++ b/org.talend.repository.metadata/src/main/java/org/talend/repository/ui/wizards/metadata/connection/database/DatabaseForm.java @@ -61,7 +61,6 @@ import org.talend.commons.ui.swt.formtools.UtilsButton; import org.talend.commons.ui.utils.PathUtils; import org.talend.commons.ui.utils.loader.MyURLClassLoader; import org.talend.commons.utils.PasswordEncryptUtil; -import org.talend.commons.utils.data.reflection.ReflectionUtils; import org.talend.core.GlobalServiceRegister; import org.talend.core.ICoreService; import org.talend.core.database.EDatabaseTypeName; @@ -88,6 +87,7 @@ import org.talend.core.model.properties.ConnectionItem; import org.talend.core.prefs.ITalendCorePrefConstants; import org.talend.core.runtime.CoreRuntimePlugin; import org.talend.core.ui.branding.IBrandingConfiguration; +import org.talend.core.utils.ReflectionUtils; import org.talend.cwm.helper.ConnectionHelper; import org.talend.designer.core.model.utils.emf.talendfile.ContextType; import org.talend.repository.metadata.i18n.Messages; @@ -1069,7 +1069,8 @@ public class DatabaseForm extends AbstractForm { isGeneralJDBC() ? generalJdbcPasswordText.getText() : passwordText.getText(), sidOrDatabaseText.getText(), portText.getText(), fileField.getText(), datasourceText.getText(), isGeneralJDBC() ? jDBCschemaText.getText() : schemaText.getText(), additionParamText.getText(), generalJdbcClassNameText.getText(), - generalJdbcDriverjarText.getText(), enableDbVersion() ? versionStr : null); + generalJdbcDriverjarText.getText(), enableDbVersion() ? versionStr : null, metadataconnection + .getOtherParameters()); managerConnection.setDbRootPath(directoryField.getText()); diff --git a/org.talend.repository.metadata/src/main/java/org/talend/repository/ui/wizards/metadata/table/database/SelectorTableForm.java b/org.talend.repository.metadata/src/main/java/org/talend/repository/ui/wizards/metadata/table/database/SelectorTableForm.java index bbea76cb0f..16595c1075 100644 --- a/org.talend.repository.metadata/src/main/java/org/talend/repository/ui/wizards/metadata/table/database/SelectorTableForm.java +++ b/org.talend.repository.metadata/src/main/java/org/talend/repository/ui/wizards/metadata/table/database/SelectorTableForm.java @@ -352,7 +352,8 @@ public class SelectorTableForm extends AbstractForm { if (item.getData() != null) { TableNode node = (TableNode) item.getData(); if (useProvider()) { - if (node.getType() == provider.getRunnableAccessNodeType()) { + if (node.getType() == provider.getRunnableAccessNodeType() + || node.getType() == TableNode.COLUMN_FAMILY) { if (isExistTable(node)) { item.setChecked(true); } else { @@ -1092,8 +1093,8 @@ public class SelectorTableForm extends AbstractForm { && (dbType.equals(EDatabaseTypeName.HSQLDB.getDisplayName()) || dbType.equals(EDatabaseTypeName.HSQLDB_SERVER.getDisplayName()) || dbType.equals(EDatabaseTypeName.HSQLDB_WEBSERVER.getDisplayName()) || dbType - .equals(EDatabaseTypeName.HSQLDB_IN_PROGRESS.getDisplayName())) - || EDatabaseTypeName.HIVE.getDisplayName().equalsIgnoreCase(dbType)) { + .equals(EDatabaseTypeName.HSQLDB_IN_PROGRESS.getDisplayName())) + || EDatabaseTypeName.HIVE.getDisplayName().equalsIgnoreCase(dbType)) { ExtractMetaDataUtils.closeConnection(); } if (derbyDriver != null) { @@ -1124,28 +1125,28 @@ public class SelectorTableForm extends AbstractForm { if (EDatabaseTypeName.HIVE.getDisplayName().equals(metadataconnection.getDbType())) { String key = (String) metadataconnection.getParameter(ConnParameterKeys.CONN_PARA_KEY_HIVE_MODE); if (HiveConnVersionInfo.MODE_EMBEDDED.getKey().equals(key)) { - Map properties = new HashMap(); - properties.put(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_DRIVER_JAR, (String)metadataconnection - .getParameter(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_DRIVER_JAR)); - properties.put("dbTypeString", metadataconnection.getDbType()); - properties.put("urlConnectionString",(String)metadataconnection - .getParameter(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_URL)); - properties.put("username",(String)metadataconnection - .getParameter(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_USERNAME)); - properties.put("password",(String)metadataconnection - .getParameter(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_PASSWORD)); - properties.put("driverClassName",(String)metadataconnection - .getParameter(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_DRIVER_NAME)); - properties.put("dbVersionString",metadataconnection.getDbVersionString()); - properties.put("additionalParams",metadataconnection.getAdditionalParams()); - - managerConnection.checkForHive(properties); - - }else if(HiveConnVersionInfo.MODE_STANDALONE.getKey().equals(key)){ - managerConnection.check(metadataconnection, true); + Map properties = new HashMap(); + properties.put(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_DRIVER_JAR, (String) metadataconnection + .getParameter(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_DRIVER_JAR)); + properties.put("dbTypeString", metadataconnection.getDbType()); + properties.put("urlConnectionString", + (String) metadataconnection.getParameter(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_URL)); + properties.put("username", (String) metadataconnection + .getParameter(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_USERNAME)); + properties.put("password", (String) metadataconnection + .getParameter(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_PASSWORD)); + properties.put("driverClassName", (String) metadataconnection + .getParameter(ConnParameterKeys.CONN_PARA_KEY_METASTORE_CONN_DRIVER_NAME)); + properties.put("dbVersionString", metadataconnection.getDbVersionString()); + properties.put("additionalParams", metadataconnection.getAdditionalParams()); + + managerConnection.checkForHive(properties); + + } else if (HiveConnVersionInfo.MODE_STANDALONE.getKey().equals(key)) { + managerConnection.check(metadataconnection, true); } - }else - managerConnection.check(metadataconnection, true); + } else + managerConnection.check(metadataconnection, true); if (managerConnection.getIsValide()) { // need to check catalog/schema if import a old db connection /* use extractor for the databse didn't use JDBC,for example: HBase */