package org.oddjob.beanbus.drivers;
import java.util.Iterator;
import org.apache.log4j.Logger;
import org.oddjob.Stoppable;
import org.oddjob.beanbus.AbstractBusComponent;
import org.oddjob.beanbus.BeanBus;
import org.oddjob.beanbus.BusException;
import org.oddjob.framework.HardReset;
import org.oddjob.framework.SoftReset;
/**
* A Runnable that can be used as an Oddjob job to take beans from an
* iterable (collection) and drive them into an {@link BeanBus}.
*
* @author rob
*
* @param <T>
*/
public class IterableBusDriver<T> extends AbstractBusComponent<T>
implements Runnable, Stoppable {
private static final Logger logger = Logger.getLogger(IterableBusDriver.class);
private Iterable<? extends T> beans;
private volatile boolean stop;
private String name;
private volatile int count;
private volatile Thread executionThread;
@HardReset
@SoftReset
public void reset() {
count = 0;
}
@Override
public void run() {
if (beans == null) {
throw new NullPointerException("No beans.");
}
stop = false;
Iterator<? extends T> current = beans.iterator();
try {
startBus();
while (!stop) {
synchronized (this) {
executionThread = Thread.currentThread();
}
if (!current.hasNext()) {
break;
}
synchronized (this) {
executionThread = null;
Thread.interrupted();
}
accept(current.next());
++count;
}
stopBus();
logger.info("Accepted " + count + " beans.");
}
catch (BusException e) {
throw new RuntimeException(e);
}
}
@Override
public void stop() {
requestBusStop();
}
@Override
protected void stopTheBus() {
this.stop = true;
synchronized (this) {
if (executionThread != null) {
logger.debug("Interrupting execution thread.");
executionThread.interrupt();
}
}
}
public Iterable<? extends T> getBeans() {
return beans;
}
/**
* The beans to iterate over.
*
* @param iterable
*/
public void setBeans(Iterable<? extends T> iterable) {
this.beans = iterable;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCount() {
return count;
}
@Override
public String toString() {
if (name == null) {
return getClass().getSimpleName();
}
else {
return name;
}
}
}