Author: mes
Date: 2011-08-30 12:59:33 -0700 (Tue, 30 Aug 2011)
New Revision: 26655

Added:
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubEdgeImpl.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubNodeImpl.java
Modified:
   
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/AbstractNetworkFromSelectionTask.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/ArrayGraph.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/ArraySubGraph.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyEdgeImpl.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyNodeImpl.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableEntryImpl.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableImpl.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableManagerImpl.java
Log:
fixes #278 #308 SubNetworks now contains separate CyNode objects along with 
their own CyTables.

Modified: 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/AbstractNetworkFromSelectionTask.java
===================================================================
--- 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/AbstractNetworkFromSelectionTask.java
    2011-08-30 19:24:24 UTC (rev 26654)
+++ 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/AbstractNetworkFromSelectionTask.java
    2011-08-30 19:59:33 UTC (rev 26655)
@@ -135,7 +135,7 @@
 
                // copy node location only.
                for (View<CyNode> newNodeView : newView.getNodeViews()) {
-                       View<CyNode> origNodeView = 
curView.getNodeView(newNodeView.getModel());
+                       View<CyNode> origNodeView = 
curView.getNodeView(parentNetwork.getNode(newNodeView.getModel().getIndex()));
                        
newNodeView.setVisualProperty(MinimalVisualLexicon.NODE_X_LOCATION,
                                        
origNodeView.getVisualProperty(MinimalVisualLexicon.NODE_X_LOCATION));
                        
newNodeView.setVisualProperty(MinimalVisualLexicon.NODE_Y_LOCATION,

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/ArrayGraph.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/ArrayGraph.java
 2011-08-30 19:24:24 UTC (rev 26654)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/ArrayGraph.java
 2011-08-30 19:59:33 UTC (rev 26655)
@@ -81,15 +81,18 @@
        private NodePointer firstNode;
        private final List<NodePointer> nodePointers;
        private final List<EdgePointer> edgePointers;
-       private final Map<String, CyTable> netAttrMgr;
-       private final Map<String, CyTable> nodeAttrMgr;
-       private final Map<String, CyTable> edgeAttrMgr;
+       private final Map<String,CyTable> netTables;
+       private final Map<String,CyTable> nodeTables;
+       private final Map<String,CyTable> edgeTables;
        private final CyEventHelper eventHelper;
        private final List<CySubNetwork> subNetworks;
        private final CySubNetwork base;
        private final CyTableManagerImpl tableMgr;
+       private final CyTableFactory tableFactory;
        private final CyServiceRegistrar serviceRegistrar;
 
+       private final boolean publicTables;
+
        /**
         * Creates a new ArrayGraph object.
         * @param eh The CyEventHelper used for firing events.
@@ -99,6 +102,8 @@
                          final CyServiceRegistrar serviceRegistrar, final 
boolean publicTables)
        {
                this.tableMgr = tableMgr;
+               this.tableFactory = tableFactory;
+               this.publicTables = publicTables;
                this.serviceRegistrar = serviceRegistrar;
                suid = SUIDFactory.getNextSUID();
                numSubNetworks = 0;
@@ -108,67 +113,79 @@
                nodePointers = new ArrayList<NodePointer>();
                edgePointers = new ArrayList<EdgePointer>();
 
-               netAttrMgr = new HashMap<String, CyTable>();
-               netAttrMgr.put(CyNetwork.DEFAULT_ATTRS,
-                              tableFactory.createTable(suid + " network", 
Identifiable.SUID, Long.class,
-                                                       publicTables, false));
-               netAttrMgr.put(CyNetwork.HIDDEN_ATTRS,
-                              tableFactory.createTable(suid + " network", 
Identifiable.SUID, Long.class, false,
-                                                       false));
-
-               
netAttrMgr.get(CyNetwork.DEFAULT_ATTRS).createColumn(CyTableEntry.NAME, 
String.class,
-                                                                    true);
+               netTables = createNetworkTables(suid); 
                getCyRow().set(CyTableEntry.NAME, "");
-               // potential leak since "this" isn't yet fully constructed
 
-               nodeAttrMgr = new HashMap<String, CyTable>();
-               nodeAttrMgr.put(CyNetwork.DEFAULT_ATTRS,
-                               tableFactory.createTable(suid + " node", 
Identifiable.SUID, Long.class,
-                                                        publicTables, false));
-               nodeAttrMgr.put(CyNetwork.HIDDEN_ATTRS,
-                               tableFactory.createTable(suid + " node", 
Identifiable.SUID, Long.class,
-                                                        false, false));
+               nodeTables = createNodeTables(suid); 
+               edgeTables = createEdgeTables(suid); 
 
-               
nodeAttrMgr.get(CyNetwork.DEFAULT_ATTRS).createColumn(CyTableEntry.NAME,
-                                                                     
String.class, true);
-               
nodeAttrMgr.get(CyNetwork.DEFAULT_ATTRS).createColumn(CyNetwork.SELECTED,
-                                                                     
Boolean.class, true);
+        tableMgr.setTableMap(CyNetwork.class, this, netTables);
+        tableMgr.setTableMap(CyNode.class, this, nodeTables);
+        tableMgr.setTableMap(CyEdge.class, this, edgeTables);
 
-               edgeAttrMgr = new HashMap<String, CyTable>();
-               edgeAttrMgr.put(CyNetwork.DEFAULT_ATTRS,
-                               tableFactory.createTable(suid + " edge", 
Identifiable.SUID, Long.class,
-                                                        publicTables, false));
-               edgeAttrMgr.put(CyNetwork.HIDDEN_ATTRS,
-                               tableFactory.createTable(suid + " edge", 
Identifiable.SUID, Long.class,
-                                                        false, false));
-
-               
edgeAttrMgr.get(CyNetwork.DEFAULT_ATTRS).createColumn(CyTableEntry.NAME,
-                                                                     
String.class, true);
-               
edgeAttrMgr.get(CyNetwork.DEFAULT_ATTRS).createColumn(CyNetwork.SELECTED,
-                                                                     
Boolean.class, true);
-               
edgeAttrMgr.get(CyNetwork.DEFAULT_ATTRS).createColumn(CyEdge.INTERACTION,
-                                                                     
String.class, true);
                eventHelper = eh;
 
                subNetworks = new ArrayList<CySubNetwork>();
 
                base = addSubNetwork(); 
+       }
 
-               tableMgr.setTableMap(CyNetwork.class, base, netAttrMgr);
-               tableMgr.setTableMap(CyNode.class, base, nodeAttrMgr);
-               tableMgr.setTableMap(CyEdge.class, base, edgeAttrMgr);
+       private void registerAllTables() {
+        for (final CyTable table : netTables.values())
+            tableMgr.addTable(table);
+        for (final CyTable table : nodeTables.values())
+            tableMgr.addTable(table);
+        for (final CyTable table : edgeTables.values())
+            tableMgr.addTable(table);
        }
 
-       /** Registers the network, node, and edge tables with the table 
mananger. */
-       void registerAllTables() {
-               for (final CyTable table : netAttrMgr.values())
-                       tableMgr.addTable(table);
-               for (final CyTable table : nodeAttrMgr.values())
-                       tableMgr.addTable(table);
-               for (final CyTable table : edgeAttrMgr.values())
-                       tableMgr.addTable(table);
+       private Map<String,CyTable> createNetworkTables(long suidx) {
+               Map<String,CyTable> netAttrMgr = new HashMap<String, CyTable>();
+        netAttrMgr.put(CyNetwork.DEFAULT_ATTRS, tableFactory.createTable(suidx 
+ " network", Identifiable.SUID, Long.class, publicTables, false));
+        netAttrMgr.put(CyNetwork.HIDDEN_ATTRS, tableFactory.createTable(suidx 
+ " network", Identifiable.SUID, Long.class, false, false));
+
+        
netAttrMgr.get(CyNetwork.DEFAULT_ATTRS).createColumn(CyTableEntry.NAME, 
String.class, true);
+        //getCyRow().set(CyTableEntry.NAME, "");
+               return netAttrMgr;
        }
 
+       private Map<String,CyTable> createNodeTables(long suidx) {
+        Map<String,CyTable> nodeAttrMgr = new HashMap<String, CyTable>();
+        nodeAttrMgr.put(CyNetwork.DEFAULT_ATTRS,
+                tableFactory.createTable(suidx + " node", Identifiable.SUID, 
Long.class,
+                             publicTables, false));
+        nodeAttrMgr.put(CyNetwork.HIDDEN_ATTRS,
+                tableFactory.createTable(suidx + " node", Identifiable.SUID, 
Long.class,
+                             false, false));
+
+        
nodeAttrMgr.get(CyNetwork.DEFAULT_ATTRS).createColumn(CyTableEntry.NAME,
+                                      String.class, true);
+        
nodeAttrMgr.get(CyNetwork.DEFAULT_ATTRS).createColumn(CyNetwork.SELECTED,
+                                      Boolean.class, true);
+
+               return nodeAttrMgr;
+
+       }
+
+       private Map<String,CyTable> createEdgeTables(long suidx) {
+        Map<String,CyTable> edgeAttrMgr = new HashMap<String, CyTable>();
+        edgeAttrMgr.put(CyNetwork.DEFAULT_ATTRS,
+                tableFactory.createTable(suidx + " edge", Identifiable.SUID, 
Long.class,
+                             publicTables, false));
+        edgeAttrMgr.put(CyNetwork.HIDDEN_ATTRS,
+                tableFactory.createTable(suidx + " edge", Identifiable.SUID, 
Long.class,
+                             false, false));
+
+        
edgeAttrMgr.get(CyNetwork.DEFAULT_ATTRS).createColumn(CyTableEntry.NAME,
+                                      String.class, true);
+        
edgeAttrMgr.get(CyNetwork.DEFAULT_ATTRS).createColumn(CyNetwork.SELECTED,
+                                      Boolean.class, true);
+        
edgeAttrMgr.get(CyNetwork.DEFAULT_ATTRS).createColumn(CyEdge.INTERACTION,
+                                      String.class, true);
+
+               return edgeAttrMgr;
+       }
+
        /**
         * {@inheritDoc}
         */
@@ -287,6 +304,7 @@
 
        synchronized List<CyNode> getNeighborList(final CyNode n, final 
CyEdge.Type e, final int inId) {
                if (!containsNode(n)) {
+                       //System.out.println("network doesn't contain node, so 
no neighbors: " + n);
                        return new ArrayList<CyNode>();
                        //TODO log.warning("this node is not contained in the 
network");
                }
@@ -312,9 +330,11 @@
 
        synchronized List<CyEdge> getAdjacentEdgeList(final CyNode n, final 
CyEdge.Type e, final int inId) {
                if (!containsNode(n)) {
+                       //System.out.println("doesn't contain node: " + n);
                        return new ArrayList<CyEdge>();
                        // TODO log.warning("this node is not contained in the 
network");
                }
+               //System.out.println("getting adjacent edge list for node: " + 
n);
 
                final NodePointer np = getNodePointer(n);
                final List<CyEdge> ret = new ArrayList<CyEdge>(countEdges(np, 
e, inId));
@@ -367,19 +387,21 @@
                return nodeAdd();
        }
 
-       CyNode nodeAdd() {
+       CyNodeImpl nodeAdd() {
                final NodePointer n;
+               final CyNodeImpl rootNode; 
 
                synchronized (this) {
                        final int index = nodePointers.size();
-                       n = new NodePointer(index, new CyNodeImpl(index, 
nodeAttrMgr, eventHelper));
+                       rootNode = new CyNodeImpl(index, nodeTables, 
eventHelper);
+                       n = new NodePointer(index, rootNode);
                        nodePointers.add(n);
                        nodeCount++;
                        // In ArrayGraph we only ever add the node to the root.
                        firstNode = n.insert(firstNode,ROOT);
                }
 
-               return n.cyNode;
+               return rootNode; 
        }
 
        /**
@@ -423,23 +445,29 @@
        }
 
        // Will be called from ArraySubGraph.
-       CyEdge edgeAdd(final CyNode s, final CyNode t, final boolean directed, 
final CyNetwork net) {
+       CyEdgeImpl edgeAdd(final CyNode s, final CyNode t, final boolean 
directed, final CyNetwork net) {
 
                final EdgePointer e;
+               final CyEdgeImpl rootEdge;
 
+               final CyNode rootS = getRootNode(s);
+               final CyNode rootT = getRootNode(t);
+
                synchronized (this) {
+                       // here we check with possible sub node, not just root 
node
                        if (!net.containsNode(s))
                                throw new IllegalArgumentException("source node 
is not a member of this network");
 
+                       // here we check with possible sub node, not just root 
node
                        if (!net.containsNode(t))
                                throw new IllegalArgumentException("target node 
is not a member of this network");
 
-                       final NodePointer source = getNodePointer(s);
-                       final NodePointer target = getNodePointer(t);
+                       final NodePointer source = getNodePointer(rootS);
+                       final NodePointer target = getNodePointer(rootT);
 
                        final int index = edgePointers.size();
-                       e = new EdgePointer(source, target, directed, index, 
-                                           new CyEdgeImpl(s, t, directed, 
index, edgeAttrMgr));
+                       rootEdge = new CyEdgeImpl(rootS, rootT, directed, 
index, edgeTables);
+                       e = new EdgePointer(source, target, directed, index, 
rootEdge); 
 
                        // adds to the root network, adding to the subnetwork 
is handled in ArraySubGraph 
                        e.insert(ROOT); 
@@ -449,9 +477,26 @@
                        edgeCount++;
                }
 
-               return e.cyEdge;
+               //System.out.println("adding edge: " + rootEdge);
+
+               return rootEdge; 
        }
 
+       private CyNode getRootNode(CyNode node) {
+               if ( node instanceof CySubNodeImpl )
+                       return ((CySubNodeImpl)node).getRootNode();
+               else
+                       return node;    
+       }
+
+       private CyEdge getRootEdge(CyEdge edge) {
+               if ( edge instanceof CySubEdgeImpl )
+                       return ((CySubEdgeImpl)edge).getRootEdge();
+               else
+                       return edge;    
+       }
+
+
        /**
         * {@inheritDoc}
         */
@@ -488,13 +533,11 @@
        public boolean containsNode(final CyNode node) {
                if (node == null)
                        return false;
-                       //throw new NullPointerException("node is null");
 
                final int ind = node.getIndex();
 
                if (ind < 0)
                        return false;
-                       //throw new IllegalArgumentException("node index less 
than zero");
 
                final NodePointer thisNode; 
 
@@ -508,7 +551,9 @@
                if ( thisNode == null )
                        return false;   
 
-               return thisNode.cyNode.equals(node);
+               final CyNode rootNode = getRootNode(node);
+
+               return thisNode.cyNode.equals(rootNode);
        }
 
        /**
@@ -534,7 +579,9 @@
                if ( thisEdge == null )
                        return false;
 
-               return thisEdge.cyEdge.equals(edge);
+               final CyEdge rootEdge = getRootEdge(edge);
+
+               return thisEdge.cyEdge.equals(rootEdge);
        }
 
        /**
@@ -566,31 +613,28 @@
        /**
         * {@inheritDoc}
         */
-       public CyRow getCyRow(final String namespace) {
-               if (namespace == null)
-                       throw new NullPointerException("namespace is null");
+       public synchronized CyRow getCyRow() {
+               return getCyRow(CyNetwork.DEFAULT_ATTRS); 
+       }
 
-               final CyRow ret; 
-               final CyTable mgr;
-       
-               synchronized (this) {
-                       mgr = netAttrMgr.get(namespace);
+    public CyRow getCyRow(final String namespace) {
+        if (namespace == null)
+            throw new NullPointerException("namespace is null");
 
-                       if (mgr == null)
-                               throw new NullPointerException("attribute 
manager is null for namespace: " + namespace);
+        final CyRow ret;
+        final CyTable mgr;
+   
+        synchronized (this) {
+            mgr = netTables.get(namespace);
 
-                       ret = mgr.getRow(suid);
-               }
+            if (mgr == null)
+                throw new NullPointerException("attribute manager is null for 
namespace: " + namespace);
 
-               return ret;
-       }
+            ret = mgr.getRow(suid);
+        }
 
-       /**
-        * {@inheritDoc}
-        */
-       public CyRow getCyRow() {
-               return getCyRow(CyNetwork.DEFAULT_ATTRS);
-       }
+        return ret;
+    }
 
        private Iterator<EdgePointer> edgesAdjacent(final NodePointer n, final 
CyEdge.Type edgeType, final int inId) {
                assert(n!=null);
@@ -866,12 +910,16 @@
         */
        public synchronized CySubNetwork addSubNetwork() {
                final int newId = ++numSubNetworks;
-               final ArraySubGraph sub = new 
ArraySubGraph(this,newId,eventHelper);
+               final long newSUID = SUIDFactory.getNextSUID();
+               final Map<String,CyTable> newNetTable = 
createNetworkTables(newSUID);
+               final Map<String,CyTable> newNodeTable = 
createNodeTables(newSUID);
+               final Map<String,CyTable> newEdgeTable = 
createEdgeTables(newSUID);
+               final ArraySubGraph sub = new 
ArraySubGraph(this,newSUID,newId,eventHelper,newNetTable,newNodeTable,newEdgeTable,tableMgr);
                serviceRegistrar.registerAllServices(sub, new Properties());
                subNetworks.add(sub);
-               tableMgr.setTableMap(CyNetwork.class, sub, netAttrMgr);
-               tableMgr.setTableMap(CyNode.class, sub, nodeAttrMgr);
-               tableMgr.setTableMap(CyEdge.class, sub, edgeAttrMgr);
+               tableMgr.setTableMap(CyNetwork.class, sub, newNetTable);
+               tableMgr.setTableMap(CyNode.class, sub, newNodeTable);
+               tableMgr.setTableMap(CyEdge.class, sub, newEdgeTable);
                return sub;
        }
 
@@ -914,21 +962,21 @@
         * {@inheritDoc}
         */
        public CyTable getDefaultNetworkTable() {
-               return netAttrMgr.get(CyNetwork.DEFAULT_ATTRS);
+               return netTables.get(CyNetwork.DEFAULT_ATTRS); 
        }
 
        /**
         * {@inheritDoc}
         */
        public CyTable getDefaultNodeTable() {
-               return nodeAttrMgr.get(CyNetwork.DEFAULT_ATTRS);
+               return nodeTables.get(CyNetwork.DEFAULT_ATTRS); 
        }
 
        /**
         * {@inheritDoc}
         */
        public CyTable getDefaultEdgeTable() {
-               return edgeAttrMgr.get(CyNetwork.DEFAULT_ATTRS);
+               return edgeTables.get(CyNetwork.DEFAULT_ATTRS); 
        }
 
        /**
@@ -937,4 +985,8 @@
        public synchronized boolean containsNetwork(final CyNetwork net) {
                return subNetworks.contains(net);
        }
+
+       public String toString() {
+               return "CyNetwork: " + suid + " name: " + 
getCyRow().get("name", String.class); 
+       }
 }

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/ArraySubGraph.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/ArraySubGraph.java
      2011-08-30 19:24:24 UTC (rev 26654)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/ArraySubGraph.java
      2011-08-30 19:59:33 UTC (rev 26655)
@@ -37,6 +37,7 @@
 import org.cytoscape.model.CyNode;
 import org.cytoscape.model.CyRow;
 import org.cytoscape.model.SUIDFactory;
+import org.cytoscape.model.CyTableManager;
 import org.cytoscape.model.events.AddedNodesEvent;
 import org.cytoscape.model.events.AddedEdgesEvent;
 import org.cytoscape.model.events.AboutToRemoveNodesEvent;
@@ -49,10 +50,10 @@
 import org.cytoscape.model.subnetwork.CyRootNetwork;
 
 import java.util.Collection;
-import java.util.HashSet;
+import java.util.HashMap;
 import java.util.List;
+import java.util.ArrayList;
 import java.util.Map;
-import java.util.Set;
 
 
 /**
@@ -67,21 +68,30 @@
        private int internalNodeCount;
        private int internalEdgeCount;
        private NodePointer inFirstNode;
-       private Set<CyNode> nodeSet;
-       private Set<CyEdge> edgeSet;
+       private Map<CyNode,CyNode> subNodeMap;
+       private Map<CyEdge,CyEdge> subEdgeMap;
        private boolean fireAddedNodesAndEdgesEvents;
 
-       ArraySubGraph(final ArrayGraph par, final int inId, final CyEventHelper 
eventHelper) {
+       private final Map<String,CyTable> netTables;
+       private final Map<String,CyTable> nodeTables;
+       private final Map<String,CyTable> edgeTables;
+       private final CyTableManager tableMgr;
+
+       ArraySubGraph(final ArrayGraph par, final long inSUID, final int inId, 
final CyEventHelper eventHelper, final Map<String,CyTable> netTables, final 
Map<String,CyTable> nodeTables, final Map<String,CyTable> edgeTables, 
CyTableManager tableMgr) {
                assert(par != null);
                parent = par;
                internalId = inId;
                this.eventHelper = DIUtil.stripProxy(eventHelper);
 
-               internalSUID = SUIDFactory.getNextSUID();
+               internalSUID = inSUID; 
+               this.netTables = netTables;
+               this.nodeTables = nodeTables;
+               this.edgeTables = edgeTables;
+               this.tableMgr = tableMgr;
+               
+               subNodeMap = new HashMap<CyNode,CyNode>(20000);
+               subEdgeMap = new HashMap<CyEdge,CyEdge>(20000);
 
-               nodeSet = new HashSet<CyNode>(20000);
-               edgeSet = new HashSet<CyEdge>(20000);
-
                internalNodeCount = 0;
                internalEdgeCount = 0;
                fireAddedNodesAndEdgesEvents = false;
@@ -127,10 +137,11 @@
        public CyNode addNode() {
                final CyNode ret;
                synchronized (this) {
-                       ret = parent.nodeAdd();
-                       updateNode(ret);
+                       CyNodeImpl rootNode = parent.nodeAdd();
+                       updateNode(rootNode);
                        internalNodeCount++;
-                       nodeSet.add(ret);
+                       ret = new CySubNodeImpl(rootNode,nodeTables);
+                       subNodeMap.put(rootNode,ret);
                }
 
                if (fireAddedNodesAndEdgesEvents)
@@ -145,11 +156,13 @@
        public CyEdge addEdge(final CyNode source, final CyNode target, final 
boolean isDirected) {
                // important that it's edgeAdd and not addEdge
                final CyEdge ret;
+                       
                synchronized (this) {
-                       ret = parent.edgeAdd(source, target, isDirected, this);
-                       updateEdge(ret);
+                       CyEdgeImpl rootEdge = parent.edgeAdd(source, target, 
isDirected, this); 
+                       updateEdge(rootEdge);
                        internalEdgeCount++;
-                       edgeSet.add(ret);
+                       ret = new CySubEdgeImpl(rootEdge,edgeTables,subNodeMap);
+                       subEdgeMap.put(rootEdge,ret);
                }
 
                if (fireAddedNodesAndEdgesEvents)
@@ -158,7 +171,39 @@
                return ret;
        }
 
+       private CyNode getRootNode(CyNode node) {
+               if ( node instanceof CySubNodeImpl )
+                       return ((CySubNodeImpl)node).getRootNode();
+               else
+                       return node;    
+       }
 
+       private CyNodeImpl getRootNodeImpl(CyNode node) {
+               if ( node instanceof CySubNodeImpl )
+                       return 
(CyNodeImpl)(((CySubNodeImpl)node).getRootNode());
+               else if ( node instanceof CyNodeImpl )
+                       return (CyNodeImpl)node;
+               else
+                       throw new IllegalArgumentException("unrecognized node 
type");   
+       }
+
+       private CyEdge getRootEdge(CyEdge edge) {
+               if ( edge instanceof CySubEdgeImpl )
+                       return ((CySubEdgeImpl)edge).getRootEdge();
+               else
+                       return edge;    
+       }
+
+       private CyEdgeImpl getRootEdgeImpl(CyEdge edge) {
+               if ( edge instanceof CySubEdgeImpl )
+                       return 
(CyEdgeImpl)(((CySubEdgeImpl)edge).getRootEdge());
+               else if ( edge instanceof CyEdgeImpl )
+                       return (CyEdgeImpl)edge;
+               else
+                       throw new IllegalArgumentException("unrecognized edge 
type");   
+       }
+
+
        /**
         * {@inheritDoc}
         */
@@ -177,35 +222,54 @@
         * {@inheritDoc}
         */
        public synchronized List<CyNode> getNodeList() {
-               return parent.getNodeList(inFirstNode, internalId, 
internalNodeCount);
+               return convertToSubNodes( parent.getNodeList(inFirstNode, 
internalId, internalNodeCount) );
        }
 
+       private List<CyNode> convertToSubNodes(List<CyNode> rootNodes) {
+               List<CyNode> subNodes = new ArrayList<CyNode>(rootNodes.size());
+               for ( CyNode root : rootNodes )
+                       subNodes.add( subNodeMap.get(root) );
+               return subNodes;
+       }
+
+
        /**
         * {@inheritDoc}
         */
        public synchronized List<CyEdge> getEdgeList() {
-               return parent.getEdgeList(inFirstNode, internalId, 
internalEdgeCount);
+               return convertToSubEdges( parent.getEdgeList(inFirstNode, 
internalId, internalEdgeCount) );
        }
 
+       private List<CyEdge> convertToSubEdges(List<CyEdge> rootEdges) {
+               List<CyEdge> subEdges = new ArrayList<CyEdge>(rootEdges.size());
+               for ( CyEdge root : rootEdges )
+                       subEdges.add( subEdgeMap.get(root) );
+               return subEdges;
+       }
+
        /**
         * {@inheritDoc}
         */
        public boolean containsNode(final CyNode node) {
-               return parent.containsNode(node) && nodeSet.contains(node);
+               final CyNode rootNode = getRootNode(node); 
+               return parent.containsNode(rootNode) && 
subNodeMap.containsKey(rootNode);
        }
 
        /**
         * {@inheritDoc}
         */
        public boolean containsEdge(final CyEdge edge) {
-               return parent.containsEdge(edge) && edgeSet.contains(edge);
+               final CyEdge rootEdge = getRootEdge(edge); 
+               return parent.containsEdge(rootEdge) && 
subEdgeMap.containsKey(rootEdge);
        }
 
        /**
         * {@inheritDoc}
         */
        public boolean containsEdge(final CyNode from, final CyNode to) {
-               return containsNode(from) && containsNode(to) && 
parent.containsEdge(from, to, internalId);
+               final CyNode rootFrom = getRootNode(from);
+               final CyNode rootTo = getRootNode(to);
+               return containsNode(rootFrom) && containsNode(rootTo) && 
parent.containsEdge(rootFrom, rootTo, internalId);
        }
 
        /**
@@ -218,10 +282,7 @@
                        return null;
 
                // make sure the subnetwork still contains the node
-               if ( nodeSet.contains(n) )
-                       return n;
-               else
-                       return null;
+               return subNodeMap.get(n);
        }
 
        /**
@@ -234,24 +295,21 @@
                        return null;
 
                // make sure the subnetwork still contains the edge
-               if ( edgeSet.contains(e) )
-                       return e;
-               else
-                       return null;
+               return subEdgeMap.get(e);
        }
 
        /**
         * {@inheritDoc}
         */
        public List<CyNode> getNeighborList(final CyNode node, final 
CyEdge.Type edgeType) {
-               return parent.getNeighborList(node, edgeType, internalId);
+               return convertToSubNodes( 
parent.getNeighborList(getRootNode(node), edgeType, internalId) );
        }
 
        /**
         * {@inheritDoc}
         */
        public List<CyEdge> getAdjacentEdgeList(final CyNode node, final 
CyEdge.Type edgeType) {
-               return parent.getAdjacentEdgeList(node, edgeType, internalId);
+               return convertToSubEdges( 
parent.getAdjacentEdgeList(getRootNode(node), edgeType, internalId) );
        }
 
        /**
@@ -259,23 +317,20 @@
         */
        public List<CyEdge> getConnectingEdgeList(final CyNode source, final 
CyNode target,
                                                  final CyEdge.Type edgeType) {
-               return parent.getConnectingEdgeList(source, target, edgeType, 
internalId);
+               return convertToSubEdges( 
parent.getConnectingEdgeList(getRootNode(source), getRootNode(target), 
edgeType, internalId) );
        }
 
        /**
         * {@inheritDoc}
         */
-       public CyRow getCyRow(final String namespace) {
-               return parent.getCyRow(namespace);
-       }
-
-       /**
-        * {@inheritDoc}
-        */
        public CyRow getCyRow() {
-               return parent.getCyRow();
+               return getCyRow(CyNetwork.DEFAULT_ATTRS);
        }
 
+    public CyRow getCyRow(final String namespace) {
+               return netTables.get(namespace).getRow(internalSUID);
+    }
+
        /**
         * {@inheritDoc}
         */
@@ -283,6 +338,7 @@
                if (node == null)
                        throw new NullPointerException("node is null");
 
+               final CyNode subNode; 
                synchronized (this) {
                        if (containsNode(node))
                                return false;
@@ -292,10 +348,13 @@
 
                        // add node
                        internalNodeCount++;
-                       nodeSet.add(node);
-                       updateNode(node);
+                       final CyNodeImpl rootNode = getRootNodeImpl(node);
+                       subNode = new CySubNodeImpl(rootNode,nodeTables);
+
+                       subNodeMap.put(rootNode,subNode);
+                       updateNode(rootNode);
                }
-               eventHelper.addEventPayload((CyNetwork)this, node, 
AddedNodesEvent.class);
+               eventHelper.addEventPayload((CyNetwork)this, subNode, 
AddedNodesEvent.class);
 
                return true;
        }
@@ -304,6 +363,7 @@
                if (edge == null)
                        throw new NullPointerException("edge is null");
 
+               final CyEdge subEdge; 
                synchronized (this) {
                        if (containsEdge(edge))
                                return false;
@@ -319,11 +379,13 @@
                        addNode(edge.getTarget());
 
                        // add edge
+                       final CyEdgeImpl rootEdge = getRootEdgeImpl(edge);
+                       subEdge = new 
CySubEdgeImpl(rootEdge,edgeTables,subNodeMap);
                        internalEdgeCount++;
-                       edgeSet.add(edge);
-                       updateEdge(edge);
+                       subEdgeMap.put(rootEdge,subEdge);
+                       updateEdge(rootEdge);
                }
-               eventHelper.addEventPayload((CyNetwork)this, edge, 
AddedEdgesEvent.class);
+               eventHelper.addEventPayload((CyNetwork)this, subEdge, 
AddedEdgesEvent.class);
 
                return true;
        }
@@ -342,18 +404,21 @@
 
                synchronized (this) {
                        for (CyNode n : nodes) {
-
+                               //System.out.println("removing node: " + n);
+                               
                                if (!containsNode(n))
                                        return false;
 
                                // remove adjacent edges
                                removeEdgesInternal(getAdjacentEdgeList(n, 
CyEdge.Type.ANY));
+       
+                               final CyNode rootNode = getRootNode(n);
 
-                               final NodePointer node = 
parent.getNodePointer(n);
+                               final NodePointer node = 
parent.getNodePointer(rootNode);
                                inFirstNode = 
node.remove(inFirstNode,internalId);
 
                                internalNodeCount--;
-                               nodeSet.remove(n);
+                               subNodeMap.remove(rootNode);
                        }
                }
 
@@ -386,28 +451,42 @@
 
        // should be called from within a synchronized block
        private boolean removeEdgesInternal(Collection<CyEdge> edges) {
+               //System.out.println("removeEdgesInternal edges size: " + 
edges.size());
                for (CyEdge edge : edges) {
-                       if (!containsEdge(edge))
+                       if (!containsEdge(edge)) {
+                               //System.out.println("doesn't contain edge: " + 
edge);
                                return false;
+                       }
 
-                       final EdgePointer e = parent.getEdgePointer(edge);
-
+                       CyEdge rootEdge = getRootEdge(edge);
+                       final EdgePointer e = parent.getEdgePointer(rootEdge);
+       
                        e.remove(internalId);
 
                        internalEdgeCount--;
-                       edgeSet.remove(edge);
+                       subEdgeMap.remove(rootEdge);
                }
+               //System.out.println("theoretically removed appropriate edges");
                return true;
        }
 
        @Override
        public void handleEvent(final NetworkAddedEvent e) {
                if (e.getNetwork() == this) {
-                       parent.registerAllTables();
+                       registerAllTables();
                        fireAddedNodesAndEdgesEvents = true;
                }
        }
 
+       private void registerAllTables() {
+        for (final CyTable table : netTables.values())
+            tableMgr.addTable(table);
+        for (final CyTable table : nodeTables.values())
+            tableMgr.addTable(table);
+        for (final CyTable table : edgeTables.values())
+            tableMgr.addTable(table);
+       }
+
        /**
         * Tests object for equality with this object.
         * @param o The object to test for equality.
@@ -433,14 +512,18 @@
        }
 
        public CyTable getDefaultNetworkTable() {
-               return parent.getDefaultNetworkTable();
+               return netTables.get(CyNetwork.DEFAULT_ATTRS); 
        }
 
        public CyTable getDefaultNodeTable() {
-               return parent.getDefaultNodeTable();
+               return nodeTables.get(CyNetwork.DEFAULT_ATTRS); 
        }
 
        public CyTable getDefaultEdgeTable() {
-               return parent.getDefaultEdgeTable();
+               return edgeTables.get(CyNetwork.DEFAULT_ATTRS); 
        }
+
+       public String toString() {
+               return "CyNetwork: " + internalSUID + " name: " + 
getCyRow().get("name", String.class); 
+       }
 }

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyEdgeImpl.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyEdgeImpl.java
 2011-08-30 19:24:24 UTC (rev 26654)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyEdgeImpl.java
 2011-08-30 19:59:33 UTC (rev 26655)
@@ -49,8 +49,8 @@
        final private int index;
        final private boolean directed;
 
-       CyEdgeImpl(CyNode src, CyNode tgt, boolean dir, int ind, Map<String, 
CyTable> attrMgr) {
-               super(attrMgr);
+       CyEdgeImpl(CyNode src, CyNode tgt, boolean dir, int ind, final 
Map<String,CyTable> table) {
+               super(table);
                source = src;
                target = tgt;
                directed = dir;

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyNodeImpl.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyNodeImpl.java
 2011-08-30 19:24:24 UTC (rev 26654)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyNodeImpl.java
 2011-08-30 19:59:33 UTC (rev 26655)
@@ -46,8 +46,8 @@
        private CyNetwork nestedNet;
        final private CyEventHelper eventHelper;
 
-       CyNodeImpl(int ind, Map<String, CyTable> attrMgr, final CyEventHelper 
eventHelper) {
-               super(attrMgr);
+       CyNodeImpl(int ind, final Map<String,CyTable> table, final 
CyEventHelper eventHelper) {
+               super(table);
                index = ind;
                nestedNet = null;
                this.eventHelper = eventHelper;

Added: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubEdgeImpl.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubEdgeImpl.java
                              (rev 0)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubEdgeImpl.java
      2011-08-30 19:59:33 UTC (rev 26655)
@@ -0,0 +1,78 @@
+/*
+ Copyright (c) 2008, 2010, The Cytoscape Consortium (www.cytoscape.org)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2.1 of the License, or
+ any later version.
+
+ This library is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  The software and
+ documentation provided hereunder is on an "as is" basis, and the
+ Institute for Systems Biology and the Whitehead Institute
+ have no obligations to provide maintenance, support,
+ updates, enhancements or modifications.  In no event shall the
+ Institute for Systems Biology and the Whitehead Institute
+ be liable to any party for direct, indirect, special,
+ incidental or consequential damages, including lost profits, arising
+ out of the use of this software and its documentation, even if the
+ Institute for Systems Biology and the Whitehead Institute
+ have been advised of the possibility of such damage.  See
+ the GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+package org.cytoscape.model.internal;
+
+
+import org.cytoscape.event.CyEventHelper;
+import org.cytoscape.model.CyEdge;
+import org.cytoscape.model.CyNetwork;
+import org.cytoscape.model.CyNode;
+import org.cytoscape.model.CyRow;
+import org.cytoscape.model.CyTable;
+import org.cytoscape.model.events.SetNestedNetworkEvent;
+import org.cytoscape.model.events.UnsetNestedNetworkEvent;
+
+import java.util.List;
+import java.util.Map;
+
+
+class CySubEdgeImpl extends CyTableEntryImpl implements CyEdge {
+
+       private final CyEdgeImpl rootEdge;
+       private final Map<CyNode,CyNode> subNodeMap;
+
+       CySubEdgeImpl(CyEdgeImpl rootEdge, Map<String,CyTable> edgeTable, 
Map<CyNode,CyNode> subNodeMap) {
+               super(edgeTable, rootEdge.getSUID());
+               this.rootEdge = rootEdge;
+               this.subNodeMap = subNodeMap;
+       }
+
+       public int getIndex() {
+               return rootEdge.getIndex();
+       }
+
+       public String toString() {
+               return rootEdge.toString(); 
+       }
+
+       public CyNode getSource() {
+               return subNodeMap.get(rootEdge.getSource());
+       }
+
+       public CyNode getTarget() {
+               return subNodeMap.get(rootEdge.getTarget());
+       }
+
+       public boolean isDirected() {
+               return rootEdge.isDirected();
+       }
+
+       public CyEdge getRootEdge() {
+               return rootEdge;
+       }
+}

Added: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubNodeImpl.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubNodeImpl.java
                              (rev 0)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubNodeImpl.java
      2011-08-30 19:59:33 UTC (rev 26655)
@@ -0,0 +1,72 @@
+/*
+ Copyright (c) 2008, 2010, The Cytoscape Consortium (www.cytoscape.org)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2.1 of the License, or
+ any later version.
+
+ This library is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  The software and
+ documentation provided hereunder is on an "as is" basis, and the
+ Institute for Systems Biology and the Whitehead Institute
+ have no obligations to provide maintenance, support,
+ updates, enhancements or modifications.  In no event shall the
+ Institute for Systems Biology and the Whitehead Institute
+ be liable to any party for direct, indirect, special,
+ incidental or consequential damages, including lost profits, arising
+ out of the use of this software and its documentation, even if the
+ Institute for Systems Biology and the Whitehead Institute
+ have been advised of the possibility of such damage.  See
+ the GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+package org.cytoscape.model.internal;
+
+
+import org.cytoscape.event.CyEventHelper;
+import org.cytoscape.model.CyEdge;
+import org.cytoscape.model.CyNetwork;
+import org.cytoscape.model.CyNode;
+import org.cytoscape.model.CyRow;
+import org.cytoscape.model.CyTable;
+import org.cytoscape.model.events.SetNestedNetworkEvent;
+import org.cytoscape.model.events.UnsetNestedNetworkEvent;
+
+import java.util.List;
+import java.util.Map;
+
+
+class CySubNodeImpl extends CyTableEntryImpl implements CyNode {
+
+       private final CyNodeImpl rootNode;
+
+       CySubNodeImpl(CyNodeImpl rootNode, Map<String,CyTable> nodeTable) {
+               super(nodeTable, rootNode.getSUID());
+               this.rootNode = rootNode;
+       }
+
+       public int getIndex() {
+               return rootNode.getIndex();
+       }
+
+       public String toString() {
+               return "SUBNODE of : " + rootNode.toString(); 
+       }
+
+       public CyNetwork getNetwork() {
+               return rootNode.getNetwork();
+       }
+
+       public void setNetwork(final CyNetwork n) {
+               rootNode.setNetwork(n);
+       }
+
+       public CyNode getRootNode() {
+               return rootNode;
+       }
+}

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableEntryImpl.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableEntryImpl.java
   2011-08-30 19:24:24 UTC (rev 26654)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableEntryImpl.java
   2011-08-30 19:59:33 UTC (rev 26655)
@@ -42,13 +42,17 @@
        private final long suid;
        private final Map<String, CyTable> attrMgr;
 
-       CyTableEntryImpl(final Map<String, CyTable> attrMgr) {
-               suid = SUIDFactory.getNextSUID();
+       CyTableEntryImpl(final Map<String, CyTable> attrMgr, long suid) {
+               this.suid = suid;
                this.attrMgr = attrMgr;
                getCyRow().set(CyTableEntry.NAME, "");
                getCyRow().set(CyNetwork.SELECTED, Boolean.FALSE);
        }
 
+       CyTableEntryImpl(final Map<String, CyTable> attrMgr) {
+               this(attrMgr,SUIDFactory.getNextSUID());
+       }
+
        final public long getSUID() {
                return suid;
        }

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableImpl.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableImpl.java
        2011-08-30 19:24:24 UTC (rev 26654)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableImpl.java
        2011-08-30 19:59:33 UTC (rev 26655)
@@ -1000,8 +1000,7 @@
 
                @Override
                public Map<String, Object> getAllValues() {
-                       final Map<String, Object> nameToValueMap =
-                               new HashMap<String, Object>(types.size());
+                       final Map<String, Object> nameToValueMap = new 
HashMap<String, Object>(types.size());
                        for (final CyColumn column : types.values()) {
                                final String columnName = column.getName();
                                final Class<?> type = column.getType();
@@ -1020,13 +1019,16 @@
                        return CyTableImpl.this;
                }
 
-               @Override
+//             @Override
                public String toString() {
+                       return  "Table: " + title + " SUID: " + suid + " 
isImmutable: " + isImmutable + " public: " + pub;
+               /*
                        final StringBuilder builder = new StringBuilder();
                        final Map<String, Object> allVal = getAllValues();
                        for(String key: getAllValues().keySet())
                                builder.append(key + " = " + allVal.get(key) + 
", ");
                        return builder.toString();
+                       */
                }
        }
 }

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableManagerImpl.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableManagerImpl.java
 2011-08-30 19:24:24 UTC (rev 26654)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyTableManagerImpl.java
 2011-08-30 19:59:33 UTC (rev 26655)
@@ -27,14 +27,8 @@
 */
 package org.cytoscape.model.internal;
 
+import org.cytoscape.event.CyEventHelper;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.cytoscape.event.CyEventHelper;
 import org.cytoscape.model.CyEdge;
 import org.cytoscape.model.CyNetwork;
 import org.cytoscape.model.CyNode;
@@ -47,21 +41,32 @@
 import org.cytoscape.model.events.TableAboutToBeDeletedEvent;
 import org.cytoscape.model.events.TableAddedEvent;
 import org.cytoscape.model.events.TableDeletedEvent;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
 
+
 /**
  * An interface describing a factory used for managing {@link CyTable} objects.
  * This class will be provided as a service through Spring/OSGi.
  */
 public class CyTableManagerImpl implements CyTableManager, 
NetworkAboutToBeDestroyedListener {
        private static final Logger logger = 
LoggerFactory.getLogger(CyTableManagerImpl.class);
-
        private final CyEventHelper eventHelper;
        private final Map<Class<?>, Map<CyNetwork, Map<String, CyTable>>> 
networkTableMap;
        private final Map<Long, CyTable> tables;
 
+       /**
+        * Creates a new CyTableManagerImpl object.
+        *
+        * @param eventHelper  DOCUMENT ME!
+        */
        public CyTableManagerImpl(final CyEventHelper eventHelper) {
                this.eventHelper = eventHelper;
 
@@ -73,61 +78,133 @@
                tables = new HashMap<Long, CyTable>();
        }
 
+       /**
+        *  DOCUMENT ME!
+        */
        @Override
-               public synchronized void reset() {
-                       networkTableMap.clear();
-                       tables.clear();
-               }
+       public synchronized void reset() {
+               networkTableMap.clear();
+               tables.clear();
+       }
 
+       /**
+        *  DOCUMENT ME!
+        *
+        * @param graphObjectType DOCUMENT ME!
+        * @param network DOCUMENT ME!
+        *
+        * @return  DOCUMENT ME!
+        */
        @Override
-               public synchronized Map<String, CyTable> getTableMap(final 
Class<?> graphObjectType, final CyNetwork network) {
-                       if (network == null || graphObjectType == null)
-                               return null;
+       public synchronized Map<String, CyTable> getTableMap(final Class<?> 
graphObjectType,
+                                                            final CyNetwork 
network) {
+               if ((network == null) || (graphObjectType == null)) {
+                       return null;
+               }
 
-                       Map<CyNetwork, Map<String, CyTable>> tmap = 
networkTableMap.get(graphObjectType);
+               Map<CyNetwork, Map<String, CyTable>> tmap = 
networkTableMap.get(graphObjectType);
 
-                       if (tmap == null)
-                               throw new IllegalArgumentException("no data 
tables of type: " + graphObjectType + " exist");
+               if (tmap == null) {
+                       throw new IllegalArgumentException("no data tables of 
type: " + graphObjectType
+                                                          + " exist");
+               }
 
-                       return 
networkTableMap.get(graphObjectType).get(network);
+               return tmap.get(network);
+       }
+
+       /**
+        *  DOCUMENT ME!
+        *
+        * @param graphObjectType DOCUMENT ME!
+        * @param network DOCUMENT ME!
+        * @param table DOCUMENT ME!
+        */
+       public void addNetworkTable(Class<?> graphObjectType, final CyNetwork 
network,
+                                   final CyTable table) {
+               if (network == null) {
+                       throw new NullPointerException("CyNetwork is null");
                }
 
+               if (graphObjectType == null) {
+                       throw new NullPointerException("Type is null");
+               }
+
+               if (table == null) {
+                       throw new NullPointerException("Table is null");
+               }
+
+               if (!networkTableMap.containsKey(graphObjectType)) {
+                       networkTableMap.put(graphObjectType, new 
HashMap<CyNetwork, Map<String, CyTable>>());
+               }
+
+               Map<CyNetwork, Map<String, CyTable>> tmap = 
networkTableMap.get(graphObjectType);
+               Map<String, CyTable> tm = new HashMap<String, CyTable>();
+               tm.put(CyNetwork.DEFAULT_ATTRS, table);
+
+               tmap.put(network, tm);
+       }
+
+       /**
+        *  DOCUMENT ME!
+        *
+        * @param graphObjectType DOCUMENT ME!
+        * @param network DOCUMENT ME!
+        * @param tm DOCUMENT ME!
+        */
        public synchronized void setTableMap(final Class<?> graphObjectType, 
final CyNetwork network,
-                                            final Map<String, CyTable> tm) {
-               if (network == null)
+                                            final Map<String, CyTable> tm) {
+               if (network == null) {
                        throw new NullPointerException("CyNetwork is null");
-               if (graphObjectType == null)
+               }
+
+               if (graphObjectType == null) {
                        throw new NullPointerException("Type is null");
+               }
 
-               if (!networkTableMap.containsKey(graphObjectType))
+               if (!networkTableMap.containsKey(graphObjectType)) {
                        networkTableMap.put(graphObjectType, new 
HashMap<CyNetwork, Map<String, CyTable>>());
+               }
 
                Map<CyNetwork, Map<String, CyTable>> tmap = 
networkTableMap.get(graphObjectType);
 
-               if (tm == null)
+               if (tm == null) {
                        tmap.remove(network);
-               else
+               } else {
                        tmap.put(network, tm);
+               }
        }
 
-       @Override
+       /**
+        *  DOCUMENT ME!
+        *
+        * @param t DOCUMENT ME!
+        */
        public synchronized void addTable(final CyTable t) {
-               if (t == null)
+               if (t == null) {
                        throw new NullPointerException("added table is null");
+               }
 
                tables.put(t.getSUID(), t);
                eventHelper.fireEvent(new TableAddedEvent(this, t));
        }
 
-
+       /**
+        *  DOCUMENT ME!
+        *
+        * @param includePrivate DOCUMENT ME!
+        *
+        * @return  DOCUMENT ME!
+        */
        @Override
        public synchronized Set<CyTableMetadata> getAllTables(final boolean 
includePrivate) {
                Set<CyTableMetadata> res = new HashSet<CyTableMetadata>();
 
                for (Long key : tables.keySet()) {
-                       if (includePrivate || tables.get(key).isPublic())
+                       if (includePrivate || tables.get(key).isPublic()) {
                                res.add(createMetadata(tables.get(key)));
+                       }
                }
+
                return res;
        }
 
@@ -135,14 +212,19 @@
                Class<?> entryType = null;
                String entryNamespace = null;
                Set<CyNetwork> networks = new HashSet<CyNetwork>();
-               for (Entry<Class<?>, Map<CyNetwork, Map<String, CyTable>>> 
mapEntry : networkTableMap.entrySet()) {
+
+               for (Entry<Class<?>, Map<CyNetwork, Map<String, CyTable>>> 
mapEntry : networkTableMap
+                                                                               
                                                                                
                                                                 .entrySet()) {
                        Class<?> type = mapEntry.getKey();
                        Map<CyNetwork, Map<String, CyTable>> networkMap = 
mapEntry.getValue();
+
                        for (Entry<CyNetwork, Map<String, CyTable>> entry : 
networkMap.entrySet()) {
                                CyNetwork network = entry.getKey();
+
                                for (Entry<String, CyTable> tableEntry : 
entry.getValue().entrySet()) {
                                        String namespace = tableEntry.getKey();
                                        CyTable table = tableEntry.getValue();
+
                                        if (table.getSUID() == 
cyTable.getSUID()) {
                                                entryType = type;
                                                entryNamespace = namespace;
@@ -151,12 +233,21 @@
                                }
                        }
                }
-               if (networks.size() > 0)
+
+               if (networks.size() > 0) {
                        return new CyTableMetadataImpl(entryType, cyTable, 
networks, entryNamespace);
+               }
 
                return new CyTableMetadataImpl(null, cyTable, networks, null);
        }
 
+       /**
+        *  DOCUMENT ME!
+        *
+        * @param suid DOCUMENT ME!
+        *
+        * @return  DOCUMENT ME!
+        */
        @Override
        public synchronized CyTable getTable(final long suid) {
                return tables.get(suid);
@@ -164,41 +255,63 @@
 
        void deleteTableInternal(final long suid, boolean force) {
                CyTableImpl table;
+
                synchronized (this) {
                        table = (CyTableImpl) tables.get(suid);
-                       if (table == null)
+
+                       if (table == null) {
                                return;
+                       }
                }
 
                eventHelper.fireEvent(new TableAboutToBeDeletedEvent(this, 
table));
 
                synchronized (this) {
                        table = (CyTableImpl) tables.get(suid);
-                       if (table == null)
+
+                       if (table == null) {
                                return;
+                       }
 
-                       if (!force && table.getMutability() != 
Mutability.MUTABLE)
+                       if (!force && (table.getMutability() != 
Mutability.MUTABLE)) {
                                throw new IllegalArgumentException("can't 
delete an immutable table!");
+                       }
 
                        table.removeAllVirtColumns();
                        tables.remove(suid);
                }
+
                eventHelper.fireEvent(new TableDeletedEvent(this));
 
                logger.debug("CyTable removed: table ID = " + table.getSUID());
                table = null;
        }
 
+       private static final Class[] tableTypes = new Class[] {
+                                                     CyNetwork.class, 
CyNode.class, CyEdge.class
+                                                 };
+
+       /**
+        *  DOCUMENT ME!
+        *
+        * @param e DOCUMENT ME!
+        */
        @Override
        public void handleEvent(NetworkAboutToBeDestroyedEvent e) {
                CyNetwork network = e.getNetwork();
-               for (Class<?> type : new Class[] { CyNetwork.class, 
CyNode.class, CyEdge.class }) {
+
+               for (Class<?> type : tableTypes) {
                        for (CyTable table : getTableMap(type, 
network).values()) {
                                deleteTableInternal(table.getSUID(), true);
                        }
                }
        }
 
+       /**
+        *  DOCUMENT ME!
+        *
+        * @param suid DOCUMENT ME!
+        */
        @Override
        public void deleteTable(long suid) {
                deleteTableInternal(suid, false);

-- 
You received this message because you are subscribed to the Google Groups 
"cytoscape-cvs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/cytoscape-cvs?hl=en.

Reply via email to