Repository: zeppelin Updated Branches: refs/heads/master e28712c48 -> 0c64d9ca6
ZEPPELIN-2942. Remove non-remote interpreter approach ### What is this PR for? This PR is just trying to remove non-remote interpreter approach. ### What type of PR is it? [Refactoring] ### Todos * [ ] - Task ### What is the Jira issue? * https://issues.apache.org/jira/browse/ZEPPELIN-2942 ### How should this be tested? Current test is passed ### Questions: * Does the licenses files need update? No * Is there breaking changes for older versions? No * Does this needs documentation? No Author: Jeff Zhang <zjf...@apache.org> Closes #2597 from zjffdu/ZEPPELIN-2942 and squashes the following commits: 42fe419 [Jeff Zhang] ZEPPELIN-2942. Remove non-remote interpreter approach Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/0c64d9ca Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/0c64d9ca Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/0c64d9ca Branch: refs/heads/master Commit: 0c64d9ca676e48a749db9879fa3cebc06eb78b54 Parents: e28712c Author: Jeff Zhang <zjf...@apache.org> Authored: Fri Sep 22 11:28:42 2017 +0800 Committer: Jeff Zhang <zjf...@apache.org> Committed: Tue Oct 10 06:32:36 2017 +0800 ---------------------------------------------------------------------- .../zeppelin/interpreter/InterpreterOption.java | 19 +---- .../interpreter/InterpreterInfoSaving.java | 5 -- .../interpreter/InterpreterSetting.java | 84 ++------------------ .../interpreter/InterpreterSettingManager.java | 2 +- .../interpreter/InterpreterSettingTest.java | 9 --- .../ManagedInterpreterGroupTest.java | 1 - .../remote/RemoteAngularObjectTest.java | 1 - .../RemoteInterpreterOutputTestStream.java | 1 - .../remote/RemoteInterpreterTest.java | 1 - .../zeppelin/scheduler/RemoteSchedulerTest.java | 1 - 10 files changed, 10 insertions(+), 114 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0c64d9ca/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java index 37a0d99..e8a9225 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java @@ -28,7 +28,8 @@ public class InterpreterOption { public static final transient String SCOPED = "scoped"; public static final transient String ISOLATED = "isolated"; - boolean remote; + // always set it as true, keep this field just for backward compatibility + boolean remote = true; String host = null; int port = -1; @@ -77,14 +78,9 @@ public class InterpreterOption { } public InterpreterOption() { - this(false); } - public InterpreterOption(boolean remote) { - this(remote, SHARED, SHARED); - } - - public InterpreterOption(boolean remote, String perUser, String perNote) { + public InterpreterOption(String perUser, String perNote) { if (perUser == null) { throw new NullPointerException("perUser can not be null."); } @@ -92,7 +88,6 @@ public class InterpreterOption { throw new NullPointerException("perNote can not be null."); } - this.remote = remote; this.perUser = perUser; this.perNote = perNote; } @@ -112,14 +107,6 @@ public class InterpreterOption { return option; } - public boolean isRemote() { - return remote; - } - - public void setRemote(boolean remote) { - this.remote = remote; - } - public String getHost() { return host; } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0c64d9ca/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterInfoSaving.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterInfoSaving.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterInfoSaving.java index d7593d5..3d9c2c3 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterInfoSaving.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterInfoSaving.java @@ -63,11 +63,6 @@ public class InterpreterInfoSaving implements JsonSerializable { if (infoSaving != null && infoSaving.interpreterSettings != null) { for (InterpreterSetting interpreterSetting : infoSaving.interpreterSettings.values()) { - // Always use separate interpreter process - // While we decided to turn this feature on always (without providing - // enable/disable option on GUI). - // previously created setting should turn this feature on here. - interpreterSetting.getOption().setRemote(true); interpreterSetting.convertPermissionsFromUsersToOwners( jsonObject.getAsJsonObject("interpreterSettings") .getAsJsonObject(interpreterSetting.getId())); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0c64d9ca/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java index 3a808c5..5af01dc 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java @@ -105,7 +105,7 @@ public class InterpreterSetting { private List<InterpreterInfo> interpreterInfos; private List<Dependency> dependencies = new ArrayList<>(); - private InterpreterOption option = new InterpreterOption(true); + private InterpreterOption option = new InterpreterOption(); @SerializedName("runner") private InterpreterRunner interpreterRunner; @@ -132,8 +132,6 @@ public class InterpreterSetting { private transient ZeppelinConfiguration conf = new ZeppelinConfiguration(); - private transient Map<String, URLClassLoader> cleanCl = - Collections.synchronizedMap(new HashMap<String, URLClassLoader>()); /////////////////////////////////////////////////////////////////////////////////////////// @@ -616,13 +614,8 @@ public class InterpreterSetting { List<InterpreterInfo> interpreterInfos = getInterpreterInfos(); for (InterpreterInfo info : interpreterInfos) { Interpreter interpreter = null; - if (option.isRemote()) { - interpreter = new RemoteInterpreter(getJavaProperties(), sessionId, - info.getClassName(), user); - } else { - interpreter = createLocalInterpreter(info.getClassName()); - } - + interpreter = new RemoteInterpreter(getJavaProperties(), sessionId, + info.getClassName(), user); if (info.isDefaultInterpreter()) { interpreters.add(0, interpreter); } else { @@ -633,66 +626,7 @@ public class InterpreterSetting { } return interpreters; } - - // Create Interpreter in ZeppelinServer for non-remote mode - private Interpreter createLocalInterpreter(String className) - throws InterpreterException { - LOGGER.info("Create Local Interpreter {} from {}", className, interpreterDir); - - ClassLoader oldcl = Thread.currentThread().getContextClassLoader(); - try { - - URLClassLoader ccl = cleanCl.get(interpreterDir); - if (ccl == null) { - // classloader fallback - ccl = URLClassLoader.newInstance(new URL[]{}, oldcl); - } - - boolean separateCL = true; - try { // check if server's classloader has driver already. - Class cls = this.getClass().forName(className); - if (cls != null) { - separateCL = false; - } - } catch (Exception e) { - LOGGER.error("exception checking server classloader driver", e); - } - - URLClassLoader cl; - - if (separateCL == true) { - cl = URLClassLoader.newInstance(new URL[]{}, ccl); - } else { - cl = ccl; - } - Thread.currentThread().setContextClassLoader(cl); - - Class<Interpreter> replClass = (Class<Interpreter>) cl.loadClass(className); - Constructor<Interpreter> constructor = - replClass.getConstructor(new Class[]{Properties.class}); - Interpreter repl = constructor.newInstance(getJavaProperties()); - repl.setClassloaderUrls(ccl.getURLs()); - LazyOpenInterpreter intp = new LazyOpenInterpreter(new ClassloaderInterpreter(repl, cl)); - return intp; - } catch (SecurityException e) { - throw new InterpreterException(e); - } catch (NoSuchMethodException e) { - throw new InterpreterException(e); - } catch (IllegalArgumentException e) { - throw new InterpreterException(e); - } catch (InstantiationException e) { - throw new InterpreterException(e); - } catch (IllegalAccessException e) { - throw new InterpreterException(e); - } catch (InvocationTargetException e) { - throw new InterpreterException(e); - } catch (ClassNotFoundException e) { - throw new InterpreterException(e); - } finally { - Thread.currentThread().setContextClassLoader(oldcl); - } - } - + RemoteInterpreterProcess createInterpreterProcess() { RemoteInterpreterProcess remoteInterpreterProcess = null; int connectTimeout = @@ -885,14 +819,8 @@ public class InterpreterSetting { throws InterpreterException { AngularObjectRegistry angularObjectRegistry; ManagedInterpreterGroup interpreterGroup = new ManagedInterpreterGroup(groupId, this); - if (option.isRemote()) { - angularObjectRegistry = - new RemoteAngularObjectRegistry(groupId, angularObjectRegistryListener, interpreterGroup); - } else { - angularObjectRegistry = new AngularObjectRegistry(id, angularObjectRegistryListener); - // TODO(moon) : create distributed resource pool for local interpreters and set - } - + angularObjectRegistry = + new RemoteAngularObjectRegistry(groupId, angularObjectRegistryListener, interpreterGroup); interpreterGroup.setAngularObjectRegistry(angularObjectRegistry); return interpreterGroup; } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0c64d9ca/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java index 73babab..4b130e3 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java @@ -124,7 +124,7 @@ public class InterpreterSettingManager { remoteInterpreterProcessListener, ApplicationEventListener appEventListener) throws IOException { - this(zeppelinConfiguration, new InterpreterOption(true), + this(zeppelinConfiguration, new InterpreterOption(), angularObjectRegistryListener, remoteInterpreterProcessListener, appEventListener); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0c64d9ca/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingTest.java index 3c061a9..e3e47d3 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterSettingTest.java @@ -32,7 +32,6 @@ public class InterpreterSettingTest { public void testCreateInterpreters() { InterpreterOption interpreterOption = new InterpreterOption(); interpreterOption.setPerUser(InterpreterOption.SHARED); - interpreterOption.setRemote(false); InterpreterInfo interpreterInfo1 = new InterpreterInfo(EchoInterpreter.class.getName(), "echo", true, new HashMap<String, Object>()); InterpreterInfo interpreterInfo2 = new InterpreterInfo(DoubleEchoInterpreter.class.getName(), "double_echo", false, new HashMap<String, Object>()); List<InterpreterInfo> interpreterInfos = new ArrayList<>(); @@ -64,7 +63,6 @@ public class InterpreterSettingTest { public void testSharedMode() { InterpreterOption interpreterOption = new InterpreterOption(); interpreterOption.setPerUser(InterpreterOption.SHARED); - interpreterOption.setRemote(false); InterpreterInfo interpreterInfo1 = new InterpreterInfo(EchoInterpreter.class.getName(), "echo", true, new HashMap<String, Object>()); InterpreterInfo interpreterInfo2 = new InterpreterInfo(DoubleEchoInterpreter.class.getName(), "double_echo", false, new HashMap<String, Object>()); List<InterpreterInfo> interpreterInfos = new ArrayList<>(); @@ -101,7 +99,6 @@ public class InterpreterSettingTest { public void testPerUserScopedMode() { InterpreterOption interpreterOption = new InterpreterOption(); interpreterOption.setPerUser(InterpreterOption.SCOPED); - interpreterOption.setRemote(true); InterpreterInfo interpreterInfo1 = new InterpreterInfo(EchoInterpreter.class.getName(), "echo", true, new HashMap<String, Object>()); InterpreterInfo interpreterInfo2 = new InterpreterInfo(DoubleEchoInterpreter.class.getName(), "double_echo", false, new HashMap<String, Object>()); List<InterpreterInfo> interpreterInfos = new ArrayList<>(); @@ -138,7 +135,6 @@ public class InterpreterSettingTest { public void testPerNoteScopedMode() { InterpreterOption interpreterOption = new InterpreterOption(); interpreterOption.setPerNote(InterpreterOption.SCOPED); - interpreterOption.setRemote(true); InterpreterInfo interpreterInfo1 = new InterpreterInfo(EchoInterpreter.class.getName(), "echo", true, new HashMap<String, Object>()); InterpreterInfo interpreterInfo2 = new InterpreterInfo(DoubleEchoInterpreter.class.getName(), "double_echo", false, new HashMap<String, Object>()); List<InterpreterInfo> interpreterInfos = new ArrayList<>(); @@ -175,7 +171,6 @@ public class InterpreterSettingTest { public void testPerUserIsolatedMode() { InterpreterOption interpreterOption = new InterpreterOption(); interpreterOption.setPerUser(InterpreterOption.ISOLATED); - interpreterOption.setRemote(true); InterpreterInfo interpreterInfo1 = new InterpreterInfo(EchoInterpreter.class.getName(), "echo", true, new HashMap<String, Object>()); InterpreterInfo interpreterInfo2 = new InterpreterInfo(DoubleEchoInterpreter.class.getName(), "double_echo", false, new HashMap<String, Object>()); List<InterpreterInfo> interpreterInfos = new ArrayList<>(); @@ -212,7 +207,6 @@ public class InterpreterSettingTest { public void testPerNoteIsolatedMode() { InterpreterOption interpreterOption = new InterpreterOption(); interpreterOption.setPerNote(InterpreterOption.ISOLATED); - interpreterOption.setRemote(true); InterpreterInfo interpreterInfo1 = new InterpreterInfo(EchoInterpreter.class.getName(), "echo", true, new HashMap<String, Object>()); InterpreterInfo interpreterInfo2 = new InterpreterInfo(DoubleEchoInterpreter.class.getName(), "double_echo", false, new HashMap<String, Object>()); List<InterpreterInfo> interpreterInfos = new ArrayList<>(); @@ -249,7 +243,6 @@ public class InterpreterSettingTest { InterpreterOption interpreterOption = new InterpreterOption(); interpreterOption.setPerUser(InterpreterOption.ISOLATED); interpreterOption.setPerNote(InterpreterOption.SCOPED); - interpreterOption.setRemote(true); InterpreterInfo interpreterInfo1 = new InterpreterInfo(EchoInterpreter.class.getName(), "echo", true, new HashMap<String, Object>()); InterpreterInfo interpreterInfo2 = new InterpreterInfo(DoubleEchoInterpreter.class.getName(), "double_echo", false, new HashMap<String, Object>()); List<InterpreterInfo> interpreterInfos = new ArrayList<>(); @@ -301,7 +294,6 @@ public class InterpreterSettingTest { InterpreterOption interpreterOption = new InterpreterOption(); interpreterOption.setPerUser(InterpreterOption.ISOLATED); interpreterOption.setPerNote(InterpreterOption.ISOLATED); - interpreterOption.setRemote(true); InterpreterInfo interpreterInfo1 = new InterpreterInfo(EchoInterpreter.class.getName(), "echo", true, new HashMap<String, Object>()); InterpreterInfo interpreterInfo2 = new InterpreterInfo(DoubleEchoInterpreter.class.getName(), "double_echo", false, new HashMap<String, Object>()); List<InterpreterInfo> interpreterInfos = new ArrayList<>(); @@ -358,7 +350,6 @@ public class InterpreterSettingTest { InterpreterOption interpreterOption = new InterpreterOption(); interpreterOption.setPerUser(InterpreterOption.SCOPED); interpreterOption.setPerNote(InterpreterOption.SCOPED); - interpreterOption.setRemote(true); InterpreterInfo interpreterInfo1 = new InterpreterInfo(EchoInterpreter.class.getName(), "echo", true, new HashMap<String, Object>()); InterpreterInfo interpreterInfo2 = new InterpreterInfo(DoubleEchoInterpreter.class.getName(), "double_echo", false, new HashMap<String, Object>()); List<InterpreterInfo> interpreterInfos = new ArrayList<>(); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0c64d9ca/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroupTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroupTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroupTest.java index a5d7bd4..74bd201 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroupTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroupTest.java @@ -41,7 +41,6 @@ public class ManagedInterpreterGroupTest { public void setUp() throws IOException, RepositoryException { InterpreterOption interpreterOption = new InterpreterOption(); interpreterOption.setPerUser(InterpreterOption.SCOPED); - interpreterOption.setRemote(false); InterpreterInfo interpreterInfo1 = new InterpreterInfo(EchoInterpreter.class.getName(), "echo", true, new HashMap<String, Object>()); InterpreterInfo interpreterInfo2 = new InterpreterInfo(DoubleEchoInterpreter.class.getName(), "double_echo", false, new HashMap<String, Object>()); List<InterpreterInfo> interpreterInfos = new ArrayList<>(); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0c64d9ca/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java index 61e4ef0..37b262c 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java @@ -60,7 +60,6 @@ public class RemoteAngularObjectTest implements AngularObjectRegistryListener { onRemove = new AtomicInteger(0); InterpreterOption interpreterOption = new InterpreterOption(); - interpreterOption.setRemote(true); InterpreterInfo interpreterInfo1 = new InterpreterInfo(MockInterpreterAngular.class.getName(), "mock", true, new HashMap<String, Object>()); List<InterpreterInfo> interpreterInfos = new ArrayList<>(); interpreterInfos.add(interpreterInfo1); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0c64d9ca/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java index 1687060..c5203a9 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java @@ -46,7 +46,6 @@ public class RemoteInterpreterOutputTestStream implements RemoteInterpreterProce public void setUp() throws Exception { InterpreterOption interpreterOption = new InterpreterOption(); - interpreterOption.setRemote(true); InterpreterInfo interpreterInfo1 = new InterpreterInfo(MockInterpreterOutputStream.class.getName(), "mock", true, new HashMap<String, Object>()); List<InterpreterInfo> interpreterInfos = new ArrayList<>(); interpreterInfos.add(interpreterInfo1); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0c64d9ca/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java index 0a5e484..c201eda 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java @@ -52,7 +52,6 @@ public class RemoteInterpreterTest { public void setUp() throws Exception { InterpreterOption interpreterOption = new InterpreterOption(); - interpreterOption.setRemote(true); InterpreterInfo interpreterInfo1 = new InterpreterInfo(EchoInterpreter.class.getName(), "echo", true, new HashMap<String, Object>()); InterpreterInfo interpreterInfo2 = new InterpreterInfo(DoubleEchoInterpreter.class.getName(), "double_echo", false, new HashMap<String, Object>()); InterpreterInfo interpreterInfo3 = new InterpreterInfo(SleepInterpreter.class.getName(), "sleep", false, new HashMap<String, Object>()); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0c64d9ca/zeppelin-zengine/src/test/java/org/apache/zeppelin/scheduler/RemoteSchedulerTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/scheduler/RemoteSchedulerTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/scheduler/RemoteSchedulerTest.java index a758591..e8e2183 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/scheduler/RemoteSchedulerTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/scheduler/RemoteSchedulerTest.java @@ -63,7 +63,6 @@ public class RemoteSchedulerTest implements RemoteInterpreterProcessListener { schedulerSvc = new SchedulerFactory(); InterpreterOption interpreterOption = new InterpreterOption(); - interpreterOption.setRemote(true); InterpreterInfo interpreterInfo1 = new InterpreterInfo(MockInterpreterA.class.getName(), "mock", true, new HashMap<String, Object>()); List<InterpreterInfo> interpreterInfos = new ArrayList<>(); interpreterInfos.add(interpreterInfo1);