// ============================================================================
//
// 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.apache.log4j.Logger;
import org.eclipse.core.runtime.Platform;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.metadata.builder.database.PluginConstant;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.cwm.helper.ConnectionHelper;
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.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.foldernode.AbstractDatabaseFolderNode;
import org.talend.dq.writer.impl.ElementWriterFactory;
import orgomg.cwm.resource.relational.Catalog;
import orgomg.cwm.resource.relational.NamedColumnSet;
import orgomg.cwm.resource.relational.Schema;
/**
* @author scorreia
* @param <COLSET> either TdTable or TdView
*/
public abstract class NamedColumnSetFolderNode<COLSET extends NamedColumnSet> extends AbstractDatabaseFolderNode {
private static Logger log = Logger.getLogger(NamedColumnSetFolderNode.class);
public static final int TABLE_VIEW_MAX = 2000;
private static final boolean FILTER_FLAG = Platform.getPreferencesService().getBoolean(
CWMPlugin.getDefault().getBundle().getSymbolicName(), PluginConstant.FILTER_TABLE_VIEW_COLUMN, false, null);
/**
* @param name
*/
public NamedColumnSetFolderNode(String name) {
super(name);
}
protected <T extends List<COLSET>> void loadChildrenLow(orgomg.cwm.objectmodel.core.Package pack, Catalog catalog,
Schema schema, final T columnSets) {
assert pack != null;
// MOD xqliu 2009-04-27 bug 6507
if (FILTER_FLAG) {
columnSets.addAll(getColumnSetsWithFilter(catalog, schema));
} else {
columnSets.addAll(getColumnSets(catalog, schema));
}
if (columnSets.size() > 0) {
if (FILTER_FLAG && columnSets.size() > TABLE_VIEW_MAX) {
columnSets.clear();
this.setChildren(null);
MessageUI.openWarning(DefaultMessagesImpl.getString("NamedColumnSetFolderNode.warnMsg", TABLE_VIEW_MAX)); //$NON-NLS-1$
} else {
this.setChildren(columnSets.toArray());
}
return;
} else {
if (FILTER_FLAG) {
this.setChildren(null);
if (getColumnSets(catalog, schema).size() > 0) {
return;
}
}
}
// ~
if (pack.eIsProxy()) {
// resolve the proxy object.
pack = (orgomg.cwm.objectmodel.core.Package) EObjectHelper.resolveObject(pack);
if (pack instanceof Catalog) {
catalog = (Catalog) pack;
} else if (pack instanceof Schema) {
schema = (Schema) pack;
}
}
Connection conn = ConnectionHelper.getTdDataProvider(pack);
if (conn == null) {
log.warn(pack.getName());
return;
}
// load from database
loadColumnSets(catalog, schema, conn, columnSets);
// store views in catalog or schema
pack.getOwnedElement().addAll(columnSets);
this.setChildren(columnSets.toArray());
IRepositoryViewObject repositoryViewObject = RepositoryNodeHelper.recursiveFind(conn).getObject();
ElementWriterFactory.getInstance().createDataProviderWriter().save(repositoryViewObject.getProperty().getItem(), false);
}
/**
* @param catalog
* @param schema
* @return the Tables or Views in the given catalog or schema.
*/
protected abstract List<COLSET> getColumnSets(Catalog catalog, Schema schema);
/**
* @param catalog
* @param schema
* @return the Tables or Views in the given catalog or schema.
*/
protected abstract List<COLSET> getColumnSetsWithFilter(Catalog catalog, Schema schema);
/**
* Loads columnsets (table or view) from database.
*
* @param <T>
* @param catalog
* @param schema
* @param provider
* @param columnSets
* @return
*/
protected abstract <T extends List<COLSET>> boolean loadColumnSets(Catalog catalog, Schema schema, Connection provider,
final T columnSets);
/**
* DOC xqliu Comment method "filterColumnSets". ADD xqliu 2009-05-07 bug 7234
*
* @param <T>
* @param columnSets
* @param columnSetPattern
*/
protected <T extends NamedColumnSet> List<T> filterColumnSets(List<T> columnSets, String columnSetPattern) {
if (needFilter(columnSetPattern)) {
String[] patterns = cleanPatterns(columnSetPattern.split(",")); //$NON-NLS-1$
return filterMatchingColumnSets(columnSets, patterns);
}
return columnSets;
}
/**
* DOC xqliu Comment method "filterMatchingColumnSets". ADD xqliu 2009-05-07 bug 7234
*
* @param <T>
* @param columnSets
* @param patterns
*/
private <T extends NamedColumnSet> List<T> filterMatchingColumnSets(List<T> columnSets, String[] patterns) {
List<T> retColumnSets = new ArrayList<T>();
int size = 0;
for (T t : columnSets) {
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)) {
retColumnSets.add(t);
size++;
if (size > TABLE_VIEW_MAX) {
return retColumnSets;
}
break;
}
}
}
return retColumnSets;
}
/**
* 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;
}
}