A Workflow is a logical grouping of tasks, done in a set order to accomplish a specific goal. A Workflow is useful when multiple datasets are being processed the same way. The following section describes the key elements of a Workflow implementation.
A walkthrough is available to create a workflow.
ITASKFACTORY
public class MyTaskFactory implements ITaskFactory { public static final String ID = "MyTaskFactory"; @Override public String getId() { return ID; } @Override public ITask createTask(String id) { return new MyTask(id); }}
ITASK INTERFACE
import com.interactive.intviewerapi.plugins.workflow.AbstractTask;public class MyTask extends AbstractTask { public MyTask(String id) { setId(id); setName("My Task"); // Name that is displayed in workflow tree setStatus(Status.Enabled); // Default value of status, may be set to Status.Disabled } @Override /** The "worker" method for ITask is the runTaskmethod. ** */ public void runTask() { // perform my task action doSomething(); }}
Register your new task factory in the META-INF.services folder by creating a new file with the name com.interactive.intviewerapi.plugins.workflow.ITaskFactory
In this file add one line for each task factory you have created. In the example, one line would be added:
com.interactive.intviewer.examples.tasks.factories.MyTaskFactory
The INTViewer uses a workflow configuration file to build and manage a workflow. Create a new WorkflowTasks.xml to describe your workflow.
In the example below the tasklist node denotes groupings within a workflow. For example, a workflow may have several data loading tasks, followed by data processing tasks, followed by data saving tasks. There would be 3 tasklist nodes where the name attribute describes each of the groupings.
TASKLIST NODE
<workflow> <tasklist name="Load"> ... </tasklist> <tasklist name="Process"> ... </tasklist> <tasklist name="Save"> ... </tasklist></workflow
In the next example, the task node describes each task within a workflow. There are 4 attributes used to describe each task.
To change the status of a task, call:
Status status = Status.Enabled // or Status.DisabledsetStatus(status);You then need to notify any listeners that the status of a task has changed.
To do this, call:
fireListener(this);The workflow tree, which needs to be notified when the status is changed, is added as a listener when the task is added to the workflow. Calling the fireListener method will notify the workflow tree.
Typically, the status will change due to whether a data type become available or not available. This will
be usually be determined by listening to a lookup event. Here is a simple implementation:
STATUS CHANGE EXAMPLE
import com.interactive.intviewerapi.GlobalSelection;import com.interactive.intviewerapi.plugins.workflow.AbstractTask;import org.openide.util.LookupEvent;public class MyTask extends AbstractTask implements LookupListener { private GlobalSelection<SomeClass> theSelection = new GlobalSelection<SomeClass>(SomeClass.class); public MyTask(String id) { setId(id); setName("My Task"); // Name that is displayed in workflow tree setStatus(Status.Enabled); // Default value of status, may be set to Status.Disabled theSelection.addLookupListener(this); } @Override public void resultChanged(LookupEvent arg0) { Status currentStatus = getStatus(); Status newStatus; Collection<? extends SomeClass> selectionInstances = theSelection.allInstances(); if (selectionInstances.isEmpty) { newStatus = Status.Disabled; } else { newStatus = Status.Enabled; } if (newStatus != currentStatus) { setStatus(newStatus); fireListener(this); } }}The example shows the basic implementation needed by a task to report status back to the Workflow manager.
The tasks that are available, or enabled, are marked with a green icon. Tasks that are not available, or disabled, are marked with a red icon. Use GlobalSelection if you need to keep track of state of the tasks in a workflow.
Two options to open workflow top components are available.