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.