]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/providers/ExecutionModulesContentProvider.java
Implementation of a first draft of editorView for the process parameters.
[gpl/argeo-slc.git] / eclipse / plugins / org.argeo.slc.client.ui / src / org / argeo / slc / client / ui / providers / ExecutionModulesContentProvider.java
diff --git a/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/providers/ExecutionModulesContentProvider.java b/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/providers/ExecutionModulesContentProvider.java
new file mode 100644 (file)
index 0000000..9f8d267
--- /dev/null
@@ -0,0 +1,264 @@
+package org.argeo.slc.client.ui.providers;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.eclipse.ui.TreeObject;
+import org.argeo.eclipse.ui.TreeParent;
+import org.argeo.slc.execution.ExecutionFlowDescriptor;
+import org.argeo.slc.execution.ExecutionModuleDescriptor;
+import org.argeo.slc.runtime.SlcAgent;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+public class ExecutionModulesContentProvider implements ITreeContentProvider {
+       private final static Log log = LogFactory
+                       .getLog(ExecutionModulesContentProvider.class);
+
+       private List<SlcAgent> slcAgents;
+
+       public Object[] getChildren(Object parent) {
+
+               if (parent instanceof ExecutionModuleNode) {
+                       ExecutionModuleNode executionModuleNode = (ExecutionModuleNode) parent;
+                       ExecutionModuleDescriptor emd = executionModuleNode.getDescriptor();
+
+                       // Terminate the building of UI specific object emd
+                       emd = executionModuleNode
+                                       .getAgentNode()
+                                       .getAgent()
+                                       .getExecutionModuleDescriptor(emd.getName(),
+                                                       emd.getVersion());
+                       executionModuleNode.cacheDescriptor(emd);
+
+                       // This is not recursive, e.g. ExecutionModuleNode build a Tree of
+                       // specific
+                       // treeObject and cache it in the cacheDescriptor.
+                       // Then we only have TreeObjects
+                       return executionModuleNode.getChildren();
+               } else if (parent instanceof AgentNode) {
+                       AgentNode agentNode = (AgentNode) parent;
+
+                       if (log.isTraceEnabled())
+                               log.trace("Scan agent " + agentNode);
+
+                       agentNode.clearChildren();
+                       for (ExecutionModuleDescriptor desc : agentNode.getAgent()
+                                       .listExecutionModuleDescriptors()) {
+                               agentNode.addChild(new ExecutionModuleNode(agentNode, desc));
+                       }
+
+                       return agentNode.getChildren();
+               } else if (parent instanceof TreeParent) {
+                       return ((TreeParent) parent).getChildren();
+               } else if (parent instanceof FlowNode) {
+                       return new Object[0];
+               } else {
+                       List<AgentNode> agentNodes = new ArrayList<AgentNode>();
+                       for (SlcAgent slcAgent : slcAgents) {
+                               agentNodes.add(new AgentNode(slcAgent));
+                       }
+                       return agentNodes.toArray();
+               }
+       }
+
+       public Object getParent(Object node) {
+               // if (node instanceof TreeObject) {
+               // return ((TreeObject) node).getParent();
+               // }
+               return null;
+       }
+
+       public boolean hasChildren(Object parent) {
+               if (parent instanceof TreeParent && ((TreeParent) parent).isLoaded()) {
+                       return ((TreeParent) parent).hasChildren();
+               } else if (parent instanceof AgentNode) {
+                       return true;
+               } else if (parent instanceof ExecutionModuleNode) {
+                       return true;
+               }
+               return false;
+       }
+
+       public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+       }
+
+       public void dispose() {
+       }
+
+       public Object[] getElements(Object parent) {
+               return getChildren(parent);
+       }
+
+       public void setSlcAgents(List<SlcAgent> slcAgents) {
+               this.slcAgents = slcAgents// for (String flowName :
+                                                                       // executionModuleNode.getFlowDescriptors()
+               // .keySet()) {
+               // executionModuleNode.addChild(new FlowNode(flowName,
+               // executionModuleNode));
+               // }
+               ;
+       }
+
+       public class AgentNode extends TreeParent {
+               private final SlcAgent agent;
+
+               public AgentNode(SlcAgent agent) {
+                       super(agent.toString());
+                       this.agent = agent;
+               }
+
+               public SlcAgent getAgent() {
+                       return agent;
+               }
+       }
+
+       public class ExecutionModuleNode extends TreeParent {
+               private final AgentNode agentNode;
+               private ExecutionModuleDescriptor descriptor;
+               private Map<String, ExecutionFlowDescriptor> flowDescriptors;
+
+               public ExecutionModuleNode(AgentNode agentNode,
+                               ExecutionModuleDescriptor descriptor) {
+                       super(descriptor.toString());
+                       this.agentNode = agentNode;
+                       this.descriptor = descriptor;
+
+               }
+
+               public AgentNode getAgentNode() {
+                       return agentNode;
+               }
+
+               public ExecutionModuleDescriptor getDescriptor() {
+                       return descriptor;
+               }
+
+               public void cacheDescriptor(ExecutionModuleDescriptor descriptor) {
+                       this.descriptor = descriptor;
+
+                       SortedMap<String, FolderNode> folderNodes = new TreeMap<String, FolderNode>();
+                       flowDescriptors = new HashMap<String, ExecutionFlowDescriptor>();
+
+                       for (ExecutionFlowDescriptor fd : descriptor.getExecutionFlows()) {
+                               // Find, format and store path and label values for each flow
+                               // descritor:
+
+                               // we format name of type path="" & name="path/toTest/Test" to :
+                               // path="path/toTest/" name="Test"
+                               String path;
+                               String label;
+                               int lastSlash = fd.getName().lastIndexOf('/');
+                               if ((fd.getPath() == null || fd.getPath().trim().equals(""))
+                                               && lastSlash >= 0) {
+                                       path = fd.getName().substring(0, lastSlash);
+                                       label = fd.getName().substring(lastSlash + 1);
+                               } else {
+                                       path = fd.getPath();
+                                       label = fd.getName();
+                               }
+
+                               if (path == null || path.trim().equals("")
+                                               || path.trim().equals("/")) {
+                                       // directChildren.put(name, new FlowNode(name, this));
+                                       addChild(new FlowNode(label, fd.getName(), fd, this));
+                               } else {
+                                       FolderNode folderNode = mkdirs(this, path, folderNodes);
+                                       folderNode.addChild(new FlowNode(label, fd.getName(), fd,
+                                                       this));
+                               }
+
+                               flowDescriptors.put(fd.getName(), fd);
+                       }
+                       // TODO: make it readonly
+               }
+
+               protected FolderNode mkdirs(TreeParent root, String path,
+                               SortedMap<String, FolderNode> folderNodes) {
+                       // Normalize
+                       if (path.charAt(0) != '/')
+                               path = '/' + path;
+                       if (path.charAt(path.length() - 1) == '/')
+                               path = path.substring(0, path.length() - 1);
+
+                       if (folderNodes.containsKey(path))
+                               return folderNodes.get(path);
+
+                       int lastIndx = path.lastIndexOf('/');
+                       String folderName;
+                       String parentPath;
+                       if (lastIndx >= 0) {
+                               folderName = path.substring(lastIndx + 1);
+                               parentPath = path.substring(0, lastIndx);
+                       } else {
+                               folderName = path;
+                               parentPath = "";
+                       }
+
+                       TreeParent parent;
+                       if (parentPath.equals(""))
+                               parent = root;
+                       else
+                               parent = mkdirs(root, parentPath, folderNodes);
+                       FolderNode newFolder = new FolderNode(folderName);
+                       parent.addChild(newFolder);
+                       folderNodes.put(path, newFolder);
+                       return newFolder;
+               }
+
+               public Map<String, ExecutionFlowDescriptor> getFlowDescriptors() {
+                       return flowDescriptors;
+               }
+
+       }
+
+       /**
+        * 
+        * @author bsinou
+        * 
+        *         The implementation of a vernice of a given slc process. Note that
+        *         we store the parent node (execution module node) & the
+        *         ExecutionFlowDescriptor.
+        */
+       public class FlowNode extends TreeObject {
+
+               private final String flowName;
+               private final ExecutionModuleNode executionModuleNode;
+               private final ExecutionFlowDescriptor executionFlowDescriptor;
+
+               public FlowNode(String label, String flowName,
+                               ExecutionFlowDescriptor executionFlowDescriptor,
+                               ExecutionModuleNode parent) {
+                       super(label);
+                       this.flowName = flowName;
+                       this.executionFlowDescriptor = executionFlowDescriptor;
+                       this.executionModuleNode = parent;
+               }
+
+               public String getFlowName() {
+                       return flowName;
+               }
+
+               public ExecutionModuleNode getExecutionModuleNode() {
+                       return executionModuleNode;
+               }
+
+               public ExecutionFlowDescriptor getExecutionFlowDescriptor() {
+                       return executionFlowDescriptor;
+               }
+
+       }
+
+       public class FolderNode extends TreeParent {
+               public FolderNode(String name) {
+                       super(name);
+               }
+
+       }
+}