123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661 |
- /*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
- package org.apache.fop.apps;
-
- // java
- import java.util.Vector;
- import java.io.File;
- import java.io.FileNotFoundException;
-
- // FOP
- import org.apache.fop.configuration.Configuration;
- import org.apache.fop.apps.FOPException;
-
- import org.apache.log.*;
- import org.apache.log.format.*;
- import org.apache.log.output.io.*;
- import org.apache.log.output.*;
-
- import java.io.*;
-
- /**
- * Options parses the commandline arguments
- */
- public class CommandLineOptions {
-
- /* input / output not set */
- private static final int NOT_SET = 0;
- /* input: fo file */
- private static final int FO_INPUT = 1;
- /* input: xml+xsl file */
- private static final int XSLT_INPUT = 2;
- /* output: pdf file */
- private static final int PDF_OUTPUT = 1;
- /* output: screen using swing */
- private static final int AWT_OUTPUT = 2;
- /* output: mif file */
- private static final int MIF_OUTPUT = 3;
- /* output: sent swing rendered file to printer */
- private static final int PRINT_OUTPUT = 4;
- /* output: pcl file */
- private static final int PCL_OUTPUT = 5;
- /* output: postscript file */
- private static final int PS_OUTPUT = 6;
- /* output: text file */
- private static final int TXT_OUTPUT = 7;
-
- /* System buffers */
- private static final int BUFFER_FILE = 8;
-
- /* System buffers */
- private static final int AREA_OUTPUT = 9;
-
- /* use debug mode */
- Boolean errorDump = new Boolean(false);
- /* show configuration information */
- Boolean dumpConfiguration = new Boolean(false);
- /* suppress any progress information */
- Boolean quiet = new Boolean(false);
- /* for area tree XML output, only down to block area level */
- Boolean suppressLowLevelAreas = new Boolean(false);
- /* name of user configuration file */
- File userConfigFile = null;
- /* name of input fo file */
- File fofile = null;
- /* name of xsltfile (xslt transformation as input) */
- File xsltfile = null;
- /* name of xml file (xslt transformation as input) */
- File xmlfile = null;
- /* name of output file */
- File outfile = null;
- /* name of buffer file */
- File bufferFile = null;
- /* input mode */
- int inputmode = NOT_SET;
- /* output mode */
- int outputmode = NOT_SET;
- /* buffer mode */
- int buffermode = NOT_SET;
- /* language for user information */
- String language = null;
-
- private java.util.Hashtable rendererOptions;
-
- private Logger log;
-
- public CommandLineOptions(String[] args)
- throws FOPException, FileNotFoundException {
-
- Hierarchy hierarchy = Hierarchy.getDefaultHierarchy();
- PatternFormatter formatter = new PatternFormatter(
- "[%{priority}]: %{message}\n%{throwable}" );
-
- LogTarget target = null;
- boolean doConsoleLogging = true;
- if (doConsoleLogging) {
- target = new StreamTarget(System.out, formatter);
- } else {
- try {
- File f = new File("fop.log");
- target = new FileTarget(f, false, formatter);
- } catch (IOException e) {}
- }
-
- hierarchy.setDefaultLogTarget(target);
- log = hierarchy.getLoggerFor("fop");
- log.setPriority(Priority.INFO);
-
- boolean optionsParsed = true;
- rendererOptions = new java.util.Hashtable();
- try {
- optionsParsed = parseOptions(args);
- if (optionsParsed) {
- checkSettings();
- if (errorDump != null && errorDump.booleanValue()) {
- debug();
- }
- }
- } catch (FOPException e) {
- printUsage();
- throw e;
- } catch (java.io.FileNotFoundException e) {
- printUsage();
- throw e;
- }
-
- }
-
- /**
- * parses the commandline arguments
- * @return true if parse was successful and procesing can continue, false if processing should stop
- * @exception FOPException if there was an error in the format of the options
- */
- private boolean parseOptions(String args[]) throws FOPException {
- for (int i = 0; i < args.length; i++) {
- if (args[i].equals("-d") || args[i].equals("--full-error-dump")) {
- errorDump = new Boolean(true);
- } else if (args[i].equals("-x")
- || args[i].equals("--dump-config")) {
- dumpConfiguration = new Boolean(true);
- } else if (args[i].equals("-q") || args[i].equals("--quiet")) {
- quiet = new Boolean(true);
- } else if (args[i].equals("-c")) {
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("if you use '-c', you must specify the name of the configuration file");
- } else {
- userConfigFile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-l")) {
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("if you use '-l', you must specify a language");
- } else {
- language = args[i + 1];
- i++;
- }
- } else if (args[i].equals("-s")) {
- suppressLowLevelAreas = new Boolean(true);
- } else if (args[i].equals("-fo")) {
- inputmode = FO_INPUT;
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the fo file for the '-fo' option");
- } else {
- fofile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-xsl")) {
- inputmode = XSLT_INPUT;
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the stylesheet file for the '-xsl' option");
- } else {
- xsltfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-xml")) {
- inputmode = XSLT_INPUT;
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the input file for the '-xml' option");
- } else {
- xmlfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-awt")) {
- setOutputMode(AWT_OUTPUT);
- } else if (args[i].equals("-pdf")) {
- setOutputMode(PDF_OUTPUT);
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the pdf output file");
- } else {
- outfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-mif")) {
- setOutputMode(MIF_OUTPUT);
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the mif output file");
- } else {
- outfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-print")) {
- setOutputMode(PRINT_OUTPUT);
- // show print help
- if (i + 1 < args.length) {
- if (args[i + 1].equals("help")) {
- printUsagePrintOutput();
- return false;
- }
- }
- } else if (args[i].equals("-pcl")) {
- setOutputMode(PCL_OUTPUT);
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the pdf output file");
- } else {
- outfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-ps")) {
- setOutputMode(PS_OUTPUT);
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the PostScript output file");
- } else {
- outfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-txt")) {
- setOutputMode(TXT_OUTPUT);
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the text output file");
- } else {
- outfile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].charAt(0) != '-') {
- if (inputmode == NOT_SET) {
- inputmode = FO_INPUT;
- fofile = new File(args[i]);
- } else if (outputmode == NOT_SET) {
- outputmode = PDF_OUTPUT;
- outfile = new File(args[i]);
- } else {
- throw new FOPException("Don't know what to do with "
- + args[i]);
- }
- } else if (args[i].equals("-buf")) {
- if (buffermode == NOT_SET) {
- buffermode = BUFFER_FILE;
- } else {
- log.error("you can only set one buffer method");
- printUsage();
- }
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- log.error("you must specify the buffer output file");
- printUsage();
- } else {
- bufferFile = new File(args[i + 1]);
- i++;
- }
- } else if (args[i].equals("-at")) {
- setOutputMode(AREA_OUTPUT);
- if ((i + 1 == args.length)
- || (args[i + 1].charAt(0) == '-')) {
- throw new FOPException("you must specify the area-tree output file");
- } else {
- outfile = new File(args[i + 1]);
- i++;
- }
- } else {
- printUsage();
- return false;
- }
- }
- return true;
- } // end parseOptions
-
- private void setOutputMode(int mode) throws FOPException {
- if (outputmode == NOT_SET) {
- outputmode = mode;
- } else {
- throw new FOPException("you can only set one output method");
- }
- }
-
- /**
- * checks whether all necessary information has been given in a consistent way
- */
- private void checkSettings() throws FOPException, FileNotFoundException {
- if (inputmode == NOT_SET) {
- throw new FOPException("No input file specified");
- }
-
- if (outputmode == NOT_SET) {
- throw new FOPException("No output file specified");
- }
-
- if (inputmode == XSLT_INPUT) {
- // check whether xml *and* xslt file have been set
- if (xmlfile == null) {
- throw new FOPException("XML file must be specified for the tranform mode");
- }
- if (xsltfile == null) {
- throw new FOPException("XSLT file must be specified for the tranform mode");
- }
-
- // warning if fofile has been set in xslt mode
- if (fofile != null) {
- log.warn("Can't use fo file with transform mode! Ignoring.\n"
- + "Your input is " + "\n xmlfile: "
- + xmlfile.getAbsolutePath()
- + "\nxsltfile: "
- + xsltfile.getAbsolutePath()
- + "\n fofile: "
- + fofile.getAbsolutePath());
- }
- if (!xmlfile.exists()) {
- throw new FileNotFoundException("xml file "
- + xmlfile.getAbsolutePath()
- + " not found ");
- }
- if (!xsltfile.exists()) {
- throw new FileNotFoundException("xsl file "
- + xsltfile.getAbsolutePath()
- + " not found ");
- }
-
- } else if (inputmode == FO_INPUT) {
- if (xmlfile != null || xsltfile != null) {
- log.warn("fo input mode, but xmlfile or xslt file are set:");
- log.error("xml file: " + xmlfile.toString());
- log.error("xslt file: " + xsltfile.toString());
- }
- if (!fofile.exists()) {
- throw new FileNotFoundException("fo file "
- + fofile.getAbsolutePath()
- + " not found ");
- }
-
- }
- } // end checkSettings
-
- /**
- * returns the chosen renderer, throws FOPException
- */
- public int getRenderer() throws FOPException {
- switch (outputmode) {
- case NOT_SET:
- throw new FOPException("Renderer has not been set!");
- case PDF_OUTPUT:
- return Driver.RENDER_PDF;
- case AWT_OUTPUT:
- return Driver.RENDER_AWT;
- case MIF_OUTPUT:
- return Driver.RENDER_MIF;
- case PRINT_OUTPUT:
- return Driver.RENDER_PRINT;
- case PCL_OUTPUT:
- return Driver.RENDER_PCL;
- case PS_OUTPUT:
- return Driver.RENDER_PS;
- case TXT_OUTPUT:
- return Driver.RENDER_TXT;
- case AREA_OUTPUT:
- rendererOptions.put("fineDetail", isCoarseAreaXml());
- return Driver.RENDER_XML;
- default:
- throw new FOPException("Invalid Renderer setting!");
- }
- }
-
- /**
- *
- */
- public InputHandler getInputHandler() {
- switch (inputmode) {
- case FO_INPUT:
- return new FOInputHandler(fofile);
- case XSLT_INPUT:
- return new XSLTInputHandler(xmlfile, xsltfile);
- default:
- return new FOInputHandler(fofile);
- }
- }
-
- public java.util.Hashtable getRendererOptions() {
- return rendererOptions;
- }
-
- public Starter getStarter() throws FOPException {
- Starter starter = null;
- switch (outputmode) {
- case AWT_OUTPUT:
- try {
- starter = ((Starter)Class.forName("org.apache.fop.apps.AWTStarter").getConstructor(new Class[] {
- CommandLineOptions.class
- }).newInstance(new Object[] {
- this
- }));
- } catch (Exception e) {
- if (e instanceof FOPException) {
- throw (FOPException)e;
- }
- throw new FOPException("AWTStarter could not be loaded.", e);
- }
- case PRINT_OUTPUT:
- try {
- starter = ((Starter)Class.forName("org.apache.fop.apps.PrintStarter").getConstructor(new Class[] {
- CommandLineOptions.class
- }).newInstance(new Object[] {
- this
- }));
- } catch (Exception e) {
- if (e instanceof FOPException) {
- throw (FOPException)e;
- }
- throw new FOPException("PrintStarter could not be loaded.",
- e);
- }
-
- default:
- starter = new CommandLineStarter(this);
- }
- starter.setLogger(log);
- return starter;
- }
-
- public int getInputMode() {
- return inputmode;
- }
-
- public int getOutputMode() {
- return outputmode;
- }
-
- public File getFOFile() {
- return fofile;
- }
-
- public File getXMLFile() {
- return xmlfile;
- }
-
- public File getXSLFile() {
- return xsltfile;
- }
-
- public File getOutputFile() {
- return outfile;
- }
-
- public File getUserConfigFile() {
- return userConfigFile;
- }
-
- public String getLanguage() {
- return language;
- }
-
- public File getBufferFile() {
- return bufferFile;
- }
-
- public Boolean isQuiet() {
- return quiet;
- }
-
- public Boolean dumpConfiguration() {
- return dumpConfiguration;
- }
-
- public Boolean isDebugMode() {
- return errorDump;
- }
-
- public Boolean isCoarseAreaXml() {
- return suppressLowLevelAreas;
- }
-
- /**
- * return either the fofile or the xmlfile
- */
- public File getInputFile() {
- switch (inputmode) {
- case FO_INPUT:
- return fofile;
- case XSLT_INPUT:
- return xmlfile;
- default:
- return fofile;
- }
- }
-
- /**
- * shows the commandline syntax including a summary of all available options and some examples
- */
- public static void printUsage() {
- System.err.println("\nUSAGE\nFop [options] [-fo|-xml] infile [-xsl file] [-awt|-pdf|-mif|-pcl|-ps|-txt|-at|-print] <outfile>\n"
- + " [OPTIONS] \n"
- + " -d debug mode \n"
- + " -x dump configuration settings \n"
- + " -q quiet mode \n"
- + " -c cfg.xml use additional configuration file cfg.xml\n"
- + " -l lang the language to use for user information \n"
- + " -s for area tree XML, down to block areas only\n\n"
- + " [INPUT] \n"
- + " infile xsl:fo input file (the same as the next) \n"
- + " -fo infile xsl:fo input file \n"
- + " -xml infile xml input file, must be used together with -xsl \n"
- + " -xsl stylesheet xslt stylesheet \n \n"
- + " [OUTPUT] \n"
- + " outfile input will be rendered as pdf file into outfile \n"
- + " -pdf outfile input will be rendered as pdf file (outfile req'd) \n"
- + " -awt input will be displayed on screen \n"
- + " -mif outfile input will be rendered as mif file (outfile req'd)\n"
- + " -pcl outfile input will be rendered as pcl file (outfile req'd) \n"
- + " -ps outfile input will be rendered as PostScript file (outfile req'd) \n"
- + " -txt outfile input will be rendered as text file (outfile req'd) \n"
- + " -at outfile representation of area tree as XML (outfile req'd) \n"
- + " -print input file will be rendered and sent to the printer \n"
- + " see options with \"-print help\" \n\n"
- + " [Examples]\n" + " Fop foo.fo foo.pdf \n"
- + " Fop -fo foo.fo -pdf foo.pdf (does the same as the previous line)\n"
- + " Fop -xsl foo.xsl -xml foo.xml -pdf foo.pdf\n"
- + " Fop foo.fo -mif foo.mif\n"
- + " Fop foo.fo -print or Fop -print foo.fo \n"
- + " Fop foo.fo -awt \n");
- }
-
- /**
- * shows the options for print output
- */
- public void printUsagePrintOutput() {
- System.err.println("USAGE: -print [-Dstart=i] [-Dend=i] [-Dcopies=i] [-Deven=true|false] "
- + " org.apache.fop.apps.Fop (..) -print \n"
- + "Example:\n"
- + "java -Dstart=1 -Dend=2 org.apache.Fop.apps.Fop infile.fo -print ");
- }
-
-
- /**
- * debug mode. outputs all commandline settings
- */
- private void debug() {
- log.debug("Input mode: ");
- switch (inputmode) {
- case NOT_SET:
- log.debug("not set");
- break;
- case FO_INPUT:
- log.debug("FO ");
- log.debug("fo input file: " + fofile.toString());
- break;
- case XSLT_INPUT:
- log.debug("xslt transformation");
- log.debug("xml input file: " + xmlfile.toString());
- log.debug("xslt stylesheet: " + xsltfile.toString());
- break;
- default:
- log.debug("unknown input type");
- }
- log.debug("Output mode: ");
- switch (outputmode) {
- case NOT_SET:
- log.debug("not set");
- break;
- case PDF_OUTPUT:
- log.debug("pdf");
- log.debug("output file: " + outfile.toString());
- break;
- case AWT_OUTPUT:
- log.debug("awt on screen");
- if (outfile != null) {
- log.error("awt mode, but outfile is set:");
- log.debug("out file: " + outfile.toString());
- }
- break;
- case MIF_OUTPUT:
- log.debug("mif");
- log.debug("output file: " + outfile.toString());
- break;
- case PRINT_OUTPUT:
- log.debug("print directly");
- if (outfile != null) {
- log.error("print mode, but outfile is set:");
- log.error("out file: " + outfile.toString());
- }
- break;
- case PCL_OUTPUT:
- log.debug("pcl");
- log.debug("output file: " + outfile.toString());
- break;
- case PS_OUTPUT:
- log.debug("PostScript");
- log.debug("output file: " + outfile.toString());
- break;
- case TXT_OUTPUT:
- log.debug("txt");
- log.debug("output file: " + outfile.toString());
- break;
- default:
- log.debug("unknown input type");
- }
-
-
- log.debug("OPTIONS");
- if (userConfigFile != null) {
- log.debug("user configuration file: "
- + userConfigFile.toString());
- } else {
- log.debug("no user configuration file is used [default]");
- }
- if (errorDump != null) {
- log.debug("debug mode on");
- } else {
- log.debug("debug mode off [default]");
- }
- if (dumpConfiguration != null) {
- log.debug("dump configuration");
- } else {
- log.debug("don't dump configuration [default]");
- }
- if (quiet != null) {
- log.debug("quiet mode on");
- } else {
- log.debug("quiet mode off [default]");
- }
-
- }
-
- // debug: create class and output all settings
- public static void main(String args[]) {
- /*
- * for (int i = 0; i < args.length; i++) {
- * log.debug(">"+args[i]+"<");
- * }
- */
- try {
- CommandLineOptions options = new CommandLineOptions(args);
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- // options.debug();
- }
-
- }
|