Doc gen: fix database path for indexer
[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  *  This file must be used under the terms of the CeCILL.
7  *  This source file is licensed as described in the file COPYING, which
8  *  you should have received as part of this distribution.  The terms
9  *  are also available at
10  *  http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13 package org.scilab.modules.helptools;
14
15 import java.io.File;
16 import java.io.FileInputStream;
17 import java.io.FileOutputStream;
18 import java.io.FilenameFilter;
19 import java.util.ArrayList;
20 import java.util.jar.JarOutputStream;
21 import java.util.zip.ZipEntry;
22
23 import org.scilab.modules.commons.ScilabConstants;
24
25 import com.sun.java.help.search.Indexer;
26
27 public class JarOnlyConverter extends ContainerConverter {
28
29     private static final String SCI = ScilabConstants.SCI.getPath();
30
31     private static final String JAVAHELPSEARCH_DIR = "/JavaHelpSearch/";
32     private static final String COULD_NOT_FIND = "buildDoc: Could not find/access to ";
33     private static final String LEFT_PAR = " ( ";
34     private static final String RIGHT_PAR = " )";
35     private static final String JAR_EXT = ".jar";
36     private static final String SLASH = "/";
37     private static final int JAR_COMPRESSION_LEVEL = 9;
38     private static Indexer indexer = new Indexer();
39
40     private final boolean isToolbox;
41     private final String outImages;
42
43     public JarOnlyConverter(SciDocMain sciDocMain) {
44         super(sciDocMain.getOutputDirectory(), sciDocMain.getLanguage());
45
46         isToolbox = sciDocMain.isToolbox();
47
48         /*
49          * Reuse the shared generated images directory from scilab
50          */
51         String images = sciDocMain.getOutputDirectory() + File.separator;
52         if (!isToolbox) {
53             images = ScilabConstants.SCI.getPath() + "/modules/helptools/images";
54             File dir = new File(images);
55             if (!dir.exists()) {
56                 dir.mkdir();
57             }
58         }
59         outImages = images;
60     }
61
62     /**
63      * Embed the javahelp html files to a jar
64      */
65     @Override
66     public void convert() {
67         String outputJavaHelp = new String(outputDirectory + JAVAHELPSEARCH_DIR);
68
69         try {
70             /* Purge the directory before launching the index */
71             /* because the JavaHelp Indexer failed when launched twice on the same directory */
72             Helpers.deleteDirectory(outputJavaHelp);
73             File directory = new File(outputJavaHelp);
74             directory.mkdirs();
75             String jhs = new File(outputJavaHelp).getAbsolutePath();
76
77             String[] args = new String[] {"-db", jhs, "-nostopwords", "."};
78
79             indexer.compile(args);
80         } catch (Exception e) {
81             System.err.println("buildDoc: Error building search index: " + e.getLocalizedMessage());
82             return;
83         }
84
85         buildJar(outputDirectory, language);
86     }
87
88     /**
89      * Embed the images files to another jar for non-toolboxes
90      */
91     @Override
92     public void install() {
93         /*
94          * Toolboxes images are not in a separate jar.
95          */
96         if (isToolbox) {
97             return;
98         }
99
100         JarOutputStream jarFile = null;
101         FileOutputStream fileOutputStream = null;
102
103         /* Stored into SCI/modules/helptools/jar */
104         String fileName = SCI + "/modules/helptools/jar" + SLASH + "scilab_images" + JAR_EXT;
105         try {
106             fileOutputStream = new FileOutputStream(fileName);
107             jarFile = new JarOutputStream(fileOutputStream);
108             jarFile.setLevel(JAR_COMPRESSION_LEVEL);
109         } catch (java.io.FileNotFoundException e) {
110             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
111         } catch (java.io.IOException e) {
112             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
113         }
114
115         File[] allFiles = new File(outImages).listFiles();
116         for (int i = 0; i < allFiles.length; i++) {
117             try {
118                 File workingFile = allFiles[i];
119                 FileInputStream fileInputStream = new FileInputStream(workingFile);
120
121                 int length = (int) workingFile.length();
122                 byte[] buffer = new byte[length];
123                 try {
124                     fileInputStream.read(buffer, 0, length);
125                 } catch (java.io.IOException e) {
126                     System.err.println(COULD_NOT_FIND + workingFile + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
127                 }
128                 ZipEntry zipEntry = new ZipEntry(workingFile.getName());
129                 jarFile.putNextEntry(zipEntry);
130                 jarFile.write(buffer, 0, length);
131                 fileInputStream.close();
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             try {
201                 File workingFile = allFiles[i];
202                 FileInputStream fileInputStream = new FileInputStream(workingFile);
203
204                 int length = (int) workingFile.length();
205                 byte[] buffer = new byte[length];
206                 try {
207                     fileInputStream.read(buffer, 0, length);
208                 } catch (java.io.IOException e) {
209                     System.err.println(COULD_NOT_FIND + workingFile + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
210                 }
211                 String relativeFileName = null;
212                 if (workingFile.getPath().indexOf("JavaHelpSearch") == -1) {
213                     relativeFileName = baseName + SLASH + workingFile.getName();
214                 } else {
215                     relativeFileName = baseName + JAVAHELPSEARCH_DIR + workingFile.getName();
216                 }
217                 ZipEntry zipEntry = new ZipEntry(relativeFileName);
218                 jarFile.putNextEntry(zipEntry);
219
220                 jarFile.write(buffer, 0, length);
221
222                 fileInputStream.close();
223             } catch (java.io.IOException e) {
224                 System.err.println("buildDoc: An error occurs while building the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
225             }
226
227         }
228         try {
229             jarFile.close();
230         } catch (java.io.IOException e) {
231             System.err.println("buildDoc: An error occurs while closing the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
232         }
233         return true;
234     }
235 }