| package org.eclipse.epf.toolbox.actions; |
| |
| import java.util.List; |
| import java.util.Set; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.epf.authoring.ui.editors.EditorChooser; |
| import org.eclipse.epf.common.CommonPlugin; |
| import org.eclipse.epf.diagram.core.DiagramCorePlugin; |
| import org.eclipse.epf.diagram.core.services.DiagramHelper; |
| import org.eclipse.epf.diagram.core.services.DiagramManager; |
| import org.eclipse.epf.library.LibraryService; |
| import org.eclipse.epf.library.edit.util.IDiagramManager; |
| import org.eclipse.epf.services.Services; |
| import org.eclipse.epf.services.ILibraryPersister.FailSafeMethodLibraryPersister; |
| import org.eclipse.epf.toolbox.ToolboxPlugin; |
| import org.eclipse.epf.toolbox.libutil.LibUtil; |
| import org.eclipse.epf.uma.Activity; |
| import org.eclipse.epf.uma.MethodLibrary; |
| import org.eclipse.epf.uma.Process; |
| import org.eclipse.gmf.runtime.notation.Diagram; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.dialogs.ProgressMonitorDialog; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.IWorkbenchWindowActionDelegate; |
| import org.eclipse.ui.actions.WorkspaceModifyOperation; |
| |
| public class DiagramDoctor implements IWorkbenchWindowActionDelegate { |
| |
| private static boolean debug = true;//ToolboxPlugin.getDefault().isDebugging(); |
| |
| public void dispose() { |
| // TODO Auto-generated method stub |
| |
| } |
| |
| public void init(IWorkbenchWindow window) { |
| // TODO Auto-generated method stub |
| |
| } |
| |
| private void log(String line) { |
| ToolboxPlugin.getDefault().getLogger().logInfo(line); |
| } |
| |
| public void run(IAction action) { |
| final IAction a = action; |
| WorkspaceModifyOperation operation = new WorkspaceModifyOperation() { |
| public void execute(IProgressMonitor monitor) { |
| monitor.beginTask("Clean up process diagram duplicate data ... ", |
| 10); |
| monitor.worked(3); |
| monitor.setTaskName("Clean up process diagram duplicate data ..."); |
| try { |
| run_(a); |
| } finally { |
| monitor.done(); |
| } |
| } |
| }; |
| |
| try { |
| // Run the operation and display the progress. |
| ProgressMonitorDialog pmDialog = new ProgressMonitorDialog(Display |
| .getCurrent().getActiveShell()); |
| pmDialog.run(true, false, operation); |
| } catch (Exception e) { |
| ToolboxPlugin.getDefault().getLogger().logError(e); |
| } |
| |
| } |
| |
| private void run_(IAction action) { |
| long t0 = System.currentTimeMillis(); |
| if (debug) { |
| System.out.println(""); |
| System.out.println("LD> Begin: DiagramDoctor.run()"); |
| } |
| log("LD> Begin: DiagramDoctor.run()"); |
| MethodLibrary lib = LibraryService.getInstance() |
| .getCurrentMethodLibrary(); |
| if (lib == null) { |
| return; |
| } |
| |
| EditorChooser.getInstance().closeAllMethodEditorsWithSaving(); |
| Set<Process> processes = LibUtil.collectProcesses(lib); |
| for (Process proc : processes) { |
| DiagramManager mgr = null; |
| try { |
| System.out.println("LD> proc: " + proc); |
| mgr = DiagramManager.getInstance(proc, this); |
| |
| for (Activity act : LibUtil.collectActivities(proc)) { |
| cleanupDiagrams(mgr, act); |
| } |
| |
| System.out.println(""); |
| } finally { |
| if (mgr != null) { |
| mgr.removeConsumer(this); |
| } |
| } |
| } |
| |
| if (debug) { |
| long t1 = System.currentTimeMillis(); |
| double d = (t1 - t0) / 1000.0; |
| int t = (int) d; |
| |
| System.out |
| .println("LD> End: DiagramDoctor.run(), time (sec): " + t); |
| } |
| log("LD> End: DiagramDoctor.run()"); |
| } |
| |
| private void cleanupDiagrams(DiagramManager mgr, Activity act) { |
| try { |
| List<Diagram> diagrams = mgr.getDiagrams(act, |
| IDiagramManager.ACTIVITY_DIAGRAM); |
| Resource resource = null; |
| Diagram diagram0 = null; |
| boolean toDelete = false; |
| int count = 0; |
| for (Diagram diagram : diagrams) { |
| if (toDelete) { |
| if (diagram != diagram0) { |
| DiagramHelper.deleteDiagram(diagram, false); |
| count++; |
| } |
| } else { |
| diagram0 = diagram; |
| resource = diagram.eResource(); |
| toDelete = true; |
| } |
| } |
| |
| FailSafeMethodLibraryPersister persister = Services |
| .getLibraryPersister(Services.XMI_PERSISTENCE_TYPE) |
| .getFailSafePersister(); |
| try { |
| persister.save(resource); |
| persister.commit(); |
| } catch (Exception e) { |
| CommonPlugin.getDefault().getLogger().logError(e); |
| persister.rollback(); |
| throw new CoreException(new Status(IStatus.ERROR, |
| DiagramCorePlugin.PLUGIN_ID, 1, e |
| .getLocalizedMessage(), null)); |
| } |
| if (count > 0) { |
| if (debug) { |
| System.out.println("LD> activity: " + act); |
| System.out.println("LD> Removed data count: " + count); |
| } |
| log("LD> activity: " + act); |
| log("LD> Removed data count: " + count); |
| } |
| } catch (Exception e) { |
| e.printStackTrace(); |
| log(e.getMessage()); |
| } |
| } |
| |
| public void selectionChanged(IAction action, ISelection selection) { |
| // TODO Auto-generated method stub |
| |
| } |
| |
| } |