// ============================================================================ // // 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.views.provider; import java.sql.Driver; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.IFontProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.talend.commons.runtime.model.repository.ERepositoryStatus; import org.talend.core.GlobalServiceRegister; import org.talend.core.context.Context; import org.talend.core.context.RepositoryContext; import org.talend.core.database.EDatabaseTypeName; import org.talend.core.model.metadata.builder.connection.DatabaseConnection; import org.talend.core.model.metadata.builder.connection.MDMConnection; import org.talend.core.model.metadata.builder.database.JavaSqlFactory; import org.talend.core.model.metadata.builder.database.dburl.SupportDBUrlType; import org.talend.core.model.properties.ConnectionItem; import org.talend.core.model.properties.DatabaseConnectionItem; import org.talend.core.model.properties.Property; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.core.runtime.CoreRuntimePlugin; import org.talend.core.ui.IReferencedProjectService; import org.talend.cwm.helper.ConnectionHelper; import org.talend.dataprofiler.core.ImageLib; import org.talend.dataprofiler.core.PluginConstant; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.ui.exchange.ExchangeCategoryRepNode; import org.talend.dataprofiler.core.ui.exchange.ExchangeComponentRepNode; import org.talend.dataprofiler.core.ui.utils.HadoopClusterUtils; import org.talend.dataquality.analysis.Analysis; import org.talend.dataquality.analysis.AnalysisContext; import org.talend.dataquality.reports.AnalysisMap; import org.talend.dataquality.reports.TdReport; import org.talend.dataquality.rules.MatchRuleDefinition; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.dq.helper.SqlExplorerUtils; import org.talend.dq.nodes.AnalysisRepNode; import org.talend.dq.nodes.DBCatalogRepNode; import org.talend.dq.nodes.DBColumnFolderRepNode; import org.talend.dq.nodes.DBColumnRepNode; import org.talend.dq.nodes.DBConnectionFolderRepNode; import org.talend.dq.nodes.DBConnectionRepNode; 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.DFConnectionRepNode; import org.talend.dq.nodes.DFTableRepNode; import org.talend.dq.nodes.JrxmlTempleteRepNode; import org.talend.dq.nodes.PatternRepNode; import org.talend.dq.nodes.RecycleBinRepNode; import org.talend.dq.nodes.ReportAnalysisRepNode; import org.talend.dq.nodes.ReportRepNode; import org.talend.dq.nodes.RuleRepNode; import org.talend.dq.nodes.SourceFileRepNode; import org.talend.dq.nodes.SysIndicatorDefinitionRepNode; import org.talend.dq.nodes.hadoopcluster.HDFSOfHCConnectionNode; import org.talend.dq.nodes.hadoopcluster.HadoopClusterConnectionRepNode; import org.talend.dq.nodes.hadoopcluster.HiveOfHCConnectionNode; import org.talend.metadata.managment.utils.MetadataConnectionUtils; import org.talend.repository.ProjectManager; import org.talend.repository.model.IRepositoryNode; import org.talend.repository.model.IRepositoryNode.ENodeType; import org.talend.repository.model.IRepositoryNode.EProperties; import org.talend.repository.model.RepositoryNode; import org.talend.resource.EResourceConstant; import orgomg.cwm.foundation.softwaredeployment.DataManager; import orgomg.cwm.objectmodel.core.ModelElement; /** * @author rli */ public class DQRepositoryViewLabelProvider extends AdapterFactoryLabelProvider implements IFontProvider, IColorProvider { private static final Color STABLE_SECONDARY_ENTRY_COLOR = new Color(null, 100, 100, 100); private static final Color STABLE_PRIMARY_ENTRY_COLOR = new Color(null, 0, 0, 0); protected static final Color INACTIVE_ENTRY_COLOR = new Color(null, 200, 200, 200); private static final Color LOCKED_ENTRY = new Color(null, 200, 0, 0); private static final Color MERGED_REFERENCED_ITEMS_COLOR = new Color(null, 120, 120, 120); private Logger log = Logger.getLogger(DQRepositoryViewLabelProvider.class); public DQRepositoryViewLabelProvider() { super(MNComposedAdapterFactory.getAdapterFactory()); } @Override public Image getImage(Object element) { Image image = super.getImage(element); if (element instanceof IRepositoryNode) { IRepositoryNode node = (IRepositoryNode) element; if (node instanceof ReportAnalysisRepNode) { image = ImageLib.getImage(ImageLib.ANALYSIS_OBJECT); } else if (node instanceof ExchangeCategoryRepNode || node instanceof ExchangeComponentRepNode) { image = ImageLib.getImage(ImageLib.EXCHANGE); } else if (node instanceof RecycleBinRepNode) { image = ImageLib.getImage(ImageLib.RECYCLEBIN_EMPTY); } else { IRepositoryViewObject viewObject = node.getObject(); ENodeType type = node.getType(); if (type.equals(ENodeType.SYSTEM_FOLDER)) { if (EResourceConstant.REFERENCED_PROJECT.getName().equals(node.getProperties(EProperties.LABEL))) { image = ImageLib.getImage(ImageLib.REFERENCED_PROJECT); } else { String label = viewObject.getLabel(); if (label.equals(EResourceConstant.DATA_PROFILING.getName())) { image = ImageLib.getImage(ImageLib.DATA_PROFILING); } else if (label.equals(EResourceConstant.METADATA.getName())) { image = ImageLib.getImage(ImageLib.METADATA); } else if (node instanceof DBConnectionFolderRepNode) { image = ImageLib.getImage(ImageLib.CONNECTION); } else if (label.equals(EResourceConstant.FILEDELIMITED.getName())) { image = ImageLib.getImage(ImageLib.FILE_DELIMITED); } else if (label.equals(EResourceConstant.LIBRARIES.getName())) { image = ImageLib.getImage(ImageLib.LIBRARIES); } else if (label.equals(EResourceConstant.EXCHANGE.getName())) { image = ImageLib.getImage(ImageLib.EXCHANGE); } else if (label.equals(EResourceConstant.HADOOP_CLUSTER.getName())) { image = ImageLib.getImage(ImageLib.HADOOP_CLUSTER); } else { image = ImageLib.getImage(ImageLib.FOLDERNODE_IMAGE); } } } else if (type.equals(ENodeType.SIMPLE_FOLDER)) { image = ImageLib.getImage(ImageLib.FOLDERNODE_IMAGE); } else if (type.equals(ENodeType.REFERENCED_PROJECT)) { image = ImageLib.getImage(ImageLib.REFERENCED_PROJECT); } else if (type.equals(ENodeType.REPOSITORY_ELEMENT)) { // TDQ-7560 when the image is a overlay image,use originalImageName to get the corresponding one. String originalImageName = null; if (node instanceof DBConnectionRepNode) { originalImageName = ImageLib.TD_DATAPROVIDER; if (!RepositoryNodeHelper.isSupportedConnection(node) || isNeedAddDriverConnection(node)) { image = ImageLib.createErrorIcon(originalImageName); } else if (isInvalidJDBCConnection(node)) { image = ImageLib.createInvalidIcon(originalImageName); } else { image = ImageLib.getImage(originalImageName); } } else if (node instanceof DFConnectionRepNode) { originalImageName = ImageLib.FILE_DELIMITED; } else if (node instanceof AnalysisRepNode) { originalImageName = ImageLib.ANALYSIS_OBJECT; image = addWarnIconIfNeeded(node, originalImageName); } else if (node instanceof ReportRepNode) { originalImageName = ImageLib.REPORT_OBJECT; image = addWarnIconIfNeeded(node, originalImageName); } else if (node instanceof SysIndicatorDefinitionRepNode) { originalImageName = ImageLib.IND_DEFINITION; } else if (node instanceof PatternRepNode) { originalImageName = ImageLib.PATTERN_REG; } else if (node instanceof RuleRepNode) { if (((RuleRepNode) node).getRule() instanceof MatchRuleDefinition) { originalImageName = ImageLib.MATCH_RULE_ICON; } else { originalImageName = ImageLib.DQ_RULE; } } else if (node instanceof SourceFileRepNode) { originalImageName = ImageLib.SOURCE_FILE; } else if (node instanceof HadoopClusterConnectionRepNode) { originalImageName = ImageLib.HADOOP_CLUSTER; } else if (node instanceof HDFSOfHCConnectionNode) { originalImageName = ImageLib.HDFS; } else if (node instanceof HiveOfHCConnectionNode) { originalImageName = ImageLib.HIVE_LINK; } else if (node instanceof ExchangeCategoryRepNode || node instanceof ExchangeComponentRepNode) { originalImageName = ImageLib.EXCHANGE; } else if (node instanceof RepositoryNode) { // MOD qiongli 2011-1-18 get image for nodes in recycle bin Image imageNode = getImageByContentType((RepositoryNode) node); if (image != null) { image = imageNode; } } if (originalImageName != null && !(node instanceof DBConnectionRepNode || node instanceof AnalysisRepNode || node instanceof ReportRepNode)) { image = ImageLib.getImage(originalImageName); } // MOD klliu 2010-04-11 20468: Unfolder "exchange",get many NPE // exchange folder did not contain viewObject. if (viewObject != null) { // MOD yyi 2011-04-07 19696: "Lock element" ERepositoryStatus status = ProxyRepositoryFactory.getInstance().getStatus(viewObject); Context ctx = CoreRuntimePlugin.getInstance().getContext(); RepositoryContext rc = (RepositoryContext) ctx.getProperty(Context.REPOSITORY_CONTEXT_KEY); // TUP-1918:for offline mode,its item is locked by default but need show the default image. This // will be enhanced later by TDI-29265. if (rc.isEditableAsReadOnly()) { if (status == ERepositoryStatus.LOCK_BY_USER) { status = ERepositoryStatus.DEFAULT; } } if (ERepositoryStatus.DEFAULT != status && originalImageName != null) { if (ERepositoryStatus.LOCK_BY_USER == status) { image = ImageLib.createLockedByOwnIcon(originalImageName); } else if (ERepositoryStatus.LOCK_BY_OTHER == status) { image = ImageLib.createLockedByOtherIcon(originalImageName); } } } } else if (type.equals(ENodeType.TDQ_REPOSITORY_ELEMENT)) { if (node instanceof DBCatalogRepNode) { image = ImageLib.getImage(ImageLib.CATALOG); } else if (node instanceof DBSchemaRepNode) { image = ImageLib.getImage(ImageLib.SCHEMA); } else if (node instanceof DBTableFolderRepNode) { image = ImageLib.getImage(ImageLib.FOLDERNODE_IMAGE); } else if (node instanceof DBViewFolderRepNode) { image = ImageLib.getImage(ImageLib.FOLDERNODE_IMAGE); } else if (node instanceof DBTableRepNode || node instanceof DFTableRepNode) { image = ImageLib.getImage(ImageLib.TABLE); } else if (node instanceof DBViewRepNode) { image = ImageLib.getImage(ImageLib.VIEW); } else if (node instanceof DBColumnRepNode) { if (((DBColumnRepNode) node).isKey()) { image = ImageLib.getImage(ImageLib.PK_COLUMN); } else { image = ImageLib.getImage(ImageLib.TD_COLUMN); } } else if (node instanceof DFColumnRepNode) { image = ImageLib.getImage(ImageLib.TD_COLUMN); } else if (node instanceof DBColumnFolderRepNode || node instanceof DFColumnFolderRepNode) { image = ImageLib.getImage(ImageLib.FOLDERNODE_IMAGE); } else if (node instanceof JrxmlTempleteRepNode) { image = ImageLib.getImage(ImageLib.JRXML_ICON); } } } } return image; } /** * if it is needed,add a over warning icon..eg., it is empty analysis or report; imported a MDM analysis or report. * * @param image * @param node * @param originalImageName * @return */ private Image addWarnIconIfNeeded(IRepositoryNode node, String originalImageName) { ModelElement modEle = RepositoryNodeHelper.getResourceModelElement(node); ERepositoryObjectType objectType = node.getObjectType(); if (modEle != null) { if (ERepositoryObjectType.TDQ_ANALYSIS_ELEMENT == objectType) { Analysis analysis = (Analysis) modEle; AnalysisContext context = analysis.getContext(); if (context == null) { return ImageLib.createInvalidIcon(originalImageName); } EList<ModelElement> analysedElements = context.getAnalysedElements(); DataManager connection = context.getConnection(); if (analysedElements.isEmpty() || connection instanceof MDMConnection) { return ImageLib.createInvalidIcon(originalImageName); } } else if (ERepositoryObjectType.TDQ_REPORT_ELEMENT == objectType) { TdReport report = (TdReport) modEle; EList<AnalysisMap> analysisMap = report.getAnalysisMap(); if (analysisMap.isEmpty()) { return ImageLib.createInvalidIcon(originalImageName); } for (AnalysisMap anaMap : report.getAnalysisMap()) { Analysis analysis = anaMap.getAnalysis(); if (analysis == null || analysis.getContext() == null) { continue; } DataManager connection = analysis.getContext().getConnection(); if (connection instanceof MDMConnection) { return ImageLib.createInvalidIcon(originalImageName); } } } } return ImageLib.getImage(originalImageName); } @Override public String getText(Object element) { if (element != null && element instanceof IRepositoryNode) { IRepositoryNode node = (IRepositoryNode) element; return RepositoryNodeHelper.getDisplayLabel(node); } String text = super.getText(element); return PluginConstant.EMPTY_STRING.equals(text) ? DefaultMessagesImpl.getString("DQRepositoryViewLabelProvider.noName") : text; //$NON-NLS-1$ } /** * * DOC qiongli Comment method "getImageByContentType". * * @param repositoryNode * @return */ private Image getImageByContentType(RepositoryNode repositoryNode) { ERepositoryObjectType type = (ERepositoryObjectType) repositoryNode.getProperties(EProperties.CONTENT_TYPE); if (type == null) { return null; } if (type == ERepositoryObjectType.TDQ_ANALYSIS_ELEMENT) { return ImageLib.getImage(ImageLib.ANALYSIS_OBJECT); } else if (type == ERepositoryObjectType.METADATA_CONNECTIONS) { return ImageLib.getImage(ImageLib.TD_DATAPROVIDER); } else if (type == ERepositoryObjectType.METADATA_FILE_DELIMITED) { return ImageLib.getImage(ImageLib.FILE_DELIMITED); } else if (type == ERepositoryObjectType.TDQ_REPORT_ELEMENT) { return ImageLib.getImage(ImageLib.REPORT_OBJECT); } else if (type == ERepositoryObjectType.TDQ_INDICATOR_ELEMENT) { return ImageLib.getImage(ImageLib.IND_DEFINITION); } else if (type == ERepositoryObjectType.TDQ_PATTERN_ELEMENT) { return ImageLib.getImage(ImageLib.PATTERN_REG); } else if (type == ERepositoryObjectType.TDQ_RULES) { return ImageLib.getImage(ImageLib.DQ_RULE); } else if (type == ERepositoryObjectType.TDQ_RULES_PARSER) { return ImageLib.getImage(ImageLib.DQ_RULE); } else if (type == ERepositoryObjectType.TDQ_RULES_SQL) { return ImageLib.getImage(ImageLib.DQ_RULE); } else if (type == ERepositoryObjectType.TDQ_RULES_MATCHER) { return ImageLib.getImage(ImageLib.MATCH_RULE_ICON); } else if (type == ERepositoryObjectType.TDQ_SOURCE_FILE_ELEMENT) { return ImageLib.getImage(ImageLib.SOURCE_FILE); } else if (type == ERepositoryObjectType.TDQ_EXCHANGE) { return ImageLib.getImage(ImageLib.EXCHANGE); } else if (type == ERepositoryObjectType.FOLDER) { return ImageLib.getImage(ImageLib.FOLDERNODE_IMAGE); } else if (type == ERepositoryObjectType.TDQ_JRAXML_ELEMENT) { return ImageLib.getImage(ImageLib.JRXML_ICON); } else if (type == HadoopClusterUtils.getDefault().getHadoopClusterType()) { return ImageLib.getImage(ImageLib.HADOOP_CLUSTER); } else if (type == HadoopClusterUtils.getDefault().getHDFSType()) { return ImageLib.getImage(ImageLib.HDFS); } return null; } private boolean isNeedAddDriverConnection(IRepositoryNode repNode) { if (repNode.getObjectType() == ERepositoryObjectType.METADATA_CONNECTIONS) { ConnectionItem connectionItem = (ConnectionItem) repNode.getObject().getProperty().getItem(); if (connectionItem.getConnection() instanceof DatabaseConnection) { DatabaseConnection dbConn = (DatabaseConnection) (connectionItem.getConnection()); String dbType = dbConn.getDatabaseType(); String driverClassName = JavaSqlFactory.getDriverClass(dbConn); if (dbType == null || driverClassName == null || PluginConstant.EMPTY_STRING.equals(driverClassName)) { return true; } // firstly,find driver from cache.if not find,load jar by lib folder then find driver from // SQLExplorer driver. if (!(StringUtils.equalsIgnoreCase(EDatabaseTypeName.IMPALA.getXmlName(), dbType) || StringUtils .equalsIgnoreCase(EDatabaseTypeName.HIVE.getXmlName(), dbType))) { Driver driver = MetadataConnectionUtils.getDriverCache().get(driverClassName); if (driver != null) { return false; } // TDQ-11449 "SqlExplorerUtils.getDefault().getSqlexplorerService()" in a Thread will pop download // "sqlExplorer" many times.no need call it at here, if don't have "sqlExplorer", return false. return SqlExplorerUtils.getDefault().needAddDriverConnection(dbConn); } } } return false; } /** * ADD qiongli TDQ-5801 if it is a invalid jdbc connection. * * @param repNode * @return */ private boolean isInvalidJDBCConnection(IRepositoryNode repNode) { Property property = repNode.getObject().getProperty(); if (property != null && property.getItem() != null) { DatabaseConnectionItem connectionItem = (DatabaseConnectionItem) property.getItem(); if (connectionItem != null) { DatabaseConnection connection = (DatabaseConnection) connectionItem.getConnection(); String databaseType = connection.getDatabaseType(); if (databaseType.equalsIgnoreCase(SupportDBUrlType.GENERICJDBCDEFAULTURL.getDBKey()) && ((connection.getDriverJarPath() == null) || (connection.getDriverJarPath()).trim().equals( PluginConstant.EMPTY_STRING))) { return true; } } } return false; } /* * yyi 2011-04-14 20362:connection modified * * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getFont(java.lang.Object) */ @Override public Font getFont(Object element) { boolean changeURL = false; if (element instanceof IRepositoryNode) { IRepositoryNode node = (IRepositoryNode) element; if (node instanceof RecycleBinRepNode) { return super.getFont(element); } if (node.getObject() != null) { switch (node.getType()) { case STABLE_SYSTEM_FOLDER: case SYSTEM_FOLDER: return JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT); case REPOSITORY_ELEMENT: if (node instanceof DBConnectionRepNode) { ConnectionItem connectionItem = (ConnectionItem) node.getObject().getProperty().getItem(); if (connectionItem.getConnection() instanceof DatabaseConnection) { changeURL = ConnectionHelper.isUrlChanged(connectionItem.getConnection()); if (changeURL) { return getItalicFont(); } } } default: return JFaceResources.getFontRegistry().defaultFont(); } } } return super.getFont(element); } private Font getItalicFont() { Font italicFont = Display.getDefault().getSystemFont(); FontData[] exfds = italicFont.getFontData(); if (exfds.length > 0) { FontData fd = exfds[0]; fd.setStyle(SWT.ITALIC); italicFont = new Font(italicFont.getDevice(), fd); } return italicFont; } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getForeground(java.lang.Object) */ @Override public Color getForeground(Object element) { RepositoryNode node = (RepositoryNode) element; if (node instanceof RecycleBinRepNode) { return super.getForeground(element); } if (node.getObject() != null) { switch (node.getType()) { case REFERENCED_PROJECT: return STABLE_PRIMARY_ENTRY_COLOR; case STABLE_SYSTEM_FOLDER: case SYSTEM_FOLDER: if (node.getContentType() == ERepositoryObjectType.TDQ_DATA_PROFILING || node.getContentType() == ERepositoryObjectType.METADATA || node.getContentType() == ERepositoryObjectType.TDQ_SYSTEM_INDICATORS || node.getContentType() == ERepositoryObjectType.TDQ_PATTERN_REGEX) { return STABLE_PRIMARY_ENTRY_COLOR; } return STABLE_SECONDARY_ENTRY_COLOR; default: ERepositoryStatus repositoryStatus = node.getObject().getRepositoryStatus(); if (repositoryStatus == ERepositoryStatus.LOCK_BY_OTHER) { return LOCKED_ENTRY; } if (org.talend.core.PluginChecker.isRefProjectLoaded()) { IReferencedProjectService service = (IReferencedProjectService) GlobalServiceRegister.getDefault() .getService(IReferencedProjectService.class); if (service != null && service.isMergeRefProject()) { IRepositoryViewObject object = node.getObject(); if (object != null) { org.talend.core.model.properties.Project mainProject = ProjectManager.getInstance() .getCurrentProject().getEmfProject(); String projectLabel = object.getProjectLabel(); if (!mainProject.getLabel().equals(projectLabel)) { return MERGED_REFERENCED_ITEMS_COLOR; } } } } } } return super.getForeground(element); } }