tiny fix
[mir.git] / source / OutputMir.java
1 import java.io.*;
2
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5
6 import org.xml.sax.InputSource;
7 import org.xml.sax.XMLReader;
8
9 import org.apache.fop.apps.Driver;
10 import org.apache.fop.apps.Version;
11 import org.apache.fop.apps.XSLTInputHandler;
12
13 import org.apache.log.*;
14
15 import mir.servlet.*;
16 import mir.module.*;
17 import mir.misc.*;
18 import mir.entity.*;
19 import mir.storage.*;
20
21
22 import mircoders.entity.*;
23 import mircoders.storage.*;
24 import mircoders.module.*;
25 import mircoders.producer.*;
26
27
28
29 /**
30  * generate a PDF from a servlet.
31  * Servlet param is:
32  * <ul>
33  *   <li>id: the id number of the content entity to turn into a pdf
34  * </ul>
35  *
36  * Example URL: http://servername/servlet/OutputMir?id=66
37  * Compiling: you will need 
38  * - servlet_2_2.jar
39  * - fop.jar
40  * - sax api
41  * - logkit jar
42  *
43  * Running: you will need in the WEB-INF/lib/ directory:
44  * - fop.jar
45  * - batik.jar
46  * - avalon-framework-4.0.jar
47  * - logkit-1.0.jar
48  * - xalan-2.0.0.jar
49  */
50 public class OutputMir extends AbstractServlet {
51     private ModuleContent contentModule;
52     
53     public static final String ID_REQUEST_PARAM = "id";
54
55     Logger log = null;
56
57     public void doGet(HttpServletRequest request,
58                       HttpServletResponse response) throws ServletException {
59         if(log == null) {
60             Hierarchy hierarchy = Hierarchy.getDefaultHierarchy();
61             log = hierarchy.getLoggerFor("fop");
62             log.setPriority(Priority.WARN);
63         }
64         getConfig(request);
65
66         String producerStorageRoot=MirConfig.getProp("Producer.StorageRoot");
67         String producerDocRoot=MirConfig.getProp("Producer.DocRoot");
68         String templateDir = MirConfig.getPropWithHome("HTMLTemplateProcessor.Dir");
69         String xslSheet=templateDir + "/" + MirConfig.getProp("Producer.PrintableContent.html2foStyleSheetName");
70         try {
71             contentModule = new ModuleContent(DatabaseContent.getInstance());
72
73             String idParam = request.getParameter(ID_REQUEST_PARAM);
74             if (idParam != null){
75                 EntityContent contentEnt = (EntityContent)contentModule.getById(idParam);
76                 String publishPath = contentEnt.getValue("publish_path");
77                 String foFile = producerStorageRoot + producerDocRoot + "/" +publishPath + "/" + idParam + ".fo";
78                 XSLTInputHandler input = new XSLTInputHandler(new File(foFile), new File(xslSheet));
79                 renderXML(input, response);
80             } else {
81                 PrintWriter out = response.getWriter();
82                 out.println("<html><head><title>Error</title></head>\n"+
83                             "<body><h1>OutputMir Error</h1><h3>No 'id' "+
84                             "request param given.</body></html>");
85             }
86         } catch (ServletException ex) {
87             throw ex;
88         }
89         catch (Exception ex) {
90             throw new ServletException(ex);
91         }
92     }
93
94     /**
95      * renders an FO inputsource into a PDF file which is rendered
96      * directly to the response object's OutputStream
97      */
98     public void renderFO(InputSource foFile,
99                          HttpServletResponse response) throws ServletException {
100         try {
101             ByteArrayOutputStream out = new ByteArrayOutputStream();
102
103             response.setContentType("application/pdf");
104
105             Driver driver = new Driver(foFile, out);
106             driver.setLogger(log);
107             driver.setRenderer(Driver.RENDER_PDF);
108             driver.run();
109
110             byte[] content = out.toByteArray();
111             response.setContentLength(content.length);
112             response.getOutputStream().write(content);
113             response.getOutputStream().flush();
114         } catch (Exception ex) {
115             throw new ServletException(ex);
116         }
117     }
118
119     public void renderXML(XSLTInputHandler input,
120                          HttpServletResponse response) throws ServletException {
121         try {
122             ByteArrayOutputStream out = new ByteArrayOutputStream();
123
124             response.setContentType("application/pdf");
125
126             Driver driver = new Driver();
127             driver.setLogger(log);
128             driver.setRenderer(Driver.RENDER_PDF);
129             driver.setOutputStream(out);
130             driver.render(input.getParser(), input.getInputSource());
131
132             byte[] content = out.toByteArray();
133             response.setContentLength(content.length);
134             response.getOutputStream().write(content);
135             response.getOutputStream().flush();
136         } catch (Exception ex) {
137             throw new ServletException(ex);
138         }
139     }
140
141     /**
142      * creates a SAX parser, using the value of org.xml.sax.parser
143      * defaulting to org.apache.xerces.parsers.SAXParser
144      *
145      * @return the created SAX parser
146      */
147     static XMLReader createParser() throws ServletException {
148         String parserClassName = System.getProperty("org.xml.sax.parser");
149         if (parserClassName == null) {
150             parserClassName = "org.apache.xerces.parsers.SAXParser";
151         }
152
153         try {
154             return (XMLReader) Class.forName(
155                      parserClassName).newInstance();
156         } catch (Exception e) {
157             throw new ServletException(e);
158         }
159     }
160
161 }
162
163
164
165
166
167