Update jflex to 1.8.2
[scilab.git] / scilab / modules / helptools / src / java / org / scilab / modules / helptools / JarOnlyConverter.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Sylvestre LEDRU
4  * Copyright (C) 2013 - Scilab Enterprises - Clement DAVID
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16 package org.scilab.modules.helptools;
17
18 import java.io.File;
19 import java.io.FileInputStream;
20 import java.io.FileOutputStream;
21 import java.io.FilenameFilter;
22 import java.util.ArrayList;
23 import java.util.jar.JarOutputStream;
24 import java.util.zip.ZipEntry;
25
26 import org.scilab.modules.commons.ScilabConstants;
27
28 import com.sun.java.help.search.Indexer;
29 import java.io.FileNotFoundException;
30
31 public class JarOnlyConverter extends ContainerConverter {
32
33     private static final String SCI = ScilabConstants.SCI.getPath();
34
35     private static final String JAVAHELPSEARCH_DIR = "/JavaHelpSearch/";
36     private static final String COULD_NOT_FIND = "buildDoc: Could not find/access to ";
37     private static final String LEFT_PAR = " ( ";
38     private static final String RIGHT_PAR = " )";
39     private static final String JAR_EXT = ".jar";
40     private static final String SLASH = "/";
41     private static final int JAR_COMPRESSION_LEVEL = 9;
42     private static Indexer indexer = new Indexer();
43
44     private final boolean isToolbox;
45     private final String outImages;
46
47     public JarOnlyConverter(SciDocMain sciDocMain) {
48         super(sciDocMain.getOutputDirectory(), sciDocMain.getLanguage());
49
50         isToolbox = sciDocMain.isToolbox();
51
52         /*
53          * Reuse the shared generated images directory from scilab
54          */
55         String images = sciDocMain.getOutputDirectory() + File.separator;
56         if (!isToolbox) {
57             images = ScilabConstants.SCI.getPath() + "/modules/helptools/images";
58             File dir = new File(images);
59             if (!dir.exists()) {
60                 dir.mkdir();
61             }
62         }
63         outImages = images;
64     }
65
66     /**
67      * Embed the javahelp html files to a jar
68      */
69     @Override
70     public void convert() {
71         String outputJavaHelp = new String(outputDirectory + JAVAHELPSEARCH_DIR);
72
73         try {
74             /* Purge the directory before launching the index */
75             /* because the JavaHelp Indexer failed when launched twice on the same directory */
76             Helpers.deleteDirectory(outputJavaHelp);
77             File directory = new File(outputJavaHelp);
78             directory.mkdirs();
79             String jhs = new File(outputJavaHelp).getAbsolutePath();
80
81             String[] args = new String[] {"-db", jhs, "-nostopwords", "."};
82
83             indexer.compile(args);
84         } catch (Exception e) {
85             System.err.println("buildDoc: Error building search index: " + e.getLocalizedMessage());
86             return;
87         }
88
89         buildJar(outputDirectory, language);
90     }
91
92     /**
93      * Embed the images files to another jar for non-toolboxes
94      */
95     @Override
96     public void install() {
97         /*
98          * Toolboxes images are not in a separate jar.
99          */
100         if (isToolbox) {
101             return;
102         }
103
104         JarOutputStream jarFile = null;
105         FileOutputStream fileOutputStream = null;
106
107         /* Stored into SCI/modules/helptools/jar */
108         String fileName = SCI + "/modules/helptools/jar" + SLASH + "scilab_images" + JAR_EXT;
109         try {
110             fileOutputStream = new FileOutputStream(fileName);
111             jarFile = new JarOutputStream(fileOutputStream);
112             jarFile.setLevel(JAR_COMPRESSION_LEVEL);
113         } catch (java.io.FileNotFoundException e) {
114             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
115         } catch (java.io.IOException e) {
116             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
117         }
118
119         File[] allFiles = new File(outImages).listFiles();
120         for (int i = 0; i < allFiles.length; i++) {
121             File workingFile = allFiles[i];
122             try (FileInputStream fileInputStream = new FileInputStream(workingFile)) {
123                 int length = (int) workingFile.length();
124                 byte[] buffer = new byte[length];
125                 fileInputStream.read(buffer, 0, length);
126
127                 ZipEntry zipEntry = new ZipEntry(workingFile.getName());
128                 jarFile.putNextEntry(zipEntry);
129                 jarFile.write(buffer, 0, length);
130             } catch (java.io.FileNotFoundException e) {
131                 System.err.println(COULD_NOT_FIND + workingFile + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
132             } catch (java.io.IOException e) {
133                 System.err.println("buildDoc: An error occurs while building the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
134             }
135
136         }
137         try {
138             jarFile.close();
139         } catch (java.io.IOException e) {
140             System.err.println("buildDoc: An error occurs while closing the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
141         }
142     }
143
144     /**
145      * Get the list of the files in a directory
146      * @param directory the directory where files have to be searched
147      * @param language String 'fr_FR'
148      * @return the list of the files found
149      */
150     private static ArrayList<File> buildFileList(File directory,  String language) {
151         final String baseNameJar = Helpers.getBaseName(language) + JAR_EXT;
152         ArrayList<File> listFile = new ArrayList<File>();
153
154         File[] files = directory.listFiles(new FilenameFilter() {
155             public boolean accept(File dir, String name) {
156                 return !name.equals(baseNameJar);
157             }
158         });
159         for (int i = 0; i < files.length; i++) {
160             if (files[i].isDirectory()) {
161                 listFile.addAll(buildFileList(files[i], language));
162             } else {
163                 listFile.add(files[i]);
164             }
165         }
166         return listFile;
167     }
168
169     /**
170      * Private method which is trying to build the jar
171      *
172      * @param outputDirectory Where to build the jar file
173      * @param language In which language (for the file name)
174      * @return The result of the operation
175      */
176     static boolean buildJar(String outputDirectory, String language) {
177         String baseName = Helpers.getBaseName(language);
178         JarOutputStream jarFile = null;
179         FileOutputStream fileOutputStream = null;
180
181         /* Stored into SCI/modules/helptools/jar */
182         String fileName = outputDirectory + SLASH + baseName + JAR_EXT;
183         /* bug 4407 */
184         /* we do list of files before to create scilab_xx_XX_help.jar */
185         ArrayList<File> fileList = buildFileList(new File(outputDirectory), language);
186
187         try {
188             fileOutputStream = new FileOutputStream(fileName);
189             jarFile = new JarOutputStream(fileOutputStream);
190         } catch (java.io.FileNotFoundException e) {
191             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
192         } catch (java.io.IOException e) {
193             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
194         }
195
196         jarFile.setLevel(JAR_COMPRESSION_LEVEL);
197
198         File[] allFiles = fileList.toArray(new File [fileList.size()]);
199         for (int i = 0; i < allFiles.length; i++) {
200             File workingFile = allFiles[i];
201
202             try (FileInputStream fileInputStream = new FileInputStream(workingFile)) {
203                 int length = (int) workingFile.length();
204                 byte[] buffer = new byte[length];
205                 fileInputStream.read(buffer, 0, length);
206
207                 String relativeFileName = null;
208                 if (workingFile.getPath().indexOf("JavaHelpSearch") == -1) {
209                     relativeFileName = baseName + SLASH + workingFile.getName();
210                 } else {
211                     relativeFileName = baseName + JAVAHELPSEARCH_DIR + workingFile.getName();
212                 }
213                 ZipEntry zipEntry = new ZipEntry(relativeFileName);
214                 jarFile.putNextEntry(zipEntry);
215
216                 jarFile.write(buffer, 0, length);
217
218             } catch (FileNotFoundException e) {
219                 System.err.println(COULD_NOT_FIND + workingFile + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
220             } catch (java.io.IOException e) {
221                 System.err.println("buildDoc: An error occurs while building the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
222             }
223
224         }
225         try {
226             jarFile.close();
227         } catch (java.io.IOException e) {
228             System.err.println("buildDoc: An error occurs while closing the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
229         }
230         return true;
231     }
232 }