// ============================================================================ // // 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.composite; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.FileEditorInput; import org.talend.commons.utils.platform.PluginChecker; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.properties.ConnectionItem; import org.talend.core.model.repository.ISubRepositoryObject; import org.talend.core.repository.model.repositoryObject.MetadataColumnRepositoryObject; import org.talend.dataprofiler.core.CorePlugin; import org.talend.dataprofiler.core.ImageLib; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.model.DelimitedFileIndicator; import org.talend.dataprofiler.core.model.ModelElementIndicator; import org.talend.dataprofiler.core.service.GlobalServiceRegister; import org.talend.dataprofiler.core.service.IDatabaseJobService; import org.talend.dataprofiler.core.service.IJobService; import org.talend.dataprofiler.core.ui.action.actions.TdAddTaskAction; import org.talend.dataprofiler.core.ui.action.actions.predefined.CreateColumnAnalysisAction; import org.talend.dataprofiler.core.ui.action.actions.predefined.PreviewColumnAction; import org.talend.dataprofiler.core.ui.editor.pattern.PatternEditor; import org.talend.dataprofiler.core.ui.editor.pattern.PatternItemEditorInput; import org.talend.dataprofiler.core.ui.editor.preview.ColumnIndicatorUnit; import org.talend.dataprofiler.core.ui.editor.preview.IndicatorUnit; import org.talend.dataprofiler.core.ui.views.DQRespositoryView; import org.talend.dataprofiler.core.ui.views.RespositoryDetailView; import org.talend.dataquality.analysis.Analysis; import org.talend.dataquality.domain.pattern.Pattern; import org.talend.dataquality.indicators.FrequencyIndicator; import org.talend.dataquality.indicators.Indicator; import org.talend.dataquality.indicators.PatternMatchingIndicator; import org.talend.dataquality.indicators.sql.UserDefIndicator; import org.talend.dq.dbms.DbmsLanguage; import org.talend.dq.dbms.DbmsLanguageFactory; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.dq.helper.SqlExplorerUtils; import org.talend.dq.helper.resourcehelper.ResourceFileMap; import org.talend.dq.nodes.AnalysisRepNode; import org.talend.dq.nodes.ReportAnalysisRepNode; import org.talend.repository.model.IRepositoryNode; import org.talend.repository.model.RepositoryNode; import orgomg.cwm.objectmodel.core.Expression; import orgomg.cwm.objectmodel.core.ModelElement; /** * DOC yyi class global comment. Detailled comment */ public abstract class ModelElementTreeMenuProvider { private static Logger log = Logger.getLogger(ModelElementTreeMenuProvider.class); protected Tree tree; public ModelElementTreeMenuProvider(Tree tree) { this.tree = tree; } /** * DOC qzhang Comment method "createTreeMenu". MOD qiongli bug 16252.Add a param of 'isColumnSetMenu' * * @param newTree * @param containEdit */ public void createTreeMenu(boolean isColumnSetMenu) { Menu oldMenu = tree.getMenu(); if (oldMenu != null && !oldMenu.isDisposed()) { oldMenu.dispose(); } Menu menu = new Menu(tree); if (isSelectedColumn(tree.getSelection())) { if (!isMetadataColumnSelected(tree.getSelection())) { MenuItem previewMenuItem = new MenuItem(menu, SWT.CASCADE); previewMenuItem.setText(DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.previewDQElement")); //$NON-NLS-1$ previewMenuItem.setImage(ImageLib.getImage(ImageLib.EXPLORE_IMAGE)); previewMenuItem.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected (org.eclipse * .swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { previewSelectedElements(tree); } }); } if (isColumnSetMenu) { MenuItem createColumnAnalysisMenuItem = new MenuItem(menu, SWT.CASCADE); createColumnAnalysisMenuItem.setText(DefaultMessagesImpl.getString("CreateColumnAnalysisAction.columnAnalysis")); //$NON-NLS-1$ createColumnAnalysisMenuItem.setImage(ImageLib.getImage(ImageLib.ACTION_NEW_ANALYSIS)); createColumnAnalysisMenuItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { createColumnAnalysis(tree); } }); } MenuItem showLocationMenuItem = new MenuItem(menu, SWT.CASCADE); showLocationMenuItem.setText(DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.showDQElement")); //$NON-NLS-1$ showLocationMenuItem.setImage(ImageLib.getImage(ImageLib.EXPLORE_IMAGE)); showLocationMenuItem.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @seeorg.eclipse.swt.events.SelectionAdapter# widgetSelected(org.eclipse .swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { showSelectedElements(tree); } }); } if (isSelectedIndicator(tree.getSelection()) && !isMetadataColumnIndicatorSelected(tree.getSelection())) { // MOD 2009-01-04 mzhao MenuItem showQueryMenuItem = new MenuItem(menu, SWT.CASCADE); showQueryMenuItem.setText(DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.viewQuery")); //$NON-NLS-1$ showQueryMenuItem.setImage(ImageLib.getImage(ImageLib.EXPLORE_IMAGE)); showQueryMenuItem.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected (org.eclipse .swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { viewQueryForSelectedElement(tree); } }); } if (isSelectedPatternIndicator(tree.getSelection())) { MenuItem editPatternMenuItem = new MenuItem(menu, SWT.CASCADE); editPatternMenuItem.setText(DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.editPattern")); //$NON-NLS-1$ editPatternMenuItem.setImage(ImageLib.getImage(ImageLib.PATTERN_REG)); editPatternMenuItem.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @seeorg.eclipse.swt.events.SelectionAdapter# widgetSelected(org .eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { editPattern(tree); } }); } // MOD zshen 2010-06-02 featrue 12919 // judge to indicator whether is frequency if (isSelectedFrequencyIndicator(tree.getSelection()) && PluginChecker.isTDCPLoaded()) { MenuItem editPatternMenuItem = new MenuItem(menu, SWT.CASCADE); editPatternMenuItem.setText(DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.generateJob")); //$NON-NLS-1$ editPatternMenuItem.setImage(ImageLib.getImage(ImageLib.ICON_PROCESS)); editPatternMenuItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { final IDatabaseJobService service = (IDatabaseJobService) GlobalServiceRegister.getDefault().getService( IJobService.class); if (service != null) { service.setIndicator(getSelectedIndicator(tree.getSelection())); IRepositoryNode anaNode = getAnalysis2(); Analysis ana; if (anaNode instanceof ReportAnalysisRepNode) { ana = ((ReportAnalysisRepNode) anaNode).getAnalysis(); } else { ana = ((AnalysisRepNode) anaNode).getAnalysis(); } service.setAnalysis(ana); service.executeJob(); } } }); } if (isSelectedUDIndicator(tree.getSelection())) { MenuItem editPatternMenuItem = new MenuItem(menu, SWT.CASCADE); editPatternMenuItem.setText(DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.editUDIndicator")); //$NON-NLS-1$ editPatternMenuItem.setImage(ImageLib.getImage(ImageLib.IND_DEFINITION)); editPatternMenuItem.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @seeorg.eclipse.swt.events.SelectionAdapter# widgetSelected(org .eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { editUDIndicator(tree); } }); } // add common menu to the tree MenuItem addTaskItem = new MenuItem(menu, SWT.CASCADE); addTaskItem.setText(DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.AddTask")); //$NON-NLS-1$ addTaskItem.setImage(ImageLib.getImage(ImageLib.ADD_ACTION)); addTaskItem.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org .eclipse .swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { TreeItem[] selection = tree.getSelection(); if (selection.length > 0) { IRepositoryNode ana = getAnalysis2(); // MOD qiongli 2011-1-12 feature 16796 :handle the case of ModelElement name is null (new TdAddTaskAction(tree.getShell(), ana)).run(); } } }); MenuItem deleteMenuItem = new MenuItem(menu, SWT.CASCADE); deleteMenuItem.setText(DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.removeElement")); //$NON-NLS-1$ deleteMenuItem.setImage(ImageLib.getImage(ImageLib.DELETE_ACTION)); deleteMenuItem.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org .eclipse .swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { removeSelectedElements2(tree); } }); tree.setMenu(menu); } /** * DOC yyi Comment method "removeSelectedElements". * * @param tree */ protected abstract void removeSelectedElements2(Tree tree); protected abstract IRepositoryNode getAnalysis2(); private void editPattern(Tree tree) { TreeItem[] selection = tree.getSelection(); if (selection.length > 0) { TreeItem treeItem = selection[0]; IndicatorUnit indicatorUnit = (IndicatorUnit) treeItem.getData(AbstractColumnDropTree.INDICATOR_UNIT_KEY); PatternMatchingIndicator indicator = (PatternMatchingIndicator) indicatorUnit.getIndicator(); Pattern pattern = indicator.getParameters().getDataValidDomain().getPatterns().get(0); RepositoryNode patternRecursiveFind = RepositoryNodeHelper.recursiveFind(pattern); PatternItemEditorInput patternItemEditorInput = new PatternItemEditorInput(patternRecursiveFind); CorePlugin.getDefault().openEditor(patternItemEditorInput, PatternEditor.class.getName()); } } /** * DOC yyi Comment method "editUDIndicator" 2009-09-04. * * @param tree */ private void editUDIndicator(Tree tree) { TreeItem[] selection = tree.getSelection(); if (selection.length > 0) { TreeItem treeItem = selection[0]; IndicatorUnit indicatorUnit = (IndicatorUnit) treeItem.getData(AbstractColumnDropTree.INDICATOR_UNIT_KEY); UserDefIndicator indicator = (UserDefIndicator) indicatorUnit.getIndicator(); IFile file = ResourceFileMap.findCorrespondingFile(indicator.getIndicatorDefinition()); IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); try { activePage.openEditor(new FileEditorInput(file), "org.talend.dataprofiler.core.ui.editor.indicator.IndicatorEditor"); //$NON-NLS-1$ } catch (PartInitException e1) { log.error(e1, e1); } } } /** * DOC Zqin Comment method "previewSelectedElements". * * @param newTree */ private void previewSelectedElements(Tree newTree) { TreeItem[] items = newTree.getSelection(); ModelElement[] mes = new ModelElement[items.length]; for (int i = 0; i < items.length; i++) { ModelElementIndicator meIndicator = (ModelElementIndicator) items[i] .getData(AbstractColumnDropTree.MODELELEMENT_INDICATOR_KEY); ModelElement me = ((MetadataColumnRepositoryObject) meIndicator.getModelElementRepositoryNode().getObject()) .getTdColumn(); mes[i] = me; } new PreviewColumnAction(mes).run(); } /** * * DOC mzhao Comment method "viewQueryForSelectedElement". * * @param newTree */ private void viewQueryForSelectedElement(Tree newTree) { TreeItem[] selection = newTree.getSelection(); for (TreeItem item : selection) { ModelElementIndicator meIndicator = (ModelElementIndicator) item .getData(AbstractColumnDropTree.MODELELEMENT_INDICATOR_KEY); ConnectionItem connItem = (ConnectionItem) meIndicator.getModelElementRepositoryNode().getObject().getProperty() .getItem(); Connection dataprovider = connItem.getConnection(); IndicatorUnit indicatorUnit = (IndicatorUnit) item.getData(AbstractColumnDropTree.INDICATOR_UNIT_KEY); DbmsLanguage dbmsLang = DbmsLanguageFactory.createDbmsLanguage(dataprovider); Expression expression = dbmsLang.getInstantiatedExpression(indicatorUnit.getIndicator()); if (expression == null) { MessageDialogWithToggle .openWarning( null, DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.Warn"), DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.NoQueryDefined")); //$NON-NLS-1$ //$NON-NLS-2$ return; } SqlExplorerUtils.getDefault().runInDQViewer(dataprovider, expression.getBody(), meIndicator.getModelElementRepositoryNode().getObject().getProperty().getLabel()); } } /** * DOC Zqin Comment method "showSelectedElements".MOD 2009-01-07 mzhao. * * @param newTree */ public void showDetailView(Tree newTree) { TreeItem[] selection = newTree.getSelection(); if (selection.length > 0) { RespositoryDetailView detailView = CorePlugin.getDefault().getRespositoryDetailView(); if (detailView == null) { return; } DQRespositoryView dqview = CorePlugin.getDefault().getRepositoryView(); RepositoryNode node = getSelectedNode(selection); detailView.selectionChanged(dqview, new StructuredSelection(node)); } } /** * DOC Zqin Comment method "showSelectedElements".MOD 2009-01-07 mzhao. * * @param newTree */ private void showSelectedElements(Tree newTree) { TreeItem[] selection = newTree.getSelection(); if (selection.length > 0) { DQRespositoryView dqview = CorePlugin.getDefault().findAndOpenRepositoryView(); // if DqRepository view is not openning we will not do anything if (dqview == null) { return; } RepositoryNode node = getSelectedNode(selection); dqview.showSelectedElements(node); } } /** * DOC msjian Comment method "getSelectedNode". * * @param selection * @return */ protected RepositoryNode getSelectedNode(TreeItem[] selection) { ModelElementIndicator meIndicator = (ModelElementIndicator) selection[0] .getData(AbstractColumnDropTree.MODELELEMENT_INDICATOR_KEY); ModelElement me = ((ISubRepositoryObject) meIndicator.getModelElementRepositoryNode().getObject()).getModelElement(); RepositoryNode recursiveFind = RepositoryNodeHelper.recursiveFind(me); if (recursiveFind == null) { recursiveFind = RepositoryNodeHelper.createRepositoryNode(me); } return recursiveFind; } private boolean isSelectedColumn(TreeItem[] items) { for (TreeItem item : items) { if (item.getData(AbstractColumnDropTree.INDICATOR_UNIT_KEY) != null) { return false; } } return true; } private boolean isSelectedIndicator(TreeItem[] items) { if (isSelectedColumn(items)) { return false; } return true; } private boolean isSelectedPatternIndicator(TreeItem[] items) { if (!isSelectedIndicator(items)) { return false; } for (TreeItem item : items) { IndicatorUnit unit = (IndicatorUnit) item.getData(AbstractColumnDropTree.INDICATOR_UNIT_KEY); if (unit != null) { Indicator indicator = unit.getIndicator(); if (!(indicator instanceof PatternMatchingIndicator)) { return false; } } } return true; } /** * * DOC zshen Comment method "isSelectedFrequencyIndicator". judge to indicator whether is frequency * * @param items * @return */ private boolean isSelectedFrequencyIndicator(TreeItem[] items) { if (!isSelectedIndicator(items)) { return false; } for (TreeItem item : items) { IndicatorUnit unit = (IndicatorUnit) item.getData(AbstractColumnDropTree.INDICATOR_UNIT_KEY); if (unit != null) { Indicator indicator = unit.getIndicator(); if (!(indicator instanceof FrequencyIndicator)) { return false; } } } return true; } private Indicator getSelectedIndicator(TreeItem[] items) { assert items.length == 1; if (!isSelectedIndicator(items)) { return null; } for (TreeItem item : items) { IndicatorUnit unit = (IndicatorUnit) item.getData(AbstractColumnDropTree.INDICATOR_UNIT_KEY); if (unit != null) { return unit.getIndicator(); } } return null; } /** * * DOC qiongli:if the selected item is MetadaColumn. * * @param items * @return */ private boolean isMetadataColumnSelected(TreeItem[] items) { for (TreeItem item : items) { Object data = item.getData(AnalysisColumnTreeViewer.MODELELEMENT_INDICATOR_KEY); if (data != null && data instanceof DelimitedFileIndicator) { return true; } } return false; } /** * * DOC qiongli Comment method "isMetadataColumnIndicatorSelected". * * @param items * @return */ private boolean isMetadataColumnIndicatorSelected(TreeItem[] items) { for (TreeItem item : items) { Object dataIndicator = item.getData(AnalysisColumnTreeViewer.INDICATOR_UNIT_KEY); if (dataIndicator != null && dataIndicator instanceof ColumnIndicatorUnit) { ColumnIndicatorUnit iu = (ColumnIndicatorUnit) dataIndicator; return iu.isMetadataColumn(); } } return false; } /** * DOC yyi Comment method "isSelectedUDIndicator" 2009-09-04. * * @param items * @return */ private boolean isSelectedUDIndicator(TreeItem[] items) { if (!isSelectedIndicator(items)) { return false; } for (TreeItem item : items) { IndicatorUnit unit = (IndicatorUnit) item.getData(AbstractColumnDropTree.INDICATOR_UNIT_KEY); if (unit != null) { Indicator indicator = unit.getIndicator(); if (!(indicator instanceof UserDefIndicator)) { return false; } } } return true; } /** * * DOC qiongli Comment method "createColumnAnalysis".bug 16252. * * @param newTree */ private void createColumnAnalysis(Tree newTree) { TreeItem[] items = newTree.getSelection(); if (items.length > 0) { TreePath[] paths = new TreePath[items.length]; for (int i = 0; i < items.length; i++) { // MOD klliu bug 20820 change TDcolum to IRepositoryNode, then solve NPE 2011-04-29 ModelElementIndicator data = (ModelElementIndicator) items[i].getData("MODELELEMENT_INDICATOR_KEY");//$NON-NLS-1$ IRepositoryNode modelElementRepositoryNode = data.getModelElementRepositoryNode(); paths[i] = new TreePath(new Object[] { modelElementRepositoryNode }); } CreateColumnAnalysisAction analysisAction = new CreateColumnAnalysisAction(); analysisAction.setSelection(new TreeSelection(paths)); analysisAction.run(); } } }