GPL + CeCILL Header change
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / utils / FileUtils.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - DIGITEO - Clement DAVID
4  * Copyright (C) 2011-2014 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  * === LICENSE_END ===
15  *
16  */
17
18 package org.scilab.modules.xcos.utils;
19
20 import java.io.File;
21 import java.io.FileInputStream;
22 import java.io.FileOutputStream;
23 import java.io.IOException;
24 import java.nio.channels.FileChannel;
25 import java.util.logging.Logger;
26
27 import org.scilab.modules.commons.ScilabConstants;
28 import org.w3c.dom.Document;
29
30 import com.mxgraph.io.mxCodec;
31 import com.mxgraph.util.mxUtils;
32 import com.mxgraph.util.mxXmlUtils;
33 import com.mxgraph.view.mxStylesheet;
34
35 /**
36  * Contains useful method for managing files.
37  */
38 public final class FileUtils {
39     /**
40      * Name of the xcos style configuration file.
41      */
42     public static final String STYLE_FILENAME = "Xcos-style.xml";
43
44     /**
45      * Default constructor
46      */
47     private FileUtils() {
48     }
49
50     /**
51      * Copy in to out
52      *
53      * @param in
54      *            the input file
55      * @param out
56      *            the output file
57      * @throws IOException
58      *             when an errors has occurred
59      */
60     public static void copy(File in, File out) throws IOException {
61         FileInputStream fis = new FileInputStream(in);
62         FileOutputStream fos = new FileOutputStream(out);
63         FileChannel inChannel = fis.getChannel();
64         FileChannel outChannel = fos.getChannel();
65
66         try {
67             inChannel.transferTo(0, inChannel.size(), outChannel);
68         } catch (IOException e) {
69             Logger.getLogger(FileUtils.class.getName()).warning(e.toString());
70             throw e;
71         } finally {
72             inChannel.close();
73             fis.close();
74
75             outChannel.close();
76             fos.close();
77         }
78     }
79
80     /**
81      * Force the copy from in to out
82      *
83      * @param in
84      *            the input file
85      * @param out
86      *            the output file
87      */
88     public static void forceCopy(File in, File out) {
89         FileChannel inChannel = null;
90         FileChannel outChannel = null;
91
92         if (!out.exists()) {
93             try {
94                 out.createNewFile();
95             } catch (IOException e) {
96                 Logger.getLogger(FileUtils.class.getName()).warning(e.toString());
97             }
98         }
99
100
101         try {
102             FileInputStream fis = new FileInputStream(in);
103             FileOutputStream fos = new FileOutputStream(out);
104             inChannel = fis.getChannel();
105             outChannel = fos.getChannel();
106             inChannel.transferTo(0, inChannel.size(), outChannel);
107             fis.close();
108             fos.close();
109         } catch (IOException e) {
110             Logger.getLogger(FileUtils.class.getName()).warning(e.toString());
111         } finally {
112             if (inChannel != null) {
113                 try {
114                     inChannel.close();
115                 } catch (IOException e) {
116                     Logger.getLogger(FileUtils.class.getName()).warning(e.toString());
117                 }
118             }
119             if (outChannel != null) {
120                 try {
121                     outChannel.close();
122                 } catch (IOException e) {
123                     Logger.getLogger(FileUtils.class.getName()).warning(e.toString());
124                 }
125             }
126         }
127     }
128
129     /**
130      * Delete the file and log an error message if unable to do so.
131      *
132      * @param f
133      *            the file to delete.
134      */
135     public static void delete(File f) {
136         if (!f.delete()) {
137             Logger.getLogger(FileUtils.class.getName()).severe(XcosMessages.UNABLE_TO_DELETE + f);
138         }
139     }
140
141     /**
142      * Delete the file and log an error message if unable to do so.
143      *
144      * @param f
145      *            the file to delete.
146      */
147     public static void delete(String f) {
148         if (!new File(f).delete()) {
149             Logger.getLogger(FileUtils.class.getName()).severe(XcosMessages.UNABLE_TO_DELETE + f);
150         }
151     }
152
153     /**
154      * Test if the file exists.
155      *
156      * @param f
157      *            the file check.
158      * @return true if the file exists, false otherwise.
159      */
160     public static boolean exists(String f) {
161         return new File(f).exists();
162     }
163
164     /**
165      * Decode the style into the passed stylesheet.
166      *
167      * @param styleSheet
168      *            the current stylesheet
169      * @throws IOException
170      *             on I/O errors
171      */
172     public static void decodeStyle(final mxStylesheet styleSheet) throws IOException {
173         /*
174          * Initialize constants
175          */
176         final String sciPath = ScilabConstants.SCI.getAbsolutePath();
177         File baseStyleSheet = new File(sciPath + "/modules/xcos/etc/" + STYLE_FILENAME);
178
179         final String homePath = ScilabConstants.SCIHOME.getAbsolutePath();
180         final File userStyleSheet = new File(homePath + '/' + STYLE_FILENAME);
181
182         final String sciURL = ScilabConstants.SCI.toURI().toURL().toString();
183         final String homeURL = ScilabConstants.SCIHOME.toURI().toURL().toString();
184
185         String xml;
186         Document document;
187
188         /*
189          * Decode the base stylesheet
190          */
191         xml = mxUtils.readFile(baseStyleSheet.getAbsolutePath());
192         xml = xml.replaceAll("\\$SCILAB", sciURL);
193         xml = xml.replaceAll("\\$SCIHOME", homeURL);
194         document = mxXmlUtils.parseXml(xml);
195         new mxCodec().decode(document.getDocumentElement(), styleSheet);
196
197         /*
198          * Decode the user stylesheet if it exists
199          */
200         if (userStyleSheet.exists()) {
201             xml = mxUtils.readFile(userStyleSheet.getAbsolutePath());
202             xml = xml.replaceAll("\\$SCILAB", sciURL);
203             xml = xml.replaceAll("\\$SCIHOME", homeURL);
204             document = mxXmlUtils.parseXml(xml);
205             new mxCodec().decode(document.getDocumentElement(), styleSheet);
206         }
207     }
208
209     /**
210      * Export an HTML label String to a valid C identifier String.
211      *
212      * @param label
213      *            the HTML label
214      * @return a valid C identifier String
215      */
216     public static String toValidCIdentifier(final String label) {
217         final String text = mxUtils.getBodyMarkup(label, true);
218         final StringBuilder cFunctionName = new StringBuilder();
219
220         for (int i = 0; i < text.length(); i++) {
221             final char ch = text.charAt(i);
222
223             // Adding upper case chars
224             if (ch >= 'A' && ch <= 'Z') {
225                 cFunctionName.append(ch);
226             } else
227
228                 // Adding lower case chars
229                 if (ch >= 'a' && ch <= 'z') {
230                     cFunctionName.append(ch);
231                 } else
232
233                     // Adding number chars
234                     if (ch >= '0' && ch <= '9') {
235                         // do not append any first number
236                         if (cFunctionName.length() > 0) {
237                             cFunctionName.append(ch);
238                         }
239                     } else
240
241                         // Specific chars
242                         if (ch == '_' || ch == ' ') {
243                             cFunctionName.append('_');
244                         }
245         }
246         return cFunctionName.toString();
247     }
248 }