// ============================================================================ // // 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.dq.indicators; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.metadata.builder.connection.DatabaseConnection; import org.talend.cwm.helper.CatalogHelper; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.helper.SwitchHelpers; import org.talend.cwm.management.i18n.Messages; import org.talend.dataquality.helpers.DataqualitySwitchHelper; import org.talend.dataquality.indicators.Indicator; import org.talend.dataquality.indicators.schema.CatalogIndicator; import org.talend.dataquality.indicators.schema.ConnectionIndicator; import org.talend.dataquality.indicators.schema.SchemaFactory; import org.talend.dataquality.indicators.schema.SchemaIndicator; import org.talend.dataquality.indicators.schema.util.SchemaSwitch; import org.talend.dq.indicators.definitions.DefinitionHandler; import org.talend.utils.sugars.ReturnCode; import orgomg.cwm.foundation.softwaredeployment.DataProvider; import orgomg.cwm.resource.relational.Catalog; import orgomg.cwm.resource.relational.Schema; /** * DOC scorreia class global comment. Detailled comment */ public class ConnectionEvaluator extends AbstractSchemaEvaluator<DataProvider> { private static Logger log = Logger.getLogger(ConnectionEvaluator.class); private Connection dataProvider; private List<Indicator> elementIndics; /* * (non-Javadoc) * * @see org.talend.dq.indicators.AbstractSchemaEvaluator#getDataManager() */ @Override protected Connection getDataManager() { DataProvider dp = this.getAnalyzedElements().iterator().next(); if (dp != null) { Connection tdp = SwitchHelpers.CONNECTION_SWITCH.doSwitch(dp); return tdp; } return null; } /* * (non-Javadoc) * * @see org.talend.dq.indicators.Evaluator#executeSqlQuery(java.lang.String) * * Note that the given statement is not used. */ @Override protected ReturnCode executeSqlQuery(String sqlStatement) throws SQLException { // assert this.getAnalyzedElements().size() == 1 : "Invalid number of analyzed elements: " // + this.getAnalyzedElements().size(); ReturnCode ok = new ReturnCode(true); dataProvider = this.getDataManager(); // // --- get data provider // if (this.getAnalyzedElements().size() != 1) { // String msg = "Should have only one connection to analyze instead of " + getAnalyzedElements().size(); // log.error(msg); // ok.setReturnCode(msg, false); // return ok; // } if (this.elementToIndicators.values().isEmpty()) { String msg = Messages.getString("Evaluator.NoInidcator1"); //$NON-NLS-1$ log.error(msg); ok.setReturnCode(msg, false); return ok; } elementIndics = this.elementToIndicators.values().iterator().next(); if (elementIndics.isEmpty()) { String msg = Messages.getString("Evaluator.NoInidcator2", dataProvider); //$NON-NLS-1$ log.error(msg); ok.setReturnCode(msg, false); return ok; } ConnectionIndicator connectionIndicator = getConnectionIndicator(); this.resetCounts(connectionIndicator); List<Catalog> catalogs = ConnectionHelper.getCatalogs(dataProvider); if (isTos(dataProvider)) { cleanUpCatalog(catalogs); } if (this.getMonitor() != null) { this.getMonitor().beginTask("Analyze catalogs", 100); } int temp = 0; if (catalogs.isEmpty()) { // no catalog, only schemata List<Schema> schemata = ConnectionHelper.getSchema(dataProvider); // MOD yyi 2009-11-30 10187 for (Schema tdSchema : schemata) { if (!checkSchema(tdSchema)) { ok.setReturnCode(Messages.getString("Evaluator.schemaNotExist", tdSchema.getName()), false); //$NON-NLS-1$ return ok; } } // ~ // for (Schema tdSchema : schemata) { for (int i = 0; i < schemata.size(); i++) { Schema tdSchema = schemata.get(i); if (this.getMonitor() != null) { this.getMonitor().setTaskName( Messages.getString("ColumnAnalysisSqlExecutor.AnalyzedElement", Messages.getString("ColumnAnalysisSqlExecutor.AnalyzedElementSchema", tdSchema.getName()))); } evalSchemaIndic(tdSchema, ok); if (this.getMonitor() != null) { int current = (i + 1) * 100 / schemata.size(); if (current > temp) { this.getMonitor().worked(current - temp); temp = current; } } } } else { // catalogs exist // MOD yyi 2009-11-30 10187 for (Catalog tdCatalog : catalogs) { if (!checkCatalog(tdCatalog.getName())) { ok.setReturnCode(Messages.getString("Evaluator.catalogNotExist", tdCatalog.getName()), false); //$NON-NLS-1$ return ok; } } // ~ // for (Catalog tdCatalog : catalogs) { for (int i = 0; i < catalogs.size(); i++) { if (this.continueRun()) { Catalog tdCatalog = catalogs.get(i); String catName = tdCatalog.getName(); if (this.getMonitor() != null) { this.getMonitor().setTaskName( Messages.getString("ColumnAnalysisSqlExecutor.AnalyzedElement", Messages.getString("ColumnAnalysisSqlExecutor.AnalyzedElementCatalog", catName))); } if (dbms().supportCatalogSelection()) { try { connection.setCatalog(catName); } catch (SQLException e) { log.warn("Exception while executing SQL query " + sqlStatement, e); //$NON-NLS-1$ } } CatalogIndicator catalogIndic = SchemaFactory.eINSTANCE.createCatalogIndicator(); // MOD xqliu 2009-1-21 feature 4715 DefinitionHandler.getInstance().setDefaultIndicatorDefinition(catalogIndic); List<Schema> schemas = CatalogHelper.getSchemas(tdCatalog); if (schemas.isEmpty()) { // no schema evalCatalogIndic(catalogIndic, tdCatalog, ok); } else { catalogIndic.setAnalyzedElement(tdCatalog); // --- create SchemaIndicator for each pair of catalog schema for (Schema tdSchema : schemas) { if (this.continueRun()) { if (this.getMonitor() != null) { this.getMonitor().setTaskName( Messages.getString( "ColumnAnalysisSqlExecutor.AnalyzedElement", Messages.getString("ColumnAnalysisSqlExecutor.AnalyzedElementCatalog", catName) + ", " + Messages.getString( "ColumnAnalysisSqlExecutor.AnalyzedElementSchema", tdSchema.getName()))); } // --- create SchemaIndicator for each catalog SchemaIndicator schemaIndic = SchemaFactory.eINSTANCE.createSchemaIndicator(); // MOD xqliu 2009-1-21 feature 4715 DefinitionHandler.getInstance().setDefaultIndicatorDefinition(schemaIndic); evalSchemaIndicLow(catalogIndic, schemaIndic, tdCatalog, tdSchema, ok); } } catalogIndic.setSchemaCount(schemas.size()); } if (this.getMonitor() != null) { int current = (i + 1) * 100 / catalogs.size(); if (current > temp) { this.getMonitor().worked(current - temp); temp = current; } } } } if (this.getMonitor() != null) { this.getMonitor().done(); } } if (log.isDebugEnabled()) { printCounts(connectionIndicator); } return ok; } /** * if the Connection don't contain the catalog, remove the catalog from the list. * * @param catalogs */ private void cleanUpCatalog(List<Catalog> catalogs) { if (catalogs != null) { List<Catalog> temp = new ArrayList<Catalog>(); for (Catalog catalog : catalogs) { if (checkCatalog(catalog.getName()) && setCatalogOk(connection, catalog.getName())) { temp.add(catalog); } } catalogs.clear(); catalogs.addAll(temp); } } /** * call the setCatalog() method to make sure the catalog is ok. * * @param connection * @param name * @return */ private boolean setCatalogOk(java.sql.Connection connection, String name) { if (connection != null) { try { if (dbms().supportCatalogSelection()) { connection.setCatalog(name); } } catch (SQLException e) { return false; } } return true; } /** * if the connection is created by TOS(DI) return true, else return false. * * @param conn * @return */ private boolean isTos(Connection conn) { if (conn instanceof DatabaseConnection) { DatabaseConnection dbConn = (DatabaseConnection) conn; return dbConn.getUiSchema() != null; } return false; } protected void printCounts(ConnectionIndicator connectionIndicator) { if (connectionIndicator == null) { return; } log.info("nb table= " + connectionIndicator.getTableCount()); //$NON-NLS-1$ log.info("nb views= " + connectionIndicator.getViewCount()); //$NON-NLS-1$ log.info("nb index= " + connectionIndicator.getIndexCount()); //$NON-NLS-1$ log.info("nb PK= " + connectionIndicator.getKeyCount()); //$NON-NLS-1$ log.info("total table row count= " + connectionIndicator.getTableRowCount()); //$NON-NLS-1$ log.info("total view row count= " + connectionIndicator.getViewRowCount()); //$NON-NLS-1$ } @Override protected void addToConnectionIndicator(Indicator indicator) { final ConnectionIndicator connectionIndicator = getConnectionIndicator(); if (connectionIndicator == null) { return; } SchemaSwitch<Boolean> schemaSwitch = new SchemaSwitch<Boolean>() { /* * (non-Javadoc) * * @see * org.talend.dataquality.indicators.schema.util.SchemaSwitch#caseCatalogIndicator(org.talend.dataquality * .indicators.schema.CatalogIndicator) */ @Override public Boolean caseCatalogIndicator(CatalogIndicator object) { connectionIndicator.addCatalogIndicator(object); connectionIndicator.setCatalogCount(connectionIndicator.getCatalogCount() + 1); // increment schema count connectionIndicator.setSchemaCount(connectionIndicator.getSchemaCount() + object.getSchemaCount()); // MOD scorreia 2009-01-16 increment other counts incrementCounts(connectionIndicator, object); return true; } private void incrementCounts(final ConnectionIndicator connIndicator, SchemaIndicator childIndicator) { connIndicator.setTableCount(connIndicator.getTableCount() + childIndicator.getTableCount()); connIndicator.setTableRowCount(connIndicator.getTableRowCount() + childIndicator.getTableRowCount()); // MOD klliu 2011-12-26 bug TDQ-4235 connIndicator.setViewCount(connIndicator.getViewCount() + childIndicator.getViewCount()); connIndicator.setViewRowCount(connIndicator.getViewRowCount() + childIndicator.getViewRowCount()); connIndicator.setKeyCount(connIndicator.getKeyCount() + childIndicator.getKeyCount()); connIndicator.setIndexCount(connIndicator.getIndexCount() + childIndicator.getIndexCount()); } /* * (non-Javadoc) * * @see * org.talend.dataquality.indicators.schema.util.SchemaSwitch#caseSchemaIndicator(org.talend.dataquality * .indicators.schema.SchemaIndicator) */ @Override public Boolean caseSchemaIndicator(SchemaIndicator object) { connectionIndicator.addSchemaIndicator(object); connectionIndicator.setSchemaCount(connectionIndicator.getSchemaCount() + 1); // MOD scorreia 2009-01-16 increment other counts incrementCounts(connectionIndicator, object); return true; } }; schemaSwitch.doSwitch(indicator); } /* * (non-Javadoc) * * @see * org.talend.dq.indicators.AbstractSchemaEvaluator#addToConnectionIndicator(org.talend.dataquality.indicators.schema * .CatalogIndicator, org.talend.dataquality.indicators.schema.SchemaIndicator) */ @Override protected void addToConnectionIndicator(CatalogIndicator catalogIndicator, SchemaIndicator schemaIndicator) { final ConnectionIndicator connectionIndicator = getConnectionIndicator(); if (connectionIndicator == null) { return; } boolean addSuccess = connectionIndicator.addCatalogIndicator(catalogIndicator); // only increment catalog/schema count when the catalogIndicator is a new instance and is added successfully. if (addSuccess) { connectionIndicator.setCatalogCount(connectionIndicator.getCatalogCount() + 1); connectionIndicator.setSchemaCount(connectionIndicator.getSchemaCount() + catalogIndicator.getSchemaCount()); } // set table count view count... from schemaIndicator not from catalogIndicator. connectionIndicator.setTableCount(connectionIndicator.getTableCount() + schemaIndicator.getTableCount()); connectionIndicator.setTableRowCount(connectionIndicator.getTableRowCount() + schemaIndicator.getTableRowCount()); connectionIndicator.setViewCount(connectionIndicator.getViewCount() + schemaIndicator.getViewCount()); connectionIndicator.setViewRowCount(connectionIndicator.getViewRowCount() + schemaIndicator.getViewRowCount()); connectionIndicator.setKeyCount(connectionIndicator.getKeyCount() + schemaIndicator.getKeyCount()); connectionIndicator.setIndexCount(connectionIndicator.getIndexCount() + schemaIndicator.getIndexCount()); } /** * DOC scorreia Comment method "getConnectionIndicator". * * @param dataProvider * @param indics * @param ok * @return */ private ConnectionIndicator getConnectionIndicator() { ConnectionIndicator connectionIndicator = DataqualitySwitchHelper.CONNECTION_SWITCH.doSwitch(elementIndics.get(0)); if (connectionIndicator != null) { connectionIndicator.setAnalyzedElement(dataProvider); } return connectionIndicator; } }