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.

Reply via email to