Author: mes
Date: 2011-11-01 17:07:15 -0700 (Tue, 01 Nov 2011)
New Revision: 27367

Added:
   
core3/api/trunk/core-task-api/src/main/java/org/cytoscape/task/creation/LoadVisualStyles.java
   
core3/api/trunk/work-api/src/main/java/org/cytoscape/work/SynchronousTaskManager.java
   
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/
   
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/LoggingTaskMonitor.java
   
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTaskManager.java
   
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandler.java
   
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandlerFactory.java
   
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableMutator.java
   core3/impl/trunk/work-swing-impl/impl/src/test/
   core3/impl/trunk/work-swing-impl/impl/src/test/java/
   core3/impl/trunk/work-swing-impl/impl/src/test/java/org/
   core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/
   core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/
   
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/
   
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/
   
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/SyncTaskManagerTest.java
   
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/SyncTunableHandlerTest.java
   
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/SyncTunableMutatorTest.java
   
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/TunableHolder.java
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/NewEmptyNetworkTask.java
   
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/NewEmptyNetworkTaskFactory.java
   
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/loadvizmap/LoadVizmapFileTask.java
   
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/loadvizmap/LoadVizmapFileTaskFactoryImpl.java
   
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/CyActivator.java
   core3/impl/trunk/work-swing-impl/pom.xml
Log:
added support for a SynchronousTaskManager that executes tasks synchronously 
and ported tasks that used to use ValuedTask to use this instead

Added: 
core3/api/trunk/core-task-api/src/main/java/org/cytoscape/task/creation/LoadVisualStyles.java
===================================================================
--- 
core3/api/trunk/core-task-api/src/main/java/org/cytoscape/task/creation/LoadVisualStyles.java
                               (rev 0)
+++ 
core3/api/trunk/core-task-api/src/main/java/org/cytoscape/task/creation/LoadVisualStyles.java
       2011-11-02 00:07:15 UTC (rev 27367)
@@ -0,0 +1,19 @@
+
+package org.cytoscape.task.creation;
+
+import org.cytoscape.view.vizmap.VisualStyle;
+import java.util.Set;
+import java.io.File;
+
+/**
+ * An interface for creating new, empty network views.
+ */
+public interface LoadVisualStyles {
+
+       /**
+        * Return a set of VisualStyle objects read from the specified file. 
+        * @param f The file containing visual styles to be read.
+        * @return a set of VisualStyle objects read from the specified file. 
+        */
+       Set<VisualStyle> loadStyles(File f);
+}

Added: 
core3/api/trunk/work-api/src/main/java/org/cytoscape/work/SynchronousTaskManager.java
===================================================================
--- 
core3/api/trunk/work-api/src/main/java/org/cytoscape/work/SynchronousTaskManager.java
                               (rev 0)
+++ 
core3/api/trunk/work-api/src/main/java/org/cytoscape/work/SynchronousTaskManager.java
       2011-11-02 00:07:15 UTC (rev 27367)
@@ -0,0 +1,14 @@
+
+
+package org.cytoscape.work;
+
+import java.util.Map;
+
+/**
+ * A marker interface that indicates that the TaskManager in question will
+ * execute the tasks found in the TaskFactory synchronously, rather than
+ * asynchronously.
+ */
+public interface SynchronousTaskManager<T> extends 
TaskManager<T,Map<String,Object>> {
+
+}

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
  2011-11-02 00:02:29 UTC (rev 27366)
+++ 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/CyActivator.java
  2011-11-02 00:07:15 UTC (rev 27367)
@@ -17,6 +17,7 @@
 import org.cytoscape.io.read.CySessionReaderManager;
 import org.cytoscape.io.read.VizmapReaderManager;
 import org.cytoscape.work.TaskManager;
+import org.cytoscape.work.SynchronousTaskManager;
 import org.cytoscape.property.CyProperty;
 import org.cytoscape.session.CyNetworkNaming;
 import org.cytoscape.io.write.CySessionWriterManager;
@@ -31,6 +32,7 @@
 import org.cytoscape.io.write.VizmapWriterManager;
 import org.cytoscape.io.read.CyNetworkReaderManager;
 import org.cytoscape.io.util.RecentlyOpenedTracker;
+import org.cytoscape.task.creation.LoadVisualStyles;
 
 import org.cytoscape.task.internal.export.vizmap.ExportVizmapTaskFactory;
 import org.cytoscape.task.internal.table.DeleteColumnTaskFactory;
@@ -156,10 +158,11 @@
                RenderingEngineManager renderingEngineManagerServiceRef = 
getService(bc,RenderingEngineManager.class);
                CyLayoutAlgorithmManager cyLayoutsServiceRef = 
getService(bc,CyLayoutAlgorithmManager.class);
                CyTableWriterManager cyTableWriterManagerRef = 
getService(bc,CyTableWriterManager.class);
+               SynchronousTaskManager synchronousTaskManagerServiceRef = 
getService(bc,SynchronousTaskManager.class);
                
                LoadAttributesFileTaskFactoryImpl loadAttrsFileTaskFactory = 
new 
LoadAttributesFileTaskFactoryImpl(cyDataTableReaderManagerServiceRef,cyTableManagerServiceRef);
                LoadAttributesURLTaskFactoryImpl loadAttrsURLTaskFactory = new 
LoadAttributesURLTaskFactoryImpl(cyDataTableReaderManagerServiceRef,cyTableManagerServiceRef);
-               LoadVizmapFileTaskFactoryImpl loadVizmapFileTaskFactory = new 
LoadVizmapFileTaskFactoryImpl(vizmapReaderManagerServiceRef,visualMappingManagerServiceRef);
+               LoadVizmapFileTaskFactoryImpl loadVizmapFileTaskFactory = new 
LoadVizmapFileTaskFactoryImpl(vizmapReaderManagerServiceRef,visualMappingManagerServiceRef,synchronousTaskManagerServiceRef);
                LoadNetworkFileTaskFactoryImpl loadNetworkFileTaskFactory = new 
LoadNetworkFileTaskFactoryImpl(cyNetworkReaderManagerServiceRef,cyNetworkManagerServiceRef,cyNetworkViewManagerServiceRef,cyPropertyServiceRef,cyNetworkNamingServiceRef);
                LoadNetworkURLTaskFactoryImpl loadNetworkURLTaskFactory = new 
LoadNetworkURLTaskFactoryImpl(cyNetworkReaderManagerServiceRef,cyNetworkManagerServiceRef,cyNetworkViewManagerServiceRef,cyPropertyServiceRef,cyNetworkNamingServiceRef,streamUtilRef);
                SetCurrentNetworkTaskFactoryImpl setCurrentNetworkTaskFactory = 
new 
SetCurrentNetworkTaskFactoryImpl(cyApplicationManagerServiceRef,cyNetworkManagerServiceRef);
@@ -183,7 +186,7 @@
                UnHideAllTaskFactory unHideAllTaskFactory = new 
UnHideAllTaskFactory(undoSupportServiceRef,cyEventHelperRef);
                UnHideAllNodesTaskFactory unHideAllNodesTaskFactory = new 
UnHideAllNodesTaskFactory(undoSupportServiceRef,cyEventHelperRef);
                UnHideAllEdgesTaskFactory unHideAllEdgesTaskFactory = new 
UnHideAllEdgesTaskFactory(undoSupportServiceRef,cyEventHelperRef);
-               NewEmptyNetworkTaskFactory newEmptyNetworkTaskFactory = new 
NewEmptyNetworkTaskFactory(cyNetworkFactoryServiceRef,cyNetworkViewFactoryServiceRef,cyNetworkManagerServiceRef,cyNetworkViewManagerServiceRef,cyNetworkNamingServiceRef,taskManagerServiceRef);
+               NewEmptyNetworkTaskFactory newEmptyNetworkTaskFactory = new 
NewEmptyNetworkTaskFactory(cyNetworkFactoryServiceRef,cyNetworkViewFactoryServiceRef,cyNetworkManagerServiceRef,cyNetworkViewManagerServiceRef,cyNetworkNamingServiceRef,synchronousTaskManagerServiceRef);
                CloneNetworkTaskFactory cloneNetworkTaskFactory = new 
CloneNetworkTaskFactory(cyNetworkManagerServiceRef,cyNetworkViewManagerServiceRef,visualMappingManagerServiceRef,cyNetworkFactoryServiceRef,cyNetworkViewFactoryServiceRef,cyNetworkNamingServiceRef,cyEventHelperRef);
                NewNetworkSelectedNodesEdgesTaskFactory 
newNetworkSelectedNodesEdgesTaskFactory = new 
NewNetworkSelectedNodesEdgesTaskFactory(undoSupportServiceRef,cyRootNetworkFactoryServiceRef,cyNetworkViewFactoryServiceRef,cyNetworkManagerServiceRef,cyNetworkViewManagerServiceRef,cyNetworkNamingServiceRef,visualMappingManagerServiceRef,cyApplicationManagerServiceRef,cyEventHelperRef);
                NewNetworkSelectedNodesOnlyTaskFactory 
newNetworkSelectedNodesOnlyTaskFactory = new 
NewNetworkSelectedNodesOnlyTaskFactory(undoSupportServiceRef,cyRootNetworkFactoryServiceRef,cyNetworkViewFactoryServiceRef,cyNetworkManagerServiceRef,cyNetworkViewManagerServiceRef,cyNetworkNamingServiceRef,visualMappingManagerServiceRef,cyApplicationManagerServiceRef,cyEventHelperRef);
@@ -246,6 +249,7 @@
                loadVizmapFileTaskFactoryProps.setProperty("menuGravity","3.0");
                loadVizmapFileTaskFactoryProps.setProperty("title","Vizmap 
File...");
                registerService(bc,loadVizmapFileTaskFactory,TaskFactory.class, 
loadVizmapFileTaskFactoryProps);
+               
registerService(bc,loadVizmapFileTaskFactory,LoadVisualStyles.class, new 
Properties());
 
                Properties loadAttrsFileTaskFactoryProps = new Properties();
                
loadAttrsFileTaskFactoryProps.setProperty("preferredMenu","File.Import.Table");

Modified: 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/NewEmptyNetworkTask.java
===================================================================
--- 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/NewEmptyNetworkTask.java
 2011-11-02 00:02:29 UTC (rev 27366)
+++ 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/NewEmptyNetworkTask.java
 2011-11-02 00:07:15 UTC (rev 27367)
@@ -38,7 +38,7 @@
 import org.cytoscape.view.model.CyNetworkViewManager;
 import org.cytoscape.view.model.CyNetworkViewFactory;
 import org.cytoscape.work.TaskMonitor;
-import org.cytoscape.work.ValuedTask;
+import org.cytoscape.work.AbstractTask;
 import org.cytoscape.session.CyNetworkNaming;
 
 
@@ -46,7 +46,7 @@
  * Create an empty network with view.
  *
  */
-public class NewEmptyNetworkTask implements ValuedTask<CyNetworkView> {
+public class NewEmptyNetworkTask extends AbstractTask {
 
        private final CyNetworkFactory cnf;
        private final CyNetworkViewFactory cnvf;
@@ -55,6 +55,8 @@
        private final CyNetworkViewManager networkViewManager;
        private boolean cancel = false;
 
+       private CyNetworkView view; 
+
        public NewEmptyNetworkTask(CyNetworkFactory cnf, CyNetworkViewFactory 
cnvf, CyNetworkManager netmgr,
                                   final CyNetworkViewManager 
networkViewManager, final CyNetworkNaming namingUtil) {
                this.networkManager = netmgr;
@@ -64,17 +66,20 @@
                this.namingUtil = namingUtil;
        }
 
-       public CyNetworkView run(TaskMonitor tm) {
+       public void run(TaskMonitor tm) {
                final CyNetwork newNet = cnf.getInstance();
                newNet.getCyRow().set(CyTableEntry.NAME, 
namingUtil.getSuggestedNetworkTitle("Network"));
-               final CyNetworkView view = cnvf.getNetworkView(newNet);         
+               view = cnvf.getNetworkView(newNet);             
                networkManager.addNetwork(newNet);
                networkViewManager.addNetworkView(view);
-               return view;
        }
 
        @Override
        public void cancel() {
                cancel = true;
        }
+
+       public CyNetworkView getView() {
+               return view;
+       }
 }

Modified: 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/NewEmptyNetworkTaskFactory.java
===================================================================
--- 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/NewEmptyNetworkTaskFactory.java
  2011-11-02 00:02:29 UTC (rev 27366)
+++ 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/creation/NewEmptyNetworkTaskFactory.java
  2011-11-02 00:07:15 UTC (rev 27367)
@@ -32,7 +32,7 @@
 import org.cytoscape.model.CyNetworkManager;
 import org.cytoscape.work.TaskFactory;
 import org.cytoscape.work.TaskIterator;
-import org.cytoscape.work.TaskManager;
+import org.cytoscape.work.SynchronousTaskManager;
 import org.cytoscape.work.ValuedTaskExecutor;
 import org.cytoscape.model.CyNetworkFactory;
 import org.cytoscape.view.model.CyNetworkViewFactory;
@@ -47,33 +47,29 @@
        private final CyNetworkManager netmgr;
        private final CyNetworkViewManager networkViewManager;
        private final CyNetworkNaming namingUtil;
-       private final TaskManager taskManager;
+       private final SynchronousTaskManager syncTaskMgr;
 
        private ValuedTaskExecutor<CyNetworkView> resultHolder; 
+       private NewEmptyNetworkTask task; 
 
-       public NewEmptyNetworkTaskFactory(final CyNetworkFactory cnf, final 
CyNetworkViewFactory cnvf, final CyNetworkManager netmgr, final 
CyNetworkViewManager networkViewManager, final CyNetworkNaming namingUtil, 
final TaskManager taskManager)
+       public NewEmptyNetworkTaskFactory(final CyNetworkFactory cnf, final 
CyNetworkViewFactory cnvf, final CyNetworkManager netmgr, final 
CyNetworkViewManager networkViewManager, final CyNetworkNaming namingUtil, 
final SynchronousTaskManager syncTaskMgr)
        {
                this.cnf = cnf;
                this.cnvf = cnvf;
                this.netmgr = netmgr;
                this.networkViewManager = networkViewManager;
                this.namingUtil = namingUtil;
-               this.taskManager = taskManager;
+               this.syncTaskMgr = syncTaskMgr;
        }
 
        public TaskIterator getTaskIterator() {
-               resultHolder = new ValuedTaskExecutor<CyNetworkView>(
-                       new NewEmptyNetworkTask(cnf, cnvf, netmgr, 
networkViewManager,namingUtil));
-
-               return new TaskIterator(resultHolder);
+               task = new NewEmptyNetworkTask(cnf, cnvf, netmgr, 
networkViewManager,namingUtil);
+               return new TaskIterator(task);
        } 
 
        public CyNetworkView createNewEmptyNetworkView() {
-               taskManager.execute(this);      
-               CyNetworkView view = null; 
-               try {
-                       view = resultHolder.get();
-               } catch (Exception ie) { ie.printStackTrace(); return null; }
-               return view;
+               // no tunables, so no need to set the execution context
+               syncTaskMgr.execute(this);      
+               return task.getView(); 
        }
 }

Modified: 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/loadvizmap/LoadVizmapFileTask.java
===================================================================
--- 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/loadvizmap/LoadVizmapFileTask.java
        2011-11-02 00:02:29 UTC (rev 27366)
+++ 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/loadvizmap/LoadVizmapFileTask.java
        2011-11-02 00:07:15 UTC (rev 27367)
@@ -18,6 +18,7 @@
 
        private final VisualMappingManager vmMgr;
        private final VizmapReaderManager vizmapReaderMgr;
+       private AddVisualStylesTask addVSTask;
 
        public LoadVizmapFileTask(VizmapReaderManager vizmapReaderMgr, 
VisualMappingManager vmMgr) {
                this.vizmapReaderMgr = vizmapReaderMgr;
@@ -26,20 +27,29 @@
 
        @Override
        public void run(final TaskMonitor taskMonitor) throws Exception {
-               if (file == null) throw new NullPointerException("No file 
specified!");
+               if (file == null) 
+                       throw new NullPointerException("No file specified!");
 
                VizmapReader reader = vizmapReaderMgr.getReader(file.toURI(), 
file.getName());
 
-               if (reader == null) throw new NullPointerException("Failed to 
find appropriate reader for file: " + file);
+               if (reader == null) 
+                       throw new NullPointerException("Failed to find 
appropriate reader for file: " + file);
 
-               insertTasksAfterCurrentTask(reader, new 
AddVisualStylesTask(reader, vmMgr));
+               addVSTask = new AddVisualStylesTask(reader, vmMgr);
+
+               insertTasksAfterCurrentTask(reader, addVSTask);
        }
+
+       public Set<VisualStyle> getStyles() {
+               return addVSTask.getStyles();
+       }
 }
 
 class AddVisualStylesTask extends AbstractTask {
 
        private final VizmapReader reader;
        private final VisualMappingManager vmMgr;
+       private Set<VisualStyle> styles; 
 
        public AddVisualStylesTask(VizmapReader reader, VisualMappingManager 
vmMgr) {
                this.reader = reader;
@@ -49,7 +59,7 @@
        @Override
        public void run(TaskMonitor taskMonitor) throws Exception {
                taskMonitor.setTitle("Loading visual styles...");
-               final Set<VisualStyle> styles = reader.getVisualStyles();
+               styles = reader.getVisualStyles();
 
                if (styles != null) {
                        int count = 1;
@@ -73,4 +83,8 @@
                        }
                }
        }
+
+       public Set<VisualStyle> getStyles() {
+               return styles; 
+       }
 }

Modified: 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/loadvizmap/LoadVizmapFileTaskFactoryImpl.java
===================================================================
--- 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/loadvizmap/LoadVizmapFileTaskFactoryImpl.java
     2011-11-02 00:02:29 UTC (rev 27366)
+++ 
core3/impl/trunk/core-task-impl/src/main/java/org/cytoscape/task/internal/loadvizmap/LoadVizmapFileTaskFactoryImpl.java
     2011-11-02 00:07:15 UTC (rev 27367)
@@ -2,23 +2,47 @@
 
 import org.cytoscape.io.read.VizmapReaderManager;
 import org.cytoscape.view.vizmap.VisualMappingManager;
+import org.cytoscape.view.vizmap.VisualStyle;
 import org.cytoscape.work.TaskFactory;
 import org.cytoscape.work.TaskIterator;
+import org.cytoscape.work.SynchronousTaskManager;
+import org.cytoscape.task.creation.LoadVisualStyles;
 
+import java.util.Set;
+import java.util.Map;
+import java.util.HashMap;
+import java.io.File;
 
-public class LoadVizmapFileTaskFactoryImpl implements TaskFactory {
 
+public class LoadVizmapFileTaskFactoryImpl implements TaskFactory, 
LoadVisualStyles {
+
        private final VizmapReaderManager vizmapReaderMgr;
        private final VisualMappingManager vmMgr;
+       private final SynchronousTaskManager syncTaskManager;
+
+       private LoadVizmapFileTask task; 
        
-       public LoadVizmapFileTaskFactoryImpl(VizmapReaderManager 
vizmapReaderMgr, VisualMappingManager vmMgr) {
+       public LoadVizmapFileTaskFactoryImpl(VizmapReaderManager 
vizmapReaderMgr, VisualMappingManager vmMgr, SynchronousTaskManager 
syncTaskManager) {
                this.vizmapReaderMgr = vizmapReaderMgr;
                this.vmMgr = vmMgr;
+               this.syncTaskManager = syncTaskManager;
        }
 
        @Override
        public TaskIterator getTaskIterator() {
-               return new TaskIterator(new LoadVizmapFileTask(vizmapReaderMgr, 
vmMgr));
+               task = new LoadVizmapFileTask(vizmapReaderMgr, vmMgr);
+               return new TaskIterator(task);
        }
 
+       public Set<VisualStyle> loadStyles(File f) {
+               // Set up map containing values to be assigned to tunables.
+               // The name "file" is the name of the tunable field in 
LoadVizmapFileTask.
+               Map<String,Object> m = new HashMap<String,Object>();
+               m.put("file",f);
+
+               syncTaskManager.setExecutionContext(m);
+               syncTaskManager.execute(this);
+
+               return task.getStyles();
+       }
 }

Modified: 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/CyActivator.java
===================================================================
--- 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/CyActivator.java
    2011-11-02 00:02:29 UTC (rev 27366)
+++ 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/CyActivator.java
    2011-11-02 00:07:15 UTC (rev 27367)
@@ -8,6 +8,7 @@
 import org.cytoscape.util.swing.FileUtil;
 import org.cytoscape.property.bookmark.BookmarksUtil;
 
+import org.cytoscape.work.internal.sync.*;
 import org.cytoscape.work.internal.task.*;
 import org.cytoscape.work.internal.tunables.*;
 import org.cytoscape.work.internal.submenu.*;
@@ -16,6 +17,7 @@
 
 import org.cytoscape.work.swing.BasicGUITunableHandlerFactory;
 import org.cytoscape.work.TaskManager;
+import org.cytoscape.work.SynchronousTaskManager;
 import org.cytoscape.work.undo.UndoSupport;
 import org.cytoscape.work.swing.GUITunableHandlerFactory;
 import org.cytoscape.work.TunableHandlerFactory;
@@ -75,6 +77,10 @@
                BasicGUITunableHandlerFactory 
listMultipleSelectionHandlerFactory = new 
BasicGUITunableHandlerFactory(ListMultipleHandler.class,ListMultipleSelection.class);
                URLHandlerFactory urlHandlerFactory = new 
URLHandlerFactory(bookmarkServiceRef,bookmarksUtilServiceRef);
                FileHandlerFactory fileHandlerFactory = new 
FileHandlerFactory(fileUtilRef,supportedFileTypesManager);
+
+               SyncTunableMutator syncTunableMutator = new 
SyncTunableMutator();
+               SyncTunableHandlerFactory syncTunableHandlerFactory = new 
SyncTunableHandlerFactory();
+               SyncTaskManager syncTaskManager = new 
SyncTaskManager(syncTunableMutator);
                
                registerService(bc,undoSupport,UndoSupport.class, new 
Properties());
 
@@ -101,15 +107,19 @@
                
registerService(bc,listMultipleSelectionHandlerFactory,GUITunableHandlerFactory.class,
 new Properties());
                
registerService(bc,fileHandlerFactory,GUITunableHandlerFactory.class, new 
Properties());
                
registerService(bc,urlHandlerFactory,GUITunableHandlerFactory.class, new 
Properties());
+               
registerService(bc,syncTaskManager,SynchronousTaskManager.class, new 
Properties());
+               
registerService(bc,syncTunableHandlerFactory,TunableHandlerFactory.class, new 
Properties());
 
                
registerServiceListener(bc,supportedFileTypesManager,"addInputStreamTaskFactory","removeInputStreamTaskFactory",InputStreamTaskFactory.class);
                
registerServiceListener(bc,supportedFileTypesManager,"addCyWriterTaskFactory","removeCyWriterTaskFactory",CyWriterFactory.class);
 
                
registerServiceListener(bc,jDialogTaskManager,"addTunableRecorder","removeTunableRecorder",TunableRecorder.class);
+               
registerServiceListener(bc,syncTaskManager,"addTunableRecorder","removeTunableRecorder",TunableRecorder.class);
 
                
registerServiceListener(bc,jPanelTunableMutator,"addTunableHandlerFactory","removeTunableHandlerFactory",GUITunableHandlerFactory.class,
 TunableHandlerFactory.class);
                
registerServiceListener(bc,jDialogTunableMutator,"addTunableHandlerFactory","removeTunableHandlerFactory",GUITunableHandlerFactory.class,
 TunableHandlerFactory.class);
                
registerServiceListener(bc,submenuTunableMutator,"addTunableHandlerFactory","removeTunableHandlerFactory",SubmenuTunableHandlerFactory.class,
 TunableHandlerFactory.class);
+               
registerServiceListener(bc,syncTunableMutator,"addTunableHandlerFactory","removeTunableHandlerFactory",SyncTunableHandlerFactory.class,
 TunableHandlerFactory.class);
 
        }
 }

Added: 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/LoggingTaskMonitor.java
===================================================================
--- 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/LoggingTaskMonitor.java
                                (rev 0)
+++ 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/LoggingTaskMonitor.java
        2011-11-02 00:07:15 UTC (rev 27367)
@@ -0,0 +1,41 @@
+
+package org.cytoscape.work.internal.sync;
+
+
+import org.cytoscape.work.Task;
+import org.cytoscape.work.TaskMonitor;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+class LoggingTaskMonitor implements TaskMonitor {
+       
+       private static final Logger logger = 
LoggerFactory.getLogger(LoggingTaskMonitor.class);
+
+       private Task task;
+
+       public LoggingTaskMonitor() {
+       }
+
+       public void setTask(final Task newTask) {
+               this.task = newTask;
+       }
+
+       public void setTitle(String title) {
+               logger.info("Task (" + task.toString() + ") title: " + title);
+       }
+
+       public void setStatusMessage(String statusMessage) {
+               logger.info("Task (" + task.toString() + ") status: " + 
statusMessage);
+       }
+
+       public void setProgress(double progress) {
+               int prog = (int) Math.floor(progress * 100);
+               logger.info("Task (" + task.toString() + ") progress: " + prog 
+ "%");
+       }
+
+       public void showException(Exception exception) {
+               logger.error("Exception executing task!", exception);
+       }
+}

Added: 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTaskManager.java
===================================================================
--- 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTaskManager.java
                           (rev 0)
+++ 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTaskManager.java
   2011-11-02 00:07:15 UTC (rev 27367)
@@ -0,0 +1,88 @@
+package org.cytoscape.work.internal.sync;
+
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import org.cytoscape.work.AbstractTaskManager;
+import org.cytoscape.work.SynchronousTaskManager;
+import org.cytoscape.work.Task;
+import org.cytoscape.work.TaskFactory;
+import org.cytoscape.work.TaskIterator;
+import org.cytoscape.work.TunableMutator;
+import org.cytoscape.work.TunableRecorder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Uses Swing components to create a user interface for the <code>Task</code>.
+ *
+ * This will not work if the application is running in headless mode.
+ */
+public class SyncTaskManager extends 
AbstractTaskManager<Object,Map<String,Object>> implements 
SynchronousTaskManager<Object> {
+
+       private static final Logger logger = 
LoggerFactory.getLogger(SyncTaskManager.class);
+
+
+       private final SyncTunableMutator syncTunableMutator;
+
+       /**
+        * Construct with default behavior.
+        */
+       public SyncTaskManager(final SyncTunableMutator tunableMutator) {
+               super(tunableMutator);
+               this.syncTunableMutator = tunableMutator;
+       }
+
+
+       @Override 
+       public void setExecutionContext(final Map<String,Object> o) {
+               syncTunableMutator.setConfigurationContext(o);
+       }
+
+
+       @Override 
+       public Object getConfiguration(TaskFactory tf) {
+               throw new UnsupportedOperationException("There is no 
configuration available for a SyncrhonousTaskManager");    
+       }
+
+
+       @Override
+       public void execute(final TaskFactory factory) {
+               final LoggingTaskMonitor taskMonitor = new LoggingTaskMonitor();
+               
+               try {
+
+                       if ( !displayTunables(factory) )
+                               return;
+
+                       TaskIterator taskIterator = factory.getTaskIterator();
+
+                       // now execute all subsequent tasks
+                       while (taskIterator.hasNext()) {
+                               final Task task = taskIterator.next();
+                               taskMonitor.setTask(task);
+
+                               if (!displayTunables(task))
+                                       return;
+
+                               task.run(taskMonitor);
+                       }
+
+               } catch (Exception exception) {
+                       taskMonitor.showException(exception);
+               }
+       }
+
+
+       private boolean displayTunables(final Object task) throws Exception {
+               boolean ret = syncTunableMutator.validateAndWriteBack(task);
+
+               for ( TunableRecorder ti : tunableRecorders ) 
+                       ti.recordTunableState(task);
+
+               return ret;
+       }
+}
+

Added: 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandler.java
===================================================================
--- 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandler.java
                                (rev 0)
+++ 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandler.java
        2011-11-02 00:07:15 UTC (rev 27367)
@@ -0,0 +1,41 @@
+
+package org.cytoscape.work.internal.sync;
+
+import org.cytoscape.work.AbstractTunableHandler;
+import org.cytoscape.work.Tunable;
+import org.cytoscape.work.TaskFactory;
+import org.cytoscape.work.swing.SubmenuTunableHandler; 
+import org.cytoscape.work.swing.DialogTaskManager;
+import org.cytoscape.work.util.ListSingleSelection;
+
+import java.util.Collections; 
+import java.util.ArrayList; 
+import java.util.Map; 
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+
+public class SyncTunableHandler extends AbstractTunableHandler {
+
+       private Map<String,Object> valueMap; 
+
+       public SyncTunableHandler(final Field field, final Object instance, 
final Tunable tunable) {
+               super(field,instance,tunable);
+       }
+
+       public SyncTunableHandler(final Method getter, final Method setter, 
final Object instance, final Tunable tunable) {
+               super(getter,setter,instance,tunable);
+       }
+
+       public void handle() {
+               try {
+               setValue( valueMap.get(getName()) );
+               } catch (Exception e) {
+                       throw new RuntimeException("Exception setting tunable 
value.", e);
+               }
+       }
+
+       public void setValueMap(Map<String,Object> valueMap) {
+               this.valueMap = valueMap;
+       }
+}

Added: 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandlerFactory.java
===================================================================
--- 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandlerFactory.java
                         (rev 0)
+++ 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandlerFactory.java
 2011-11-02 00:07:15 UTC (rev 27367)
@@ -0,0 +1,22 @@
+
+
+package org.cytoscape.work.internal.sync;
+
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import org.cytoscape.work.Tunable;
+import org.cytoscape.work.TunableHandlerFactory;
+
+
+public class SyncTunableHandlerFactory implements 
TunableHandlerFactory<SyncTunableHandler> {
+
+       public SyncTunableHandler getHandler(final Field field, final Object 
instance, final Tunable tunable) {
+               return new SyncTunableHandler(field,instance,tunable);
+       }
+
+       public SyncTunableHandler getHandler(final Method getter, final Method 
setter, final Object instance, final Tunable tunable) {
+               return new SyncTunableHandler(getter,setter,instance,tunable);
+       }
+}

Added: 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableMutator.java
===================================================================
--- 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableMutator.java
                                (rev 0)
+++ 
core3/impl/trunk/work-swing-impl/impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableMutator.java
        2011-11-02 00:07:15 UTC (rev 27367)
@@ -0,0 +1,33 @@
+
+
+package org.cytoscape.work.internal.sync;
+
+import org.cytoscape.work.TunableMutator;
+import org.cytoscape.work.TunableHandler;
+import org.cytoscape.work.AbstractTunableInterceptor;
+
+import java.util.Map;
+
+public class SyncTunableMutator<S> extends 
AbstractTunableInterceptor<SyncTunableHandler> implements 
TunableMutator<SyncTunableHandler, S> {
+
+       private Map<String,Object> map;
+
+       public void setConfigurationContext(Object o) {
+               if ( o != null && o instanceof Map ) 
+                       map = (Map<String,Object>)o;
+       }
+
+       public S buildConfiguration(Object o) {
+               return null;
+       }
+
+       public boolean validateAndWriteBack(Object o) {
+               Map<String,SyncTunableHandler> handlers = getHandlers(o);
+               for ( SyncTunableHandler handler : handlers.values() ) {
+                       handler.setValueMap(map);
+                       handler.handle();
+               }
+               return true;
+       }
+}
+

Added: 
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/SyncTaskManagerTest.java
===================================================================
--- 
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/SyncTaskManagerTest.java
                               (rev 0)
+++ 
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/SyncTaskManagerTest.java
       2011-11-02 00:07:15 UTC (rev 27367)
@@ -0,0 +1,43 @@
+package org.cytoscape.work.internal.sync;
+
+
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+import org.cytoscape.work.*;
+
+import java.lang.reflect.Field;
+import java.util.*;
+
+public class SyncTaskManagerTest {
+
+       @Test
+       public void testTaskManager() {
+               SyncTunableMutator stm = new SyncTunableMutator();
+               stm.addTunableHandlerFactory( new SyncTunableHandlerFactory(), 
new Properties() );
+               SyncTaskManager taskManager = new SyncTaskManager(stm);
+
+               Map<String,Object> map = new HashMap<String,Object>();
+               map.put("tstring","hello");
+
+               taskManager.setExecutionContext(map);
+
+               TestTaskFactory tf = new TestTaskFactory();
+               
+               taskManager.execute(tf);
+       }
+
+       public class TestTaskFactory implements TaskFactory {
+               public TaskIterator getTaskIterator() { return new 
TaskIterator( new TestTask() ); }
+       }
+
+       public class TestTask extends AbstractTask {
+               @Tunable(description="asdf")
+               public String tstring = "goodbye";
+
+               public void run(TaskMonitor tm) {
+                       assertEquals("hello",tstring);
+               }
+       }
+}

Added: 
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/SyncTunableHandlerTest.java
===================================================================
--- 
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/SyncTunableHandlerTest.java
                            (rev 0)
+++ 
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/SyncTunableHandlerTest.java
    2011-11-02 00:07:15 UTC (rev 27367)
@@ -0,0 +1,36 @@
+package org.cytoscape.work.internal.sync;
+
+
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+import org.cytoscape.work.Tunable;
+
+import java.lang.reflect.Field;
+import java.util.*;
+
+public class SyncTunableHandlerTest {
+
+
+       @Test
+       public void testSyncTunableHandler() throws Exception {
+               TunableHolder th = new TunableHolder();
+
+        final Field stringField = th.getClass().getField("tstring");
+        final Tunable tun = stringField.getAnnotation(Tunable.class);
+        SyncTunableHandler syncHandler = new SyncTunableHandler(stringField, 
th, tun);
+
+               Map<String,Object> map = new HashMap<String,Object>();
+               map.put("tstring","hello");
+
+               syncHandler.setValueMap(map);
+
+               assertEquals("goodbye",th.tstring);
+
+               syncHandler.handle();
+
+               assertEquals("hello",th.tstring);
+       }
+
+}

Added: 
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/SyncTunableMutatorTest.java
===================================================================
--- 
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/SyncTunableMutatorTest.java
                            (rev 0)
+++ 
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/SyncTunableMutatorTest.java
    2011-11-02 00:07:15 UTC (rev 27367)
@@ -0,0 +1,33 @@
+package org.cytoscape.work.internal.sync;
+
+
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+import org.cytoscape.work.Tunable;
+
+import java.lang.reflect.Field;
+import java.util.*;
+
+public class SyncTunableMutatorTest {
+
+       @Test
+       public void testTunableMutator() {
+               SyncTunableMutator stm = new SyncTunableMutator();
+               stm.addTunableHandlerFactory( new SyncTunableHandlerFactory(), 
new Properties() );
+
+               Map<String,Object> map = new HashMap<String,Object>();
+               map.put("tstring","hello");
+
+               stm.setConfigurationContext(map);
+
+               TunableHolder th = new TunableHolder();
+
+               assertEquals("goodbye",th.tstring);
+
+               stm.validateAndWriteBack(th);
+
+               assertEquals("hello",th.tstring);
+       }
+}

Added: 
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/TunableHolder.java
===================================================================
--- 
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/TunableHolder.java
                             (rev 0)
+++ 
core3/impl/trunk/work-swing-impl/impl/src/test/java/org/cytoscape/work/internal/sync/TunableHolder.java
     2011-11-02 00:07:15 UTC (rev 27367)
@@ -0,0 +1,9 @@
+package org.cytoscape.work.internal.sync;
+
+import org.cytoscape.work.Tunable;
+
+
+public class TunableHolder {
+       @Tunable(description="something")
+       public String tstring = "goodbye";
+}

Modified: core3/impl/trunk/work-swing-impl/pom.xml
===================================================================
--- core3/impl/trunk/work-swing-impl/pom.xml    2011-11-02 00:02:29 UTC (rev 
27366)
+++ core3/impl/trunk/work-swing-impl/pom.xml    2011-11-02 00:07:15 UTC (rev 
27367)
@@ -132,5 +132,10 @@
                        <artifactId>event-api</artifactId>
                        <scope>provided</scope>
                </dependency>
+               <dependency>
+                       <groupId>junit</groupId>
+                       <artifactId>junit</artifactId>
+                       <scope>test</scope>
+               </dependency>
        </dependencies>
 </project>

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