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 5d9f301cae..39b843c970 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 @@ -1132,7 +1132,7 @@ public class InterpreterFactory implements InterpreterGroupFactory { } } - private String getInterpreterInstanceKey(String noteId, InterpreterSetting setting) { + private String getInterpreterInstanceKey(String user, String noteId, InterpreterSetting setting) { if (setting.getOption().isExistingProcess()) { return Constants.EXISTING_PROCESS; } else if (setting.getOption().isPerNoteSession() || setting.getOption().isPerNoteProcess()) { @@ -1142,14 +1142,15 @@ public class InterpreterFactory implements InterpreterGroupFactory { } } - private List createOrGetInterpreterList(String noteId, InterpreterSetting setting) { + private List createOrGetInterpreterList(String user, String noteId, + InterpreterSetting setting) { InterpreterGroup interpreterGroup = setting.getInterpreterGroup(noteId); synchronized (interpreterGroup) { - String key = getInterpreterInstanceKey(noteId, setting); + String key = getInterpreterInstanceKey(user, noteId, setting); if (!interpreterGroup.containsKey(key)) { createInterpretersForNote(setting, noteId, key); } - return interpreterGroup.get(getInterpreterInstanceKey(noteId, setting)); + return interpreterGroup.get(getInterpreterInstanceKey(user, noteId, setting)); } } @@ -1190,14 +1191,15 @@ public class InterpreterFactory implements InterpreterGroupFactory { return null; } - private Interpreter getInterpreter(String noteId, InterpreterSetting setting, String name) { + private Interpreter getInterpreter(String user, String noteId, InterpreterSetting setting, + String name) { Preconditions.checkNotNull(noteId, "noteId should be not null"); Preconditions.checkNotNull(setting, "setting should be not null"); Preconditions.checkNotNull(name, "name should be not null"); String className; if (null != (className = getInterpreterClassFromInterpreterSetting(setting, name))) { - List interpreterGroup = createOrGetInterpreterList(noteId, setting); + List interpreterGroup = createOrGetInterpreterList(user, noteId, setting); for (Interpreter interpreter : interpreterGroup) { if (className.equals(interpreter.getClassName())) { return interpreter; @@ -1207,7 +1209,7 @@ public class InterpreterFactory implements InterpreterGroupFactory { return null; } - public Interpreter getInterpreter(String noteId, String replName) { + public Interpreter getInterpreter(String user, String noteId, String replName) { List settings = getInterpreterSettings(noteId); InterpreterSetting setting; Interpreter interpreter; @@ -1220,7 +1222,7 @@ public class InterpreterFactory implements InterpreterGroupFactory { // get default settings (first available) // TODO(jl): Fix it in case of returning null InterpreterSetting defaultSettings = getDefaultInterpreterSetting(settings); - return createOrGetInterpreterList(noteId, defaultSettings).get(0); + return createOrGetInterpreterList(user, noteId, defaultSettings).get(0); } String[] replNameSplit = replName.split("\\."); @@ -1233,7 +1235,7 @@ public class InterpreterFactory implements InterpreterGroupFactory { setting = getInterpreterSettingByGroup(settings, group); if (null != setting) { - interpreter = getInterpreter(noteId, setting, name); + interpreter = getInterpreter(user, noteId, setting, name); if (null != interpreter) { return interpreter; @@ -1248,7 +1250,7 @@ public class InterpreterFactory implements InterpreterGroupFactory { // TODO(jl): Handle with noteId to support defaultInterpreter per note. setting = getDefaultInterpreterSetting(settings); - interpreter = getInterpreter(noteId, setting, replName); + interpreter = getInterpreter(user, noteId, setting, replName); if (null != interpreter) { return interpreter; @@ -1259,7 +1261,7 @@ public class InterpreterFactory implements InterpreterGroupFactory { setting = getInterpreterSettingByGroup(settings, replName); if (null != setting) { - List interpreters = createOrGetInterpreterList(noteId, setting); + List interpreters = createOrGetInterpreterList(user, noteId, setting); if (null != interpreters) { return interpreters.get(0); } @@ -1268,7 +1270,7 @@ public class InterpreterFactory implements InterpreterGroupFactory { // Support the legacy way to use it for (InterpreterSetting s : settings) { if (s.getGroup().equals(replName)) { - List interpreters = createOrGetInterpreterList(noteId, s); + List interpreters = createOrGetInterpreterList(user, noteId, s); if (null != interpreters) { return interpreters.get(0); } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java index 1281e71589..95088b92a1 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java @@ -468,7 +468,7 @@ public class Note implements Serializable, ParagraphJobListener { AuthenticationInfo authenticationInfo = new AuthenticationInfo(); authenticationInfo.setUser(cronExecutingUser); p.setAuthenticationInfo(authenticationInfo); - run(p.getId()); + run(cronExecutingUser, p.getId()); } } } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java index 7807abba41..335ce2c2fd 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java @@ -105,6 +105,10 @@ public class Paragraph extends Job implements Serializable, Cloneable { + new Random(System.currentTimeMillis()).nextInt(); } + public String getUser() { + return user; + } + public String getText() { return text; } @@ -193,7 +197,7 @@ public class Paragraph extends Job implements Serializable, Cloneable { } public Interpreter getRepl(String name) { - return factory.getInterpreter(note.getId(), name); + return factory.getInterpreter(user, note.getId(), name); } public Interpreter getCurrentRepl() { diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterFactoryTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterFactoryTest.java index 09031a5935..71d1826133 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterFactoryTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterFactoryTest.java @@ -210,8 +210,8 @@ public class InterpreterFactoryTest { add(setting2.getId()); }}); - assertEquals("className1", factory.getInterpreter("note", "test-group1").getClassName()); - assertEquals("className1", factory.getInterpreter("note", "group1").getClassName()); + assertEquals("className1", factory.getInterpreter("user1", "note", "test-group1").getClassName()); + assertEquals("className1", factory.getInterpreter("user1", "note", "group1").getClassName()); } @Test diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteInterpreterLoaderTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteInterpreterLoaderTest.java index 245089963e..9cc03e435d 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteInterpreterLoaderTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteInterpreterLoaderTest.java @@ -74,21 +74,21 @@ public class NoteInterpreterLoaderTest { factory.setInterpreters("note", factory.getDefaultInterpreterSettingList()); // when there're no interpreter selection directive - assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter1", factory.getInterpreter("note", null).getClassName()); - assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter1", factory.getInterpreter("note", "").getClassName()); - assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter1", factory.getInterpreter("note", " ").getClassName()); + assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter1", factory.getInterpreter("user", "note", null).getClassName()); + assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter1", factory.getInterpreter("user", "note", "").getClassName()); + assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter1", factory.getInterpreter("user", "note", " ").getClassName()); // when group name is omitted - assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter11", factory.getInterpreter("note", "mock11").getClassName()); + assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter11", factory.getInterpreter("user", "note", "mock11").getClassName()); // when 'name' is ommitted - assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter1", factory.getInterpreter("note", "group1").getClassName()); - assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter2", factory.getInterpreter("note", "group2").getClassName()); + assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter1", factory.getInterpreter("user", "note", "group1").getClassName()); + assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter2", factory.getInterpreter("user", "note", "group2").getClassName()); // when nothing is ommitted - assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter1", factory.getInterpreter("note", "group1.mock1").getClassName()); - assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter11", factory.getInterpreter("note", "group1.mock11").getClassName()); - assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter2", factory.getInterpreter("note", "group2.mock2").getClassName()); + assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter1", factory.getInterpreter("user", "note", "group1.mock1").getClassName()); + assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter11", factory.getInterpreter("user", "note", "group1.mock11").getClassName()); + assertEquals("org.apache.zeppelin.interpreter.mock.MockInterpreter2", factory.getInterpreter("user", "note", "group2.mock2").getClassName()); factory.closeNote("note"); } @@ -105,12 +105,12 @@ public class NoteInterpreterLoaderTest { assertNull(factory.getInterpreterSettings("noteA").get(0).getInterpreterGroup("shared_process").get("noteA")); assertNull(factory.getInterpreterSettings("noteB").get(0).getInterpreterGroup("shared_process").get("noteB")); - factory.getInterpreter("noteA", null).open(); - factory.getInterpreter("noteB", null).open(); + factory.getInterpreter("user", "noteA", null).open(); + factory.getInterpreter("user", "noteB", null).open(); assertTrue( - factory.getInterpreter("noteA", null).getInterpreterGroup().getId().equals( - factory.getInterpreter("noteB", null).getInterpreterGroup().getId())); + factory.getInterpreter("user", "noteA", null).getInterpreterGroup().getId().equals( + factory.getInterpreter("user", "noteB", null).getInterpreterGroup().getId())); // interpreters are created after accessing it assertNotNull(factory.getInterpreterSettings("noteA").get(0).getInterpreterGroup("shared_process").get("noteA")); @@ -138,13 +138,13 @@ public class NoteInterpreterLoaderTest { assertNull(factory.getInterpreterSettings("noteA").get(0).getInterpreterGroup("noteA").get("noteA")); assertNull(factory.getInterpreterSettings("noteB").get(0).getInterpreterGroup("noteB").get("noteB")); - factory.getInterpreter("noteA", null).open(); - factory.getInterpreter("noteB", null).open(); + factory.getInterpreter("user", "noteA", null).open(); + factory.getInterpreter("user", "noteB", null).open(); // per note interpreter process assertFalse( - factory.getInterpreter("noteA", null).getInterpreterGroup().getId().equals( - factory.getInterpreter("noteB", null).getInterpreterGroup().getId())); + factory.getInterpreter("user", "noteA", null).getInterpreterGroup().getId().equals( + factory.getInterpreter("user", "noteB", null).getInterpreterGroup().getId())); // interpreters are created after accessing it assertNotNull(factory.getInterpreterSettings("noteA").get(0).getInterpreterGroup("noteA").get("noteA")); diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteTest.java index a44bfad478..1be0774c5e 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteTest.java @@ -60,7 +60,7 @@ public class NoteTest { @Test public void runNormalTest() { - when(interpreterFactory.getInterpreter(anyString(), eq("spark"))).thenReturn(interpreter); + when(interpreterFactory.getInterpreter(anyString(), anyString(), eq("spark"))).thenReturn(interpreter); when(interpreter.getScheduler()).thenReturn(scheduler); String pText = "%spark sc.version"; @@ -72,7 +72,7 @@ public class NoteTest { ArgumentCaptor pCaptor = ArgumentCaptor.forClass(Paragraph.class); verify(scheduler, only()).submit(pCaptor.capture()); - verify(interpreterFactory, only()).getInterpreter(anyString(), eq("spark")); + verify(interpreterFactory, only()).getInterpreter(anyString(), anyString(), eq("spark")); assertEquals("Paragraph text", pText, pCaptor.getValue().getText()); } diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java index 86d6c06f55..39eab5c28d 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java @@ -341,11 +341,11 @@ public class NotebookTest implements JobListenerFactory{ MockInterpreter1 mock1 = ((MockInterpreter1) (((ClassloaderInterpreter) - ((LazyOpenInterpreter) factory.getInterpreter(note.getId(), "mock1")).getInnerInterpreter()) + ((LazyOpenInterpreter) factory.getInterpreter("user", note.getId(), "mock1")).getInnerInterpreter()) .getInnerInterpreter())); MockInterpreter2 mock2 = ((MockInterpreter2) (((ClassloaderInterpreter) - ((LazyOpenInterpreter) factory.getInterpreter(note.getId(), "mock2")).getInnerInterpreter()) + ((LazyOpenInterpreter) factory.getInterpreter("user", note.getId(), "mock2")).getInnerInterpreter()) .getInnerInterpreter())); // wait until interpreters are started diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/ParagraphTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/ParagraphTest.java index 668914ae38..da7752c719 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/ParagraphTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/ParagraphTest.java @@ -73,6 +73,32 @@ public class ParagraphTest { assertEquals("md", Paragraph.getRequiredReplName(text)); } + @Test + public void effectiveTextTest() { + InterpreterFactory interpreterFactory = mock(InterpreterFactory.class); + Interpreter interpreter = mock(Interpreter.class); + Note note = mock(Note.class); + + Paragraph p = new Paragraph("paragraph", note, null, interpreterFactory); + p.setText("%h2 show databases"); + p.setEffectiveText("%jdbc(h2) show databases"); + assertEquals("Get right replName", "jdbc", p.getRequiredReplName()); + assertEquals("Get right scriptBody", "(h2) show databases", p.getScriptBody()); + + when(interpreterFactory.getInterpreter(anyString(), anyString(), eq("jdbc"))).thenReturn(interpreter); + when(interpreter.getFormType()).thenReturn(Interpreter.FormType.NATIVE); + when(note.getId()).thenReturn("noteId"); + + try { + p.jobRun(); + } catch (Throwable throwable) { + // Do nothing + } + + assertEquals("Erase effective Text", "h2", p.getRequiredReplName()); + assertEquals("Erase effective Text", "show databases", p.getScriptBody()); + } + @Test public void should_extract_variable_from_angular_object_registry() throws Exception { //Given