/* * Copyright (c) 2014 Red Hat, Inc. and/or its affiliates. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.jberet.testapps.chunk; import java.io.Serializable; import javax.batch.api.BatchProperty; import javax.batch.api.chunk.AbstractItemReader; import javax.batch.api.chunk.ItemReader; import javax.batch.operations.BatchRuntimeException; import javax.batch.runtime.context.StepContext; import javax.inject.Inject; import javax.inject.Named; import com.google.common.base.MoreObjects; /** * @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a> */ @Named public class ClosingItemReader extends AbstractItemReader implements ItemReader { @Inject private StepContext stepContext; @Inject @BatchProperty private boolean failReaderAtOpen; @Inject @BatchProperty private int stopReadAt; @Inject @BatchProperty private int failReadAt; @Override public void close() throws Exception { stepContext.setPersistentUserData(getOrCreateReaderWriterResult().setReaderClosed(true)); } @Override public void open(final Serializable checkpoint) throws Exception { if (failReaderAtOpen) { throw new BatchRuntimeException("Failed reader at open"); } stepContext.setPersistentUserData(getOrCreateReaderWriterResult().setReaderClosed(false)); } @Override public Serializable checkpointInfo() throws Exception { return stepContext.getPersistentUserData(); } @Override public Object readItem() throws Exception { final ReaderWriterResult item = getOrCreateReaderWriterResult(); final int counter = item.incrementReadCount(); stepContext.setPersistentUserData(item); if (counter == stopReadAt) { return null; } if (counter == failReadAt) { throw new BatchRuntimeException("Failed reader at point " + failReadAt + ". Reader and writer should both be closed."); } return counter; } @Override public String toString() { return MoreObjects.toStringHelper(getClass()) .add("failReaderAtOpen", failReaderAtOpen) .add("stopReaderAt", stopReadAt) .add("failReadAt", failReadAt) .add("readerWriterItem", stepContext.getPersistentUserData()) .toString(); } private ReaderWriterResult getOrCreateReaderWriterResult() { ReaderWriterResult result = (ReaderWriterResult) stepContext.getPersistentUserData(); if (result == null) { result = new ReaderWriterResult(); } return result; } }