b1925c07468d5c4feea02ef844cb73af79da506d
[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
76             String[] args = new String[] {"-nostopwords", "."};
77
78             indexer.compile(args);
79         } catch (Exception e) {
80             System.err.println("buildDoc: Error building search index: " + e.getLocalizedMessage());
81             return;
82         }
83
84         buildJar(outputDirectory, language);
85     }
86
87     /**
88      * Embed the images files to another jar for non-toolboxes
89      */
90     @Override
91     public void install() {
92         /*
93          * Toolboxes images are not in a separate jar.
94          */
95         if (isToolbox) {
96             return;
97         }
98
99         JarOutputStream jarFile = null;
100         FileOutputStream fileOutputStream = null;
101
102         /* Stored into SCI/modules/helptools/jar */
103         String fileName = SCI + "/modules/helptools/jar" + SLASH + "scilab_images" + JAR_EXT;
104         try {
105             fileOutputStream = new FileOutputStream(fileName);
106             jarFile = new JarOutputStream(fileOutputStream);
107             jarFile.setLevel(JAR_COMPRESSION_LEVEL);
108         } catch (java.io.FileNotFoundException e) {
109             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
110         } catch (java.io.IOException e) {
111             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
112         }
113
114         File[] allFiles = new File(outImages).listFiles();
115         for (int i = 0; i < allFiles.length; i++) {
116             try {
117                 File workingFile = allFiles[i];
118                 FileInputStream fileInputStream = new FileInputStream(workingFile);
119
120                 int length = (int) workingFile.length();
121                 byte[] buffer = new byte[length];
122                 try {
123                     fileInputStream.read(buffer, 0, length);
124                 } catch (java.io.IOException e) {
125                     System.err.println(COULD_NOT_FIND + workingFile + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
126                 }
127                 ZipEntry zipEntry = new ZipEntry(workingFile.getName());
128                 jarFile.putNextEntry(zipEntry);
129                 jarFile.write(buffer, 0, length);
130                 fileInputStream.close();
131             } catch (java.io.IOException e) {
132                 System.err.println("buildDoc: An error occurs while building the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
133             }
134
135         }
136         try {
137             jarFile.close();
138         } catch (java.io.IOException e) {
139             System.err.println("buildDoc: An error occurs while closing the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
140         }
141     }
142
143     /**
144      * Get the list of the files in a directory
145      * @param directory the directory where files have to be searched
146      * @param language String 'fr_FR'
147      * @return the list of the files found
148      */
149     private static ArrayList<File> buildFileList(File directory,  String language) {
150         final String baseNameJar = Helpers.getBaseName(language) + JAR_EXT;
151         ArrayList<File> listFile = new ArrayList<File>();
152
153         File[] files = directory.listFiles(new FilenameFilter() {
154             public boolean accept(File dir, String name) {
155                 return !name.equals(baseNameJar);
156             }
157         });
158         for (int i = 0; i < files.length; i++) {
159             if (files[i].isDirectory()) {
160                 listFile.addAll(buildFileList(files[i], language));
161             } else {
162                 listFile.add(files[i]);
163             }
164         }
165         return listFile;
166     }
167
168     /**
169      * Private method which is trying to build the jar
170      *
171      * @param outputDirectory Where to build the jar file
172      * @param language In which language (for the file name)
173      * @return The result of the operation
174      */
175     static boolean buildJar(String outputDirectory, String language) {
176         String baseName = Helpers.getBaseName(language);
177         JarOutputStream jarFile = null;
178         FileOutputStream fileOutputStream = null;
179
180         /* Stored into SCI/modules/helptools/jar */
181         String fileName = outputDirectory + SLASH + baseName + JAR_EXT;
182         /* bug 4407 */
183         /* we do list of files before to create scilab_xx_XX_help.jar */
184         ArrayList<File> fileList = buildFileList(new File(outputDirectory), language);
185
186         try {
187             fileOutputStream = new FileOutputStream(fileName);
188             jarFile = new JarOutputStream(fileOutputStream);
189         } catch (java.io.FileNotFoundException e) {
190             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
191         } catch (java.io.IOException e) {
192             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
193         }
194
195         jarFile.setLevel(JAR_COMPRESSION_LEVEL);
196
197         File[] allFiles = fileList.toArray(new File [fileList.size()]);
198         for (int i = 0; i < allFiles.length; i++) {
199             try {
200                 File workingFile = allFiles[i];
201                 FileInputStream fileInputStream = new FileInputStream(workingFile);
202
203                 int length = (int) workingFile.length();
204                 byte[] buffer = new byte[length];
205                 try {
206                     fileInputStream.read(buffer, 0, length);
207                 } catch (java.io.IOException e) {
208                     System.err.println(COULD_NOT_FIND + workingFile + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
209                 }
210                 String relativeFileName = null;
211                 if (workingFile.getPath().indexOf("JavaHelpSearch") == -1) {
212                     relativeFileName = baseName + SLASH + workingFile.getName();
213                 } else {
214                     relativeFileName = baseName + JAVAHELPSEARCH_DIR + workingFile.getName();
215                 }
216                 ZipEntry zipEntry = new ZipEntry(relativeFileName);
217                 jarFile.putNextEntry(zipEntry);
218
219                 jarFile.write(buffer, 0, length);
220
221                 fileInputStream.close();
222             } catch (java.io.IOException e) {
223                 System.err.println("buildDoc: An error occurs while building the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
224             }
225
226         }
227         try {
228             jarFile.close();
229         } catch (java.io.IOException e) {
230             System.err.println("buildDoc: An error occurs while closing the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
231         }
232         return true;
233     }
234 }