// ============================================================================ // // Copyright (C) 2006-2016 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 net.sourceforge.sqlexplorer.service; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.sql.Driver; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import net.sourceforge.sqlexplorer.IConstants; import net.sourceforge.sqlexplorer.Messages; import net.sourceforge.sqlexplorer.dataset.DataSet; import net.sourceforge.sqlexplorer.dataset.actions.ExportCSVAction; import net.sourceforge.sqlexplorer.dataset.mapdb.MapDBColumnSetDataSet; import net.sourceforge.sqlexplorer.dataset.mapdb.MapDBDataSet; import net.sourceforge.sqlexplorer.dataset.mapdb.MapDBSetDataSet; import net.sourceforge.sqlexplorer.dataset.mapdb.TalendDataSet; import net.sourceforge.sqlexplorer.dbdetail.DetailTabManager; import net.sourceforge.sqlexplorer.dbproduct.Alias; import net.sourceforge.sqlexplorer.dbproduct.AliasManager; import net.sourceforge.sqlexplorer.dbproduct.DriverManager; import net.sourceforge.sqlexplorer.dbproduct.ManagedDriver; import net.sourceforge.sqlexplorer.dbproduct.User; import net.sourceforge.sqlexplorer.dbstructure.nodes.DatabaseNode; import net.sourceforge.sqlexplorer.dbstructure.nodes.INode; import net.sourceforge.sqlexplorer.dbstructure.nodes.SchemaNode; import net.sourceforge.sqlexplorer.dbstructure.nodes.TableFolderNode; import net.sourceforge.sqlexplorer.plugin.SQLExplorerPlugin; import net.sourceforge.sqlexplorer.plugin.actions.OpenPasswordConnectDialogAction; import net.sourceforge.sqlexplorer.plugin.editors.SQLEditor; import net.sourceforge.sqlexplorer.plugin.editors.SQLEditorInput; import net.sourceforge.sqlexplorer.plugin.perspectives.SQLExplorerPluginPerspective; import net.sourceforge.sqlexplorer.plugin.views.DatabaseStructureView; import net.sourceforge.sqlexplorer.sqleditor.actions.ExecSQLAction; import net.sourceforge.sqlexplorer.util.AliasAndManaDriverHelper; import net.sourceforge.sqlexplorer.util.MyURLClassLoader; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.talend.commons.utils.io.FilesUtils; import org.talend.core.GlobalServiceRegister; import org.talend.core.ITDQRepositoryService; import org.talend.core.classloader.DynamicClassLoader; import org.talend.core.database.EDatabaseTypeName; import org.talend.core.database.conn.version.EDatabaseVersion4Drivers; import org.talend.core.model.metadata.IMetadataConnection; import org.talend.core.model.metadata.builder.ConvertionHelper; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.metadata.builder.connection.DatabaseConnection; import org.talend.core.model.metadata.builder.database.JavaSqlFactory; import org.talend.core.model.metadata.builder.database.PluginConstant; import org.talend.cwm.helper.CatalogHelper; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.helper.SwitchHelpers; import org.talend.cwm.indicator.ColumnFilter; import org.talend.cwm.indicator.DataValidation; import org.talend.dataprofiler.service.ISqlexplorerService; import org.talend.metadata.managment.hive.HiveClassLoaderFactory; import org.talend.metadata.managment.utils.MetadataConnectionUtils; import orgomg.cwm.foundation.softwaredeployment.DataProvider; import orgomg.cwm.objectmodel.core.ModelElement; import orgomg.cwm.objectmodel.core.Package; import orgomg.cwm.resource.relational.Catalog; import orgomg.cwm.resource.relational.Schema; /** * created by xqliu on 2014-9-15 Detailled comment * */ public class SqlexplorerService implements ISqlexplorerService { private static Logger log = Logger.getLogger(SqlexplorerService.class); public static final String SEMICOLON_STRING = ";";//$NON-NLS-1$ /** * Extension used for the files which is integrated in TOS properties. */ public static final String PROPERTIES_EXTENSION = "properties"; //$NON-NLS-1$ private static SqlexplorerService INSTANCE; public static SqlexplorerService getInstance() { if (INSTANCE == null) { INSTANCE = new SqlexplorerService(); } return INSTANCE; } @Override public void runInDQViewer(DatabaseConnection databaseConnection, String editorName, String query) { String lEditorName = editorName; if (lEditorName == null) { lEditorName = String.valueOf(SQLExplorerPlugin.getDefault().getEditorSerialNo()); } Alias alias = SQLExplorerPlugin.getDefault().getAliasManager().getAlias(databaseConnection.getName()); if (alias == null) { // add the connection to alias and call this method again addConnetionAliasToSQLPlugin(databaseConnection); alias = SQLExplorerPlugin.getDefault().getAliasManager().getAlias(databaseConnection.getName()); } if (alias != null) { runInDQViewer(alias, databaseConnection, lEditorName, query); } } /** * open the sql editor and run it. * * @param alias * @param databaseConnection * @param lEditorName * @param query */ private void runInDQViewer(Alias alias, DatabaseConnection databaseConnection, String lEditorName, String query) { String url = JavaSqlFactory.getURL(databaseConnection); String username = JavaSqlFactory.getUsername(databaseConnection); String password = JavaSqlFactory.getPassword(databaseConnection); SQLEditorInput input = new SQLEditorInput("SQL Editor (" + alias.getName() + "." + lEditorName + ").sql"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ User user = alias.getUser(username); if (PluginConstant.EMPTY_STRING.equals(username)) { // get the user both the dbtype and username are the same. if (!alias.getUrl().equals(url)) { user = new net.sourceforge.sqlexplorer.dbproduct.User(username, password); user.setAlias(alias); alias.addUser(user); } } else { if (user == null) { user = alias.getDefaultUser(); } } alias.setDefaultUser(user); // set IMetadataConnection into the user, if the db type is hive, should use IMetadataConnection to // create the hive connection if (databaseConnection != null) { user.setDatabaseConnection(databaseConnection); // if ManagedDriver class is not Loaded,check if it lack jars then update the realted jar. updateDriverIfClassNotLoad(databaseConnection); } input.setUser(user); // TDQ-9533 append a "limit X" in sql query for vertica database. if (EDatabaseTypeName.VERTICA.getProduct().equals(databaseConnection.getProductId())) { String maxPref = SQLExplorerPlugin.getDefault().getPreferenceStore().getString(IConstants.MAX_SQL_ROWS); int maxNum = maxPref == null ? 100 : Integer.parseInt(maxPref); query = query + " limit " + maxNum; } IWorkbenchPage page = SQLExplorerPlugin.getDefault().getActivePage(); try { SQLEditor editorPart = (SQLEditor) page.openEditor(input, SQLEditor.class.getName()); editorPart.setText(query); new ExecSQLAction(editorPart).run(); } catch (PartInitException e) { log.error(e, e); } } /** * if the sqlexplorer driver is unRegisted,load the driver jar by lib manage system. * * @param sqlPlugin * @param connection * @param databaseConnection */ public void updateDriverIfClassNotLoad(DatabaseConnection databaseConnection) { SQLExplorerPlugin sqlPlugin = SQLExplorerPlugin.getDefault(); DriverManager driverManager = sqlPlugin.getDriverModel(); String driverClassName = JavaSqlFactory.getDriverClass(databaseConnection); if (driverClassName != null) { String id = AliasAndManaDriverHelper.getInstance().joinManagedDriverId(databaseConnection); ManagedDriver manDr = driverManager.getDriver(id); if (manDr != null && !manDr.isDriverClassLoaded()) { loadDriverByLibManageSystem(databaseConnection); } } } @Override public void initSqlExplorerRootProject(IProject rootProject) { if (SQLExplorerPlugin.getDefault().getRootProject() == null) { SQLExplorerPlugin.getDefault().setRootProject(rootProject); } } @Override public void addConnetionAliasToSQLPlugin(ModelElement... dataproviders) { SQLExplorerPlugin sqlPlugin = SQLExplorerPlugin.getDefault(); AliasManager aliasManager = sqlPlugin.getAliasManager(); DriverManager driverManager = sqlPlugin.getDriverModel(); List<String> tdqSupportDBType = MetadataConnectionUtils.getTDQSupportDBTemplate(); // if all dataproviders are not supported on DQ side,don't save files SQLAliases.xml and // SQLDrivers.xml.Otherwise,save it. AliasAndManaDriverHelper aliasManaDriverHelper = AliasAndManaDriverHelper.getInstance(); for (ModelElement dataProvider : dataproviders) { try { Connection connection = SwitchHelpers.CONNECTION_SWITCH.doSwitch(dataProvider); // MOD bug mzhao filter the other connections except database connection. if (connection != null && connection instanceof DatabaseConnection) { // TDQ-8379 do nothing if the database type isn't supproted on DQ side. DatabaseConnection dbConn = ((DatabaseConnection) connection); String databaseType = dbConn.getDatabaseType(); if (!tdqSupportDBType.contains(databaseType)) { continue; } // only new Alias when it is not in aliasManager Alias alias = aliasManager.getAlias(dataProvider.getName()); String url = JavaSqlFactory.getURL(connection); // if the alias is not null and the url is same with the connection, this means the alias is already // exist; if the alias is not null but hte url is not same with the connection, this means the // connection has been overwrite , need to rebuild the alias boolean aliasExist = alias != null && StringUtils.equals(url, alias.getUrl()); if (!aliasExist) { if (alias == null) { alias = new Alias(dataProvider.getName()); } String user = JavaSqlFactory.getUsername(connection); // MOD gdbu 2011-3-17 bug 19539 String password = JavaSqlFactory.getPassword(connection); // ~19539 // user should not be null user = user == null ? "" : user; //$NON-NLS-1$ // password should not be null password = password == null ? "" : password; //$NON-NLS-1$ // MOD scorreia 2010-07-24 set empty string instead of null password so that database xml file // is serialized correctly. assert user != null; assert password != null; User previousUser = new User(user, password); previousUser.setDatabaseConnection(dbConn); alias.setDefaultUser(previousUser); alias.setAutoLogon(false); alias.setConnectAtStartup(true); alias.setUrl(url); ManagedDriver manDr = aliasManaDriverHelper.getManaDriverByConnection(dbConn); if (manDr == null) { manDr = aliasManaDriverHelper.createNewManagerDriver(dbConn); driverManager.addDriver(manDr); } else if (!manDr.isDriverClassLoaded()) { this.loadDriverByLibManageSystem(dbConn); } if (manDr != null) { alias.setDriver(manDr); } } if (!aliasManager.contains(alias) && alias.getName() != null) { aliasManager.addAlias(alias); } // Add yyi 2010-09-15 14549: hide connections in SQL Explorer when a connection is moved to the // trash bin. // MOD Qiongli TDQ-6166 just put once for every Alias if (sqlPlugin.getPropertyFile().get(alias) == null) { sqlPlugin.getPropertyFile().put(alias, getPropertyFile(dataProvider)); } aliasManager.modelChanged(); } } catch (Throwable e) { // MOD scorreia 2010-07-24 catch all exceptions log.error(e, e); continue; } } } @Override public void loadDriverByLibManageSystem(DatabaseConnection connection) { if (ConnectionHelper.isHive(connection)) { loadManagedDriverForHive(connection); } else { loadManagedDriver(connection); } } /** * * Load the driver by lib management system , which will configure the SQL Explorer driver classpath from xml. * * @param dbType * @param dbVersion * @param driverClassName * @param userName. the userName is used a special case :it MSSQL with empty userName. */ private void loadManagedDriver(DatabaseConnection dbConn) { String dbType = dbConn.getDatabaseType(); String dbVersion = dbConn.getDbVersionString(); String driverClassName = JavaSqlFactory.getDriverClass(dbConn); if (dbType == null || driverClassName == null) { return; } DriverManager driverManager = SQLExplorerPlugin.getDefault().getDriverModel(); AliasAndManaDriverHelper aliasManaHelper = AliasAndManaDriverHelper.getInstance(); String manaDriverId = aliasManaHelper.joinManagedDriverId(dbType, driverClassName, dbVersion); ManagedDriver manDr = driverManager.getDriver(manaDriverId); if (manDr != null && !manDr.isDriverClassLoaded()) { // find driver jars from 'temp\dbWizard', prefrence page or installation path 'lib\java', // "librariesIndex.xml". try { List<String> jarNames = EDatabaseVersion4Drivers.getDrivers(dbType, dbVersion); LinkedList<String> driverJarRealPaths = aliasManaHelper.getDriverJarRealPaths(jarNames); if (!driverJarRealPaths.isEmpty()) { manDr.getJars().clear(); manDr.getJars().addAll(driverJarRealPaths); } manDr.registerSQLDriver(dbConn); } catch (Exception e) { log.error(e); } } } /** * TDDQ-8113 load hive drive by DynamicClassLoader,then set the attribute for Hive ManagedDriver. * * @param connection */ private void loadManagedDriverForHive(DatabaseConnection connection) { DriverManager driverManager = SQLExplorerPlugin.getDefault().getDriverModel(); String id = AliasAndManaDriverHelper.getInstance().joinManagedDriverId(connection); ManagedDriver manDr = driverManager.getDriver(id); IMetadataConnection metadataConnection = ConvertionHelper.convert(connection); ClassLoader classLoader = null; if (EDatabaseTypeName.IMPALA.getXmlName().equalsIgnoreCase(connection.getDatabaseType())) { classLoader = AliasAndManaDriverHelper.getInstance().getImpalaClassLoader(metadataConnection); } else { classLoader = HiveClassLoaderFactory.getInstance().getClassLoader(metadataConnection); } if (classLoader != null && classLoader instanceof DynamicClassLoader) { DynamicClassLoader dynClassLoader = (DynamicClassLoader) classLoader; String libStorePath = dynClassLoader.getLibStorePath(); File libFolder = new File(libStorePath); if (libFolder.exists()) { List<String> relaPathLs = new ArrayList<String>(); relaPathLs.addAll(dynClassLoader.getLibraries()); Set<String> findAllJarPath = findAllJarPath(libFolder, relaPathLs); if (!findAllJarPath.isEmpty()) { manDr.getJars().addAll(findAllJarPath); try { manDr.registerHiveSQLDriver(connection); } catch (ClassNotFoundException e) { log.error(e); } catch (InstantiationException e) { log.error(e); } catch (IllegalAccessException e) { log.error(e); } } } } } /** * * find all jar pathes by jar names. * * @param root * @param jarNames * @return if return an empty Set,indicate that it find failed. */ private Set<String> findAllJarPath(File root, List<String> jarNames) { Set<String> jarPathes = new HashSet<String>(); if (!root.exists() || jarNames == null || jarNames.isEmpty()) { return jarPathes; } boolean allIsOK = true; try { for (String jarName : jarNames) { List<File> jarFiles = FilesUtils.getJarFilesFromFolder(root, jarName); if (jarFiles.isEmpty()) { allIsOK = false; break; } for (File file : jarFiles) { jarPathes.add(file.getPath()); } } } catch (MalformedURLException e) { log.error(e); } if (!allIsOK) { jarPathes.clear(); } return jarPathes; } private IFile getPropertyFile(ModelElement modelElement) { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); Resource eResource = modelElement.eResource(); if (eResource != null) { String platformString = eResource.getURI().toPlatformString(true); IPath propPath = new Path(platformString).removeFileExtension().addFileExtension(PROPERTIES_EXTENSION); return root.getFile(propPath); } return null; } /* * (non-Javadoc) * * @see * org.talend.dataprofiler.service.ISqlexplorerService#findSqlExplorerTableNode(org.talend.core.model.metadata.builder * .connection.Connection, orgomg.cwm.objectmodel.core.Package, java.lang.String, java.lang.String) */ @Override public void findSqlExplorerTableNode(Connection providerConnection, Package parentPackageElement, String tableName, String activeTabName) { // Open data explore perspective. if (GlobalServiceRegister.getDefault().isServiceRegistered(ITDQRepositoryService.class)) { ITDQRepositoryService service = (ITDQRepositoryService) GlobalServiceRegister.getDefault().getService( ITDQRepositoryService.class); if (service != null) { service.changePerspectiveAction(SQLExplorerPluginPerspective.class.getName()); } else { return; } } Collection<Alias> aliases = SQLExplorerPlugin.getDefault().getAliasManager().getAliases(); String url = JavaSqlFactory.getURL(providerConnection); User currentUser = null; for (Alias alias : aliases) { if (alias.getUrl().equals(url)) { currentUser = alias.getDefaultUser(); OpenPasswordConnectDialogAction openDlgAction = new OpenPasswordConnectDialogAction(alias, alias.getDefaultUser(), false); openDlgAction.run(); break; } } // MOD qiongli bug 13093,2010-7-2,show the warning dialog when the table can't be found Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); if (currentUser == null) { MessageDialog.openWarning(shell, Messages.getString("SqlExplorerBridge.Warning"), //$NON-NLS-1$ Messages.getString("SqlExplorerBridge.MissTable") + tableName); //$NON-NLS-1$ return; } DatabaseNode root = currentUser.getMetaDataSession().getRoot(); root.load(); List<INode> catalogs = root.getCatalogs(); List<INode> schemas = root.getSchemas(); Catalog catalog = SwitchHelpers.CATALOG_SWITCH.doSwitch(parentPackageElement); Schema schema = SwitchHelpers.SCHEMA_SWITCH.doSwitch(parentPackageElement); INode catalogOrSchemaNode = null; // TDQ-12005: fix Exasol/hive(TDQ-11887: hdp20 at least) database can view index/keys well String findCatalogNodeName = isExasol(url) ? "EXA_DB" : (isHive(url) ? "NoCatalog" : ""); if (!findCatalogNodeName.equals("") && !catalogs.isEmpty()) { for (INode catalogNode : catalogs) { if (findCatalogNodeName.equalsIgnoreCase(catalogNode.getName())) { catalogOrSchemaNode = catalogNode; break; } } } else { if (catalog != null) { // MOD klliu bug 14662 2010-08-05 if (!catalogs.isEmpty()) { for (INode catalogNode : catalogs) { if (parentPackageElement.getName().equalsIgnoreCase(catalogNode.getName())) { catalogOrSchemaNode = catalogNode; break; } } } else { catalogOrSchemaNode = root; } } else { // MOD by zshen for 20517 if (schemas.isEmpty()) { // the case for mssql/postgrel(which have catalog and schema structor) schema analysis. Catalog shcmeaOfCatalogNode = CatalogHelper.getParentCatalog(parentPackageElement); for (INode catalogNode : catalogs) { if (shcmeaOfCatalogNode != null && shcmeaOfCatalogNode.getName().equalsIgnoreCase(catalogNode.getName())) { catalogOrSchemaNode = catalogNode; break; } } } for (INode schemaNode : schemas) { if (parentPackageElement.getName().equalsIgnoreCase(schemaNode.getName())) { catalogOrSchemaNode = schemaNode; break; } } } } // find the table folder node. if (catalogOrSchemaNode == null) { throw new NullPointerException(Messages.getString("SqlExplorerBridge.CATORSCHMISNULL")); //$NON-NLS-1$ } // Added 20130409 TDQ-6823 yyin when want to get some schema's tables, should give the schema name to the // catalog node. if (schema != null) { if (catalogOrSchemaNode.getSchemaName() == null) { catalogOrSchemaNode.setSchemaName(schema.getName()); } else if (!StringUtils.equals(catalogOrSchemaNode.getSchemaName(), schema.getName())) { // if this catalog already loaded its children of some schema, should reload for this schema. if (catalogOrSchemaNode.isChildrenLoaded()) { SQLExplorerPlugin.getDefault().getDatabaseStructureView() .refreshSessionTrees(currentUser.getMetaDataSession()); List<INode> catalogs2 = currentUser.getMetaDataSession().getRoot().getCatalogs(); if (catalogs2.size() != 0) { for (INode catalogNode : catalogs2) { if (catalogOrSchemaNode.getName().equalsIgnoreCase(catalogNode.getName())) { catalogOrSchemaNode = catalogNode; catalogOrSchemaNode.setSchemaName(schema.getName()); break; } } } } } }// ~ INode[] childNodes = catalogOrSchemaNode.getChildNodes(); // TDQ-9543 if import netezza from 5.6.0 or lower version, the structure of it will include the catalog only, so // need to find the schema and load the table nodes if (isNetezza(url)) { SchemaNode sNode = getNetezzaSchema(childNodes, JavaSqlFactory.getUsername(providerConnection)); if (sNode != null) { childNodes = sNode.getChildNodes(); } } TableFolderNode tableFolderNode = null; for (INode node : childNodes) { if ("TABLE".equals(node.getQualifiedName())) { //$NON-NLS-1$ tableFolderNode = (TableFolderNode) node; break; } } if (tableFolderNode == null) { log.fatal(Messages.getString("SqlExplorerBridge.TABLE_FOLDER_NULL0")); //$NON-NLS-1$ } else { INode[] tableNodes = tableFolderNode.getChildNodes(); for (INode node : tableNodes) { if (tableName.equalsIgnoreCase(node.getName())) { DetailTabManager.setActiveTabName(activeTabName); DatabaseStructureView dsView = SQLExplorerPlugin.getDefault().getDatabaseStructureView(); dsView.setSessionSelectionNode(currentUser.getMetaDataSession(), new StructuredSelection(node)); // MOD qiongli bug 13093,2010-7-2 SQLExplorerPlugin.getDefault().getConnectionsView().getTreeViewer() .setSelection(new StructuredSelection(currentUser)); return; } } } MessageDialog.openWarning(shell, Messages.getString("SqlExplorerBridge.Warning"), //$NON-NLS-1$ Messages.getString("SqlExplorerBridge.MissTable") + tableName); //$NON-NLS-1$ } /** * DOC xqliu Comment method "getNetezzaSchema". * * @param childNodes * @param username * @return */ private SchemaNode getNetezzaSchema(INode[] childNodes, String username) { for (INode node : childNodes) { if (node != null && node instanceof SchemaNode) { SchemaNode sNode = (SchemaNode) node; if (StringUtils.equalsIgnoreCase(username, sNode.getName())) { return sNode; } } } return null; } /** * DOC xqliu Comment method "isNetezza". * * @param url * @return */ private boolean isNetezza(String url) { return StringUtils.startsWithIgnoreCase(url, "jdbc:netezza"); } private boolean isExasol(String url) { return StringUtils.startsWithIgnoreCase(url, "jdbc:exa"); } private boolean isHive(String url) { return StringUtils.startsWithIgnoreCase(url, "jdbc:hive"); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.service.ISqlexplorerService#getDriver(java.lang.String, java.lang.String) */ @Override public Driver getDriver(String driverClassName, String jarsPath) throws InstantiationException, IllegalAccessException, ClassNotFoundException { Driver driver = null; if (StringUtils.isNotEmpty(jarsPath)) { try { driver = this.createGenericJDBC(jarsPath, driverClassName); } catch (Exception e) { log.error(e, e); } return driver; } SQLExplorerPlugin sqlExplorerPlugin = SQLExplorerPlugin.getDefault(); if (sqlExplorerPlugin != null) { net.sourceforge.sqlexplorer.dbproduct.DriverManager driverModel = sqlExplorerPlugin.getDriverModel(); try { Collection<ManagedDriver> drivers = driverModel.getDrivers(); for (ManagedDriver managedDriver : drivers) { LinkedList<String> jars = managedDriver.getJars(); List<URL> urls = new ArrayList<URL>(); for (int i = 0; i < jars.size(); i++) { File file = new File(jars.get(i)); if (file.exists()) { urls.add(file.toURI().toURL()); } } if (!urls.isEmpty()) { try { MyURLClassLoader cl; cl = new MyURLClassLoader(urls.toArray(new URL[0])); Class<?> clazz = cl.findClass(driverClassName); if (clazz != null) { driver = (Driver) clazz.newInstance(); if (driver != null) { return driver; } } } catch (ClassNotFoundException e) { // do nothings } } } } catch (MalformedURLException e) { // do nothings } } if (driver == null) { driver = (Driver) Class.forName(driverClassName).newInstance(); } return driver; } private Driver createGenericJDBC(String driverJars, String driverName) throws Exception { Driver driver = null; String[] driverJarPath = driverJars.split(SEMICOLON_STRING); try { int driverCount = 0; URL[] driverUrl = new URL[driverJarPath.length]; for (String dirverpath : driverJarPath) { driverUrl[driverCount++] = new File(dirverpath).toURL(); } URLClassLoader cl = URLClassLoader.newInstance(driverUrl, Thread.currentThread().getContextClassLoader()); Class c = cl.loadClass(driverName); driver = (Driver) c.newInstance(); } catch (Exception ex) { log.error(ex, ex); throw ex; } return driver; } @Override public void initAllConnectionsToSQLExplorer(List<Connection> conns) { for (Connection conn : conns) { addConnetionAliasToSQLPlugin(conn); } } @Override public void setSqlEditorEditable(Object part, boolean lock) { if (part instanceof SQLEditor) { ((SQLEditor) part).setEditable(lock); } } @Override public boolean needAddDriverConnection(DatabaseConnection dbConn) { boolean isNeed = false; DriverManager driverManager = SQLExplorerPlugin.getDefault().getDriverModel(); String id = AliasAndManaDriverHelper.getInstance().joinManagedDriverId(dbConn); ManagedDriver manDr = driverManager.getDriver(id); if (manDr == null) { isNeed = true; } else if (!manDr.isDriverClassLoaded()) { loadDriverByLibManageSystem(dbConn); if (!manDr.isDriverClassLoaded()) { isNeed = true; } } return isNeed; } /* * (non-Javadoc) * * @see org.talend.dataprofiler.service.ISqlexplorerService#getMyURLClassLoaderAssignableClasses(java.net.URL) */ @Override public Class[] getMyURLClassLoaderAssignableClasses(URL url) { Class[] classes = null; try { classes = new MyURLClassLoader(url).getAssignableClasses(Driver.class); } catch (Exception e) { classes = new Class[] {}; } return classes; } /* * (non-Javadoc) * * @see * org.talend.dataprofiler.service.ISqlexplorerService#updateConnetionAliasByName(org.talend.core.model.metadata. * builder.connection.Connection, java.lang.String) */ @Override public void updateConnetionAliasByName(Connection connection, String aliasName) { if (connection == null || aliasName == null) { return; } SQLExplorerPlugin sqlPlugin = SQLExplorerPlugin.getDefault(); // if the ctabItem is open,close it. DatabaseStructureView view = sqlPlugin.findDatabaseStructureView(); if (view != null) { view.closeCurrentCabItem(aliasName); } AliasManager aliasManager = sqlPlugin.getAliasManager(); Alias alias = aliasManager.getAlias(aliasName); if (alias != null) { try { aliasManager.removeAlias(aliasName); addConnetionAliasToSQLPlugin(connection); } catch (Exception e) { log.error(e, e); } } } /* * (non-Javadoc) * * @see * org.talend.dataprofiler.service.ISqlexplorerService#removeAliasInSQLExplorer(orgomg.cwm.foundation.softwaredeployment * .DataProvider[]) */ @Override public void removeAliasInSQLExplorer(DataProvider... dataproviders) { SQLExplorerPlugin sqlPlugin = SQLExplorerPlugin.getDefault(); AliasManager aliasManager = sqlPlugin.getAliasManager(); DatabaseStructureView dsView = sqlPlugin.findDatabaseStructureView(); // MOD qiongli 2012-11-12 TDQ-6166,only load aliases from file when AliasManager'Aliases is empty.should remove // alias from propertyFile map at the same time. try { Collection<Alias> aliases = aliasManager.getAliases(); if (aliases.isEmpty()) { return; } for (DataProvider dataProvider : dataproviders) { String aliasName = dataProvider.getName(); if (null == aliasName) { continue; } Alias alias = aliasManager.getAlias(aliasName); if (alias != null) { sqlPlugin.getPropertyFile().remove(alias); aliasManager.removeAlias(aliasName); } // if the ctabItem is open,close it. if (dsView != null) { dsView.closeCurrentCabItem(aliasName); } } } catch (Exception e) { log.error(e, e); } aliasManager.modelChanged(); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.service.ISqlexplorerService#aliasExist(java.lang.String) */ @Override public boolean aliasExist(String connectionName) { SQLExplorerPlugin sqlPlugin = SQLExplorerPlugin.getDefault(); AliasManager aliasManager = sqlPlugin.getAliasManager(); Alias alias = aliasManager.getAlias(connectionName); return alias != null; } /* * (non-Javadoc) * * @see org.talend.dataprofiler.service.ISqlexplorerService#createExportCSVAction() */ @Override public Action createExportCSVAction() { ExportCSVAction exportAction = new ExportCSVAction(); exportAction.setEnabled(true); return exportAction; } /* * (non-Javadoc) * * @see org.talend.dataprofiler.service.ISqlexplorerService#setExportCSVActionTable(java.lang.Object, * java.lang.Object) */ @Override public void setExportCSVActionTable(Object action, Object table) { if (action instanceof ExportCSVAction && table instanceof Table) { ExportCSVAction exportAction = (ExportCSVAction) action; exportAction.setEnabled(true); exportAction.setTable((Table) table); } } /* * (non-Javadoc) * * @see org.talend.dataprofiler.service.ISqlexplorerService#create(java.lang.String[], java.lang.Object, int, * java.lang.Object, int) */ @Override public Object createMapDBColumnSetDataSet(String[] columnHeader, Object mapDB, Long size, Object currIndicator, int pageSize) { return new MapDBColumnSetDataSet(columnHeader, (Map<List<Object>, Long>) mapDB, size, (DataValidation) currIndicator, pageSize); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.service.ISqlexplorerService#createMapDBSetDataSet(java.lang.String[], * java.lang.Object, int) */ @Override public Object createMapDBSetDataSet(String[] columnHeader, Object mapDB, int pageSize) { return new MapDBSetDataSet(columnHeader, (Set<Object>) mapDB, pageSize); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.service.ISqlexplorerService#createMapDBDataSet(java.lang.String[], java.lang.Object, * int, java.lang.Object, java.lang.Long) */ @Override public Object createMapDBDataSet(String[] columnHeader, Object mapDB, int pageSize, Object columnFilter, Long itemSize) { return new MapDBDataSet(columnHeader, (Map<Object, List<Object>>) mapDB, pageSize, (ColumnFilter) columnFilter, itemSize); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.service.ISqlexplorerService#resetTalendDataSetIndex(java.lang.Object, int, int) */ @Override public void resetTalendDataSetIndex(Object talendDataSet, long fromIndex, long toIndex) { TalendDataSet tds = (TalendDataSet) talendDataSet; tds.setStartIndex(fromIndex); tds.setEndIndex(toIndex); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.service.ISqlexplorerService#createDataSet(java.lang.String[], java.lang.String[][]) */ @Override public Object createDataSet(String[] columnHeader, String[][] columnValue) { return new DataSet(columnHeader, columnValue); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.service.ISqlexplorerService#isInstanceofTalendDataSetIndex(java.lang.Object) */ @Override public boolean isInstanceofTalendDataSet(Object talendDataSet) { if (TalendDataSet.class.isInstance(talendDataSet)) { return true; } return false; } }