# HG changeset patch # User František Kučera # Date 1404858049 -7200 # Node ID 88836193c9baa8dca9c29afa11b6bb6ff40f2357 # Parent 5e79450a521ebc8a1b5430eb4e29057b142d1281 CLIStarter: exceptions handling diff -r 5e79450a521e -r 88836193c9ba java/alt2xml-cli/src/cz/frantovo/alt2xml/cli/CLIStarter.java --- a/java/alt2xml-cli/src/cz/frantovo/alt2xml/cli/CLIStarter.java Thu Jul 03 00:42:50 2014 +0200 +++ b/java/alt2xml-cli/src/cz/frantovo/alt2xml/cli/CLIStarter.java Wed Jul 09 00:20:49 2014 +0200 @@ -20,17 +20,17 @@ import cz.frantovo.alt2xml.out.Action; import cz.frantovo.alt2xml.out.ActionContext; import cz.frantovo.alt2xml.out.ActionFactory; -import java.io.File; -import java.io.OutputStream; -import java.util.Arrays; +import cz.frantovo.alt2xml.out.OutputActionException; import java.util.HashMap; import java.util.Map; import java.util.ServiceLoader; import java.util.logging.Level; +import java.util.logging.LogRecord; import java.util.logging.Logger; +import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; -import org.xml.sax.InputSource; +import org.xml.sax.SAXException; /** * @@ -38,9 +38,22 @@ */ public class CLIStarter { + // help:exit-codes + public static final int EXIT_SUCCESS = 0; // doc:success + public static final int EXIT_UNEXPECTED_ERROR = 1; // doc:unexpected error (probably bug) + // 2 is reserved: http://www.tldp.org/LDP/abs/html/exitcodes.html#EXITCODESREF + public static final int EXIT_SAX_ERROR = 3; // doc:SAX error + public static final int EXIT_CLI_PARSE_ERROR = 4; // doc:CLI options parse error + public static final int EXIT_CLI_VALIDATE_ERROR = 5; // doc:CLI options validation error + public static final int EXIT_CONFIGURATION_ERROR = 6; // doc:configuration error + public static final int EXIT_OUTPUT_ACTION_ERROR = 7; // doc:formatting error + // public static final int EXIT_BATCH_ERROR = 8; // doc:batch error private static final Logger log = Logger.getLogger(CLIStarter.class.getName()); + private static final String PROGRAM_NAME = "alt2xml"; public static void main(String[] args) { + log.log(Level.FINE, "Starting " + PROGRAM_NAME); + int exitCode; try { CLIParser cliParser = new CLIParser(); @@ -58,7 +71,9 @@ ActionFactory actionFactory = actionFactories.get(actionCode); if (actionFactory == null) { - log.log(Level.SEVERE, "No such output action with code: {0}", actionCode); + InvalidOptionsException e = new InvalidOptionsException(); + e.addProblem(new InvalidOptionsException.OptionProblem("No such output action with code: " + actionCode)); + throw e; } else { ActionContext actionContext = new ActionContext(cliOptions.getOutputStream()); @@ -70,9 +85,28 @@ action.run(p, cliOptions.getInputSource()); } - } catch (Exception e) { - log.log(Level.SEVERE, "Error during processing: " + Arrays.toString(args), e); + log.log(Level.FINE, "All done"); + exitCode = EXIT_SUCCESS; + } catch (CLIParserException e) { + log.log(Level.SEVERE, "Unable to parse CLI options", e); + exitCode = EXIT_CLI_PARSE_ERROR; + } catch (InvalidOptionsException e) { + log.log(Level.SEVERE, "Invalid CLI options", e); + for (InvalidOptionsException.OptionProblem p : e.getProblems()) { + LogRecord r = new LogRecord(Level.SEVERE, "Option problem: {0}"); + r.setThrown(p.getException()); + r.setParameters(new Object[]{p.getDescription()}); + log.log(r); + } + exitCode = EXIT_CLI_VALIDATE_ERROR; + } catch (OutputActionException e) { + log.log(Level.SEVERE, "Ouput module problem", e); + exitCode = EXIT_OUTPUT_ACTION_ERROR; + } catch (ParserConfigurationException | SAXException e) { + log.log(Level.SEVERE, "Unable to create SAX parser", e); + exitCode = EXIT_SAX_ERROR; } + System.exit(exitCode); } }