You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Fop.java 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. /*
  2. * $Id$
  3. * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  4. * For details on use and redistribution please refer to the
  5. * LICENSE file included with these sources.
  6. */
  7. package org.apache.fop.tools.anttasks;
  8. // Ant
  9. import org.apache.tools.ant.*;
  10. import org.apache.log.*;
  11. import org.apache.log.format.*;
  12. import org.apache.log.output.io.*;
  13. import org.apache.log.output.*;
  14. // SAX
  15. import org.xml.sax.XMLReader;
  16. import org.xml.sax.InputSource;
  17. import org.xml.sax.SAXException;
  18. import org.xml.sax.SAXParseException;
  19. // Java
  20. import java.io.*;
  21. import java.util.*;
  22. // FOP
  23. import org.apache.fop.messaging.*;
  24. import org.apache.fop.apps.Starter;
  25. import org.apache.fop.apps.InputHandler;
  26. import org.apache.fop.apps.FOInputHandler;
  27. import org.apache.fop.apps.Driver;
  28. import org.apache.fop.apps.FOPException;
  29. import org.apache.fop.configuration.Configuration;
  30. /**
  31. * Wrapper for Fop which allows it to be accessed from within an Ant task.
  32. * Accepts the inputs:
  33. * <ul>
  34. * <li>fofile -> formatting objects file to be transformed</li>
  35. * <li>pdffile -> output filename</li>
  36. * <li>baseDir -> directory to work from</li>
  37. * <li>messagelevel -> (info | verbose | debug) level to output non-error messages</li>
  38. * </ul>
  39. */
  40. public class Fop extends Task {
  41. File foFile;
  42. File pdfFile;
  43. File baseDir;
  44. int messageType = Project.MSG_VERBOSE;
  45. /**
  46. * Sets the input file
  47. * @param File to input from
  48. */
  49. public void setFofile(File foFile) {
  50. this.foFile = foFile;
  51. }
  52. /**
  53. * Gets the input file
  54. */
  55. public File getFofile() {
  56. if (foFile == null) {
  57. log("fofile attribute is not set", Project.MSG_ERR);
  58. throw new BuildException("fofile attribute is not set");
  59. }
  60. return foFile;
  61. }
  62. /**
  63. * Sets the output file
  64. * @param File to output to
  65. */
  66. public void setPdffile(File pdfFile) {
  67. this.pdfFile = pdfFile;
  68. }
  69. /**
  70. * Sets the output file
  71. */
  72. public File getPdffile() {
  73. if (pdfFile == null) {
  74. log("pdffile attribute is not set", Project.MSG_ERR);
  75. throw new BuildException("pdffile attribute is not set");
  76. }
  77. return pdfFile;
  78. }
  79. /**
  80. * Sets the message level to be used while processing.
  81. * @param String (info | verbose | debug)
  82. */
  83. public void setMessagelevel(String messageLevel) {
  84. if (messageLevel.equalsIgnoreCase("info")) {
  85. messageType = Project.MSG_INFO;
  86. } else if (messageLevel.equalsIgnoreCase("verbose")) {
  87. messageType = Project.MSG_VERBOSE;
  88. } else if (messageLevel.equalsIgnoreCase("debug")) {
  89. messageType = Project.MSG_DEBUG;
  90. } else {
  91. log("messagelevel set to unknown value \"" + messageLevel + "\"",
  92. Project.MSG_ERR);
  93. throw new BuildException("unknown messagelevel");
  94. }
  95. }
  96. /**
  97. * Returns the message type corresponding to Property.MSG_(INFO | VERBOSE | DEBUG)
  98. * representing the current message level.
  99. */
  100. public int getMessageType() {
  101. return messageType;
  102. }
  103. /**
  104. * Sets the base directory; currently ignored
  105. * @param File to use as a working directory
  106. */
  107. public void setBasedir(File baseDir) {
  108. this.baseDir = baseDir;
  109. }
  110. /**
  111. * Gets the base directory
  112. */
  113. public File getBasedir() {
  114. return (baseDir != null) ? baseDir : project.resolveFile(".");
  115. }
  116. /**
  117. * Starts execution of this task
  118. */
  119. public void execute() throws BuildException {
  120. try {
  121. Starter starter = new FOPTaskStarter(this);
  122. starter.run();
  123. } catch (FOPException ex) {
  124. throw new BuildException(ex);
  125. }
  126. }
  127. }
  128. class FOPTaskStarter extends Starter {
  129. Fop task;
  130. Logger log;
  131. FOPTaskStarter(Fop task) throws FOPException {
  132. this.task = task;
  133. Hierarchy hierarchy = new Hierarchy();
  134. // PatternFormatter formatter = new PatternFormatter(
  135. // "[%{priority}] %{category}: %{message}\n%{throwable}" );
  136. PatternFormatter formatter = new PatternFormatter("%{message}\n%{throwable}");
  137. LogTarget target = null;
  138. boolean doConsoleLogging = true;
  139. if (doConsoleLogging) {
  140. target = new StreamTarget(System.out, formatter);
  141. } else {
  142. try {
  143. File f = new File("fop.log");
  144. target = new FileTarget(f, false, formatter);
  145. } catch (IOException e) {}
  146. }
  147. hierarchy.setDefaultLogTarget(target);
  148. log = hierarchy.getLoggerFor("fop");
  149. log.setPriority(Priority.INFO);
  150. }
  151. public void run() throws FOPException {
  152. try {
  153. // Configuration.put("baseDir", task.getBasedir().toURL().toExternalForm());
  154. Configuration.put("baseDir",
  155. task.getFofile().getParentFile().toURL().toExternalForm());
  156. } catch (Exception e) {
  157. task.log("Error setting base directory", Project.MSG_DEBUG);
  158. }
  159. InputHandler inputHandler = new FOInputHandler(task.getFofile());
  160. XMLReader parser = inputHandler.getParser();
  161. setParserFeatures(parser);
  162. FileOutputStream pdfOut = null;
  163. try {
  164. pdfOut = new FileOutputStream(task.getPdffile());
  165. } catch (Exception ex) {
  166. log.error("Failed to open " + task.getPdffile());
  167. throw new BuildException(ex);
  168. }
  169. task.log("Using base directory: "
  170. + Configuration.getValue("baseDir"), Project.MSG_DEBUG);
  171. task.log(task.getFofile().getName() + " -> "
  172. + task.getPdffile().getName(), Project.MSG_INFO);
  173. try {
  174. Driver driver = new Driver(inputHandler.getInputSource(), pdfOut);
  175. driver.setLogger(log);
  176. driver.setRenderer(Driver.RENDER_PDF);
  177. driver.setXMLReader(parser);
  178. driver.run();
  179. } catch (Exception ex) {
  180. log.error("Couldn't render pdf: " + ex.getMessage());
  181. throw new BuildException(ex);
  182. }
  183. }
  184. }
  185. /*
  186. class MessageLogger implements MessageListener {
  187. MessageHandler handler;
  188. Task task;
  189. int messageLevel = Project.MSG_VERBOSE;
  190. int lastMessageLevel = Integer.MIN_VALUE;
  191. StringBuffer cache = new StringBuffer();
  192. String breakChars = "\n";
  193. boolean performCaching = true;
  194. MessageLogger(MessageHandler handler, Task task) {
  195. this(handler, task, Project.MSG_VERBOSE);
  196. }
  197. MessageLogger(MessageHandler handler, Task task, int messageLevel) {
  198. this.handler = handler;
  199. this.task = task;
  200. setMessageLevel(messageLevel);
  201. handler.addListener(this);
  202. }
  203. public void setMessageLevel(int messageLevel) {
  204. this.messageLevel = messageLevel;
  205. }
  206. public int getMessageLevel() {
  207. return messageLevel;
  208. }
  209. public void processMessage(MessageEvent event) {
  210. task.log("Logger got message: \"" + event.getMessage() + "\"",
  211. Project.MSG_DEBUG);
  212. boolean flushed = false;
  213. if (!flushed) {
  214. int messageLevel;
  215. if (event.getMessageType() == MessageEvent.ERROR) {
  216. messageLevel = Project.MSG_ERR;
  217. } else {
  218. messageLevel = this.messageLevel;
  219. }
  220. if (messageLevel != lastMessageLevel) {
  221. flush();
  222. flushed = true;
  223. }
  224. lastMessageLevel = messageLevel;
  225. }
  226. cache.append(event.getMessage());
  227. if (!performCaching) {
  228. flush();
  229. flushed = true;
  230. }
  231. for (int i = 0; !flushed && i < breakChars.length(); i++) {
  232. if (event.getMessage().lastIndexOf(breakChars.charAt(i)) != -1) {
  233. flush();
  234. flushed = true;
  235. }
  236. }
  237. }
  238. public void flush() {
  239. StringTokenizer output = new StringTokenizer(cache.toString(), "\n",
  240. false);
  241. while (output.hasMoreElements()) {
  242. task.log(output.nextElement().toString(), lastMessageLevel);
  243. }
  244. cache.setLength(0);
  245. }
  246. public void die() {
  247. flush();
  248. // because MessageHandler is static this has to be done
  249. // or you can get duplicate messages if there are
  250. // multiple <fop> tags in a buildfile
  251. handler.removeListener(this);
  252. }
  253. }
  254. */