You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by gn...@apache.org on 2018/05/17 15:54:23 UTC

svn commit: r1831792 - in /felix/trunk/gogo: jline/src/main/java/org/apache/felix/gogo/jline/ runtime/src/main/java/org/apache/felix/gogo/runtime/ runtime/src/main/java/org/apache/felix/service/command/ runtime/src/test/java/org/apache/felix/gogo/runti...

Author: gnodet
Date: Thu May 17 15:54:23 2018
New Revision: 1831792

URL: http://svn.apache.org/viewvc?rev=1831792&view=rev
Log:
[FELIX-5857] Provide a context classloader on the session to help with class loading

Added:
    felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestEvaluate.java
      - copied, changed from r1831785, felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Evaluate.java
Modified:
    felix/trunk/gogo/jline/src/main/java/org/apache/felix/gogo/jline/Builtin.java
    felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Closure.java
    felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandSessionImpl.java
    felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Evaluate.java
    felix/trunk/gogo/runtime/src/main/java/org/apache/felix/service/command/CommandSession.java
    felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ExpanderTest.java
    felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestTokenizer.java
    felix/trunk/gogo/shell/src/main/java/org/apache/felix/gogo/shell/Builtin.java

Modified: felix/trunk/gogo/jline/src/main/java/org/apache/felix/gogo/jline/Builtin.java
URL: http://svn.apache.org/viewvc/felix/trunk/gogo/jline/src/main/java/org/apache/felix/gogo/jline/Builtin.java?rev=1831792&r1=1831791&r2=1831792&view=diff
==============================================================================
--- felix/trunk/gogo/jline/src/main/java/org/apache/felix/gogo/jline/Builtin.java (original)
+++ felix/trunk/gogo/jline/src/main/java/org/apache/felix/gogo/jline/Builtin.java Thu May 17 15:54:23 2018
@@ -49,6 +49,7 @@ import java.util.TreeSet;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.felix.gogo.runtime.Reflective;
 import org.apache.felix.service.command.Job;
 import org.apache.felix.service.command.Process;
 import org.apache.felix.gogo.runtime.CommandSessionImpl;
@@ -121,7 +122,7 @@ public class Builtin {
         if (name instanceof Class<?>) {
             clazz = (Class<?>) name;
         } else {
-            clazz = loadClass(name.toString());
+            clazz = loadClass(session, name.toString());
         }
 
         for (Constructor<?> c : clazz.getConstructors()) {
@@ -161,17 +162,17 @@ public class Builtin {
                 + " to any of " + Arrays.asList(clazz.getConstructors()));
     }
 
-    private Class<?> loadClass(String name) throws ClassNotFoundException {
+    private Class<?> loadClass(CommandSession session, String name) throws ClassNotFoundException {
         if (!name.contains(".")) {
             for (String p : packages) {
                 String pkg = p + "." + name;
                 try {
-                    return Class.forName(pkg);
+                    return Class.forName(pkg, true, session.classLoader());
                 } catch (ClassNotFoundException e) {
                 }
             }
         }
-        return Class.forName(name);
+        return Class.forName(name, true, session.classLoader());
     }
 
     public void set(CommandSession session, String[] argv) {

Modified: felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Closure.java
URL: http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Closure.java?rev=1831792&r1=1831791&r2=1831792&view=diff
==============================================================================
--- felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Closure.java (original)
+++ felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Closure.java Thu May 17 15:54:23 2018
@@ -751,6 +751,11 @@ public class Closure implements Function
         return isSet(CommandSession.OPTION_NO_GLOB, false) ? null : session().currentDir();
     }
 
+    @Override
+    public ClassLoader classLoader() {
+        return session.classLoader();
+    }
+
     protected boolean isSet(String name, boolean def) {
         Object v = session.get(name);
         if (v instanceof Boolean) {

Modified: felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandSessionImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandSessionImpl.java?rev=1831792&r1=1831791&r2=1831792&view=diff
==============================================================================
--- felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandSessionImpl.java (original)
+++ felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandSessionImpl.java Thu May 17 15:54:23 2018
@@ -86,6 +86,7 @@ public class CommandSessionImpl implemen
     private final ExecutorService executor;
 
     private Path currentDir;
+    private ClassLoader classLoader;
 
     protected CommandSessionImpl(CommandProcessorImpl shell, CommandSessionImpl parent)
     {
@@ -141,6 +142,16 @@ public class CommandSessionImpl implemen
         currentDir = path;
     }
 
+    public ClassLoader classLoader()
+    {
+        return classLoader != null ? classLoader : getClass().getClassLoader();
+    }
+
+    public void classLoader(ClassLoader classLoader)
+    {
+        this.classLoader = classLoader;
+    }
+
     public void close()
     {
         if (!this.closed)
@@ -468,6 +479,17 @@ public class CommandSessionImpl implemen
 
     public Object doConvert(Class<?> desiredType, Object in)
     {
+        if (desiredType == Class.class)
+        {
+            try
+            {
+                return Class.forName(in.toString(), true, classLoader());
+            }
+            catch (ClassNotFoundException e)
+            {
+                return null;
+            }
+        }
         return processor.doConvert(desiredType, in);
     }
 

Modified: felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Evaluate.java
URL: http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Evaluate.java?rev=1831792&r1=1831791&r2=1831792&view=diff
==============================================================================
--- felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Evaluate.java (original)
+++ felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Evaluate.java Thu May 17 15:54:23 2018
@@ -31,4 +31,6 @@ public interface Evaluate
     Object expr(Token t);
 
     Path currentDir();
+
+    ClassLoader classLoader();
 }

Modified: felix/trunk/gogo/runtime/src/main/java/org/apache/felix/service/command/CommandSession.java
URL: http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/main/java/org/apache/felix/service/command/CommandSession.java?rev=1831792&r1=1831791&r2=1831792&view=diff
==============================================================================
--- felix/trunk/gogo/runtime/src/main/java/org/apache/felix/service/command/CommandSession.java (original)
+++ felix/trunk/gogo/runtime/src/main/java/org/apache/felix/service/command/CommandSession.java Thu May 17 15:54:23 2018
@@ -35,6 +35,10 @@ public interface CommandSession extends
 
     void currentDir(Path path);
 
+    ClassLoader classLoader();
+
+    void classLoader(ClassLoader classLoader);
+
     /**
      * Execute a program in this session.
      *

Modified: felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ExpanderTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ExpanderTest.java?rev=1831792&r1=1831791&r2=1831792&view=diff
==============================================================================
--- felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ExpanderTest.java (original)
+++ felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ExpanderTest.java Thu May 17 15:54:23 2018
@@ -34,11 +34,7 @@ public class ExpanderTest {
 
     @Test
     public void testSubscriptOnArrays() throws  Exception {
-        Evaluate evaluate = new Evaluate() {
-            @Override
-            public Object eval(Token t) {
-                return null;
-            }
+        Evaluate evaluate = new TestEvaluate() {
             @Override
             public Object get(String key) {
                 switch (key) {
@@ -51,18 +47,6 @@ public class ExpanderTest {
                 }
                 return null;
             }
-            @Override
-            public Object put(String key, Object value) {
-                return null;
-            }
-            @Override
-            public Object expr(Token t) {
-                return null;
-            }
-            @Override
-            public Path currentDir() {
-                return null;
-            }
         };
 
         assertEquals(3, Expander.expand("${a[1]}", evaluate));
@@ -72,38 +56,13 @@ public class ExpanderTest {
 
     @Test
     public void testOctalAndHex() throws Exception {
-        Evaluate evaluate = new Evaluate() {
-            @Override
-            public Object eval(Token t) {
-                return null;
-            }
-            @Override
-            public Object get(String key) {
-                return null;
-            }
-            @Override
-            public Object put(String key, Object value) {
-                return null;
-            }
-            @Override
-            public Object expr(Token t) {
-                return null;
-            }
-            @Override
-            public Path currentDir() {
-                return null;
-            }
-        };
+        Evaluate evaluate = new TestEvaluate();
         assertEquals("\033\033", Expander.expand("$'\\033\\u001B'", evaluate));
     }
 
     @Test
     public void testSortingFlags() throws Exception {
-        Evaluate evaluate = new Evaluate() {
-            @Override
-            public Object eval(Token t) {
-                return null;
-            }
+        Evaluate evaluate = new TestEvaluate() {
             @Override
             public Object get(String key) {
                 switch (key) {
@@ -118,18 +77,6 @@ public class ExpanderTest {
                 }
                 return null;
             }
-            @Override
-            public Object put(String key, Object value) {
-                return null;
-            }
-            @Override
-            public Object expr(Token t) {
-                return null;
-            }
-            @Override
-            public Path currentDir() {
-                return null;
-            }
         };
 
         assertEquals("5 3 4 2 1 3", Expander.expand("${(j: :)a}", evaluate));
@@ -146,11 +93,7 @@ public class ExpanderTest {
     @Test
     public void testGenerateFiles() throws IOException {
         final Path testdir = Paths.get(".").toAbsolutePath().resolve("target/testdir").normalize();
-        Evaluate evaluate = new Evaluate() {
-            @Override
-            public Object eval(Token t) {
-                return null;
-            }
+        Evaluate evaluate = new TestEvaluate() {
             @Override
             public Object get(String key) {
                 if ("HOME".equals(key)) {
@@ -159,14 +102,6 @@ public class ExpanderTest {
                 return null;
             }
             @Override
-            public Object put(String key, Object value) {
-                return null;
-            }
-            @Override
-            public Object expr(Token t) {
-                return null;
-            }
-            @Override
             public Path currentDir() {
                 return testdir.resolve("Users/gogo/karaf/home");
             }

Copied: felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestEvaluate.java (from r1831785, felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Evaluate.java)
URL: http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestEvaluate.java?p2=felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestEvaluate.java&p1=felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Evaluate.java&r1=1831785&r2=1831792&rev=1831792&view=diff
==============================================================================
--- felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Evaluate.java (original)
+++ felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestEvaluate.java Thu May 17 15:54:23 2018
@@ -20,15 +20,34 @@ package org.apache.felix.gogo.runtime;
 
 import java.nio.file.Path;
 
-public interface Evaluate
-{
-    Object eval(Token t) throws Exception;
-    
-    Object get(String key);
-    
-    Object put(String key, Object value);
+public class TestEvaluate implements Evaluate {
+    @Override
+    public Object eval(Token t) throws Exception {
+        return null;
+    }
 
-    Object expr(Token t);
+    @Override
+    public Object get(String key) {
+        return null;
+    }
 
-    Path currentDir();
+    @Override
+    public Object put(String key, Object value) {
+        return null;
+    }
+
+    @Override
+    public Object expr(Token t) {
+        return null;
+    }
+
+    @Override
+    public Path currentDir() {
+        return null;
+    }
+
+    @Override
+    public ClassLoader classLoader() {
+        return getClass().getClassLoader();
+    }
 }

Modified: felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestTokenizer.java
URL: http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestTokenizer.java?rev=1831792&r1=1831791&r2=1831792&view=diff
==============================================================================
--- felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestTokenizer.java (original)
+++ felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/TestTokenizer.java Thu May 17 15:54:23 2018
@@ -54,7 +54,7 @@ public class TestTokenizer
 
     public TestTokenizer()
     {
-        evaluate = new Evaluate()
+        evaluate = new TestEvaluate()
         {
             public Object eval(Token t) {
                 throw new UnsupportedOperationException("eval not implemented.");

Modified: felix/trunk/gogo/shell/src/main/java/org/apache/felix/gogo/shell/Builtin.java
URL: http://svn.apache.org/viewvc/felix/trunk/gogo/shell/src/main/java/org/apache/felix/gogo/shell/Builtin.java?rev=1831792&r1=1831791&r2=1831792&view=diff
==============================================================================
--- felix/trunk/gogo/shell/src/main/java/org/apache/felix/gogo/shell/Builtin.java (original)
+++ felix/trunk/gogo/shell/src/main/java/org/apache/felix/gogo/shell/Builtin.java Thu May 17 15:54:23 2018
@@ -83,7 +83,7 @@ public class Builtin
 
     // FIXME: the "new" command should be provided by runtime,
     // so it can leverage same argument coercion mechanism, used to invoke methods.
-    public Object _new(Object name, Object[] argv) throws Exception
+    public Object _new(CommandSession session, Object name, Object[] argv) throws Exception
     {
         Class<?> clazz = null;
 
@@ -93,7 +93,7 @@ public class Builtin
         }
         else
         {
-            clazz = loadClass(name.toString());
+            clazz = loadClass(session, name.toString());
         }
 
         for (Constructor<?> c : clazz.getConstructors())
@@ -143,7 +143,7 @@ public class Builtin
             + " to any of " + Arrays.asList(clazz.getConstructors()));
     }
 
-    private Class<?> loadClass(String name) throws ClassNotFoundException
+    private Class<?> loadClass(CommandSession session, String name) throws ClassNotFoundException
     {
         if (!name.contains("."))
         {
@@ -152,14 +152,14 @@ public class Builtin
                 String pkg = p + "." + name;
                 try
                 {
-                    return Class.forName(pkg);
+                    return Class.forName(pkg, true, session.classLoader());
                 }
                 catch (ClassNotFoundException e)
                 {
                 }
             }
         }
-        return Class.forName(name);
+        return Class.forName(name, true, session.classLoader());
     }
 
     public void set(CommandSession session, String[] argv) {