blob: 1bd7829de877cf037d4bc3c01d00674be7adb302 [file] [log] [blame]
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.edit.util.DescriptorPropUtil;
import org.eclipse.epf.library.edit.util.LibraryEditUtil;
import org.eclipse.epf.library.edit.util.ProcessScopeUtil;
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.uma.Descriptor;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.epf.uma.Process;
import org.eclipse.epf.uma.TaskDescriptor;
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 RemoveLocalDescriptors 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) {
boolean oldValue = RefreshJob.getInstance().isEnabled();
RefreshJob.getInstance().setEnabled(false);
final IAction a = action;
WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
public void execute(IProgressMonitor monitor) {
if (debug) {
LibUtil.trace("LD> Begin: RemoveLocalDescriptors.run()");
}
MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
if (lib == null) {
return;
}
if (debug) {
LibUtil.trace("LD> current library: " + lib);
}
EditorChooser.getInstance().closeAllMethodEditorsWithSaving();
Set<Process> processes = LibUtil.collectProcesses(lib);
int sz = processes.size();
if (sz == 0) {
return;
}
monitor.beginTask("Remove local role/workproduct descriptors ... ",
sz);
monitor.setTaskName("Remove local role/workproduct descriptors ... ");
try {
run_(a, processes, monitor);
} finally {
monitor.done();
}
if (debug) {
LibUtil.trace("LD> End: RemoveLocalDescriptors.run()");
}
}
};
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, Set<Process> processes,
IProgressMonitor monitor) {
int i = 0;
DescriptorPropUtil propUtil = DescriptorPropUtil.getDesciptorPropUtil();
Set<Process> processToSave = new HashSet<Process>();
for (Process proc : processes) {
i++;
monitor.worked(i);
if (ProcessScopeUtil.getInstance().isConfigFree(proc)) {
Set<Descriptor> descriptors = LibraryEditUtil.getInstance().collectDescriptors(proc);
for (Descriptor des : descriptors) {
if (des instanceof TaskDescriptor) {
String value = propUtil.getStringValue(des, DescriptorPropUtil.DESCRIPTOR_LocalUsingInfo);
if (value != null && value.trim().length() > 0) {
propUtil.setStringValue(des, DescriptorPropUtil.DESCRIPTOR_LocalUsingInfo, "");
processToSave.add(proc);
}
}
}
}
}
for (Process proc : processToSave) {
Resource res = proc.eResource();
if (res != null) {
resouresToSave.add(res);
}
}
if (debug) {
LibUtil.trace("LD> number of processes touched: " + processToSave.size());
LibUtil.trace("LD> number of processes not touched: "
+ (processes.size() - processToSave.size()));
}
if (processToSave.size() > 0) {
save();
}
}
public void selectionChanged(IAction action, ISelection selection) {
}
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 {
}
}
}