* Bug #11567 fixed - Scilab failed to start an accentuated character was present...
[scilab.git] / scilab / modules / jvm / src / java / org / scilab / modules / jvm / LoadClassPath.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - DIGITEO - Clement DAVID
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.jvm;
14
15 import java.io.FileNotFoundException;
16 import java.io.IOException;
17 import java.io.File;
18 import java.util.HashSet;
19 import java.util.Set;
20
21 import javax.xml.parsers.DocumentBuilder;
22 import javax.xml.parsers.DocumentBuilderFactory;
23 import javax.xml.parsers.ParserConfigurationException;
24 import javax.xml.xpath.XPath;
25 import javax.xml.xpath.XPathConstants;
26 import javax.xml.xpath.XPathExpressionException;
27 import javax.xml.xpath.XPathFactory;
28
29 import org.w3c.dom.Document;
30 import org.w3c.dom.Node;
31 import org.w3c.dom.NodeList;
32 import org.xml.sax.SAXException;
33
34 import org.scilab.modules.commons.xml.ScilabDocumentBuilderFactory;
35
36 /**
37  * Utility class to ease the jar loading management.
38  */
39 public final class LoadClassPath {
40     /** Scilab environment variable */
41     private static final String SCI = System.getenv("SCI");
42     /** The classpath.xml file path */
43     private static final String CLASSPATH_PATH = SCI + "/etc/classpath.xml";
44     /** The expression to get the jars */
45     private static final String XPATH_EXPRS = "//classpaths/path[@load='onUse']/load";
46
47     /** Cache the already loaded libraries */
48     private static Set<String> loadedModules = new HashSet<String>();
49
50     /**
51      * Load the module on the classpath
52      *
53      * The module have to be declared in the $SCI/etc/classpath.xml file.
54      *
55      * @param module the module to be loaded
56      */
57     public static void loadOnUse(String module) {
58         if (loadedModules.contains(module)) {
59             return;
60         }
61
62         // define XPath expression
63         String xpathExpression = XPATH_EXPRS + "[@on='" + module + "']";
64
65         // Initialize xpath
66         XPathFactory factory = XPathFactory.newInstance();
67         XPath xpath = factory.newXPath();
68
69         // initialize document factory
70         DocumentBuilderFactory domFactory = ScilabDocumentBuilderFactory.newInstance();
71         domFactory.setValidating(false);
72         domFactory.setNamespaceAware(true);
73
74         // Parse Classpath file
75         Document doc = null;
76         try {
77             DocumentBuilder builder = domFactory.newDocumentBuilder();
78             doc = builder.parse(new File(CLASSPATH_PATH));
79         } catch (ParserConfigurationException e) {
80             System.err.println("Error: " + e.getLocalizedMessage());
81             e.printStackTrace();
82             return;
83         } catch (SAXException e) {
84             System.err.println("Error: " + e.getLocalizedMessage());
85             e.printStackTrace();
86             return;
87         } catch (IOException e) {
88             System.err.println("Error: " + e.getLocalizedMessage());
89             e.printStackTrace();
90             return;
91         }
92
93         // Load JARs
94         try {
95             NodeList result = (NodeList) xpath.evaluate(xpathExpression, doc,
96                               XPathConstants.NODESET);
97
98             for (int i = 0; i < result.getLength(); i++) {
99                 Node n = result.item(i).getParentNode();
100
101                 String jar = n.getAttributes().getNamedItem("value").getNodeValue();
102                 ClassPath.addFile(jar.replace("$SCILAB", SCI), 0);
103                 loadedModules.add(module);
104             }
105
106         } catch (XPathExpressionException e) {
107             e.printStackTrace();
108         } catch (FileNotFoundException e) {
109             e.printStackTrace();
110         } catch (IOException e) {
111             e.printStackTrace();
112         }
113     }
114
115     /**
116      * This class is a static singleton
117      */
118     private LoadClassPath() { }
119 }