// ============================================================================
//
// 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.ui.dialog;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Shell;
import org.talend.cwm.relational.TdColumn;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.ui.dialog.provider.DBTablesViewLabelProvider;
import org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage;
import org.talend.dataprofiler.core.ui.views.provider.ResourceViewContentProvider;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.DBCatalogRepNode;
import org.talend.dq.nodes.DBColumnRepNode;
import org.talend.dq.nodes.DBConnectionRepNode;
import org.talend.dq.nodes.DBSchemaRepNode;
import org.talend.dq.nodes.DBTableFolderRepNode;
import org.talend.dq.nodes.DBTableRepNode;
import org.talend.dq.nodes.DBViewFolderRepNode;
import org.talend.dq.nodes.DBViewRepNode;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.RepositoryNode;
import orgomg.cwm.resource.relational.ColumnSet;
/**
* show the columns which need to create Duplicates Analysis.
*/
public class ColumnsMapSelectionDialog extends ColumnsSelectionDialog {
private Map<ColumnSet, List<TdColumn>> allMap = new HashMap<ColumnSet, List<TdColumn>>();
public void setAllMap(Map<ColumnSet, List<TdColumn>> allMap) {
if (allMap != null && !allMap.isEmpty()) {
this.allMap = allMap;
if (this.fContentProvider != null) {
((ConnectionColumnSetContentProvider) this.fContentProvider).init(allMap);
}
if (this.sContentProvider != null && this.checkedRepoNodes != null) {
((ColumnContentProvider) this.sContentProvider).init(this.checkedRepoNodes);
}
}
}
private Map<ColumnSet, List<TdColumn>> userMap = new HashMap<ColumnSet, List<TdColumn>>();
public Map<ColumnSet, List<TdColumn>> getUserMap() {
return this.userMap;
}
private List<? extends IRepositoryNode> checkedRepoNodes;
/**
* DOC xqliu ColumnsMapSelectionDialog constructor comment.
*
* @param metadataFormPage
* @param parent
* @param title
* @param checkedRepoNodes
* @param rootNode
* @param message
*/
public ColumnsMapSelectionDialog(AbstractAnalysisMetadataPage metadataFormPage, Shell parent, String title,
List<? extends IRepositoryNode> checkedRepoNodes, RepositoryNode rootNode, String message) {
super(metadataFormPage, parent, title, checkedRepoNodes, rootNode, message);
this.checkedRepoNodes = checkedRepoNodes;
}
@Override
protected void initProvider() {
this.fLabelProvider = new DBTablesViewLabelProvider();
this.fContentProvider = new ConnectionColumnSetContentProvider();
this.sLabelProvider = new DBTablesViewLabelProvider();
this.sContentProvider = new ColumnContentProvider();
}
@Override
protected void okPressed() {
this.allCheckedElements.clear();
getAllCheckElements();
if (this.allCheckedElements.size() == 0) {
MessageDialog.openWarning(this.getShell(),
DefaultMessagesImpl.getString("ColumnsMapSelectionDialog.columnSelection"),
DefaultMessagesImpl.getString("ColumnsMapSelectionDialog.noColumnSelected"));
} else {
buildUserMap(this.allCheckedElements);
super.okPressed();
this.modelElementCheckedMap = null;
}
}
/**
* DOC xqliu Comment method "buildUserMap".
*
* @param allCheckedElements
*/
private void buildUserMap(List<IRepositoryNode> allCheckedElements) {
if (allCheckedElements != null && !allCheckedElements.isEmpty()) {
List<TdColumn> userColumnsAll = new ArrayList<TdColumn>();
for (IRepositoryNode node : allCheckedElements) {
if (node instanceof DBColumnRepNode) {
userColumnsAll.add(((DBColumnRepNode) node).getTdColumn());
}
}
Set<ColumnSet> keySet = this.allMap.keySet();
for (ColumnSet cs : keySet) {
List<TdColumn> userColumns = new ArrayList<TdColumn>();
List<TdColumn> list = this.allMap.get(cs);
for (TdColumn column : list) {
if (userColumnsAll.contains(column)) {
userColumns.add(column);
}
}
if (!userColumns.isEmpty()) {
this.userMap.put(cs, userColumns);
}
}
}
}
@Override
protected void updateStatusBySelection() {
// empty implement here, because it could select different table and the OK button are enabled.
}
/**
* DOC xqliu ColumnsMapSelectionDialog class global comment. Detailled comment
*/
class ConnectionColumnSetContentProvider extends ResourceViewContentProvider {
List<RepositoryNode> nodes = new ArrayList<RepositoryNode>();
public ConnectionColumnSetContentProvider() {
super();
}
/**
* DOC xqliu Comment method "init".
*
* @param map
*/
public void init(Map<ColumnSet, List<TdColumn>> map) {
List<RepositoryNode> columnSetNodes = new ArrayList<RepositoryNode>();
List<RepositoryNode> folderNodes = new ArrayList<RepositoryNode>();
List<RepositoryNode> schemaNodes = new ArrayList<RepositoryNode>();
List<RepositoryNode> catalogNodes = new ArrayList<RepositoryNode>();
if (map != null && !map.isEmpty()) {
Set<ColumnSet> keySet = map.keySet();
for (ColumnSet cs : keySet) {
columnSetNodes.add(RepositoryNodeHelper.recursiveFind(cs));
}
for (RepositoryNode csNode : columnSetNodes) {
RepositoryNode parent = csNode.getParent();
if (!folderNodes.contains(parent)) {
folderNodes.add(parent);
}
}
for (RepositoryNode folderNode : folderNodes) {
RepositoryNode parent = folderNode.getParent();
if (parent instanceof DBSchemaRepNode) {
if (!schemaNodes.contains(parent)) {
schemaNodes.add(parent);
}
} else if (parent instanceof DBCatalogRepNode) {
if (!catalogNodes.contains(parent)) {
catalogNodes.add(parent);
}
}
}
for (RepositoryNode schemaNode : schemaNodes) {
RepositoryNode parent = schemaNode.getParent();
if (parent instanceof DBCatalogRepNode) {
if (!catalogNodes.contains(parent)) {
catalogNodes.add(parent);
}
}
}
}
this.nodes.addAll(columnSetNodes);
this.nodes.addAll(folderNodes);
this.nodes.addAll(schemaNodes);
this.nodes.addAll(catalogNodes);
}
@Override
public Object[] getChildren(Object parentElement) {
List result = new ArrayList();
Object[] children = super.getChildren(parentElement);
if (children != null && children.length > 0) {
if (parentElement instanceof DBConnectionRepNode || parentElement instanceof DBCatalogRepNode
|| parentElement instanceof DBSchemaRepNode || parentElement instanceof DBTableFolderRepNode
|| parentElement instanceof DBViewFolderRepNode) {
for (Object node : children) {
if (this.nodes.contains(node)) {
result.add(node);
}
}
}
}
return result.toArray();
}
@Override
public Object getParent(Object element) {
Object parent = null;
if (element instanceof RepositoryNode) {
RepositoryNode repoNode = (RepositoryNode) element;
parent = repoNode.getParent();
} else {
parent = super.getParent(element);
}
return parent;
}
@Override
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
}
/**
* DOC xqliu ColumnsMapSelectionDialog class global comment. Detailled comment
*/
class ColumnContentProvider extends ResourceViewContentProvider {
private List<RepositoryNode> nodes = new ArrayList<RepositoryNode>();
public ColumnContentProvider() {
super();
}
public void init(List<? extends IRepositoryNode> checkedRepoNodes) {
if (checkedRepoNodes != null && !checkedRepoNodes.isEmpty()) {
for (IRepositoryNode iNode : checkedRepoNodes) {
this.nodes.add((RepositoryNode) iNode);
}
}
}
@Override
public Object[] getChildren(Object parentElement) {
List result = new ArrayList();
if (parentElement instanceof DBTableRepNode || parentElement instanceof DBViewRepNode) {
IRepositoryNode repoNode = (IRepositoryNode) parentElement;
if (repoNode.getChildren().size() != 0) {
List<IRepositoryNode> children = repoNode.getChildren().get(0).getChildren();
if (children != null && !children.isEmpty()) {
for (IRepositoryNode node : children) {
if (this.nodes.contains(node)) {
result.add(node);
}
}
}
}
}
return result.toArray();
}
@Override
public Object getParent(Object element) {
if (element instanceof RepositoryNode) {
RepositoryNode repoNode = (RepositoryNode) element;
return repoNode.getParent();
}
return super.getParent(element);
}
@Override
public boolean hasChildren(Object element) {
return Boolean.FALSE;
}
}
}