// ============================================================================ // // 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.model.nodes.foldernode; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.Platform; import org.eclipse.emf.ecore.EObject; import org.talend.commons.ui.runtime.exception.MessageBoxExceptionHandler; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.metadata.builder.database.DqRepositoryViewService; import org.talend.core.model.metadata.builder.database.PluginConstant; import org.talend.cwm.helper.ColumnHelper; import org.talend.cwm.helper.ColumnSetHelper; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.helper.SwitchHelpers; import org.talend.cwm.relational.TdColumn; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.ui.utils.MessageUI; import org.talend.dq.CWMPlugin; import org.talend.dq.helper.EObjectHelper; import org.talend.dq.nodes.foldernode.AbstractDatabaseFolderNode; import org.talend.dq.writer.impl.ElementWriterFactory; import orgomg.cwm.objectmodel.core.Package; import orgomg.cwm.resource.relational.ColumnSet; /** * @author rli * */ public class ColumnFolderNode extends AbstractDatabaseFolderNode { public static final int COLUMN_MAX = 2500; /** * @param name */ public ColumnFolderNode() { super(DefaultMessagesImpl.getString("ColumnFolderNode.columns")); //$NON-NLS-1$ } private static final boolean FILTER_FLAG = Platform.getPreferencesService().getBoolean( CWMPlugin.getDefault().getBundle().getSymbolicName(), PluginConstant.FILTER_TABLE_VIEW_COLUMN, false, null); /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.model.nodes.AbstractFolderNode#loadChildren() */ @Override public void loadChildren() { // MOD xqliu 2009-04-27 bug 6507 // get columns from either tables or views. ColumnSet columnSet = SwitchHelpers.COLUMN_SET_SWITCH.doSwitch((EObject) getParent()); if (columnSet != null) { List<TdColumn> columnList = null; if (FILTER_FLAG) { String columnFilter = ColumnHelper.getColumnFilter(columnSet); columnList = filterColumns(ColumnSetHelper.getColumns(columnSet), columnFilter); } else { columnList = ColumnSetHelper.getColumns(columnSet); } if (columnList.size() > 0) { if (columnList.size() > COLUMN_MAX) { this.setChildren(null); MessageUI.openWarning(DefaultMessagesImpl.getString("ColumnFolderNode.warnMsg", COLUMN_MAX)); //$NON-NLS-1$ } else { this.setChildren(columnList.toArray()); } return; } else { if (FILTER_FLAG) { this.setChildren(null); if (ColumnSetHelper.getColumns(columnSet).size() > 0) { return; } } } if (columnSet.eIsProxy()) { // resolve the proxy object. columnSet = (ColumnSet) EObjectHelper.resolveObject(columnSet); } Package parentCatalogOrSchema = ColumnSetHelper.getParentCatalogOrSchema(columnSet); if (parentCatalogOrSchema == null) { return; } Connection conn = ConnectionHelper.getTdDataProvider(parentCatalogOrSchema); if (conn == null) { return; } try { columnList = DqRepositoryViewService.getColumns(conn, columnSet, null, true); if (columnList.size() > COLUMN_MAX) { this.setChildren(null); MessageUI.openWarning(DefaultMessagesImpl.getString("ColumnFolderNode.warnMsg", COLUMN_MAX)); //$NON-NLS-1$ return; } } catch (Exception e) { MessageBoxExceptionHandler.process(e); } // store tables in catalog // MOD scorreia 2009-01-29 columns are stored in the table // ColumnSetHelper.addColumns(columnSet, columnList); this.setChildren(columnList.toArray()); ElementWriterFactory.getInstance().createDataProviderWriter().save(conn); } super.loadChildren(); // ~ } @Override public int getFolderNodeType() { return COLUMNFOLDER_NODE_TYPE; } /** * DOC xqliu Comment method "filterColumns". ADD xqliu 2009-05-07 bug 7234 * * @param <T> * @param columns * @param columnPattern * @return */ private <T extends TdColumn> List<T> filterColumns(List<T> columns, String columnPattern) { if (needFilter(columnPattern)) { String[] patterns = cleanPatterns(columnPattern.split(",")); //$NON-NLS-1$ return filterMatchingColumns(columns, patterns); } return columns; } /** * DOC xqliu Comment method "filterMatchingColumns". ADD xqliu 2009-05-07 bug 7234 * * @param <T> * @param columns * @param patterns * @return */ private <T extends TdColumn> List<T> filterMatchingColumns(List<T> columns, String[] patterns) { List<T> retColumns = new ArrayList<T>(); int size = 0; for (T t : columns) { for (String pattern : patterns) { // MOD scorreia 2009-05-13 use SQL patterns for filter String regex = pattern.replaceAll("%", ".*"); //$NON-NLS-1$ //$NON-NLS-2$ if (t.getName().matches(regex)) { retColumns.add(t); size++; if (size > COLUMN_MAX) { return retColumns; } break; } } } return retColumns; } /** * DOC xqliu Comment method "cleanPatterns". ADD xqliu 2009-05-07 bug 7234 * * @param split * @return */ private String[] cleanPatterns(String[] split) { ArrayList<String> ret = new ArrayList<String>(); for (String s : split) { if (s != null && !"".equals(s) && !ret.contains(s)) { //$NON-NLS-1$ ret.add(s); } } return ret.toArray(new String[ret.size()]); } /** * DOC xqliu Comment method "needFilter". ADD xqliu 2009-05-07 bug 7234 * * @param columnSetPattern * @return */ private boolean needFilter(String columnSetPattern) { if (FILTER_FLAG) { if (columnSetPattern != null && !columnSetPattern.equals("")) { //$NON-NLS-1$ String[] patterns = cleanPatterns(columnSetPattern.split(",")); //$NON-NLS-1$ if (patterns != null && patterns.length > 0) { return true; } } } return false; } }