Skip to content

Commit

Permalink
[jrubyscripting] clean up assignment of class objects (openhab#13451)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
ccutrer authored and psmedley committed Feb 23, 2023
1 parent cdf50a3 commit 1cd19ab
Showing 1 changed file with 6 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;

import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptException;

Expand Down Expand Up @@ -123,12 +124,12 @@ public void scopeValues(ScriptEngine scriptEngine, Map<String, Object> scopeValu
}

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);
}
Expand Down

0 comments on commit 1cd19ab

Please sign in to comment.