package org.argeo.slc.client.ui.commands;\r
\r
+import java.util.HashMap;\r
import java.util.Iterator;\r
+import java.util.Map;\r
\r
import javax.jcr.Node;\r
\r
import org.eclipse.core.commands.AbstractHandler;\r
import org.eclipse.core.commands.ExecutionEvent;\r
import org.eclipse.core.commands.ExecutionException;\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.IStatus;\r
+import org.eclipse.core.runtime.Status;\r
+import org.eclipse.core.runtime.jobs.Job;\r
import org.eclipse.jface.viewers.ISelection;\r
import org.eclipse.jface.viewers.IStructuredSelection;\r
import org.eclipse.ui.handlers.HandlerUtil;\r
private ModulesManager modulesManager;\r
\r
public Object execute(ExecutionEvent event) throws ExecutionException {\r
- ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event)\r
- .getActivePage().getSelection();\r
+ final ISelection selection = HandlerUtil\r
+ .getActiveWorkbenchWindow(event).getActivePage().getSelection();\r
if (selection != null && selection instanceof IStructuredSelection) {\r
- Iterator<?> it = ((IStructuredSelection) selection).iterator();\r
- Object obj = null;\r
- try {\r
- while (it.hasNext()) {\r
- obj = it.next();\r
- if (obj instanceof Node) {\r
- Node node = (Node) obj;\r
- if (node.isNodeType(SlcTypes.SLC_EXECUTION_MODULE)) {\r
+\r
+ Job job = new Job("Update modules") {\r
+\r
+ @Override\r
+ protected IStatus run(IProgressMonitor monitor) {\r
+ Iterator<?> it = ((IStructuredSelection) selection)\r
+ .iterator();\r
+ Object obj = null;\r
+ try {\r
+ Map<String, Node> nodes = new HashMap<String, Node>();\r
+ nodes: while (it.hasNext()) {\r
+ obj = it.next();\r
+ if (obj instanceof Node) {\r
+ Node node = (Node) obj;\r
+ Node executionModuleNode = null;\r
+ while (executionModuleNode == null) {\r
+ if (node.isNodeType(SlcTypes.SLC_EXECUTION_MODULE)) {\r
+ executionModuleNode = node;\r
+ }\r
+ node = node.getParent();\r
+ if (node.getPath().equals("/"))// root\r
+ continue nodes;\r
+ }\r
+\r
+ if (!nodes.containsKey(executionModuleNode\r
+ .getPath()))\r
+ nodes.put(executionModuleNode.getPath(),\r
+ executionModuleNode);\r
+ }\r
+ }\r
+\r
+ monitor.beginTask("Update modules", nodes.size());\r
+ for (Node executionModuleNode : nodes.values()) {\r
+ monitor.subTask("Update "\r
+ + executionModuleNode.getName());\r
NameVersion nameVersion = new BasicNameVersion(\r
- node.getProperty(SlcNames.SLC_NAME)\r
- .getString(), node.getProperty(\r
+ executionModuleNode.getProperty(\r
+ SlcNames.SLC_NAME).getString(),\r
+ executionModuleNode.getProperty(\r
SlcNames.SLC_VERSION).getString());\r
modulesManager.upgrade(nameVersion);\r
+ monitor.worked(1);\r
log.info("Module " + nameVersion + " updated");\r
}\r
+ return Status.OK_STATUS;\r
+ } catch (Exception e) {\r
+ Error.show("Cannot update " + obj, e);\r
+ return Status.CANCEL_STATUS;\r
}\r
}\r
- } catch (Exception e) {\r
- Error.show("Cannot update " + obj, e);\r
- }\r
+ };\r
+ job.setUser(true);\r
+ job.schedule();\r
}\r
return null;\r
}\r