// ============================================================================ // // 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.nodes; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.talend.commons.exception.PersistenceException; import org.talend.core.database.EDatabaseTypeName; import org.talend.core.model.metadata.builder.connection.DatabaseConnection; import org.talend.core.model.metadata.builder.database.ExtractMetaDataUtils; import org.talend.core.model.properties.DatabaseConnectionItem; import org.talend.core.model.properties.Item; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.cwm.helper.CatalogHelper; import org.talend.metadata.managment.model.MetadataFillFactory; import org.talend.metadata.managment.utils.MetadataConnectionUtils; import org.talend.repository.model.IRepositoryNode; import org.talend.repository.model.RepositoryNode; import org.talend.utils.sql.ConnectionUtils; import org.talend.utils.sugars.TypedReturnCode; import orgomg.cwm.resource.relational.Schema; /** * created by talend on Dec 30, 2013 Detailled comment * */ public class DBSybaseCatalogRepNode extends DBCatalogRepNode { private static Logger log = Logger.getLogger(DBSybaseCatalogRepNode.class); /** * DOC talend DBSybaseCatalogRepNode constructor comment. * * @param viewObject * @param parent * @param type */ public DBSybaseCatalogRepNode(IRepositoryViewObject viewObject, RepositoryNode parent, ENodeType type, org.talend.core.model.general.Project inWhichProject) { super(viewObject, parent, type, inWhichProject); } /* * (non-Javadoc) * * @see org.talend.dq.nodes.DBCatalogRepNode#getChildren() */ @Override public List<IRepositoryNode> getChildren() { // fixed TDQ-5662 this case is deal with old version sybase connection, because the schema can not be contain on // the catalog when create it if (!containSchemas()) { Item databaseItem = this.getObject().getProperty().getItem(); boolean fillSucess = fillSchemaToCatalog(databaseItem); if (fillSucess) { try { ProxyRepositoryFactory.getInstance().save(databaseItem); } catch (PersistenceException e) { log.error(e, e); } } else { // if fill is not success then return an empty list return new ArrayList<IRepositoryNode>(); } } return super.getChildren(); } /** * judge whether the schemas has been filled * * @return */ private boolean containSchemas() { List<Schema> schemas = CatalogHelper.getSchemas(getCatalog()); if (schemas.size() > 0) { return true; } return false; } /** * * fill schemas on the catalog * * @return if fill action is success */ private boolean fillSchemaToCatalog(Item databaseItem) { DatabaseConnection connection = (DatabaseConnection) ((DatabaseConnectionItem) databaseItem).getConnection(); TypedReturnCode<Connection> rcConn = MetadataConnectionUtils.createConnection(connection); if (!rcConn.isOk()) { log.error(rcConn.getMessage()); return false; } java.sql.Connection sqlConnection = rcConn.getObject(); try { DatabaseMetaData dbJDBCMetadata = ExtractMetaDataUtils.getInstance().getDatabaseMetaData(sqlConnection, connection, false); EDatabaseTypeName currentEDatabaseType = EDatabaseTypeName.getTypeFromDbType(connection.getDatabaseType()); List<Schema> schemaList = null; if (currentEDatabaseType != null) { schemaList = MetadataFillFactory.getDBInstance(currentEDatabaseType).fillSchemaToCatalog(connection, dbJDBCMetadata, this.getCatalog(), null); } if (schemaList != null && schemaList.size() > 0) { CatalogHelper.addSchemas(schemaList, this.getCatalog()); } } finally { if (sqlConnection != null) { ConnectionUtils.closeConnection(sqlConnection); } } return true; } }