// ============================================================================ // // 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 java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TreeEditor; 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.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; 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.dialogs.ISelectionStatusValidator; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.cwm.helper.ColumnSetHelper; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.helper.TableHelper; import org.talend.cwm.helper.TaggedValueHelper; import org.talend.cwm.relational.TdTable; import org.talend.cwm.relational.TdView; import org.talend.dataprofiler.core.CorePlugin; import org.talend.dataprofiler.core.ImageLib; import org.talend.dataprofiler.core.dqrule.DQRuleUtilities; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.model.TableIndicator; 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.PreviewAction; import org.talend.dataprofiler.core.ui.dialog.IndicatorCheckedTreeSelectionDialog; import org.talend.dataprofiler.core.ui.dialog.composite.TooltipTree; import org.talend.dataprofiler.core.ui.editor.AbstractAnalysisActionHandler; import org.talend.dataprofiler.core.ui.editor.AbstractMetadataFormPage; import org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage; import org.talend.dataprofiler.core.ui.editor.analysis.BusinessRuleAnalysisDetailsPage; import org.talend.dataprofiler.core.ui.editor.dqrules.BusinessRuleItemEditorInput; import org.talend.dataprofiler.core.ui.editor.preview.TableIndicatorUnit; import org.talend.dataprofiler.core.ui.utils.AnalysisUtils; import org.talend.dataprofiler.core.ui.utils.MessageUI; import org.talend.dataprofiler.core.ui.utils.OpeningHelpWizardDialog; import org.talend.dataprofiler.core.ui.views.DQRespositoryView; import org.talend.dataprofiler.core.ui.views.RespositoryDetailView; import org.talend.dataprofiler.core.ui.views.TableViewerDND; import org.talend.dataprofiler.core.ui.views.provider.DQRepositoryViewLabelProvider; import org.talend.dataprofiler.core.ui.views.provider.ResourceViewContentProvider; import org.talend.dataprofiler.core.ui.wizard.indicator.TableIndicatorOptionsWizard; import org.talend.dataprofiler.core.ui.wizard.indicator.forms.FormEnum; import org.talend.dataquality.analysis.Analysis; import org.talend.dataquality.domain.Domain; import org.talend.dataquality.helpers.IndicatorHelper; import org.talend.dataquality.indicators.CompositeIndicator; import org.talend.dataquality.indicators.DateParameters; import org.talend.dataquality.indicators.FrequencyIndicator; import org.talend.dataquality.indicators.Indicator; import org.talend.dataquality.indicators.IndicatorParameters; import org.talend.dataquality.indicators.RowCountIndicator; import org.talend.dataquality.indicators.TextParameters; import org.talend.dataquality.indicators.definition.IndicatorDefinition; import org.talend.dataquality.indicators.sql.WhereRuleIndicator; import org.talend.dataquality.rules.WhereRule; import org.talend.dq.dbms.DbmsLanguage; import org.talend.dq.dbms.DbmsLanguageFactory; import org.talend.dq.helper.EObjectHelper; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.dq.helper.SqlExplorerUtils; import org.talend.dq.nodes.DBTableRepNode; import org.talend.dq.nodes.DBViewRepNode; import org.talend.dq.nodes.DQRepositoryNode; import org.talend.dq.nodes.RuleRepNode; import org.talend.dq.nodes.SysIndicatorDefinitionRepNode; import org.talend.dq.nodes.indicator.type.IndicatorEnum; import org.talend.repository.model.RepositoryNode; import org.talend.resource.EResourceConstant; import orgomg.cwm.objectmodel.core.Expression; import orgomg.cwm.objectmodel.core.ModelElement; import orgomg.cwm.resource.relational.NamedColumnSet; /** * DOC xqliu class global comment. Detailled comment */ public class AnalysisTableTreeViewer extends AbstractTableDropTree { protected static Logger log = Logger.getLogger(AnalysisTableTreeViewer.class); public static final String VIEWER_KEY = "org.talend.dataprofiler.core.ui.editor.composite.AnalysisTableTreeViewer"; //$NON-NLS-1$ private Composite parentComp; private BusinessRuleAnalysisDetailsPage masterPage; private TableIndicator[] tableIndicators; // ADD xqliu 2009-04-30 bug 6808 private Map<Object, TreeItem> indicatorTreeItemMap; /** * DOC xqliu AnalysisTableTreeViewer constructor comment. * * @param parent */ public AnalysisTableTreeViewer(Composite parent) { parentComp = parent; this.tree = createTree(parent); // ADD xqliu 2009-04-30 bug 6808 indicatorTreeItemMap = new HashMap<Object, TreeItem>(); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.ui.editor.composite.AbstractColumnDropTree#getMasterPage() */ @Override public AbstractAnalysisMetadataPage getMasterPage() { return masterPage; } /** * DOC xqliu AnalysisTableTreeViewer constructor comment. * * @param tree * @param tableMasterDetailsPage */ public AnalysisTableTreeViewer(Composite parent, BusinessRuleAnalysisDetailsPage masterPage) { this(parent); this.masterPage = masterPage; this.setElements(masterPage.getCurrentTableIndicators()); this.setDirty(false); } private Tree createTree(Composite parent) { final Tree newTree = new TooltipTree(parent, SWT.MULTI | SWT.BORDER) { @Override protected boolean isValidItem(TreeItem item) { if (item == null) { return false; } Object itemData = item.getData(INDICATOR_UNIT_KEY); if (itemData != null) { TableIndicatorUnit indicatorUnit = (TableIndicatorUnit) item.getData(INDICATOR_UNIT_KEY); if (indicatorUnit != null && !(indicatorUnit.getIndicator() instanceof CompositeIndicator)) { return true; } return false; } else { return false; } } @Override protected String getItemTooltipText(TreeItem item) { String expCont = isExpressionNull(item); if (expCont == null) { return DefaultMessagesImpl.getString("AnalysisTableTreeViewer.queryNotGen"); //$NON-NLS-1$ } return expCont; } }; GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(newTree); newTree.setHeaderVisible(true); createTreeItem(newTree, 190, "AnalysisTableTreeViewer.analyzedTables"); //$NON-NLS-1$ createTreeItem(newTree, 80, "AnalysisTableTreeViewer.dqrule"); //$NON-NLS-1$ createTreeItem(newTree, 80, "AnalysisColumnTreeViewer.operation"); //$NON-NLS-1$ parent.layout(); AbstractAnalysisActionHandler actionHandler = new AbstractAnalysisActionHandler(parent) { @Override protected void handleRemove() { removeSelectedElements(newTree); } }; parent.setData(AbstractMetadataFormPage.ACTION_HANDLER, actionHandler); TableViewerDND.installDND(newTree); this.addTreeListener(newTree); newTree.setData(this); return newTree; } private void addTreeListener(final Tree tree) { tree.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { TableTreeMenuProvider tableTreeMenuProvider = new TableTreeMenuProvider(tree); tableTreeMenuProvider.createTreeMenu(); tableTreeMenuProvider.showDetailView(tree); } }); tree.addTreeListener(treeAdapter); tree.addMouseListener(new MouseAdapter() { @Override public void mouseDoubleClick(MouseEvent e) { TreeItem[] treeSelection = tree.getSelection(); if (treeSelection.length > 0) { TreeItem item = treeSelection[0]; Object indicatorobj = item.getData(INDICATOR_UNIT_KEY); Object tableobj = item.getData(TABLE_INDICATOR_KEY); if (tableobj != null && indicatorobj == null) { // open DQ Rule selector showAddDQRuleDialog(item, (TableIndicator) tableobj); } else if (tableobj != null && indicatorobj != null) { // open indicator option wizard openIndicatorOptionDialog(null, item); } } } }); } /* * (non-Javadoc) * * @see * org.talend.dataprofiler.core.ui.editor.composite.AbstractColumnDropTree#getTheSuitedComposite(org.eclipse.swt * .events.SelectionEvent) */ @Override public ExpandableComposite getTheSuitedComposite(SelectionEvent e) { Composite[] previewChartCompsites = masterPage.getPreviewChartCompsites(); if (previewChartCompsites == null) { return null; } Object obj = e.item.getData(TABLE_INDICATOR_KEY); if (obj instanceof TableIndicator) { TableIndicator tableIndicator = (TableIndicator) obj; for (Composite comp : previewChartCompsites) { if (comp.getData() == tableIndicator) { return (ExpandableComposite) comp; } } } return null; } public void setElements(final Object elements) { this.tree.dispose(); this.tree = createTree(this.parentComp); tree.setData(VIEWER_KEY, this); this.tableIndicators = (TableIndicator[]) elements; addItemElements((TableIndicator[]) elements); // MOD mzhao 2009-05-5, bug 6587. updateBindConnection(masterPage, tableIndicators, tree); } private void addItemElements(final TableIndicator[] elements) { for (final TableIndicator tableIndicator : elements) { final TreeItem treeItem = new TreeItem(tree, SWT.NONE); if (tableIndicator.isTable()) { treeItem.setImage(ImageLib.getImage(ImageLib.TABLE)); } else if (tableIndicator.isView()) { treeItem.setImage(ImageLib.getImage(ImageLib.VIEW)); } ModelElement columnSet = tableIndicator.getColumnSet(); if (columnSet.eIsProxy()) { // try to resolve the proxy columnSet = (ModelElement) EObjectHelper.resolveObject(columnSet); } String columnSetName = columnSet.getName(); if (columnSetName == null) { columnSetName = "Unknown name"; //$NON-NLS-1$ } treeItem.setText(0, columnSetName); treeItem.setData(TABLE_INDICATOR_KEY, tableIndicator); TreeEditor addDQRuleEditor = new TreeEditor(tree); Label addDQRuleLabl = createTreeItemLabel(tree, ImageLib.ADD_DQ, "AnalysisColumnTreeViewer.addDQRule"); //$NON-NLS-1$ addDQRuleLabl.addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { showAddDQRuleDialog(treeItem, tableIndicator); } }); addDQRuleEditor.minimumWidth = addDQRuleLabl.getImage().getBounds().width; addDQRuleEditor.setEditor(addDQRuleLabl, treeItem, 1); TreeEditor delLabelEditor = new TreeEditor(tree); Label delLabel = createTreeItemLabel(tree, ImageLib.DELETE_ACTION, "AnalysisColumnTreeViewer.delete"); //$NON-NLS-1$ delLabel.addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { deleteTableItems(tableIndicator); if (treeItem.getParentItem() != null && treeItem.getParentItem().getData(INDICATOR_UNIT_KEY) != null) { setElements(tableIndicators); } else { deleteIndicatorItems(tableIndicator); removeItemBranch(treeItem); indicatorTreeItemMap.remove(tableIndicator); } // MOD mzhao 2005-05-05 bug 6587. // MOD mzhao 2009-06-8, bug 5887. // updateBindConnection(masterPage, getTableIndicator(), // tree); } }); delLabelEditor.minimumWidth = delLabel.getImage().getBounds().width; delLabelEditor.horizontalAlignment = SWT.CENTER; delLabelEditor.setEditor(delLabel, treeItem, 2); treeItem.setData(ITEM_EDITOR_KEY, new TreeEditor[] { addDQRuleEditor, delLabelEditor }); if (tableIndicator.hasIndicators()) { createIndicatorItems(treeItem, tableIndicator.getIndicatorUnits()); } treeItem.setExpanded(true); // ADD xqliu 2009-04-30 bug 6808 this.indicatorTreeItemMap.put(tableIndicator, treeItem); } this.setDirty(true); } /** * DOC xqliu Comment method "showAddDQRuleDialog". * * @param treeItem * @param tableIndicator */ private void showAddDQRuleDialog(final TreeItem treeItem, final TableIndicator tableIndicator) { // MOD xqliu 2009-04-30 bug 6808 IndicatorCheckedTreeSelectionDialog dialog = new IndicatorCheckedTreeSelectionDialog(null, new DQRepositoryViewLabelProvider(), new ResourceViewContentProvider()); dialog.setInput(AnalysisUtils.getSelectDialogInputData(EResourceConstant.RULES_SQL)); dialog.setValidator(new ISelectionStatusValidator() { public IStatus validate(Object[] selection) { for (Object ruleNode : selection) { if (ruleNode instanceof RuleRepNode) { IndicatorDefinition findWhereRule = ((RuleRepNode) ruleNode).getRule(); boolean validStatus = TaggedValueHelper.getValidStatus(findWhereRule); if (!validStatus) { return new Status(IStatus.ERROR, CorePlugin.PLUGIN_ID, DefaultMessagesImpl .getString("AnalysisTableTreeViewer.chooseValidDQRules")); //$NON-NLS-1$ } } } return new Status(IStatus.OK, PlatformUI.PLUGIN_ID, IStatus.OK, "", null); //$NON-NLS-1$ } }); dialog.setContainerMode(true); dialog.setTitle(DefaultMessagesImpl.getString("AnalysisTableTreeViewer.dqruleSelector")); //$NON-NLS-1$ dialog.setMessage(DefaultMessagesImpl.getString("AnalysisTableTreeViewer.dqrules")); //$NON-NLS-1$ dialog.setSize(80, 30); dialog.create(); // MOD xqliu 2009-04-30 bug 6808 Object[] ownedWhereRuleNodes = getOwnedWhereRuleNodes(tableIndicator); dialog.setCheckedElements(ownedWhereRuleNodes); if (dialog.open() == Window.OK) { Object[] result = dialog.getResult(); removeUncheckedWhereRuleIndicator(ownedWhereRuleNodes, result, tableIndicator); Object[] results = clearAddedResult(ownedWhereRuleNodes, result); for (Object obj : results) { if (obj instanceof RuleRepNode) { RuleRepNode node = (RuleRepNode) obj; TableIndicatorUnit addIndicatorUnit = DQRuleUtilities .createIndicatorUnit(node, tableIndicator, getAnalysis()); if (addIndicatorUnit != null) { createOneUnit(treeItem, addIndicatorUnit); setDirty(true); } else { IndicatorDefinition whereRule = node.getRule(); MessageUI.openError(DefaultMessagesImpl.getString("AnalysisTableTreeViewer.ErrorWhenAddWhereRule",//$NON-NLS-1$ whereRule.getName())); } } } } // ~ } /** * DOC xqliu Comment method "removeUncheckedWhereRuleIndicator". ADD xqliu 2009-04-30 bug 6808 * * @param ownedWhereRuleNodes * @param results * @param tableIndicator */ private void removeUncheckedWhereRuleIndicator(Object[] ownedWhereRuleNodes, Object[] results, TableIndicator tableIndicator) { ArrayList<Object> removeList = new ArrayList<Object>(); for (Object node : ownedWhereRuleNodes) { boolean remove = true; for (Object result : results) { if (node.equals(result)) { remove = false; break; } } if (remove) { removeList.add(node); } } TableIndicatorUnit[] indicatorUnits = tableIndicator.getIndicatorUnits(); for (TableIndicatorUnit unit : indicatorUnits) { IndicatorDefinition indicatorDefinition = unit.getIndicator().getIndicatorDefinition(); if (indicatorDefinition instanceof WhereRule) { WhereRule wr = (WhereRule) indicatorDefinition; RuleRepNode recursiveFindNode = RepositoryNodeHelper.recursiveFindRuleSql(wr); for (Object obj : removeList) { RuleRepNode node = (RuleRepNode) obj; if (recursiveFindNode.equals(node)) { // the order can not be changed removeItemBranch(this.indicatorTreeItemMap.get(unit)); deleteIndicatorItems(tableIndicator, unit); // ~the order can not be changed break; } } } } } /** * DOC xqliu Comment method "clearAddedResult". ADD xqliu 2009-04-30 bug 6808 * * @param addedResults * @param result * @return */ private Object[] clearAddedResult(Object[] addedResults, Object[] results) { ArrayList<Object> ret = new ArrayList<Object>(); for (Object result : results) { boolean add = true; for (Object addedResult : addedResults) { if (result.equals(addedResult)) { add = false; break; } } if (add) { ret.add(result); } } return ret.toArray(); } /** * DOC xqliu Comment method "getOwnedWhereRuleFiles". ADD xqliu 2009-04-30 bug 6808 * * @param tableIndicator * @param whereRuleFolder * @return */ private Object[] getOwnedWhereRuleNodes(TableIndicator tableIndicator) { ArrayList<RuleRepNode> ret = new ArrayList<RuleRepNode>(); Indicator[] indicators = tableIndicator.getIndicators(); for (Indicator indicator : indicators) { if (IndicatorHelper.isWhereRuleIndicator(indicator)) { Object obj = indicator.getIndicatorDefinition(); if (obj != null && obj instanceof WhereRule) { WhereRule wr = (WhereRule) obj; RuleRepNode recursiveFindRuleSql = RepositoryNodeHelper.recursiveFindRuleSql(wr); if (recursiveFindRuleSql != null) { ret.add(recursiveFindRuleSql); } } } } return ret.toArray(); } private void createIndicatorItems(TreeItem treeItem, TableIndicatorUnit[] indicatorUnits) { for (TableIndicatorUnit indicatorUnit : indicatorUnits) { createOneUnit(treeItem, indicatorUnit); } } public void createOneUnit(final TreeItem treeItem, TableIndicatorUnit indicatorUnit) { final TreeItem indicatorItem = new TreeItem(treeItem, SWT.NONE); final TableIndicatorUnit unit = indicatorUnit; IndicatorEnum type = indicatorUnit.getType(); final IndicatorEnum indicatorEnum = type; indicatorItem.setData(TABLE_INDICATOR_KEY, treeItem.getData(TABLE_INDICATOR_KEY)); indicatorItem.setData(INDICATOR_UNIT_KEY, unit); indicatorItem.setData(VIEWER_KEY, this); String label = indicatorUnit.getIndicatorName(); label = label != null ? label : "Unknown indicator";//$NON-NLS-1$ SysIndicatorDefinitionRepNode recursiveFindIndicatorDefinition = RepositoryNodeHelper .recursiveFindIndicatorDefinition(indicatorUnit.getIndicator().getIndicatorDefinition()); if (recursiveFindIndicatorDefinition != null && !recursiveFindIndicatorDefinition.getProject().isMainProject()) { label = label + recursiveFindIndicatorDefinition.getDisplayProjectName(); } if (IndicatorEnum.WhereRuleIndicatorEnum.compareTo(type) == 0) { indicatorItem.setImage(0, ImageLib.getImage(ImageLib.DQ_RULE)); } else if (IndicatorEnum.RowCountIndicatorEnum.compareTo(type) == 0) { indicatorItem.setImage(0, ImageLib.getImage(ImageLib.IND_DEFINITION)); } indicatorItem.setText(0, label); TreeEditor optionEditor = new TreeEditor(tree); final Label optionLabel = createTreeItemLabel(tree, ImageLib.OPTION, "AnalysisTableTreeViewer.options"); //$NON-NLS-1$ optionLabel.setData(indicatorUnit); optionLabel.addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { boolean hasIndicatorParameters = openIndicatorOptionDialog(Display.getCurrent().getActiveShell(), indicatorItem); if (hasIndicatorParameters) { optionLabel.setImage(ImageLib.getImage(ImageLib.INDICATOR_OPTION_CHECKED)); } } }); optionEditor.minimumWidth = optionLabel.getImage().getBounds().width; optionEditor.horizontalAlignment = SWT.CENTER; optionEditor.setEditor(optionLabel, indicatorItem, 1); TreeEditor delEditor = null; if (!(unit.getIndicator() instanceof RowCountIndicator)) { delEditor = new TreeEditor(tree); Label delLabel = createTreeItemLabel(tree, ImageLib.DELETE_ACTION, "AnalysisTableTreeViewer.delete"); //$NON-NLS-1$ delLabel.addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { deleteIndicatorItems((TableIndicator) treeItem.getData(TABLE_INDICATOR_KEY), unit); if (indicatorItem.getParentItem() != null && indicatorItem.getParentItem().getData(INDICATOR_UNIT_KEY) != null) { setElements(tableIndicators); } else { removeItemBranch(indicatorItem); indicatorTreeItemMap.remove(unit); } } }); delEditor.minimumWidth = delLabel.getImage().getBounds().width; delEditor.horizontalAlignment = SWT.CENTER; delEditor.setEditor(delLabel, indicatorItem, 2); } if (delEditor == null) { indicatorItem.setData(ITEM_EDITOR_KEY, new TreeEditor[] { optionEditor }); } else { indicatorItem.setData(ITEM_EDITOR_KEY, new TreeEditor[] { optionEditor, delEditor }); } if (indicatorEnum != null && indicatorEnum.hasChildren()) { indicatorItem.setData(treeItem.getData(TABLE_INDICATOR_KEY)); createIndicatorItems(indicatorItem, indicatorUnit.getChildren()); } if (hasIndicatorParameters(indicatorUnit)) { optionLabel.setImage(ImageLib.getImage(ImageLib.INDICATOR_OPTION_CHECKED)); } // ADD xqliu 2009-04-30 bug 6808 this.indicatorTreeItemMap.put(unit, indicatorItem); } /* * (non-Javadoc) * * @see * org.talend.dataprofiler.core.ui.editor.composite.AbstractColumnDropTree#openIndicatorOptionDialog(org.eclipse * .swt.widgets.Shell, org.eclipse.swt.widgets.TreeItem) */ @Override public boolean openIndicatorOptionDialog(Shell shell, TreeItem indicatorItem) { if (isDirty()) { masterPage.doSave(null); } TableIndicatorUnit indicatorUnit = (TableIndicatorUnit) indicatorItem.getData(INDICATOR_UNIT_KEY); if (FormEnum.isExsitingForm(indicatorUnit)) { TableIndicatorOptionsWizard wizard = new TableIndicatorOptionsWizard(indicatorUnit); String href = FormEnum.getFirstFormHelpHref(indicatorUnit); OpeningHelpWizardDialog optionDialog = new OpeningHelpWizardDialog(shell, wizard, href); optionDialog.create(); if (Window.OK == optionDialog.open()) { setDirty(wizard.isDirty()); return hasIndicatorParameters(indicatorUnit); } } else { openNoIndicatorOptionsMessageDialog(shell); } return false; } /** * DOC msjian Comment method "hasIndicatorParameters". * * @param indicatorUnit * @return */ private boolean hasIndicatorParameters(TableIndicatorUnit indicatorUnit) { IndicatorParameters parameters = indicatorUnit.getIndicator().getParameters(); if (parameters == null) { return false; } if (indicatorUnit.getIndicator() instanceof FrequencyIndicator) { return true; } TextParameters tParameter = parameters.getTextParameter(); if (tParameter != null) { return true; } DateParameters dParameters = parameters.getDateParameters(); if (dParameters != null) { return true; } Domain dataValidDomain = parameters.getDataValidDomain(); if (dataValidDomain != null) { return true; } Domain indicatorValidDomain = parameters.getIndicatorValidDomain(); if (indicatorValidDomain != null) { return true; } Domain bins = parameters.getBins(); if (bins != null) { return true; } return false; } @Override protected void removeItemBranch(TreeItem item) { if (item == null) { return; } TreeEditor[] editors = (TreeEditor[]) item.getData(ITEM_EDITOR_KEY); if (editors != null) { for (TreeEditor editor : editors) { editor.getEditor().dispose(); editor.dispose(); } } if (item.getItemCount() == 0) { item.dispose(); this.setDirty(true); return; } TreeItem[] items = item.getItems(); for (TreeItem item2 : items) { removeItemBranch(item2); removeTreeItem(item2); } item.dispose(); this.setDirty(true); } /** * DOC xqliu Comment method "removeTreeItem". ADD xqliu 2009-04-30 bug 6808 * * @param treeItem */ private void removeTreeItem(TreeItem treeItem) { ArrayList<Object> removeList = new ArrayList<Object>(); Iterator<Object> iterator = this.indicatorTreeItemMap.keySet().iterator(); while (iterator.hasNext()) { Object obj = iterator.next(); if (treeItem.equals(indicatorTreeItemMap.get(obj))) { removeList.add(obj); } } for (Object obj : removeList) { this.indicatorTreeItemMap.remove(obj); } } private void deleteTableItems(TableIndicator deleteTableIndiciator) { TableIndicator[] remainIndicators = new TableIndicator[tableIndicators.length - 1]; int i = 0; for (TableIndicator indicator : tableIndicators) { if (deleteTableIndiciator.equals(indicator)) { continue; } else { remainIndicators[i] = indicator; i++; } } this.tableIndicators = remainIndicators; } public TableIndicator[] getTableIndicator() { return this.tableIndicators; } /** * DOC xqliu Comment method "setInput". * * @param objs */ @Override public void setInput(Object[] objs) { List<DBTableRepNode> tableNodeList = RepositoryNodeHelper.getTableNodeList(objs); List<TableIndicator> tableIndicatorList = new ArrayList<TableIndicator>(); // MOD by zshen for 2011.06.13 add the support for the view. List<DBViewRepNode> viewNodeList = RepositoryNodeHelper.getViewNodeList(objs); if (tableNodeList.size() == 0 && viewNodeList.size() == 0) { // feature 22206 : fixed another bug, when deselect all, the view is not changed this.tableIndicators = tableIndicatorList.toArray(new TableIndicator[tableIndicatorList.size()]); this.setElements(tableIndicators); return; } List<RepositoryNode> setList = new ArrayList<RepositoryNode>(); Connection tdProvider = null; for (DBTableRepNode tableNode : tableNodeList) { if (tdProvider == null) { tdProvider = ConnectionHelper.getTdDataProvider(TableHelper.getParentCatalogOrSchema(tableNode.getTdTable())); } if (tdProvider == null) { MessageUI.openError(DefaultMessagesImpl.getString( "AnalysisTableTreeViewer.TableProviderIsNull", tableNode.getLabel())); //$NON-NLS-1$ } else if (this.getAnalysis().getContext().getConnection() != null && !tdProvider.equals(this.getAnalysis().getContext().getConnection())) { MessageUI.openError(DefaultMessagesImpl.getString( "AnalysisTableTreeViewer.TableDataProviderIsInvalid", tableNode.getLabel())); //$NON-NLS-1$ } else { setList.add(tableNode); } } for (DBViewRepNode tableNode : viewNodeList) { if (tdProvider == null) { tdProvider = ConnectionHelper.getTdDataProvider(TableHelper.getParentCatalogOrSchema(tableNode.getTdView())); } if (tdProvider == null) { MessageUI.openError(DefaultMessagesImpl.getString( "AnalysisTableTreeViewer.TableProviderIsNull", tableNode.getLabel())); //$NON-NLS-1$ } else if (this.getAnalysis().getContext().getConnection() != null && !tdProvider.equals(this.getAnalysis().getContext().getConnection())) { MessageUI.openError(DefaultMessagesImpl.getString( "AnalysisTableTreeViewer.TableDataProviderIsInvalid", tableNode.getLabel())); //$NON-NLS-1$ } else { setList.add(tableNode); } } for (TableIndicator tableIndicator : tableIndicators) { // ADDED yyin 20120606 TDQ-5343 NamedColumnSet selectedTable = tableIndicator.getColumnSet(); DQRepositoryNode tableNode = null; if (selectedTable instanceof TdTable) { tableNode = RepositoryNodeHelper.recursiveFindTdTable(((TdTable) selectedTable)); } else if (selectedTable instanceof TdView) { tableNode = RepositoryNodeHelper.recursiveFindTdView(((TdView) selectedTable)); } // ~ if (setList.contains(tableNode)) { tableIndicatorList.add(tableIndicator); setList.remove(tableNode); } } for (RepositoryNode set : setList) { TableIndicator tableIndicator = null; if (set instanceof DBViewRepNode) { tableIndicator = TableIndicator.createTableIndicatorWithRowCountIndicator(((DBViewRepNode) set).getTdView()); } else if (set instanceof DBTableRepNode) { tableIndicator = TableIndicator.createTableIndicatorWithRowCountIndicator(((DBTableRepNode) set).getTdTable()); } else { continue; } tableIndicatorList.add(tableIndicator); } this.tableIndicators = tableIndicatorList.toArray(new TableIndicator[tableIndicatorList.size()]); this.setElements(tableIndicators); } /** * DOC xqliu Comment method "getTree". * * @return */ public Tree getTree() { return this.tree; } private String isExpressionNull(TreeItem item) { String expressContent = null; TableIndicatorUnit indicatorUnit = (TableIndicatorUnit) item.getData(INDICATOR_UNIT_KEY); TableIndicator tableIndicator = (TableIndicator) item.getData(TABLE_INDICATOR_KEY); NamedColumnSet set = tableIndicator.getColumnSet(); Connection dataprovider = ConnectionHelper.getTdDataProvider(ColumnSetHelper.getParentCatalogOrSchema(set)); DbmsLanguage dbmsLang = DbmsLanguageFactory.createDbmsLanguage(dataprovider); Expression expression = dbmsLang.getInstantiatedExpression(indicatorUnit.getIndicator()); if (expression != null) { expressContent = expression.getBody(); } return expressContent; } /** * * DOC xqliu Comment method "addElements". * * @param elements */ public void addElements(final TableIndicator[] elements) { TableIndicator[] newsArray = new TableIndicator[this.tableIndicators.length + elements.length]; System.arraycopy(this.tableIndicators, 0, newsArray, 0, this.tableIndicators.length); for (int i = 0; i < elements.length; i++) { newsArray[this.tableIndicators.length + i] = elements[i]; } this.tableIndicators = newsArray; this.addItemElements(elements); // MOD mzhao 2009-05-5, bug 6587. updateBindConnection(masterPage, getTableIndicator(), tree); } /** * DOC xqliu Comment method "getAnalysis". * * @return */ public Analysis getAnalysis() { return this.masterPage.getAnalysisHandler().getAnalysis(); } @Override public void dropTables(List<NamedColumnSet> sets, int index) { int size = sets.size(); TableIndicator[] tIndicators = new TableIndicator[size]; for (int i = 0; i < size; i++) { NamedColumnSet set = sets.get(i); TableIndicator tableIndicator = TableIndicator.createTableIndicatorWithRowCountIndicator(set); tIndicators[i] = tableIndicator; } this.addElements(tIndicators); } @Override public void dropWhereRules(Object data, List<RuleRepNode> nodes, int index) { this.dropWhereRules(data, nodes, index, null); } public void dropWhereRules(Object data, List<RuleRepNode> nodes, int index, TreeItem item) { TreeItem treeItem = null; if (item == null) { if (getTree().getItemCount() > 0) { treeItem = getTree().getItem(0); } } else { treeItem = item; } if (data != null && treeItem != null && nodes.size() > 0) { Analysis analysis = getAnalysis(); for (RuleRepNode node : nodes) { TableIndicatorUnit addIndicatorUnit = DQRuleUtilities.createIndicatorUnit(node, (TableIndicator) data, analysis); if (addIndicatorUnit != null) { createOneUnit(treeItem, addIndicatorUnit); setDirty(true); } } } } @Override public boolean canDrop(NamedColumnSet set) { Connection tdProvider = ConnectionHelper.getTdDataProvider(TableHelper.getParentCatalogOrSchema(set)); if (tdProvider == null) { return false; } else if (this.getAnalysis().getContext().getConnection() != null && !tdProvider.equals(this.getAnalysis().getContext().getConnection())) { return false; } List<NamedColumnSet> existSets = new ArrayList<NamedColumnSet>(); for (TableIndicator tableIndicator : getTableIndicator()) { existSets.add(tableIndicator.getColumnSet()); } if (existSets.contains(set)) { return false; } return true; } private void deleteIndicatorItems(TableIndicator tableIndicator, TableIndicatorUnit inidicatorUnit) { tableIndicator.removeIndicatorUnit(inidicatorUnit); this.indicatorTreeItemMap.remove(inidicatorUnit); } /** * delete all TableIndicatorUnit which contain in the tableIndicator. */ private void deleteIndicatorItems(TableIndicator tableIndicator) { for (TableIndicatorUnit indiUnit : tableIndicator.getIndicatorUnits()) { tableIndicator.removeIndicatorUnit(indiUnit); this.indicatorTreeItemMap.remove(indiUnit); } } private void removeSelectedElements(Tree newTree) { TreeItem[] selection = newTree.getSelection(); if (isRowCountIndicator(selection)) { return; } boolean branchIndicatorExist = false; for (TreeItem item : selection) { TableIndicatorUnit indicatorUnit = (TableIndicatorUnit) item.getData(INDICATOR_UNIT_KEY); if (indicatorUnit != null) { deleteIndicatorItems((TableIndicator) item.getData(TABLE_INDICATOR_KEY), indicatorUnit); } else { deleteTableItems((TableIndicator) item.getData(TABLE_INDICATOR_KEY)); } if (item.getParentItem() != null && item.getParentItem().getData(INDICATOR_UNIT_KEY) != null) { branchIndicatorExist = true; continue; } else { removeItemBranch(item); removeTreeItem(item); } } if (branchIndicatorExist) { setElements(tableIndicators); } // MOD mzhao 2005-05-05 bug 6587. // MOD mzhao 2009-06-8, bug 5887. // updateBindConnection(masterPage, getTableIndicator(), tree); } /** * DOC xqliu AnalysisTableTreeViewer class global comment. Detailled comment */ class TableTreeMenuProvider { private Tree tree; public TableTreeMenuProvider(Tree tree) { this.tree = tree; } /** * DOC xqliu Comment method "createTreeMenu". */ public void createTreeMenu() { Menu oldMenu = tree.getMenu(); if (oldMenu != null && !oldMenu.isDisposed()) { oldMenu.dispose(); } Menu menu = new Menu(tree); if (isSelectedTable(tree.getSelection())) { 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 previewMenuItem = new MenuItem(menu, SWT.CASCADE); previewMenuItem.setText(DefaultMessagesImpl.getString("AnalysisTableTreeViewer.previewDQElement")); //$NON-NLS-1$ previewMenuItem.setImage(ImageLib.getImage(ImageLib.EXPLORE_IMAGE)); previewMenuItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { previewSelectedElements(tree); } }); MenuItem showLocationMenuItem = new MenuItem(menu, SWT.CASCADE); showLocationMenuItem.setText(DefaultMessagesImpl.getString("AnalysisTableTreeViewer.showDQElement")); //$NON-NLS-1$ showLocationMenuItem.setImage(ImageLib.getImage(ImageLib.EXPLORE_IMAGE)); showLocationMenuItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { showSelectedElements(tree); } }); } if (isSelectedIndicator(tree.getSelection())) { 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() { @Override public void widgetSelected(SelectionEvent e) { viewQueryForSelectedElement(tree); } }); } if (isSelectedWhereRuleIndicator(tree.getSelection())) { MenuItem editWhereRUleMenuItem = new MenuItem(menu, SWT.CASCADE); editWhereRUleMenuItem.setText(DefaultMessagesImpl.getString("AnalysisTableTreeViewer.editDQRule")); //$NON-NLS-1$ editWhereRUleMenuItem.setImage(ImageLib.getImage(ImageLib.DQ_RULE)); editWhereRUleMenuItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { editWhereRule(tree); } }); } MenuItem addTaskItem = new MenuItem(menu, SWT.CASCADE); addTaskItem.setText(DefaultMessagesImpl.getString("AnalysisTableTreeViewer.AddTask")); //$NON-NLS-1$ addTaskItem.setImage(ImageLib.getImage(ImageLib.ADD_ACTION)); addTaskItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { TreeItem[] selection = tree.getSelection(); if (selection.length > 0) { TreeItem treeItem = selection[0]; TableIndicator tableIndicator = (TableIndicator) treeItem.getData(TABLE_INDICATOR_KEY); NamedColumnSet set = tableIndicator.getColumnSet(); ModelElement me = getAnalysis(); me.setName(set.getName()); (new TdAddTaskAction(tree.getShell(), me)).run(); } } }); if (!isRowCountIndicator(tree.getSelection())) { 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() { @Override public void widgetSelected(SelectionEvent e) { removeSelectedElements(tree); } }); } tree.setMenu(menu); } private void editWhereRule(Tree tree) { TreeItem[] selection = tree.getSelection(); if (selection.length > 0) { TreeItem treeItem = selection[0]; TableIndicatorUnit indicatorUnit = (TableIndicatorUnit) treeItem.getData(INDICATOR_UNIT_KEY); WhereRuleIndicator indicator = (WhereRuleIndicator) indicatorUnit.getIndicator(); WhereRule whereRule = (WhereRule) indicator.getIndicatorDefinition(); // Property property = PropertyHelper.getProperty(whereRule); // Item item = property.getItem(); RuleRepNode node = RepositoryNodeHelper.recursiveFindRuleSql(whereRule); BusinessRuleItemEditorInput itemEditorInput = new BusinessRuleItemEditorInput(node); // ~ IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); try { activePage.openEditor(itemEditorInput, "org.talend.dataprofiler.core.ui.editor.dqrules.DQRuleEditor"); //$NON-NLS-1$ } catch (PartInitException e1) { log.error(e1, e1); } } } 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++) { TableIndicator tableIndicator = (TableIndicator) items[i].getData(TABLE_INDICATOR_KEY); paths[i] = new TreePath(new Object[] { tableIndicator.getColumnSet() }); } CreateColumnAnalysisAction analysisAction = new CreateColumnAnalysisAction(); analysisAction.setSelection(new TreeSelection(paths)); analysisAction.run(); } } private void previewSelectedElements(Tree newTree) { TreeItem[] items = newTree.getSelection(); NamedColumnSet[] sets = new NamedColumnSet[items.length]; for (int i = 0; i < items.length; i++) { TableIndicator tableIndicator = (TableIndicator) items[i].getData(TABLE_INDICATOR_KEY); sets[i] = tableIndicator.getColumnSet(); } new PreviewAction(sets[0]).run(); } private void viewQueryForSelectedElement(Tree newTree) { TreeItem[] selection = newTree.getSelection(); for (TreeItem item : selection) { TableIndicator tableIndicator = (TableIndicator) item.getData(TABLE_INDICATOR_KEY); NamedColumnSet set = tableIndicator.getColumnSet(); Connection dataprovider = ConnectionHelper.getTdDataProvider(TableHelper.getParentCatalogOrSchema(set)); Object temp = item.getData(INDICATOR_UNIT_KEY); if (temp != null) { TableIndicatorUnit indicatorUnit = (TableIndicatorUnit) item.getData(INDICATOR_UNIT_KEY); DbmsLanguage dbmsLang = DbmsLanguageFactory.createDbmsLanguage(dataprovider); Expression expression = dbmsLang.getInstantiatedExpression(indicatorUnit.getIndicator()); if (expression == null) { MessageDialogWithToggle .openWarning( null, DefaultMessagesImpl.getString("AnalysisTableTreeViewer.Warn"), DefaultMessagesImpl.getString("AnalysisTableTreeViewer.NoQueryDefined")); //$NON-NLS-1$ //$NON-NLS-2$ return; } SqlExplorerUtils.getDefault().runInDQViewer(dataprovider, expression.getBody(), set.getName()); } } } private 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)); } } private void showSelectedElements(Tree newTree) { TreeItem[] selection = newTree.getSelection(); if (selection.length > 0) { // if DqRepository view is not openning we will not do anything DQRespositoryView dqview = CorePlugin.getDefault().findAndOpenRepositoryView(); if (dqview == null) { return; } RepositoryNode node = getSelectedNode(selection); dqview.showSelectedElements(node); } } /** * DOC msjian Comment method "getSelectedNode". * * @param selection * @return */ private RepositoryNode getSelectedNode(TreeItem[] selection) { TableIndicator tableIndicator = (TableIndicator) selection[0].getData(TABLE_INDICATOR_KEY); NamedColumnSet set = tableIndicator.getColumnSet(); // ProxyRepositoryViewObject.fetchAllRepositoryViewObjects(true, true); RepositoryNode recursiveFind = RepositoryNodeHelper.recursiveFind(set); if (recursiveFind == null) { recursiveFind = RepositoryNodeHelper.createRepositoryNode(set); } return recursiveFind; } private boolean isSelectedTable(TreeItem[] items) { for (TreeItem item : items) { if (item.getData(INDICATOR_UNIT_KEY) != null) { return false; } } return true; } private boolean isSelectedIndicator(TreeItem[] items) { if (isSelectedTable(items)) { return false; } return true; } private boolean isSelectedWhereRuleIndicator(TreeItem[] items) { if (!isSelectedIndicator(items)) { return false; } for (TreeItem item : items) { TableIndicatorUnit unit = (TableIndicatorUnit) item.getData(INDICATOR_UNIT_KEY); if (unit != null) { Indicator indicator = unit.getIndicator(); if (!(indicator instanceof WhereRuleIndicator)) { return false; } } } return true; } } /** * DOC xqliu Comment method "isRowCountIndicator". * * @param selection * @return */ public boolean isRowCountIndicator(TreeItem[] selection) { if (selection != null && selection.length > 0) { for (TreeItem ti : selection) { Object obj = ti.getData(INDICATOR_UNIT_KEY); if (obj != null && obj instanceof TableIndicatorUnit) { TableIndicatorUnit tiu = (TableIndicatorUnit) ti.getData(INDICATOR_UNIT_KEY); if (tiu.getIndicator() != null && tiu.getIndicator() instanceof RowCountIndicator) { return true; } } } } return false; } @Override public void updateModelViewer() { masterPage.recomputeIndicators(); tableIndicators = masterPage.getCurrentTableIndicators(); setElements(tableIndicators); } }