Author: clopes
Date: 2012-04-24 14:03:53 -0700 (Tue, 24 Apr 2012)
New Revision: 28972
Modified:
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/xgmml/XGMMLWriter.java
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/read/xgmml/XGMMLNetworkReaderTest.java
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/XGMMLWriterTest.java
Log:
XGMML Writer: adds the "cy:private" attribute to graph tags (private means that
the network is not registered); more unit tests.
Modified:
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/xgmml/XGMMLWriter.java
===================================================================
---
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/xgmml/XGMMLWriter.java
2012-04-24 20:47:18 UTC (rev 28971)
+++
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/xgmml/XGMMLWriter.java
2012-04-24 21:03:53 UTC (rev 28972)
@@ -123,6 +123,7 @@
private final OutputStream outputStream;
private final CyNetwork network;
+ private final CyRootNetwork rootNetwork;
private Set<CySubNetwork> subNetworks;
private CyNetworkView networkView;
private String visualStyleName;
@@ -166,11 +167,11 @@
this.visualLexicon =
renderingEngineMgr.getDefaultVisualLexicon();
if (network instanceof CyRootNetwork) {
- CyRootNetwork rootNetwork = (CyRootNetwork) network;
- this.network = rootNetwork;
+ this.network = this.rootNetwork = (CyRootNetwork)
network;
this.subNetworks =
getRegisteredSubNetworks(rootNetwork);
} else {
this.network = network;
+ this.rootNetwork =
rootNetworkMgr.getRootNetwork(network);
this.subNetworks = new HashSet<CySubNetwork>();
}
@@ -256,6 +257,8 @@
if (networkView != null) {
writeAttributePair("cy:networkId", network.getSUID());
writeAttributePair("cy:visualStyle", visualStyleName);
+ } else {
+ writeAttributePair("cy:private",
ObjectTypeMap.toXGMMLBoolean(!isRegistered(network)));
}
} else {
// Only if exporting to standard XGMML
@@ -353,40 +356,63 @@
private void writeSubGraph(final CyNetwork net) throws IOException {
if (writtenNetMap.containsKey(net)) {
// This sub-network has already been written
- writeSubGraphReference("#" + net.getSUID());
+ writeSubGraphReference(net);
} else {
- // Write it for the first time
- writtenNetMap.put(net, net);
+ // Check if this network is from the same root network
as the base network
+ final CyRootNetwork otherRoot =
rootNetworkMgr.getRootNetwork(net);
+ boolean sameRoot = rootNetwork.equals(otherRoot);
- writeElement("<att>\n");
- depth++;
- writeElement("<graph");
- // Always write the network ID
- writeAttributePair("id", net.getSUID());
- // Save the label to make it more human readable
- writeAttributePair("label", getLabel(net, net));
- write(">\n");
- depth++;
-
- writeAttributes(net.getRow(net));
-
- for (CyNode childNode : net.getNodeList())
- writeNode(net, childNode);
- for (CyEdge childEdge : net.getEdgeList())
- writeEdge(net, childEdge);
-
- depth--;
- writeElement("</graph>\n");
- depth--;
- writeElement("</att>\n");
+ if (sameRoot) {
+ // Write it for the first time
+ writtenNetMap.put(net, net);
+
+ writeElement("<att>\n");
+ depth++;
+ writeElement("<graph");
+ // Always write the network ID
+ writeAttributePair("id", net.getSUID());
+ // Save the label to make it more human readable
+ writeAttributePair("label", getLabel(net, net));
+ // Unregistered networks are saved as "private"
+ writeAttributePair("cy:private",
ObjectTypeMap.toXGMMLBoolean(!isRegistered(net)));
+ write(">\n");
+ depth++;
+
+ writeAttributes(net.getRow(net));
+
+ for (CyNode childNode : net.getNodeList())
+ writeNode(net, childNode);
+ for (CyEdge childEdge : net.getEdgeList())
+ writeEdge(net, childEdge);
+
+ depth--;
+ writeElement("</graph>\n");
+ depth--;
+ writeElement("</att>\n");
+ } else if (sessionFormat) {
+ // This network belongs to another XGMML file,
but that's ok because this XGMML is part of a CYS file,
+ // which means that both files will be saved.
+ writeSubGraphReference(net);
+ }
}
}
- private void writeSubGraphReference(final String netId) throws
IOException {
+ private void writeSubGraphReference(CyNetwork net) throws IOException {
+ String href = "#" + net.getSUID();
+ final CyRootNetwork otherRoot =
rootNetworkMgr.getRootNetwork(net);
+ final boolean sameRoot = rootNetwork.equals(otherRoot);
+
+ if (!sameRoot) {
+ // This network belongs to another XGMML file,
+ // so add the other root-network's file name to the
XLink URI
+ final String fileName =
SessionUtil.getXGMMLFilename(otherRoot);
+ href = fileName + href;
+ }
+
writeElement("<att>\n");
depth++;
writeElement("<graph");
- writeAttributePair("xlink:href", netId);
+ writeAttributePair("xlink:href", href);
write("/>\n");
depth--;
writeElement("</att>\n");
@@ -464,24 +490,14 @@
writeAttributes(net.getRow(node));
// Write node's sub-graph:
- if (sessionFormat) {
- if (netPointer != null) {
- // Write the network pointer as
a sub-graph reference (XLink)...
- CyRootNetwork netPointerRoot =
rootNetworkMgr.getRootNetwork(netPointer);
-
- // This sub-network has already
been written or belongs to another XGMML file...
- String linkId = "#" +
netPointer.getSUID();
- boolean sameRoot =
netPointerRoot.equals(rootNetworkMgr.getRootNetwork(net));
-
- if (!sameRoot) {
- // This XGMML file will
be saved as part of a CYS file,
- // and the sub-network
does NOT belong to the same root-network
- // ...So add the other
root-network's file name to the XLink URI
- final String fileName =
SessionUtil.getXGMMLFilename(netPointerRoot);
- linkId = fileName +
linkId;
- }
-
- writeSubGraphReference(linkId);
+ if (netPointer != null) {
+ if (sessionFormat &&
this.subNetworks.contains(netPointer)) {
+ // Because this network is
registered (is also a child network), just write the reference.
+ // The content will be saved
later, under the root graph
+ // (it's important to save the
child network graphs in the correct order).
+
writeSubGraphReference(netPointer);
+ } else {
+ writeSubGraph(netPointer);
}
}
@@ -992,20 +1008,24 @@
}
/**
- * @param rootNetwork
+ * @param rootNet
* @return A set with all the sub-networks that are registered in the
network manager.
*/
- private Set<CySubNetwork> getRegisteredSubNetworks(CyRootNetwork
rootNetwork) {
- List<CySubNetwork> subNetList = rootNetwork.getSubNetworkList();
+ private Set<CySubNetwork> getRegisteredSubNetworks(CyRootNetwork rootNet) {
+ List<CySubNetwork> subNetList = rootNet.getSubNetworkList();
Set<CySubNetwork> registeredSubNetSet = new
LinkedHashSet<CySubNetwork>();
- registeredSubNetSet.add(rootNetwork.getBaseNetwork()); // The
base network must be the first one!
+ registeredSubNetSet.add(rootNet.getBaseNetwork()); // The base
network must be the first one!
for (CySubNetwork sn : subNetList) {
- if (networkMgr.networkExists(sn.getSUID()))
+ if (isRegistered(sn))
registeredSubNetSet.add(sn);
}
return registeredSubNetSet;
}
+
+ private boolean isRegistered(CyNetwork net) {
+ return networkMgr.networkExists(net.getSUID());
+ }
}
Modified:
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/read/xgmml/XGMMLNetworkReaderTest.java
===================================================================
---
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/read/xgmml/XGMMLNetworkReaderTest.java
2012-04-24 20:47:18 UTC (rev 28971)
+++
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/read/xgmml/XGMMLNetworkReaderTest.java
2012-04-24 21:03:53 UTC (rev 28972)
@@ -116,12 +116,15 @@
// Test 2.x group parsed as network pointer
CyNode gn = null;
+ int npCount = 0;
for (CyNode n : net.getNodeList()) {
- if (net.getRow(n,
CyNetwork.HIDDEN_ATTRS).isSet("__groupState"))
+ if (net.getRow(n,
CyNetwork.HIDDEN_ATTRS).isSet("__groupState")) {
gn = n;
- else // This test has no regular nested networks!
+ if (++npCount > 1) fail("There should be only
one group node!");
+ } else { // The other nodes have no network pointer!
assertNull(n.getNetworkPointer());
+ }
}
assertNotNull("The group node cannot be found", gn);
@@ -144,12 +147,15 @@
// Test 2.x group parsed as network pointer
CyNode gn = null;
+ int npCount = 0;
for (CyNode n : net.getNodeList()) {
- if (net.getRow(n,
CyNetwork.HIDDEN_ATTRS).isSet("__groupState"))
+ if (net.getRow(n,
CyNetwork.HIDDEN_ATTRS).isSet("__groupState")) {
gn = n;
- else // This test has no regular nested networks!
+ if (++npCount > 1) fail("There should be only
one group node!");
+ } else { // The other nodes have no network pointer!
assertNull(n.getNetworkPointer());
+ }
}
assertNotNull("The group node cannot be found", gn);
Modified:
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/XGMMLWriterTest.java
===================================================================
---
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/XGMMLWriterTest.java
2012-04-24 20:47:18 UTC (rev 28971)
+++
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/XGMMLWriterTest.java
2012-04-24 21:03:53 UTC (rev 28972)
@@ -30,6 +30,7 @@
import org.cytoscape.model.CyNode;
import org.cytoscape.model.subnetwork.CyRootNetwork;
import org.cytoscape.model.subnetwork.CyRootNetworkManager;
+import org.cytoscape.model.subnetwork.CySubNetwork;
import org.cytoscape.view.model.CyNetworkView;
import org.cytoscape.view.presentation.RenderingEngineManager;
import org.cytoscape.view.presentation.property.BasicVisualLexicon;
@@ -68,7 +69,7 @@
@Before
public void init(){
this.netViewTestSupport = new NetworkViewTestSupport();
- this.netMgr = mock(CyNetworkManager.class);
+ this.netMgr = mock(CyNetworkManager.class);
this.netFactory = netViewTestSupport.getNetworkFactory();
this.rootNetMgr = netViewTestSupport.getRootNetworkFactory();
@@ -89,6 +90,67 @@
// Session Network Format:
@Test
+ public void testRootNetworkGraph() throws UnsupportedEncodingException {
+ write(rootNet, true);
+ assertEquals("0", evalString("/x:graph/@cy:view"));
+ assertEquals(""+XGMMLWriter.VERSION,
evalString("/x:graph/@cy:documentVersion"));
+ // Making sure that the root graph also has the private
attribute
+ assertEquals("1", evalString("/x:graph/@cy:private"));
+ }
+
+ @Test
+ public void testBaseNetworkGraph() throws UnsupportedEncodingException {
+ setRegistered(rootNet, false);
+ write(rootNet, true);
+ assertEquals(2, evalNumber("count(//x:graph)")); // Only the
graph elements for the root and the base network
+ assertEquals(""+net.getSUID(),
evalString("/x:graph/x:att/x:graph/@id"));
+ assertEquals("0",
evalString("/x:graph/x:att/x:graph/@cy:private")); // Should be public
+ }
+
+ @Test
+ public void testRegisteredSubNetworkSavedAsPublic() throws
UnsupportedEncodingException {
+ CySubNetwork sn = rootNet.addSubNetwork();
+ setRegistered(sn, true);
+ write(rootNet, true);
+ assertEquals("0",
evalString("/x:graph/x:att/x:graph[@id="+sn.getSUID()+"]/@cy:private"));
+ }
+
+ @Test
+ public void testUnregisteredSubNetworksNotSaved() throws
UnsupportedEncodingException {
+ CySubNetwork sn = rootNet.addSubNetwork();
+ setRegistered(sn, false);
+ write(rootNet, true);
+ assertTrue(evalBoolean("count(//x:graph[@id="+sn.getSUID()+"])
= 0"));
+ }
+
+ @Test
+ public void testUnregisteredNetworkSavedIfNetworkPointer() throws
UnsupportedEncodingException {
+ // Create a subnetwork from the same root
+ CySubNetwork sn = rootNet.addSubNetwork();
+ setRegistered(sn, false);
+ // Set it as network pointer
+ CyNode n = net.getNodeList().get(0);
+ n.setNetworkPointer(sn);
+ write(rootNet, true);
+ // Test
+ assertEquals(""+sn.getSUID(),
getElementId("//x:node[@id="+n.getSUID()+"]/x:att/x:graph")); // It is saved as
a nested node graph
+ assertEquals("1",
evalString("/x:graph//x:att/x:graph[@id="+sn.getSUID()+"]/@cy:private")); //
But it must be private!
+ }
+
+ @Test
+ public void testRegisteredNetworkPointerSavedUnderRootGraph() throws
UnsupportedEncodingException {
+ CySubNetwork sn = rootNet.addSubNetwork();
+ setRegistered(sn, true);
+ CyNode n = net.getNodeList().get(0);
+ n.setNetworkPointer(sn);
+ write(rootNet, true);
+ // The subnetwork is saved under the root graph, because it is
registered
+ assertEquals(0,
evalNumber("count(/x:graph/x:att/x:graph[@id="+n.getSUID()+"])"));
+ // The nested node graph (network pointer) is an XLink to that
graph
+ assertEquals("#"+sn.getSUID(),
evalString("//x:node[@id="+n.getSUID()+"]/x:att/x:graph/@xlink:href"));
+ }
+
+ @Test
public void testNumberOfNodeElements() {
write(rootNet, true);
assertEquals(NODE_COUNT,
evalNumber("count(/x:graph/x:att/x:graph/x:node)"));
@@ -158,9 +220,23 @@
}
@Test
+ public void testNestedGraphReferenceHasNoChildren(){
+ // Add a couple of network pointers
+ CyNetwork subNet = rootNet.addSubNetwork();
+ net.getNodeList().get(0).setNetworkPointer(subNet);
+ net.getNodeList().get(1).setNetworkPointer(subNet);
+ write(rootNet, true);
+ // Test: nested XLink-graphs must have no children
+ assertEquals(2, evalNumber("count(//x:node/x:att/x:graph)"));
+
assertTrue(evalBoolean("count(//x:node/x:att/x:graph[@xlink:href]) >= 1")); //
There should be at least one node graph with XLink...
+ assertEquals(0,
evalNumber("count(//x:node/x:att/x:graph[@xlink:href]/*)")); // ... and it
should have no children, because it's an XLink
+ }
+
+ @Test
public void testNetworkPointerFromSameRootNetwork(){
// Create a subnetwork from the same root
- CyNetwork subNet = rootNet.addSubNetwork();
+ CySubNetwork subNet = rootNet.addSubNetwork();
+ setRegistered(subNet, true); // To force all nested node graphs
to be written as XLinks!
// Set it as network pointer to 2 nodes
CyNode n1 = net.getNodeList().get(0);
CyNode n2 = net.getNodeList().get(1);
@@ -169,15 +245,15 @@
write(rootNet, true);
// Test
assertEquals(2,
evalNumber("count(/x:graph//x:node/x:att/x:graph)"));
- assertEquals("#"+subNet.getSUID(),
evalString("//x:node[@id="+n1.getSUID()+"]/x:att/x:graph/@xlink:href"));
- assertEquals("#"+subNet.getSUID(),
evalString("//x:node[@id="+n2.getSUID()+"]/x:att/x:graph/@xlink:href"));
+ assertEquals(""+subNet.getSUID(),
getElementId("//x:node[@id="+n1.getSUID()+"]/x:att/x:graph"));
+ assertEquals(""+subNet.getSUID(),
getElementId("//x:node[@id="+n2.getSUID()+"]/x:att/x:graph"));
}
@Test
public void testNetworkPointerFromAnotherRootNetwork() throws
UnsupportedEncodingException {
// Create a subnetwork from another root network
CyNetwork subNet = netFactory.createNetwork();
- // Set it as network pointer to 2 nodes
+ // Set it as network pointer
CyNode n = net.getNodeList().get(0);
n.setNetworkPointer(subNet);
write(rootNet, true); // session format only!
@@ -186,18 +262,6 @@
assertEquals(filename+"#"+subNet.getSUID(),
evalString("//x:node[@id="+n.getSUID()+"]/x:att/x:graph/@xlink:href"));
}
- @Test
- public void testNestedGraphReferenceHasNoChildren(){
- // Add a couple of network pointers
- CyNetwork subNet = rootNet.addSubNetwork();
- net.getNodeList().get(0).setNetworkPointer(subNet);
- net.getNodeList().get(1).setNetworkPointer(subNet);
- write(rootNet, true);
- // Test: nested XLink-graphs must have no children
- assertEquals(2,
evalNumber("count(//x:node/x:att/x:graph[@xlink:href])"));
- assertEquals(0,
evalNumber("count(//x:node/x:att/x:graph[@xlink:href]/*)"));
- }
-
// Session Network View Format:
@Test
@@ -213,8 +277,29 @@
// TODO
}
+ // Standard XGMML export:
+
+ @Test
+ public void testRootGraph() throws UnsupportedEncodingException {
+ write(net, false);
+ assertEquals(1, evalNumber("count(//x:graph)")); // no nested
graph elements
+ assertEquals(""+net.getSUID(), evalString("/x:graph/@id"));
+ assertEquals(""+XGMMLWriter.VERSION,
evalString("/x:graph/@cy:documentVersion"));
+ }
+
// PRIVATE Methods:
+ private String getElementId(String elementPath) {
+ String id = evalString(elementPath + "/@id"); // Try the id
attribute first
+
+ if (id == null || id.isEmpty()) { // It could be an XLink...
+ id = evalString(elementPath + "/@xlink:href");
+ id = id.replace('#', ' ').trim();
+ }
+
+ return id;
+ }
+
private NodeList evalNodeList(String expression) {
return (NodeList) eval(expression, XPathConstants.NODESET);
}
@@ -298,5 +383,14 @@
dirEdge = net.addEdge(allNodes.get(1), allNodes.get(2), true);
rootNet = rootNetMgr.getRootNetwork(net);
+
+ // Root network is UNregistered by default
+ setRegistered(rootNet, false);
+ // Base network is registered by default
+ setRegistered(net, true);
}
+
+ private void setRegistered(CyNetwork net, boolean registered) {
+
when(this.netMgr.networkExists(net.getSUID())).thenReturn(registered);
+ }
}
--
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.