package org.oddjob;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Array;
import java.util.Enumeration;
import java.util.Properties;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.PropertyConfigurator;
/**
* This is a very simple wrapper around Oddjob with a main method.
*
* @author Rob Gordon
*/
public class Main {
private static Logger logger;
private static Logger logger() {
if (logger == null) {
logger = Logger.getLogger(Main.class);
}
return logger;
}
public static final String USER_PROPERTIES = "oddjob.properties";
/**
* Parse the command args and configure Oddjob.
*
* @param args The args.
* @return A configured and ready to run Oddjob.
* @throws FileNotFoundException
*/
public Oddjob init(String args[]) throws IOException {
OddjobBuilder oddjobBuilder = new OddjobBuilder();
Properties props = processUserProperties();
String logConfig = null;
String oddjobHome = System.getProperty("oddjob.home");
oddjobBuilder.setOddjobHome(oddjobHome);
int startArg = 0;
// cycle through given args
for (int i = 0; i < args.length; i++) {
String arg = args[i];
if (arg.equals("-h") || arg.equals("-help")) {
usage();
return null;
} else if (arg.equals("-v") || arg.equals("-version")) {
version();
return null;
}
else if (arg.equals("-n") || arg.equals("-name")) {
oddjobBuilder.setName(args[++i]);
startArg += 2;
} else if (arg.equals("-l") || arg.equals("-log")) {
logConfig = args[++i];
startArg += 2;
} else if (arg.equals("-f") || arg.equals("-file")) {
oddjobBuilder.setOddjobFile(args[++i]);
startArg += 2;
} else if (arg.equals("-nb") || arg.equals("-noballs")) {
oddjobBuilder.setNoOddballs(true);
startArg += 1;
} else if (arg.equals("-ob") || arg.equals("-oddballs")) {
oddjobBuilder.setOddballsDir(new File(args[++i]));
startArg += 2;
} else if (arg.equals("-op") || arg.equals("-obpath")) {
oddjobBuilder.setOddballsPath(args[++i]);
startArg += 2;
} else if (arg.equals("--")) {
startArg += 1;
break;
} else {
// unrecognised arg, so also pass though to oddjob;
break;
}
}
if (logConfig != null) {
configureLog(logConfig);
}
// crude attempt to see if logging is initialise either statically or via
// a file. If it hasn't set a default so we don't get warnings.
Enumeration<?> enumeration = Logger.getRootLogger().getAllAppenders();
boolean hasAppenders = enumeration.hasMoreElements();
if (!hasAppenders) {
Logger.getRootLogger().addAppender(new ConsoleAppender(
new PatternLayout("%-5p %m%n")));
Logger.getRootLogger().setLevel(Level.ERROR);
}
Oddjob oddjob = oddjobBuilder.buildOddjob();
oddjob.setProperties(props);
// pass remaining args into Oddjob.
Object newArray = Array.newInstance(String.class, args.length - startArg);
System.arraycopy(args, startArg, newArray, 0, args.length - startArg);
oddjob.setArgs((String[]) newArray);
return oddjob;
}
/**
* Configure logging from a log file.
*
* @param logConfigFileName The log file name.
*/
public void configureLog(String logConfigFileName) {
System.setProperty("log4j.defaultInitOverride", "true");
PropertyConfigurator.configure(logConfigFileName);
logger().info("Configured logging with file [" + logConfigFileName + "]");
}
/**
* Display usage info.
*
*/
public void usage() {
System.out.println("usage: oddjob [options]");
System.out.println("-h -help Displays this usage.");
System.out.println("-v -version Displays Oddjobs version.");
// only works from Launch.
System.out.println("-cp -classpath Extra classpath.");
System.out.println("-f -file Job file. Defaults to oddjob.xml");
System.out.println("-n -name Oddjob name. Used in logging.");
System.out.println("-l -log log4j properties file.");
System.out.println("-ob -oddballs Oddballs directory. Defaults to ${oddjob.home}/oddballs");
System.out.println("-nb -noballs Run without Oddballs from the oddballs direcotry.");
System.out.println("-op -obpath Oddballs path. Oddballs that suppliment those in the Oddball directory.");
System.out.println("-- Pass all remaining arguments through to Oddjob.");
}
/**
* Display version info.
*
*/
public void version() {
System.out.println("Oddjob version: " + new Oddjob().getVersion());
}
/**
* Process the properties in oddjob.properties in the users
* home directory.
*
* @return The properties. Null if there aren't any.
*
* @throws IOException
*/
protected Properties processUserProperties() throws IOException {
String homeDir = System.getProperty("user.home");
if (homeDir == null) {
return null;
}
File userProperties = new File(homeDir, USER_PROPERTIES);
if (!userProperties.exists()) {
return null;
}
Properties props = new Properties();
InputStream input = new FileInputStream(userProperties);
props.load(input);
input.close();
return props;
}
/**
* The main.
*
* @param args The command line args.
* @throws FileNotFoundException
*/
public static void main(String[] args) throws IOException {
Main ojm = new Main();
Oddjob oddjob = ojm.init(args);
if (oddjob == null) {
return;
}
OddjobRunner runner = new OddjobRunner(oddjob);
runner.initShutdownHook();
runner.run();
}
}