001 /* 002 * Copyright 2004-2005 the original author or authors. 003 */ 004 package org.springframework.rules.closure.support; 005 006 import org.springframework.rules.closure.Closure; 007 008 /** 009 * Convenient class to implement workflow. 010 * 011 * @author Keith Donald 012 */ 013 public abstract class AbstractElementGeneratorWorkflow extends AbstractElementGenerator { 014 015 /** 016 * @see AbstractElementGenerator#AbstractElementGenerator() 017 */ 018 protected AbstractElementGeneratorWorkflow() { 019 super(); 020 } 021 022 /** 023 * @see AbstractElementGenerator#AbstractElementGenerator(boolean) 024 */ 025 protected AbstractElementGeneratorWorkflow(boolean runOnce) { 026 super(runOnce); 027 } 028 029 /** 030 * {@inheritDoc} 031 * 032 * Defines the workflow sequence. 033 */ 034 public final void run(Closure templateCallback) { 035 reset(); 036 setRunning(); 037 doSetup(); 038 while (processing()) { 039 templateCallback.call(doWork()); 040 } 041 setCompleted(); 042 doCleanup(); 043 } 044 045 /** 046 * Setup the workflow. 047 */ 048 protected void doSetup() { 049 050 } 051 052 /** 053 * @return <code>true</code> if ElementGenerator is still processing. 054 */ 055 protected boolean processing() { 056 return hasMoreWork() && !isStopped(); 057 } 058 059 /** 060 * @return <code>true</code> if more work has to be done. 061 */ 062 protected abstract boolean hasMoreWork(); 063 064 /** 065 * @return the object to process (with the given closure). 066 */ 067 protected abstract Object doWork(); 068 069 /** 070 * Clean up after workflow. 071 */ 072 protected void doCleanup() { 073 074 } 075 }