// ============================================================================
//
// 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.wizard.analysis.column;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.ui.PlatformUI;
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.dataprofiler.core.helper.ModelElementIndicatorHelper;
import org.talend.dataprofiler.core.model.ModelElementIndicator;
import org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage;
import org.talend.dataprofiler.core.ui.editor.analysis.AnalysisEditor;
import org.talend.dataprofiler.core.ui.editor.analysis.ColumnAnalysisDetailsPage;
import org.talend.dataprofiler.core.ui.editor.analysis.ColumnSetAnalysisDetailsPage;
import org.talend.dataprofiler.core.ui.utils.ModelElementIndicatorRule;
import org.talend.dataprofiler.core.ui.utils.RepNodeUtils;
import org.talend.dataprofiler.core.ui.wizard.analysis.AbstractAnalysisWizard;
import org.talend.dataprofiler.core.ui.wizard.analysis.AnalysisMetadataWizardPage;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.analysis.AnalysisType;
import org.talend.dataquality.analysis.ExecutionLanguage;
import org.talend.dataquality.indicators.Indicator;
import org.talend.dq.analysis.parameters.AnalysisLabelParameter;
import org.talend.dq.analysis.parameters.AnalysisParameter;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.indicators.definitions.DefinitionHandler;
import org.talend.dq.nodes.indicator.type.IndicatorEnum;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.RepositoryNode;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* @author zqin
*/
public class ColumnWizard extends AbstractAnalysisWizard {
private IWizardPage[] extenalPages;
private Indicator indicator;
protected ColumnAnalysisDOSelectionPage selectionPage;
public IWizardPage[] getExtenalPages() {
if (extenalPages == null) {
return new WizardPage[0];
}
return extenalPages;
}
public void setExtenalPages(IWizardPage[] extenalPages) {
this.extenalPages = extenalPages;
}
public ColumnWizard(AnalysisParameter parameter) {
super(parameter);
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.wizard.analysis.AbstractAnalysisWizard#initCWMResourceBuilder()
*/
@Override
public ModelElement initCWMResourceBuilder() {
Analysis analysis = (Analysis) super.initCWMResourceBuilder();
if (indicator != null) {
DefinitionHandler.getInstance().setDefaultIndicatorDefinition(indicator);
analysis.getResults().getIndicators().add(indicator);
}
return analysis;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.wizard.Wizard#addPages()
*/
@Override
public void addPages() {
addPage(new AnalysisMetadataWizardPage());
AnalysisParameter parameter = (AnalysisParameter) getParameter();
if (parameter.getConnectionRepNode() == null
&& (parameter.getAnalysisType().equals(AnalysisType.MULTIPLE_COLUMN) || parameter.getAnalysisType().equals(
AnalysisType.COLUMN_SET))) {
selectionPage = new ColumnAnalysisDOSelectionPage();
addPage(selectionPage);
}
for (IWizardPage page : getExtenalPages()) {
addPage(page);
}
}
/**
* Sets the indicator.
*
* @param indicator the indicator to set
*/
public void setIndicator(Indicator indicator) {
this.indicator = indicator;
}
/**
* Getter for indicator.
*
* @return the indicator
*/
public Indicator getIndicator() {
return this.indicator;
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dataprofiler.core.ui.wizard.analysis.AbstractAnalysisWizard#openEditor(org.talend.repository.model.IRepositoryNode
* )
*/
@Override
public void openEditor(IRepositoryNode repNode) {
super.openEditor(repNode);
if (this.selectionPage != null) {
AnalysisEditor editor = (AnalysisEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.getActiveEditor();
if (editor != null) {
AbstractAnalysisMetadataPage masterPage = editor.getMasterPage();
List<IRepositoryNode> nodes = this.selectionPage.nodes;
if (nodes != null && nodes.size() > 0) {
// MOD msjian TDQ-6665 2013-1-7: after the wizard, make the editor is saved status
if (masterPage instanceof ColumnAnalysisDetailsPage) {
((ColumnAnalysisDetailsPage) masterPage)
.setTreeViewInput(nodes.toArray(new RepositoryNode[nodes.size()]));
ModelElementIndicator[] predefinedColumnIndicator = this.getPredefinedColumnIndicator();
if (predefinedColumnIndicator != null) {
((ColumnAnalysisDetailsPage) masterPage).refreshPreviewTable(predefinedColumnIndicator, false);
((ColumnAnalysisDetailsPage) masterPage).refreshTheTree(predefinedColumnIndicator);
}
// TDQ-12349: when the database can not support PatternFrequency, set to java engine automatically
if (this instanceof PatternFrequencyWizard && !RepNodeUtils.isSupportPatternFrequency(nodes)) {
masterPage.changeExecuteLanguageToJava(true);
}
// TDQ-12349~
} else if (masterPage instanceof ColumnSetAnalysisDetailsPage) {
((ColumnSetAnalysisDetailsPage) masterPage).setTreeViewInput(nodes.toArray(new RepositoryNode[nodes
.size()]));
} else {
masterPage.getTreeViewer().setInput(nodes.toArray(new RepositoryNode[nodes.size()]));
}
masterPage.doSave(new NullProgressMonitor());
// TDQ-6665~
}
}
}
}
/**
* DOC msjian Comment method "getPredefinedColumnIndicator".
*
* @return
*/
protected ModelElementIndicator[] getPredefinedColumnIndicator() {
// need to implement in the subClass
return null;
}
protected ModelElementIndicator[] composePredefinedColumnIndicator(IndicatorEnum[] allowedEnum) {
List<IRepositoryNode> nodes;
// from the right menu
if (selectionPage == null) {
nodes = Arrays.asList(((AnalysisLabelParameter) parameter).getColumnNodes());
} else {
// TDQ-11240: get all the column nodes
nodes = Arrays.asList(RepositoryNodeHelper.getAllColumnNodes(selectionPage.nodes
.toArray(new IRepositoryNode[selectionPage.nodes.size()])));
}
ModelElementIndicator[] predefinedColumnIndicator = new ModelElementIndicator[nodes.size()];
for (int i = 0; i < nodes.size(); i++) {
IRepositoryNode columnNode = nodes.get(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, ExecutionLanguage.SQL)) {
columnIndicator.addTempIndicatorEnum(childEnum);
}
}
}
}
columnIndicator.storeTempIndicator();
predefinedColumnIndicator[i] = columnIndicator;
}
return predefinedColumnIndicator;
}
}