package org.oddjob;
import java.io.File;
import java.io.FileNotFoundException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.oddjob.arooa.convert.convertlets.FileConvertlets;
import org.oddjob.arooa.deploy.ArooaDescriptorFactory;
import org.oddjob.arooa.deploy.ListDescriptorBean;
import org.oddjob.input.ConsoleInputHandler;
import org.oddjob.input.StdInInputHandler;
import org.oddjob.oddballs.OddballsDescriptorFactory;
import org.oddjob.oddballs.OddballsDirDescriptorFactory;
/**
* Builds an {@link Oddjob} from properties. Used by {@link Main} and
* Oddjob's Ant task.
*
* @author rob
*
*/
public class OddjobBuilder {
private static final Logger logger = Logger.getLogger(
OddjobBuilder.class);
public static final String ODDBALLS_DIR = "oddballs";
private String oddjobHome;
private String oddjobFile;
private String name;
private boolean noBalls;
private File oddballsDir;
private String oddballsPath;
/**
* Build an Oddjob.
*
* @return An Oddjob.
*
* @throws FileNotFoundException
*/
public Oddjob buildOddjob() throws FileNotFoundException {
Oddjob oddjob = new Oddjob();
oddjob.setName(name);
String oddjobHome = this.oddjobHome;
if (oddjobHome == null) {
oddjobHome = findOddjobHome();
if (oddjobHome == null) {
logger.info("Oddjob Home is not set and can not be derived.");
}
else {
logger.info("Oddjob Home has been derived and is [" + oddjobHome + "]");
}
}
else {
logger.info("Oddjob Home has been provided and is [" + oddjobHome + "]");
}
oddjob.setFile(findFileToUse(oddjobFile, oddjobHome));
oddjob.setName(name);
oddjob.setDescriptorFactory(resolveOddballs());
if (System.console() == null) {
oddjob.setInputHandler(new StdInInputHandler());
}
else {
oddjob.setInputHandler(new ConsoleInputHandler());
}
return oddjob;
}
/**
* Find Oddjob Home based on this class location.
*
* @return
*/
protected String findOddjobHome() {
URL url = getClass().getResource(
OddjobBuilder.class.getSimpleName() + ".class");
String jar = url.getFile();
File lib = new File(jar).getParentFile();
return lib.getParent();
}
/**
* Work out which file to use
*
* @param oddjobFile
*
* @return
*
* @throws FileNotFoundException
*/
public File findFileToUse(String oddjobFile, String oddjobHome)
throws FileNotFoundException {
File theFile;
if (oddjobFile == null) {
theFile = new File("oddjob.xml");
if (!theFile.exists() && oddjobHome != null) {
theFile = new File(oddjobHome, "oddjob.xml");
}
if (!theFile.exists()) {
throw new FileNotFoundException(
"oddjob.xml or ${oddjob.home}/oddjob.xml");
}
}
else {
theFile = new File(oddjobFile);
if (!theFile.exists()) {
throw new FileNotFoundException(oddjobFile);
}
}
return theFile;
}
protected ArooaDescriptorFactory resolveOddballs() {
List<ArooaDescriptorFactory> descriptors =
new ArrayList<ArooaDescriptorFactory>();
if (oddballsPath != null) {
logger.info("Adding Descriptor Factory for path [" +
oddballsPath + "]");
descriptors.add(
new OddballsDescriptorFactory(
new FileConvertlets().pathToFiles(
oddballsPath)));
}
if (oddballsDir != null) {
logger.info("Adding Descriptor Factory for Oddballs dir [" +
oddballsDir + "]");
descriptors.add(
new OddballsDirDescriptorFactory(oddballsDir));
}
if (!noBalls) {
File defaultOddballsDir = new File(oddjobHome, ODDBALLS_DIR);
logger.info("Adding Descriptor factory for default Oddballs from dir [" +
defaultOddballsDir + "]");
descriptors.add(
new OddballsDirDescriptorFactory(defaultOddballsDir));
}
switch (descriptors.size()) {
case 0:
return null;
case 1:
return descriptors.get(0);
default:
return new ListDescriptorBean(descriptors);
}
}
public String getOddjobFile() {
return oddjobFile;
}
public void setOddjobFile(String oddjobFile) {
this.oddjobFile = oddjobFile;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public File getOddballsDir() {
return oddballsDir;
}
public void setOddballsDir(File oddballsDir) {
this.oddballsDir = oddballsDir;
}
public String getOddballsPath() {
return oddballsPath;
}
public void setOddballsPath(String oddballsPath) {
this.oddballsPath = oddballsPath;
}
public String getOddjobHome() {
return oddjobHome;
}
public void setOddjobHome(String oddjobHome) {
this.oddjobHome = oddjobHome;
}
public boolean isNoBalls() {
return noBalls;
}
public void setNoOddballs(boolean noBalls) {
this.noBalls = noBalls;
}
}