// ============================================================================
//
// 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.action;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.ui.PlatformUI;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.properties.Item;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.repository.model.repositoryObject.MetadataColumnRepositoryObject;
import org.talend.core.repository.model.repositoryObject.MetadataXmlElementTypeRepositoryObject;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.cwm.relational.TdTable;
import org.talend.cwm.relational.TdView;
import org.talend.dataprofiler.core.ImageLib;
import org.talend.dataprofiler.core.helper.ModelElementIndicatorHelper;
import org.talend.dataprofiler.core.model.ModelElementIndicator;
import org.talend.dataprofiler.core.ui.editor.analysis.AnalysisEditor;
import org.talend.dataprofiler.core.ui.editor.analysis.ColumnAnalysisDetailsPage;
import org.talend.dataprofiler.core.ui.utils.ModelElementIndicatorRule;
import org.talend.dataprofiler.core.ui.wizard.analysis.WizardFactory;
import org.talend.dataquality.analysis.AnalysisType;
import org.talend.dataquality.analysis.ExecutionLanguage;
import org.talend.dq.analysis.parameters.AnalysisLabelParameter;
import org.talend.dq.analysis.parameters.AnalysisParameter;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.indicator.type.IndicatorEnum;
import org.talend.repository.model.IRepositoryNode;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* DOC zqin class global comment. Detailled comment
*/
public abstract class AbstractPredefinedAnalysisAction extends Action {
private StructuredSelection selection;
private final ImageDescriptor defaultImage = ImageLib.getImageDescriptor(ImageLib.ACTION_NEW_ANALYSIS);
public AbstractPredefinedAnalysisAction(String name, ImageDescriptor image) {
super(name);
if (image == null) {
super.setImageDescriptor(defaultImage);
} else {
super.setImageDescriptor(image);
}
}
public StructuredSelection getSelection() {
return selection;
}
public void setSelection(StructuredSelection selection) {
this.selection = selection;
}
protected IRepositoryNode[] getColumns() {
return RepositoryNodeHelper.getAllColumnNodes(getSelection().toArray());
}
/**
* DOC qzhang Comment method "getStandardAnalysisWizardDialog".
*
* @return
*/
protected WizardDialog getStandardAnalysisWizardDialog() {
return getStandardAnalysisWizardDialog(AnalysisType.MULTIPLE_COLUMN);
}
protected WizardDialog getStandardAnalysisWizardDialog(AnalysisType type) {
// MOD klliu 2011-02-17 feature 15387
AnalysisLabelParameter parameter = null;
Object firstElement = this.selection.getFirstElement();
if (firstElement instanceof IRepositoryNode) {
IRepositoryNode node = (IRepositoryNode) firstElement;
Item item = node.getObject().getProperty().getItem();
if (item instanceof ConnectionItem) {
ConnectionItem connectionItem = (ConnectionItem) item;
Connection connection = connectionItem.getConnection();
IRepositoryNode repositoryNode = RepositoryNodeHelper.recursiveFind(connection);
parameter = new AnalysisLabelParameter();
parameter.setCategoryLabel(getCategoryLabel());
parameter.setColumnNodes(getColumns());
parameter.setConnectionRepNode(repositoryNode);
return getStandardAnalysisWizardDialog(type, parameter);
}
} else if (firstElement instanceof TdTable) {
Connection connection = ConnectionHelper.getConnection((TdTable) firstElement);
IRepositoryNode repositoryNode = RepositoryNodeHelper.recursiveFind(connection);
parameter = new AnalysisLabelParameter();
parameter.setCategoryLabel(getCategoryLabel());
parameter.setColumnNodes(getColumns());
parameter.setConnectionRepNode(repositoryNode);
return getStandardAnalysisWizardDialog(type, parameter);
} else if (firstElement instanceof TdView) { // Added yyin 20120522 TDQ-4945, support tdView
Connection connection = ConnectionHelper.getConnection((TdView) firstElement);
IRepositoryNode repositoryNode = RepositoryNodeHelper.recursiveFind(connection);
parameter = new AnalysisLabelParameter();
parameter.setCategoryLabel(getCategoryLabel());
parameter.setColumnNodes(getColumns());
parameter.setConnectionRepNode(repositoryNode);
return getStandardAnalysisWizardDialog(type, parameter);
// ~4945
}
// if (firstElement instanceof DBTableRepNode) {
// DBTableRepNode tableNode = (DBTableRepNode) firstElement;
// TdTableRepositoryObject viewObject = (TdTableRepositoryObject) tableNode.getObject();
// Item item = viewObject.getProperty().getItem();
// DatabaseConnectionItem databaseConnectionItem = (DatabaseConnectionItem) item;
// Connection connection = databaseConnectionItem.getConnection();
//
// IRepositoryNode repositoryNode = RepositoryNodeHelper.recursiveFind(connection);
// parameter = new AnalysisParameter();
// parameter.setConnectionRepNode((DBConnectionRepNode) repositoryNode);
// return getStandardAnalysisWizardDialog(type, parameter);
// } else if (firstElement instanceof TdTable) {
// Connection connection = ConnectionHelper.getConnection((TdTable) firstElement);
// IRepositoryNode repositoryNode = RepositoryNodeHelper.recursiveFind(connection);
// parameter = new AnalysisParameter();
// parameter.setConnectionRepNode((DBConnectionRepNode) repositoryNode);
// return getStandardAnalysisWizardDialog(type, parameter);
// } else if (firstElement instanceof DBColumnRepNode) {
// // MOD klliu 2011-02-23 feature 15387
// DBColumnRepNode columnNode = (DBColumnRepNode) firstElement;
// MetadataColumnRepositoryObject viewObject = (MetadataColumnRepositoryObject) columnNode.getObject();
// Item item = viewObject.getProperty().getItem();
// DatabaseConnectionItem databaseConnectionItem = (DatabaseConnectionItem) item;
// Connection connection = databaseConnectionItem.getConnection();
//
// IRepositoryNode repositoryNode = RepositoryNodeHelper.recursiveFind(connection);
// parameter = new AnalysisParameter();
// parameter.setConnectionRepNode((DBConnectionRepNode) repositoryNode);
// return getStandardAnalysisWizardDialog(type, parameter);
// }
return getStandardAnalysisWizardDialog(type, null);
}
protected WizardDialog getStandardAnalysisWizardDialog(AnalysisType type, AnalysisParameter parameter) {
Wizard wizard = WizardFactory.createAnalysisWizard(type, parameter);
wizard.setForcePreviousAndNextButtons(true);
WizardDialog dialog = new WizardDialog(null, wizard);
dialog.setPageSize(500, 340);
return dialog;
}
protected ColumnAnalysisDetailsPage getMasterPage() {
AnalysisEditor editor = (AnalysisEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.getActiveEditor();
if (editor != null) {
return (ColumnAnalysisDetailsPage) editor.getMasterPage();
} else {
return null;
}
}
protected ModelElementIndicator[] composePredefinedColumnIndicator(IndicatorEnum[] allowedEnum) {
IRepositoryNode[] columns = getColumns();
ModelElementIndicator[] predefinedColumnIndicator = new ModelElementIndicator[columns.length];
ExecutionLanguage language = ExecutionLanguage.get(getMasterPage().getExecCombo().getText());
for (int i = 0; i < columns.length; i++) {
IRepositoryNode columnNode = columns[i];
ModelElementIndicator columnIndicator = ModelElementIndicatorHelper.createModelElementIndicator(columnNode);
for (IndicatorEnum oneEnum : allowedEnum) {
columnIndicator.addTempIndicatorEnum(oneEnum);
if (oneEnum.getChildren() != null) {
for (IndicatorEnum childEnum : oneEnum.getChildren()) {
// MOD by zshen:need language to decide DatePatternFrequencyIndicator whether can be choose by
// user.
IRepositoryViewObject object = columnNode.getObject();
ModelElement element = null;
if (object instanceof MetadataColumnRepositoryObject) {
element = ((MetadataColumnRepositoryObject) object).getTdColumn();
} else if (object instanceof MetadataXmlElementTypeRepositoryObject) {
element = ((MetadataXmlElementTypeRepositoryObject) object).getModelElement();
}
if (element != null && ModelElementIndicatorRule.patternRule(childEnum, element, language)) {
columnIndicator.addTempIndicatorEnum(childEnum);
}
}
}
}
columnIndicator.storeTempIndicator();
predefinedColumnIndicator[i] = columnIndicator;
}
return predefinedColumnIndicator;
}
@Override
public void run() {
// do something before open the wizard
if (preDo()) {
WizardDialog dialog = getPredefinedDialog();
if (dialog == null) {
dialog = getStandardAnalysisWizardDialog();
}
dialog.setPageSize(500, 340);
if (dialog.open() == Window.OK) {
ModelElementIndicator[] predefinedColumnIndicator = getPredefinedColumnIndicator();
if (predefinedColumnIndicator != null) {
ColumnAnalysisDetailsPage masterPage = getMasterPage();
if (masterPage != null) {
masterPage.refreshPreviewTable(predefinedColumnIndicator, false);
masterPage.refreshTheTree(predefinedColumnIndicator);
if (needChangeExecuteLanguageToJava()) {
masterPage.changeExecuteLanguageToJava(true);
}
masterPage.doSave(null);
}
}
}
}
}
protected abstract ModelElementIndicator[] getPredefinedColumnIndicator();
protected abstract String getCategoryLabel();
protected abstract WizardDialog getPredefinedDialog();
protected abstract boolean isAllowed();
protected abstract boolean preDo();
protected boolean needChangeExecuteLanguageToJava() {
return false;
}
}