package org.eclipse.epf.toolbox.actions;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.epf.authoring.ui.editors.EditorChooser;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.LibraryServiceUtil;
import org.eclipse.epf.library.configuration.ConfigurationHelper;
import org.eclipse.epf.persistence.MultiFileXMIResourceImpl;
import org.eclipse.epf.persistence.refresh.RefreshJob;
import org.eclipse.epf.services.ILibraryPersister;
import org.eclipse.epf.toolbox.ToolboxPlugin;
import org.eclipse.epf.toolbox.libutil.LibUtil;
import org.eclipse.epf.toolbox.utils.DebugTest;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.epf.uma.Process;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
public class ConvertToConfigFree implements IWorkbenchWindowActionDelegate {
private static boolean debug = true; //ToolboxPlugin.getDefault().isDebugging();
private Set<Resource> resouresToSave = new HashSet<Resource>();
public void dispose() {
// TODO Auto-generated method stub
}
public void init(IWorkbenchWindow window) {
// TODO Auto-generated method stub
}
public void run(IAction action) {
if (DebugTest.debugTestMode) {
DebugTest.run(action);
return;
}
boolean oldValue = RefreshJob.getInstance().isEnabled();
RefreshJob.getInstance().setEnabled(false);
final IAction a = action;
WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
public void execute(IProgressMonitor monitor) {
monitor.beginTask("Convert processes to config-free ... ",
10);
monitor.worked(3);
monitor.setTaskName("Convert processes to config-free ...");
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);
} finally {
if (oldValue) {
RefreshJob.getInstance().setEnabled(true);
}
}
}
private void run_(IAction action) {
if (debug) {
LibUtil.trace("LD> Begin: ConvertToConfigFree.run()");
}
MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
if (lib == null) {
return;
}
EditorChooser.getInstance().closeAllMethodEditorsWithSaving();
if (debug) {
LibUtil.trace("LD> current library: " + lib);
}
Set<Process> processes = LibUtil.collectProcesses(lib);
int n = 0;
for (Process proc : processes) {
if (ConfigurationHelper.getDelegate().canBeConfigFree(proc)) {
if (proc.getDefaultContext() != null
|| !proc.getValidContext().isEmpty()) {
proc.setDefaultContext(null);
proc.getValidContext().clear();
n++;
Resource res = proc.eResource();
if (res != null) {
resouresToSave.add(res);
}
}
}
}
if (debug) {
LibUtil.trace("LD> number of processes touched: " + n);
LibUtil.trace("LD> number of processes not touched: " + (processes.size() - n));
}
if ( n > 0) {
save();
}
if (debug) {
LibUtil.trace("LD> End: ConvertToConfigFree.run()");
}
}
public void selectionChanged(IAction action, ISelection selection) {
// TODO Auto-generated method stub
}
private void save() {
ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil
.getCurrentPersister().getFailSafePersister();
try {
for (Iterator<Resource> it = resouresToSave.iterator(); it
.hasNext();) {
MultiFileXMIResourceImpl res = (MultiFileXMIResourceImpl) it
.next();
persister.save(res);
}
persister.commit();
} catch (Exception e) {
persister.rollback();
e.printStackTrace();
} finally {
}
}
}