/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.app.launcher; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.io.StreamTokenizer; import java.util.ArrayList; import java.util.List; import org.jdom.Document; /** * * @author mwood */ public class CommandRunner { /** * * @param args the command line arguments given * @throws IOException if IO error * @throws FileNotFoundException if file doesn't exist */ public static void main(String[] args) throws FileNotFoundException, IOException { if (args.length > 0) { runManyCommands(args[0]); } else { runManyCommands("-"); } // There is no sensible way to use the status returned by runManyCommands(). // If called from the command line then we would want to return it // through System.exit(). But if called (normally) from ScriptLauncher, // there is no way to return it and we don't want to interrupt // ScriptLauncher. // // "'tis a puzzlement." -- the King of Siam } /** * Read a file of command lines and execute each in turn. * * @param script the file of command lines to be executed. * @return status code * @throws IOException if IO error * @throws FileNotFoundException if file doesn't exist */ static int runManyCommands(String script) throws FileNotFoundException, IOException { Reader input; if ("-".equals(script)) { input = new InputStreamReader(System.in); } else { input = new FileReader(script); } StreamTokenizer tokenizer = new StreamTokenizer(input); tokenizer.eolIsSignificant(true); tokenizer.ordinaryChar('-'); tokenizer.wordChars('-', '-'); tokenizer.ordinaryChars('0', '9'); tokenizer.wordChars('0', '9'); tokenizer.ordinaryChar('.'); tokenizer.wordChars('.', '.'); tokenizer.ordinaryChar('@'); tokenizer.wordChars('@', '@'); int status = 0; List<String> tokens = new ArrayList<String>(); Document commandConfigs = ScriptLauncher.getConfig(); while (StreamTokenizer.TT_EOF != tokenizer.nextToken()) { if (StreamTokenizer.TT_EOL == tokenizer.ttype) { if (tokens.size() > 0) { status = ScriptLauncher.runOneCommand(commandConfigs, tokens.toArray(new String[tokens.size()])); if (status > 0) { break; } tokens.clear(); } } else { tokens.add(tokenizer.sval); } } return status; } }