Prefs: add a way to backup preferences file
[scilab.git] / scilab / modules / commons / src / java / org / scilab / modules / commons / ScilabCommonsUtils.java
1 /*
2  * Scilab (http://www.scilab.org/) - This file is part of Scilab
3  * Copyright (C) 2011 - Calixte DENIZET
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
13 package org.scilab.modules.commons;
14
15 import java.io.File;
16 import java.io.FileInputStream;
17 import java.io.FileOutputStream;
18 import java.io.IOException;
19 import java.lang.reflect.Method;
20 import java.math.BigInteger;
21 import java.security.MessageDigest;
22 import java.security.NoSuchAlgorithmException;
23
24 /**
25  * Basic utils
26  * @author Calixte DENIZET
27  */
28 public final class ScilabCommonsUtils {
29
30     private static final int BUFFERSIZE = 8192;
31     private static Thread scilabThread;
32
33     private static MessageDigest MD5;
34     static {
35         try {
36             MD5 = MessageDigest.getInstance("MD5");
37         } catch (NoSuchAlgorithmException e) {
38             System.err.println(e);
39             MD5 = null;
40         }
41     }
42
43     /**
44      * Get a MD5 string of the input string
45      * @param str the string to convert
46      * @return the MD5 representation of str
47      */
48     public static String getMD5(String str) {
49         if (MD5 == null) {
50             return null;
51         }
52
53         byte[] bytes = MD5.digest(str.getBytes());
54         return new BigInteger(1, bytes).toString(16);
55     }
56
57     /**
58      * Copy a file
59      * @param inFile src file
60      * @param outFile dest file
61      * @return true if the operation succeeded
62      */
63     public static boolean copyFile(File inFile, File outFile) {
64         FileInputStream in = null;
65         FileOutputStream out = null;
66         boolean success = false;
67
68         try {
69             in = new FileInputStream(inFile);
70             out = new FileOutputStream(outFile);
71             byte[] buffer = new byte[BUFFERSIZE];
72             int n;
73
74             while ((n = in.read(buffer)) != -1) {
75                 out.write(buffer, 0, n);
76             }
77             out.flush();
78             success = true;
79         } catch (IOException e) {
80             System.err.println("Error in copying file " + inFile.getAbsolutePath() + " to " + outFile.getAbsolutePath());
81             System.err.println(e);
82         } finally {
83             if (in != null) {
84                 try {
85                     in.close();
86                 } catch (IOException e) {
87                     System.err.println(e);
88                 }
89             }
90             if (out != null) {
91                 try {
92                     out.close();
93                 } catch (IOException e) {
94                     System.err.println(e);
95                 }
96             }
97         }
98
99         return success;
100     }
101
102     /**
103      * Replace ~ by user home, SCI by Scilab main directory, ...
104      * @param baseDir the base directory
105      * @return correct base directory
106      */
107     public static String getCorrectedPath(String path) {
108         path = path.trim();
109         if (path != null && !path.isEmpty()) {
110             if (path.startsWith("~" + File.separator) || path.equals("~")) {
111                 return path.replaceFirst("~", ScilabConstants.USERHOME);
112             } else if (path.startsWith("SCI" + File.separator) || path.equals("SCI")) {
113                 try {
114                     return path.replaceFirst("SCI", ScilabConstants.SCI.getCanonicalPath());
115                 } catch (IOException e) {
116                     return path.replaceFirst("SCI", ScilabConstants.SCI.getAbsolutePath());
117                 }
118             } else if (path.startsWith("SCIHOME" + File.separator) || path.equals("SCIHOME")) {
119                 return path.replaceFirst("SCIHOME", ScilabCommons.getSCIHOME());
120             } else if (path.startsWith("TMPDIR" + File.separator) || path.equals("TMPDIR")) {
121                 return path.replaceFirst("TMPDIR", ScilabCommons.getTMPDIR());
122             }
123         }
124
125         return path;
126     }
127
128     /**
129      * Load on use
130      * @param str the action
131      */
132     public static void loadOnUse(String str) {
133         try {
134             Class jvmLoadClassPathClass = Class.forName("org.scilab.modules.jvm.LoadClassPath");
135             Method loadOnUseMethod = jvmLoadClassPathClass.getDeclaredMethod("loadOnUse", new Class[] { String.class });
136             loadOnUseMethod.invoke(null, str);
137         } catch (java.lang.ClassNotFoundException ex) {
138             System.err.println("Could not find the Scilab class to load the export dependencies: " + ex);
139         } catch (java.lang.NoSuchMethodException ex) {
140             System.err.println("Could not find the Scilab method to load the export dependencies: " + ex);
141         } catch (java.lang.IllegalAccessException ex) {
142             System.err.println("Could not access to the Scilab method to load the export dependencies: " + ex);
143         } catch (java.lang.reflect.InvocationTargetException ex) {
144             System.err.println("Could not invoke the Scilab method to load the export dependencies: " + ex);
145         }
146     }
147
148     /**
149      * Set the scilab thread as the current thread
150      * Called from org.scilab.modules.core.Scilab::executeInitialHooks called itself
151      * in GetCommandLine.c just after the first display of the prompt.
152      */
153     public static void registerScilabThread() {
154         scilabThread = Thread.currentThread();
155     }
156
157     /**
158      * @return true if Thread.currentThread() is the main Scilab thread
159      */
160     public static boolean isScilabThread() {
161         return scilabThread != null && scilabThread == Thread.currentThread();
162     }
163 }