Author: mkirby Date: 2012-05-11 00:39:04 -0700 (Fri, 11 May 2012) New Revision: 29226
Added: core3/impl/trunk/work-impl/pom.xml core3/impl/trunk/work-impl/src/ core3/impl/trunk/work-impl/src/main/ core3/impl/trunk/work-impl/src/main/java/ core3/impl/trunk/work-impl/src/main/java/org/ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/CyActivator.java core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/DelegateTask.java core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/DelegatingTaskMonitor.java core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/LoggingTaskMonitor.java core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTaskManager.java core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandler.java core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandlerFactory.java core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableMutator.java core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/TunableRecorderManager.java core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/TunableSetterImpl.java Modified: core3/impl/trunk/work-impl/ Log: mkirby: Moved work-impl into its own package, out of headless-work-impl. Property changes on: core3/impl/trunk/work-impl ___________________________________________________________________ Added: svn:ignore + .settings target .classpath .project Added: core3/impl/trunk/work-impl/pom.xml =================================================================== --- core3/impl/trunk/work-impl/pom.xml (rev 0) +++ core3/impl/trunk/work-impl/pom.xml 2012-05-11 07:39:04 UTC (rev 29226) @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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-alpha9-SNAPSHOT</version> + </parent> + + <properties> + <bundle.symbolicName>org.cytoscape.work-impl</bundle.symbolicName> + <bundle.namespace>org.cytoscape.work.internal</bundle.namespace> + </properties> + + <modelVersion>4.0.0</modelVersion> + <groupId>org.cytoscape</groupId> + <artifactId>work-impl</artifactId> + + <name>${bundle.symbolicName}</name> + + <packaging>bundle</packaging> + + + <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> + + <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> + </dependencies> +</project> Added: core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/CyActivator.java =================================================================== --- core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/CyActivator.java (rev 0) +++ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/CyActivator.java 2012-05-11 07:39:04 UTC (rev 29226) @@ -0,0 +1,39 @@ +package org.cytoscape.work.internal; + +import java.util.Properties; + +import org.cytoscape.service.util.AbstractCyActivator; +import org.cytoscape.work.TunableHandlerFactory; +import org.cytoscape.work.TunableSetter; +import org.cytoscape.work.internal.sync.SyncTaskManager; +import org.cytoscape.work.internal.sync.SyncTunableHandlerFactory; +import org.cytoscape.work.internal.sync.SyncTunableMutator; +import org.cytoscape.work.internal.sync.TunableRecorderManager; +import org.cytoscape.work.internal.sync.TunableSetterImpl; +import org.osgi.framework.BundleContext; + +public class CyActivator extends AbstractCyActivator { + public CyActivator() { + super(); + } + + + public void start(BundleContext bc) { + + 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()); + + SyncTunableHandlerFactory syncTunableHandlerFactory = new SyncTunableHandlerFactory(); + Properties syncFactoryProp = new Properties(); + registerService(bc,syncTunableHandlerFactory, TunableHandlerFactory.class, syncFactoryProp); + syncTunableMutator.addTunableHandlerFactory(syncTunableHandlerFactory, syncFactoryProp); + + } +} \ No newline at end of file Added: core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/DelegateTask.java =================================================================== --- core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/DelegateTask.java (rev 0) +++ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/DelegateTask.java 2012-05-11 07:39:04 UTC (rev 29226) @@ -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-impl/src/main/java/org/cytoscape/work/internal/sync/DelegatingTaskMonitor.java =================================================================== --- core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/DelegatingTaskMonitor.java (rev 0) +++ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/DelegatingTaskMonitor.java 2012-05-11 07:39:04 UTC (rev 29226) @@ -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-impl/src/main/java/org/cytoscape/work/internal/sync/LoggingTaskMonitor.java =================================================================== --- core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/LoggingTaskMonitor.java (rev 0) +++ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/LoggingTaskMonitor.java 2012-05-11 07:39:04 UTC (rev 29226) @@ -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-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTaskManager.java =================================================================== --- core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTaskManager.java (rev 0) +++ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTaskManager.java 2012-05-11 07:39:04 UTC (rev 29226) @@ -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-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandler.java =================================================================== --- core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandler.java (rev 0) +++ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandler.java 2012-05-11 07:39:04 UTC (rev 29226) @@ -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-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandlerFactory.java =================================================================== --- core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandlerFactory.java (rev 0) +++ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableHandlerFactory.java 2012-05-11 07:39:04 UTC (rev 29226) @@ -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 createTunableHandler(final Field field, final Object instance, final Tunable tunable) { + return new SyncTunableHandler(field,instance,tunable); + } + + public SyncTunableHandler createTunableHandler(final Method getter, final Method setter, final Object instance, final Tunable tunable) { + return new SyncTunableHandler(getter,setter,instance,tunable); + } +} Added: core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableMutator.java =================================================================== --- core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableMutator.java (rev 0) +++ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/SyncTunableMutator.java 2012-05-11 07:39:04 UTC (rev 29226) @@ -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-impl/src/main/java/org/cytoscape/work/internal/sync/TunableRecorderManager.java =================================================================== --- core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/TunableRecorderManager.java (rev 0) +++ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/TunableRecorderManager.java 2012-05-11 07:39:04 UTC (rev 29226) @@ -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-impl/src/main/java/org/cytoscape/work/internal/sync/TunableSetterImpl.java =================================================================== --- core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/TunableSetterImpl.java (rev 0) +++ core3/impl/trunk/work-impl/src/main/java/org/cytoscape/work/internal/sync/TunableSetterImpl.java 2012-05-11 07:39:04 UTC (rev 29226) @@ -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) ); + } +} + -- 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.
