// ============================================================================
//
// 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.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.emf.common.util.EList;
import org.talend.core.model.metadata.builder.connection.MetadataColumn;
import org.talend.core.model.metadata.builder.database.DqRepositoryViewService;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.repository.model.repositoryObject.MetadataColumnRepositoryObject;
import org.talend.core.repository.model.repositoryObject.TdTableRepositoryObject;
import org.talend.core.repository.model.repositoryObject.TdViewRepositoryObject;
import org.talend.cwm.helper.ColumnHelper;
import org.talend.cwm.helper.TableHelper;
import org.talend.cwm.helper.ViewHelper;
import org.talend.cwm.relational.TdColumn;
import org.talend.cwm.relational.TdTable;
import org.talend.cwm.relational.TdView;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.foldernode.IConnectionElementSubFolder;
import org.talend.dq.writer.impl.ElementWriterFactory;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.RepositoryNode;
import org.talend.utils.exceptions.MissingDriverException;
import orgomg.cwm.resource.relational.ColumnSet;
/**
* DOC klliu class global comment. Detailled comment
*/
public class DBColumnFolderRepNode extends DQDBFolderRepositoryNode implements IConnectionElementSubFolder {
private static Logger log = Logger.getLogger(DBColumnFolderRepNode.class);
private TdTable tdTable;
private TdView tdView;
public TdTable getTdTable() {
return this.tdTable;
}
public TdView getTdView() {
return this.tdView;
}
/**
* DOC klliu DBColumnFolderRepNode constructor comment.
*
* @param object
* @param parent if parent is null will try to create new one to insert of old parent.
* @param type
*/
public DBColumnFolderRepNode(IRepositoryViewObject object, RepositoryNode parent, ENodeType type,
org.talend.core.model.general.Project inWhichProject) {
super(object, parent, type, inWhichProject);
children = new ArrayList<IRepositoryNode>();
if (parent == null) {
RepositoryNode createParentNode = createParentNode(object);
this.setParent(createParentNode);
}
}
/**
* create the node of parent.
*
* @param object
* @return
*/
private RepositoryNode createParentNode(IRepositoryViewObject object) {
RepositoryNode dbParentRepNode = null;
if (object instanceof TdTableRepositoryObject) {
dbParentRepNode = new DBTableRepNode(object, null, ENodeType.TDQ_REPOSITORY_ELEMENT, getProject());
} else if (object instanceof TdViewRepositoryObject) {
dbParentRepNode = new DBViewRepNode(object, null, ENodeType.TDQ_REPOSITORY_ELEMENT, getProject());
}
object.setRepositoryNode(dbParentRepNode);
return dbParentRepNode;
}
@Override
public List<IRepositoryNode> getChildren() {
if (!this.isReload() && !children.isEmpty()) {
// MOD gdbu 2011-6-29 bug : 22204
return filterResultsIfAny(children);
}
children.clear();
String filterCharater = null;
IRepositoryViewObject meataColumnSetObject = this.getParent().getObject();
EList<MetadataColumn> columns = null;
if (meataColumnSetObject instanceof TdTableRepositoryObject) {
TdTableRepositoryObject tdTableRepositoryObject = (TdTableRepositoryObject) meataColumnSetObject;
// MOD klliu 2011-09-06 bug TDQ-3414
setItem((ConnectionItem) tdTableRepositoryObject.getViewObject().getProperty().getItem());
if (tdTableRepositoryObject.getTdTable().eIsProxy()) {
// reload the connection to make sure the connection(and all it's owned elements) is not proxy
reloadConnectionViewObject();
}
tdTable = tdTableRepositoryObject.getTdTable();
columns = tdTable.getColumns();
filterCharater = ColumnHelper.getColumnFilter(tdTable);
} else if (meataColumnSetObject instanceof TdViewRepositoryObject) {
TdViewRepositoryObject tdViewRepositoryObject = (TdViewRepositoryObject) meataColumnSetObject;
// MOD klliu 2011-09-06 bug TDQ-3414
setItem((ConnectionItem) tdViewRepositoryObject.getViewObject().getProperty().getItem());
if (tdViewRepositoryObject.getTdView().eIsProxy()) {
// reload the connection to make sure the connection(and all it's owned elements) is not proxy
reloadConnectionViewObject();
}
tdView = tdViewRepositoryObject.getTdView();
columns = tdView.getColumns();
filterCharater = ColumnHelper.getColumnFilter(tdView);
}
setConnection(getItem().getConnection());
// MOD TDQ-8718 20140430 the repository view cares about if use the filter or not, the column select dialog
// cares about if connect to DB or not.
List<TdColumn> tdcolumns = null;
if (columns.size() <= 0) {
if (isCallingFromColumnDialog()) {
tdcolumns = loadColumns(isLoadDBFromDialog());
} else if (!isOnFilterring()) {
// MOD gdbu 2011-6-28 bug : 22204
tdcolumns = loadColumns(true);
}
} else {
tdcolumns = new ArrayList<TdColumn>();
for (MetadataColumn mec : columns) {
tdcolumns.add((TdColumn) mec);
}
}
if (tdcolumns != null && filterCharater != null && !filterCharater.equals("")) { //$NON-NLS-1$
tdcolumns = RepositoryNodeHelper.filterColumns(tdcolumns, filterCharater);
}
createTdcolumnsNode(tdcolumns, children);
this.setReload(false);
// MOD gdbu 2011-6-28 bug : 22204
return filterResultsIfAny(children);
// return children;
}
private List<TdColumn> loadColumns(boolean isLoadDB) {
List<TdColumn> tdcolumns = null;
try {
if (tdTable != null) {
tdcolumns = DqRepositoryViewService.getColumns(getConnection(), tdTable, isLoadDB);
} else if (tdView != null) {
tdcolumns = DqRepositoryViewService.getColumns(getConnection(), tdView, isLoadDB);
}
if (tdcolumns != null && tdcolumns.size() > 0) {
ElementWriterFactory.getInstance().createDataProviderWriter().save(getItem(), false);
}
} catch (MissingDriverException e) {
throw e;
} catch (Exception e) {
log.error(e, e);
}
return tdcolumns;
}
/**
* DOC klliu Comment method "createTdcolumnsNode".
*
* @param tdcolumns
* @param repsNodes
*/
private void createTdcolumnsNode(List<TdColumn> tdcolumns, List<IRepositoryNode> repsNodes) {
if (tdcolumns != null) {
for (MetadataColumn tdColumn : tdcolumns) {
MetadataColumnRepositoryObject metadataColumn = new MetadataColumnRepositoryObject(this.getParent().getObject(),
tdColumn);
metadataColumn.setId(tdColumn.getName());
metadataColumn.setLabel(tdColumn.getName());
DBColumnRepNode columnNode = new DBColumnRepNode(metadataColumn, this, ENodeType.TDQ_REPOSITORY_ELEMENT,
getProject());
columnNode.setProperties(EProperties.LABEL, ERepositoryObjectType.METADATA_CON_COLUMN);
columnNode.setProperties(EProperties.CONTENT_TYPE, ERepositoryObjectType.METADATA_CON_COLUMN);
metadataColumn.setRepositoryNode(columnNode);
repsNodes.add(columnNode);
}
}
}
/**
* return the TdTable or TdView, or null.
*
* @return
*/
public ColumnSet getColumnSet() {
return this.getTdTable() != null ? this.getTdTable() : this.getTdView();
}
/*
* (non-Javadoc)
*
* @see org.talend.repository.model.RepositoryNode#getLabel()
*/
@Override
public String getLabel() {
return "Columns (" + getChildrenCount() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* TDQ-11431: use this way to get children count correctly.
*
* @return
*/
private int getChildrenCount() {
List<TdColumn> columnsList = new ArrayList<TdColumn>();
IRepositoryViewObject object = this.getParent().getObject();
if (object instanceof TdTableRepositoryObject) {
tdTable = (TdTable) ((TdTableRepositoryObject) object).getTable();
columnsList = TableHelper.getColumns(tdTable);
} else {
tdView = ((TdViewRepositoryObject) object).getTdView();
columnsList = ViewHelper.getColumns(tdView);
}
return columnsList.size();
}
}