// ============================================================================ // // 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.actions; import java.util.Properties; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.EList; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.intro.IIntroSite; import org.eclipse.ui.intro.config.IIntroAction; import org.eclipse.ui.part.FileEditorInput; import org.talend.commons.exception.BusinessException; import org.talend.commons.exception.ExceptionHandler; import org.talend.commons.exception.PersistenceException; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.metadata.builder.connection.MetadataColumn; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.TDQItem; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.repository.i18n.Messages; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.helper.SwitchHelpers; import org.talend.cwm.relational.TdColumn; 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.PluginConstant; import org.talend.dataprofiler.core.exception.ExceptionFactory; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.ui.editor.TDQFileEditorInput; import org.talend.dataprofiler.core.ui.editor.analysis.AnalysisEditor; import org.talend.dataprofiler.core.ui.editor.analysis.AnalysisItemEditorInput; import org.talend.dataprofiler.core.ui.editor.analysis.MatchAnalysisEditor; import org.talend.dataprofiler.core.ui.editor.connection.ConnectionEditor; import org.talend.dataprofiler.core.ui.editor.connection.ConnectionItemEditorInput; import org.talend.dataprofiler.core.ui.editor.dqrules.BusinessRuleItemEditorInput; import org.talend.dataprofiler.core.ui.editor.dqrules.DQRuleEditor; import org.talend.dataprofiler.core.ui.editor.indicator.IndicatorDefinitionItemEditorInput; import org.talend.dataprofiler.core.ui.editor.indicator.IndicatorEditor; 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.report.ReportItemEditorInput; import org.talend.dataprofiler.core.ui.utils.RepNodeUtils; import org.talend.dataprofiler.core.ui.utils.WorkbenchUtils; import org.talend.dataprofiler.core.ui.views.resources.IRepositoryObjectCRUDAction; import org.talend.dataprofiler.core.ui.views.resources.RemoteRepositoryObjectCRUD; import org.talend.dataquality.analysis.Analysis; import org.talend.dataquality.analysis.AnalysisType; import org.talend.dataquality.properties.TDQAnalysisItem; import org.talend.dataquality.properties.TDQFileItem; import org.talend.dataquality.properties.TDQIndicatorDefinitionItem; import org.talend.dataquality.properties.TDQPatternItem; import org.talend.dataquality.properties.TDQReportItem; import org.talend.dataquality.reports.AnalysisMap; import org.talend.dataquality.reports.TdReport; import org.talend.dq.helper.PropertyHelper; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.dq.helper.SqlExplorerUtils; import org.talend.dq.helper.UDIHelper; import org.talend.dq.nodes.DQRepositoryNode; import org.talend.dq.nodes.RecycleBinRepNode; import org.talend.dq.nodes.ReportFileRepNode; import org.talend.dq.writer.EMFSharedResources; import org.talend.repository.RepositoryWorkUnit; import org.talend.repository.model.IRepositoryNode; import org.talend.repository.model.RepositoryNode; import org.talend.resource.ResourceManager; import orgomg.cwm.objectmodel.core.ModelElement; import orgomg.cwm.resource.relational.Catalog; import orgomg.cwm.resource.relational.Schema; /** * DOC mzhao Open TDQ items editor action. */ public class OpenItemEditorAction extends Action implements IIntroAction { protected static Logger log = Logger.getLogger(OpenItemEditorAction.class); private IRepositoryObjectCRUDAction repositoryObjectCRUD = RepNodeUtils.getRepositoryObjectCRUD(); protected String editorID = null; private IFile file = null; private IRepositoryNode[] repNodes = null; public OpenItemEditorAction(IRepositoryNode[] selectedNodes) { super(DefaultMessagesImpl.getString("OpenIndicatorDefinitionAction.Open")); //$NON-NLS-1$ this.repNodes = selectedNodes; } @Override public void run() { // MOD qiongli 2011-7-14 bug 21707,unload all unlocked resources before opening an editor.move all code in this // method to method doRun(). if (repNodes != null) { RepositoryWorkUnit<Object> workUnit = new RepositoryWorkUnit<Object>("Open an DQ editor") {//$NON-NLS-1$ @Override protected void run() { try { for (IRepositoryNode repNode : repNodes) { setImageDescriptor(ImageLib.getImageDescriptorByRepositoryNode(repNode)); duRun(repNode); } } catch (BusinessException e) { org.talend.dataprofiler.core.exception.ExceptionHandler.process(e, Level.FATAL); } catch (Throwable e) { log.error(e, e); } } }; workUnit.setAvoidUnloadResources(true); ProxyRepositoryFactory.getInstance().executeRepositoryWorkUnit(workUnit); } } protected void duRun(IRepositoryNode repNode) throws BusinessException { // TDQ-12200: fix a NPE when the open item is unsynchronized status(for example is deleted by others). repositoryObjectCRUD.refreshDQViewForRemoteProject(); if (repNode.getObject().getProperty() == null) { repositoryObjectCRUD.showWarningDialog(); return; } // TDQ-12200~ // TDQ-12034: before open the object editor, reload it first especially for git remote project // TODO: extract the code to a IRepositoryObjectCRUDAction method, because this only need to do for git remote if (repositoryObjectCRUD instanceof RemoteRepositoryObjectCRUD) { try { ProxyRepositoryFactory.getInstance().reload(repNode.getObject().getProperty()); IFile objFile = PropertyHelper.getItemFile(repNode.getObject().getProperty()); objFile.refreshLocal(IResource.DEPTH_INFINITE, null); } catch (Exception e1) { log.error(e1, e1); } } // TDQ-12034~ IEditorInput itemEditorInput = computeEditorInput(repNode, true); if (itemEditorInput != null) { // open ItemEditorInput CorePlugin.getDefault().openEditor(itemEditorInput, editorID); } else { // not find ItemEditorInput if (repNode.getObject() == null) { // open Report's genetated doc file if (repNode != null && repNode instanceof ReportFileRepNode) { ReportFileRepNode reportFileNode = (ReportFileRepNode) repNode; IPath location = Path.fromOSString(reportFileNode.getResource().getRawLocation().toOSString()); // TDQ-5458 sizhaoliu 2012-07-17 add "." before the full name to make sure it is ignored by SVN. IFile latestRepIFile = ResourceManager.getRootProject().getFile( PluginConstant.DOT_STRING + location.lastSegment()); try { // TDQ-5458 sizhaoliu 2012-07-17 the link creation should be after report generation, but not at // the openning. // latestRepIFile.createLink(location, IResource.REPLACE, null); IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); // MOD yyin 20121224 TDQ-5329, using the default editor setted by the user. IDE.openEditor(page, latestRepIFile); } catch (PartInitException e) { MessageDialog.openError(Display.getCurrent().getActiveShell(), Messages.getString("NewFolderWizard.failureTitle"), //$NON-NLS-1$ e.getMessage()); ExceptionHandler.process(e); } } } else { // if there don't found the correct ItemEditorInput and it is not Report's genetated doc file, try to // open it as a File, this code will not be execute when method computeEditorInput() work well IPath append = WorkbenchUtils.getFilePath(repNode.getObject().getRepositoryNode()); DQRepositoryNode node = (DQRepositoryNode) repNode.getObject().getRepositoryNode(); file = ResourceManager.getRoot().getProject(node.getProject().getTechnicalLabel()).getFile(append); if (!file.exists()) { throw ExceptionFactory.getInstance().createBusinessException(repNode.getObject()); } try { IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), file, true); } catch (PartInitException e) { log.error(e, e); } } } } /** * get the ItemEditorInput according to the repNode, if there no ItemEditorInput return null. * * @param repNode * @param isOpenItemEditorAction * @return IEditorInput * @throws PersistenceException */ public IEditorInput computeEditorInput(IRepositoryNode repNode, boolean isOpenItemEditorAction) throws BusinessException { // TDQ-12499 msjian add : when click the node under recyclebin, no need to find a EditorInput if (repNode != null && !isOpenItemEditorAction) { IRepositoryNode currentNode = repNode; do { RepositoryNode parentNode = currentNode.getParent(); if (parentNode != null && parentNode instanceof RecycleBinRepNode) { return null; } currentNode = parentNode; } while (currentNode != null); } // TDQ-12499~ IEditorInput result = null; IRepositoryViewObject repViewObj = repNode.getObject(); if (repViewObj != null) { // Connection editor String key = repViewObj.getRepositoryObjectType().getKey(); Item item = repViewObj.getProperty().getItem(); if (item instanceof TDQItem && !(item instanceof TDQFileItem)) { ModelElement modelElement = PropertyHelper.getModelElement(repViewObj.getProperty()); if (modelElement.eIsProxy() && repNode != null) { modelElement = EMFSharedResources.getInstance().reloadModelElementInNode(repNode); item = repViewObj.getProperty().getItem(); } if (modelElement == null || modelElement.eResource() == null) { throw ExceptionFactory.getInstance().createBusinessException(((TDQItem) item).getFilename()); } } if (ERepositoryObjectType.METADATA_CONNECTIONS.getKey().equals(key)) { result = new ConnectionItemEditorInput(repNode); editorID = ConnectionEditor.class.getName(); } else if (ERepositoryObjectType.TDQ_ANALYSIS_ELEMENT.getKey().equals(key)) { result = new AnalysisItemEditorInput(repNode); Analysis analysis = ((TDQAnalysisItem) item).getAnalysis(); if (analysis == null || analysis.getContext() == null) { throw ExceptionFactory.getInstance().createBusinessException(repViewObj); } EList<ModelElement> analysedElements = analysis.getContext().getAnalysedElements(); RepositoryNode connectionRepositoryNode = null; if (!analysedElements.isEmpty()) { Connection connection = null; ModelElement modelElement = analysedElements.get(0); if (modelElement instanceof Connection) { connection = (Connection) modelElement; } else if (modelElement instanceof Catalog) { Catalog catalog = SwitchHelpers.CATALOG_SWITCH.caseCatalog((Catalog) modelElement); connection = ConnectionHelper.getConnection(catalog); } else if (modelElement instanceof Schema) { Schema schema = SwitchHelpers.SCHEMA_SWITCH.caseSchema((Schema) modelElement); if (schema != null) { connection = ConnectionHelper.getConnection(schema); } } else if (modelElement instanceof TdTable) { TdTable tdTable = SwitchHelpers.TABLE_SWITCH.caseTdTable((TdTable) modelElement); connection = ConnectionHelper.getConnection(tdTable); } else if (modelElement instanceof TdView) { TdView tdView = SwitchHelpers.VIEW_SWITCH.caseTdView((TdView) modelElement); connection = ConnectionHelper.getConnection(tdView); } else if (modelElement instanceof TdColumn) { TdColumn tdColumn = SwitchHelpers.COLUMN_SWITCH.caseTdColumn((TdColumn) modelElement); connection = ConnectionHelper.getConnection(tdColumn); } else if (modelElement instanceof MetadataColumn) { MetadataColumn mColumn = SwitchHelpers.METADATA_COLUMN_SWITCH.doSwitch(modelElement); connection = ConnectionHelper.getTdDataProvider(mColumn); } connectionRepositoryNode = RepositoryNodeHelper.recursiveFind(connection); } ((AnalysisItemEditorInput) result).setConnectionNode(connectionRepositoryNode); if (analysis.getParameters() != null && analysis.getParameters().getAnalysisType().equals(AnalysisType.MATCH_ANALYSIS)) { editorID = MatchAnalysisEditor.class.getName(); } else { editorID = AnalysisEditor.class.getName(); } } else if (ERepositoryObjectType.TDQ_INDICATOR_ELEMENT.getKey().equals(key)) { result = new IndicatorDefinitionItemEditorInput(repNode); TDQIndicatorDefinitionItem definitionItem = (TDQIndicatorDefinitionItem) item; if (definitionItem.getIndicatorDefinition().eResource() == null) { throw ExceptionFactory.getInstance().createBusinessException(definitionItem.getFilename()); } if (UDIHelper.getUDICategory(definitionItem.getIndicatorDefinition()) == null) { throw ExceptionFactory.getInstance().createBusinessException(definitionItem.getFilename()); } editorID = IndicatorEditor.class.getName(); } else if (ERepositoryObjectType.TDQ_RULES_SQL.getKey().equals(key) || ERepositoryObjectType.TDQ_RULES_PARSER.getKey().equals(key) || ERepositoryObjectType.TDQ_RULES_MATCHER.getKey().equals(key)) { result = new BusinessRuleItemEditorInput(repNode); editorID = DQRuleEditor.class.getName(); } else if (ERepositoryObjectType.TDQ_PATTERN_ELEMENT.getKey().equals(key)) { result = new PatternItemEditorInput(repNode); TDQPatternItem patternItem = (TDQPatternItem) item; if (patternItem.getPattern() == null || patternItem.getPattern().eResource() == null) { throw ExceptionFactory.getInstance().createBusinessException(patternItem.getFilename()); } editorID = PatternEditor.class.getName(); } else if (ERepositoryObjectType.TDQ_REPORT_ELEMENT.getKey().equals(key)) { result = new ReportItemEditorInput(repNode); TDQReportItem reportItem = (TDQReportItem) item; if (!(reportItem.getReport() instanceof TdReport)) { throw ExceptionFactory.getInstance().createBusinessException(reportItem.getFilename()); } for (AnalysisMap anaMap : ((TdReport) reportItem.getReport()).getAnalysisMap()) { Analysis analysis = anaMap.getAnalysis(); if (analysis.eResource() == null) { throw ExceptionFactory.getInstance().createBusinessException(reportItem.getFilename()); } } editorID = "org.talend.dataprofiler.core.tdq.ui.editor.report.ReportEditror"; //$NON-NLS-1$ } else if (ERepositoryObjectType.TDQ_SOURCE_FILE_ELEMENT.getKey().equals(key) || ERepositoryObjectType.TDQ_JRAXML_ELEMENT.getKey().equals(key)) { IPath append = WorkbenchUtils.getFilePath(repViewObj.getRepositoryNode()); DQRepositoryNode node = (DQRepositoryNode) repViewObj.getRepositoryNode(); file = ResourceManager.getRoot().getProject(node.getProject().getTechnicalLabel()).getFile(append); if (!file.exists()) { throw ExceptionFactory.getInstance().createBusinessException(repViewObj); } if (ERepositoryObjectType.TDQ_SOURCE_FILE_ELEMENT.getKey().equals(key)) { editorID = SqlExplorerUtils.SQLEDITOR_ID; } else { editorID = TDQFileEditorInput.DEFAULT_EDITOR_ID; } result = new TDQFileEditorInput(file); // Added TDQ-7143 yyin 20130531 ((TDQFileEditorInput) result).setFileItem(item); CorePlugin.getDefault().refreshDQView(repNode); // ~ } // ADD msjian TDQ-4209 2012-2-7 : return the editorInput of *.jrxml and *.sql files if (!isOpenItemEditorAction) { if (ERepositoryObjectType.TDQ_JRAXML_ELEMENT.getKey().equals(key) || ERepositoryObjectType.TDQ_SOURCE_FILE_ELEMENT.getKey().equals(key)) { // if there don't found the correct ItemEditorInput, try to open it as a File result = new FileEditorInput(file); editorID = FileEditorInput.class.getName(); } } // TDQ-4209~ } return result; } /* * (non-Jsdoc) * * @see org.eclipse.ui.intro.config.IIntroAction#run(org.eclipse.ui.intro.IIntroSite, java.util.Properties) */ public void run(IIntroSite site, Properties params) { this.repNodes = new IRepositoryNode[] { RepositoryNodeHelper.recursiveFind(params.getProperty("nodeId")) }; //$NON-NLS-1$ PlatformUI.getWorkbench().getIntroManager().closeIntro(PlatformUI.getWorkbench().getIntroManager().getIntro()); run(); } }