// ============================================================================ // // 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 org.talend.dataprofiler.core.ui.action.actions; import java.sql.DatabaseMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.eclipse.core.runtime.Path; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.ui.PlatformUI; import org.talend.commons.exception.PersistenceException; import org.talend.commons.utils.VersionUtils; import org.talend.core.context.Context; import org.talend.core.context.RepositoryContext; import org.talend.core.database.EDatabaseTypeName; import org.talend.core.database.conn.version.EDatabaseVersion4Drivers; import org.talend.core.exception.TalendInternalPersistenceException; import org.talend.core.model.metadata.IMetadataConnection; import org.talend.core.model.metadata.builder.connection.DatabaseConnection; import org.talend.core.model.metadata.builder.database.ExtractMetaDataUtils; import org.talend.core.model.properties.ConnectionItem; import org.talend.core.model.properties.PropertiesFactory; import org.talend.core.model.properties.Property; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.model.repository.RepositoryManager; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.core.runtime.CoreRuntimePlugin; import org.talend.cwm.db.connection.ConnectionUtils; import org.talend.cwm.helper.CatalogHelper; import org.talend.cwm.helper.ColumnSetHelper; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.helper.PackageHelper; import org.talend.dataprofiler.core.ImageLib; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataquality.helpers.MetadataHelper; import org.talend.dq.helper.EObjectHelper; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.metadata.managment.model.MetadataFillFactory; import org.talend.metadata.managment.utils.MetadataConnectionUtils; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.utils.sugars.ReturnCode; import org.talend.utils.sugars.TypedReturnCode; import orgomg.cwm.objectmodel.core.ModelElement; import orgomg.cwm.objectmodel.core.Package; import orgomg.cwm.resource.relational.Catalog; import orgomg.cwm.resource.relational.Schema; /** * DOC bZhou class global comment. Detailled comment */ public class ExportConnectionToTOSAction extends Action { private static Logger log = Logger.getLogger(ExportConnectionToTOSAction.class); private List<Package> packList = new ArrayList<Package>(); public ExportConnectionToTOSAction(List<Package> packList) { super(DefaultMessagesImpl.getString("ExportConnectionToTOSAction.title"));//$NON-NLS-1$ setImageDescriptor(ImageLib.getImageDescriptor(ImageLib.EXPORT)); this.packList = packList; } /* * (non-Javadoc) * * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { if (packList.isEmpty()) { return; } for (Package pack : packList) { IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance(); DatabaseConnection tdDataProvider = (DatabaseConnection) ConnectionHelper.getTdDataProvider(pack); ConnectionItem connectionItem = initConnectionItem(tdDataProvider, pack); DatabaseConnection exportedConn = (DatabaseConnection) connectionItem.getConnection(); Property connectionProperty = initConnectionProperty(exportedConn, pack); connectionProperty.setId(factory.getNextId()); connectionItem.setProperty(connectionProperty); try { factory.create(connectionItem, new Path(""));//$NON-NLS-1$ openSuccessInformation(); } catch (TalendInternalPersistenceException e1) { // MessageDialog.openError(null, DefaultMessagesImpl.getString("ExportConnectionToTOSAction.error"), e1.getMessage());//$NON-NLS-1$ } catch (PersistenceException e) { MessageDialog.openError(null, DefaultMessagesImpl.getString("ExportConnectionToTOSAction.error"), e.getMessage());//$NON-NLS-1$ log.error(e.getMessage(), e); } } refreshViewerAndNode(); } /** * DOC zshen Comment method "refreshViewerAndNode". */ protected void refreshViewerAndNode() { // refresh TDQ's matadata tree list RepositoryNodeHelper.getDQCommonViewer().refresh(RepositoryNodeHelper.getRootNode(ERepositoryObjectType.METADATA, true)); // refresh TOS's matadata tree list RepositoryManager.refreshCreatedNode(ERepositoryObjectType.METADATA_CONNECTIONS); } /** * DOC zshen Comment method "openSuccessInformation". */ protected void openSuccessInformation() { MessageDialog .openInformation( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), DefaultMessagesImpl.getString("ExportConnectionToTOSAction.info"), DefaultMessagesImpl.getString("ExportConnectionToTOSAction.meta"));//$NON-NLS-1$ //$NON-NLS-2$ } /** * DOC bZhou Comment method "initConnectionProperty". * * @param tdDataProvider * @return */ private Property initConnectionProperty(DatabaseConnection tdDataProvider, Package pack) { Property connectionProperty = PropertiesFactory.eINSTANCE.createProperty(); String purpose = MetadataHelper.getPurpose(tdDataProvider); String description = MetadataHelper.getDescription(tdDataProvider); String status = MetadataHelper.getDevStatus(tdDataProvider); connectionProperty.setLabel(tdDataProvider.getName()); connectionProperty.setAuthor(((RepositoryContext) CoreRuntimePlugin.getInstance().getContext() .getProperty(Context.REPOSITORY_CONTEXT_KEY)).getUser()); connectionProperty.setPurpose(purpose); connectionProperty.setDescription(description); connectionProperty.setStatusCode(status); connectionProperty.setVersion(VersionUtils.DEFAULT_VERSION); return connectionProperty; } /** * DOC bZhou Comment method "initConnectionItem". * * @param tdDataProvider * @return */ private ConnectionItem initConnectionItem(DatabaseConnection tdDataProvider, Package pack) { ConnectionItem connectionItem = PropertiesFactory.eINSTANCE.createDatabaseConnectionItem(); if (tdDataProvider != null) { DatabaseConnection exportedConn = EObjectHelper.deepCopy(tdDataProvider); // Remove the dependencies exportedConn.getSupplierDependency().clear(); exportedConn.getClientDependency().clear(); filterPackage(pack, exportedConn); updateConnectionParameter(exportedConn, pack); connectionItem.setConnection(exportedConn); } return connectionItem; } /** * DOC zshen Comment method "filterPackage". * * @param pack * @param exportedConn */ private void filterPackage(Package pack, DatabaseConnection exportedConn) { Package newPackage = null; String oldRootPackageName = null; if (pack instanceof Catalog) { oldRootPackageName = pack.getName(); } else { Package parentPackage = PackageHelper.getParentPackage(pack); if (parentPackage == null) { oldRootPackageName = pack.getName(); } else { oldRootPackageName = parentPackage.getName(); } } // Add only the package: pack for (Package currPackage : exportedConn.getDataPackage()) { if (currPackage.getName().equalsIgnoreCase(oldRootPackageName)) { newPackage = currPackage; if (pack instanceof Schema) { Schema newSchema = null; String schemaName = pack.getName(); for (ModelElement CurrentSchema : currPackage.getOwnedElement()) { if (CurrentSchema.getName().equals(schemaName)) { newSchema = (Schema) CurrentSchema; break; } } if (newSchema != null) { ((Catalog) currPackage).getOwnedElement().clear(); CatalogHelper.addSchemas(newSchema, (Catalog) currPackage); } } break; } } if (newPackage != null) { exportedConn.getDataPackage().clear(); newPackage.getDataManager().clear(); ConnectionHelper.addPackage(newPackage, exportedConn); } } /** * DOC zshen Comment method "updateConnectionParameter". * * @param exportedConn */ private void updateConnectionParameter(DatabaseConnection exportedConn, Package pack) { String connName = exportedConn.getName(); exportedConn.setLabel(connName + "_" + pack.getName()); //$NON-NLS-1$ exportedConn.setName(connName + "_" + pack.getName()); //$NON-NLS-1$ String database = pack.getName(); // schema case if (pack instanceof Schema) { Package parent = ColumnSetHelper.getParentCatalogOrSchema(pack); if (parent != null) { database = parent.getName(); } else { database = exportedConn.getSID(); } exportedConn.setUiSchema(pack.getName()); // teradata database use "database" attribute as uiSchema on the DatabaseWizard if (EDatabaseTypeName.TERADATA.getXmlName().equalsIgnoreCase(exportedConn.getDatabaseType())) { if (database.isEmpty()) { database = pack.getName(); } } } exportedConn.setSID(database); } /** * * DOC gdbu Comment method "fillCatalogSchema". * * @deprecated Won't be used. * @param tdDataProvider */ @Deprecated protected DatabaseConnection fillCatalogSchema(IMetadataConnection newMetadataConn) { MetadataFillFactory instance = MetadataFillFactory.getDBInstance(newMetadataConn); ReturnCode rc = instance.createConnection(newMetadataConn); DatabaseConnection dbConn = null; if (rc.isOk()) { dbConn = (DatabaseConnection) instance.fillUIConnParams(newMetadataConn, null); DatabaseMetaData dbMetadata = null; java.sql.Connection sqlConn = null; try { if (rc instanceof TypedReturnCode) { Object sqlConnObject = ((TypedReturnCode) rc).getObject(); if (sqlConnObject instanceof java.sql.Connection) { sqlConn = (java.sql.Connection) sqlConnObject; dbMetadata = ExtractMetaDataUtils.getInstance().getConnectionMetadata(sqlConn); } } List<String> packageFilterCatalog = MetadataConnectionUtils.getPackageFilter(dbConn, dbMetadata, true); instance.fillCatalogs(dbConn, dbMetadata, packageFilterCatalog); List<String> packageFilterSchema = MetadataConnectionUtils.getPackageFilter(dbConn, dbMetadata, false); instance.fillSchemas(dbConn, dbMetadata, packageFilterSchema); } catch (SQLException e) { log.error(e, e); } finally { if (sqlConn != null) { ConnectionUtils.closeConnection(sqlConn); } } } else { log.error(rc.getMessage()); } return dbConn; } /** * DOC bZhou Comment method "retrieveDBVersion". * * @param product * @return */ private String retrieveDBVersion(String product) { List<EDatabaseVersion4Drivers> eVersions = EDatabaseVersion4Drivers.indexOfByDbType(product); if (eVersions != null && !eVersions.isEmpty()) { return eVersions.get(0).getVersionValue(); } return null; } }