]> git.basschouten.com Git - openhab-addons.git/commitdiff
[jrubyscripting] clean up assignment of class objects (#13451)
authorCody Cutrer <cody@cutrer.us>
Fri, 30 Sep 2022 20:47:53 +0000 (14:47 -0600)
committerGitHub <noreply@github.com>
Fri, 30 Sep 2022 20:47:53 +0000 (22:47 +0200)
pass the actual class objects through, and post-process in Ruby, to
avoid the rescue nil -- and by extension, any issues with visibility
into private objects from JRuby.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
bundles/org.openhab.automation.jrubyscripting/src/main/java/org/openhab/automation/jrubyscripting/internal/JRubyScriptEngineFactory.java

index 4879b79227bbde1fd2a115aaeab0eec195f66c2f..326ffbc594b62d20431a82b5aadeb2493b12af8c 100644 (file)
@@ -19,6 +19,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import javax.script.ScriptContext;
 import javax.script.ScriptEngine;
 import javax.script.ScriptException;
 
@@ -123,12 +124,12 @@ public class JRubyScriptEngineFactory extends AbstractScriptEngineFactory {
     }
 
     private void importClassesToRuby(ScriptEngine scriptEngine, Map<String, Object> objects) {
-        String import_statements = objects.entrySet() //
-                .stream() //
-                .map(entry -> "java_import " + ((Class<?>) entry.getValue()).getName() + " rescue nil") //
-                .collect(Collectors.joining("\n"));
         try {
-            scriptEngine.eval(import_statements);
+            scriptEngine.put("__classes", objects);
+            final String code = "__classes.each { |(name, klass)| Object.const_set(name, klass.ruby_class) }";
+            scriptEngine.eval(code);
+            // clean up our temporary variable
+            scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE).remove("__classes");
         } catch (ScriptException e) {
             logger.debug("Error importing java classes", e);
         }