[jrubyscripting] clean up assignment of class objects ()

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>
This commit is contained in:
Cody Cutrer 2022-09-30 14:47:53 -06:00 committed by GitHub
parent 2a02f2c7ef
commit 7b8ae535e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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);
}