Class ForEachJob

All Implemented Interfaces:
Serializable, Runnable, ArooaContextAware, ArooaSessionAware, ConfigurationOwner, BeanDirectoryOwner, Forceable, PropertyChangeNotifier, Iconic, Loadable, LogEnabled, Resettable, Stateful, Stoppable, Structural

public class ForEachJob extends StructuralJob<Object> implements Stoppable, Loadable, ConfigurationOwner, BeanDirectoryOwner
See Also:

Description

A job which executes its child jobs for each of the provided values. The child job can access the current value using the pseudo property 'current' to gain access to the current value. The pseudo property 'index' provides a 0 based number for the instance.

The return state of this job depends on the return state of the children (like SequentialJob). Hard resetting this job will cause the children to be destroyed and recreated on the next run (with possibly new values). Soft resetting this job will reset the children but when re-run will not reconfigure the values.

As yet There is no persistence for child jobs.

It is not possible to reference the internal jobs via their id from outside the foreach job, but within the foreach internal configuration they can reference each other and themselves via their ids.

Example

For each of 3 values.

<oddjob id="this" xmlns:arooa="http://rgordon.co.uk/oddjob/arooa">

    <job>

        <foreach id="foreach">

            <values>

                <list>

                    <values>

                        <value value="Red"/>

                        <value value="Blue"/>

                        <value value="Green"/>

                    </values>

                </list>

            </values>

            <configuration>

                <arooa:configuration resource="org/oddjob/jobs/structural/ForEachEchoColour.xml"/>

            </configuration>

        </foreach>

    </job>

</oddjob>

The internal configuration is:

<foreach id="colours">

    <job>

        <echo id="echo-colour" name="${colours.current}">I'm number ${colours.index} and my name is ${echo-colour.name}</echo>

    </job>

</foreach>

Unlike other jobs, a job in a for each has it's name configured when it is loaded, before it is run. The job references its self using its id.

This example will display the following on the console:

 I'm number 0 and my name is Red
 I'm number 1 and my name is Blue
 I'm number 2 and my name is Green
 
For each of 3 files. The 3 files test1.txt, test2.txt and test3.txt are copied to the work/foreach directory. The oddjob argument ${this.args[0]} is so that a base directory can be passed in as part of the unit test for this example.

<oddjob id="this" xmlns:arooa="http://rgordon.co.uk/oddjob/arooa">

    <job>

        <foreach>

            <values>

                <files files="${base.dir}/test/io/reference/test?.txt"/>

            </values>

            <configuration>

                <arooa:configuration>

                    <xml>

                        <xml>

                            <foreach id="copy-files">

                                <job>

                                    <copy to="${some.dir}">

                                        <from>

                                            <value value="${copy-files.current}"/>

                                        </from>

                                    </copy>

                                </job>

                            </foreach>

                        </xml>

                    </xml>

                </arooa:configuration>

            </configuration>

        </foreach>

    </job>

</oddjob>

Also ExistsJob has a similar example.Executing children in parallel. This example uses a ExecutorThrottleType to limit the number of parallel executions to three.

<oddjob>

    <job>

        <foreach parallel="true">

            <values>

                <tokenizer text="1,2,3,4,5,6,7,8,9"/>

            </values>

            <configuration>

                <xml>

                    <foreach id="loop">

                        <job>

                            <wait name="Wait ${loop.current}"/>

                        </job>

                    </foreach>

                </xml>

            </configuration>

            <executorService>

                <throttle limit="3"/>

            </executorService>

        </foreach>

    </job>

</oddjob>
Using an execution window. Only the configuration for two jobs will be pre-loaded, and only the last three complete jobs will remain loaded.

<oddjob id="this">

    <job>

        <foreach preLoad="2" purgeAfter="3">

            <values>

                <tokenizer text="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15"/>

            </values>

            <configuration>

                <xml>

                    <foreach id="loop">

                        <job>

                            <wait name="Wait ${loop.current} " pause="1"/>

                        </job>

                    </foreach>

                </xml>

            </configuration>

        </foreach>

    </job>

</oddjob>
  • Field Details

    • FOREACH_ELEMENT

      public static final ArooaElement FOREACH_ELEMENT
      Root element for configuration.
  • Constructor Details

    • ForEachJob

      public ForEachJob()
      Constructor.
  • Method Details

    • setExecutorService

      @Inject public void setExecutorService(ExecutorService executorService)
      Parameters:
      executorService - The Executor Service.
      Reference Property:
      executorService

      Description

      The ExecutorService to use. This will be automatically set by Oddjob.
      Required:
      No.
    • getExecutorService

      public ExecutorService getExecutorService()
    • getCurrent

      public Object getCurrent()
      The current value.
      Returns:
      The current value.
    • setValues

      public void setValues(Iterable<?> values)
      Set the values to iterate over.
      Parameters:
      values - The values.
    • getInitialStateOp

      protected StateOperator getInitialStateOp()
      Description copied from class: StructuralJob
      Subclasses must provide the StateOperator that will decide how to evaluate the children's state.
      Specified by:
      getInitialStateOp in class StructuralJob<Object>
      Returns:
      A State Operator. Must not be null.
    • provideConfigurationSession

      public ConfigurationSession provideConfigurationSession()
      Description copied from interface: ConfigurationOwner
      Specified by:
      provideConfigurationSession in interface ConfigurationOwner
      Returns:
      A ConfigurationSession. May be null if no session is available.
    • addOwnerStateListener

      public void addOwnerStateListener(OwnerStateListener listener)
      Description copied from interface: ConfigurationOwner
      Add a listener.
      Specified by:
      addOwnerStateListener in interface ConfigurationOwner
      Parameters:
      listener -
    • removeOwnerStateListener

      public void removeOwnerStateListener(OwnerStateListener listener)
      Description copied from interface: ConfigurationOwner
      Remove a listener.
      Specified by:
      removeOwnerStateListener in interface ConfigurationOwner
      Parameters:
      listener -
    • rootDesignFactory

      public SerializableDesignFactory rootDesignFactory()
      Description copied from interface: ConfigurationOwner
      Get the design factory for the configuration. If this is null the Oddjob Explorer won't show a DesignInside action.

      Note that this is a SerializableDesignFactory so that this interface can be represented remotely.

      Specified by:
      rootDesignFactory in interface ConfigurationOwner
      Returns:
      A DesignFactory. Must not be null if a ConfigurationSession is available.
    • rootElement

      public ArooaElement rootElement()
      Description copied from interface: ConfigurationOwner
      Get the root element.
      Specified by:
      rootElement in interface ConfigurationOwner
      Returns:
      The root element of the configuration. Must not be null if a ConfigurationSession is available.
    • loadConfigFor

      protected Object loadConfigFor(Object value) throws ArooaParseException
      Load a configuration for a single value.
      Parameters:
      value - The value
      Returns:
      The root component in the child configuration.
      Throws:
      ArooaParseException - If the config can't be parsed.
    • provideBeanDirectory

      public BeanDirectory provideBeanDirectory()
      Description copied from interface: BeanDirectoryOwner
      Get the BeanDirectory. This method may return null if the BeanDirectory isn't available.
      Specified by:
      provideBeanDirectory in interface BeanDirectoryOwner
      Returns:
      The BeanDirectory or null.
    • preLoad

      protected void preLoad() throws ArooaParseException
      Setup and load the first jobs.

      if preLoad is 0 all will be loaded otherwise up to that number will be loaded.

      Throws:
      ArooaParseException
    • load

      public void load()
      Description copied from interface: Loadable
      Load the component.
      Specified by:
      load in interface Loadable
    • unload

      public void unload()
      Description copied from interface: Loadable
      Unload the component.
      Specified by:
      unload in interface Loadable
    • isLoadable

      public boolean isLoadable()
      Description copied from interface: Loadable
      Is the component currently loadable.
      Specified by:
      isLoadable in interface Loadable
      Returns:
      true if the component can be loaded, false otherwise.
    • execute

      protected void execute() throws Exception
      Description copied from class: StructuralJob
      Execute this job.
      Specified by:
      execute in class StructuralJob<Object>
      Throws:
      Exception - If the unexpected occurs.
    • startChildStateReflector

      protected void startChildStateReflector()
      Description copied from class: StructuralJob
      Start the child state reflector. Sub classes override this if they need to start the child state reflector at a different time.
      Overrides:
      startChildStateReflector in class StructuralJob<Object>
    • onStop

      protected void onStop() throws FailedToStopException
      Description copied from class: StructuralJob
      Allow sub classes to do something on stop.
      Overrides:
      onStop in class StructuralJob<Object>
      Throws:
      FailedToStopException
    • getIndex

      public int getIndex()
      Returns:
      Returns the index.
    • onDestroy

      protected void onDestroy()
      Description copied from class: BaseComponent
      Subclasses override this method to clear up resources. This is called by the framework before child elements have been destroyed.
      Overrides:
      onDestroy in class StructuralJob<Object>
    • hardReset

      public boolean hardReset()
      Perform a hard reset on the job.
      Specified by:
      hardReset in interface Resettable
      Overrides:
      hardReset in class StructuralJob<Object>
      Returns:
      true if successful.
    • isStop

      public boolean isStop()
      Description copied from class: StructuralJob
      Expose the internal stop flag as a read only property.
      Overrides:
      isStop in class StructuralJob<Object>
      Returns:
      The file name.
      Reference Property:
      stop

      Description

      The stop flag. This is an internal read only property that is exposed for diagnostic reasons. If a child job does not support stopping then the request to stop may time out but it is useful to know that the stop flag is still set so this job will still stop eventually.
      Required:
      Read Only.
    • setFile

      public void setFile(File file)
      Reference Property:
      file

      Description

      The name of the configuration file. to use for configuration.
      Required:
      No.
    • getFile

      public File getFile()
    • getConfiguration

      public ArooaConfiguration getConfiguration()
    • setConfiguration

      public void setConfiguration(ArooaConfiguration configuration)
    • getPreLoad

      public int getPreLoad()
    • setPreLoad

      public void setPreLoad(int preLoad)
    • getPurgeAfter

      public int getPurgeAfter()
    • setPurgeAfter

      public void setPurgeAfter(int purgeAfter)
    • isParallel

      public boolean isParallel()
    • setParallel

      public void setParallel(boolean parallel)