From b086f57f56bf0eb9dab9cf321a0f69aaaae84347 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Wed, 30 May 2012 08:37:45 +0200 Subject: Initial Maven Conversion --- src/main/java/com/c2kernel/gui/data/Node.java | 232 +++++++++++++++++++++ src/main/java/com/c2kernel/gui/data/NodeAgent.java | 33 +++ .../java/com/c2kernel/gui/data/NodeCollection.java | 68 ++++++ .../java/com/c2kernel/gui/data/NodeContext.java | 65 ++++++ .../java/com/c2kernel/gui/data/NodeEntity.java | 82 ++++++++ src/main/java/com/c2kernel/gui/data/NodeItem.java | 112 ++++++++++ .../java/com/c2kernel/gui/data/NodeSubscriber.java | 13 ++ 7 files changed, 605 insertions(+) create mode 100644 src/main/java/com/c2kernel/gui/data/Node.java create mode 100644 src/main/java/com/c2kernel/gui/data/NodeAgent.java create mode 100644 src/main/java/com/c2kernel/gui/data/NodeCollection.java create mode 100644 src/main/java/com/c2kernel/gui/data/NodeContext.java create mode 100644 src/main/java/com/c2kernel/gui/data/NodeEntity.java create mode 100644 src/main/java/com/c2kernel/gui/data/NodeItem.java create mode 100644 src/main/java/com/c2kernel/gui/data/NodeSubscriber.java (limited to 'src/main/java/com/c2kernel/gui/data') diff --git a/src/main/java/com/c2kernel/gui/data/Node.java b/src/main/java/com/c2kernel/gui/data/Node.java new file mode 100644 index 0000000..2f12d6b --- /dev/null +++ b/src/main/java/com/c2kernel/gui/data/Node.java @@ -0,0 +1,232 @@ +package com.c2kernel.gui.data; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; + +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.tree.DefaultMutableTreeNode; + +import com.c2kernel.common.ObjectNotFoundException; +import com.c2kernel.gui.DynamicTreeBuilder; +import com.c2kernel.gui.EntityTabManager; +import com.c2kernel.lookup.AgentPath; +import com.c2kernel.lookup.Path; +import com.c2kernel.process.Gateway; +import com.c2kernel.utils.Language; +import com.c2kernel.utils.Logger; +import com.c2kernel.utils.Resource; + +public abstract class Node implements Runnable { + + protected Path binding; + protected DefaultMutableTreeNode treeNode; + protected String name; // domain key + protected int sysKey; // target item + // attributes + protected String type = ""; + protected Icon icon; + protected boolean isExpandable = false; + protected HashMap childNodes = new HashMap(); + protected ArrayList subscribers = new ArrayList(); + protected DynamicTreeBuilder loader = null; + private boolean loaded = false; + private String iconName; + protected EntityTabManager desktop; + static ImageIcon folder = Resource.findImage("folder.png"); + static ImageIcon emptyLeaf = Resource.findImage("leaf.png"); + + public Node() { + } + + protected void createTreeNode() { + this.treeNode = new DefaultMutableTreeNode(this); + } + + public Node(Path path, EntityTabManager desktop) { + this.binding = path; + this.desktop = desktop; + this.sysKey = path.getSysKey(); + // get the name of this node (last path element) + String[] pathComponents = path.getPath(); + if (pathComponents.length > 0) + this.name = pathComponents[pathComponents.length-1]; + else + this.name = Gateway.getProperty("Name"); + } + + public EntityTabManager getDesktop() { + return desktop; + } + + public Node newNode(Path path) + { + try { + if (path.getEntity() instanceof AgentPath) + return new NodeAgent(path, desktop); + else + return new NodeItem(path, desktop); + } catch (ObjectNotFoundException ex) { + return new NodeContext(path, desktop); + } + + } + + /** Inserts a tree builder as the first child of the node, so it can be opened in the tree + */ + public void makeExpandable() { + if (isExpandable) return; + loader = new DynamicTreeBuilder(this.treeNode); + this.treeNode.insert(loader.getTreeNode(),0); + isExpandable = true; + } + + + public DefaultMutableTreeNode getTreeNode() { + return treeNode; + } + + public void setTreeNode(DefaultMutableTreeNode treeNode) { + this.treeNode = treeNode; + treeNode.setUserObject(this); + } + + /** Subscription for loading node children. + * Note this is separate from the itemproxy subscription as it included query of the naming service + * and eventually should not require access to the item at all for higher performance */ + public void subscribeNode(NodeSubscriber target) { + subscribers.add(target); + if (loaded == false) { + loaded = true; + loadMore(); + } + else { + synchronized (childNodes) { + Node newNode; + for (Iterator nodes = childNodes.values().iterator(); nodes.hasNext();) { + newNode = nodes.next(); + Logger.msg("subscribeNode target.add("+newNode.name+")"); + target.add(newNode); + } + } + } + } + + public void loadMore() { + Thread loading = new Thread(this); + loading.start(); + } + + public void unsubscribeNode(NodeSubscriber target) { + subscribers.remove(target); + } + + public void add(Node newNode) { + synchronized(childNodes) { + childNodes.put(newNode.getPath(), newNode); + for (NodeSubscriber thisSub : subscribers) { + thisSub.add(newNode); + } + } + } + + public void remove(Path oldPath) { + synchronized(childNodes) { + childNodes.remove(oldPath); + for (NodeSubscriber thisSub : subscribers) { + thisSub.remove(oldPath); + } + } + } + + public void removeAllChildren() { + synchronized(childNodes) { + while (childNodes.keySet().iterator().hasNext()) { + remove(childNodes.keySet().iterator().next()); + } + } + } + + public Node getChildNode(Path itsPath) { + for (Iterator i = childNodes.keySet().iterator(); i.hasNext();) { + Object next = i.next(); + if ( next.equals(itsPath) ) return childNodes.get(next); + } + return null; + } + + // end of current batch + public void end(boolean more) { + for (NodeSubscriber thisSub : subscribers) { + thisSub.end(more); + } + } + + + @Override + public void run() { + Thread.currentThread().setName("Node Loader: "+name); + loadChildren(); + } + + public abstract void loadChildren(); + + public void refresh() { + removeAllChildren(); + loadChildren(); + } + + // Getters and Setters + + public int getSysKey() { return sysKey; } +// public void setSysKey( int sysKey ) { this.sysKey = sysKey; } + + public String getName() { return name; } +// public void setName( String name ) { this.name = name; } + + public String getType() { return type; } +// public void setType( String type ) { this.type = type; } + + public Path getPath() { return binding; } + + public DynamicTreeBuilder getTreeBuilder() { return loader; } + + @Override + public String toString() { + if (this.name.length() > 0) { + return this.name; + } + else { return "Cristal"; } + } + + public Icon getIcon() { + if (icon != null) return icon; + return(isExpandable?folder:emptyLeaf); + } + + public String getIconName() { + return iconName; + } + + public void setIcon(String icon) { + iconName = icon; + this.icon = Resource.findImage("typeicons/"+icon+"_16.png"); + } + + public JPopupMenu getPopupMenu() { + JPopupMenu popup = new JPopupMenu(); + JMenuItem menuItem = new JMenuItem(Language.translate("Refresh")); + menuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (isExpandable) refresh(); + } + }); + popup.add(menuItem); + return popup; + } +} diff --git a/src/main/java/com/c2kernel/gui/data/NodeAgent.java b/src/main/java/com/c2kernel/gui/data/NodeAgent.java new file mode 100644 index 0000000..9f6cdad --- /dev/null +++ b/src/main/java/com/c2kernel/gui/data/NodeAgent.java @@ -0,0 +1,33 @@ + +package com.c2kernel.gui.data; + + +import java.util.ArrayList; + +import com.c2kernel.gui.EntityTabManager; +import com.c2kernel.lookup.Path; + +/** + * Structure for Item presence on the tree and ItemDetails boxes. Created by NodeFactory. + * @author $Author: abranson $ + * @version $Version$ + */ +public class NodeAgent extends NodeEntity { + + public NodeAgent(Path path, EntityTabManager desktop) { + super(path, desktop); + } + + @Override + public void loadChildren() { + } + + @Override + public ArrayList getTabs() { + + ArrayList requiredTabs = super.getTabs(); + requiredTabs.add("AgentProperties"); + requiredTabs.add("JobList"); + return requiredTabs; + } +} diff --git a/src/main/java/com/c2kernel/gui/data/NodeCollection.java b/src/main/java/com/c2kernel/gui/data/NodeCollection.java new file mode 100644 index 0000000..ceee16f --- /dev/null +++ b/src/main/java/com/c2kernel/gui/data/NodeCollection.java @@ -0,0 +1,68 @@ +package com.c2kernel.gui.data; + +import java.util.ArrayList; + +import javax.swing.tree.DefaultMutableTreeNode; + +import com.c2kernel.collection.CollectionMember; +import com.c2kernel.collection.Parent2ChildCollection; +import com.c2kernel.common.ObjectNotFoundException; +import com.c2kernel.entity.proxy.ItemProxy; +import com.c2kernel.gui.EntityTabManager; +import com.c2kernel.lookup.EntityPath; +import com.c2kernel.lookup.InvalidEntityPathException; +import com.c2kernel.utils.Logger; + +public class NodeCollection extends Node { + + ItemProxy parent; + Parent2ChildCollection thisCollection; + String path; + + public NodeCollection(ItemProxy parent, String name, EntityTabManager desktop) { + this.desktop = desktop; + this.parent = parent; + this.name = name; + this.path = parent.getSystemKey()+"/Collection/"+name; + createTreeNode(); + this.makeExpandable(); + } + + @Override + public void loadChildren() { + Logger.msg(8, "NodeCollection::loadChildren()"); + try { + thisCollection = (Parent2ChildCollection)parent.getObject("Collection/"+name); + } catch (ObjectNotFoundException ex) { + end(false); + return; + } + + this.type = thisCollection.getClass().getName(); + int lastDot = this.type.lastIndexOf('.'); + if (lastDot > -1) this.type = this.type.substring(lastDot+1); + ArrayList collectionMembers = thisCollection.getMembers().list; + for (int i=0; i children; + + public NodeContext(Path path, EntityTabManager desktop) { + super(path, desktop); + this.sysKey=Path.INVALID; + createTreeNode(); + this.makeExpandable(); + this.type = "Cristal Context"; + } + + + @Override + public void loadChildren() { + if (children == null) { + Gateway.getProxyManager().subscribeTree(this, (DomainPath)binding); + children = binding.getChildren(); + } + + int batch = 75; + while (children.hasMoreElements() && batch > 0) { + Path newPath = children.nextElement(); + if (newPath == null) break; + Logger.msg(2, "Subscription.run() - new node: " + newPath ); + add( newNode(newPath)); + batch--; + } + end(children.hasMoreElements()); + } + + @Override + public void pathAdded(DomainPath path) { + add(newNode(path)); + } + + @Override + public void refresh() { + children = null; + super.refresh(); + } + @Override + public void pathRemoved(DomainPath path) { + remove(path); + } + +} + + + + + + + diff --git a/src/main/java/com/c2kernel/gui/data/NodeEntity.java b/src/main/java/com/c2kernel/gui/data/NodeEntity.java new file mode 100644 index 0000000..cce4f68 --- /dev/null +++ b/src/main/java/com/c2kernel/gui/data/NodeEntity.java @@ -0,0 +1,82 @@ +package com.c2kernel.gui.data; + + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; + +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; + +import com.c2kernel.entity.proxy.EntityProxy; +import com.c2kernel.gui.EntityTabManager; +import com.c2kernel.lookup.Path; +import com.c2kernel.process.Gateway; +import com.c2kernel.utils.Language; +import com.c2kernel.utils.Logger; + +/** + * Structure for Item presence on the tree and ItemDetails boxes. Created by NodeFactory. + * @author $Author: abranson $ + * @version $Version$ + */ +public abstract class NodeEntity extends Node { + + protected EntityProxy myEntity = null; + + public NodeEntity(Path path, EntityTabManager desktop) { + super(path, desktop); + Logger.msg(2,"NodeEntity. - Creating item for '"+path.toString()+"'."); + + try { + // if an item - resolve the item and get its properties + myEntity = Gateway.getProxyManager().getProxy(path); + this.sysKey = path.getSysKey(); + Logger.msg(2,"NodeEntity. - System key is "+this.sysKey); + + // Name should be the alias if present + String alias = myEntity.getName(); + if (alias != null) this.name = alias; + + this.type = myEntity.getProperty("Type"); + String iconString = this.type; + if (type.equals("ActivityDesc")) iconString = myEntity.getProperty("Complexity")+iconString; + iconString = iconString.toLowerCase(); + this.setIcon(iconString); + createTreeNode(); + } catch (Exception e) { + Logger.msg(2, "NodeEntity. - "+sysKey+" failed to resolve:"); + Logger.error(e); + } + } + + public EntityProxy getEntity() { + return myEntity; + } + /** + * + */ + @Override + public JPopupMenu getPopupMenu() { + JPopupMenu popup = super.getPopupMenu(); + JMenuItem openItem = new JMenuItem(Language.translate("Open")); + openItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + openItem(); + } + }); + popup.addSeparator(); + popup.add(openItem); + return popup; + } + + public void openItem() { + desktop.add(this); + } + + public ArrayList getTabs() { + ArrayList requiredTabs = new ArrayList(); + return requiredTabs; + } +} diff --git a/src/main/java/com/c2kernel/gui/data/NodeItem.java b/src/main/java/com/c2kernel/gui/data/NodeItem.java new file mode 100644 index 0000000..30f7ce3 --- /dev/null +++ b/src/main/java/com/c2kernel/gui/data/NodeItem.java @@ -0,0 +1,112 @@ +package com.c2kernel.gui.data; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.StringTokenizer; + +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; + +import com.c2kernel.entity.agent.Job; +import com.c2kernel.entity.proxy.ItemProxy; +import com.c2kernel.gui.EntityDetails; +import com.c2kernel.gui.EntityTabManager; +import com.c2kernel.gui.MainFrame; +import com.c2kernel.lookup.Path; +import com.c2kernel.persistency.ClusterStorage; +import com.c2kernel.utils.Logger; + +/** + * Structure for Item presence on the tree and ItemDetails boxes. Created by NodeFactory. + * @author $Author: abranson $ + * @version $Version$ + */ +public class NodeItem extends NodeEntity { + + public NodeItem(Path path, EntityTabManager desktop) { + super(path, desktop); + try { + makeExpandable(); + } catch (Exception e) { + Logger.error(e); + } + } + + @Override + public void loadChildren() { + try { + String collections = myEntity.queryData("Collection/all"); + StringTokenizer tok = new StringTokenizer(collections, ","); + while (tok.hasMoreTokens()) { + NodeCollection newCollection = new NodeCollection((ItemProxy)myEntity, tok.nextToken(), desktop); + add(newCollection); + } + end(false); + } catch (Exception e) { + Logger.error(e); + } + } + + @Override + public JPopupMenu getPopupMenu() { + JPopupMenu popup = super.getPopupMenu(); + popup.addSeparator(); + try { + ArrayList jobList = ((ItemProxy)myEntity).getJobList(MainFrame.userAgent); + ArrayList already = new ArrayList(); + if (jobList.size() > 0) { + for (Job thisJob : jobList) { + String stepName = thisJob.getStepName(); + if (already.contains(stepName)) + continue; + already.add(stepName); + JMenuItem menuItem = new JMenuItem(stepName); + menuItem.setActionCommand(stepName); + menuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + execute(e.getActionCommand()); + } + }); + popup.add(menuItem); + + } + } + else { + JMenuItem noAct = new JMenuItem("No activities"); + noAct.setEnabled(false); + popup.add(noAct); + } + } catch (Exception ex) { + JMenuItem error = new JMenuItem("Error querying jobs"); + error.setEnabled(false); + popup.add(error); + } + + return popup; + } + + public void execute(String stepName) { + EntityDetails thisDetail = desktop.add(this); + thisDetail.runCommand("Execution", stepName); + } + + @Override + public ArrayList getTabs() { + + ArrayList requiredTabs = super.getTabs(); + requiredTabs.add("Properties"); + try { + String collNames = myEntity.queryData(ClusterStorage.COLLECTION+"/all"); + if (collNames.length() > 0) + requiredTabs.add("Collection"); + } catch (Exception e) { } + requiredTabs.add("Execution"); + requiredTabs.add("History"); + requiredTabs.add("Viewpoint"); + requiredTabs.add("Workflow"); + return requiredTabs; + + } +} diff --git a/src/main/java/com/c2kernel/gui/data/NodeSubscriber.java b/src/main/java/com/c2kernel/gui/data/NodeSubscriber.java new file mode 100644 index 0000000..70af660 --- /dev/null +++ b/src/main/java/com/c2kernel/gui/data/NodeSubscriber.java @@ -0,0 +1,13 @@ +package com.c2kernel.gui.data; + +import com.c2kernel.lookup.Path; + + +public interface NodeSubscriber { + + public void add(Node newNode); + + public void remove(Path path); + + public void end(boolean more); +} -- cgit v1.2.3