// ============================================================================
//
// 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.editor.analysis;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.emf.common.util.EList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.repository.model.repositoryObject.MetadataColumnRepositoryObject;
import org.talend.cwm.dependencies.DependenciesHandler;
import org.talend.cwm.helper.ColumnHelper;
import org.talend.cwm.helper.ColumnSetHelper;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.cwm.relational.TdColumn;
import org.talend.dataprofiler.core.PluginConstant;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.ui.editor.composite.AnalysisColumnCompareTreeViewer;
import org.talend.dataprofiler.core.ui.editor.composite.DataFilterComp;
import org.talend.dataquality.domain.Domain;
import org.talend.dataquality.exception.DataprofilerCoreException;
import org.talend.dataquality.helpers.AnalysisHelper;
import org.talend.dataquality.indicators.Indicator;
import org.talend.dataquality.indicators.columnset.ColumnsetFactory;
import org.talend.dataquality.indicators.columnset.RowMatchingIndicator;
import org.talend.dq.analysis.AnalysisBuilder;
import org.talend.dq.analysis.AnalysisHandler;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.indicators.definitions.DefinitionHandler;
import org.talend.dq.writer.impl.ElementWriterFactory;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.RepositoryNode;
import org.talend.utils.sql.Java2SqlType;
import org.talend.utils.sugars.ReturnCode;
import org.talend.utils.sugars.TypedReturnCode;
import orgomg.cwm.objectmodel.core.Dependency;
import orgomg.cwm.objectmodel.core.ModelElement;
import orgomg.cwm.resource.relational.ColumnSet;
/**
* This page show the comparisons information of column set.
*/
public class RedundancyAnalysisDetailsPage extends AbstractAnalysisMetadataPage implements PropertyChangeListener {
private static Logger log = Logger.getLogger(RedundancyAnalysisDetailsPage.class);
private RowMatchingIndicator rowMatchingIndicatorA;
private RowMatchingIndicator rowMatchingIndicatorB;
private AnalysisColumnCompareTreeViewer anaColumnCompareViewer;
private Section columnsComparisonSection = null;
DataFilterComp dataFilterCompA;
DataFilterComp dataFilterCompB;
private String stringDataFilterA;
private String stringDataFilterB;
public RedundancyAnalysisDetailsPage(FormEditor editor, String id, String title) {
super(editor, id, title);
}
public Section getColumnsComparisonSection() {
return this.columnsComparisonSection;
}
public void setColumnsComparisonSection(Section columnsComparisonSection) {
this.columnsComparisonSection = columnsComparisonSection;
}
@Override
public void initialize(FormEditor editor) {
super.initialize(editor);
// MOD xqliu 2009-06-10 bug7334
stringDataFilterA = AnalysisHelper.getStringDataFilter(getCurrentModelElement(), 0);
stringDataFilterB = AnalysisHelper.getStringDataFilter(getCurrentModelElement(), 1);
// ~
if (getCurrentModelElement().getResults().getIndicators().size() == 0) {
ColumnsetFactory factory = ColumnsetFactory.eINSTANCE;
rowMatchingIndicatorA = factory.createRowMatchingIndicator();
rowMatchingIndicatorB = factory.createRowMatchingIndicator();
Indicator[] currentIndicators = new Indicator[] { rowMatchingIndicatorA, rowMatchingIndicatorB };
setDefaultIndDef(currentIndicators);
} else {
EList<Indicator> indicators = getCurrentModelElement().getResults().getIndicators();
rowMatchingIndicatorA = (RowMatchingIndicator) indicators.get(0);
rowMatchingIndicatorB = (RowMatchingIndicator) indicators.get(1);
}
}
/**
* DOC rli Comment method "setDefaultIndDef".
*
* @param indicator
*/
private void setDefaultIndDef(Indicator[] indicators) {
for (int i = 0; i < indicators.length; i++) {
if (!DefinitionHandler.getInstance().setDefaultIndicatorDefinition(indicators[i])) {
log.error(DefaultMessagesImpl.getString("TableIndicator.couldnotSetDef") + indicators[i].getName());//$NON-NLS-1$
}
}
}
@Override
protected void createFormContent(IManagedForm managedForm) {
setFormTitle(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.columnSetComparisionAnalysis")); //$NON-NLS-1$
setMetadataSectionTitle(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.analysisMetadata")); //$NON-NLS-1$
setMetadataSectionDescription(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.setAnalysisProperties")); //$NON-NLS-1$
super.createFormContent(managedForm);
// MOD mzhao 2009-06-17 feature 5887.
anaColumnCompareViewer = new AnalysisColumnCompareTreeViewer(this, topComp, getCurrentModelElement(), false);
columnsComparisonSection = anaColumnCompareViewer.getColumnsComparisonSection();
anaColumnCompareViewer.refreash();
anaColumnCompareViewer.addPropertyChangeListener(this);
createDataFilterSection(form, topComp);
createAnalysisParamSection(form, topComp);
createContextGroupSection(form, topComp);
}
@Override
void createDataFilterSection(final ScrolledForm form, Composite anasisDataComp) {
dataFilterSection = createSection(
form,
anasisDataComp,
DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.dataFilter"), DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.editDataFilter")); //$NON-NLS-1$ //$NON-NLS-2$
Composite sectionClient = toolkit.createComposite(dataFilterSection);
sectionClient.setLayoutData(new GridData(GridData.FILL_BOTH));
sectionClient.setLayout(new GridLayout());
SashForm sashForm = new SashForm(sectionClient, SWT.NULL);
sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite leftComp = toolkit.createComposite(sashForm);
leftComp.setLayoutData(new GridData(GridData.FILL_BOTH));
leftComp.setLayout(new GridLayout());
dataFilterCompA = new DataFilterComp(leftComp, stringDataFilterA);
installProposals(dataFilterCompA.getDataFilterText());
dataFilterCompA.addPropertyChangeListener(this);
dataFilterCompA.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
AnalysisHelper.setStringDataFilter(getCurrentModelElement(), dataFilterCompA.getDataFilterString(), 0);
}
});
Composite rightComp = toolkit.createComposite(sashForm);
rightComp.setLayoutData(new GridData(GridData.FILL_BOTH));
rightComp.setLayout(new GridLayout());
dataFilterCompB = new DataFilterComp(rightComp, stringDataFilterB);
installProposals(dataFilterCompB.getDataFilterText());
dataFilterCompB.addPropertyChangeListener(this);
dataFilterCompB.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
AnalysisHelper.setStringDataFilter(getCurrentModelElement(), dataFilterCompB.getDataFilterString(), 1);
}
});
// ADD yyi 2011-05-31 16158:add whitespace check for text fields.
addWhitespaceValidate(dataFilterCompA.getDataFilterText(), dataFilterCompB.getDataFilterText());
dataFilterSection.setClient(sectionClient);
}
/**
*
* DOC mzhao Open column selection dialog for left column set. this method is intended to use from cheat sheets.
*/
public void openColumnsSetASelectionDialog() {
anaColumnCompareViewer.openColumnsSetASelectionDialog();
}
/**
*
* DOC mzhao Open column selection dialog for right column set. this method is intended to use from cheat sheets.
*/
public void openColumnsSetBSelectionDialog() {
anaColumnCompareViewer.openColumnsSetBSelectionDialog();
}
public AnalysisHandler getAnalysisHandler() {
AnalysisHandler analysisHandler = new AnalysisHandler();
analysisHandler.setAnalysis(getCurrentModelElement());
return analysisHandler;
}
@Override
protected void saveAnalysis() throws DataprofilerCoreException {
for (Domain domain : getCurrentModelElement().getParameters().getDataFilter()) {
domain.setName(getCurrentModelElement().getName());
}
IRepositoryViewObject reposObject = null;
getAnalysisHandler().clearAnalysis();
List<ModelElement> analysedElements = new ArrayList<ModelElement>();
anaColumnCompareViewer.setColumnABForMatchingIndicator(rowMatchingIndicatorA, anaColumnCompareViewer.getColumnListA(),
anaColumnCompareViewer.getColumnListB());
anaColumnCompareViewer.setColumnABForMatchingIndicator(rowMatchingIndicatorB, anaColumnCompareViewer.getColumnListB(),
anaColumnCompareViewer.getColumnListA());
Connection tdDataProvider = null;
for (int i = 0; i < anaColumnCompareViewer.getColumnListA().size(); i++) {
reposObject = anaColumnCompareViewer.getColumnListA().get(i).getObject();
analysedElements.add(((MetadataColumnRepositoryObject) reposObject).getTdColumn());
}
for (int i = 0; i < anaColumnCompareViewer.getColumnListB().size(); i++) {
reposObject = anaColumnCompareViewer.getColumnListB().get(i).getObject();
analysedElements.add(((MetadataColumnRepositoryObject) reposObject).getTdColumn());
}
if (analysedElements.size() > 0) {
tdDataProvider = ConnectionHelper.getTdDataProvider((TdColumn) analysedElements.get(0));
// MOD qiongli bug 14437:Add dependency
getCurrentModelElement().getContext().setConnection(tdDataProvider);
TypedReturnCode<Dependency> rc = DependenciesHandler.getInstance().setDependencyOn(getCurrentModelElement(),
tdDataProvider);
if (!rc.isOk()) {
log.info("fail to save dependency analysis:" + getCurrentModelElement().getFileName());//$NON-NLS-1$
}
} else {
getCurrentModelElement().getContext().setConnection(null);
}
AnalysisBuilder anaBuilder = new AnalysisBuilder();
anaBuilder.setAnalysis(getCurrentModelElement());
if (anaColumnCompareViewer.getCheckComputeButton().getSelection()) {
getCurrentModelElement().getParameters().getDeactivatedIndicators().add(rowMatchingIndicatorB);
} else {
getCurrentModelElement().getParameters().getDeactivatedIndicators().clear();
}
anaBuilder.addElementsToAnalyze(analysedElements.toArray(new ModelElement[analysedElements.size()]), new Indicator[] {
rowMatchingIndicatorA, rowMatchingIndicatorB });
// save the number of connections per analysis
this.saveNumberOfConnectionsPerAnalysis();
// 2011.1.12 MOD by zhsne to unify anlysis and connection id when saving.
this.nameText.setText(getCurrentModelElement().getName());
// MOD yyi 2012-02-08 TDQ-4621:Explicitly set true for updating dependencies.
ReturnCode saved = ElementWriterFactory.getInstance().createAnalysisWrite()
.save(getCurrentRepNode().getObject().getProperty().getItem(), true);
// MOD yyi 2012-02-03 TDQ-3602:Avoid to rewriting all analyzes after saving, no reason to update all analyzes
// which is depended in the referred connection.
// Extract saving log function.
// @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#logSaved(ReturnCode)
logSaved(saved);
// ADD xqliu 2012-04-19 TDQ-5005
anaColumnCompareViewer.setDirty(false);
dataFilterCompA.setDirty(false);
dataFilterCompB.setDirty(false);
}
@Override
public void refreshGraphicsInSettingsPage() {
// do nothing
}
@Override
public ReturnCode canSave() {
// MOD by gdbu 2011-3-21 bug 19179
ReturnCode canModRetCode = super.canSave();
if (!canModRetCode.isOk()) {
return canModRetCode;
}
// ~19179
if (anaColumnCompareViewer.getColumnListA().size() != anaColumnCompareViewer.getColumnListB().size()) {
return new ReturnCode(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.columnsSameMessage"), false); //$NON-NLS-1$
}
List<TdColumn> columnAList = new ArrayList<TdColumn>();
List<TdColumn> columnBList = new ArrayList<TdColumn>();
for (RepositoryNode rd : anaColumnCompareViewer.getColumnListA()) {
columnAList.add((TdColumn) ((MetadataColumnRepositoryObject) rd.getObject()).getTdColumn());
}
for (RepositoryNode rd : anaColumnCompareViewer.getColumnListB()) {
columnBList.add((TdColumn) ((MetadataColumnRepositoryObject) rd.getObject()).getTdColumn());
}
if (anaColumnCompareViewer.getColumnListA().size() > 0) {
if (!ColumnHelper.isFromSameTable(columnAList) || !ColumnHelper.isFromSameTable(columnBList)) {
return new ReturnCode(
DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.notSameElementMessage"), false); //$NON-NLS-1$
}
for (int i = 0; i < anaColumnCompareViewer.getColumnListA().size(); i++) {
TdColumn columnA = columnAList.get(i);
TdColumn columnB = columnBList.get(i);
ColumnSet ownerA = ColumnHelper.getColumnOwnerAsColumnSet(columnA);
ColumnSet ownerB = ColumnHelper.getColumnOwnerAsColumnSet(columnB);
int typeA = columnA.getSqlDataType().getJavaDataType();
int typeB = columnB.getSqlDataType().getJavaDataType();
if (!Java2SqlType.isGenericSameType(typeA, typeB)) {
return new ReturnCode(
DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.notSameColumnType"), false); //$NON-NLS-1$
}
if (!ColumnSetHelper.isFromSamePackage(ownerA, ownerB)) {
return new ReturnCode(
DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.schemaSameMessage"), false); //$NON-NLS-1$
}
}
List<TdColumn> allColumns = new ArrayList<TdColumn>();
allColumns.addAll(columnAList);
allColumns.addAll(columnBList);
// MOD scorreia 2009-05-25 allow to compare elements from the same
// table
// if (ColumnHelper.isFromSameTable(allColumns)) {
// return new ReturnCode(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.TwoSideColumns"), false); //$NON-NLS-1$
// }
}
return new ReturnCode(true);
}
@Override
protected ReturnCode canRun() {
return 0 == rowMatchingIndicatorA.getColumnSetA().size() ? new ReturnCode(
DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.columnsBlankRunMessage"), false) : new ReturnCode(true); //$NON-NLS-1$
}
@Override
public ScrolledForm getScrolledForm() {
return form;
}
public void propertyChange(PropertyChangeEvent evt) {
if (PluginConstant.ISDIRTY_PROPERTY.equals(evt.getPropertyName())) {
((AnalysisEditor) currentEditor).firePropertyChange(IEditorPart.PROP_DIRTY);
((AnalysisEditor) currentEditor).setRefreshResultPage(true);
} else if (PluginConstant.DATAFILTER_PROPERTY.equals(evt.getPropertyName())) {
this.setDirty(true);
}
}
/**
* ADD xqliu 2012-04-19 TDQ-5005.
*/
@Override
public boolean isDirty() {
if (anaColumnCompareViewer == null ? false : anaColumnCompareViewer.isDirty()) {
this.setDirty(anaColumnCompareViewer.isDirty());
}
if (dataFilterCompA == null ? false : dataFilterCompA.isDirty()) {
this.setDirty(dataFilterCompA.isDirty());
}
if (dataFilterCompB == null ? false : dataFilterCompB.isDirty()) {
this.setDirty(dataFilterCompB.isDirty());
}
return super.isDirty();
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#updateTreeView()
*/
@Override
protected void updateAnalysisTree() {
if (anaColumnCompareViewer != null) {
boolean beforeUpdateDirty = anaColumnCompareViewer.isDirty();
anaColumnCompareViewer.updateModelViewer();
if (!beforeUpdateDirty) {
anaColumnCompareViewer.setDirty(false);
}
}
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#getConnectionsWithoutDeleted()
*/
@Override
protected List<IRepositoryNode> getConnectionsWithoutDeleted() {
return RepositoryNodeHelper.getConnectionRepositoryNodes(false, false);
}
}