We can build a very simple "Hello, World!" workflow out of two WorkflowSteps. It might seem a bit strange to not see any linkage between your WorkflowSteps, but that's kind of the point:
StepOne.java
package net.sf.freeflow4j.examples;
import net.sf.freeflow4j.WorkflowProcessingContext;
import net.sf.freeflow4j.support.SimpleWorkflowStep;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class StepOne extends SimpleWorkflowStep
{
private static final Log LOG = LogFactory.getLog(StepOne.class);
public WorkflowProcessingContext executeWorkflowStep(
WorkflowProcessingContext ctx) throws Exception
{
LOG.debug("Preparing a very profound message...");
ctx.put("msg", "Hello Workflow!");
return ctx;
}
}
StepTwo.java
package net.sf.freeflow4j.examples;
import net.sf.freeflow4j.WorkflowProcessingContext;
import net.sf.freeflow4j.support.SimpleWorkflowStep;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class StepTwo extends SimpleWorkflowStep
{
private static final Log LOG = LogFactory.getLog(StepTwo.class);
public WorkflowProcessingContext executeWorkflowStep(
WorkflowProcessingContext ctx) throws Exception
{
LOG.debug("Displaying message [" + ctx.get("msg") + "]");
return ctx;
}
}
It's fairly straight-forward to use freeflow4j. First configure your WorkflowSteps in a bean context:
<beans>
<bean name="stepOne" class="net.sf.freeflow4j.examples.StepOne">
<property name="nextStep" ref="stepTwo" />
</bean>
<bean name="stepTwo" class="net.sf.freeflow4j.examples.StepTwo">
<!-- No 'nextStep' property need is set since this is the last step. -->
</bean>
</beans>
Then to start the workflow you get a reference to the first WorkflowStep bean, initialize a WorkflowProcessingContext and kick it off:
package net.sf.freeflow4j.examples;
import net.sf.freeflow4j.WorkflowProcessingContext;
import net.sf.freeflow4j.WorkflowStep;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DeclarativeMain
{
public static void main(String[] args)
{
ApplicationContext appContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
WorkflowStep stepOne = (WorkflowStep) appContext
.getBean("stepOne");
stepOne.process(new WorkflowProcessingContext());
}
}
You don't have to use an IoC container like Spring to hook up a workflow:
package net.sf.freeflow4j.examples;
import net.sf.freeflow4j.WorkflowProcessingContext;
import net.sf.freeflow4j.support.SimpleWorkflowStep;
public class ProgrammaticMain
{
public static void main(String[] args)
{
SimpleWorkflowStep stepOne = new StepOne();
stepOne.setNextStep(new StepTwo());
stepOne.process(new WorkflowProcessingContext());
}
}