package org.oddjob.jobs;
import java.io.OutputStream;
import org.oddjob.arooa.ArooaSession;
import org.oddjob.arooa.convert.ArooaConversionException;
import org.oddjob.arooa.deploy.annotations.ArooaHidden;
import org.oddjob.arooa.life.ArooaSessionAware;
import org.oddjob.arooa.reflect.ArooaClass;
import org.oddjob.arooa.reflect.BeanView;
import org.oddjob.arooa.reflect.BeanViews;
import org.oddjob.beanbus.SimpleBusService;
import org.oddjob.beanbus.destinations.BeanSheet;
import org.oddjob.beanbus.drivers.IterableBusDriver;
import org.oddjob.io.StdoutType;
/**
* @oddjob.description Create a simple listing of the properties of
* of beans.
*
* @author rob
*
*/
public class BeanReportJob implements Runnable, ArooaSessionAware {
// private static final Logger logger = Logger.getLogger(BeanReportJob.class);
/**
* @oddjob.property
* @oddjob.description The name of this job.
* @oddjob.required No.
*/
private String name;
/**
* @oddjob.property
* @oddjob.description The beans to report on.
* @oddjob.required Yes.
*/
private Iterable<? extends Object> beans;
/**
* @oddjob.property
* @oddjob.description The Output to where the report will
* be written.
* @oddjob.required Yes.
*/
private OutputStream output;
/**
* @oddjob.property
* @oddjob.description No Header is produced.
* @oddjob.required No.
*/
private boolean noHeaders;
/** Required for bean access. */
private ArooaSession session;
/**
* @oddjob.property
* @oddjob.description Specifies the order and titles of
* the properties.
* @oddjob.required No.
*/
private BeanView beanView;
@ArooaHidden
@Override
public void setArooaSession(ArooaSession session) {
this.session = session;
}
@Override
public void run() {
if (beans == null) {
throw new NullPointerException("No beans.");
}
if (output == null) {
try {
output = new StdoutType().toValue();
} catch (ArooaConversionException e) {
throw new RuntimeException(e);
}
}
IterableBusDriver<Object> iterableBusDriver =
new IterableBusDriver<Object>();
final BeanSheet sheet = new BeanSheet();
sheet.setArooaSession(session);
sheet.setOutput(output);
sheet.setNoHeaders(noHeaders);
sheet.setBeanViews(new BeanViews() {
@Override
public BeanView beanViewFor(ArooaClass arooaClass) {
return beanView;
}
});
sheet.setBusConductor(iterableBusDriver.getServices().getService(
SimpleBusService.BEAN_BUS_SERVICE_NAME));
iterableBusDriver.setBeans(beans);
iterableBusDriver.setTo(sheet);
iterableBusDriver.run();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Iterable<? extends Object> getBeans() {
return beans;
}
public void setBeans(Iterable<? extends Object> beans) {
this.beans = beans;
}
public OutputStream getOutput() {
return output;
}
public void setOutput(OutputStream output) {
this.output = output;
}
public boolean isNoHeaders() {
return noHeaders;
}
public void setNoHeaders(boolean noHeader) {
this.noHeaders = noHeader;
}
public BeanView getBeanView() {
return beanView;
}
public void setBeanView(BeanView beanExtraProvider) {
this.beanView = beanExtraProvider;
}
@Override
public String toString() {
if (name == null) {
return getClass().getSimpleName();
}
return name;
}
}