Bug 13047 fixed: jcompile did not allow class reloading 72/13072/2
Calixte DENIZET [Mon, 4 Nov 2013 12:52:21 +0000 (13:52 +0100)]
Change-Id: Ia2600e6e7a79d1cb278138928c6356dcecc35512

scilab/CHANGES_5.5.X
scilab/modules/external_objects_java/src/java/org/scilab/modules/external_objects_java/ScilabClassLoader.java
scilab/modules/external_objects_java/src/java/org/scilab/modules/external_objects_java/ScilabJavaCompiler.java
scilab/modules/external_objects_java/tests/nonreg_tests/bug_13047.dia.ref [new file with mode: 0644]
scilab/modules/external_objects_java/tests/nonreg_tests/bug_13047.tst [new file with mode: 0644]

index fb79f64..d6e9f0e 100644 (file)
@@ -103,7 +103,9 @@ Scilab Bug Fixes
 
 * Bug #13032 fixed - Fixed CMATVIEW help example and created one for CMAT3D.
 
-* Bug #13036 fixed - Bad help page associated to history browser.
+* Bug #13036 fixed - Help page associated to history browser was wrong.
+
+* Bug #13047 fixed - jcompile did not allow class reloading.
 
 
 Xcos Bug Fixes
index e8d25a6..ec3618d 100644 (file)
@@ -12,6 +12,7 @@
 
 package org.scilab.modules.external_objects_java;
 
+import java.io.File;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.security.CodeSource;
@@ -79,7 +80,8 @@ public class ScilabClassLoader {
                     retId = clone.id;
                 }
             } else {
-                ScilabJavaClass sjc = new ScilabJavaClass(ClassLoader.getSystemClassLoader().loadClass(name));
+                Class cl = ClassLoader.getSystemClassLoader().loadClass(name);
+                ScilabJavaClass sjc = new ScilabJavaClass(cl);
                 sjc.setURL(getLocation(sjc.clazz));
                 clazz.put(name, sjc.id);
                 zzalc.put(sjc.id, name);
@@ -96,6 +98,29 @@ public class ScilabClassLoader {
         return retId;
     }
 
+    public static int loadJavaClass(String binPath, String name) throws ScilabJavaException {
+        if (ScilabJavaObject.debug) {
+            ScilabJavaObject.logger.log(Level.INFO, "Load Java class \'" + name + "\' in " + binPath);
+        }
+
+        try {
+            URL binURL = new File(binPath).toURI().toURL();
+            Class cl = new URLClassLoader(new URL[] {binURL}, null).loadClass(name);
+            ScilabJavaClass sjc = new ScilabJavaClass(cl);
+            sjc.setURL(getLocation(sjc.clazz));
+            clazz.put(name, sjc.id);
+            zzalc.put(sjc.id, name);
+
+            if (ScilabJavaObject.debug) {
+                ScilabJavaObject.logger.log(Level.INFO, "The loaded Java class has id=" + sjc.id + " and URL=" + sjc.getURL());
+            }
+
+            return sjc.id;
+        } catch (Exception e) {
+            throw new ScilabJavaException("Cannot find the class " + name + " in " + binPath + ".");
+        }
+    }
+
     /**
      * Remove an id from the map
      * @param id the id to remove
index a42d871..bdf4016 100644 (file)
@@ -185,7 +185,7 @@ public class ScilabJavaCompiler {
                 return -1;
             } else {
                 if (manager.className != null && !manager.className.isEmpty()) {
-                    return ScilabClassLoader.loadJavaClass(manager.className, true);
+                    return ScilabClassLoader.loadJavaClass(BINPATH, manager.className);
                 } else {
                     return -1;
                 }
diff --git a/scilab/modules/external_objects_java/tests/nonreg_tests/bug_13047.dia.ref b/scilab/modules/external_objects_java/tests/nonreg_tests/bug_13047.dia.ref
new file mode 100644 (file)
index 0000000..c3e221d
--- /dev/null
@@ -0,0 +1,36 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// ===========================================================================
+//
+// <-- Non-regression test for bug 13047 -->
+//
+// <-- JVM MANDATORY -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13047
+//
+// <-- Short Description -->
+// jcompile did not allow class reloading 
+//
+function r = myconvert(Text, method)
+        // Compiling the meta-methode
+        arrayConv = jcompile("arrayConv", ..
+        ["public class arrayConv {"
+         "public static String[] convInArray(String arr[]) {"
+         "    int nbelem = arr.length; "
+         "    String[] out = new String[nbelem];"
+         "    for (int i = 0; i < nbelem; i++)  "
+         "        out[i] = arr[i]."+method+"(); "
+         "    return out; "
+         "    } "
+         "} "
+         ])
+         r = matrix(arrayConv.convInArray(Text(:)'), size(Text))
+         // jremove arrayConv convInArray
+endfunction
+strs = ["Scilab" "GDL" "Yorick" "Octave" "Scipy"];
+assert_checkequal(convstr(strs, "u"), myconvert(strs,"toUpperCase"));
+assert_checkequal(convstr(strs, "l"), myconvert(strs,"toLowerCase"));
diff --git a/scilab/modules/external_objects_java/tests/nonreg_tests/bug_13047.tst b/scilab/modules/external_objects_java/tests/nonreg_tests/bug_13047.tst
new file mode 100644 (file)
index 0000000..e944f3a
--- /dev/null
@@ -0,0 +1,39 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// ===========================================================================
+//
+// <-- Non-regression test for bug 13047 -->
+//
+// <-- JVM MANDATORY -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13047
+//
+// <-- Short Description -->
+// jcompile did not allow class reloading
+//
+
+function r = myconvert(Text, method)
+    // Compiling the meta-methode
+    arrayConv = jcompile("arrayConv", ..
+    ["public class arrayConv {"
+    "public static String[] convInArray(String arr[]) {"
+    "    int nbelem = arr.length; "
+    "    String[] out = new String[nbelem];"
+    "    for (int i = 0; i < nbelem; i++)  "
+    "        out[i] = arr[i]."+method+"(); "
+    "    return out; "
+    "    } "
+    "} "
+    ])
+    r = matrix(arrayConv.convInArray(Text(:)'), size(Text))
+    // jremove arrayConv convInArray
+endfunction
+
+strs = ["Scilab" "GDL" "Yorick" "Octave" "Scipy"];
+
+assert_checkequal(convstr(strs, "u"), myconvert(strs,"toUpperCase"));
+assert_checkequal(convstr(strs, "l"), myconvert(strs,"toLowerCase"));
\ No newline at end of file