summaryrefslogtreecommitdiff
path: root/external
diff options
context:
space:
mode:
authorDouglas Mencken <dougmencken@gmail.com>2015-09-30 12:16:08 -0400
committerCaolán McNamara <caolanm@redhat.com>2016-03-15 09:37:00 +0000
commit841a58da93e10f543876eefca470d8fd4bd96ded (patch)
treef8bcdcdeb9e70bac904016ffaa38bf9a3889bbe6 /external
parent36389d83d7eaa9b14236b14c46f1e5101a471b8f (diff)
beanshell: improve compatibility for script engine
javax.script.Invocable may contain either • two `invoke' methods or • `invokeMethod' and `invokeFunction' so let's support any variant Change-Id: I47196af79cc2de75725ded29992ab1f6f4cd623e Reviewed-on: https://gerrit.libreoffice.org/23163 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'external')
-rw-r--r--external/beanshell/UnpackedTarball_beanshell.mk5
-rw-r--r--external/beanshell/beanshell-invoke.patch78
2 files changed, 83 insertions, 0 deletions
diff --git a/external/beanshell/UnpackedTarball_beanshell.mk b/external/beanshell/UnpackedTarball_beanshell.mk
index 828e4bd2fed9..f35dd7d794a1 100644
--- a/external/beanshell/UnpackedTarball_beanshell.mk
+++ b/external/beanshell/UnpackedTarball_beanshell.mk
@@ -11,8 +11,13 @@ $(eval $(call gb_UnpackedTarball_UnpackedTarball,beanshell))
$(eval $(call gb_UnpackedTarball_set_tarball,beanshell,$(BSH_TARBALL),,beanshell))
+$(eval $(call gb_UnpackedTarball_fix_end_of_line,beanshell,\
+ engine/src/TestBshScriptEngine.java \
+))
+
$(eval $(call gb_UnpackedTarball_add_patches,beanshell,\
external/beanshell/bsh-2.0b1-src.patch \
+ external/beanshell/beanshell-invoke.patch \
))
# vim: set noet sw=4 ts=4:
diff --git a/external/beanshell/beanshell-invoke.patch b/external/beanshell/beanshell-invoke.patch
new file mode 100644
index 000000000000..b78f1db61642
--- /dev/null
+++ b/external/beanshell/beanshell-invoke.patch
@@ -0,0 +1,78 @@
+--- old/beanshell/engine/src/bsh/engine/BshScriptEngine.java
++++ new/beanshell/engine/src/bsh/engine/BshScriptEngine.java
+@@ -229,6 +229,12 @@
+ }
+ }
+
++ public Object invoke( Object thiz, String name, Object... args )
++ throws ScriptException, NoSuchMethodException
++ {
++ return invokeMethod( thiz, name, args );
++ }
++
+ /**
+ * Same as invoke(Object, String, Object...) with <code>null</code> as the
+ * first argument. Used to call top-level procedures defined in scripts.
+@@ -249,6 +255,12 @@
+ return invokeMethod( getGlobal(), name, args );
+ }
+
++ public Object invoke( String name, Object... args )
++ throws ScriptException, NoSuchMethodException
++ {
++ return invokeFunction( name, args );
++ }
++
+ /**
+ * Returns an implementation of an interface using procedures compiled in the
+ * interpreter. The methods of the interface may be implemented using the
+--- old/beanshell/engine/src/TestBshScriptEngine.java
++++ new/beanshell/engine/src/TestBshScriptEngine.java
+@@ -2,11 +2,12 @@
+ import java.io.*;
+ import javax.script.*;
+ import static javax.script.ScriptContext.*;
++import java.lang.reflect.*;
+
+ public class TestBshScriptEngine
+ {
+ public static void main( String [] args )
+- throws ScriptException, NoSuchMethodException, IOException
++ throws ScriptException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, IOException
+ {
+ ScriptEngineManager manager =
+ new ScriptEngineManager( bsh.Interpreter.class.getClassLoader() );
+@@ -39,11 +40,23 @@
+ assertTrue( engine.get("bar").equals("gee") );
+ assertTrue( engine.eval("bar").equals("gee") );
+
++ // use reflection to pick available method
++ Method invokeMe = null;
++ try {
++ invokeMe = Invocable.class.getMethod( "invokeFunction", String.class, Object[].class );
++ } catch ( Exception e ) { }
++ if (invokeMe == null)
++ {
++ try {
++ invokeMe = Invocable.class.getMethod( "invoke", String.class, Object[].class );
++ } catch ( Exception e ) { }
++ }
++
+ // install and invoke a method
+ engine.eval("foo() { return foo+1; }");
+ // invoke a method
+ Invocable invocable = (Invocable) engine;
+- int foo = (Integer)invocable.invokeFunction( "foo" );
++ int foo = (Integer)invokeMe.invoke( invocable, "foo", (Object) new Object[]{} );
+ assertTrue( foo == 43 );
+
+ // get interface
+@@ -58,7 +71,7 @@
+ engine.eval(
+ "flag2=false; myObj() { run() { flag2=true; } return this; }");
+ assertTrue( (Boolean)engine.get("flag2") == false );
+- Object scriptedObject = invocable.invokeFunction("myObj");
++ Object scriptedObject = invokeMe.invoke( invocable, "myObj", (Object) new Object[]{} );
+ assertTrue( scriptedObject instanceof bsh.This );
+ runnable =
+ (Runnable)invocable.getInterface( scriptedObject, Runnable.class );