class SimpleFlowFactoryBean implements FactoryBean<SimpleFlow>, InitializingBean {

	private String name;

	private List<StateTransition> stateTransitions;

	private String prefix;

	private Comparator<StateTransition> stateTransitionComparator;

	private Class<SimpleFlow> flowType;

	/**
	 * @param stateTransitionComparator {@link Comparator} implementation that addresses
	 * the ordering of state evaluation.
	 */
	public void setStateTransitionComparator(Comparator<StateTransition> stateTransitionComparator) {
		this.stateTransitionComparator = stateTransitionComparator;
	}

	/**
	 * @param flowType Used to inject the type of flow (regular Spring Batch or JSR-352).
	 */
	public void setFlowType(Class<SimpleFlow> flowType) {
		this.flowType = flowType;
	}

	/**
	 * The name of the flow that is created by this factory.
	 * @param name the value of the name
	 */
	public void setName(String name) {
		this.name = name;
		this.prefix = name + ".";
	}

	/**
	 * The raw state transitions for the flow. They are transformed into proxies that have
	 * the same behavior but unique names prefixed with the flow name.
	 * @param stateTransitions the list of transitions
	 */
	public void setStateTransitions(List<StateTransition> stateTransitions) {
		this.stateTransitions = stateTransitions;
	}

	/**
	 * Check mandatory properties (name).
	 * @throws Exception thrown if error occurs.
	 */
	@Override
	public void afterPropertiesSet() throws Exception {
		Assert.state(StringUtils.hasText(name), "The flow must have a name");

		if (flowType == null) {
			flowType = SimpleFlow.class;
		}
	}

	@Override
	public SimpleFlow getObject() throws Exception {<FILL_FUNCTION_BODY>}

	private String getNext(String next) {
		if (next == null) {
			return null;
		}
		return (next.startsWith(this.prefix) ? "" : this.prefix) + next;
	}

	/**
	 * Convenience method to get a state that proxies the input but with a different name,
	 * appropriate to this flow. If the state is a {@link StepState}, the step name is
	 * also changed.
	 * @param state the state to proxy
	 * @return the proxy state
	 */
	private State getProxyState(State state) {
		String oldName = state.getName();
		if (oldName.startsWith(prefix)) {
			return state;
		}
		String stateName = prefix + oldName;
		if (state instanceof StepState) {
			return createNewStepState(state, oldName, stateName);
		}
		return new DelegateState(stateName, state);
	}

	/**
	 * Provides an extension point to provide alternative {@link StepState}
	 * implementations within a {@link SimpleFlow}.
	 * @param state The state that is used to create the {@code StepState}.
	 * @param oldName The name to be replaced.
	 * @param stateName The name for the new State.
	 * @return a state for the requested data.
	 */
	protected State createNewStepState(State state, String oldName, String stateName) {
		return new StepState(stateName, ((StepState) state).getStep(oldName));
	}

	@Override
	public Class<?> getObjectType() {
		return SimpleFlow.class;
	}

	@Override
	public boolean isSingleton() {
		return true;
	}

	/**
	 * A State that proxies a delegate and changes its name but leaves its behavior
	 * unchanged.
	 *
	 * @author Dave Syer
	 *
	 */
	public static class DelegateState extends AbstractState implements FlowHolder {

		private final State state;

		private DelegateState(String name, State state) {
			super(name);
			this.state = state;
		}

		/**
		 * Gets the current state.
		 * @return The {@link State} being used by the factory bean.
		 */
		public State getState() {
			return this.state;
		}

		@Override
		public boolean isEndState() {
			return state.isEndState();
		}

		@Override
		public FlowExecutionStatus handle(FlowExecutor executor) throws Exception {
			return state.handle(executor);
		}

		@Override
		public Collection<Flow> getFlows() {
			return (state instanceof FlowHolder) ? ((FlowHolder) state).getFlows() : Collections.<Flow>emptyList();
		}

	}

}

		SimpleFlow flow = flowType.getConstructor(String.class).newInstance(name);

		flow.setStateTransitionComparator(stateTransitionComparator);

		List<StateTransition> updatedTransitions = new ArrayList<>();
		for (StateTransition stateTransition : stateTransitions) {
			State state = getProxyState(stateTransition.getState());
			updatedTransitions.add(StateTransition.switchOriginAndDestination(stateTransition, state,
					getNext(stateTransition.getNext())));
		}

		flow.setStateTransitions(updatedTransitions);
		flow.afterPropertiesSet();
		return flow;

	
<no_super_class>