From 8266d12d36677dd3f7ceea6356852c58bf46f8dd Mon Sep 17 00:00:00 2001 From: Jeff Zhang Date: Mon, 19 Sep 2016 10:47:56 +0800 Subject: [PATCH] ZEPPELIN-1368. interpreter-setting.json may be loaded mutliple times --- .../zeppelin/interpreter/Interpreter.java | 6 +- .../interpreter/InterpreterFactory.java | 64 +++++++++++-------- 2 files changed, 42 insertions(+), 28 deletions(-) diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java index 42caafdfc61..6d7d660eeb9 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java @@ -338,9 +338,9 @@ public static void register(String name, String group, String className, @Deprecated public static void register(String name, String group, String className, boolean defaultInterpreter, Map properties) { - logger.error("Static initialization is deprecated. You should change it to use " + - "interpreter-setting.json in your jar or " + - "interpreter/{interpreter}/interpreter-setting.json"); + logger.warn("Static initialization is deprecated for interpreter {}, You should change it " + + "to use interpreter-setting.json in your jar or " + + "interpreter/{interpreter}/interpreter-setting.json", name); register(new RegisteredInterpreter(name, group, className, defaultInterpreter, properties)); } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java index 362f76c54df..3c7c0dd2cf2 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java @@ -171,32 +171,42 @@ public boolean accept(Path entry) throws IOException { })) { String interpreterDirString = interpreterDir.toString(); - registerInterpreterFromPath(interpreterDirString, interpreterJson); - - registerInterpreterFromResource(cl, interpreterDirString, interpreterJson); - - /* - * TODO(jongyoul) - * - Remove these codes below because of legacy code - * - Support ThreadInterpreter + /** + * Register interpreter by the following ordering + * 1. Register it from path {ZEPPELIN_HOME}/interpreter/{interpreter_name}/ + * interpreter-setting.json + * 2. Register it from interpreter-setting.json in classpath + * {ZEPPELIN_HOME}/interpreter/{interpreter_name} + * 3. Register it by Interpreter.register */ - URLClassLoader ccl = new URLClassLoader(recursiveBuildLibList(interpreterDir.toFile()), cl); - for (String className : interpreterClassList) { - try { - // Load classes - Class.forName(className, true, ccl); - Set interpreterKeys = Interpreter.registeredInterpreters.keySet(); - for (String interpreterKey : interpreterKeys) { - if (className - .equals(Interpreter.registeredInterpreters.get(interpreterKey).getClassName())) { - Interpreter.registeredInterpreters.get(interpreterKey) - .setPath(interpreterDirString); - logger.info("Interpreter " + interpreterKey + " found. class=" + className); - cleanCl.put(interpreterDirString, ccl); + if (!registerInterpreterFromPath(interpreterDirString, interpreterJson)) { + if (!registerInterpreterFromResource(cl, interpreterDirString, interpreterJson)) { + /* + * TODO(jongyoul) + * - Remove these codes below because of legacy code + * - Support ThreadInterpreter + */ + URLClassLoader ccl = new URLClassLoader( + recursiveBuildLibList(interpreterDir.toFile()), cl); + for (String className : interpreterClassList) { + try { + // Load classes + Class.forName(className, true, ccl); + Set interpreterKeys = Interpreter.registeredInterpreters.keySet(); + for (String interpreterKey : interpreterKeys) { + if (className + .equals(Interpreter.registeredInterpreters.get(interpreterKey) + .getClassName())) { + Interpreter.registeredInterpreters.get(interpreterKey) + .setPath(interpreterDirString); + logger.info("Interpreter " + interpreterKey + " found. class=" + className); + cleanCl.put(interpreterDirString, ccl); + } + } + } catch (Throwable t) { + // nothing to do } } - } catch (Throwable t) { - // nothing to do } } } @@ -277,7 +287,7 @@ private Properties convertInterpreterProperties(Map return properties; } - private void registerInterpreterFromResource(ClassLoader cl, String interpreterDir, + private boolean registerInterpreterFromResource(ClassLoader cl, String interpreterDir, String interpreterJson) throws IOException, RepositoryException { URL[] urls = recursiveBuildLibList(new File(interpreterDir)); ClassLoader tempClassLoader = new URLClassLoader(urls, cl); @@ -289,10 +299,12 @@ private void registerInterpreterFromResource(ClassLoader cl, String interpreterD List registeredInterpreterList = getInterpreterListFromJson(inputStream); registerInterpreters(registeredInterpreterList, interpreterDir); + return true; } + return false; } - private void registerInterpreterFromPath(String interpreterDir, String interpreterJson) + private boolean registerInterpreterFromPath(String interpreterDir, String interpreterJson) throws IOException, RepositoryException { Path interpreterJsonPath = Paths.get(interpreterDir, interpreterJson); @@ -301,7 +313,9 @@ private void registerInterpreterFromPath(String interpreterDir, String interpret List registeredInterpreterList = getInterpreterListFromJson(interpreterJsonPath); registerInterpreters(registeredInterpreterList, interpreterDir); + return true; } + return false; } private List getInterpreterListFromJson(Path filename)