// ============================================================================ // // Copyright (C) 2006-2012 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.designer.core.ui.views.problems; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; import java.util.regex.PatternSyntaxException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.views.markers.internal.MarkerMessages; import org.talend.commons.exception.PersistenceException; import org.talend.commons.exception.SystemException; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.commons.ui.runtime.exception.MessageBoxExceptionHandler; import org.talend.core.CorePlugin; import org.talend.core.GlobalServiceRegister; import org.talend.core.language.ECodeLanguage; import org.talend.core.language.LanguageManager; import org.talend.core.model.process.BasicJobInfo; import org.talend.core.model.process.Problem; import org.talend.core.model.process.TalendProblem; import org.talend.core.model.properties.RoutineItem; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.model.repository.IRepositoryObject; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.service.IDesignerPerlService; import org.talend.designer.codegen.ICodeGeneratorService; import org.talend.designer.codegen.ITalendSynchronizer; import org.talend.designer.core.DesignerPlugin; import org.talend.designer.core.i18n.Messages; import org.talend.designer.core.ui.AbstractMultiPageTalendEditor; import org.talend.designer.core.ui.views.problems.Problems.Group; import org.talend.repository.documentation.ERepositoryActionName; import org.talend.repository.ui.actions.routines.AbstractRoutineAction; import org.talend.repository.ui.views.IRepositoryView; /** * DOC nrousseau class global comment. Detailled comment <br/> * * $Id: ProblemsView.java 81310 2012-04-10 07:03:44Z cli $ * */ public class ProblemsView extends ViewPart implements PropertyChangeListener { public static final String PROBLEM_TYPE_SELECTION = "PROBLEM.TYPE.SELECTION";//$NON-NLS-1$ private static final String ID = "org.talend.designer.core.ui.views.ProblemsView"; //$NON-NLS-1$ private RoutineItemsCheck routineItemsCheck; private ECodeLanguage language; private String editorID; private Composite parent; public static ProblemsView show() { IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); if (activePage != null) { IViewPart part = activePage.findView(ID); try { part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(ID); } catch (Exception e) { } return (ProblemsView) part; } return null; } private TreeViewer viewer; public ProblemsView() { setPartName(Messages.getString("ProblemsView.problems.defaultTitle")); //$NON-NLS-1$ } @Override public void createPartControl(Composite parent) { this.parent = parent; CorePlugin.getDefault().getRepositoryService().getProxyRepositoryFactory().addPropertyChangeListener(this); parent.setLayout(new FillLayout()); viewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION); final Tree tree = viewer.getTree(); tree.setHeaderVisible(true); tree.setLinesVisible(true); viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) event.getSelection(); Problem problem = (Problem) selection.getFirstElement(); if (problem != null && problem.isConcrete()) { if (problem.getNodeName() != null) { selectInDesigner(problem.getJobInfo(), problem.getNodeName()); } else if (problem instanceof TalendProblem) { selectInRoutine((TalendProblem) problem); } } } }); TreeColumn column1 = new TreeColumn(tree, SWT.CENTER); column1.setText(Messages.getString("ProblemsView.description")); //$NON-NLS-1$ column1.setWidth(400); column1.setAlignment(SWT.LEFT); column1.setResizable(true); TreeColumn column2 = new TreeColumn(tree, SWT.LEFT); column2.setText(Messages.getString("ProblemsView.resource")); //$NON-NLS-1$ column2.setWidth(400); column2.setResizable(true); ProblemViewProvider provider = new ProblemViewProvider(); viewer.setLabelProvider(provider); viewer.setContentProvider(provider); resetContent(); IActionBars actionBars = getViewSite().getActionBars(); initMenu(actionBars.getMenuManager()); } public void resetContent() { routineItemsCheck = new RoutineItemsCheck(); routineItemsCheck.addAllRoutineProblem(); viewer.setInput(Problems.getRoot()); } /* * (non-Javadoc) * * @see org.eclipse.ui.part.WorkbenchPart#dispose() */ @Override public void dispose() { super.dispose(); CorePlugin.getDefault().getRepositoryService().getProxyRepositoryFactory().removePropertyChangeListener(this); Problems.setProblemView(null); } /** * initialize the Menu of problem view. * * @param menuManager */ private void initMenu(IMenuManager menu) { MenuManager groupByMenu = new MenuManager(MarkerMessages.ProblemView_GroupByMenu); groupByMenu.add(new GroupingAction(MarkerMessages.ProblemView_Type, Group.TYPE, this)); groupByMenu.add(new GroupingAction(Messages.getString("ProblemsView.severity"), Group.SEVERITY, this)); //$NON-NLS-1$ groupByMenu.add(new GroupingAction(MarkerMessages.ProblemView_None, Group.NONE, this)); menu.add(groupByMenu); } @SuppressWarnings("unchecked")//$NON-NLS-1$ private void selectInDesigner(BasicJobInfo jobInfo, String nodeName) { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IEditorReference[] editorParts = page.getEditorReferences(); for (IEditorReference reference : editorParts) { IEditorPart editor = reference.getEditor(false); if (editor instanceof AbstractMultiPageTalendEditor) { AbstractMultiPageTalendEditor mpte = (AbstractMultiPageTalendEditor) editor; if (mpte.getTalendEditor().getProcess().getId().equals(jobInfo.getJobId()) && mpte.getTalendEditor().getProcess().getVersion().equals(jobInfo.getJobVersion())) { page.bringToTop(mpte); mpte.selectNode(nodeName); } } } } private void selectInRoutine(TalendProblem problem) { OpenRoutineAction openRoutineAction = new OpenRoutineAction(problem); openRoutineAction.run(); } @Override public void setFocus() { // viewer.getTree().setFocus(); this.parent.setFocus(); } /** * DOC bqian Comment method "refresh". */ public void refresh() { viewer.refresh(); setContentDescription(Problems.getSummary()); } /* * (non-Javadoc) * * @see org.eclipse.ui.views.markers.internal.TableView#getDialogSettings() */ protected IPreferenceStore getDialogSettings() { IPreferenceStore store = DesignerPlugin.getDefault().getPreferenceStore(); return store; } /** * An internal Action that can be used to group the problems. * */ private class GroupingAction extends Action { Group groupingField; ProblemsView problemView; /** * Creates a new instance of the receiver. * * @param label * @param field * @param view */ public GroupingAction(String label, Group group, ProblemsView view) { super(label, IAction.AS_RADIO_BUTTON); groupingField = group; problemView = view; Group categoryField = Problems.getGroupField(); setChecked(categoryField.equals(groupingField)); } /* * (non-Javadoc) * * @see org.eclipse.jface.action.Action#run() */ public void run() { if (isChecked()) { Problems.setGroupField(groupingField); problemView.resetContent(); getDialogSettings().setValue(PROBLEM_TYPE_SELECTION, groupingField.toString()); } } } /** * * DOC denny ProblemsView class global comment. Detailled comment */ private class OpenRoutineAction extends AbstractRoutineAction { TalendProblem problem; /* * (non-Javadoc) * * @see org.talend.commons.ui.swt.actions.ITreeContextualAction#init(org.eclipse.jface.viewers.TreeViewer, * org.eclipse.jface.viewers.IStructuredSelection) */ public OpenRoutineAction(TalendProblem problem) { super(); this.problem = problem; } protected void doRun() { if (problem != null) { try { RoutineItem routine = getRoutineItem(); IEditorPart editor = openRoutineEditor(routine, false); focusMarkerForRoutineEditor(editor); IRepositoryView view = getViewPart(); if (view != null) { view.refresh(ERepositoryObjectType.ROUTINES); } } catch (SystemException e) { MessageBoxExceptionHandler.process(e); } catch (PartInitException e) { MessageBoxExceptionHandler.process(e); } } } /** * * ggu Comment method "focusMarkerForRoutineEditor". * * focus to the marker position. */ private void focusMarkerForRoutineEditor(IEditorPart editor) { if (editor != null) { int start = problem.getCharStart(); int length = problem.getCharEnd() - start; if (length < 0) { length = 0; } ISourceViewer sourceViewer = null; if (editor instanceof JavaEditor) { sourceViewer = ((JavaEditor) editor).getViewer(); } else { if (GlobalServiceRegister.getDefault().isServiceRegistered(IDesignerPerlService.class)) { IDesignerPerlService service = (IDesignerPerlService) GlobalServiceRegister.getDefault().getService( IDesignerPerlService.class); sourceViewer = service.getViewer(editor); } } if (sourceViewer != null) { sourceViewer.setRangeIndication(start, length, true); sourceViewer.setSelectedRange(start, length); } } } /** * bqian Comment method "getRoutineItem". * * @return */ private RoutineItem getRoutineItem() throws PersistenceException { List<IRepositoryViewObject> list = DesignerPlugin.getDefault().getRepositoryService().getProxyRepositoryFactory() .getAll(ERepositoryObjectType.ROUTINES, true); for (IRepositoryViewObject repositoryObject : list) { String name = repositoryObject.getProperty().getLabel(); String id = repositoryObject.getProperty().getId(); if (matchRoutine(id, name, problem.getMarker().getResource().getName())) { return (RoutineItem) repositoryObject.getProperty().getItem(); } } return null; } /** * Check whether the routine name is correct. <br> * For example: routineLabel AAA <br> * resourceName AAA.java| AAA.pem * * @param string * * @param name * @param string * @return */ public boolean matchRoutine(String routineID, String routineLabel, String resourceName) { if (LanguageManager.getCurrentLanguage().equals(ECodeLanguage.JAVA)) { try { Boolean foundMatch = resourceName.matches(routineLabel + ".java"); //$NON-NLS-1$ return foundMatch.booleanValue(); } catch (PatternSyntaxException ex) { // Syntax error in the regular expression } } else if (LanguageManager.getCurrentLanguage().equals(ECodeLanguage.PERL)) { try { Boolean foundMatch = resourceName.matches("tempRoutine" + routineID); //$NON-NLS-1$ return foundMatch.booleanValue(); } catch (PatternSyntaxException ex) { // Syntax error in the regular expression } } return false; } /* * (non-Javadoc) * * @see org.talend.commons.ui.swt.actions.ITreeContextualAction#init(org.eclipse.jface.viewers.TreeViewer, * org.eclipse.jface.viewers.IStructuredSelection) */ public void init(TreeViewer viewer, IStructuredSelection selection) { // setEnabled(true); } } /* * (non-Javadoc) * * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) */ public void propertyChange(PropertyChangeEvent evt) { if (!(evt.getNewValue() instanceof IRepositoryObject)) { return; } IRepositoryObject object = (IRepositoryObject) evt.getNewValue(); if (object.getRepositoryObjectType() != ERepositoryObjectType.ROUTINES) { return; } if (evt.getPropertyName().equals(ERepositoryActionName.JOB_DELETE_TO_RECYCLE_BIN.getName()) || evt.getPropertyName().equals(ERepositoryActionName.JOB_DELETE_FOREVER.getName())) { String routineLabel = object.getProperty().getLabel(); Problems.removeProblemsByRoutine(routineLabel); } if (evt.getPropertyName().equals(ERepositoryActionName.JOB_RESTORE.getName())) { RoutineItem item = (RoutineItem) object.getProperty().getItem(); restoreProblem(item); } } /** * * ggu Comment method "restoreProblem". * * when restore the item, check the problem. */ private void restoreProblem(RoutineItem item) { ICodeGeneratorService service = (ICodeGeneratorService) GlobalServiceRegister.getDefault().getService( ICodeGeneratorService.class); ITalendSynchronizer routineSynchronizer = null; switch (LanguageManager.getCurrentLanguage()) { case JAVA: routineSynchronizer = service.createJavaRoutineSynchronizer(); break; case PERL: routineSynchronizer = service.createPerlRoutineSynchronizer(); break; default: } if (routineSynchronizer != null) { try { routineSynchronizer.syncRoutine(item, true); IFile file = routineSynchronizer.getFile(item); file.refreshLocal(IResource.DEPTH_ONE, null); Problems.addRoutineFile(file, item.getProperty()); } catch (SystemException e) { ExceptionHandler.process(e); } catch (CoreException e) { ExceptionHandler.process(e); } Display.getDefault().asyncExec(new Runnable() { public void run() { Problems.refreshProblemTreeView(); } }); } } }