* Moved logic for updating JobExecution status based on last StepExecution from AbstractJob to SimpleJob because it does not apply to FlowJob.
* A job now can have a status different from any of its steps. For example, the following job will be COMPLETED while the step will be FAILED:
<step id="failingStep">
<end on="FAILED" />
</step>
* Added error checking to StepParser to make sure the same pattern does not appear more than once.
* Modified EndState.handle() so that the ExitStatus is only updated if BatchStatus is updated.
* If a job contains a <split> such that there is more than one EndState reached, the Job's status will be the highest precedence of all the statuses. For example, the following job will be FAILED:
<split id="split1">
<flow>
<step name="failingStep"/>
</flow>
<flow>
<step name="step1"/>
</flow>
</split>
* If a step has no transitions defined, then the default will be:
<fail on="FAILED" />
<end on="*" />