Set the compression level for the jar help file. Save 150k
[scilab.git] / scilab / modules / helptools / src / java / org / scilab / modules / helptools / BuildJavaHelp.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Sylvestre LEDRU
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-en.txt
10  *
11  */
12 package org.scilab.modules.helptools;
13
14 import com.sun.java.help.search.Indexer; /* jhall (Java Help) */
15
16 import java.io.File;
17 import java.io.FilenameFilter;
18 import java.io.FileOutputStream;
19 import java.io.FileInputStream;
20 import java.util.zip.ZipEntry;
21 import java.util.jar.JarOutputStream;
22
23 import java.util.ArrayList;
24
25 /**
26  * This class manages the build of the Java Help
27  */
28 public final class BuildJavaHelp {
29
30     private static final String JAVAHELPSEARCH_DIR = "/JavaHelpSearch/";
31     private static final String COULD_NOT_FIND = "buildDoc: Could not find/access to ";
32     private static final String LEFT_PAR = " ( ";
33     private static final String RIGHT_PAR = " )";
34     private static final String JAR_EXT = ".jar";
35     private static final String SLASH = "/";
36     private static final int JAR_COMPRESSION_LEVEL = 9;
37     private static Indexer indexer = new Indexer();
38
39     /**
40      * Default constructor (must no be used)
41      */
42     private BuildJavaHelp() {
43         throw new UnsupportedOperationException();
44     }
45
46     /**
47      * Get the list of the files in a directory
48      * @param directory the directory where files have to be searched
49      * @param language String 'fr_FR'
50      * @return the list of the files found
51      */
52     private static ArrayList<File> buildFileList(File directory,  String language) {
53         final String baseNameJar = Helpers.getBaseName(language) + JAR_EXT;
54         ArrayList<File> listFile = new ArrayList<File>();
55
56         File[] files = directory.listFiles(new FilenameFilter() {
57             public boolean accept(File dir, String name) {
58                 return !name.equals(baseNameJar);
59             }
60         });
61         for (int i = 0; i < files.length; i++) {
62             if (files[i].isDirectory()) {
63                 listFile.addAll(buildFileList(files[i], language));
64             } else {
65                 listFile.add(files[i]);
66             }
67         }
68         return listFile;
69     }
70
71     public static boolean buildJarImages(String inputDirectory, String outputDirectory) {
72         JarOutputStream jarFile = null;
73         FileOutputStream fileOutputStream = null;
74
75         /* Stored into SCI/modules/helptools/jar */
76         String fileName = outputDirectory + SLASH + "scilab_images" + JAR_EXT;
77         try {
78             fileOutputStream = new FileOutputStream(fileName);
79             jarFile = new JarOutputStream(fileOutputStream);
80             jarFile.setLevel(JAR_COMPRESSION_LEVEL);
81         } catch (java.io.FileNotFoundException e) {
82             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
83         } catch (java.io.IOException e) {
84             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
85         }
86
87         File[] allFiles = new File(inputDirectory).listFiles();
88         for (int i = 0; i < allFiles.length; i++) {
89             try {
90                 File workingFile = allFiles[i];
91                 FileInputStream fileInputStream = new FileInputStream(workingFile);
92
93                 int length = (int) workingFile.length();
94                 byte[] buffer = new byte[length];
95                 try {
96                     fileInputStream.read(buffer, 0, length);
97                 } catch (java.io.IOException e) {
98                     System.err.println(COULD_NOT_FIND + workingFile + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
99                 }
100                 ZipEntry zipEntry = new ZipEntry(workingFile.getName());
101                 jarFile.putNextEntry(zipEntry);
102                 jarFile.write(buffer, 0, length);
103                 fileInputStream.close();
104             } catch (java.io.IOException e) {
105                 System.err.println("buildDoc: An error occurs while building the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
106             }
107
108         }
109         try {
110             jarFile.close();
111         } catch (java.io.IOException e) {
112             System.err.println("buildDoc: An error occurs while closing the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
113         }
114
115         return true;
116     }
117
118     /**
119      * Private method which is trying to build the jar
120      *
121      * @param outputDirectory Where to build the jar file
122      * @param language In which language (for the file name)
123      * @return The result of the operation
124      */
125     private static boolean buildJar(String outputDirectory, String language) {
126         String baseName = Helpers.getBaseName(language);
127         JarOutputStream jarFile = null;
128         FileOutputStream fileOutputStream = null;
129
130         /* Stored into SCI/modules/helptools/jar */
131         String fileName = outputDirectory + SLASH + baseName + JAR_EXT;
132         /* bug 4407 */
133         /* we do list of files before to create scilab_xx_XX_help.jar */
134         ArrayList<File> fileList = BuildJavaHelp.buildFileList(new File(outputDirectory), language);
135
136         try {
137             fileOutputStream = new FileOutputStream(fileName);
138             jarFile = new JarOutputStream(fileOutputStream);
139         } catch (java.io.FileNotFoundException e) {
140             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
141         } catch (java.io.IOException e) {
142             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
143         }
144
145         jarFile.setLevel(JAR_COMPRESSION_LEVEL);
146
147         File[] allFiles = fileList.toArray(new File [fileList.size()]);
148         for (int i = 0; i < allFiles.length; i++) {
149             try {
150                 File workingFile = allFiles[i];
151                 FileInputStream fileInputStream = new FileInputStream(workingFile);
152
153                 int length = (int) workingFile.length();
154                 byte[] buffer = new byte[length];
155                 try {
156                     fileInputStream.read(buffer, 0, length);
157                 } catch (java.io.IOException e) {
158                     System.err.println(COULD_NOT_FIND + workingFile + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
159                 }
160                 String relativeFileName = null;
161                 if (workingFile.getPath().indexOf("JavaHelpSearch") == -1) {
162                     relativeFileName = baseName + SLASH + workingFile.getName();
163                 } else {
164                     relativeFileName = baseName + JAVAHELPSEARCH_DIR + workingFile.getName();
165                 }
166                 ZipEntry zipEntry = new ZipEntry(relativeFileName);
167                 jarFile.putNextEntry(zipEntry);
168
169                 jarFile.write(buffer, 0, length);
170
171                 fileInputStream.close();
172             } catch (java.io.IOException e) {
173                 System.err.println("buildDoc: An error occurs while building the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
174             }
175
176         }
177         try {
178             jarFile.close();
179         } catch (java.io.IOException e) {
180             System.err.println("buildDoc: An error occurs while closing the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
181         }
182         return true;
183     }
184
185     /**
186      * After the saxon process, create the Jar
187      *
188      * @param outputDirectory Where the files are available and
189      * @param language In which language (for the file name)
190      * @return The result of the process
191      */
192     public static String buildJavaHelp(String outputDirectory, String language) {
193
194         String outputJavaHelp = new String(outputDirectory + JAVAHELPSEARCH_DIR);
195
196         try {
197             /* Purge the directory before launching the index */
198             /* because the JavaHelp Indexer failed when launched twice on the same directory */
199             Helpers.deleteDirectory(outputJavaHelp);
200             File directory = new File(outputJavaHelp);
201             directory.mkdirs();
202
203             String[] args = new String[] {"-nostopwords", "."};
204
205             indexer.compile(args);
206         } catch (Exception e) {
207             System.err.println("buildDoc: Error building search index: " + e.getLocalizedMessage());
208             return null;
209         }
210
211         BuildJavaHelp.buildJar(outputDirectory, language);
212
213         return outputDirectory;
214     }
215
216 }