Author: clopes
Date: 2012-09-07 15:44:46 -0700 (Fri, 07 Sep 2012)
New Revision: 30339

Modified:
   
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/CyActivator.java
   
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/CloneNetworkTask.java
   
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/CloneNetworkTaskFactoryImpl.java
Log:
Fixes #1439 (Clone network does not copy node table data to the new network)
Fixes #1441 (Clone network does not copy the network pointers to the new 
network)

Modified: 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/CyActivator.java
===================================================================
--- 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/CyActivator.java
  2012-09-07 22:28:56 UTC (rev 30338)
+++ 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/CyActivator.java
  2012-09-07 22:44:46 UTC (rev 30339)
@@ -43,6 +43,7 @@
 import org.cytoscape.model.CyEdge;
 import org.cytoscape.model.CyNetworkFactory;
 import org.cytoscape.model.CyNetworkManager;
+import org.cytoscape.model.CyNetworkTableManager;
 import org.cytoscape.model.CyTableManager;
 import org.cytoscape.model.events.NetworkAddedListener;
 import org.cytoscape.model.subnetwork.CyRootNetworkManager;
@@ -222,6 +223,7 @@
                SynchronousTaskManager<?> synchronousTaskManagerServiceRef = 
getService(bc,SynchronousTaskManager.class);
                TunableSetter tunableSetterServiceRef = 
getService(bc,TunableSetter.class);
                CyRootNetworkManager rootNetworkManagerServiceRef  = 
getService(bc, CyRootNetworkManager.class);
+               CyNetworkTableManager cyNetworkTableManagerServiceRef  = 
getService(bc, CyNetworkTableManager.class);
                
                CyGroupManager cyGroupManager = getService(bc, 
CyGroupManager.class);
                CyGroupFactory cyGroupFactory = getService(bc, 
CyGroupFactory.class);
@@ -259,7 +261,7 @@
                UnHideAllNodesTaskFactoryImpl unHideAllNodesTaskFactory = new 
UnHideAllNodesTaskFactoryImpl(undoSupportServiceRef,cyEventHelperRef,visualMappingManagerServiceRef);
                UnHideAllEdgesTaskFactoryImpl unHideAllEdgesTaskFactory = new 
UnHideAllEdgesTaskFactoryImpl(undoSupportServiceRef,cyEventHelperRef,visualMappingManagerServiceRef);
                NewEmptyNetworkTaskFactoryImpl newEmptyNetworkTaskFactory = new 
NewEmptyNetworkTaskFactoryImpl(cyNetworkFactoryServiceRef,cyNetworkViewFactoryServiceRef,cyNetworkManagerServiceRef,cyNetworkViewManagerServiceRef,cyNetworkNamingServiceRef,synchronousTaskManagerServiceRef,visualMappingManagerServiceRef);
-               CloneNetworkTaskFactoryImpl cloneNetworkTaskFactory = new 
CloneNetworkTaskFactoryImpl(cyNetworkManagerServiceRef,cyNetworkViewManagerServiceRef,visualMappingManagerServiceRef,cyNetworkFactoryServiceRef,cyNetworkViewFactoryServiceRef,cyNetworkNamingServiceRef,cyApplicationManagerServiceRef);
+               CloneNetworkTaskFactoryImpl cloneNetworkTaskFactory = new 
CloneNetworkTaskFactoryImpl(cyNetworkManagerServiceRef,cyNetworkViewManagerServiceRef,visualMappingManagerServiceRef,cyNetworkFactoryServiceRef,cyNetworkViewFactoryServiceRef,cyNetworkNamingServiceRef,cyApplicationManagerServiceRef,cyNetworkTableManagerServiceRef,rootNetworkManagerServiceRef);
                NewNetworkSelectedNodesEdgesTaskFactoryImpl 
newNetworkSelectedNodesEdgesTaskFactory = new 
NewNetworkSelectedNodesEdgesTaskFactoryImpl(undoSupportServiceRef,cyRootNetworkFactoryServiceRef,cyNetworkViewFactoryServiceRef,cyNetworkManagerServiceRef,cyNetworkViewManagerServiceRef,cyNetworkNamingServiceRef,visualMappingManagerServiceRef,cyApplicationManagerServiceRef,cyEventHelperRef);
                NewNetworkSelectedNodesOnlyTaskFactoryImpl 
newNetworkSelectedNodesOnlyTaskFactory = new 
NewNetworkSelectedNodesOnlyTaskFactoryImpl(undoSupportServiceRef,cyRootNetworkFactoryServiceRef,cyNetworkViewFactoryServiceRef,cyNetworkManagerServiceRef,cyNetworkViewManagerServiceRef,cyNetworkNamingServiceRef,visualMappingManagerServiceRef,cyApplicationManagerServiceRef,cyEventHelperRef);
                DestroyNetworkTaskFactoryImpl destroyNetworkTaskFactory = new 
DestroyNetworkTaskFactoryImpl(cyNetworkManagerServiceRef);

Modified: 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/CloneNetworkTask.java
===================================================================
--- 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/CloneNetworkTask.java
    2012-09-07 22:28:56 UTC (rev 30338)
+++ 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/CloneNetworkTask.java
    2012-09-07 22:44:46 UTC (rev 30339)
@@ -30,7 +30,6 @@
 package org.cytoscape.task.internal.creation;
 
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.WeakHashMap;
@@ -38,20 +37,21 @@
 import org.cytoscape.application.CyApplicationManager;
 import org.cytoscape.model.CyColumn;
 import org.cytoscape.model.CyEdge;
+import org.cytoscape.model.CyIdentifiable;
 import org.cytoscape.model.CyNetwork;
 import org.cytoscape.model.CyNetworkFactory;
 import org.cytoscape.model.CyNetworkManager;
+import org.cytoscape.model.CyNetworkTableManager;
 import org.cytoscape.model.CyNode;
 import org.cytoscape.model.CyRow;
 import org.cytoscape.model.CyTable;
-import org.cytoscape.model.CyIdentifiable;
 import org.cytoscape.model.VirtualColumnInfo;
+import org.cytoscape.model.subnetwork.CyRootNetwork;
+import org.cytoscape.model.subnetwork.CyRootNetworkManager;
 import org.cytoscape.session.CyNetworkNaming;
 import org.cytoscape.view.model.CyNetworkView;
 import org.cytoscape.view.model.CyNetworkViewFactory;
 import org.cytoscape.view.model.CyNetworkViewManager;
-import org.cytoscape.view.model.View;
-import org.cytoscape.view.presentation.property.BasicVisualLexicon;
 import org.cytoscape.view.vizmap.VisualMappingManager;
 import org.cytoscape.work.TaskMonitor;
 import org.slf4j.Logger;
@@ -69,11 +69,19 @@
        private final CyNetworkViewFactory netViewFactory;
        private final CyNetworkNaming naming;
        private final CyApplicationManager appMgr;
+       private final CyNetworkTableManager netTableMgr;
+       private final CyRootNetworkManager rootNetMgr;
 
-       public CloneNetworkTask(final CyNetwork net, final CyNetworkManager 
netmgr,
-                       final CyNetworkViewManager networkViewManager, final 
VisualMappingManager vmm,
-                       final CyNetworkFactory netFactory, final 
CyNetworkViewFactory netViewFactory, final CyNetworkNaming naming,
-                       final CyApplicationManager appMgr) {
+       public CloneNetworkTask(final CyNetwork net,
+                                                       final CyNetworkManager 
netmgr,
+                                                       final 
CyNetworkViewManager networkViewManager,
+                                                       final 
VisualMappingManager vmm,
+                                                       final CyNetworkFactory 
netFactory,
+                                                       final 
CyNetworkViewFactory netViewFactory,
+                                                       final CyNetworkNaming 
naming,
+                                                       final 
CyApplicationManager appMgr,
+                                                       final 
CyNetworkTableManager netTableMgr,
+                                                       final 
CyRootNetworkManager rootNetMgr) {
                super(net, netmgr, networkViewManager);
 
                this.vmm = vmm;
@@ -81,6 +89,8 @@
                this.netViewFactory = netViewFactory;
                this.naming = naming;
                this.appMgr = appMgr;
+               this.netTableMgr = netTableMgr;
+               this.rootNetMgr = rootNetMgr;
        }
 
        public void run(TaskMonitor tm) {
@@ -107,69 +117,98 @@
                tm.setProgress(1.0);
        }
 
-       private CyNetwork cloneNetwork(CyNetwork origNet) {
+       private CyNetwork cloneNetwork(final CyNetwork origNet) {
                final CyNetwork newNet = 
netFactory.createNetwork(origNet.getSavePolicy());
-
-               final CyTable nodeTable = newNet.getDefaultNodeTable();
-               final CyTable edgeTable = newNet.getDefaultEdgeTable();
-               final CyTable networkTable = newNet.getDefaultNetworkTable();
+               
                // copy default columns
-               addColumns(origNet.getDefaultNodeTable(), nodeTable);
-               addColumns(origNet.getDefaultEdgeTable(), edgeTable);
-               addColumns(origNet.getDefaultNetworkTable(), networkTable);
+               addColumns(origNet, newNet, CyNetwork.class, 
CyNetwork.LOCAL_ATTRS);
+               addColumns(origNet, newNet, CyNode.class, 
CyNetwork.LOCAL_ATTRS);
+               addColumns(origNet, newNet, CyEdge.class, 
CyNetwork.LOCAL_ATTRS);
 
-                       cloneNodes(origNet, newNet);
-                       cloneEdges(origNet, newNet);
+               cloneNodes(origNet, newNet);
+               cloneEdges(origNet, newNet);
 
-                       newNet.getRow(newNet).set(CyNetwork.NAME,
-                                       
naming.getSuggestedNetworkTitle(origNet.getRow(origNet).get(CyNetwork.NAME, 
String.class)));
+               newNet.getRow(newNet).set(CyNetwork.NAME, 
+                               
naming.getSuggestedNetworkTitle(origNet.getRow(origNet).get(CyNetwork.NAME, 
String.class)));
+               
                return newNet;
        }
        
-       private void cloneNodes(CyNetwork origNet, CyNetwork newNet) {
+       private void cloneNodes(final CyNetwork origNet, final CyNetwork 
newNet) {
                orig2NewNodeMap = new WeakHashMap<CyNode, CyNode>();
                new2OrigNodeMap = new WeakHashMap<CyNode, CyNode>();
+               
                for (final CyNode origNode : origNet.getNodeList()) {
                        final CyNode newNode = newNet.addNode();
                        orig2NewNodeMap.put(origNode, newNode);
                        new2OrigNodeMap.put(newNode, origNode);
-                       cloneRow(origNet.getRow(origNode), 
newNet.getRow(newNode));
+                       cloneRow(newNet, CyNode.class, origNet.getRow(origNode, 
CyNetwork.LOCAL_ATTRS), newNet.getRow(newNode, CyNetwork.LOCAL_ATTRS));
+                       newNode.setNetworkPointer(origNode.getNetworkPointer());
                }
        }
 
-       private void cloneEdges(CyNetwork origNet, CyNetwork newNet) {
+       private void cloneEdges(final CyNetwork origNet, final CyNetwork 
newNet) {
                for (final CyEdge origEdge : origNet.getEdgeList()) {
                        final CyNode newSource = 
orig2NewNodeMap.get(origEdge.getSource());
                        final CyNode newTarget = 
orig2NewNodeMap.get(origEdge.getTarget());
                        final boolean newDirected = origEdge.isDirected();
                        final CyEdge newEdge = newNet.addEdge(newSource, 
newTarget, newDirected);
-                       cloneRow(origNet.getRow(origEdge), 
newNet.getRow(newEdge));
+                       cloneRow(newNet, CyEdge.class, origNet.getRow(origEdge, 
CyNetwork.LOCAL_ATTRS), newNet.getRow(newEdge, CyNetwork.LOCAL_ATTRS));
                }
        }
 
-       private void addColumns(CyTable parentTable, CyTable subTable) {
-               for (CyColumn col:  parentTable.getColumns()){
-                       if (subTable.getColumn(col.getName()) == null){
-                               VirtualColumnInfo colInfo = 
col.getVirtualColumnInfo();
-                               if (colInfo.isVirtual())
-                                       addVirtualColumn(col, subTable);
-                               else
-                                       copyColumn(col, subTable);
+       private void addColumns(final CyNetwork origNet,
+                                                       final CyNetwork newNet, 
+                                                       final Class<? extends 
CyIdentifiable> tableType,
+                                                       final String namespace) 
{
+               final CyTable from = origNet.getTable(tableType, namespace); 
+               final CyTable to = newNet.getTable(tableType, namespace); 
+               final CyRootNetwork origRoot = 
rootNetMgr.getRootNetwork(origNet);
+               final CyRootNetwork newRoot = rootNetMgr.getRootNetwork(newNet);
+               final Map<String, CyTable> origRootTables = 
netTableMgr.getTables(origRoot, tableType);
+               
+               for (final CyColumn col : from.getColumns()){
+                       final String name = col.getName();
+                       
+                       if (to.getColumn(name) == null){
+                               final VirtualColumnInfo info = 
col.getVirtualColumnInfo();
+                               
+                               if (info.isVirtual()) {
+                                       if 
(origRootTables.containsValue(info.getSourceTable())) {
+                                               // If the virtual column is 
from a root-network table, do NOT set this virtual column directly to
+                                               // the new table:
+                                               // Get the original column (not 
the virtual one!)
+                                               final CyColumn origCol = 
info.getSourceTable().getColumn(info.getSourceColumn());
+                                               // Copy the original column to 
the root-network's table first
+                                               final CyTable newRootTable = 
newRoot.getTable(tableType, namespace);
+                                               
+                                               if 
(newRootTable.getColumn(origCol.getName()) == null)
+                                                       copyColumn(origCol, 
newRootTable);
+                                       
+                                               // Now we can add the new 
"root" column as a virtual one to the new network's table
+                                               to.addVirtualColumn(name, 
origCol.getName(), newRootTable, CyIdentifiable.SUID, col.isImmutable());
+                                       } else {
+                                               // Otherwise (e.g. virtual 
column from a global table) just add the virtual column directly
+                                               addVirtualColumn(col, to);
+                                       }
+                               } else {
+                                       // Not a virtual column, so just copy 
it to the new network's table
+                                       copyColumn(col, to);
+                               }
                        }
                }
        }
 
-       private void addVirtualColumn (CyColumn col, CyTable subTable){
+       private void addVirtualColumn(CyColumn col, CyTable subTable){
                VirtualColumnInfo colInfo = col.getVirtualColumnInfo();
                CyColumn checkCol= subTable.getColumn(col.getName());
-               if(checkCol == null)
+               
+               if (checkCol == null)
                        subTable.addVirtualColumn(col.getName(), 
colInfo.getSourceColumn(), colInfo.getSourceTable(), 
colInfo.getTargetJoinKey(), true);
-
-               else
-                       if(!checkCol.getVirtualColumnInfo().isVirtual() ||
+               else if (!checkCol.getVirtualColumnInfo().isVirtual() ||
                                        
!checkCol.getVirtualColumnInfo().getSourceTable().equals(colInfo.getSourceTable())
 ||
                                        
!checkCol.getVirtualColumnInfo().getSourceColumn().equals(colInfo.getSourceColumn()))
-                               subTable.addVirtualColumn(col.getName(), 
colInfo.getSourceColumn(), colInfo.getSourceTable(), 
colInfo.getTargetJoinKey(), true);
+                       subTable.addVirtualColumn(col.getName(), 
colInfo.getSourceColumn(), colInfo.getSourceTable(), 
colInfo.getTargetJoinKey(), true);
        }
 
        private void copyColumn(CyColumn col, CyTable subTable) {
@@ -179,11 +218,23 @@
                        subTable.createColumn(col.getName(), col.getType(), 
false);     
        }
        
-       private void cloneRow(final CyRow from, final CyRow to) {
-               for (final CyColumn column : from.getTable().getColumns()){
-                       if (!column.getVirtualColumnInfo().isVirtual())
-                               to.set(column.getName(), 
from.getRaw(column.getName()));
+       private void cloneRow(final CyNetwork newNet, final Class<? extends 
CyIdentifiable> tableType, final CyRow from,
+                       final CyRow to) {
+               final CyRootNetwork newRoot = rootNetMgr.getRootNetwork(newNet);
+               Map<String, CyTable> rootTables = 
netTableMgr.getTables(newRoot, tableType);
+               
+               for (final CyColumn col : to.getTable().getColumns()){
+                       final String name = col.getName();
+                       
+                       if (name.equals(CyIdentifiable.SUID))
+                               continue;
+                       
+                       final VirtualColumnInfo info = 
col.getVirtualColumnInfo();
+                       
+                       // If it's a virtual column whose source table is 
assigned to the new root-network,
+                       // then we have to set the value, because the rows of 
the new root table may not have been copied yet
+                       if (!info.isVirtual() || 
rootTables.containsValue(info.getSourceTable()))
+                               to.set(name, from.getRaw(name));
                }
        }
-
 }

Modified: 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/CloneNetworkTaskFactoryImpl.java
===================================================================
--- 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/CloneNetworkTaskFactoryImpl.java
 2012-09-07 22:28:56 UTC (rev 30338)
+++ 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/CloneNetworkTaskFactoryImpl.java
 2012-09-07 22:44:46 UTC (rev 30339)
@@ -33,6 +33,8 @@
 import org.cytoscape.model.CyNetwork;
 import org.cytoscape.model.CyNetworkFactory;
 import org.cytoscape.model.CyNetworkManager;
+import org.cytoscape.model.CyNetworkTableManager;
+import org.cytoscape.model.subnetwork.CyRootNetworkManager;
 import org.cytoscape.session.CyNetworkNaming;
 import org.cytoscape.task.AbstractNetworkTaskFactory;
 import org.cytoscape.task.create.CloneNetworkTaskFactory;
@@ -49,11 +51,18 @@
     private final CyNetworkViewFactory netViewFactory;
     private final CyNetworkNaming naming;
     private final CyApplicationManager appMgr;
+    private final CyNetworkTableManager netTableMgr;
+    private final CyRootNetworkManager rootNetMgr;
 
-    public CloneNetworkTaskFactoryImpl(final CyNetworkManager networkMgr, 
final CyNetworkViewManager networkViewMgr, 
-               final VisualMappingManager vmm, final CyNetworkFactory 
netFactory, 
-               final CyNetworkViewFactory netViewFactory, final 
CyNetworkNaming naming, 
-               final CyApplicationManager appMgr) {
+    public CloneNetworkTaskFactoryImpl(final CyNetworkManager networkMgr,
+                                                                  final 
CyNetworkViewManager networkViewMgr,
+                                                                  final 
VisualMappingManager vmm,
+                                                                  final 
CyNetworkFactory netFactory,
+                                                                  final 
CyNetworkViewFactory netViewFactory,
+                                                                  final 
CyNetworkNaming naming,
+                                                                  final 
CyApplicationManager appMgr,
+                                                                  final 
CyNetworkTableManager netTableMgr,
+                                                                  final 
CyRootNetworkManager rootNetMgr) {
        this.networkMgr = networkMgr;
                this.networkViewMgr = networkViewMgr;
                this.vmm = vmm;
@@ -61,10 +70,12 @@
                this.netViewFactory = netViewFactory;
                this.naming = naming;
                this.appMgr = appMgr;
+               this.netTableMgr = netTableMgr;
+               this.rootNetMgr = rootNetMgr;
     }
 
     public TaskIterator createTaskIterator(CyNetwork network) {
        return new TaskIterator(2,new CloneNetworkTask(network, networkMgr, 
networkViewMgr, vmm, netFactory, 
-                       netViewFactory, naming, appMgr));
+                       netViewFactory, naming, appMgr, netTableMgr, 
rootNetMgr));
     }
 }

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