Author: clopes
Date: 2012-07-27 11:33:30 -0700 (Fri, 27 Jul 2012)
New Revision: 30019

Modified:
   
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/xgmml/GenericXGMMLWriter.java
   
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/xgmml/SessionXGMMLNetworkWriter.java
   
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/AbstractXGMMLWriterTest.java
   
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/GenericXGMMLWriterTest.java
   
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/SessionXGMMLNetworkWriterTest.java
Log:
XGMML Writer: fixed bug that allowed subnetworks with "DO_NOT_SAVE" policy to 
be serialized.

Modified: 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/xgmml/GenericXGMMLWriter.java
===================================================================
--- 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/xgmml/GenericXGMMLWriter.java
   2012-07-27 18:25:24 UTC (rev 30018)
+++ 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/xgmml/GenericXGMMLWriter.java
   2012-07-27 18:33:30 UTC (rev 30019)
@@ -55,6 +55,7 @@
 import org.cytoscape.model.CyNode;
 import org.cytoscape.model.CyRow;
 import org.cytoscape.model.CyTable;
+import org.cytoscape.model.SavePolicy;
 import org.cytoscape.model.subnetwork.CyRootNetwork;
 import org.cytoscape.model.subnetwork.CyRootNetworkManager;
 import org.cytoscape.model.subnetwork.CySubNetwork;
@@ -176,7 +177,7 @@
                
                if (network instanceof CyRootNetwork) {
                        this.network = this.rootNetwork = (CyRootNetwork) 
network;
-                       this.subNetworks = 
getRegisteredSubNetworks(rootNetwork);
+                       this.subNetworks = 
getSerializableSubNetworks(rootNetwork);
                } else {
                        this.network = network;
                        this.rootNetwork = 
rootNetworkMgr.getRootNetwork(network);
@@ -412,9 +413,13 @@
                        
                        // Output the node attributes
                        writeAttributes(net.getRow(node));
+                       
                        // Write node's sub-graph
-                       writeSubGraph(node.getNetworkPointer());
+                       final CyNetwork netPointer = node.getNetworkPointer();
                        
+                       if (netPointer != null && isSerializable(netPointer))
+                               writeSubGraph(netPointer);
+                       
                // Output the node graphics if we have a view
                        if (networkView != null)
                                writeGraphics(networkView.getNodeView(node), 
false);
@@ -430,9 +435,9 @@
      * @param edge the edge to output
      * @throws IOException
      */
-       protected void writeEdge(CyNetwork net, CyEdge edge) throws IOException 
{
+       protected void writeEdge(final CyNetwork net, final CyEdge edge) throws 
IOException {
                writeElement("<edge");
-               boolean written = writtenEdgeMap.containsKey(edge);
+               final boolean written = writtenEdgeMap.containsKey(edge);
                
                if (written) {
                        // Write as an XLink only
@@ -883,26 +888,30 @@
     
     /**
      * @param rootNet
-     * @return A set with all the sub-networks that are registered in the 
network manager.
+     * @return A set with all the subnetworks that should be serialized.
      */
-    private Set<CySubNetwork> getRegisteredSubNetworks(CyRootNetwork rootNet) {
-               List<CySubNetwork> subNetList = rootNet.getSubNetworkList();
-               Set<CySubNetwork> registeredSubNetSet = new 
LinkedHashSet<CySubNetwork>();
+    protected Set<CySubNetwork> getSerializableSubNetworks(final CyRootNetwork 
rootNet) {
+               final Set<CySubNetwork> serializableSet = new 
LinkedHashSet<CySubNetwork>();
+               final List<CySubNetwork> subNetList = 
rootNet.getSubNetworkList();
+               final CySubNetwork baseNetwork = rootNet.getBaseNetwork();
                
-               CySubNetwork baseNetwork = rootNet.getBaseNetwork();
-               if (isRegistered(baseNetwork)) {
-                       registeredSubNetSet.add(baseNetwork); // The base 
network must be the first one!
-               }
+               // The base network must be the first one!
+               if (isSerializable(baseNetwork))
+                       serializableSet.add(baseNetwork);
                
-               for (CySubNetwork sn : subNetList) {
-                       if (isRegistered(sn))
-                               registeredSubNetSet.add(sn);
+               for (final CySubNetwork sn : subNetList) {
+                       if (isSerializable(sn))
+                               serializableSet.add(sn);
                }
                
-               return registeredSubNetSet;
+               return serializableSet;
        }
     
-    protected boolean isRegistered(CyNetwork net) {
+    protected boolean isSerializable(final CyNetwork net) {
+       return net.getSavePolicy() != SavePolicy.DO_NOT_SAVE;
+    }
+    
+    protected boolean isRegistered(final CyNetwork net) {
        return networkMgr.networkExists(net.getSUID());
     }
 }

Modified: 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/xgmml/SessionXGMMLNetworkWriter.java
===================================================================
--- 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/xgmml/SessionXGMMLNetworkWriter.java
    2012-07-27 18:25:24 UTC (rev 30018)
+++ 
core3/impl/trunk/io-impl/impl/src/main/java/org/cytoscape/io/internal/write/xgmml/SessionXGMMLNetworkWriter.java
    2012-07-27 18:33:30 UTC (rev 30019)
@@ -11,6 +11,7 @@
 import org.cytoscape.model.CyNetworkManager;
 import org.cytoscape.model.CyNode;
 import org.cytoscape.model.CyRow;
+import org.cytoscape.model.SavePolicy;
 import org.cytoscape.model.subnetwork.CyRootNetwork;
 import org.cytoscape.model.subnetwork.CyRootNetworkManager;
 import org.cytoscape.model.subnetwork.CySubNetwork;
@@ -29,6 +30,11 @@
                                                                         final 
CyNetworkManager networkMgr,
                                                                         final 
CyRootNetworkManager rootNetworkMgr) {
                super(outputStream, renderingEngineMgr, network, 
unrecognizedVisualPropertyMgr, networkMgr, rootNetworkMgr);
+
+               if (rootNetwork.getSavePolicy() != SavePolicy.SESSION_FILE)
+                       throw new IllegalArgumentException(
+                                       "Network cannot be saved because the 
root network's save policy is not \"SESSION_FILE\": "
+                                                       + network);
        }
 
        @Override
@@ -47,8 +53,8 @@
        @Override
        protected void writeRootGraphAttributes() throws IOException {
                // Write sub-graphs first
-               for (CySubNetwork subNet : subNetworks) {
-                       if (!writtenNetMap.containsKey(subNet)) {
+               for (final CySubNetwork subNet : subNetworks) {
+                       if (!writtenNetMap.containsKey(subNet) && 
isSerializable(subNet)) {
                                writeSubGraph(subNet);
                        }
                }
@@ -56,7 +62,7 @@
        
        @Override
        protected void writeNode(final CyNetwork net, final CyNode node) throws 
IOException {
-               boolean written = writtenNodeMap.containsKey(node);
+               final boolean written = writtenNodeMap.containsKey(node);
                
                // Output the node
                writeElement("<node");
@@ -75,14 +81,14 @@
                        
                        final CyNetwork netPointer = node.getNetworkPointer();
                        
-                       if (netPointer == null) {
+                       if (netPointer == null || !isSerializable(netPointer)) {
                                write("/>\n");
                        } else {
                                write(">\n");
                                depth++;
                                
                                // Write node's sub-graph:
-                               if (subNetworks.contains(netPointer)) {
+                               if (isRegistered(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).
@@ -98,9 +104,9 @@
        }
        
        @Override
-       protected void writeEdge(CyNetwork net, CyEdge edge) throws IOException 
{
+       protected void writeEdge(final CyNetwork net, final CyEdge edge) throws 
IOException {
                writeElement("<edge");
-               boolean written = writtenEdgeMap.containsKey(edge);
+               final boolean written = writtenEdgeMap.containsKey(edge);
                
                if (written) {
                        // Write as an XLink only
@@ -146,4 +152,9 @@
        protected boolean ignoreGraphicsAttribute(final CyIdentifiable element, 
String attName) {
                return true;
        }
+       
+       @Override
+       protected boolean isSerializable(final CyNetwork net) {
+       return net.getSavePolicy() == SavePolicy.SESSION_FILE;
+    }
 }

Modified: 
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/AbstractXGMMLWriterTest.java
===================================================================
--- 
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/AbstractXGMMLWriterTest.java
      2012-07-27 18:25:24 UTC (rev 30018)
+++ 
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/AbstractXGMMLWriterTest.java
      2012-07-27 18:33:30 UTC (rev 30019)
@@ -45,7 +45,9 @@
        protected final int NODE_COUNT = 3;
        protected final int EDGE_COUNT = NODE_COUNT - 1;
        protected CyNetworkView view;
+       /** Registered and serializable base network */
        protected CyNetwork net;
+       /** Unregistered root network of net */
        protected CyRootNetwork rootNet;
        protected CyEdge dirEdge;
        protected CyEdge undirEdge;
@@ -158,6 +160,8 @@
                                throw new UnsupportedOperationException();
                            }
                        });
+               } catch (IllegalArgumentException e) {
+                       throw e;
                } catch (Exception e) {
                        throw new RuntimeException(e);
                }

Modified: 
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/GenericXGMMLWriterTest.java
===================================================================
--- 
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/GenericXGMMLWriterTest.java
       2012-07-27 18:25:24 UTC (rev 30018)
+++ 
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/GenericXGMMLWriterTest.java
       2012-07-27 18:33:30 UTC (rev 30019)
@@ -11,6 +11,7 @@
 import org.cytoscape.model.CyEdge;
 import org.cytoscape.model.CyNetwork;
 import org.cytoscape.model.CyNode;
+import org.cytoscape.model.SavePolicy;
 import org.cytoscape.model.subnetwork.CySubNetwork;
 import org.cytoscape.view.model.View;
 import org.cytoscape.view.presentation.property.NodeShapeVisualProperty;
@@ -47,9 +48,21 @@
        }
        
        @Test
+       public void testTopNetworkSavedEvenIfDoNotSavePolicy() throws 
UnsupportedEncodingException {
+               // The network that is passed to the writer should always be 
saved, even if its save policy is DO_NOT_SAVE,
+               // because it doesn't make sense to prevent an app from 
exporting it if the app explicitly wants to do so.
+               CyNetwork newNet = 
netFactory.createNetwork(SavePolicy.DO_NOT_SAVE);
+               setRegistered(newNet, false); // It shouldn't make any 
difference either
+               write(newNet);
+               // Test:
+               assertEquals(1, evalNumber("count(//x:graph)")); // No nested 
graph elements
+               assertEquals(""+newNet.getSUID(), evalString("/x:graph/@id"));
+       }
+       
+       @Test
        public void testNetworkPointerSavedIfSameRootNetwork() throws 
UnsupportedEncodingException {
                // Create a subnetwork from the same root
-               CySubNetwork sn1 = rootNet.addSubNetwork();
+               CySubNetwork sn1 = rootNet.addSubNetwork(); // Of course the 
save policy cannot be DO_NOT_SAVE!
                CySubNetwork sn2 = rootNet.addSubNetwork();
                setRegistered(sn1, true);
                setRegistered(sn2, false);
@@ -71,16 +84,30 @@
        @Test
        public void testNetworkPointerIgnoredIfAnotherRootNetwork() throws 
UnsupportedEncodingException {
                // Create a subnetwork from another root network
-               CyNetwork subNet = netFactory.createNetwork();
+               CyNetwork net2 = netFactory.createNetwork();
                // Set it as network pointer
                CyNode n = net.getNodeList().get(0);
-               n.setNetworkPointer(subNet);
+               n.setNetworkPointer(net2);
                write(net);
                // Test
                assertEquals(1, evalNumber("count(//x:graph)")); // no nested 
graph elements
        }
        
        @Test
+       public void testNetworkPointerIgnoredIfDoNotSavePolicy() throws 
UnsupportedEncodingException {
+               // Create a subnetwork from another root network
+               CyNetwork sn = rootNet.addSubNetwork(SavePolicy.DO_NOT_SAVE);
+               setRegistered(sn, true); // Ignore even if registered!
+               // Set it as network pointer
+               CyNode n = net.getNodeList().get(0);
+               n.setNetworkPointer(sn);
+               write(net);
+               // Test
+               assertEquals(1, evalNumber("count(//x:graph)")); // no nested 
graph elements
+               assertEquals(""+net.getSUID(), evalString("/x:graph/@id"));
+       }
+       
+       @Test
        public void testSecondNetworkPointerRefenceSavedAsXLink() throws 
UnsupportedEncodingException {
                CySubNetwork sn = rootNet.addSubNetwork(); // Same root!
                setRegistered(sn, true);

Modified: 
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/SessionXGMMLNetworkWriterTest.java
===================================================================
--- 
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/SessionXGMMLNetworkWriterTest.java
        2012-07-27 18:25:24 UTC (rev 30018)
+++ 
core3/impl/trunk/io-impl/impl/src/test/java/org/cytoscape/io/internal/write/xgmml/SessionXGMMLNetworkWriterTest.java
        2012-07-27 18:33:30 UTC (rev 30019)
@@ -9,6 +9,8 @@
 import org.cytoscape.model.CyIdentifiable;
 import org.cytoscape.model.CyNetwork;
 import org.cytoscape.model.CyNode;
+import org.cytoscape.model.SavePolicy;
+import org.cytoscape.model.subnetwork.CyRootNetwork;
 import org.cytoscape.model.subnetwork.CySubNetwork;
 import org.junit.Before;
 import org.junit.Test;
@@ -70,27 +72,43 @@
                assertEquals(0, evalNumber("count(//x:edge/graphics)"));
        }
        
+       @Test(expected=IllegalArgumentException.class)
+       public void testRootNetworkOnlySavedIfSessionSavePolicy() throws 
UnsupportedEncodingException {
+               CyRootNetwork newRoot = 
((CySubNetwork)netFactory.createNetwork(SavePolicy.DO_NOT_SAVE)).getRootNetwork();
+               setRegistered(newRoot, true); // Registering it doesn't make 
any difference
+               write(newRoot);
+       }
+       
        @Test
-       public void testRegisteredSubNetworkSaved() throws 
UnsupportedEncodingException {
+       public void testRegisteredSubNetworkSavedIfSessionSavePolicy() throws 
UnsupportedEncodingException {
                CySubNetwork sn = rootNet.addSubNetwork();
-               setRegistered(sn, true);
+               setRegistered(sn, true); // It doesn't matter
                write(rootNet);
                assertEquals("1", 
evalString("/x:graph/x:att/x:graph[@id="+sn.getSUID()+"]/@cy:registered"));
        }
        
        @Test
-       public void testUnregisteredSubNetworksNotSaved() throws 
UnsupportedEncodingException {
+       public void testUnregisteredSubNetworkSavedIfSessionSavePolicy() throws 
UnsupportedEncodingException {
                CySubNetwork sn = rootNet.addSubNetwork();
-               setRegistered(sn, false);
+               setRegistered(sn, false); // It doesn't matter
                write(rootNet);
-               assertTrue(evalBoolean("count(//x:graph[@id="+sn.getSUID()+"]) 
= 0"));
+               assertEquals("0", 
evalString("/x:graph/x:att/x:graph[@id="+sn.getSUID()+"]/@cy:registered"));
        }
        
        @Test
-       public void testUnregisteredNetworkSavedIfNetworkPointer() throws 
UnsupportedEncodingException {
+       public void testSubNetworkIgnoredIfNotSessionSavePolicy() throws 
UnsupportedEncodingException {
+               CySubNetwork sn = rootNet.addSubNetwork(SavePolicy.DO_NOT_SAVE);
+               setRegistered(sn, true); // It doesn't matter
+               write(rootNet);
+               assertEquals(2, evalNumber("count(//x:graph)"));
+               assertEquals(0, 
evalNumber("count(//x:graph[@id="+sn.getSUID()+"])"));
+       }
+       
+       @Test
+       public void testUnregisteredNetworkPointerSavedIfSessionSavePolicy() 
throws UnsupportedEncodingException {
                // Create a subnetwork from the same root
                CySubNetwork sn = rootNet.addSubNetwork();
-               setRegistered(sn, false);
+               setRegistered(sn, false); // It doesn't matter
                // Set it as network pointer
                CyNode n = net.getNodeList().get(0);
                n.setNetworkPointer(sn);

-- 
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