// ============================================================================ // // 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.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.widgets.ExpandableComposite; 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.metadata.builder.connection.FileConnection; import org.talend.core.model.metadata.builder.connection.MetadataColumn; import org.talend.core.model.properties.ConnectionItem; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.repository.model.repositoryObject.MetadataColumnRepositoryObject; import org.talend.cwm.helper.ModelElementHelper; import org.talend.cwm.helper.SwitchHelpers; import org.talend.cwm.helper.TaggedValueHelper; import org.talend.cwm.relational.TdColumn; import org.talend.dataprofiler.core.PluginConstant; import org.talend.dataprofiler.core.helper.ModelElementIndicatorHelper; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.model.ModelElementIndicator; import org.talend.dataprofiler.core.ui.action.actions.RunAnalysisAction; import org.talend.dataprofiler.core.ui.dialog.ColumnsSelectWithConstraintDialog; import org.talend.dataprofiler.core.ui.dialog.ColumnsSelectionDialog; import org.talend.dataprofiler.core.ui.editor.composite.AbstractColumnDropTree; import org.talend.dataprofiler.core.ui.editor.composite.AnalysisColumnSetTreeViewer; import org.talend.dataprofiler.core.ui.editor.composite.IndicatorsComp; import org.talend.dataprofiler.core.ui.editor.preview.ColumnSetIndicatorUnit; import org.talend.dataprofiler.core.ui.editor.preview.IndicatorUnit; import org.talend.dataprofiler.core.ui.editor.preview.model.ChartTypeStatesFactory; import org.talend.dataprofiler.core.ui.editor.preview.model.states.IChartTypeStates; import org.talend.dataprofiler.core.ui.events.EventEnum; import org.talend.dataprofiler.core.ui.events.EventManager; import org.talend.dataprofiler.core.ui.pref.EditorPreferencePage; import org.talend.dataprofiler.core.ui.utils.TOPChartUtils; import org.talend.dataquality.analysis.Analysis; import org.talend.dataquality.analysis.ExecutionLanguage; import org.talend.dataquality.domain.Domain; import org.talend.dataquality.exception.DataprofilerCoreException; import org.talend.dataquality.helpers.MetadataHelper; import org.talend.dataquality.indicators.CompositeIndicator; import org.talend.dataquality.indicators.DataminingType; import org.talend.dataquality.indicators.Indicator; import org.talend.dataquality.indicators.IndicatorsFactory; import org.talend.dataquality.indicators.RegexpMatchingIndicator; import org.talend.dataquality.indicators.columnset.AllMatchIndicator; import org.talend.dataquality.indicators.columnset.ColumnsetFactory; import org.talend.dataquality.indicators.columnset.SimpleStatIndicator; import org.talend.dq.analysis.AnalysisHandler; import org.talend.dq.analysis.ColumnSetAnalysisHandler; import org.talend.dq.helper.EObjectHelper; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.dq.indicators.definitions.DefinitionHandler; import org.talend.dq.indicators.preview.EIndicatorChartType; import org.talend.dq.nodes.DFColumnFolderRepNode; import org.talend.dq.nodes.indicator.type.IndicatorEnum; import org.talend.dq.writer.impl.ElementWriterFactory; import org.talend.repository.model.IRepositoryNode; import org.talend.repository.model.RepositoryNode; import org.talend.utils.sugars.ReturnCode; import orgomg.cwm.foundation.softwaredeployment.DataManager; import orgomg.cwm.objectmodel.core.ModelElement; /** * @author yyi 2009-12-16 */ public class ColumnSetAnalysisDetailsPage extends AbstractAnalysisMetadataPage implements PropertyChangeListener { private static Logger log = Logger.getLogger(ColumnSetAnalysisDetailsPage.class); AnalysisColumnSetTreeViewer treeViewer; IndicatorsComp indicatorsViewer; ColumnSetAnalysisHandler columnSetAnalysisHandler; private SimpleStatIndicator simpleStatIndicator; private AllMatchIndicator allMatchIndicator; private Composite chartComposite; private static final int TREE_MAX_LENGTH = 300; private static final int INDICATORS_SECTION_HEIGHT = 300; protected Composite[] previewChartCompsites; private EList<ModelElement> analyzedColumns; private Section analysisColSection; private Section previewSection; private Section indicatorsSection; private Button storeDataCheck; private SashForm sForm; private Composite previewComp; public ColumnSetAnalysisDetailsPage(FormEditor editor, String id, String title) { super(editor, id, title); currentEditor = (AnalysisEditor) editor; } @Override public void initialize(FormEditor editor) { super.initialize(editor); recomputeIndicators(); } public void recomputeIndicators() { columnSetAnalysisHandler = new ColumnSetAnalysisHandler(); columnSetAnalysisHandler.setAnalysis(getCurrentModelElement()); stringDataFilter = columnSetAnalysisHandler.getStringDataFilter(); analyzedColumns = columnSetAnalysisHandler.getAnalyzedColumns(); if (columnSetAnalysisHandler.getSimpleStatIndicator() == null || columnSetAnalysisHandler.getSimpleStatIndicator().eIsProxy()) { ColumnsetFactory columnsetFactory = ColumnsetFactory.eINSTANCE; simpleStatIndicator = columnsetFactory.createSimpleStatIndicator(); simpleStatIndicator.setRowCountIndicator(IndicatorsFactory.eINSTANCE.createRowCountIndicator()); simpleStatIndicator.setDistinctCountIndicator(IndicatorsFactory.eINSTANCE.createDistinctCountIndicator()); simpleStatIndicator.setDuplicateCountIndicator(IndicatorsFactory.eINSTANCE.createDuplicateCountIndicator()); simpleStatIndicator.setUniqueCountIndicator(IndicatorsFactory.eINSTANCE.createUniqueCountIndicator()); } else { simpleStatIndicator = (SimpleStatIndicator) columnSetAnalysisHandler.getSimpleStatIndicator(); } if (columnSetAnalysisHandler.getAllmatchIndicator() == null) { ColumnsetFactory columnsetFactory = ColumnsetFactory.eINSTANCE; allMatchIndicator = columnsetFactory.createAllMatchIndicator(); DefinitionHandler.getInstance().setDefaultIndicatorDefinition(allMatchIndicator); } else { allMatchIndicator = (AllMatchIndicator) columnSetAnalysisHandler.getAllmatchIndicator(); } initializeIndicator(simpleStatIndicator); List<ModelElementIndicator> meIndicatorList = new ArrayList<ModelElementIndicator>(); ModelElementIndicator currentIndicator = null; for (ModelElement element : analyzedColumns) { // MOD yyi 2011-02-16 17871:delimitefile MetadataColumn mdColumn = SwitchHelpers.METADATA_COLUMN_SWITCH.doSwitch(element); TdColumn tdColumn = SwitchHelpers.COLUMN_SWITCH.doSwitch(element); if (tdColumn == null && mdColumn == null) { continue; } if (tdColumn == null && mdColumn != null) { currentIndicator = ModelElementIndicatorHelper.createDFColumnIndicator(RepositoryNodeHelper .recursiveFind(mdColumn)); } else if (tdColumn != null) { RepositoryNode recursiveFind = RepositoryNodeHelper.recursiveFind(tdColumn); if (recursiveFind == null) { recursiveFind = RepositoryNodeHelper.createRepositoryNode(tdColumn); } currentIndicator = ModelElementIndicatorHelper.createModelElementIndicator(recursiveFind); } DataminingType dataminingType = MetadataHelper.getDataminingType(element); MetadataHelper.setDataminingType(dataminingType == null ? DataminingType.NOMINAL : dataminingType, element); Collection<Indicator> indicatorList = columnSetAnalysisHandler.getRegexMathingIndicators(element); if (null != currentIndicator) { currentIndicator.setIndicators(indicatorList.toArray(new Indicator[indicatorList.size()])); meIndicatorList.add(currentIndicator); } } currentModelElementIndicators = meIndicatorList.toArray(new ModelElementIndicator[meIndicatorList.size()]); } private void initializeIndicator(Indicator indicator) { if (indicator.getIndicatorDefinition() == null || indicator.getIndicatorDefinition().eIsProxy()) { DefinitionHandler.getInstance().setDefaultIndicatorDefinition(indicator); } if (indicator instanceof CompositeIndicator) { for (Indicator child : ((CompositeIndicator) indicator).getChildIndicators()) { initializeIndicator(child); // recurse } } } @Override protected void createFormContent(IManagedForm managedForm) { this.form = managedForm.getForm(); Composite body = form.getBody(); body.setLayout(new GridLayout()); sForm = new SashForm(body, SWT.NULL); sForm.setLayoutData(new GridData(GridData.FILL_BOTH)); topComp = toolkit.createComposite(sForm); topComp.setLayoutData(new GridData(GridData.FILL_BOTH)); topComp.setLayout(new GridLayout()); setMetadataSectionTitle(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.analysisMeta")); //$NON-NLS-1$ setMetadataSectionDescription(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.setPropOfAnalysis")); //$NON-NLS-1$ metadataSection = creatMetadataSection(form, topComp); form.setText(DefaultMessagesImpl.getString("ColumnSetMasterPage.title")); //$NON-NLS-1$ createDataPreviewSection(form, topComp, true, false, true); createAnalysisColumnsSection(form, topComp); createIndicatorsSection(form, topComp); createDataFilterSection(form, topComp); dataFilterComp.addPropertyChangeListener(this); Composite exeEngineComp = createExecuteEngineSection(form, topComp, analyzedColumns, columnSetAnalysisHandler .getAnalysis().getParameters()); addListenerToExecuteEngine(execCombo); createStoreDataCheck(exeEngineComp); createContextGroupSection(form, topComp); if (canShowGraphicsSectionForSettingsPage()) { previewComp = toolkit.createComposite(sForm); previewComp.setLayoutData(new GridData(GridData.FILL_BOTH)); previewComp.setLayout(new GridLayout()); // add by hcheng for 0007290: Chart cannot auto compute it's size in // DQRule analsyis Editor previewComp.addControlListener(new ControlAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.ControlAdapter#controlResized(org.eclipse .swt.events.ControlEvent) */ @Override public void controlResized(ControlEvent e) { super.controlResized(e); sForm.redraw(); form.reflow(true); } }); // ~ createPreviewSection(form, previewComp); } } private void addListenerToExecuteEngine(final CCombo execCombo1) { execCombo1.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { execLang = execCombo1.getText(); setStoreDataValueAndStatus(); setDirty(true); } }); } /** * DOC yyi Comment method "createIndicatorsSection". * * @param topComp * @param form */ private void createIndicatorsSection(ScrolledForm form, Composite topComp) { indicatorsSection = createSection(form, topComp, DefaultMessagesImpl.getString("IndicatorsComp.Indicators"), null); //$NON-NLS-1$ Composite indicatorsComp = toolkit.createComposite(indicatorsSection, SWT.NONE); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(indicatorsComp); indicatorsComp.setLayout(new GridLayout()); ((GridData) indicatorsComp.getLayoutData()).heightHint = INDICATORS_SECTION_HEIGHT; indicatorsViewer = new IndicatorsComp(indicatorsComp, this); indicatorsViewer.setDirty(false); indicatorsViewer.addPropertyChangeListener(this); // MOD msjian TDQ-8860 2014-5-4: only when there have patterns, show allMatchIndicators if (0 < allMatchIndicator.getCompositeRegexMatchingIndicators().size()) { indicatorsViewer.setInput(simpleStatIndicator, allMatchIndicator); } else { indicatorsViewer.setInput(simpleStatIndicator); } // TDQ-8860~ indicatorsSection.setClient(indicatorsComp); } void createAnalysisColumnsSection(final ScrolledForm form, Composite anasisDataComp) { analysisColSection = createSection(form, anasisDataComp, DefaultMessagesImpl.getString("ColumnMasterDetailsPage.analyzeColumn"), null); //$NON-NLS-1$ Composite topComp = toolkit.createComposite(analysisColSection); topComp.setLayout(new GridLayout()); GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(topComp); Composite buttonComp = toolkit.createComposite(topComp); buttonComp.setLayout(new GridLayout(2, false)); createColumnSelectButton(buttonComp); createRunButton(buttonComp); Composite tree = toolkit.createComposite(topComp, SWT.None); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(tree); tree.setLayout(new GridLayout()); ((GridData) tree.getLayoutData()).heightHint = TREE_MAX_LENGTH; tree.setBackgroundMode(SWT.INHERIT_DEFAULT); treeViewer = new AnalysisColumnSetTreeViewer(tree, this); treeViewer.addObserver(sampleTable); sampleTable.addObserver(treeViewer); treeViewer.addPropertyChangeListener(this); treeViewer.setInput(analyzedColumns.toArray()); treeViewer.setDirty(false); analysisColSection.setClient(topComp); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#openColumnsSelectionDialog() */ @Override public void openColumnsSelectionDialog() { List<IRepositoryNode> columnList = treeViewer.getColumnSetMultiValueList(); if (columnList == null) { columnList = new ArrayList<IRepositoryNode>(); } RepositoryNode connNode = getConnComboSelectNode(); ColumnsSelectionDialog dialog = new ColumnsSelectWithConstraintDialog( this, null, DefaultMessagesImpl.getString("ColumnMasterDetailsPage.columnSelection"), columnList, connNode, DefaultMessagesImpl.getString("ColumnMasterDetailsPage.columnSelections")); //$NON-NLS-1$ //$NON-NLS-2$ if (dialog.open() == Window.OK) { Object[] columns = dialog.getResult(); setTreeViewInput(columns); // ADD msjian TDQ-8860 2014-4-30:only for column set analysis, when there have pattern(s) when java // engine,show all match indicator in the Indicators section. EventManager.getInstance().publish(getCurrentModelElement(), EventEnum.DQ_COLUMNSET_SHOW_MATCH_INDICATORS, null); // TDQ-8860~ } } void createPreviewSection(final ScrolledForm form, Composite parent) { previewSection = createSection( form, parent, DefaultMessagesImpl.getString("ColumnMasterDetailsPage.graphics"), DefaultMessagesImpl.getString("ColumnMasterDetailsPage.space")); //$NON-NLS-1$ //$NON-NLS-2$ previewSection.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite sectionClient = toolkit.createComposite(previewSection); sectionClient.setLayout(new GridLayout()); sectionClient.setLayoutData(new GridData(GridData.FILL_BOTH)); Button chartButton = new Button(sectionClient, SWT.NONE); chartButton.setText(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.refreshGraphics")); //$NON-NLS-1$ final Label message = toolkit.createLabel(sectionClient, DefaultMessagesImpl.getString("ColumnMasterDetailsPage.spaceWhite")); //$NON-NLS-1$ message.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED)); message.setVisible(false); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).applyTo(sectionClient); chartComposite = toolkit.createComposite(sectionClient); chartComposite.setLayout(new GridLayout()); chartComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); final Analysis analysis = columnSetAnalysisHandler.getAnalysis(); chartButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { disposeChartComposite(); boolean analysisStatue = analysis.getResults().getResultMetadata() != null && analysis.getResults().getResultMetadata().getExecutionDate() != null; if (!analysisStatue) { boolean returnCode = MessageDialog.openConfirm(null, DefaultMessagesImpl.getString("ColumnMasterDetailsPage.ViewResult"), //$NON-NLS-1$ DefaultMessagesImpl.getString("ColumnMasterDetailsPage.RunOrSeeSampleData")); //$NON-NLS-1$ if (returnCode) { new RunAnalysisAction().run(); message.setVisible(false); } else { createPreviewCharts(form, chartComposite, false); message.setText(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.warning")); //$NON-NLS-1$ message.setVisible(true); } } else { createPreviewCharts(form, chartComposite, true); } chartComposite.layout(); form.reflow(true); } }); previewSection.setClient(sectionClient); } public void createPreviewCharts(final ScrolledForm theForm, final Composite parentComp, final boolean isCreate) { Section previewSimpleStatSection = createSection( theForm, parentComp, DefaultMessagesImpl.getString("ColumnSetResultPage.SimpleStatistics"), DefaultMessagesImpl.getString("ColumnMasterDetailsPage.space")); //$NON-NLS-1$ //$NON-NLS-2$ previewSimpleStatSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Composite sectionClient = toolkit.createComposite(previewSimpleStatSection); sectionClient.setLayout(new GridLayout()); sectionClient.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite simpleComposite = toolkit.createComposite(sectionClient); simpleComposite.setLayout(new GridLayout(1, true)); simpleComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); createSimpleStatistics(simpleComposite); previewSimpleStatSection.setClient(sectionClient); // match if (0 < allMatchIndicator.getCompositeRegexMatchingIndicators().size()) { Section previewMatchSection = createSection(theForm, parentComp, DefaultMessagesImpl.getString("ColumnSetResultPage.All_Match"), StringUtils.EMPTY); //$NON-NLS-1$ previewMatchSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Composite sectionMatchClient = toolkit.createComposite(previewMatchSection); sectionMatchClient.setLayout(new GridLayout()); sectionMatchClient.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite matchComposite = toolkit.createComposite(sectionMatchClient); matchComposite.setLayout(new GridLayout(1, true)); matchComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); createAllMatch(matchComposite); previewMatchSection.setClient(sectionMatchClient); } } private void createAllMatch(final Composite composite) { List<IndicatorUnit> units = new ArrayList<IndicatorUnit>(); units.add(new ColumnSetIndicatorUnit(IndicatorEnum.AllMatchIndicatorEnum, allMatchIndicator)); EIndicatorChartType matchingType = EIndicatorChartType.PATTERN_MATCHING; IChartTypeStates chartTypeState = ChartTypeStatesFactory.getChartState(matchingType, units); Object chart = chartTypeState.getChart(); TOPChartUtils.getInstance().decorateChart(chart, false); if (chart != null) { TOPChartUtils.getInstance().createChartComposite(composite, SWT.NONE, chart, true); } } private void createSimpleStatistics(final Composite composite) { List<IndicatorUnit> units = new ArrayList<IndicatorUnit>(); units.add(new ColumnSetIndicatorUnit(IndicatorEnum.RowCountIndicatorEnum, simpleStatIndicator.getRowCountIndicator())); units.add(new ColumnSetIndicatorUnit(IndicatorEnum.DistinctCountIndicatorEnum, simpleStatIndicator .getDistinctCountIndicator())); units.add(new ColumnSetIndicatorUnit(IndicatorEnum.DuplicateCountIndicatorEnum, simpleStatIndicator .getDuplicateCountIndicator())); units.add(new ColumnSetIndicatorUnit(IndicatorEnum.UniqueIndicatorEnum, simpleStatIndicator.getUniqueCountIndicator())); IChartTypeStates chartTypeState = ChartTypeStatesFactory.getChartState(EIndicatorChartType.SIMPLE_STATISTICS, units); // create chart Object chart = chartTypeState.getChart(); TOPChartUtils.getInstance().decorateChart(chart, false); if (chart != null) { TOPChartUtils.getInstance().createChartComposite(composite, SWT.NONE, chart, true); } } @Override public void refreshGraphicsInSettingsPage() { if (EditorPreferencePage.isHideGraphicsSectionForSettingsPage()) { if (sForm.getChildren().length > 1) { if (null != sForm.getChildren()[1] && !sForm.getChildren()[1].isDisposed()) { sForm.getChildren()[1].dispose(); } topComp.getParent().layout(); topComp.layout(); } } else { if (chartComposite != null && !chartComposite.isDisposed()) { try { for (Control control : chartComposite.getChildren()) { control.dispose(); } createPreviewCharts(form, chartComposite, true); chartComposite.getParent().layout(); chartComposite.layout(); } catch (Exception ex) { log.error(ex, ex); } } else { previewComp = toolkit.createComposite(sForm); previewComp.setLayoutData(new GridData(GridData.FILL_BOTH)); previewComp.setLayout(new GridLayout()); previewComp.addControlListener(new ControlAdapter() { @Override public void controlResized(ControlEvent e) { super.controlResized(e); sForm.redraw(); form.reflow(true); } }); createPreviewSection(form, previewComp); createPreviewCharts(form, chartComposite, true); } } } /** * create StoreData Checkbox. * * @param sectionClient */ private Composite createStoreDataCheck(Composite sectionClient) { Composite storeDataSection = toolkit.createComposite(sectionClient); GridLayout gridLayout = new GridLayout(2, false); gridLayout.marginWidth = 0; storeDataSection.setLayout(gridLayout); toolkit.createLabel(storeDataSection, "Store data:").setToolTipText("Storing data in analysis file"); //$NON-NLS-1$ //$NON-NLS-2$ storeDataCheck = new Button(storeDataSection, SWT.CHECK | SWT.RIGHT_TO_LEFT); setStoreDataValueAndStatus(); storeDataCheck.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { simpleStatIndicator.setStoreData(storeDataCheck.getSelection()); allMatchIndicator.setStoreData(storeDataCheck.getSelection()); setDirty(true); } }); return storeDataSection; } /** * set StoreData Value And Status. */ private void setStoreDataValueAndStatus() { // TDQ-9467 msjian: for columnset when is jave engine, we set this always true, and can not edit if (execLang.equals(ExecutionLanguage.JAVA.getLiteral())) { storeDataCheck.setSelection(true); storeDataCheck.setEnabled(false); } else { storeDataCheck.setSelection(simpleStatIndicator.isStoreData()); storeDataCheck.setEnabled(true); } simpleStatIndicator.setStoreData(storeDataCheck.getSelection()); allMatchIndicator.setStoreData(storeDataCheck.getSelection()); } /** * @param outputFolder * @throws DataprofilerCoreException */ @Override public void saveAnalysis() throws DataprofilerCoreException { columnSetAnalysisHandler.changeDefaultRowLoaded(rowLoadedText.getText()); columnSetAnalysisHandler.changeSampleDataShowWay(sampleDataShowWayCombo.getText()); // remove the space from analysis name // columnSetAnalysisHandler.setName(columnSetAnalysisHandler.getName().replace(" ", "")); for (Domain domain : getCurrentModelElement().getParameters().getDataFilter()) { domain.setName(getCurrentModelElement().getName()); } // ~ columnSetAnalysisHandler.clearAnalysis(); simpleStatIndicator.getAnalyzedColumns().clear(); allMatchIndicator.getAnalyzedColumns().clear(); // set execute engine Analysis analysis = columnSetAnalysisHandler.getAnalysis(); analysis.getParameters().setExecutionLanguage(ExecutionLanguage.get(execLang)); // set data filter columnSetAnalysisHandler.setStringDataFilter(dataFilterComp.getDataFilterString()); // save analysis List<IRepositoryNode> repositoryNodes = treeViewer.getColumnSetMultiValueList(); Connection tdProvider = null; IRepositoryViewObject reposObject = null; if (repositoryNodes != null && repositoryNodes.size() != 0) { ConnectionItem item = (ConnectionItem) repositoryNodes.get(0).getObject().getProperty().getItem(); tdProvider = item.getConnection(); if (tdProvider.eIsProxy()) { // Resolve the connection again tdProvider = (Connection) EObjectHelper.resolveObject(tdProvider); } analysis.getContext().setConnection(tdProvider); List<ModelElement> columnList = new ArrayList<ModelElement>(); for (IRepositoryNode rd : repositoryNodes) { reposObject = rd.getObject(); columnList.add(((MetadataColumnRepositoryObject) reposObject).getTdColumn()); } simpleStatIndicator.getAnalyzedColumns().addAll(columnList); columnSetAnalysisHandler.addIndicator(columnList, simpleStatIndicator); // ~ MOD mzhao feature 13040. 2010-05-21 allMatchIndicator.getCompositeRegexMatchingIndicators().clear(); ModelElementIndicator[] modelElementIndicator = treeViewer.getModelElementIndicator(); if (modelElementIndicator != null) { for (ModelElementIndicator modelElementInd : modelElementIndicator) { Indicator[] inds = modelElementInd.getPatternIndicators(); for (Indicator ind : inds) { if (ind instanceof RegexpMatchingIndicator) { // MOD yyi 2011-06-15 22419:column set pattern for MDM IRepositoryViewObject obj = modelElementInd.getModelElementRepositoryNode().getObject(); ModelElement analyzedElt = ((MetadataColumnRepositoryObject) obj).getTdColumn(); ind.setAnalyzedElement(analyzedElt); allMatchIndicator.getCompositeRegexMatchingIndicators().add((RegexpMatchingIndicator) ind); } } } } if (allMatchIndicator.getCompositeRegexMatchingIndicators().size() > 0) { allMatchIndicator.getAnalyzedColumns().addAll(columnList); columnSetAnalysisHandler.addIndicator(columnList, allMatchIndicator); } // ~ } else { analysis.getContext().setConnection(null); } TaggedValueHelper.setTaggedValue(getCurrentModelElement(), TaggedValueHelper.IS_USE_SAMPLE_DATA, isRunWithSampleData.toString()); // 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(columnSetAnalysisHandler.getName()); // TDQ-5581,if has removed emlements(patten),should remove dependency each other before saving. // 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); treeViewer.setDirty(false); dataFilterComp.setDirty(false); } public void propertyChange(PropertyChangeEvent evt) { if (PluginConstant.ISDIRTY_PROPERTY.equals(evt.getPropertyName())) { ((AnalysisEditor) currentEditor).firePropertyChange(IEditorPart.PROP_DIRTY); } else if (PluginConstant.DATAFILTER_PROPERTY.equals(evt.getPropertyName())) { this.columnSetAnalysisHandler.setStringDataFilter((String) evt.getNewValue()); } } @Override public boolean isDirty() { return super.isDirty() || (treeViewer != null && treeViewer.isDirty()) || (dataFilterComp != null && dataFilterComp.isDirty()) || (indicatorsViewer != null && indicatorsViewer.isDirty()); } @Override public void dispose() { super.dispose(); if (this.treeViewer != null) { this.treeViewer.removePropertyChangeListener(this); } if (dataFilterComp != null) { this.dataFilterComp.removePropertyChangeListener(this); } EventManager.getInstance().clearEvent(dataPreviewSection, EventEnum.DQ_SELECT_ELEMENT_AFTER_CREATE_CONNECTION); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#getTreeViewer() */ @Override public AbstractColumnDropTree getTreeViewer() { return this.treeViewer; } public SimpleStatIndicator getSimpleStatIndicator() { return simpleStatIndicator; } public Composite[] getPreviewChartCompsites() { // ADD msjian TDQ-6213 2012-12-18: filter the disposed composite if (previewChartCompsites != null && previewChartCompsites.length > 0) { List<Composite> withOutDisposed = new ArrayList<Composite>(); for (Composite com : previewChartCompsites) { if (!com.isDisposed()) { withOutDisposed.add(com); } } this.previewChartCompsites = withOutDisposed.toArray(new ExpandableComposite[withOutDisposed.size()]); } // TDQ-6213~ return previewChartCompsites; } @Override public Composite getChartComposite() { return chartComposite; } @Override public ReturnCode canSave() { // MOD by gdbu 2011-3-21 bug 19179 ReturnCode canModRetCode = super.canSave(); if (!canModRetCode.isOk()) { return canModRetCode; } // ~19179 String message = null; List<IRepositoryNode> columnSetMultiValueList = this.treeViewer.getColumnSetMultiValueList(); // MOD yyi 2011-02-16 17871:delimitefile List<ModelElement> columnList = new ArrayList<ModelElement>(); // MOD klliu 2001-03-28 19464 filter column from same table Set<EObject> nodeTypeName = new HashSet<EObject>(); for (IRepositoryNode rd : columnSetMultiValueList) { ModelElement modelElementFromRepositoryNode = RepositoryNodeHelper.getModelElementFromRepositoryNode(rd); EObject eContainer = modelElementFromRepositoryNode.eContainer(); nodeTypeName.add(eContainer); columnList.add(RepositoryNodeHelper.getModelElementFromRepositoryNode(rd)); } if (nodeTypeName.size() > 1) { return new ReturnCode(DefaultMessagesImpl.getString("ColumnSetMasterPage.CannotCreateAnalysis"), false); //$NON-NLS-1$ } if (!columnSetMultiValueList.isEmpty()) { // MOD klliu bug 19464,file delimit connection does not need to check from one table. if (columnList.get(0) instanceof TdColumn) { if (!ModelElementHelper.isFromSameTable(columnList)) { message = DefaultMessagesImpl.getString("ColumnSetMasterPage.CannotCreateAnalysis"); //$NON-NLS-1$ } } else if (columnList.get(0) instanceof MetadataColumn) { if (!isFromSameTableByDFColumn(columnSetMultiValueList)) { message = DefaultMessagesImpl.getString("ColumnSetMasterPage.CannotCreateAnalysis"); //$NON-NLS-1$ } } } if (message == null) { resetResultPageData(); return new ReturnCode(true); } return new ReturnCode(message, false); } private boolean isFromSameTableByDFColumn(List<IRepositoryNode> columnSetMultiValueList) { Set<String> folderItemIds = new HashSet<String>(); for (IRepositoryNode node : columnSetMultiValueList) { RepositoryNode parent = node.getParent(); if (parent instanceof DFColumnFolderRepNode) { DFColumnFolderRepNode folderNode = (DFColumnFolderRepNode) parent; String id = folderNode.getmTable().getId(); folderItemIds.add(id); } } return folderItemIds.size() == 1; } @Override protected ReturnCode canRun() { List<IRepositoryNode> columnSetMultiValueList = this.treeViewer.getColumnSetMultiValueList(); if (columnSetMultiValueList.isEmpty()) { return new ReturnCode(DefaultMessagesImpl.getString("ColumnSetMasterPage.NoColumnsAssigned"), false); //$NON-NLS-1$ } resetResultPageData(); return new ReturnCode(true); } public AllMatchIndicator getAllMatchIndicator() { return allMatchIndicator; } private void resetResultPageData() { ColumnSetAnalysisResultPage theResultPage = null; if (((AnalysisEditor) currentEditor).getResultPage() instanceof ColumnSetAnalysisResultPage) { theResultPage = (ColumnSetAnalysisResultPage) ((AnalysisEditor) currentEditor).getResultPage(); } if (theResultPage.getTableFilterResult() != null) { theResultPage.setTableFilterResult(null); } } /** * DOC qiongli Comment method "includeDatePatternFreqIndicator". * * @return */ @Override protected boolean includeJavaEnginIndicator() { for (ModelElementIndicator modelElementIndicator : this.treeViewer.getModelElementIndicator()) { if (modelElementIndicator.contains(IndicatorEnum.DatePatternFreqIndicatorEnum)) { return true; } } return false; } @Override public ExecutionLanguage getUIExecuteEngin() { return ExecutionLanguage.get(execCombo.getText()); } /** * set the Language To TreeViewer. * * @param executionLanguage */ @Override protected void setLanguageToTreeViewer(ExecutionLanguage executionLanguage) { treeViewer.setLanguage(executionLanguage); } /** * refresh the Indicators Section. */ public void refreshIndicatorsSection() { // when there have pattern, show allmatchindicator ModelElementIndicator[] modelElementIndicator = treeViewer.getModelElementIndicator(); if (modelElementIndicator != null) { for (ModelElementIndicator modelElementInd : modelElementIndicator) { Indicator[] inds = modelElementInd.getPatternIndicators(); for (Indicator ind : inds) { if (ind instanceof RegexpMatchingIndicator) { indicatorsViewer.setInput(simpleStatIndicator, allMatchIndicator); return; } } } } indicatorsViewer.setInput(simpleStatIndicator); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#getAnalysisHandler() */ @Override public AnalysisHandler getAnalysisHandler() { return columnSetAnalysisHandler; } /** * * Refresh the column tree * * @param modelElements */ public void refreshTheTree(ModelElementIndicator[] modelElements) { this.currentModelElementIndicators = modelElements; disposeChartComposite(); treeViewer.setElements(currentModelElementIndicators); } public void disposeChartComposite() { if (chartComposite != null && !chartComposite.isDisposed()) { for (Control control : chartComposite.getChildren()) { control.dispose(); } } } /* * (non-Javadoc) * * @see * org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#setTreeViewInput(java.lang.Object[]) */ @Override public void setTreeViewInput(Object[] modelElements) { // TDQ-11878: fix the new created column set analysis about file connection should be java engine and not // editable, the setInput method contains the filterInputData method treeViewer.setInput(modelElements); // TDQ-11878~ refreshPreviewTable(treeViewer.getModelElementIndicator(), true); refreshTheTree(treeViewer.getModelElementIndicator()); this.setDirty(true); } /** * Refresh the preview Table * * @param modelElementIndicator */ public void refreshPreviewTable(ModelElementIndicator[] modelElements, boolean loadData) { this.currentModelElementIndicators = modelElements; this.refreshPreviewTable(loadData); } protected ModelElementIndicator[] getAllTheElementIndicator() { List<IRepositoryNode> columnSetMultiValueList = this.treeViewer.getColumnSetMultiValueList(); return (ModelElementIndicator[]) columnSetMultiValueList.toArray(); } /* * (non-Javadoc) * Same with column detail page to do a merge when have a time * * @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#doCheckOption() */ @Override protected void doCheckOption() { Boolean isSqlSelected = TaggedValueHelper.getValueBoolean(TaggedValueHelper.IS_SQL_ENGIN_BEFORE_CHECK, getCurrentModelElement()); if (isRunWithSampleData) { if (currentModelIsSqlEngin()) { changeExecuteLanguageToJava(false); if (!isSqlSelected) { TaggedValueHelper.setTaggedValue(getCurrentModelElement(), TaggedValueHelper.IS_SQL_ENGIN_BEFORE_CHECK, "true"); //$NON-NLS-1$ } } execCombo.setEnabled(false); } else { if (isSqlSelected) { changeExecuteLanguageToSql(true); if (!isRunWithSampleData) {// java engin exchange failed so that don't change this attribute TaggedValueHelper.setTaggedValue(getCurrentModelElement(), TaggedValueHelper.IS_SQL_ENGIN_BEFORE_CHECK, "false"); //$NON-NLS-1$ } } if (!isFileConnection()) { execCombo.setEnabled(true); } } } /** * DOC zshen Comment method "isFileConnection". * Same with column detail page to do a merge when have a time * * @return */ private boolean isFileConnection() { DataManager connection = getCurrentModelElement().getContext().getConnection(); if (FileConnection.class.isInstance(connection)) { return true; } return false; } }