// ============================================================================ // // 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.action.provider; import org.apache.commons.lang.StringUtils; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.ui.navigator.CommonActionProvider; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.properties.ConnectionItem; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.Property; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.dataprofiler.core.service.AbstractSvnRepositoryService; import org.talend.dataprofiler.core.service.GlobalServiceRegister; import org.talend.dataprofiler.core.ui.exchange.ExchangeCategoryRepNode; import org.talend.dataprofiler.core.ui.exchange.ExchangeComponentRepNode; import org.talend.dataprofiler.core.ui.exchange.ExchangeFolderRepNode; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.dq.nodes.AnalysisSubFolderRepNode; import org.talend.dq.nodes.DBCatalogRepNode; import org.talend.dq.nodes.DBColumnFolderRepNode; import org.talend.dq.nodes.DBColumnRepNode; import org.talend.dq.nodes.DBSchemaRepNode; import org.talend.dq.nodes.DBTableFolderRepNode; import org.talend.dq.nodes.DBTableRepNode; import org.talend.dq.nodes.DBViewFolderRepNode; import org.talend.dq.nodes.DBViewRepNode; import org.talend.dq.nodes.DFColumnFolderRepNode; import org.talend.dq.nodes.DFColumnRepNode; import org.talend.dq.nodes.DFTableRepNode; import org.talend.dq.nodes.DQRepositoryNode; import org.talend.dq.nodes.ReportAnalysisRepNode; import org.talend.dq.nodes.ReportFileRepNode; import org.talend.dq.nodes.ReportSubFolderRepNode; import org.talend.dq.nodes.ReportSubFolderRepNode.ReportSubFolderType; import org.talend.dq.nodes.foldernode.IConnectionElementSubFolder; import org.talend.repository.model.IRepositoryNode; import org.talend.repository.model.IRepositoryNode.EProperties; import org.talend.repository.model.RepositoryNode; /** * * DOC mzhao Abstract common action provider. */ public class AbstractCommonActionProvider extends CommonActionProvider { protected static final String NEW_MENU_NAME = "column.analysis.menu"; //$NON-NLS-1$ public boolean isShowMenu() { Object object = getContextObject(); // TDQ-12622 msjian : when there is nothing selected, no need to check show menu if (object == null) { return false; } if (!isShowMenuWhenIsReadonlyUser()) { return false; } // hidden all the menus for all reference project node if (object instanceof DQRepositoryNode) { DQRepositoryNode node = (DQRepositoryNode) object; if (!node.getProject().isMainProject()) { return false; } } if (!isShowMenuForRefNode()) { return false; } return true; } /** * if the current select is Exchange related node. */ public boolean isExchangeNode() { IRepositoryNode firstContextNode = getFirstRepositoryNode(); return firstContextNode instanceof ExchangeComponentRepNode || firstContextNode instanceof ExchangeCategoryRepNode; } /** * DOC msjian Comment method "isShowMenuForRefNode". */ public boolean isShowMenuForRefNode() { IRepositoryNode firstContextNode = getFirstRepositoryNode(); ERepositoryObjectType contentType = firstContextNode.getContentType(); if (contentType != null) { if (contentType == ERepositoryObjectType.SVN_ROOT || contentType == ERepositoryObjectType.REFERENCED_PROJECTS) { return false; } } if (ERepositoryObjectType.REFERENCED_PROJECTS.getLabel().equals(firstContextNode.getProperties(EProperties.LABEL))) { return false; } return true; } /** * DOC msjian Comment method "isShowMenuWhenIsReadonlyUser". */ public boolean isShowMenuWhenIsReadonlyUser() { // MOD mzhao user readonly role on svn repository mode. AbstractSvnRepositoryService svnReposService = GlobalServiceRegister.getDefault().getSvnRepositoryService( AbstractSvnRepositoryService.class); if (svnReposService != null && svnReposService.isReadonly() || !isSelectionSameType()) { return false; } return true; } /** * DOC bZhou Comment method "getSubMenuManager". * * @param subMenuId * @return */ public IMenuManager getSubMenuManager(IMenuManager topMenu, String subMenuId) { if (topMenu != null) { for (IContributionItem item : topMenu.getItems()) { if (StringUtils.equals(item.getId(), subMenuId)) { return (IMenuManager) item; } } } return null; } /** * * DOC bzhou Comment method "getContextObject". * * @return */ protected Object getContextObject() { return ((TreeSelection) this.getContext().getSelection()).getFirstElement(); } /** * DOC msjian Comment method "getFirstRepositoryNode". * * @return */ protected IRepositoryNode getFirstRepositoryNode() { Object object = getContextObject(); if (object instanceof IRepositoryNode) { return (IRepositoryNode) object; } return null; } /** * * judge if all selections are the same type nodes. * * @return */ protected boolean isSelectionSameType() { TreeSelection currentSelections = ((TreeSelection) getContext().getSelection()); Object[] selectionArrays = currentSelections.toArray(); // TDQ-5186 MOD qiongli.pop the context menus just when these selections are the same type. if (selectionArrays.length > 1) { RepositoryNode firstNode = null; ERepositoryObjectType firstContentType = null; for (Object obj : selectionArrays) { if (obj instanceof RepositoryNode) { if (firstNode == null) { firstNode = (RepositoryNode) obj; firstContentType = firstNode.getContentType(); continue; } RepositoryNode node = (RepositoryNode) obj; ERepositoryObjectType contentType = node.getContentType(); // return false when the content type is different or a node is in recycle bin and another is not // in. if ((firstContentType != null && contentType != null && !contentType.getType().equals( firstContentType.getType())) || (RepositoryNodeHelper.isStateDeleted(node) != RepositoryNodeHelper.isStateDeleted(firstNode))) { return false; } } } } return true; } /** * * Get Connection which cotain by selectedNode(DBConnectionRepNode\DBCatalogRepNode\DBSchemaRepNode) If want to * support to DelimiteFileConnection node need to make DFColumnFolderRepNode implements IConnectionElementSubFolder * interface The case for MDMConnection is same to DelimiteFileConnection. * * @param selectedNode * @return */ protected Connection getConnection(Object selectedNode) { Connection conn = null; IRepositoryViewObject object = null; if (selectedNode == null) { return conn; } if (selectedNode instanceof RepositoryNode) { object = ((RepositoryNode) selectedNode).getObject(); } if (object != null) { Property property = object.getProperty(); if (property == null) { return conn; } Item item = property.getItem(); if (item != null && item instanceof ConnectionItem) { conn = ((ConnectionItem) item).getConnection(); } } else if (selectedNode instanceof IConnectionElementSubFolder) { conn = ((IConnectionElementSubFolder) selectedNode).getConnection(); } return conn; } protected boolean isVirturalNode(RepositoryNode node) { return node instanceof DBCatalogRepNode || node instanceof DBSchemaRepNode || node instanceof DBTableFolderRepNode || node instanceof DBViewFolderRepNode || node instanceof DBTableRepNode || node instanceof DBViewRepNode || node instanceof DBColumnFolderRepNode || node instanceof DBColumnRepNode || node instanceof DFTableRepNode || node instanceof DFColumnFolderRepNode || node instanceof DFColumnRepNode || node instanceof ExchangeCategoryRepNode || node instanceof ExchangeComponentRepNode || node instanceof ExchangeFolderRepNode || isReportSubFolderVirtualNode(node) || isAnalysisSubFolderVirtualNode(node) || node instanceof ReportAnalysisRepNode || node instanceof ReportFileRepNode; } protected boolean isReportSubFolderVirtualNode(RepositoryNode node) { if (node instanceof ReportSubFolderRepNode) { ReportSubFolderRepNode subFolderNode = (ReportSubFolderRepNode) node; return ReportSubFolderType.ANALYSIS.equals(subFolderNode.getReportSubFolderType()) || ReportSubFolderType.GENERATED_DOCS.equals(subFolderNode.getReportSubFolderType()); } return false; } protected boolean isAnalysisSubFolderVirtualNode(RepositoryNode node) { if (node instanceof AnalysisSubFolderRepNode) { AnalysisSubFolderRepNode subFolderNode = (AnalysisSubFolderRepNode) node; return subFolderNode.getObject() == null; } return false; } }