// ============================================================================ // // 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.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.regex.Pattern; import org.eclipse.emf.common.util.EList; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.events.VerifyListener; 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.Label; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.ImageHyperlink; 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.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.ImageLib; 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.model.dynamic.DynamicIndicatorModel; import org.talend.dataprofiler.core.ui.editor.composite.AbstractColumnDropTree; import org.talend.dataprofiler.core.ui.editor.composite.AnalysisColumnTreeViewer; 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.MessageUI; import org.talend.dataprofiler.core.ui.utils.WorkbenchUtils; import org.talend.dataprofiler.core.ui.utils.pagination.UIPagination; import org.talend.dataquality.analysis.Analysis; import org.talend.dataquality.analysis.AnalysisParameters; import org.talend.dataquality.analysis.ExecutionLanguage; import org.talend.dataquality.domain.Domain; import org.talend.dataquality.exception.DataprofilerCoreException; import org.talend.dataquality.helpers.AnalysisHelper; import org.talend.dataquality.helpers.MetadataHelper; import org.talend.dataquality.indicators.DataminingType; import org.talend.dataquality.indicators.Indicator; import org.talend.dataquality.indicators.mapdb.MapDBManager; import org.talend.dataquality.indicators.sql.UserDefIndicator; import org.talend.dq.analysis.ModelElementAnalysisHandler; import org.talend.dq.helper.EObjectHelper; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.dq.helper.UDIHelper; import org.talend.dq.nodes.indicator.type.IndicatorEnum; import org.talend.dq.writer.impl.ElementWriterFactory; 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 rli */ public class ColumnAnalysisDetailsPage extends DynamicAnalysisMasterPage { private Composite tree; private Composite navigationComposite; private Composite drillDownComposite; AnalysisColumnTreeViewer treeViewer; ModelElementAnalysisHandler analysisHandler; private static final int TREE_MAX_LENGTH = 400; private ExpandableComposite[] previewChartCompsites; private Section analysisColumnSection = null; final private List<ExpandableComposite> previewChartList = new ArrayList<ExpandableComposite>(); private UIPagination uiPagination; private int lastTimePageNumber = 1; public ColumnAnalysisDetailsPage(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() { analysisHandler = new ModelElementAnalysisHandler(); analysisHandler.setAnalysis(getCurrentModelElement()); // Handle JUDIs UDIHelper.updateJUDIsForAnalysis(getCurrentModelElement()); stringDataFilter = analysisHandler.getStringDataFilterwithContext(); EList<ModelElement> analyzedColumns = analysisHandler.getAnalyzedColumns(); List<ModelElementIndicator> meIndicatorList = new ArrayList<ModelElementIndicator>(); ModelElementIndicator currentIndicator = null; for (ModelElement element : analyzedColumns) { TdColumn tdColumn = SwitchHelpers.COLUMN_SWITCH.doSwitch(element); // MOD qiongli 2011-1-10,16796:delimitefile MetadataColumn mdColumn = SwitchHelpers.METADATA_COLUMN_SWITCH.doSwitch(element); if (tdColumn == null && mdColumn == null) { continue; } // MOD qiongli TDQ-7052 if the node is filtered ,it will be return null,so should create a new node. RepositoryNode repNode = RepositoryNodeHelper.recursiveFind(element); if (repNode == null) { repNode = RepositoryNodeHelper.createRepositoryNode(element); } // MOD mzhao feature 15750, The column is recompute from the file, here create a new repository view object. if (tdColumn == null && mdColumn != null) { currentIndicator = ModelElementIndicatorHelper.createDFColumnIndicator(repNode); } else if (tdColumn != null) { currentIndicator = ModelElementIndicatorHelper.createModelElementIndicator(repNode); } DataminingType dataminingType = DataminingType.get(analysisHandler.getDatamingType(element)); MetadataHelper.setDataminingType(dataminingType == null ? DataminingType.NOMINAL : dataminingType, element); Collection<Indicator> indicatorList = analysisHandler.getIndicators(element); if (currentIndicator != null) { currentIndicator.setIndicators(indicatorList.toArray(new Indicator[indicatorList.size()])); meIndicatorList.add(currentIndicator); } } currentModelElementIndicators = meIndicatorList.toArray(new ModelElementIndicator[meIndicatorList.size()]); } @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()); form.setText(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.columnAna")); //$NON-NLS-1$ setMetadataSectionTitle(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.analysisMeta")); //$NON-NLS-1$ setMetadataSectionDescription(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.setPropOfAnalysis")); //$NON-NLS-1$ metadataSection = creatMetadataSection(form, topComp); createDataPreviewSection(form, topComp, true, true, true); createAnalysisColumnsSection(form, topComp); createDataFilterSection(form, topComp); dataFilterComp.addPropertyChangeListener(this); // MOD xqliu 2009-07-01 bug 7068 createExecuteEngineSection(form, topComp, analysisHandler.getAnalyzedColumns(), analysisHandler.getAnalysis() .getParameters()); // ~ createContextGroupSection(form, topComp); if (!EditorPreferencePage.isHideGraphicsSectionForSettingsPage()) { createPreviewComposite(); createPreviewSection(form, previewComp); } } void createAnalysisColumnsSection(final ScrolledForm form1, Composite anasisDataComp) { analysisColumnSection = createSection(form1, anasisDataComp, DefaultMessagesImpl.getString("ColumnMasterDetailsPage.analyzeColumn"), null); //$NON-NLS-1$ Composite topComp1 = toolkit.createComposite(analysisColumnSection, SWT.NONE); topComp1.setLayout(new GridLayout()); Composite actionBarComp = toolkit.createComposite(topComp1, SWT.NONE); GridLayout gdLayout = new GridLayout(); gdLayout.numColumns = 5; gdLayout.horizontalSpacing = 20; GridData data = new GridData(); data.horizontalAlignment = GridData.FILL; data.grabExcessHorizontalSpace = true; actionBarComp.setLayoutData(data); actionBarComp.setLayout(gdLayout); ImageHyperlink collapseAllImageLink = toolkit.createImageHyperlink(actionBarComp, SWT.NONE); collapseAllImageLink.setToolTipText(DefaultMessagesImpl.getString("CollapseAllColumns")); //$NON-NLS-1$ WorkbenchUtils.setHyperlinkImage(collapseAllImageLink, ImageLib.getImage(ImageLib.COLLAPSE_ALL)); collapseAllImageLink.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { TreeItem[] items = treeViewer.getTree().getItems(); expandTreeItems(items, false); packOtherColumns(); } }); ImageHyperlink expandAllImageLink = toolkit.createImageHyperlink(actionBarComp, SWT.NONE); expandAllImageLink.setToolTipText(DefaultMessagesImpl.getString("ExpandAllColumns")); //$NON-NLS-1$ WorkbenchUtils.setHyperlinkImage(expandAllImageLink, ImageLib.getImage(ImageLib.EXPAND_ALL)); expandAllImageLink.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { TreeItem[] items = treeViewer.getTree().getItems(); expandTreeItems(items, true); packOtherColumns(); } }); createIndicatorSelectButton(actionBarComp); createRunButton(actionBarComp); navigationComposite = toolkit.createComposite(actionBarComp, SWT.NONE); navigationComposite.setLayoutData(data); navigationComposite.setLayout(new GridLayout()); createPaginationTree(topComp1); analysisColumnSection.setClient(topComp1); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#checkSqlEnginIndicatorExist() */ @Override protected boolean checkSqlEnginIndicatorExist() { for (ModelElementIndicator modelElementIndicator : this.treeViewer.getModelElementIndicator()) { if (modelElementIndicator.contains(IndicatorEnum.SqlPatternMatchingIndicatorEnum)) { return true; } } return super.checkSqlEnginIndicatorExist(); } /** * DOC zshen Comment method "createPaginationTree". * * @param topComp1 */ private void createPaginationTree(Composite topComp1) { tree = toolkit.createComposite(topComp1, SWT.NONE); tree.setBackgroundMode(SWT.INHERIT_DEFAULT); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(tree); tree.setLayout(new GridLayout()); ((GridData) tree.getLayoutData()).heightHint = TREE_MAX_LENGTH; treeViewer = new AnalysisColumnTreeViewer(tree, this); treeViewer.addObserver(sampleTable); sampleTable.addObserver(treeViewer); treeViewer.setDirty(false); treeViewer.addPropertyChangeListener(this); // Added TDQ-9272 : give the execute language to it treeViewer.setLanguage(getCurrentModelElement().getParameters().getExecutionLanguage()); // pagination compoent computePagination(); // ~ } /** * Go to last of the page. */ public void goLastPage() { uiPagination.goToLastPage(); } /** * Restore last time of page. */ public void restorePage() { uiPagination.goToPage(lastTimePageNumber + 1); } /** * DOC zshen Comment method "computePagination". */ private void computePagination() { disposeChartComposite(); if (uiPagination == null) { uiPagination = new UIPagination(toolkit, navigationComposite); } else { lastTimePageNumber = uiPagination.getCurrentPageNumber(); uiPagination.reset(); } final ModelElementIndicator[] modelElementIndicatorArrary = this.getCurrentModelElementIndicators(); int pageSize = IndicatorPaginationInfo.getPageSize(); int totalPages = modelElementIndicatorArrary.length / pageSize; List<ModelElementIndicator> modelElementIndicatorList = null; for (int index = 0; index < totalPages; index++) { modelElementIndicatorList = new ArrayList<ModelElementIndicator>(); for (int idx = 0; idx < pageSize; idx++) { modelElementIndicatorList.add(modelElementIndicatorArrary[index * pageSize + idx]); } IndicatorPaginationInfo pginfo = new MasterPaginationInfo(form, previewChartList, modelElementIndicatorList, uiPagination, treeViewer); uiPagination.addPage(pginfo); } int left = modelElementIndicatorArrary.length % pageSize; if (left != 0 || totalPages == 0) { modelElementIndicatorList = new ArrayList<ModelElementIndicator>(); for (int leftIdx = 0; leftIdx < left; leftIdx++) { modelElementIndicatorList.add(modelElementIndicatorArrary[totalPages * pageSize + leftIdx]); } IndicatorPaginationInfo pginfo = new MasterPaginationInfo(form, previewChartList, modelElementIndicatorList, uiPagination, treeViewer); uiPagination.addPage(pginfo); // FIXME totalPages won't used anymore. totalPages++; } uiPagination.init(); } /** * DOC mzhao Comment method "packOtherColumns". */ private void packOtherColumns() { TreeColumn[] columns = treeViewer.getTree().getColumns(); for (TreeColumn column : columns) { column.pack(); } treeViewer.getTree().pack(); treeViewer.getTree().getParent().layout(); } /** * * DOC mzhao Comment method "expandTreeItems". * * @param items * @param expandOrCollapse */ private void expandTreeItems(TreeItem[] items, boolean expandOrCollapse) { for (TreeItem item : items) { item.setExpanded(expandOrCollapse); TreeItem[] its = item.getItems(); if (its != null && its.length > 0) { expandTreeItems(its, expandOrCollapse); } } } /* * (non-Javadoc) * * @see * org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#setTreeViewInput(java.lang.Object[]) */ @Override public void setTreeViewInput(Object[] modelElements) { // MOD yyi 2012-02-29 TDQ-3605 Empty column table. treeViewer.filterInputData(modelElements); // RefreshPreviewTable should be first then the tree can be refresh refreshPreviewTable(treeViewer.getModelElementIndicator(), false); 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); } /** * * Refresh the column tree * * @param modelElements */ public void refreshTheTree(ModelElementIndicator[] modelElements) { this.currentModelElementIndicators = modelElements; this.computePagination(); } @Override public void createPreviewCharts(final ScrolledForm form1, final Composite composite) { uiPagination.setChartComposite(composite); uiPagination.init(); for (ExpandableComposite comp : previewChartList) { registerSection(comp); } composite.layout(); composite.pack(); form1.reflow(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()) { disposeChartComposite(); createPreviewCharts(form, chartComposite); reLayoutChartComposite(); } else { createPreviewComposite(); createPreviewSection(form, previewComp); createPreviewCharts(form, chartComposite); } } } /** * ADD xqliu 2009-08-24 bug 8776. * * @return */ protected boolean includeUDI() { ModelElementIndicator[] modelElementIndicators = this.getTreeViewer().getModelElementIndicator(); for (ModelElementIndicator modelElementIndicator : modelElementIndicators) { Indicator[] indicators = modelElementIndicator.getIndicators(); for (Indicator indicator : indicators) { if (indicator instanceof UserDefIndicator) { return true; } } } return false; } /** * @param outputFolder * @throws DataprofilerCoreException */ @Override public void saveAnalysis() throws DataprofilerCoreException { analysisHandler.changeDefaultRowLoaded(rowLoadedText.getText()); analysisHandler.changeSampleDataShowWay(sampleDataShowWayCombo.getText()); analysisHandler.clearAnalysis(); Analysis analysis = analysisHandler.getAnalysis(); for (Domain domain : getCurrentModelElement().getParameters().getDataFilter()) { domain.setName(getCurrentModelElement().getName()); } analysis.getParameters().setExecutionLanguage(ExecutionLanguage.get(execLang)); // save the number of connections per analysis this.saveNumberOfConnectionsPerAnalysis(); try { // MOD zshen feature 12919 to save analysisParameter. analysis.getParameters().setMaxNumberRows(Integer.parseInt(maxNumText.getText())); } catch (NumberFormatException nfe) { MessageDialogWithToggle.openError(null, DefaultMessagesImpl.getString("AbstractAnalysisMetadataPage.SaveAnalysis"), //$NON-NLS-1$ DefaultMessagesImpl.getString("ColumnMasterDetailsPage.emptyField", //$NON-NLS-1$ DefaultMessagesImpl.getString("ColumnMasterDetailsPage.maxNumberLabel"))); //$NON-NLS-1$ maxNumText.setText(String.valueOf(analysis.getParameters().getMaxNumberRows())); } analysis.getParameters().setStoreData(drillDownCheck.getSelection()); // ~12919 ModelElementIndicator[] modelElementIndicators = this.getCurrentModelElementIndicators(); if (modelElementIndicators != null && modelElementIndicators.length != 0) { Connection tdProvider = ModelElementIndicatorHelper.getTdDataProvider(modelElementIndicators[0]); if (tdProvider.eIsProxy()) { // Resolve the connection again tdProvider = (Connection) EObjectHelper.resolveObject(tdProvider); } analysis.getContext().setConnection(tdProvider); for (ModelElementIndicator modelElementIndicator : modelElementIndicators) { IRepositoryViewObject reposObject = modelElementIndicator.getModelElementRepositoryNode().getObject(); ModelElement modelEle = null; if (reposObject instanceof MetadataColumnRepositoryObject) { modelEle = ((MetadataColumnRepositoryObject) reposObject).getTdColumn(); } analysisHandler.addIndicator(modelEle, modelElementIndicator.getIndicators()); DataminingType type = MetadataHelper.getDataminingType(modelEle); if (type == null) { type = MetadataHelper.getDefaultDataminingType(modelElementIndicator.getJavaType()); } analysisHandler.setDatamingType(type.getLiteral(), modelEle); } } else { analysis.getContext().setConnection(null); } analysisHandler.setStringDataFilter(dataFilterComp.getDataFilterString()); // 2011.1.12 MOD by zshen to unify anlysis and connection id when saving. this.nameText.setText(analysisHandler.getName()); TaggedValueHelper.setTaggedValue(getCurrentModelElement(), TaggedValueHelper.IS_USE_SAMPLE_DATA, isRunWithSampleData.toString()); // TDQ-5581,if has removed emlements(patten/udi),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); ((AnalysisEditor) currentEditor).setRefreshResultPage(true); // synNagivatorStat(); } else if (PluginConstant.DATAFILTER_PROPERTY.equals(evt.getPropertyName())) { this.analysisHandler.setStringDataFilter((String) evt.getNewValue()); } else if (PluginConstant.EXPAND_TREE.equals(evt.getPropertyName())) { ModelElementIndicator indicator = (ModelElementIndicator) ((Widget) evt.getNewValue()) .getData(AbstractColumnDropTree.MODELELEMENT_INDICATOR_KEY); expandChart(indicator); } } /** * DOC zshen Comment method "synNagivatorStat". */ public void synNagivatorStat() { if (this.uiPagination != null) { this.uiPagination.synNagivatorState(this.treeViewer.getModelElementIndicator()); this.currentModelElementIndicators = this.uiPagination.getAllTheModelElementIndicator(); } } /** * DOC yyi 2011-06-02 16929:expand the selected column in the graphical chart. * * @param indicator */ protected void expandChart(ModelElementIndicator indicator) { // MOD klliu bug 22407 check the uiPagination is null. if (uiPagination == null) { return; } ExpandableComposite[] previewChartCompsitesa = getPreviewChartCompsites(); if (previewChartCompsitesa != null) { for (ExpandableComposite comp : previewChartCompsitesa) { if (comp.getData() != indicator) { comp.setExpanded(false); comp.getParent().pack(); } } } } /** * DOC yyi 2011-06-02 16929:get index of the column selected in the tree viewer. */ protected int indexOfSelectedItem(ModelElementIndicator data) { int index = -1; for (int i = 0; i < treeViewer.getModelElementIndicator().length; i++) { if (data == treeViewer.getModelElementIndicator()[i]) { index = i + 1; break; } } return index; } @Override public boolean isDirty() { if (treeViewer == null ? false : treeViewer.isDirty()) { this.setDirty(treeViewer.isDirty()); } if (dataFilterComp == null ? false : dataFilterComp.isDirty()) { this.setDirty(dataFilterComp.isDirty()); } return super.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); if (AnalysisHelper.isJavaExecutionEngine(getCurrentModelElement())) { MapDBManager.getInstance().closeDB(getCurrentModelElement()); } // when the user didn't save, revert the connection combo value if (oldConn != null && isDirty()) { getCurrentModelElement().getContext().setConnection(oldConn); } if (this.getSampleTable().getExistPreviewData() != null) { this.getSampleTable().getExistPreviewData().clear(); } } /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#getTreeViewer() */ @Override public AbstractColumnDropTree getTreeViewer() { return this.treeViewer; } @Override public ModelElementAnalysisHandler getAnalysisHandler() { return analysisHandler; } public ExpandableComposite[] getPreviewChartCompsites() { if (previewChartList != null && !previewChartList.isEmpty()) { // ADD msjian TDQ-6213 2012-12-18: filter the disposed composite List<ExpandableComposite> withOutDisposed = new ArrayList<ExpandableComposite>(); for (ExpandableComposite com : previewChartList) { if (!com.isDisposed()) { withOutDisposed.add(com); } } // TDQ-6213~ this.previewChartCompsites = withOutDisposed.toArray(new ExpandableComposite[withOutDisposed.size()]); } return previewChartCompsites; } @Override public Composite getChartComposite() { return chartComposite; } @Override protected ReturnCode canRun() { // ADD xqliu 2010-01-22 bug 11200 ReturnCode checkMdmExecutionEngine = checkMdmExecutionEngine(); if (!checkMdmExecutionEngine.isOk()) { return checkMdmExecutionEngine; } if (checkJUDIUpdate()) { recomputeIndicators(); computePagination(); } // ~ ModelElementIndicator[] modelElementIndicators = treeViewer.getModelElementIndicator(); if (modelElementIndicators == null || modelElementIndicators.length == 0) { return new ReturnCode(DefaultMessagesImpl.getString( "ColumnMasterDetailsPage.NoColumnAssigned", analysisHandler.getName()), false); //$NON-NLS-1$ } for (ModelElementIndicator modelElementIndicator : modelElementIndicators) { if (modelElementIndicator.getIndicators().length == 0) { return new ReturnCode(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.NoIndicatorAssigned"), false); //$NON-NLS-1$ } } return new ReturnCode(true); } /** * check whether JUDI need to update * * @return */ private boolean checkJUDIUpdate() { ModelElementIndicator[] modelElementIndicators = this.getTreeViewer().getModelElementIndicator(); for (ModelElementIndicator modelElementIndicator : modelElementIndicators) { Indicator[] indicators = modelElementIndicator.getIndicators(); for (Indicator indicator : indicators) { if (UDIHelper.isJavaUDI(indicator) && UDIHelper.needUpdateJUDI(indicator)) { return true; } } } return false; } @Override public ReturnCode canSave() { // MOD by gdbu 2011-3-21 bug 19179 ReturnCode canModRetCode = super.canSave(); if (!canModRetCode.isOk()) { return canModRetCode; } // ~19179 List<ModelElement> analyzedElement = new ArrayList<ModelElement>(); for (ModelElementIndicator modelElementIndicator : treeViewer.getModelElementIndicator()) { IRepositoryViewObject modelElementRepositoryObj = modelElementIndicator.getModelElementRepositoryNode().getObject(); if (modelElementRepositoryObj instanceof MetadataColumnRepositoryObject) { analyzedElement.add(((MetadataColumnRepositoryObject) modelElementRepositoryObj).getTdColumn()); } } if (!analyzedElement.isEmpty()) { if (!ModelElementHelper.isFromSameTable(analyzedElement) && !"".equals(dataFilterComp.getDataFilterString())) { //$NON-NLS-1$ return new ReturnCode(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.CannotCreatAnalysis"), false); //$NON-NLS-1$ } } if (!this.isValidateRowCount()) { return new ReturnCode(DefaultMessagesImpl.getString("MatchMasterDetailsPage.LoadedRowCountError"), false); //$NON-NLS-1$ } return new ReturnCode(true); } /** * DOC xqliu Comment method "checkMdmExecutionEngine". */ private ReturnCode checkMdmExecutionEngine() { ModelElementIndicator[] modelElementIndicators = treeViewer.getModelElementIndicator(); if (modelElementIndicators != null && modelElementIndicators.length != 0) { getCurrentModelElement().getContext().setConnection( ModelElementIndicatorHelper.getTdDataProvider(modelElementIndicators[0])); } return new ReturnCode(true); } /** * DOC zshen Comment method "includeDatePatternFreqIndicator". * * @return whether have a datePatternFreqIndicator in the "analyzed Columns" */ @Override protected boolean includeJavaEnginIndicator() { for (ModelElementIndicator modelElementIndicator : this.treeViewer.getModelElementIndicator()) { if (modelElementIndicator.containsAny(IndicatorEnum.getJavaIndicatorsEnum())) { 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 current Tree Viewer * * @param result */ public void refreshCurrentTreeViewer(ModelElementIndicator[] result) { if (result.length > 0) { lastTimePageNumber = uiPagination.getCurrentPageNumber(); refreshTheTree(result); // the number of current page is from 0 to n so need to add one when we use it. uiPagination.goToPage(lastTimePageNumber + 1); treeViewer.setElements(treeViewer.getModelElementIndicator(), true, true); } } @Override List<ExpandableComposite> getPreviewChartList() { return this.previewChartList; } @Override String getExpandString() { return DefaultMessagesImpl.getString("ExpandAllColumns"); //$NON-NLS-1$ } @Override String getCollapseAllString() { return DefaultMessagesImpl.getString("CollapseAllColumns"); //$NON-NLS-1$ } /** * return all created charts for the current running, from the current pagination. The charts which are not on the * current page no need to return. TODO check if can use IndicatorUnit */ @Override public List<DynamicIndicatorModel> getDynamicDatasets() { return uiPagination.getAllIndcatorAndDatasetOfCurrentPage(); } /** * clear all related maps which store the dynamic state and charts. */ @Override public void clearDynamicDatasets() { uiPagination.clearAllDynamicMapOfCurrentPage(); super.clearDynamicDatasets(); } /** * DOC msjian Comment method "createDrillDownPart". * * @param anaParameters * @param comp2 * @param executionLanguage */ @Override protected void createDrillDownPart(AnalysisParameters anaParameters, Composite comp2, ExecutionLanguage executionLanguage) { // MOD zshen feature 12919 : add allow drill down and max number row component for java engine. drillDownComposite = createDrillDownComposite(comp2, anaParameters); if (ExecutionLanguage.SQL.equals(executionLanguage)) { drillDownComposite.setVisible(false); showDrillDownComposite(drillDownComposite, 10); } addListenerToExecuteEngine(execCombo, drillDownComposite); } @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". * * @return */ private boolean isFileConnection() { DataManager connection = getCurrentModelElement().getContext().getConnection(); if (FileConnection.class.isInstance(connection)) { return true; } return false; } /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#refreshEnginSection() */ @Override protected void refreshEnginSection() { execLang = execCombo.getText(); ExecutionLanguage currentLanguage = ExecutionLanguage.get(execLang); refreshEnginSection(drillDownComposite, currentLanguage); } /** * add zshen feature 12919. */ private Composite createDrillDownComposite(Composite sectionClient, AnalysisParameters anaParameters) { Composite javaEnginSection = toolkit.createComposite(sectionClient); Composite checkSection = toolkit.createComposite(javaEnginSection); Composite numberSection = toolkit.createComposite(javaEnginSection); GridLayout gridLayout = new GridLayout(2, false); gridLayout.marginWidth = 0; GridDataFactory.fillDefaults().grab(true, false).span(2, 0).align(SWT.FILL, SWT.BEGINNING).applyTo(javaEnginSection); GridDataFactory.fillDefaults().grab(true, false).span(2, 0).align(SWT.FILL, SWT.BEGINNING).applyTo(checkSection); GridDataFactory.fillDefaults().grab(true, false).span(2, 0).align(SWT.FILL, SWT.BEGINNING).applyTo(numberSection); javaEnginSection.setLayout(gridLayout); checkSection.setLayout(gridLayout); numberSection.setLayout(gridLayout); toolkit.createLabel(checkSection, DefaultMessagesImpl.getString("ColumnMasterDetailsPage.allowDrillDownLabel"));//$NON-NLS-1$ drillDownCheck = toolkit.createButton(checkSection, "", SWT.CHECK);//$NON-NLS-1$ drillDownCheck.setSelection(true); drillDownCheck.setSelection(anaParameters.isStoreData()); drillDownCheck.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setDirty(true); } }); Label maxNumLabel = toolkit.createLabel(numberSection, DefaultMessagesImpl.getString("ColumnMasterDetailsPage.maxNumberLabel")); //$NON-NLS-1$ maxNumText = toolkit.createText(numberSection, null, SWT.BORDER); maxNumText.setText(String.valueOf(anaParameters.getMaxNumberRows())); maxNumText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { setDirty(true); } }); maxNumText.addVerifyListener(new VerifyListener() { public void verifyText(VerifyEvent e) { String inputValue = e.text; Pattern pattern = Pattern.compile("^[0-9]"); //$NON-NLS-1$ char[] charArray = inputValue.toCharArray(); for (char c : charArray) { if (!pattern.matcher(String.valueOf(c)).matches()) { e.doit = false; } } } }); GridDataFactory.fillDefaults().grab(true, false).applyTo(maxNumText); GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(maxNumLabel); GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.BEGINNING).applyTo(drillDownCheck); return javaEnginSection; } private void showDrillDownComposite(Composite drillDownComposite, int height) { GridData data = (GridData) drillDownComposite.getLayoutData(); data.heightHint = height; drillDownComposite.setLayoutData(data); // analysisParamSection.setExpanded(true); } private void addListenerToExecuteEngine(final CCombo execCombo1, final Composite javaEnginSection) { execCombo1.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { // MOD xqliu 2009-08-24 bug 8776 execLang = execCombo1.getText(); // MOD zshen 11104 2010-01-27: when have a datePatternFreqIndicator in the // "analyzed Columns",ExecutionLanguage only is Java. ExecutionLanguage currentLanguage = ExecutionLanguage.get(execLang); if (ExecutionLanguage.SQL.equals(currentLanguage) && includeJavaEnginIndicator()) { MessageUI.openWarning(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.JavaIndicatorExistWarning")); //$NON-NLS-1$ changeExecuteLanguageToJava(false); execLang = execCombo1.getText(); return; } else if (ExecutionLanguage.JAVA.equals(currentLanguage) && checkSqlEnginIndicatorExist()) { if (isRunWithSampleData) { MessageUI.openWarning(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.SqlIndicatorExistWarning")); //$NON-NLS-1$ } else { MessageUI.openWarning(DefaultMessagesImpl.getString("ColumnMasterDetailsPage.SqlIndicatorExistWarning2")); //$NON-NLS-1$ } changeExecuteLanguageToSql(true); execLang = execCombo1.getText(); return; } refreshEnginSection(javaEnginSection, currentLanguage); } }); } /** * DOC zshen Comment method "refreshEnginSection". * * @param javaEnginSection * @param currentLanguage */ protected void refreshEnginSection(final Composite javaEnginSection, ExecutionLanguage currentLanguage) { if (ExecutionLanguage.SQL.equals(currentLanguage)) { javaEnginSection.setVisible(false); showDrillDownComposite(javaEnginSection, 10); } else { javaEnginSection.setVisible(true); showDrillDownComposite(javaEnginSection, 100); } // 12919~ setDirty(true); setLanguageToTreeViewer(currentLanguage); // ~ // TDQ-11694 msjian : column analysis change from sql to java engine, can not show java parameters // correctly(UI) form.reflow(true); } /* * (non-Javadoc) * * @see * org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#createIndicatorSelectButton(org. * eclipse.swt.widgets.Composite) */ @Override protected void createIndicatorSelectButton(Composite buttonComposite) { Button indcBtn = toolkit.createButton(buttonComposite, DefaultMessagesImpl.getString("ColumnMasterDetailsPage.selectIndicatorBtn"), SWT.NONE); //$NON-NLS-1$ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(indcBtn); indcBtn.addMouseListener(new MouseAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.MouseAdapter#mouseDown(org.eclipse.swt.events.MouseEvent) */ @Override public void mouseDown(MouseEvent e) { if (!isValidateRowCount()) { MessageDialog.openWarning(null, DefaultMessagesImpl.getString("MatchMasterDetailsPage.NotValidate"), //$NON-NLS-1$ DefaultMessagesImpl.getString("MatchMasterDetailsPage.LoadedRowCountError")); //$NON-NLS-1$ } else { if (currentModelElementIndicators == null || currentModelElementIndicators.length == 0) { MessageDialog.openWarning(null, DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.indicatorSelection"), //$NON-NLS-1$ DefaultMessagesImpl.getString("ColumnMasterDetailsPage.CannotOpenSelectIndicatorDialog")); //$NON-NLS-1$ return; } ModelElementIndicator[] result = treeViewer.openIndicatorSelectDialog(ColumnAnalysisDetailsPage.this .getSite().getShell()); if (result != null) { refreshCurrentTreeViewer(result); if (treeViewer.isGridPreviewColumnMoved()) { refreshPreviewTable(true); } } } } }); } }