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