Author: mes
Date: 2012-03-02 12:19:35 -0800 (Fri, 02 Mar 2012)
New Revision: 28417

Modified:
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyRootNetworkImpl.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubNetworkImpl.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/SimpleNetwork.java
Log:
fixed a tricky synchronization problem happening between SimpleNetwork and 
CySubNetworkImpl where SimpleNetwork.removeNodes meant to be calling 
SimpleNetwork.removeEdges, but was actually call CySubNetworkImpl.removeEdges, 
which was causing events to be fired while SimpleNetwork still held a lock.  
The SimpleNetwork methods were renamed to remove ambiguity.

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyRootNetworkImpl.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyRootNetworkImpl.java
  2012-03-02 20:15:53 UTC (rev 28416)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyRootNetworkImpl.java
  2012-03-02 20:19:35 UTC (rev 28417)
@@ -166,7 +166,7 @@
 
                synchronized (this) {
                        node = new CyNodeImpl( SUIDFactory.getNextSUID(), 
getNextNodeIndex(), eventHelper );
-                       super.addNodeInternal( node );
+                       addNodeInternal( node );
                }
 
                return node; 
@@ -176,7 +176,7 @@
        public synchronized boolean removeNodes(final Collection<CyNode> nodes) 
{
                for ( CySubNetwork sub : subNetworks )
                        sub.removeNodes(nodes);
-               return super.removeNodes(nodes);
+               return removeNodesInternal(nodes);
        }
 
        @Override
@@ -186,7 +186,7 @@
 
                synchronized (this) {
                        edge = new CyEdgeImpl(SUIDFactory.getNextSUID(), s, t, 
directed, getNextEdgeIndex());
-                       super.addEdgeInternal(s,t, directed, edge);
+                       addEdgeInternal(s,t, directed, edge);
                }
 
                return edge; 
@@ -196,7 +196,7 @@
        public synchronized boolean removeEdges(final Collection<CyEdge> edges) 
{
                for ( CySubNetwork sub : subNetworks )
                        sub.removeEdges(edges);
-               return super.removeEdges(edges);
+               return removeEdgesInternal(edges);
        }
 
        @Override

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubNetworkImpl.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubNetworkImpl.java
   2012-03-02 20:15:53 UTC (rev 28416)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubNetworkImpl.java
   2012-03-02 20:19:35 UTC (rev 28417)
@@ -108,7 +108,7 @@
                        // first add a node to the root network
                        ret = parent.addNode();
                        // then add the resulting CyNode to this network
-                       super.addNodeInternal(ret);
+                       addNodeInternal(ret);
                }
 
                if (fireAddedNodesAndEdgesEvents)
@@ -129,7 +129,7 @@
                        if (!parent.containsNode(node))
                                throw new IllegalArgumentException("node is not 
contained in parent network!");
 
-                       super.addNodeInternal(node);
+                       addNodeInternal(node);
 
                        // add node
                        copyDefaultAttrs(parent.getRow(node), 
this.getRow(node));
@@ -150,7 +150,7 @@
                        // first add an edge to the root network
                        ret = parent.addEdge(source, target, isDirected);
                        // then add the resulting CyEdge to this network
-                       super.addEdgeInternal(source,target,isDirected,ret);
+                       addEdgeInternal(source,target,isDirected,ret);
                }
 
                if (fireAddedNodesAndEdgesEvents)
@@ -179,7 +179,7 @@
                        addNode(edge.getTarget());
 
                        // add edge
-                       
super.addEdgeInternal(edge.getSource(),edge.getTarget(),edge.isDirected(),edge);
+                       
addEdgeInternal(edge.getSource(),edge.getTarget(),edge.isDirected(),edge);
 
                        copyDefaultAttrs(parent.getRow(edge), 
this.getRow(edge));
                        copyDefaultEdgeAttrs(parent.getRow(edge), 
this.getRow(edge));
@@ -207,7 +207,7 @@
 
                eventHelper.fireEvent(new AboutToRemoveNodesEvent(this, nodes));
 
-               boolean ret = super.removeNodes(nodes);
+               boolean ret = removeNodesInternal(nodes);
 
                if ( ret )
                        eventHelper.fireEvent(new RemovedNodesEvent(this));
@@ -224,7 +224,7 @@
                // since this is only a notification, maybe that's OK.
                eventHelper.fireEvent(new AboutToRemoveEdgesEvent(this, edges));
 
-               boolean ret = super.removeEdges(edges);
+               boolean ret = removeEdgesInternal(edges);
 
                if ( ret )
                        eventHelper.fireEvent(new RemovedEdgesEvent(this));

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/SimpleNetwork.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/SimpleNetwork.java
      2012-03-02 20:15:53 UTC (rev 28416)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/SimpleNetwork.java
      2012-03-02 20:19:35 UTC (rev 28417)
@@ -110,15 +110,13 @@
                int numRemaining = nodeCount;
                NodePointer node = firstNode;
 
-               synchronized (this) {
-                       while (numRemaining > 0) {
-                               // possible NPE here if the linked list isn't 
constructed correctly
-                               // this is the correct behavior
-                               final CyNode toAdd = node.cyNode;
-                               node = node.nextNode;
-                               ret.add(toAdd);
-                               numRemaining--;
-                       }
+               while (numRemaining > 0) {
+                       // possible NPE here if the linked list isn't 
constructed correctly
+                       // this is the correct behavior
+                       final CyNode toAdd = node.cyNode;
+                       node = node.nextNode;
+                       ret.add(toAdd);
+                       numRemaining--;
                }
 
                return ret;
@@ -128,28 +126,26 @@
                final List<CyEdge> ret = new ArrayList<CyEdge>(edgeCount);
                EdgePointer edge = null;
 
-               synchronized (this) {
-                       int numRemaining = edgeCount;
-                       NodePointer node = firstNode;
-                       while (numRemaining > 0) {
-                               final CyEdge retEdge;
+               int numRemaining = edgeCount;
+               NodePointer node = firstNode;
+               while (numRemaining > 0) {
+                       final CyEdge retEdge;
 
-                               if (edge != null) {
-                                       retEdge = edge.cyEdge;
-                               } else {
-                                       for (edge = node.firstOutEdge; 
-                                            edge == null; 
-                                            node = node.nextNode, edge = 
node.firstOutEdge);
+                       if (edge != null) {
+                               retEdge = edge.cyEdge;
+                       } else {
+                               for (edge = node.firstOutEdge; 
+                                    edge == null; 
+                                    node = node.nextNode, edge = 
node.firstOutEdge);
 
-                                       node = node.nextNode;
-                                       retEdge = edge.cyEdge;
-                               }
+                               node = node.nextNode;
+                               retEdge = edge.cyEdge;
+                       }
 
-                               edge = edge.nextOutEdge;
-                               numRemaining--;
+                       edge = edge.nextOutEdge;
+                       numRemaining--;
 
-                               ret.add(retEdge);
-                       }
+                       ret.add(retEdge);
                }
 
                return ret;
@@ -239,7 +235,9 @@
                return node; 
        }
 
-       public boolean removeNodes(final Collection<CyNode> nodes) {
+       protected boolean removeNodesInternal(final Collection<CyNode> nodes) {
+               if (nodes == null || nodes.isEmpty())
+                       return false;
 
                synchronized (this) {
                        for ( CyNode n : nodes ) {
@@ -247,7 +245,7 @@
                                        return false;
 
                                // remove adjacent edges from network
-                               removeEdges(getAdjacentEdgeList(n, 
CyEdge.Type.ANY));
+                               removeEdgesInternal(getAdjacentEdgeList(n, 
CyEdge.Type.ANY));
        
                                final NodePointer node = 
nodePointers.remove(n.getIndex());
                                firstNode = node.remove(firstNode);
@@ -289,7 +287,7 @@
                return edge; 
        }
 
-       public boolean removeEdges(final Collection<CyEdge> edges) {
+       protected boolean removeEdgesInternal(final Collection<CyEdge> edges) {
                if ( edges == null || edges.isEmpty() )
                        return 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