# HG changeset patch
# User František Kučera <franta-hg@frantovo.cz>
# 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);
 	}
 }