* Apache xmlgraphics stack upgraded to the latest versions :
[scilab.git] / scilab / modules / scinotes / src / java / org / scilab / modules / scinotes / utils / CodeExporter.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 package org.scilab.modules.scinotes.utils;
14
15 import java.io.BufferedOutputStream;
16 import java.io.File;
17 import java.io.FileOutputStream;
18 import java.io.OutputStream;
19 import java.io.StringReader;
20
21 import java.awt.print.PageFormat;
22
23 import javax.xml.transform.Result;
24 import javax.xml.transform.Source;
25 import javax.xml.transform.Transformer;
26 import javax.xml.transform.TransformerFactory;
27 import javax.xml.transform.sax.SAXResult;
28 import javax.xml.transform.stream.StreamSource;
29
30 import org.scilab.modules.commons.ScilabConstants;
31 import org.scilab.modules.commons.xml.ScilabTransformerFactory;
32 import org.scilab.modules.scinotes.ScilabDocument;
33 import org.scilab.modules.scinotes.ScilabEditorPane;
34 import org.scilab.modules.scinotes.SciNotes;
35 import org.scilab.modules.helptools.scilab.AbstractScilabCodeHandler;
36 import org.scilab.modules.gui.messagebox.ScilabModalDialog;
37
38 import org.apache.fop.apps.FopFactory;
39 import org.apache.fop.apps.Fop;
40 import org.apache.fop.apps.FOUserAgent;
41 import org.apache.fop.apps.MimeConstants;
42
43 /**
44  * Code converter Class
45  * @author Calixte DENIZET
46  */
47 public class CodeExporter extends FOCodeConverter {
48
49     /**
50      * Constant for PDF
51      */
52     public static final String PDF = MimeConstants.MIME_PDF;
53
54     /**
55      * Constant for PS
56      */
57     public static final String PS = MimeConstants.MIME_POSTSCRIPT;
58
59     /**
60      * Constant for EPS
61      */
62     public static final String EPS = MimeConstants.MIME_EPS;
63
64     /**
65      * Constant for RTF
66      */
67     public static final String RTF = MimeConstants.MIME_RTF;
68
69     /**
70      * Constant for PNG
71      */
72     public static final String PNG = MimeConstants.MIME_PNG;
73
74     /**
75      * Constant for PREVIEW a document in AWT window
76      */
77     public static final String PREVIEW = MimeConstants.MIME_FOP_AWT_PREVIEW;
78
79     /**
80      * Constant for PRINT
81      */
82     public static final String PRINT = MimeConstants.MIME_FOP_PRINT;
83
84     private static final String CREATOR = "SciNotes for Scilab";
85     private SciNotes editor;
86
87     /**
88      * Constructor
89      * @param pane the ScilabEditorPane where the code must be converted.
90      */
91     public CodeExporter(ScilabEditorPane pane) {
92         super(pane);
93         editor = pane.getEditor();
94     }
95
96     /**
97      * Make the conversion of a ScilabEditorPane
98      * @param pane the ScilabEditorPane
99      * @param the fileName for the output
100      * @param type must on of the constants PDF, EPS, ...
101      * @param format the page format
102      */
103     public static void convert(ScilabEditorPane pane, String fileName, String type, PageFormat format) {
104         CodeExporter exporter = new CodeExporter(pane);
105         exporter.convert(((ScilabDocument) pane.getDocument()).getText(), pane.getXln().getLineNumber(), fileName, type, pane.getShortName(), format);
106     }
107
108     /**
109      * Make the conversion of a ScilabEditorPane
110      * @param pane the ScilabEditorPane
111      * @param lineNumberArray an array containing integers to number the lines
112      * @param the fileName for the output
113      * @param type must on of the constants PDF, EPS, ...
114      * @param format the page format
115      */
116     public void convert(String code, int[] lineNumberArray, String fileName, String type, String title, PageFormat format) {
117         OutputStream out = null;
118
119         try {
120             FopFactory fopFactory = FopFactory.newInstance(new File(ScilabConstants.SCI + "/modules/helptools/etc/fopconf.xml"));
121             FOUserAgent userAgent = fopFactory.newFOUserAgent();
122             userAgent.setProducer(CREATOR);
123             userAgent.setTitle(title);
124             userAgent.setAuthor(System.getProperty("user.name"));
125             Fop fop;
126             if (!type.equals(PRINT) && !type.equals(PREVIEW) && fileName != null && !fileName.isEmpty()) {
127                 out = new BufferedOutputStream(new FileOutputStream(new File(fileName)));
128                 fop = fopFactory.newFop(type, userAgent, out);
129             } else {
130                 fop = fopFactory.newFop(type, userAgent);
131             }
132             String factoryName = ScilabTransformerFactory.useDefaultTransformerFactoryImpl();
133             TransformerFactory factory = TransformerFactory.newInstance();
134             Transformer transformer = factory.newTransformer();
135             String str = super.convert(code, lineNumberArray, format);
136             Source src = new StreamSource(new StringReader(str));
137             Result res = new SAXResult(fop.getDefaultHandler());
138             transformer.transform(src, res);
139             ScilabTransformerFactory.restoreTransformerFactoryImpl(factoryName);
140         } catch (Exception e) {
141             if (type.equals(PRINT)) {
142                 ScilabModalDialog.show(editor, SciNotesMessages.PRINTERERROR + "\n" + e.getLocalizedMessage());
143             } else {
144                 System.err.println(SciNotesMessages.EXPORTERROR + ":");
145                 e.printStackTrace();
146             }
147         } finally {
148             try {
149                 if (out != null) {
150                     out.close();
151                 }
152             } catch (Exception e) {
153                 e.printStackTrace();
154             }
155         }
156     }
157 }