class EndState extends AbstractState {

	private final FlowExecutionStatus status;

	private final boolean abandon;

	private final String code;

	/**
	 * @param status The {@link FlowExecutionStatus} to end with
	 * @param name The name of the state
	 */
	public EndState(FlowExecutionStatus status, String name) {
		this(status, status.getName(), name);
	}

	/**
	 * @param status The {@link FlowExecutionStatus} to end with
	 * @param name The name of the state
	 * @param code The exit status to save
	 */
	public EndState(FlowExecutionStatus status, String code, String name) {
		this(status, code, name, false);
	}

	/**
	 * @param status The {@link FlowExecutionStatus} to end with
	 * @param name The name of the state
	 * @param code The exit status to save
	 * @param abandon flag to indicate that previous step execution can be marked as
	 * abandoned (if there is one)
	 *
	 */
	public EndState(FlowExecutionStatus status, String code, String name, boolean abandon) {
		super(name);
		this.status = status;
		this.code = code;
		this.abandon = abandon;
	}

	protected FlowExecutionStatus getStatus() {
		return this.status;
	}

	protected boolean isAbandon() {
		return this.abandon;
	}

	protected String getCode() {
		return this.code;
	}

	/**
	 * Return the {@link FlowExecutionStatus} stored.
	 *
	 * @see State#handle(FlowExecutor)
	 */
	@Override
	public FlowExecutionStatus handle(FlowExecutor executor) throws Exception {<FILL_FUNCTION_BODY>}

	/**
	 * Performs any logic to update the exit status for the current flow.
	 * @param executor {@link FlowExecutor} for the current flow
	 * @param code The exit status to save
	 */
	protected void setExitStatus(FlowExecutor executor, String code) {
		executor.addExitStatus(code);
	}

	@Override
	public boolean isEndState() {
		return !status.isStop();
	}

	@Override
	public String toString() {
		return super.toString() + " status=[" + status + "]";
	}

}


		synchronized (executor) {

			// Special case. If the last step execution could not complete we
			// are in an unknown state (possibly unrecoverable).
			StepExecution stepExecution = executor.getStepExecution();
			if (stepExecution != null && executor.getStepExecution().getStatus() == BatchStatus.UNKNOWN) {
				return FlowExecutionStatus.UNKNOWN;
			}

			if (status.isStop()) {
				if (!executor.isRestart()) {
					/*
					 * If there are step executions, then we are not at the beginning of a
					 * restart.
					 */
					if (abandon) {
						/*
						 * Only if instructed to do so, upgrade the status of last step
						 * execution so it is not replayed on a restart...
						 */
						executor.abandonStepExecution();
					}
				}
				else {
					/*
					 * If we are a stop state and we got this far then it must be a
					 * restart, so return COMPLETED.
					 */
					return FlowExecutionStatus.COMPLETED;
				}
			}

			setExitStatus(executor, code);

			return status;

		}
	
<methods>public void <init>(java.lang.String) ,public java.lang.String getName() ,public abstract org.springframework.batch.core.job.flow.FlowExecutionStatus handle(org.springframework.batch.core.job.flow.FlowExecutor) throws java.lang.Exception,public java.lang.String toString() <variables>private final non-sealed java.lang.String name