/*
* 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 java.util.List;
import javax.batch.api.BatchProperty;
import javax.batch.api.chunk.AbstractItemWriter;
import javax.batch.api.chunk.ItemWriter;
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 ClosingItemWriter extends AbstractItemWriter implements ItemWriter {
@Inject
private StepContext stepContext;
@Inject
@BatchProperty
private boolean failWriterAtOpen;
@Inject
@BatchProperty
private int failWriteAt;
@Override
public void open(final Serializable checkpoint) throws Exception {
if (failWriterAtOpen) {
throw new BatchRuntimeException("Failed writer at open");
}
stepContext.setPersistentUserData(getOrCreateReaderWriterResult().setWriterClosed(false));
}
@Override
public void close() throws Exception {
stepContext.setPersistentUserData(getOrCreateReaderWriterResult().setWriterClosed(true));
}
@Override
public Serializable checkpointInfo() throws Exception {
return stepContext.getPersistentUserData();
}
@Override
public void writeItems(final List<Object> items) throws Exception {
final ReaderWriterResult item = getOrCreateReaderWriterResult();
for (Object o : items) {
try {
if (item.incrementWriteCount() == failWriteAt) {
throw new BatchRuntimeException("Failed writer at point " + failWriteAt + ". Reader and writer should both be closed.");
}
} finally {
stepContext.setPersistentUserData(item);
}
}
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("failWriterAtOpen", failWriterAtOpen)
.add("failWriteAt", failWriteAt)
.add("readerWriterItem", stepContext)
.toString();
}
private ReaderWriterResult getOrCreateReaderWriterResult() {
ReaderWriterResult result = (ReaderWriterResult) stepContext.getPersistentUserData();
if (result == null) {
result = new ReaderWriterResult();
}
return result;
}
}