From b5424b99988cc4e87bbb24252b383cb43268a756 Mon Sep 17 00:00:00 2001 From: Tinkoff DWH Date: Wed, 22 Feb 2017 14:53:43 +0500 Subject: [PATCH 1/7] [ZEPPELIN-1999] get interpreter property with replaced context parameters --- .gitignore | 2 + .../zeppelin/interpreter/Interpreter.java | 40 ++++++++++++++++++- .../zeppelin/interpreter/InterpreterTest.java | 36 ++++++++++++++++- 3 files changed, 75 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 8db42917c06..f0439422e1d 100644 --- a/.gitignore +++ b/.gitignore @@ -95,6 +95,8 @@ Thumbs.db # intelliJ IDEA project files .idea/ *.iml +*.iws +*.ipr # maven target files target/ 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 6a9cc2c25e8..0ad049a8fe5 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 @@ -18,15 +18,19 @@ package org.apache.zeppelin.interpreter; +import java.lang.reflect.Field; import java.net.URL; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; -import org.apache.zeppelin.annotation.ZeppelinApi; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.reflect.FieldUtils; import org.apache.zeppelin.annotation.Experimental; +import org.apache.zeppelin.annotation.ZeppelinApi; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.scheduler.Scheduler; import org.apache.zeppelin.scheduler.SchedulerFactory; @@ -157,6 +161,8 @@ public Properties getProperty() { } } + replaceContextParameters(p); + return p; } @@ -296,6 +302,38 @@ public Interpreter getInterpreterInTheSameSessionByClassName(String className) { return null; } + /** + * Replace markers #{contextFieldName} by values from {@link InterpreterContext} fields + * with same name and marker #{user}. If value == null then replace by empty string. + */ + private void replaceContextParameters(Properties properties) { + InterpreterContext interpreterContext = InterpreterContext.get(); + if (interpreterContext != null) { + String markerTemplate = "#\\{%s\\}"; + List typesToProcess = Arrays.asList(String.class, Double.class, Float.class, Short.class, + Byte.class, Character.class, Boolean.class, Integer.class, Long.class); + for (String key : properties.stringPropertyNames()) { + String p = properties.getProperty(key); + if (StringUtils.isNotEmpty(p)) { + for (Field field : InterpreterContext.class.getDeclaredFields()) { + Class clazz = field.getType(); + if (typesToProcess.contains(clazz) || clazz.isPrimitive()) { + try { + Object value = FieldUtils.readField(field, interpreterContext, true); + p = p.replaceAll(String.format(markerTemplate, field.getName()), + value != null ? value.toString() : StringUtils.EMPTY); + } catch (Exception e) { + logger.error("Cannot replace context parameter", e); + } + } + } + p = p.replaceAll(String.format(markerTemplate, "user"), + StringUtils.defaultString(userName, StringUtils.EMPTY)); + properties.setProperty(key, p); + } + } + } + } /** * Type of interpreter. diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterTest.java index e10bb3217a5..81f01d167d4 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterTest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterTest.java @@ -17,13 +17,14 @@ package org.apache.zeppelin.interpreter; -import static org.junit.Assert.assertEquals; - import java.util.Properties; import org.apache.zeppelin.interpreter.remote.mock.MockInterpreterA; +import org.apache.zeppelin.user.AuthenticationInfo; import org.junit.Test; +import static org.junit.Assert.assertEquals; + public class InterpreterTest { @Test @@ -60,4 +61,35 @@ public void testAdditionalProperty() { assertEquals("v2", intp.getProperty("p2")); } + @Test + public void testPropertyWithReplacedContextFields() { + String noteId = "testNoteId"; + String paragraphTitle = "testParagraphTitle"; + String user = "username"; + InterpreterContext.set(new InterpreterContext(noteId, + null, + null, + paragraphTitle, + null, + new AuthenticationInfo("testUser", "testTicket"), + null, + null, + null, + null, + null, + null)); + Properties p = new Properties(); + p.put("p1", "paragraphTitle #{noteId}, #{paragraphTitle}, #{replName}, #{noteId}, #{user}," + + " #{authenticationInfo}"); + MockInterpreterA intp = new MockInterpreterA(p); + intp.setUserName(user); + String actual = intp.getProperty("p1"); + InterpreterContext.remove(); + + assertEquals( + String.format("paragraphTitle %s, %s, , %s, %s, #{authenticationInfo}", noteId, + paragraphTitle, noteId, user), + actual + ); + } } From ea9c6a37fd50116e966576eab3a52cf7c2bf07ab Mon Sep 17 00:00:00 2001 From: Tinkoff DWH Date: Wed, 1 Mar 2017 12:24:01 +0500 Subject: [PATCH 2/7] [ZEPPELIN-1999] docs --- ...erpreter_setting_with_context_parameters.png | Bin 0 -> 17521 bytes docs/manual/interpreters.md | 8 +++++++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 docs/assets/themes/zeppelin/img/screenshots/interpreter_setting_with_context_parameters.png diff --git a/docs/assets/themes/zeppelin/img/screenshots/interpreter_setting_with_context_parameters.png b/docs/assets/themes/zeppelin/img/screenshots/interpreter_setting_with_context_parameters.png new file mode 100644 index 0000000000000000000000000000000000000000..815877c60f2520f5b9d25b0085eb0fc5f1f3645f GIT binary patch literal 17521 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 NR#1~KefH-4{{kv45f=ae literal 0 HcmV?d00001 diff --git a/docs/manual/interpreters.md b/docs/manual/interpreters.md index 70b94d42bca..aae0410045d 100644 --- a/docs/manual/interpreters.md +++ b/docs/manual/interpreters.md @@ -41,7 +41,13 @@ Zeppelin interpreter setting is the configuration of a given interpreter on Zepp -Properties are exported as environment variable when property name is consisted of upper characters, numbers and underscore ([A-Z_0-9]). Otherwise set properties as JVM property. +Properties are exported as environment variable when property name is consisted of upper characters, numbers and underscore ([A-Z_0-9]). Otherwise set properties as JVM property. +You may use parameters from the context of interpreter by add #{contextParameterName} in value, parameter can be of the following types: string, number, boolean. The list of available context parameters can be viewed in the class [InterpreterContext.java](https://github.com/apache/zeppelin/blob/master/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java) + parameter #{user}. +If context parameter is null then replaced by empty string. + + + + Each notebook can be bound to multiple Interpreter Settings using setting icon on upper right corner of the notebook. From a10dc0ea673d42fdcd47d022c3e579e3f7a2b398 Mon Sep 17 00:00:00 2001 From: Tinkoff DWH Date: Thu, 2 Mar 2017 18:23:22 +0500 Subject: [PATCH 3/7] [ZEPPELIN-1999] skip fields of paragraph --- ...preter_setting_with_context_parameters.png | Bin 17521 -> 17290 bytes docs/manual/interpreters.md | 2 +- .../zeppelin/interpreter/Interpreter.java | 4 +++- .../zeppelin/interpreter/InterpreterTest.java | 12 +++++++----- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/docs/assets/themes/zeppelin/img/screenshots/interpreter_setting_with_context_parameters.png b/docs/assets/themes/zeppelin/img/screenshots/interpreter_setting_with_context_parameters.png index 815877c60f2520f5b9d25b0085eb0fc5f1f3645f..17c83b6c6e98938aaf35a1b80df4a057671bd42d 100644 GIT binary patch literal 17290 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 NR#1~KefH-4{{kv45f=ae diff --git a/docs/manual/interpreters.md b/docs/manual/interpreters.md index aae0410045d..8fea8178848 100644 --- a/docs/manual/interpreters.md +++ b/docs/manual/interpreters.md @@ -42,7 +42,7 @@ Zeppelin interpreter setting is the configuration of a given interpreter on Zepp Properties are exported as environment variable when property name is consisted of upper characters, numbers and underscore ([A-Z_0-9]). Otherwise set properties as JVM property. -You may use parameters from the context of interpreter by add #{contextParameterName} in value, parameter can be of the following types: string, number, boolean. The list of available context parameters can be viewed in the class [InterpreterContext.java](https://github.com/apache/zeppelin/blob/master/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java) + parameter #{user}. +You may use parameters from the context of interpreter by add #{contextParameterName} (except fields of paragraph) in value, parameter can be of the following types: string, number, boolean. The list of available context parameters can be viewed in the class [InterpreterContext.java](https://github.com/apache/zeppelin/blob/master/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java) + parameter #{user}. If context parameter is null then replaced by empty string. 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 bb2dd7ccecf..20263ebb329 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 @@ -310,6 +310,7 @@ private void replaceContextParameters(Properties properties) { InterpreterContext interpreterContext = InterpreterContext.get(); if (interpreterContext != null) { String markerTemplate = "#\\{%s\\}"; + List skipFields = Arrays.asList("paragraphTitle", "paragraphId", "paragraphText"); List typesToProcess = Arrays.asList(String.class, Double.class, Float.class, Short.class, Byte.class, Character.class, Boolean.class, Integer.class, Long.class); for (String key : properties.stringPropertyNames()) { @@ -317,7 +318,8 @@ private void replaceContextParameters(Properties properties) { if (StringUtils.isNotEmpty(p)) { for (Field field : InterpreterContext.class.getDeclaredFields()) { Class clazz = field.getType(); - if (typesToProcess.contains(clazz) || clazz.isPrimitive()) { + if (!skipFields.contains(field.getName()) && (typesToProcess.contains(clazz) + || clazz.isPrimitive())) { try { Object value = FieldUtils.readField(field, interpreterContext, true); p = p.replaceAll(String.format(markerTemplate, field.getName()), diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterTest.java index 0fab9c9e327..a9ac1fc2686 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterTest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterTest.java @@ -56,12 +56,14 @@ public void testOverriddenProperty() { public void testPropertyWithReplacedContextFields() { String noteId = "testNoteId"; String paragraphTitle = "testParagraphTitle"; + String paragraphText = "testParagraphText"; + String paragraphId = "testParagraphId"; String user = "username"; InterpreterContext.set(new InterpreterContext(noteId, - null, + paragraphId, null, paragraphTitle, - null, + paragraphText, new AuthenticationInfo("testUser", "testTicket"), null, null, @@ -70,7 +72,7 @@ public void testPropertyWithReplacedContextFields() { null, null)); Properties p = new Properties(); - p.put("p1", "paragraphTitle #{noteId}, #{paragraphTitle}, #{replName}, #{noteId}, #{user}," + + p.put("p1", "replName #{noteId}, #{paragraphTitle}, #{paragraphId}, #{paragraphText}, #{replName}, #{noteId}, #{user}," + " #{authenticationInfo}"); MockInterpreterA intp = new MockInterpreterA(p); intp.setUserName(user); @@ -78,8 +80,8 @@ public void testPropertyWithReplacedContextFields() { InterpreterContext.remove(); assertEquals( - String.format("paragraphTitle %s, %s, , %s, %s, #{authenticationInfo}", noteId, - paragraphTitle, noteId, user), + String.format("replName %s, #{paragraphTitle}, #{paragraphId}, #{paragraphText}, , %s, %s, #{authenticationInfo}", noteId, + noteId, user), actual ); } From 61ac564199ad2f6026c29c6ab70e4ceb02b0da47 Mon Sep 17 00:00:00 2001 From: Tinkoff DWH Date: Mon, 13 Mar 2017 00:58:46 +0500 Subject: [PATCH 4/7] [ZEPPELIN-1999] docs --- docs/manual/interpreters.md | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/docs/manual/interpreters.md b/docs/manual/interpreters.md index 8fea8178848..711ae922625 100644 --- a/docs/manual/interpreters.md +++ b/docs/manual/interpreters.md @@ -42,13 +42,44 @@ Zeppelin interpreter setting is the configuration of a given interpreter on Zepp Properties are exported as environment variable when property name is consisted of upper characters, numbers and underscore ([A-Z_0-9]). Otherwise set properties as JVM property. -You may use parameters from the context of interpreter by add #{contextParameterName} (except fields of paragraph) in value, parameter can be of the following types: string, number, boolean. The list of available context parameters can be viewed in the class [InterpreterContext.java](https://github.com/apache/zeppelin/blob/master/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java) + parameter #{user}. + +You may use parameters from the context of interpreter by add #{contextParameterName} (except fields of paragraph) in value, parameter can be of the following types: string, number, boolean. + +###### Context parameters + + + + + + + + + + + + + + + + + + + + + +
NameType
userstring
noteIdstring
replNamestring
classNamestring
+ If context parameter is null then replaced by empty string. - +###### Usage +For example in database exist user `user1` with some password and exists user with same name into Zeppelin. Configure the jdbc interpreter (postgres), set `default.user = #{user}`. +1. Sign in (as `user1`) +2. Open interpreter +3. Execute `select current_user` +
Each notebook can be bound to multiple Interpreter Settings using setting icon on upper right corner of the notebook. From c0110e96d773a63141c887131f3e7473c607a68b Mon Sep 17 00:00:00 2001 From: Tinkoff DWH Date: Sun, 19 Mar 2017 19:06:10 +0500 Subject: [PATCH 5/7] [ZEPPELIN-1999] documentation --- docs/manual/interpreters.md | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/docs/manual/interpreters.md b/docs/manual/interpreters.md index 711ae922625..916d5911a39 100644 --- a/docs/manual/interpreters.md +++ b/docs/manual/interpreters.md @@ -41,9 +41,9 @@ Zeppelin interpreter setting is the configuration of a given interpreter on Zepp -Properties are exported as environment variable when property name is consisted of upper characters, numbers and underscore ([A-Z_0-9]). Otherwise set properties as JVM property. +Properties are exported as environment variables when property name is consisted of upper characters, numbers and underscore ([A-Z_0-9]). Otherwise set properties as JVM property. -You may use parameters from the context of interpreter by add #{contextParameterName} (except fields of paragraph) in value, parameter can be of the following types: string, number, boolean. +You may use parameters from the context of interpreter by add #{contextParameterName} in value, parameter can be of the following types: string, number, boolean. ###### Context parameters @@ -71,13 +71,7 @@ You may use parameters from the context of interpreter by add #{contextParameter If context parameter is null then replaced by empty string. - - -###### Usage -For example in database exist user `user1` with some password and exists user with same name into Zeppelin. Configure the jdbc interpreter (postgres), set `default.user = #{user}`. -1. Sign in (as `user1`) -2. Open interpreter -3. Execute `select current_user` +
Each notebook can be bound to multiple Interpreter Settings using setting icon on upper right corner of the notebook. From be4fada31f433499f0f3e089637b4eaa8f35f1ba Mon Sep 17 00:00:00 2001 From: Tinkoff DWH Date: Mon, 20 Mar 2017 09:28:06 +0500 Subject: [PATCH 6/7] [ZEPPELIN-1999] revert gitignore --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index f0439422e1d..8db42917c06 100644 --- a/.gitignore +++ b/.gitignore @@ -95,8 +95,6 @@ Thumbs.db # intelliJ IDEA project files .idea/ *.iml -*.iws -*.ipr # maven target files target/ From fa1500aabc7ed6927edb1df2efcf286139ce5e03 Mon Sep 17 00:00:00 2001 From: Tinkoff DWH Date: Wed, 22 Mar 2017 14:20:38 +0500 Subject: [PATCH 7/7] [ZEPPELIN-1999] fix logic of replace --- .../org/apache/zeppelin/interpreter/Interpreter.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 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 20263ebb329..b64530a1af8 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 @@ -320,13 +320,14 @@ private void replaceContextParameters(Properties properties) { Class clazz = field.getType(); if (!skipFields.contains(field.getName()) && (typesToProcess.contains(clazz) || clazz.isPrimitive())) { + Object value = null; try { - Object value = FieldUtils.readField(field, interpreterContext, true); - p = p.replaceAll(String.format(markerTemplate, field.getName()), - value != null ? value.toString() : StringUtils.EMPTY); + value = FieldUtils.readField(field, interpreterContext, true); } catch (Exception e) { - logger.error("Cannot replace context parameter", e); + logger.error("Cannot read value of field {0}", field.getName()); } + p = p.replaceAll(String.format(markerTemplate, field.getName()), + value != null ? value.toString() : StringUtils.EMPTY); } } p = p.replaceAll(String.format(markerTemplate, "user"),