Author: mkirby
Date: 2012-05-04 14:03:18 -0700 (Fri, 04 May 2012)
New Revision: 29119

Added:
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/DelegateTask.java
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/DelegatingTaskMonitor.java
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/LoggingTaskMonitor.java
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTaskManager.java
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandler.java
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableMutator.java
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/TunableRecorderManager.java
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/TunableSetterImpl.java
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/task/HDialogTaskManager.java
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/task/UndoSupportImpl.java
Removed:
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/UndoSupportImpl.java
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/task/HeadlessTaskManager.java
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/tunables/
Modified:
   core3/impl/trunk/work-headless-impl/pom.xml
   
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/CyActivator.java
Log:
mkirby: Minimum work-headless-impl to get headless running.

Modified: core3/impl/trunk/work-headless-impl/pom.xml
===================================================================
--- core3/impl/trunk/work-headless-impl/pom.xml 2012-05-04 20:54:26 UTC (rev 
29118)
+++ core3/impl/trunk/work-headless-impl/pom.xml 2012-05-04 21:03:18 UTC (rev 
29119)
@@ -1,85 +1,95 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
 
-  <parent>
-    <artifactId>impl-parent</artifactId>
-    <groupId>org.cytoscape</groupId>
-    <version>3.0.0-alpha8-SNAPSHOT</version>
-  </parent>
+       <parent>
+               <artifactId>impl-parent</artifactId>
+               <groupId>org.cytoscape</groupId>
+               <version>3.0.0-alpha8-SNAPSHOT</version>
+       </parent>
 
-  <properties>
-    <bundle.symbolicName>org.cytoscape.work-headless-impl</bundle.symbolicName>
-    <bundle.namespace>org.cytoscape.work.internal</bundle.namespace>
-  </properties>
+       <properties>
+               
<bundle.symbolicName>org.cytoscape.work-headless-impl</bundle.symbolicName>
+               <bundle.namespace>org.cytoscape.work.internal</bundle.namespace>
+       </properties>
 
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.cytoscape</groupId>
-  <artifactId>work-headless-impl</artifactId>
+       <modelVersion>4.0.0</modelVersion>
+       <groupId>org.cytoscape</groupId>
+       <artifactId>work-headless-impl</artifactId>
 
-   <name>Cytoscape Headless Mode Impl (${project.artifactId})</name>
+       <name>${bundle.symbolicName}</name>
 
-  <packaging>bundle</packaging>
+       <packaging>bundle</packaging>
 
-  <repositories>
-      <repository>
-          <id>cytoscape_snapshots</id>
-          <snapshots>
-            <enabled>true</enabled>
-          </snapshots>
-          <releases>
-            <enabled>false</enabled>
-          </releases>
-          <name>Cytoscape Snapshots</name>
-          
<url>http://code.cytoscape.org/nexus/content/repositories/snapshots/</url>
-       </repository>
-       <repository>
-          <id>cytoscape_releases</id>
-          <snapshots>
-            <enabled>false</enabled>
-          </snapshots>
-          <releases>
-            <enabled>true</enabled>
-          </releases>
-          <name>Cytoscape Releases</name>
-          
<url>http://code.cytoscape.org/nexus/content/repositories/releases/</url>
-       </repository>
-  </repositories>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <version>${maven-bundle-plugin.version}</version>
-        <extensions>true</extensions>
-        <configuration>
-          <instructions>
-            <Bundle-SymbolicName>${bundle.symbolicName}</Bundle-SymbolicName>
-            <Bundle-Version>${project.version}</Bundle-Version>
-            <Export-Package>!${bundle.namespace}.*</Export-Package>
-            <Private-Package>${bundle.namespace}.*</Private-Package>
-            
<Bundle-Activator>${bundle.namespace}.CyActivator</Bundle-Activator>
-          </instructions>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-surefire-plugin</artifactId>
+                               
<version>${maven-surefire-plugin.version}</version>
+                               <configuration>
+                                       
<redirectTestOutputToFile>true</redirectTestOutputToFile>
+                               </configuration>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.felix</groupId>
+                               <artifactId>maven-bundle-plugin</artifactId>
+                               
<version>${maven-bundle-plugin.version}</version>
+                               <extensions>true</extensions>
+                               <configuration>
+                                       <instructions>
+                                               
<Bundle-SymbolicName>${bundle.symbolicName}</Bundle-SymbolicName>
+                                               
<Bundle-Version>${project.version}</Bundle-Version>
+                        <Export-Package>!${bundle.namespace}.*</Export-Package>
+                        
<Private-Package>${bundle.namespace}.*</Private-Package>
+                        
<Bundle-Activator>${bundle.namespace}.CyActivator</Bundle-Activator>
+                                       </instructions>
+                               </configuration>
+                       </plugin>
+               </plugins>
+       </build>
 
-  <dependencies>
-    <dependency>
-      <groupId>org.cytoscape</groupId>
-      <artifactId>work-api</artifactId>
-    </dependency>
-    <dependency>
-       <groupId>org.cytoscape</groupId>
-       <artifactId>cy-commons-cli</artifactId>
-       <version>1.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-       <groupId>org.cytoscape</groupId>
-       <artifactId>cmdline-launcher</artifactId>
-       <version>1.0-SNAPSHOT</version>
-    </dependency>
-  </dependencies>
+       <repositories>
+               <repository>
+                       <id>cytoscape_snapshots</id>
+                       <snapshots>
+                               <enabled>true</enabled>
+                       </snapshots>
+                       <releases>
+                               <enabled>false</enabled>
+                       </releases>
+                       <name>Cytoscape Snapshots</name>
+                       
<url>http://code.cytoscape.org/nexus/content/repositories/snapshots/</url>
+               </repository>
+               <repository>
+                       <id>cytoscape_releases</id>
+                       <snapshots>
+                               <enabled>false</enabled>
+                       </snapshots>
+                       <releases>
+                               <enabled>true</enabled>
+                       </releases>
+                       <name>Cytoscape Releases</name>
+                       
<url>http://code.cytoscape.org/nexus/content/repositories/releases/</url>
+               </repository>
+       </repositories>
 
+
+       <dependencies>
+               <dependency>
+                       <groupId>org.cytoscape</groupId>
+                       <artifactId>work-api</artifactId>
+                       <scope>provided</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.cytoscape</groupId>
+                       <artifactId>work-swing-api</artifactId>
+                       <scope>provided</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.cytoscape</groupId>
+                       <artifactId>work-api</artifactId>
+                       <scope>provided</scope>
+               </dependency>
+       </dependencies>
 </project>

Modified: 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/CyActivator.java
===================================================================
--- 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/CyActivator.java
      2012-05-04 20:54:26 UTC (rev 29118)
+++ 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/CyActivator.java
      2012-05-04 21:03:18 UTC (rev 29119)
@@ -1,34 +1,49 @@
-
-package org.cytoscape.work.internal;
-
-import org.cytoscape.cmdline.launcher.CommandLineProvider;
-
-import org.cytoscape.work.internal.UndoSupportImpl;
-import org.cytoscape.work.internal.task.HeadlessTaskManager;
-import org.cytoscape.work.internal.tunables.CLTunableInterceptor;
-import org.cytoscape.work.UndoSupport;
-import org.cytoscape.work.TaskManager;
-import org.cytoscape.work.TunableInterceptor;
-import org.osgi.framework.BundleContext;
-import org.cytoscape.service.util.AbstractCyActivator;
-import java.util.Properties;
-
-public class CyActivator extends AbstractCyActivator {
-       public CyActivator() {
-               super();
-       }
-
-       public void start(BundleContext bc) {
-
-               CommandLineProvider commandLineProviderServiceRef = 
getService(bc,CommandLineProvider.class);
-               
-               UndoSupportImpl undoSupport = new UndoSupportImpl();
-               HeadlessTaskManager headlessTaskManager = new 
HeadlessTaskManager(tunableInterceptor);
-               CLTunableInterceptor tunableInterceptor = new 
CLTunableInterceptor(commandLineProviderServiceRef);
-               
-               registerService(bc,headlessTaskManager,TaskManager.class, new 
Properties());
-               registerService(bc,tunableInterceptor,TunableInterceptor.class, 
new Properties());
-               registerService(bc,undoSupport,UndoSupport.class, new 
Properties());
-       }
-}
-
+package org.cytoscape.work.internal;
+
+import java.util.Properties;
+
+import org.cytoscape.service.util.AbstractCyActivator;
+import org.cytoscape.work.TunableRecorder;
+import org.cytoscape.work.TunableSetter;
+import org.cytoscape.work.internal.sync.SyncTaskManager;
+import org.cytoscape.work.internal.sync.SyncTunableMutator;
+import org.cytoscape.work.internal.sync.TunableRecorderManager;
+import org.cytoscape.work.internal.sync.TunableSetterImpl;
+import org.cytoscape.work.internal.task.*;
+import org.cytoscape.work.swing.DialogTaskManager;
+import org.cytoscape.work.swing.undo.SwingUndoSupport;
+import org.cytoscape.work.undo.UndoSupport;
+import org.osgi.framework.BundleContext;
+
+public class CyActivator extends AbstractCyActivator {
+       public CyActivator() {
+               super();
+       }
+
+
+       public void start(BundleContext bc) {
+       
+               UndoSupportImpl undoSupport = new UndoSupportImpl();
+               
+               DialogTaskManager jDialogTaskManager = new HDialogTaskManager();
+               
+               Properties undoSupportProps = new Properties();
+               registerService(bc,undoSupport,UndoSupport.class, 
undoSupportProps);
+               registerService(bc,undoSupport,SwingUndoSupport.class, 
undoSupportProps);
+               
+               registerService(bc,jDialogTaskManager,DialogTaskManager.class, 
new Properties());
+
+               
+               SyncTunableMutator syncTunableMutator = new 
SyncTunableMutator();
+               SyncTaskManager syncTaskManager = new 
SyncTaskManager(syncTunableMutator);
+               
+               registerAllServices(bc,syncTaskManager, new Properties());
+               
+               TunableRecorderManager trm = new TunableRecorderManager();
+
+               TunableSetterImpl tsi = new 
TunableSetterImpl(syncTunableMutator,trm);
+               registerService(bc,tsi,TunableSetter.class, new Properties());
+               
+               
+       }
+}
\ No newline at end of file

Deleted: 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/UndoSupportImpl.java
===================================================================
--- 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/UndoSupportImpl.java
  2012-05-04 20:54:26 UTC (rev 29118)
+++ 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/UndoSupportImpl.java
  2012-05-04 21:03:18 UTC (rev 29119)
@@ -1,82 +0,0 @@
-/*
-  File: UndoSupportImpl.java
-
-  Copyright (c) 2007, The Cytoscape Consortium (www.cytoscape.org)
-
-  The Cytoscape Consortium is:
-  - Institute for Systems Biology
-  - University of California San Diego
-  - Memorial Sloan-Kettering Cancer Center
-  - Institut Pasteur
-  - Agilent Technologies
-
-  This library is free software; you can redistribute it and/or modify it
-  under the terms of the GNU Lesser General Public License as published
-  by the Free Software Foundation; either version 2.1 of the License, or
-  any later version.
-
-  This library is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF
-  MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  The software and
-  documentation provided hereunder is on an "as is" basis, and the
-  Institute for Systems Biology and the Whitehead Institute
-  have no obligations to provide maintenance, support,
-  updates, enhancements or modifications.  In no event shall the
-  Institute for Systems Biology and the Whitehead Institute
-  be liable to any party for direct, indirect, special,
-  incidental or consequential damages, including lost profits, arising
-  out of the use of this software and its documentation, even if the
-  Institute for Systems Biology and the Whitehead Institute
-  have been advised of the possibility of such damage.  See
-  the GNU Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public License
-  along with this library; if not, write to the Free Software Foundation,
-  Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
-*/
-package org.cytoscape.work.internal;
-
-import javax.swing.undo.UndoManager;
-import javax.swing.undo.UndoableEditSupport;
-import org.cytoscape.work.undo.UndoSupport;
-
-
-/**
- * Rudimentary support for undo.  To post an edit to the manager, call
- * Undo.getUndoableEditSupport().postEdit(yourEdit).  To handle the edits,
- * you should extend this class and write actions, etc. that use the 
- * UndoManager.
- */
-public class UndoSupportImpl implements UndoSupport {
-
-       private UndoManager m_undoManager;
-       private UndoableEditSupport m_undoSupport; 
-
-       public UndoSupportImpl() {
-               m_undoManager = new UndoManager();
-               m_undoSupport = new UndoableEditSupport();
-               m_undoSupport.addUndoableEditListener( m_undoManager );
-       }
-
-       /**
-        * Returns the UndoManager. To preserve encapsulation and to prevent
-        * the wrong hands for mucking with your edit stack, don't make this
-        * public!  Rather, extend the class and use this method with the 
-        * class and package to set up actions, etc..
-        * @return the UndoManager used for managing the edits.
-        */
-       public UndoManager getUndoManager() {
-               return m_undoManager;
-       }
-
-       /**
-        * Use this method to get the UndoableEditSupport which you should use
-        * to post edits: Undo.getUndoableEditSupport().postEdit(yourEdit).
-        * @return the UndoableEditSupport used for posting edits. 
-        */
-       public UndoableEditSupport getUndoableEditSupport() {
-               return m_undoSupport;
-       }
-
-}
-

Added: 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/DelegateTask.java
===================================================================
--- 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/DelegateTask.java
                                (rev 0)
+++ 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/DelegateTask.java
        2012-05-04 21:03:18 UTC (rev 29119)
@@ -0,0 +1,62 @@
+
+package org.cytoscape.work.internal.sync;
+
+
+import java.util.Map;
+
+import org.cytoscape.work.TaskIterator;
+import org.cytoscape.work.TaskFactory;
+import org.cytoscape.work.AbstractTask;
+import org.cytoscape.work.TaskMonitor;
+import org.cytoscape.work.Task;
+import org.cytoscape.work.TunableRecorder;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class DelegateTask extends AbstractTask {
+       private final SyncTunableMutator stm;
+       private final TunableRecorderManager trm; 
+       private final TaskIterator ti;
+       private final Map<String,Object> tunableValues;
+
+       public DelegateTask(SyncTunableMutator stm, TunableRecorderManager trm, 
TaskIterator ti, Map<String,Object> tunableValues) {
+               this.stm = stm;
+               this.trm = trm;
+               this.ti = ti;
+               this.tunableValues = tunableValues;
+       }
+
+       public void run(TaskMonitor tm) throws Exception {
+               // this ensures that we get a coherent task monitor
+               DelegatingTaskMonitor dtm = new 
DelegatingTaskMonitor(tm,ti.getNumTasks());
+
+               // this gives the tunable mutator what it needs to set
+               // the tunables as the tasks get executed 
+               stm.setConfigurationContext(tunableValues);
+       
+               while (ti.hasNext()) {
+                       final Task task = ti.next();
+                       dtm.setTask(task);
+
+                       if (!setTunables(task))
+                               return;
+
+                       task.run(dtm);
+               }
+       }
+
+       private boolean setTunables(final Object task) throws Exception {
+               if (task == null) 
+                       return true;
+               
+               boolean ret = stm.validateAndWriteBack(task);
+
+               for ( TunableRecorder ti : trm.getRecorders() ) 
+                       ti.recordTunableState(task);
+
+               return ret;
+       }
+}
+

Added: 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/DelegatingTaskMonitor.java
===================================================================
--- 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/DelegatingTaskMonitor.java
                               (rev 0)
+++ 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/DelegatingTaskMonitor.java
       2012-05-04 21:03:18 UTC (rev 29119)
@@ -0,0 +1,49 @@
+package org.cytoscape.work.internal.sync;
+
+
+import org.cytoscape.work.Task;
+import org.cytoscape.work.TaskMonitor;
+
+class DelegatingTaskMonitor implements TaskMonitor {
+       
+       private double expectedNumTasks; 
+       private double currentTaskNum = -1.0; // so that the first task is 
numbered 0
+
+       private TaskMonitor actualTaskMonitor;
+
+       /**
+        * Based on the expected number of tasks, this is the fraction of the 
overall
+        * task monitor that a given task is allocated. So, if there are 4 
tasks 
+        * executed with this task monitor, each task is allocated 0.25 of the 
+        * space in the progress bar.
+        */
+       private double fractionOfOverall = 1.0;
+
+       DelegatingTaskMonitor(TaskMonitor tm, int expectedNumTasks) {
+               this.actualTaskMonitor = tm;
+               this.expectedNumTasks = (double)expectedNumTasks;
+               this.fractionOfOverall = 1.0/this.expectedNumTasks;
+       }
+
+       public void setTask(final Task newTask) {
+               this.currentTaskNum += 1.0;     
+       }
+
+       public void setTitle(String title) {
+               actualTaskMonitor.setTitle(title);
+       }
+
+       public void setStatusMessage(String statusMessage) {
+               actualTaskMonitor.setStatusMessage(statusMessage);
+       }
+
+       public void setProgress(double progress) {
+               if ( progress < 0 ) {
+                       actualTaskMonitor.setProgress(-1.0);
+               } else {
+                       double completed = currentTaskNum/expectedNumTasks;
+                       double adjustedProgress = (progress * 
fractionOfOverall) + completed;
+                       actualTaskMonitor.setProgress(adjustedProgress);
+               }
+       }
+}

Added: 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/LoggingTaskMonitor.java
===================================================================
--- 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/LoggingTaskMonitor.java
                          (rev 0)
+++ 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/LoggingTaskMonitor.java
  2012-05-04 21:03:18 UTC (rev 29119)
@@ -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-headless-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTaskManager.java
===================================================================
--- 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTaskManager.java
                             (rev 0)
+++ 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTaskManager.java
     2012-05-04 21:03:18 UTC (rev 29119)
@@ -0,0 +1,82 @@
+package org.cytoscape.work.internal.sync;
+
+
+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.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 factory, Object context) {
+               throw new UnsupportedOperationException("There is no 
configuration available for a SyncrhonousTaskManager");    
+       }
+
+
+       @Override
+       public void execute(final TaskIterator taskIterator) {
+               final LoggingTaskMonitor taskMonitor = new LoggingTaskMonitor();
+               
+               try {
+                       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 {
+               if (task == null) {
+                       return true;
+               }
+               boolean ret = syncTunableMutator.validateAndWriteBack(task);
+
+               for ( TunableRecorder ti : tunableRecorders ) 
+                       ti.recordTunableState(task);
+
+               return ret;
+       }
+}
+

Added: 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandler.java
===================================================================
--- 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandler.java
                          (rev 0)
+++ 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandler.java
  2012-05-04 21:03:18 UTC (rev 29119)
@@ -0,0 +1,34 @@
+package org.cytoscape.work.internal.sync;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+import org.cytoscape.work.AbstractTunableHandler;
+import org.cytoscape.work.Tunable;
+
+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);
+       }
+
+       @Override
+       public void handle() {
+               try {
+                       setValue(valueMap.get(getName()));
+               } catch (Exception e) {
+                       throw new RuntimeException("Exception setting tunable 
value.", e);
+               }
+       }
+
+       public void setValueMap(final Map<String, Object> valueMap) {
+               this.valueMap = valueMap;
+       }
+}

Added: 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableMutator.java
===================================================================
--- 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableMutator.java
                          (rev 0)
+++ 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableMutator.java
  2012-05-04 21:03:18 UTC (rev 29119)
@@ -0,0 +1,37 @@
+package org.cytoscape.work.internal.sync;
+
+import java.util.Map;
+
+import org.cytoscape.work.AbstractTunableInterceptor;
+import org.cytoscape.work.TunableMutator;
+
+public class SyncTunableMutator<S> extends 
AbstractTunableInterceptor<SyncTunableHandler> implements
+               TunableMutator<SyncTunableHandler, S> {
+
+       private Map<String, Object> map;
+
+       @SuppressWarnings("unchecked")
+       @Override
+       public void setConfigurationContext(final Object configContext) {
+               if (configContext != null && configContext instanceof Map)
+                       map = (Map<String, Object>) configContext;
+       }
+
+       
+       @Override
+       public S buildConfiguration(Object objectWithTunables) {
+               // This method should not be called.
+               return null;
+       }
+
+       
+       @Override
+       public boolean validateAndWriteBack(Object o) {
+               
+               for (SyncTunableHandler handler : getHandlers(o)) {
+                       handler.setValueMap(map);
+                       handler.handle();
+               }
+               return true;
+       }
+}

Added: 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/TunableRecorderManager.java
===================================================================
--- 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/TunableRecorderManager.java
                              (rev 0)
+++ 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/TunableRecorderManager.java
      2012-05-04 21:03:18 UTC (rev 29119)
@@ -0,0 +1,31 @@
+
+package org.cytoscape.work.internal.sync;
+
+
+import java.util.Collections;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+
+import org.cytoscape.work.TunableRecorder;
+
+
+/**
+ */
+public class TunableRecorderManager {  
+       private List<TunableRecorder> recorders = new 
ArrayList<TunableRecorder>();
+
+       public void addTunableRecorder(TunableRecorder tr, Map props) {
+               if ( !recorders.contains(tr) )
+                       recorders.add(tr);
+       }
+
+       public void removeTunableRecorder(TunableRecorder tr, Map props) {
+               recorders.remove(tr);
+       }
+
+       public List<TunableRecorder> getRecorders() {
+               return Collections.unmodifiableList(recorders);
+       }
+}
+

Added: 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/TunableSetterImpl.java
===================================================================
--- 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/TunableSetterImpl.java
                           (rev 0)
+++ 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/sync/TunableSetterImpl.java
   2012-05-04 21:03:18 UTC (rev 29119)
@@ -0,0 +1,28 @@
+
+package org.cytoscape.work.internal.sync;
+
+
+import java.util.Map;
+
+import org.cytoscape.work.TunableSetter;
+import org.cytoscape.work.TaskIterator;
+import org.cytoscape.work.TaskFactory;
+
+
+/**
+ */
+public class TunableSetterImpl implements TunableSetter {  
+
+       private final SyncTunableMutator stm;
+       private final TunableRecorderManager trm; 
+
+       public TunableSetterImpl(SyncTunableMutator stm, TunableRecorderManager 
trm) {
+               this.stm = stm;
+               this.trm = trm;
+       }
+
+       public TaskIterator createTaskIterator(TaskIterator ti, 
Map<String,Object> tunableValues) {
+               return new TaskIterator(ti.getNumTasks(), new 
DelegateTask(stm,trm,ti,tunableValues) );
+       }
+}
+

Added: 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/task/HDialogTaskManager.java
===================================================================
--- 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/task/HDialogTaskManager.java
                          (rev 0)
+++ 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/task/HDialogTaskManager.java
  2012-05-04 21:03:18 UTC (rev 29119)
@@ -0,0 +1,33 @@
+package org.cytoscape.work.internal.task;
+
+import java.awt.Window;
+
+import javax.swing.JDialog;
+
+import org.cytoscape.work.TaskFactory;
+import org.cytoscape.work.TaskIterator;
+import org.cytoscape.work.swing.DialogTaskManager;
+
+public class HDialogTaskManager implements DialogTaskManager {
+
+       @Override
+       public JDialog getConfiguration(TaskFactory factory, Object 
tunableContext) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public void setExecutionContext(Window context) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       @Override
+       public void execute(TaskIterator iterator) {
+               // TODO Auto-generated method stub
+               
+       }
+
+
+
+}

Deleted: 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/task/HeadlessTaskManager.java
===================================================================
--- 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/task/HeadlessTaskManager.java
 2012-05-04 20:54:26 UTC (rev 29118)
+++ 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/task/HeadlessTaskManager.java
 2012-05-04 21:03:18 UTC (rev 29119)
@@ -1,146 +0,0 @@
-package org.cytoscape.work.internal.task;
-
-
-import java.io.PrintStream;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-
-
-import org.cytoscape.work.AbstractTaskManager;
-import org.cytoscape.work.Task;
-import org.cytoscape.work.TaskFactory;
-import org.cytoscape.work.TaskIterator;
-import org.cytoscape.work.TaskMonitor;
-import org.cytoscape.work.TunableInterceptor;
-
-
-/**
- * Executes <code>Task</code>s and displays interfaces by
- * writing to a <code>PrintStream</code>.
- *
- * This is better suited for applications running in headless mode.
- *
- * This will only periodically display information about
- * <code>Task</code>s it is executing to prevent the screen from being flooded
- * with messages.
- *
- * This cannot cancel <code>Task</code>s because it has no means for receiving
- * input from the user.
- */
-public class HeadlessTaskManager extends AbstractTaskManager {
-       private final PrintStream output;
-       private final ExecutorService taskExecutorService;
-
-       public HeadlessTaskManager(final PrintStream output, final 
TunableInterceptor tunableInterceptor) {
-               super(tunableInterceptor);
-               this.output = output;
-               this.taskExecutorService = Executors.newCachedThreadPool();
-       }
-
-       /**
-        * Use <code>System.out</code> as the output stream.
-        */
-       public HeadlessTaskManager(final TunableInterceptor tunableInterceptor) 
{
-               this(System.out, tunableInterceptor);
-       }
-
-       @Override
-       public void execute(final TaskFactory factory) {
-               final TaskIterator taskIterator = factory.createTaskIterator();
-               final Timer timer = new Timer();
-               final ConsoleTaskMonitor taskMonitor = new 
ConsoleTaskMonitor(timer);
-
-               Runnable runnable = new Runnable() {
-                       public void run() {
-                               try {
-                                       while (taskIterator.hasNext()) {
-                                               final Task task = 
taskIterator.next();
-
-                                               if (tunableInterceptor != null) 
{
-                                                       // load the tunables 
from the object
-                                                       
tunableInterceptor.loadTunables(task);
-
-                                                       // create the UI based 
on the object
-                                                       if 
(!tunableInterceptor.execUI(task))
-                                                               return;
-                                               }
-
-                                               task.run(taskMonitor);
-                                       }
-                               } catch (Exception exception) {
-                                       taskMonitor.showException(exception);
-                               }
-                               timer.cancel();
-                       }
-               };
-
-               Future<?> future = taskExecutorService.submit(runnable);        
-       }
-
-       class ConsoleTaskMonitor implements TaskMonitor {
-               static final int UPDATE_DELAY_IN_MILLISECONDS = 2000;
-
-               final Timer timer;
-               String title = "Task";
-               String statusMessage = "";
-               int progress = 0;
-               boolean hasChanged = false;
-
-               public ConsoleTaskMonitor(Timer timer)
-               {
-                       this.timer = timer;
-                       timer.scheduleAtFixedRate(new UpdateTask(), 
UPDATE_DELAY_IN_MILLISECONDS, UPDATE_DELAY_IN_MILLISECONDS);
-               }
-
-               public void setTitle(String title)
-               {
-                       if (title == null || title.length() == 0)
-                               this.title = "Task";
-                       else
-                               this.title = title;
-               }
-
-               public void setProgress(double progress)
-               {
-                       this.progress = (int) (progress * 100);
-                       hasChanged = true;
-               }
-
-               public void setStatusMessage(String statusMessage)
-               {
-                       if (statusMessage == null)
-                               this.statusMessage = "";
-                       else
-                               this.statusMessage = statusMessage;
-                       hasChanged = true;
-               }
-
-               public void showException(Exception exception)
-               {
-                       timer.cancel();
-                       if (exception.getMessage() == null || 
exception.getMessage().length() == 0)
-                               output.println(String.format("%s has 
encountered an error.", title));
-                       else
-                               output.println(String.format("%s has 
encountered an error: %s", title, exception.getMessage()));
-                       exception.printStackTrace(output);
-               }
-
-               class UpdateTask extends TimerTask
-               {
-                       public void run()
-                       {
-                               if (!hasChanged) return;
-
-                               if (statusMessage.length() == 0)
-                                       output.println(String.format("%s is at 
%d%%.", title, progress));
-                               else
-                                       output.println(String.format("%s is at 
%d%%: %s", title, progress, statusMessage));
-                               
-                               hasChanged = false;
-                       }
-               }
-       }
-}

Added: 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/task/UndoSupportImpl.java
===================================================================
--- 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/task/UndoSupportImpl.java
                             (rev 0)
+++ 
core3/impl/trunk/work-headless-impl/src/main/java/org/cytoscape/work/internal/task/UndoSupportImpl.java
     2012-05-04 21:03:18 UTC (rev 29119)
@@ -0,0 +1,79 @@
+/*
+  File: UndoSupportImpl.java
+
+  Copyright (c) 2007, The Cytoscape Consortium (www.cytoscape.org)
+
+  The Cytoscape Consortium is:
+  - Institute for Systems Biology
+  - University of California San Diego
+  - Memorial Sloan-Kettering Cancer Center
+  - Institut Pasteur
+  - Agilent Technologies
+
+  This library is free software; you can redistribute it and/or modify it
+  under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License, or
+  any later version.
+
+  This library is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF
+  MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  The software and
+  documentation provided hereunder is on an "as is" basis, and the
+  Institute for Systems Biology and the Whitehead Institute
+  have no obligations to provide maintenance, support,
+  updates, enhancements or modifications.  In no event shall the
+  Institute for Systems Biology and the Whitehead Institute
+  be liable to any party for direct, indirect, special,
+  incidental or consequential damages, including lost profits, arising
+  out of the use of this software and its documentation, even if the
+  Institute for Systems Biology and the Whitehead Institute
+  have been advised of the possibility of such damage.  See
+  the GNU Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with this library; if not, write to the Free Software Foundation,
+  Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+package org.cytoscape.work.internal.task;
+
+import javax.swing.undo.*;
+
+import org.cytoscape.work.swing.undo.SwingUndoSupport;
+import org.cytoscape.work.undo.AbstractCyEdit;
+
+public class UndoSupportImpl implements SwingUndoSupport {
+
+       public UndoSupportImpl() {
+       }
+
+       /**
+        * Returns the UndoManager. To preserve encapsulation and to prevent
+        * the wrong hands for mucking with your edit stack, don't make this
+        * public!  Rather, extend the class and use this method with the 
+        * class and package to set up actions, etc..
+        * @return the UndoManager used for managing the edits.
+        */
+       public UndoManager getUndoManager() {
+               return null;
+       }
+
+       /**
+        * Use this method to get the UndoableEditSupport which you should use
+        * to post edits: Undo.getUndoableEditSupport().postEdit(yourEdit).
+        * @return the UndoableEditSupport used for posting edits. 
+        */
+       public UndoableEditSupport getUndoableEditSupport() {
+               return null;
+       }
+       
+       @Override
+       public void reset() {
+       }
+
+       @Override
+       public void postEdit(AbstractCyEdit edit) {
+               // TODO Auto-generated method stub
+               
+       }
+}
+

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