1 17 18 19 20 23 import java.io.File ; 25 import java.io.IOException ; 26 import java.io.OutputStream ; 27 import java.io.FileInputStream ; 28 import java.io.FileOutputStream ; 29 30 import java.util.Vector ; 31 32 import javax.xml.transform.Transformer ; 34 import javax.xml.transform.TransformerFactory ; 35 import javax.xml.transform.TransformerException ; 36 import javax.xml.transform.Source ; 37 import javax.xml.transform.Result ; 38 import javax.xml.transform.stream.StreamSource ; 39 import javax.xml.transform.stream.StreamResult ; 40 import javax.xml.transform.sax.SAXSource ; 41 import javax.xml.transform.sax.SAXResult ; 42 43 import javax.xml.parsers.SAXParserFactory ; 44 import javax.xml.parsers.FactoryConfigurationError ; 45 import javax.xml.parsers.SAXParser ; 46 import javax.xml.parsers.ParserConfigurationException ; 47 48 import org.xml.sax.InputSource ; 50 import org.xml.sax.XMLReader ; 51 import org.xml.sax.SAXException ; 52 import org.xml.sax.SAXParseException ; 53 import org.xml.sax.ErrorHandler ; 54 55 import org.apache.xml.resolver.tools.CatalogResolver; 57 58 import org.apache.commons.cli.Options; 59 import org.apache.commons.cli.Option; 60 import org.apache.commons.cli.OptionGroup; 61 import org.apache.commons.cli.CommandLine; 62 import org.apache.commons.cli.HelpFormatter; 63 import org.apache.commons.cli.Parser; 64 import org.apache.commons.cli.GnuParser; 65 import org.apache.commons.cli.ParseException; 66 67 import org.apache.avalon.framework.ExceptionUtil; 69 import org.apache.avalon.framework.logger.ConsoleLogger; 70 import org.apache.avalon.framework.logger.Logger; 71 72 import org.apache.fop.apps.Driver; 74 import org.apache.fop.apps.FOPException; 75 import org.apache.fop.messaging.MessageHandler; 76 77 81 public class BookMaker implements ErrorHandler { 82 83 private Logger logger; 84 85 private File xmlFile, xsltFile, outFile, pdfFile; 86 private boolean useCatalog; 87 private Vector xsltParams = null; 88 89 public BookMaker() { 90 logger = new ConsoleLogger(ConsoleLogger.LEVEL_INFO); 92 } 93 94 97 public void warning(SAXParseException e) { 98 logger.warn(e.toString()); 99 } 100 101 104 public void error(SAXParseException e) { 105 logger.error(e.toString()); 106 } 107 108 111 public void fatalError(SAXParseException e) throws SAXException { 112 logger.error(e.toString()); 113 throw e; 114 } 115 116 public void makeBook() 117 throws IOException , FOPException, TransformerException , 118 FactoryConfigurationError , 119 ParserConfigurationException , SAXException { 120 121 OutputStream out = null; 122 123 try { 124 125 Source xmlSource, xsltSource; 126 Result result; 127 CatalogResolver resolver = null; 128 129 if (useCatalog) { 131 resolver = new CatalogResolver(); 132 logger.info("Using " + resolver.getClass().getName() 133 + " as entity/URI resolver"); 134 } 135 136 TransformerFactory tFactory = TransformerFactory.newInstance(); 138 if (useCatalog) { 139 tFactory.setURIResolver(resolver); 140 } 141 142 if (useCatalog) { 144 145 SAXParser parser; 146 XMLReader xmlReader; 147 FileInputStream fis; 148 InputSource is; 149 150 SAXParserFactory sFactory = SAXParserFactory.newInstance(); 152 sFactory.setNamespaceAware(true); 153 154 parser = sFactory.newSAXParser(); 157 xmlReader = parser.getXMLReader(); 159 logger.info("Using " + xmlReader.getClass().getName() 160 + " as SAX parser"); 161 xmlReader.setErrorHandler(this); 162 xmlReader.setEntityResolver(resolver); 163 164 fis = new FileInputStream (xmlFile); 166 is = new InputSource (fis); 167 xmlSource = new SAXSource (xmlReader, is); 168 169 parser = sFactory.newSAXParser(); 172 xmlReader = parser.getXMLReader(); 174 logger.info("Using " + xmlReader.getClass().getName() 175 + " as SAX parser"); 176 xmlReader.setErrorHandler(this); 177 xmlReader.setEntityResolver(resolver); 178 179 fis = new FileInputStream (xsltFile); 181 is = new InputSource (fis); 182 xsltSource = new SAXSource (xmlReader, is); 183 184 } else { 185 xmlSource = new StreamSource (xmlFile); 186 xsltSource = new StreamSource (xsltFile); 187 } 188 189 if (pdfFile != null) { 191 MessageHandler.setScreenLogger(logger); 193 Driver driver = new Driver(); 194 driver.setLogger(logger); 195 driver.setRenderer(Driver.RENDER_PDF); 196 out = new FileOutputStream (pdfFile); 197 driver.setOutputStream(out); 198 result = new SAXResult (driver.getContentHandler()); 201 } else { 202 out = new FileOutputStream (outFile); 203 result = new StreamResult (out); 204 } 205 206 Transformer transformer 208 = tFactory.newTransformer(xsltSource); 209 logger.info("Using " + transformer.getClass().getName() 210 + " as TrAX transformer"); 211 212 if (xsltParams != null) { 214 for (int i = 0; i < xsltParams.size(); i += 2) { 215 transformer.setParameter 216 ((String ) xsltParams.elementAt(i), 217 (String ) xsltParams.elementAt(i + 1)); 218 } 219 } 220 221 transformer.transform(xmlSource, result); 223 224 } finally { 225 if (out != null) { 226 out.close(); 227 } 228 } 229 } 230 231 private static Options createOptions() { 232 233 Options options = new Options(); 234 OptionGroup og; 235 Option o; 236 237 o = new Option("h", "help", false, "Print help"); 238 options.addOption(o); 239 240 o = new Option("c", "useCatalog", false, "Use catalog"); 241 options.addOption(o); 242 243 o = new Option("xml", "xmlFile", true, "XML input file"); 244 o.setArgName("file"); 245 options.addOption(o); 246 247 o = new Option("xsl", "xslFile", true, "XSLT stylesheet"); 248 o.setArgName("file"); 249 options.addOption(o); 250 251 og = new OptionGroup(); 253 o = new Option("out", "outFile", true, "(X)HTML/FO output file"); 254 o.setArgName("file"); 255 og.addOption(o); 256 257 o = new Option("pdf", "pdfFile", true, "PDF output file"); 258 o.setArgName("file"); 259 og.addOption(o); 260 261 options.addOptionGroup(og); 262 263 o = new Option("p", "parameter", true, 264 "Parameter for the XSLT transformation"); 265 o.setArgs(2); 266 o.setArgName("name value"); 267 options.addOption(o); 268 269 return options; 270 } 271 272 public static void main(String [] args) { 273 274 BookMaker app = new BookMaker(); 275 276 try { 277 278 Options options = createOptions(); 280 281 Parser parser = new GnuParser(); 284 CommandLine cl = null; 285 cl = parser.parse(options, args); 286 if (cl.hasOption("h")) { 287 HelpFormatter formatter = new HelpFormatter(); 289 formatter.printHelp("BookMaker", options); 290 System.exit(0); 291 } 292 293 if (cl.hasOption("c")) { 295 app.useCatalog = true; 296 } 297 if (cl.hasOption("xml")) { 298 app.xmlFile = new File (cl.getOptionValue("xml")); 299 } 300 if (cl.hasOption("xsl")) { 301 app.xsltFile = new File (cl.getOptionValue("xsl")); 302 } 303 if (cl.hasOption("out")) { 304 app.outFile = new File (cl.getOptionValue("out")); 305 } 306 if (cl.hasOption("pdf")) { 307 app.pdfFile = new File (cl.getOptionValue("pdf")); 308 } 309 if (cl.hasOption("p")) { 310 String [] params = cl.getOptionValues("p"); 311 app.xsltParams = new Vector (); 312 for (int i = 0; i < params.length; ++i) { 313 app.xsltParams.addElement(params[i]); 314 } 315 } 316 317 app.logger.info("Input: XML (" + app.xmlFile + ")"); 318 app.logger.info("Stylesheet: " + app.xsltFile); 319 if (app.pdfFile != null) { 320 app.logger.info("Output: PDF (" + app.pdfFile + ")"); 321 } else { 322 app.logger.info("Output: (X)HTML/FO (" + app.outFile + ")"); 323 } 324 app.logger.info(""); 325 app.logger.info("Transforming..."); 326 327 app.makeBook(); 328 329 app.logger.info("Transforming done"); 330 } catch (Exception e) { 331 app.logger.error(ExceptionUtil.printStackTrace(e)); 332 System.exit(1); 333 } 334 } 335 } 336
| Popular Tags
|