[ZEPPELIN-1363] Note level dynamic form ### What is this PR for? Added dynamic forms for Note. All paragraphs has access to note forms.
### What type of PR is it? [Feature] ### What is the Jira issue? https://issues.apache.org/jira/browse/ZEPPELIN-1363 ### How should this be tested? Create global interpreter JDBC and Spark. Create note with 2 paragraphs ``` %pyspark print("Textbox paragraph " + z.textbox('input', 'default')) print("Textbox note " + z.noteTextbox('note_input', 'default_note')) print("Select paragraph " + z.select("sel", [("1","opt1"), ("2","opt2"), ("3","opt3")])) print("Select note " + z.noteSelect("sel_note", [("1","noteOpt1"), ("2","noteOpt2"), ("3","noteOpt3")])) options = [("key1","Name1"), ("key2","Name2")] print("Checkbox paragraph "+ " and ".join(z.checkbox("chk", options, ["key1"]))) print("Checkbox note "+ " and ".join(z.noteCheckbox("chk_note", options, ["key1","key2"]))) ``` ``` %jdbc select '$${checkbox:chk_note=key1|key2,key1|key2} $${note_input} ${note_input=sameName}' ``` ### Screenshots (if appropriate) 1) native forms  2) remove  3) simple forms  ### Questions: * Does the licenses files need update? no * Is there breaking changes for older versions? no * Does this needs documentation? no Author: tinkoff-dwh <[email protected]> Closes #2641 from tinkoff-dwh/ZEPPELIN-1363 and squashes the following commits: 3ee4826 [tinkoff-dwh] [ZEPPELIN-1363] autosave textbox f30033a [tinkoff-dwh] Merge remote-tracking branch 'upstream/master' into ZEPPELIN-1363 29eaca2 [tinkoff-dwh] [ZEPPELIN-1363] fix tests bf8194e [tinkoff-dwh] Merge remote-tracking branch 'upstream/master' into ZEPPELIN-1363 9b2f3e9 [tinkoff-dwh] [ZEPPELIN-1363] button to remove form c566462 [tinkoff-dwh] [ZEPPELIN-1363] note dynamic forms (simple; native: spark, python) Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/50cfabdf Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/50cfabdf Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/50cfabdf Branch: refs/heads/master Commit: 50cfabdf9b4a55e1bb964376eb5eca22f6046913 Parents: 2a33fd3 Author: tinkoff-dwh <[email protected]> Authored: Tue Nov 7 21:33:58 2017 +0500 Committer: Lee moon soo <[email protected]> Committed: Sat Nov 18 12:53:33 2017 -0800 ---------------------------------------------------------------------- docs/usage/dynamic_form/intro.md | 43 ++++- .../ElasticsearchInterpreterTest.java | 4 +- .../zeppelin/flink/FlinkInterpreterTest.java | 2 +- .../zeppelin/ignite/IgniteInterpreterTest.java | 2 +- .../ignite/IgniteSqlInterpreterTest.java | 2 +- .../zeppelin/jdbc/JDBCInterpreterTest.java | 12 +- .../apache/zeppelin/livy/LivyInterpreterIT.java | 20 +-- .../graph/neo4j/Neo4jCypherInterpreterTest.java | 1 + .../zeppelin/pig/PigInterpreterSparkTest.java | 4 +- .../apache/zeppelin/pig/PigInterpreterTest.java | 4 +- .../zeppelin/pig/PigInterpreterTezTest.java | 4 +- .../zeppelin/pig/PigQueryInterpreterTest.java | 4 +- .../zeppelin/python/IPythonInterpreter.java | 1 + .../zeppelin/python/PythonInterpreter.java | 12 +- .../resources/grpc/python/zeppelin_python.py | 33 ++-- .../main/resources/python/zeppelin_python.py | 35 ++-- .../zeppelin/python/IPythonInterpreterTest.java | 1 + .../python/PythonCondaInterpreterTest.java | 1 + .../python/PythonDockerInterpreterTest.java | 1 + .../python/PythonInterpreterMatplotlibTest.java | 1 + .../python/PythonInterpreterPandasSqlTest.java | 1 + .../zeppelin/python/PythonInterpreterTest.java | 1 + .../scalding/ScaldingInterpreterTest.java | 2 +- .../zeppelin/scio/ScioInterpreterTest.java | 1 + .../zeppelin/shell/ShellInterpreterTest.java | 3 +- .../zeppelin/spark/PySparkInterpreter.java | 1 + .../apache/zeppelin/spark/SparkInterpreter.java | 1 + .../zeppelin/spark/SparkZeppelinContext.java | 42 ++++- .../main/resources/python/zeppelin_pyspark.py | 40 +++-- .../zeppelin/spark/DepInterpreterTest.java | 2 +- .../zeppelin/spark/IPySparkInterpreterTest.java | 1 + .../spark/PySparkInterpreterMatplotlibTest.java | 1 + .../zeppelin/spark/PySparkInterpreterTest.java | 1 + .../zeppelin/spark/SparkInterpreterTest.java | 2 + .../zeppelin/spark/SparkSqlInterpreterTest.java | 2 +- .../angular/AbstractAngularElemTest.scala | 2 +- .../angular/AbstractAngularModelTest.scala | 2 +- .../java/org/apache/zeppelin/display/Input.java | 25 ++- .../interpreter/BaseZeppelinContext.java | 94 +++++++++-- .../interpreter/InterpreterContext.java | 13 +- .../remote/RemoteInterpreterServer.java | 9 +- .../interpreter/thrift/CallbackInfo.java | 2 +- .../thrift/InterpreterCompletion.java | 2 +- .../thrift/RemoteApplicationResult.java | 2 +- .../RemoteInterpreterCallbackService.java | 2 +- .../thrift/RemoteInterpreterContext.java | 121 +++++++++++++- .../thrift/RemoteInterpreterEvent.java | 2 +- .../thrift/RemoteInterpreterResult.java | 115 ++++++++++++- .../thrift/RemoteInterpreterResultMessage.java | 2 +- .../thrift/RemoteInterpreterService.java | 2 +- .../ZeppelinServerResourceParagraphRunner.java | 2 +- .../main/thrift/RemoteInterpreterService.thrift | 4 +- .../org/apache/zeppelin/display/InputTest.java | 18 +-- .../interpreter/InterpreterContextTest.java | 2 +- .../zeppelin/interpreter/InterpreterTest.java | 1 + .../interpreter/LazyOpenInterpreterTest.java | 2 +- .../apache/zeppelin/socket/NotebookServer.java | 63 +++++++- .../org/apache/zeppelin/AbstractZeppelinIT.java | 4 + .../integration/ParagraphActionsIT.java | 160 +++++++++++++++++++ .../notebook/dynamic-forms/dynamic-forms.css | 24 +++ .../dynamic-forms/dynamic-forms.directive.html | 86 ++++++++++ .../dynamic-forms/dynamic-forms.directive.js | 62 +++++++ .../src/app/notebook/notebook.controller.js | 23 +++ zeppelin-web/src/app/notebook/notebook.html | 17 ++ .../paragraph-parameterized-query-form.html | 71 -------- .../notebook/paragraph/paragraph.controller.js | 22 +-- .../paragraph/paragraph.controller.test.js | 2 +- .../src/app/notebook/paragraph/paragraph.css | 22 --- .../src/app/notebook/paragraph/paragraph.html | 11 +- .../websocket/websocket-event.factory.js | 2 + .../websocket/websocket-message.service.js | 18 +++ zeppelin-web/src/index.js | 1 + .../interpreter/remote/RemoteInterpreter.java | 7 +- .../java/org/apache/zeppelin/notebook/Note.java | 19 +++ .../org/apache/zeppelin/notebook/Paragraph.java | 45 ++++-- .../zeppelin/notebook/socket/Message.java | 6 +- .../lifecycle/TimeoutLifecycleManagerTest.java | 4 +- .../remote/RemoteAngularObjectTest.java | 1 + .../RemoteInterpreterOutputTestStream.java | 1 + .../remote/RemoteInterpreterTest.java | 22 +-- .../resource/DistributedResourcePoolTest.java | 1 + .../zeppelin/scheduler/RemoteSchedulerTest.java | 3 + 82 files changed, 1131 insertions(+), 278 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/docs/usage/dynamic_form/intro.md ---------------------------------------------------------------------- diff --git a/docs/usage/dynamic_form/intro.md b/docs/usage/dynamic_form/intro.md index 7e4f1d4..1da5876 100644 --- a/docs/usage/dynamic_form/intro.md +++ b/docs/usage/dynamic_form/intro.md @@ -24,9 +24,10 @@ limitations under the License. <div id="toc"></div> Apache Zeppelin dynamically creates input forms. Depending on language backend, there're two different ways to create dynamic form. -Custom language backend can select which type of form creation it wants to use. +Custom language backend can select which type of form creation it wants to use. Forms can have different scope (paragraph or note). +Forms with scope "note" available in all paragraphs regardless of which paragraph has code to create these forms. -## Using form Templates +## Using form Templates (scope: paragraph) This mode creates form using simple template language. It's simple and easy to use. For example Markdown, Shell, Spark SQL language backend uses it. @@ -81,7 +82,11 @@ Even if you uncheck this option, still you can run it by pressing `Enter`. <img src="{{BASE_PATH}}/assets/themes/zeppelin/img/screenshots/selectForm-checkbox.png" /> -## Creates Programmatically +## Using form Templates (scope: note) + +Has a same syntax but starts with two symbols `$`. (for ex. input `$${forName}`) + +## Creates Programmatically (scope: paragraph) Some language backends can programmatically create forms. For example [ZeppelinContext](../../interpreter/spark.html#zeppelincontext) provides a form creation API @@ -93,7 +98,7 @@ Here are some examples: {% highlight scala %} %spark -println("Hello "+z.input("name")) +println("Hello "+z.textbox("name")) {% endhighlight %} </div> @@ -101,7 +106,7 @@ println("Hello "+z.input("name")) {% highlight python %} %pyspark -print("Hello "+z.input("name")) +print("Hello "+z.textbox("name")) {% endhighlight %} </div> @@ -114,7 +119,7 @@ print("Hello "+z.input("name")) {% highlight scala %} %spark -println("Hello "+z.input("name", "sun")) +println("Hello "+z.textbox("name", "sun")) {% endhighlight %} </div> @@ -122,7 +127,7 @@ println("Hello "+z.input("name", "sun")) {% highlight python %} %pyspark -print("Hello "+z.input("name", "sun")) +print("Hello "+z.textbox("name", "sun")) {% endhighlight %} </div> @@ -184,3 +189,27 @@ print("Hello "+ " and ".join(z.checkbox("fruit", options, ["apple"]))) </div> </div> <img src="{{BASE_PATH}}/assets/themes/zeppelin/img/screenshots/form_checkbox_prog.png" /> + +## Creates Programmatically (scope: note) + +The difference in the method names: + +<table class="table-configuration"> + <tr> + <th>Scope paragraph</th> + <th>Scope note</th> + </tr> + <tr> + <td>input (or textbox)</td> + <td>noteTextbox</td> + </tr> + <tr> + <td>select</td> + <td>noteSelect</td> + </tr> + <tr> + <td>checkbox</td> + <td>noteCheckbox</td> + </tr> +</table> + http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java ---------------------------------------------------------------------- diff --git a/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java b/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java index 4679f29..64562b1 100644 --- a/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java +++ b/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java @@ -164,8 +164,8 @@ public class ElasticsearchInterpreterTest { private InterpreterContext buildContext(String noteAndParagraphId) { final AngularObjectRegistry angularObjReg = new AngularObjectRegistry("elasticsearch", null); - return new InterpreterContext(noteAndParagraphId, noteAndParagraphId, null, null, null, null, null, - null, angularObjReg , null, null, null); + return new InterpreterContext(noteAndParagraphId, noteAndParagraphId, null, null, null, null, + null, null, null, angularObjReg , null, null, null); } @Theory http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java ---------------------------------------------------------------------- diff --git a/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java b/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java index d443508..c9cb1f6 100644 --- a/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java +++ b/flink/src/test/java/org/apache/zeppelin/flink/FlinkInterpreterTest.java @@ -40,7 +40,7 @@ public class FlinkInterpreterTest { Properties p = new Properties(); flink = new FlinkInterpreter(p); flink.open(); - context = new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null); + context = new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null, null); } @AfterClass http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java ---------------------------------------------------------------------- diff --git a/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java b/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java index 9cb5eaf..e8f2265 100644 --- a/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java +++ b/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteInterpreterTest.java @@ -40,7 +40,7 @@ public class IgniteInterpreterTest { private static final String HOST = "127.0.0.1:47500..47509"; private static final InterpreterContext INTP_CONTEXT = - new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null); + new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null, null); private IgniteInterpreter intp; private Ignite ignite; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteSqlInterpreterTest.java ---------------------------------------------------------------------- diff --git a/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteSqlInterpreterTest.java b/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteSqlInterpreterTest.java index a6ae0ea..4cb2cbb 100644 --- a/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteSqlInterpreterTest.java +++ b/ignite/src/test/java/org/apache/zeppelin/ignite/IgniteSqlInterpreterTest.java @@ -44,7 +44,7 @@ public class IgniteSqlInterpreterTest { private static final String HOST = "127.0.0.1:47500..47509"; private static final InterpreterContext INTP_CONTEXT = - new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null); + new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null, null); private Ignite ignite; private IgniteSqlInterpreter intp; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java ---------------------------------------------------------------------- diff --git a/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java b/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java index 1b3f045..6441267 100644 --- a/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java +++ b/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java @@ -91,8 +91,8 @@ public class JDBCInterpreterTest extends BasicJDBCTestCaseAdapter { PreparedStatement insertStatement = connection.prepareStatement("insert into test_table(id, name) values ('a', 'a_name'),('b', 'b_name'),('c', ?);"); insertStatement.setString(1, null); insertStatement.execute(); - interpreterContext = new InterpreterContext("", "1", null, "", "", new AuthenticationInfo("testUser"), null, null, null, null, - null, null); + interpreterContext = new InterpreterContext("", "1", null, "", "", + new AuthenticationInfo("testUser"), null, null, null,null, null, null, null); } @@ -418,7 +418,7 @@ public class JDBCInterpreterTest extends BasicJDBCTestCaseAdapter { // user1 runs jdbc1 jdbc1.open(); InterpreterContext ctx1 = new InterpreterContext("", "1", "jdbc1", "", "", user1Credential, - null, null, null, null, null, null); + null, null, null, null, null, null, null); jdbc1.interpret("", ctx1); JDBCUserConfigurations user1JDBC1Conf = jdbc1.getJDBCConfiguration("user1"); @@ -429,7 +429,7 @@ public class JDBCInterpreterTest extends BasicJDBCTestCaseAdapter { // user1 runs jdbc2 jdbc2.open(); InterpreterContext ctx2 = new InterpreterContext("", "1", "jdbc2", "", "", user1Credential, - null, null, null, null, null, null); + null, null, null, null, null, null, null); jdbc2.interpret("", ctx2); JDBCUserConfigurations user1JDBC2Conf = jdbc2.getJDBCConfiguration("user1"); @@ -440,7 +440,7 @@ public class JDBCInterpreterTest extends BasicJDBCTestCaseAdapter { // user2 runs jdbc1 jdbc1.open(); InterpreterContext ctx3 = new InterpreterContext("", "1", "jdbc1", "", "", user2Credential, - null, null, null, null, null, null); + null, null, null, null, null, null, null); jdbc1.interpret("", ctx3); JDBCUserConfigurations user2JDBC1Conf = jdbc1.getJDBCConfiguration("user2"); @@ -451,7 +451,7 @@ public class JDBCInterpreterTest extends BasicJDBCTestCaseAdapter { // user2 runs jdbc2 jdbc2.open(); InterpreterContext ctx4 = new InterpreterContext("", "1", "jdbc2", "", "", user2Credential, - null, null, null, null, null, null); + null, null, null, null, null, null, null); jdbc2.interpret("", ctx4); JDBCUserConfigurations user2JDBC2Conf = jdbc2.getJDBCConfiguration("user2"); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/livy/src/test/java/org/apache/zeppelin/livy/LivyInterpreterIT.java ---------------------------------------------------------------------- diff --git a/livy/src/test/java/org/apache/zeppelin/livy/LivyInterpreterIT.java b/livy/src/test/java/org/apache/zeppelin/livy/LivyInterpreterIT.java index d413134..ef3eabe 100644 --- a/livy/src/test/java/org/apache/zeppelin/livy/LivyInterpreterIT.java +++ b/livy/src/test/java/org/apache/zeppelin/livy/LivyInterpreterIT.java @@ -90,7 +90,7 @@ public class LivyInterpreterIT { MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener(); InterpreterOutput output = new InterpreterOutput(outputListener); final InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.spark", - "title", "text", authInfo, null, null, null, null, null, output); + "title", "text", authInfo, null, null, null, null, null, null, output); sparkInterpreter.open(); try { @@ -211,7 +211,7 @@ public class LivyInterpreterIT { MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener(); InterpreterOutput output = new InterpreterOutput(outputListener); InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.spark", - "title", "text", authInfo, null, null, null, null, null, output); + "title", "text", authInfo, null, null, null, null, null, null, output); sparkInterpreter.open(); LivySparkSQLInterpreter sqlInterpreter = new LivySparkSQLInterpreter(properties); @@ -307,7 +307,7 @@ public class LivyInterpreterIT { MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener(); InterpreterOutput output = new InterpreterOutput(outputListener); InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.sql", - "title", "text", authInfo, null, null, null, null, null, output); + "title", "text", authInfo, null, null, null, null, null, null, output); InterpreterResult result = sqlInterpreter.interpret("show tables", context); assertEquals(InterpreterResult.Code.SUCCESS, result.code()); assertEquals(InterpreterResult.Type.TABLE, result.message().get(0).getType()); @@ -334,7 +334,7 @@ public class LivyInterpreterIT { MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener(); InterpreterOutput output = new InterpreterOutput(outputListener); final InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.spark", - "title", "text", authInfo, null, null, null, null, null, output); + "title", "text", authInfo, null, null, null, null, null, null, output); sparkInterpreter.open(); final LivySparkSQLInterpreter sqlInterpreter = new LivySparkSQLInterpreter(properties); @@ -415,7 +415,7 @@ public class LivyInterpreterIT { MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener(); InterpreterOutput output = new InterpreterOutput(outputListener); InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.spark", - "title", "text", authInfo, null, null, null, null, null, output); + "title", "text", authInfo, null, null, null, null, null, null, output); sparkInterpreter.open(); LivySparkSQLInterpreter sqlInterpreter = new LivySparkSQLInterpreter(properties); @@ -481,7 +481,7 @@ public class LivyInterpreterIT { MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener(); InterpreterOutput output = new InterpreterOutput(outputListener); InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.spark", - "title", "text", authInfo, null, null, null, null, null, output); + "title", "text", authInfo, null, null, null, null, null, null, output); sparkInterpreter.open(); LivySparkSQLInterpreter sqlInterpreter = new LivySparkSQLInterpreter(newProps); @@ -538,7 +538,7 @@ public class LivyInterpreterIT { MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener(); InterpreterOutput output = new InterpreterOutput(outputListener); final InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.pyspark", - "title", "text", authInfo, null, null, null, null, null, output); + "title", "text", authInfo, null, null, null, null, null, null, output); pysparkInterpreter.open(); // test traceback msg @@ -665,7 +665,7 @@ public class LivyInterpreterIT { MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener(); InterpreterOutput output = new InterpreterOutput(outputListener); InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.spark", - "title", "text", authInfo, null, null, null, null, null, output); + "title", "text", authInfo, null, null, null, null, null, null, output); sparkInterpreter.open(); try { @@ -703,7 +703,7 @@ public class LivyInterpreterIT { MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener(); InterpreterOutput output = new InterpreterOutput(outputListener); final InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.sparkr", - "title", "text", authInfo, null, null, null, null, null, output); + "title", "text", authInfo, null, null, null, null, null, null, output); sparkRInterpreter.open(); try { @@ -780,7 +780,7 @@ public class LivyInterpreterIT { MyInterpreterOutputListener outputListener = new MyInterpreterOutputListener(); InterpreterOutput output = new InterpreterOutput(outputListener); InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "livy.sql", - "title", "text", authInfo, null, null, null, null, null, output); + "title", "text", authInfo, null, null, null, null, null, null, output); String p1 = IOUtils.toString(getClass().getResourceAsStream("/livy_tutorial_1.scala")); InterpreterResult result = sparkInterpreter.interpret(p1, context); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/neo4j/src/test/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreterTest.java ---------------------------------------------------------------------- diff --git a/neo4j/src/test/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreterTest.java b/neo4j/src/test/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreterTest.java index 1bb14b7..9781504 100644 --- a/neo4j/src/test/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreterTest.java +++ b/neo4j/src/test/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreterTest.java @@ -93,6 +93,7 @@ public class Neo4jCypherInterpreterTest { new AuthenticationInfo(), new HashMap<String, Object>(), new GUI(), + new GUI(), new AngularObjectRegistry(new InterpreterGroup().getId(), null), new LocalResourcePool("id"), new LinkedList<InterpreterContextRunner>(), http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterSparkTest.java ---------------------------------------------------------------------- diff --git a/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterSparkTest.java b/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterSparkTest.java index e821bfe..43ade16 100644 --- a/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterSparkTest.java +++ b/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterSparkTest.java @@ -44,8 +44,8 @@ public class PigInterpreterSparkTest { properties.put("zeppelin.pig.includeJobStats", includeJobStats + ""); pigInterpreter = new PigInterpreter(properties); pigInterpreter.open(); - context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null, null, - null, null); + context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null, + null, null, null, null); } @After http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTest.java ---------------------------------------------------------------------- diff --git a/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTest.java b/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTest.java index efcbb58..ac13390 100644 --- a/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTest.java +++ b/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTest.java @@ -47,8 +47,8 @@ public class PigInterpreterTest { properties.put("zeppelin.pig.includeJobStats", includeJobStats + ""); pigInterpreter = new PigInterpreter(properties); pigInterpreter.open(); - context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null, null, - null, null); + context = new InterpreterContext(null, "paragraph_id", null, null, null, + null, null, null, null, null, null,null, null); } @After http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTezTest.java ---------------------------------------------------------------------- diff --git a/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTezTest.java b/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTezTest.java index 964b31c..48f07bf 100644 --- a/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTezTest.java +++ b/pig/src/test/java/org/apache/zeppelin/pig/PigInterpreterTezTest.java @@ -48,8 +48,8 @@ public class PigInterpreterTezTest { properties.put("tez.queue.name", "test"); pigInterpreter = new PigInterpreter(properties); pigInterpreter.open(); - context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null, null, - null, null); + context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null, + null, null, null, null); } @After http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/pig/src/test/java/org/apache/zeppelin/pig/PigQueryInterpreterTest.java ---------------------------------------------------------------------- diff --git a/pig/src/test/java/org/apache/zeppelin/pig/PigQueryInterpreterTest.java b/pig/src/test/java/org/apache/zeppelin/pig/PigQueryInterpreterTest.java index f14cad6..ad395b5 100644 --- a/pig/src/test/java/org/apache/zeppelin/pig/PigQueryInterpreterTest.java +++ b/pig/src/test/java/org/apache/zeppelin/pig/PigQueryInterpreterTest.java @@ -66,8 +66,8 @@ public class PigQueryInterpreterTest { pigInterpreter.open(); pigQueryInterpreter.open(); - context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null, null, - null, null); + context = new InterpreterContext(null, "paragraph_id", null, null, null, null, null, null, null, + null, null, null, null); } @After http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java ---------------------------------------------------------------------- diff --git a/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java b/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java index 77e45b9..2184c1f 100644 --- a/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java +++ b/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java @@ -303,6 +303,7 @@ public class IPythonInterpreter extends Interpreter implements ExecuteResultHand @Override public InterpreterResult interpret(String st, InterpreterContext context) { zeppelinContext.setGui(context.getGui()); + zeppelinContext.setNoteGui(context.getNoteGui()); interpreterOutput.setInterpreterOutput(context.out); ExecuteResponse response = ipythonClient.stream_execute(ExecuteRequest.newBuilder().setCode(st).build(), http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java ---------------------------------------------------------------------- diff --git a/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java b/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java index 4f897c8..051e1fa 100644 --- a/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java +++ b/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java @@ -69,6 +69,7 @@ public class PythonInterpreter extends Interpreter implements ExecuteResultHandl public static final String DEFAULT_ZEPPELIN_PYTHON = "python"; public static final String MAX_RESULT = "zeppelin.python.maxResult"; + private PythonZeppelinContext zeppelinContext; private InterpreterContext context; private Pattern errorInLastLine = Pattern.compile(".*(Error|Exception): .*$"); private String pythonPath; @@ -223,6 +224,9 @@ public class PythonInterpreter extends Interpreter implements ExecuteResultHandl // try IPythonInterpreter first. If it is not available, we will fallback to the original // python interpreter implementation. iPythonInterpreter = getIPythonInterpreter(); + this.zeppelinContext = new PythonZeppelinContext( + getInterpreterGroup().getInterpreterHookRegistry(), + Integer.parseInt(getProperty("zeppelin.python.maxResult", "1000"))); if (getProperty("zeppelin.python.useIPython", "true").equals("true") && iPythonInterpreter.checkIPythonPrerequisite()) { try { @@ -374,12 +378,16 @@ public class PythonInterpreter extends Interpreter implements ExecuteResultHandl if (iPythonInterpreter != null) { return iPythonInterpreter.interpret(cmd, contextInterpreter); } + if (cmd == null || cmd.isEmpty()) { return new InterpreterResult(Code.SUCCESS, ""); } this.context = contextInterpreter; + zeppelinContext.setGui(context.getGui()); + zeppelinContext.setNoteGui(context.getNoteGui()); + if (!pythonscriptRunning) { return new InterpreterResult(Code.ERROR, "python process not running" + outputStream.toString()); @@ -559,8 +567,8 @@ public class PythonInterpreter extends Interpreter implements ExecuteResultHandl } } - public GUI getGui() { - return context.getGui(); + public PythonZeppelinContext getZeppelinContext() { + return zeppelinContext; } String getLocalIp() { http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/main/resources/grpc/python/zeppelin_python.py ---------------------------------------------------------------------- diff --git a/python/src/main/resources/grpc/python/zeppelin_python.py b/python/src/main/resources/grpc/python/zeppelin_python.py index 0f5638f..1a9e8af 100644 --- a/python/src/main/resources/grpc/python/zeppelin_python.py +++ b/python/src/main/resources/grpc/python/zeppelin_python.py @@ -34,26 +34,39 @@ class PyZeppelinContext(object): self.max_result = z.getMaxResult() def input(self, name, defaultValue=""): - return self.z.getGui().input(name, defaultValue) + return self.z.input(name, defaultValue) + + def textbox(self, name, defaultValue=""): + return self.z.textbox(name, defaultValue) + + def noteTextbox(self, name, defaultValue=""): + return self.z.noteTextbox(name, defaultValue) def select(self, name, options, defaultValue=""): - javaOptions = gateway.new_array(self.paramOption, len(options)) - i = 0 - for tuple in options: - javaOptions[i] = self.paramOption(tuple[0], tuple[1]) - i += 1 - return self.z.getGui().select(name, defaultValue, javaOptions) + return self.z.select(name, defaultValue, self.getParamOptions(options)) + + def noteSelect(self, name, options, defaultValue=""): + return self.z.noteSelect(name, defaultValue, self.getParamOptions(options)) def checkbox(self, name, options, defaultChecked=[]): + return self.z.checkbox(name, self.getDefaultChecked(defaultChecked), self.getParamOptions(options)) + + def noteCheckbox(self, name, options, defaultChecked=[]): + return self.z.noteCheckbox(name, self.getDefaultChecked(defaultChecked), self.getParamOptions(options)) + + def getParamOptions(self, options): javaOptions = gateway.new_array(self.paramOption, len(options)) i = 0 for tuple in options: javaOptions[i] = self.paramOption(tuple[0], tuple[1]) i += 1 - javaDefaultCheck = self.javaList() + return javaOptions + + def getDefaultChecked(self, defaultChecked): + javaDefaultChecked = self.javaList() for check in defaultChecked: - javaDefaultCheck.append(check) - return self.z.getGui().checkbox(name, javaDefaultCheck, javaOptions) + javaDefaultChecked.append(check) + return javaDefaultChecked def show(self, p, **kwargs): if type(p).__name__ == "DataFrame": # does not play well with sub-classes http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/main/resources/python/zeppelin_python.py ---------------------------------------------------------------------- diff --git a/python/src/main/resources/python/zeppelin_python.py b/python/src/main/resources/python/zeppelin_python.py index 446201d..519d1af 100644 --- a/python/src/main/resources/python/zeppelin_python.py +++ b/python/src/main/resources/python/zeppelin_python.py @@ -64,26 +64,39 @@ class PyZeppelinContext(object): return self.z.getCurrentInterpreterContext() def input(self, name, defaultValue=""): - return self.z.getGui().input(name, defaultValue) + return self.z.input(name, defaultValue) + + def textbox(self, name, defaultValue=""): + return self.z.textbox(name, defaultValue) + + def noteTextbox(self, name, defaultValue=""): + return self.z.noteTextbox(name, defaultValue) def select(self, name, options, defaultValue=""): - javaOptions = gateway.new_array(self.paramOption, len(options)) - i = 0 - for tuple in options: - javaOptions[i] = self.paramOption(tuple[0], tuple[1]) - i += 1 - return self.z.getGui().select(name, defaultValue, javaOptions) + return self.z.select(name, defaultValue, self.getParamOptions(options)) + + def noteSelect(self, name, options, defaultValue=""): + return self.z.noteSelect(name, defaultValue, self.getParamOptions(options)) def checkbox(self, name, options, defaultChecked=[]): + return self.z.checkbox(name, self.getDefaultChecked(defaultChecked), self.getParamOptions(options)) + + def noteCheckbox(self, name, options, defaultChecked=[]): + return self.z.noteCheckbox(name, self.getDefaultChecked(defaultChecked), self.getParamOptions(options)) + + def getParamOptions(self, options): javaOptions = gateway.new_array(self.paramOption, len(options)) i = 0 for tuple in options: javaOptions[i] = self.paramOption(tuple[0], tuple[1]) i += 1 - javaDefaultCheck = self.javaList() + return javaOptions + + def getDefaultChecked(self, defaultChecked): + javaDefaultChecked = self.javaList() for check in defaultChecked: - javaDefaultCheck.append(check) - return self.z.getGui().checkbox(name, javaDefaultCheck, javaOptions) + javaDefaultChecked.append(check) + return javaDefaultChecked def show(self, p, **kwargs): if hasattr(p, '__name__') and p.__name__ == "matplotlib.pyplot": @@ -206,7 +219,7 @@ intp = gateway.entry_point intp.onPythonScriptInitialized(os.getpid()) java_import(gateway.jvm, "org.apache.zeppelin.display.Input") -z = __zeppelin__ = PyZeppelinContext(intp) +z = __zeppelin__ = PyZeppelinContext(intp.getZeppelinContext()) __zeppelin__._setup_matplotlib() _zcUserQueryNameSpace["__zeppelin__"] = __zeppelin__ http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/test/java/org/apache/zeppelin/python/IPythonInterpreterTest.java ---------------------------------------------------------------------- diff --git a/python/src/test/java/org/apache/zeppelin/python/IPythonInterpreterTest.java b/python/src/test/java/org/apache/zeppelin/python/IPythonInterpreterTest.java index 104fe19..6451aa3 100644 --- a/python/src/test/java/org/apache/zeppelin/python/IPythonInterpreterTest.java +++ b/python/src/test/java/org/apache/zeppelin/python/IPythonInterpreterTest.java @@ -411,6 +411,7 @@ public class IPythonInterpreterTest { new AuthenticationInfo(), new HashMap<String, Object>(), new GUI(), + new GUI(), null, null, null, http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/test/java/org/apache/zeppelin/python/PythonCondaInterpreterTest.java ---------------------------------------------------------------------- diff --git a/python/src/test/java/org/apache/zeppelin/python/PythonCondaInterpreterTest.java b/python/src/test/java/org/apache/zeppelin/python/PythonCondaInterpreterTest.java index e6f5fca..c750352 100644 --- a/python/src/test/java/org/apache/zeppelin/python/PythonCondaInterpreterTest.java +++ b/python/src/test/java/org/apache/zeppelin/python/PythonCondaInterpreterTest.java @@ -131,6 +131,7 @@ public class PythonCondaInterpreterTest { new AuthenticationInfo(), new HashMap<String, Object>(), new GUI(), + new GUI(), null, null, null, http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/test/java/org/apache/zeppelin/python/PythonDockerInterpreterTest.java ---------------------------------------------------------------------- diff --git a/python/src/test/java/org/apache/zeppelin/python/PythonDockerInterpreterTest.java b/python/src/test/java/org/apache/zeppelin/python/PythonDockerInterpreterTest.java index e590394..5634630 100644 --- a/python/src/test/java/org/apache/zeppelin/python/PythonDockerInterpreterTest.java +++ b/python/src/test/java/org/apache/zeppelin/python/PythonDockerInterpreterTest.java @@ -86,6 +86,7 @@ public class PythonDockerInterpreterTest { new AuthenticationInfo(), new HashMap<String, Object>(), new GUI(), + new GUI(), null, null, null, http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterMatplotlibTest.java ---------------------------------------------------------------------- diff --git a/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterMatplotlibTest.java b/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterMatplotlibTest.java index 877e428..8c088dc 100644 --- a/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterMatplotlibTest.java +++ b/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterMatplotlibTest.java @@ -71,6 +71,7 @@ public class PythonInterpreterMatplotlibTest implements InterpreterOutputListene new AuthenticationInfo(), new HashMap<String, Object>(), new GUI(), + new GUI(), new AngularObjectRegistry(intpGroup.getId(), null), new LocalResourcePool("id"), new LinkedList<InterpreterContextRunner>(), http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterPandasSqlTest.java ---------------------------------------------------------------------- diff --git a/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterPandasSqlTest.java b/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterPandasSqlTest.java index 5d667bd..d8f41c4 100644 --- a/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterPandasSqlTest.java +++ b/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterPandasSqlTest.java @@ -83,6 +83,7 @@ public class PythonInterpreterPandasSqlTest implements InterpreterOutputListener new AuthenticationInfo(), new HashMap<String, Object>(), new GUI(), + new GUI(), new AngularObjectRegistry(intpGroup.getId(), null), new LocalResourcePool("id"), new LinkedList<InterpreterContextRunner>(), http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterTest.java ---------------------------------------------------------------------- diff --git a/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterTest.java b/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterTest.java index ef328f0..4f08d50 100644 --- a/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterTest.java +++ b/python/src/test/java/org/apache/zeppelin/python/PythonInterpreterTest.java @@ -83,6 +83,7 @@ public class PythonInterpreterTest implements InterpreterOutputListener { new AuthenticationInfo(), new HashMap<String, Object>(), new GUI(), + new GUI(), new AngularObjectRegistry(group.getId(), null), new LocalResourcePool("id"), new LinkedList<InterpreterContextRunner>(), http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java ---------------------------------------------------------------------- diff --git a/scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java b/scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java index 8a23c42..e5b1e90 100644 --- a/scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java +++ b/scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java @@ -65,7 +65,7 @@ public class ScaldingInterpreterTest { InterpreterGroup intpGroup = new InterpreterGroup(); context = new InterpreterContext("note", "id", null, "title", "text", new AuthenticationInfo(), - new HashMap<String, Object>(), new GUI(), new AngularObjectRegistry( + new HashMap<String, Object>(), new GUI(), new GUI(), new AngularObjectRegistry( intpGroup.getId(), null), null, new LinkedList<InterpreterContextRunner>(), null); } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java ---------------------------------------------------------------------- diff --git a/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java b/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java index ec17879..91b5fa1 100644 --- a/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java +++ b/scio/src/test/java/org/apache/zeppelin/scio/ScioInterpreterTest.java @@ -44,6 +44,7 @@ public class ScioInterpreterTest { new AuthenticationInfo(), new HashMap<String, Object>(), new GUI(), + new GUI(), new AngularObjectRegistry(intpGroup.getId(), null), new LocalResourcePool("id"), new LinkedList<InterpreterContextRunner>(), http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/shell/src/test/java/org/apache/zeppelin/shell/ShellInterpreterTest.java ---------------------------------------------------------------------- diff --git a/shell/src/test/java/org/apache/zeppelin/shell/ShellInterpreterTest.java b/shell/src/test/java/org/apache/zeppelin/shell/ShellInterpreterTest.java index b369f2d..b67170c 100644 --- a/shell/src/test/java/org/apache/zeppelin/shell/ShellInterpreterTest.java +++ b/shell/src/test/java/org/apache/zeppelin/shell/ShellInterpreterTest.java @@ -41,7 +41,8 @@ public class ShellInterpreterTest { p.setProperty("shell.command.timeout.millisecs", "2000"); shell = new ShellInterpreter(p); - context = new InterpreterContext("", "1", null, "", "", null, null, null, null, null, null, null); + context = new InterpreterContext("", "1", null, "", "", null, null, null, null, null, null, + null, null); shell.open(); } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java ---------------------------------------------------------------------- diff --git a/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java index 5df4ec6..21a1649 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java @@ -464,6 +464,7 @@ public class PySparkInterpreter extends Interpreter implements ExecuteResultHand SparkZeppelinContext __zeppelin__ = sparkInterpreter.getZeppelinContext(); __zeppelin__.setInterpreterContext(context); __zeppelin__.setGui(context.getGui()); + __zeppelin__.setNoteGui(context.getNoteGui()); pythonInterpretRequest = new PythonInterpretRequest(st, jobGroup, jobDesc); statementOutput = null; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java ---------------------------------------------------------------------- diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java index 71a439f..3e4da19 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java @@ -1144,6 +1144,7 @@ public class SparkInterpreter extends Interpreter { public InterpreterResult interpret(String[] lines, InterpreterContext context) { synchronized (this) { z.setGui(context.getGui()); + z.setNoteGui(context.getNoteGui()); String jobDesc = "Started by: " + Utils.getUserName(context.getAuthenticationInfo()); sc.setJobGroup(Utils.buildJobGroupId(context), jobDesc, false); InterpreterResult r = interpretInput(lines, context); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/main/java/org/apache/zeppelin/spark/SparkZeppelinContext.java ---------------------------------------------------------------------- diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkZeppelinContext.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkZeppelinContext.java index 09b8d44..92dc0b1 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/SparkZeppelinContext.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkZeppelinContext.java @@ -33,7 +33,6 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; -import static scala.collection.JavaConversions.asJavaCollection; import static scala.collection.JavaConversions.asJavaIterable; import static scala.collection.JavaConversions.collectionAsScalaIterable; @@ -205,9 +204,44 @@ public class SparkZeppelinContext extends BaseZeppelinContext { String name, scala.collection.Iterable<Object> defaultChecked, scala.collection.Iterable<Tuple2<Object, String>> options) { - return scala.collection.JavaConversions.asScalaBuffer( - gui.checkbox(name, asJavaCollection(defaultChecked), - tuplesToParamOptions(options))).toSeq(); + List<Object> defaultCheckedList = Lists.newArrayList(asJavaIterable(defaultChecked).iterator()); + Collection<Object> checkbox = checkbox(name, defaultCheckedList, tuplesToParamOptions(options)); + List<Object> checkboxList = Arrays.asList(checkbox.toArray()); + return scala.collection.JavaConversions.asScalaBuffer(checkboxList).toSeq(); + } + + @ZeppelinApi + public Object noteSelect(String name, scala.collection.Iterable<Tuple2<Object, String>> options) { + return noteSelect(name, "", options); + } + + @ZeppelinApi + public Object noteSelect(String name, Object defaultValue, + scala.collection.Iterable<Tuple2<Object, String>> options) { + return noteSelect(name, defaultValue, tuplesToParamOptions(options)); + } + + @ZeppelinApi + public scala.collection.Seq<Object> noteCheckbox( + String name, + scala.collection.Iterable<Tuple2<Object, String>> options) { + List<Object> allChecked = new LinkedList<>(); + for (Tuple2<Object, String> option : asJavaIterable(options)) { + allChecked.add(option._1()); + } + return noteCheckbox(name, collectionAsScalaIterable(allChecked), options); + } + + @ZeppelinApi + public scala.collection.Seq<Object> noteCheckbox( + String name, + scala.collection.Iterable<Object> defaultChecked, + scala.collection.Iterable<Tuple2<Object, String>> options) { + List<Object> defaultCheckedList = Lists.newArrayList(asJavaIterable(defaultChecked).iterator()); + Collection<Object> checkbox = noteCheckbox(name, defaultCheckedList, + tuplesToParamOptions(options)); + List<Object> checkboxList = Arrays.asList(checkbox.toArray()); + return scala.collection.JavaConversions.asScalaBuffer(checkboxList).toSeq(); } private OptionInput.ParamOption[] tuplesToParamOptions( http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/main/resources/python/zeppelin_pyspark.py ---------------------------------------------------------------------- diff --git a/spark/src/main/resources/python/zeppelin_pyspark.py b/spark/src/main/resources/python/zeppelin_pyspark.py index 347b543..c10855a 100644 --- a/spark/src/main/resources/python/zeppelin_pyspark.py +++ b/spark/src/main/resources/python/zeppelin_pyspark.py @@ -81,24 +81,46 @@ class PyZeppelinContext(dict): def input(self, name, defaultValue=""): return self.z.input(name, defaultValue) + def textbox(self, name, defaultValue=""): + return self.z.textbox(name, defaultValue) + + def noteTextbox(self, name, defaultValue=""): + return self.z.noteTextbox(name, defaultValue) + def select(self, name, options, defaultValue=""): # auto_convert to ArrayList doesn't match the method signature on JVM side - tuples = list(map(lambda items: self.__tupleToScalaTuple2(items), options)) - iterables = gateway.jvm.scala.collection.JavaConversions.collectionAsScalaIterable(tuples) - return self.z.select(name, defaultValue, iterables) + return self.z.select(name, defaultValue, self.getParamOptions(options)) + + def noteSelect(self, name, options, defaultValue=""): + return self.z.noteSelect(name, defaultValue, self.getParamOptions(options)) def checkbox(self, name, options, defaultChecked=None): - if defaultChecked is None: - defaultChecked = [] - optionTuples = list(map(lambda items: self.__tupleToScalaTuple2(items), options)) - optionIterables = gateway.jvm.scala.collection.JavaConversions.collectionAsScalaIterable(optionTuples) - defaultCheckedIterables = gateway.jvm.scala.collection.JavaConversions.collectionAsScalaIterable(defaultChecked) - checkedItems = gateway.jvm.scala.collection.JavaConversions.seqAsJavaList(self.z.checkbox(name, defaultCheckedIterables, optionIterables)) + optionsIterable = self.getParamOptions(options) + defaultCheckedIterables = self.getDefaultChecked(defaultChecked) + checkedItems = gateway.jvm.scala.collection.JavaConversions.seqAsJavaList(self.z.checkbox(name, defaultCheckedIterables, optionsIterable)) + result = [] + for checkedItem in checkedItems: + result.append(checkedItem) + return result; + + def noteCheckbox(self, name, options, defaultChecked=None): + optionsIterable = self.getParamOptions(options) + defaultCheckedIterables = self.getDefaultChecked(defaultChecked) + checkedItems = gateway.jvm.scala.collection.JavaConversions.seqAsJavaList(self.z.noteCheckbox(name, defaultCheckedIterables, optionsIterable)) result = [] for checkedItem in checkedItems: result.append(checkedItem) return result; + def getParamOptions(self, options): + tuples = list(map(lambda items: self.__tupleToScalaTuple2(items), options)) + return gateway.jvm.scala.collection.JavaConversions.collectionAsScalaIterable(tuples) + + def getDefaultChecked(self, defaultChecked): + if defaultChecked is None: + defaultChecked = [] + return gateway.jvm.scala.collection.JavaConversions.collectionAsScalaIterable(defaultChecked) + def registerHook(self, event, cmd, replName=None): if replName is None: self.z.registerHook(event, cmd) http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java ---------------------------------------------------------------------- diff --git a/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java b/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java index 608807c..e177d49 100644 --- a/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java +++ b/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java @@ -64,7 +64,7 @@ public class DepInterpreterTest { dep.setInterpreterGroup(intpGroup); context = new InterpreterContext("note", "id", null, "title", "text", new AuthenticationInfo(), - new HashMap<String, Object>(), new GUI(), + new HashMap<String, Object>(), new GUI(), new GUI(), new AngularObjectRegistry(intpGroup.getId(), null), null, new LinkedList<InterpreterContextRunner>(), null); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/test/java/org/apache/zeppelin/spark/IPySparkInterpreterTest.java ---------------------------------------------------------------------- diff --git a/spark/src/test/java/org/apache/zeppelin/spark/IPySparkInterpreterTest.java b/spark/src/test/java/org/apache/zeppelin/spark/IPySparkInterpreterTest.java index 5f6d42c..5492274 100644 --- a/spark/src/test/java/org/apache/zeppelin/spark/IPySparkInterpreterTest.java +++ b/spark/src/test/java/org/apache/zeppelin/spark/IPySparkInterpreterTest.java @@ -197,6 +197,7 @@ public class IPySparkInterpreterTest { new AuthenticationInfo(), new HashMap<String, Object>(), new GUI(), + new GUI(), null, null, null, http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterMatplotlibTest.java ---------------------------------------------------------------------- diff --git a/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterMatplotlibTest.java b/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterMatplotlibTest.java index 692447e..2f1077d 100644 --- a/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterMatplotlibTest.java +++ b/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterMatplotlibTest.java @@ -115,6 +115,7 @@ public class PySparkInterpreterMatplotlibTest { new AuthenticationInfo(), new HashMap<String, Object>(), new GUI(), + new GUI(), new AngularObjectRegistry(intpGroup.getId(), null), new LocalResourcePool("id"), new LinkedList<InterpreterContextRunner>(), http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java ---------------------------------------------------------------------- diff --git a/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java b/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java index a95c5ef..0db2bb1 100644 --- a/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java +++ b/spark/src/test/java/org/apache/zeppelin/spark/PySparkInterpreterTest.java @@ -86,6 +86,7 @@ public class PySparkInterpreterTest { new AuthenticationInfo(), new HashMap<String, Object>(), new GUI(), + new GUI(), new AngularObjectRegistry(intpGroup.getId(), null), new LocalResourcePool("id"), new LinkedList<InterpreterContextRunner>(), http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java ---------------------------------------------------------------------- diff --git a/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java b/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java index 10141a1..e4f15f4 100644 --- a/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java +++ b/spark/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java @@ -109,6 +109,7 @@ public class SparkInterpreterTest { new AuthenticationInfo(), new HashMap<String, Object>(), new GUI(), + new GUI(), new AngularObjectRegistry(intpGroup.getId(), null), new LocalResourcePool("id"), new LinkedList<InterpreterContextRunner>(), @@ -335,6 +336,7 @@ public class SparkInterpreterTest { new AuthenticationInfo(), new HashMap<String, Object>(), new GUI(), + new GUI(), new AngularObjectRegistry(intpGroup.getId(), null), new LocalResourcePool("id"), new LinkedList<InterpreterContextRunner>(), http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/spark/src/test/java/org/apache/zeppelin/spark/SparkSqlInterpreterTest.java ---------------------------------------------------------------------- diff --git a/spark/src/test/java/org/apache/zeppelin/spark/SparkSqlInterpreterTest.java b/spark/src/test/java/org/apache/zeppelin/spark/SparkSqlInterpreterTest.java index 3e33f44..d97e57c 100644 --- a/spark/src/test/java/org/apache/zeppelin/spark/SparkSqlInterpreterTest.java +++ b/spark/src/test/java/org/apache/zeppelin/spark/SparkSqlInterpreterTest.java @@ -68,7 +68,7 @@ public class SparkSqlInterpreterTest { sql.open(); context = new InterpreterContext("note", "id", null, "title", "text", new AuthenticationInfo(), - new HashMap<String, Object>(), new GUI(), + new HashMap<String, Object>(), new GUI(), new GUI(), new AngularObjectRegistry(intpGroup.getId(), null), new LocalResourcePool("id"), new LinkedList<InterpreterContextRunner>(), new InterpreterOutput(null)); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularElemTest.scala ---------------------------------------------------------------------- diff --git a/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularElemTest.scala b/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularElemTest.scala index 43ad1bd..4ddae9a 100644 --- a/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularElemTest.scala +++ b/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularElemTest.scala @@ -35,7 +35,7 @@ trait AbstractAngularElemTest override def beforeEach() { val intpGroup = new InterpreterGroup() val context = new InterpreterContext("note", "paragraph", null, "title", "text", - new AuthenticationInfo(), new util.HashMap[String, Object](), new GUI(), + new AuthenticationInfo(), new util.HashMap[String, Object](), new GUI(), new GUI(), new AngularObjectRegistry(intpGroup.getId(), null), null, new util.LinkedList[InterpreterContextRunner](), http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularModelTest.scala ---------------------------------------------------------------------- diff --git a/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularModelTest.scala b/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularModelTest.scala index 0ab52ec..c9b0d8f 100644 --- a/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularModelTest.scala +++ b/zeppelin-display/src/test/scala/org/apache/zeppelin/display/angular/AbstractAngularModelTest.scala @@ -30,7 +30,7 @@ with BeforeAndAfter with BeforeAndAfterEach with Eventually with Matchers { override def beforeEach() { val intpGroup = new InterpreterGroup() val context = new InterpreterContext("note", "id", null, "title", "text", new AuthenticationInfo(), - new java.util.HashMap[String, Object](), new GUI(), new AngularObjectRegistry( + new java.util.HashMap[String, Object](), new GUI(), new GUI(), new AngularObjectRegistry( intpGroup.getId(), null), null, new java.util.LinkedList[InterpreterContextRunner](), http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java index 8a2cd93..a6860de 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java @@ -155,6 +155,8 @@ public class Input<T> implements Serializable { // checkbox form with " or " as delimiter: will be // expanded to "US or JP" private static final Pattern VAR_PTN = Pattern.compile("([_])?[$][{]([^=}]*([=][^}]*)?)[}]"); + private static final Pattern VAR_NOTE_PTN = + Pattern.compile("([_])?[$]{2}[{]([^=}]*([=][^}]*)?)[}]"); private static String[] getNameAndDisplayName(String str) { Pattern p = Pattern.compile("([^(]*)\\s*[(]([^)]*)[)]"); @@ -281,15 +283,21 @@ public class Input<T> implements Serializable { return input; } - public static LinkedHashMap<String, Input> extractSimpleQueryForm(String script) { + public static LinkedHashMap<String, Input> extractSimpleQueryForm(String script, + boolean noteForm) { LinkedHashMap<String, Input> forms = new LinkedHashMap<>(); if (script == null) { return forms; } String replaced = script; - Matcher match = VAR_PTN.matcher(replaced); + Pattern pattern = noteForm ? VAR_NOTE_PTN : VAR_PTN; + Matcher match = pattern.matcher(replaced); while (match.find()) { + int first = match.start(); + if (!noteForm && first > 0 && replaced.charAt(first - 1) == '$') { + continue; + } Input form = getInputForm(match); forms.put(form.name, form); } @@ -300,11 +308,18 @@ public class Input<T> implements Serializable { private static final String DEFAULT_DELIMITER = ","; - public static String getSimpleQuery(Map<String, Object> params, String script) { + public static String getSimpleQuery(Map<String, Object> params, String script, boolean noteForm) { String replaced = script; - Matcher match = VAR_PTN.matcher(replaced); + Pattern pattern = noteForm ? VAR_NOTE_PTN : VAR_PTN; + + Matcher match = pattern.matcher(replaced); while (match.find()) { + int first = match.start(); + + if (!noteForm && first > 0 && replaced.charAt(first - 1) == '$') { + continue; + } Input input = getInputForm(match); Object value; if (params.containsKey(input.name)) { @@ -337,7 +352,7 @@ public class Input<T> implements Serializable { expanded = value.toString(); } replaced = match.replaceFirst(expanded); - match = VAR_PTN.matcher(replaced); + match = pattern.matcher(replaced); } return replaced; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java index 9503962..65bb06f 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java @@ -45,6 +45,7 @@ public abstract class BaseZeppelinContext { protected int maxResult; protected InterpreterHookRegistry hooks; protected GUI gui; + protected GUI noteGui; private static RemoteEventClientWrapper eventClient; @@ -86,37 +87,99 @@ public abstract class BaseZeppelinContext { @Deprecated @ZeppelinApi public Object input(String name, Object defaultValue) { - return textbox(name, defaultValue.toString()); + return textbox(name, defaultValue.toString(), false); } @ZeppelinApi public Object textbox(String name) { - return textbox(name, ""); + return textbox(name, "", false); } @ZeppelinApi public Object textbox(String name, String defaultValue) { - return gui.textbox(name, defaultValue); + return textbox(name, defaultValue, false); + } + + @ZeppelinApi + public Collection<Object> checkbox(String name, ParamOption[] options) { + return checkbox(name, options, false); + } + + @ZeppelinApi + public Collection<Object> checkbox(String name, List<Object> defaultChecked, + ParamOption[] options) { + return checkbox(name, defaultChecked, options, false); } + @ZeppelinApi public Object select(String name, Object defaultValue, ParamOption[] paramOptions) { - return gui.select(name, defaultValue, paramOptions); + return select(name, defaultValue, paramOptions, false); } @ZeppelinApi - public Collection<Object> checkbox(String name, ParamOption[] options) { + public Object noteTextbox(String name) { + return textbox(name, ""); + } + + @ZeppelinApi + public Object noteTextbox(String name, String defaultValue) { + return textbox(name, defaultValue, true); + } + + @ZeppelinApi + public Collection<Object> noteCheckbox(String name, ParamOption[] options) { + return checkbox(name, options, true); + } + + @ZeppelinApi + public Collection<Object> noteCheckbox(String name, List<Object> defaultChecked, + ParamOption[] options) { + return checkbox(name, defaultChecked, options, true); + } + + @ZeppelinApi + public Object noteSelect(String name, Object defaultValue, ParamOption[] paramOptions) { + return select(name, defaultValue, paramOptions, true); + } + + + private Object select(String name, Object defaultValue, ParamOption[] paramOptions, + boolean noteForm) { + if (noteForm) { + return noteGui.select(name, defaultValue, paramOptions); + } else { + return gui.select(name, defaultValue, paramOptions); + } + } + + private Object textbox(String name, String defaultValue, boolean noteForm) { + if (noteForm) { + return noteGui.textbox(name, defaultValue); + } else { + return gui.textbox(name, defaultValue); + } + } + + private Collection<Object> checkbox(String name, ParamOption[] options, + boolean noteForm) { List<Object> defaultValues = new LinkedList<>(); for (ParamOption option : options) { defaultValues.add(option.getValue()); } - return checkbox(name, defaultValues, options); + if (noteForm) { + return noteGui.checkbox(name, defaultValues, options); + } else { + return gui.checkbox(name, defaultValues, options); + } } - @ZeppelinApi - public Collection<Object> checkbox(String name, - List<Object> defaultValues, - ParamOption[] options) { - return gui.checkbox(name, defaultValues, options); + private Collection<Object> checkbox(String name, List<Object> defaultChecked, + ParamOption[] options, boolean noteForm) { + if (noteForm) { + return noteGui.checkbox(name, defaultChecked, options); + } else { + return gui.checkbox(name, defaultChecked, options); + } } public void setGui(GUI o) { @@ -127,6 +190,15 @@ public abstract class BaseZeppelinContext { return gui; } + + public GUI getNoteGui() { + return noteGui; + } + + public void setNoteGui(GUI noteGui) { + this.noteGui = noteGui; + } + private void restartInterpreter() { } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java index f5fc70b..293f9bf 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java @@ -58,6 +58,7 @@ public class InterpreterContext { private AuthenticationInfo authenticationInfo; private Map<String, Object> config = new HashMap<>(); private GUI gui = new GUI(); + private GUI noteGui = new GUI(); private AngularObjectRegistry angularObjectRegistry; private ResourcePool resourcePool; private List<InterpreterContextRunner> runners = new ArrayList<>(); @@ -100,13 +101,14 @@ public class InterpreterContext { AuthenticationInfo authenticationInfo, Map<String, Object> config, GUI gui, + GUI noteGui, AngularObjectRegistry angularObjectRegistry, ResourcePool resourcePool, List<InterpreterContextRunner> runners, InterpreterOutput out ) { this(noteId, paragraphId, replName, paragraphTitle, paragraphText, authenticationInfo, - config, gui, angularObjectRegistry, resourcePool, runners, out, null, null); + config, gui, noteGui, angularObjectRegistry, resourcePool, runners, out, null, null); } public InterpreterContext(String noteId, @@ -117,6 +119,7 @@ public class InterpreterContext { AuthenticationInfo authenticationInfo, Map<String, Object> config, GUI gui, + GUI noteGui, AngularObjectRegistry angularObjectRegistry, ResourcePool resourcePool, List<InterpreterContextRunner> runners, @@ -132,6 +135,7 @@ public class InterpreterContext { this.authenticationInfo = authenticationInfo; this.config = config; this.gui = gui; + this.noteGui = noteGui; this.angularObjectRegistry = angularObjectRegistry; this.resourcePool = resourcePool; this.runners = runners; @@ -148,6 +152,7 @@ public class InterpreterContext { AuthenticationInfo authenticationInfo, Map<String, Object> config, GUI gui, + GUI noteGui, AngularObjectRegistry angularObjectRegistry, ResourcePool resourcePool, List<InterpreterContextRunner> contextRunners, @@ -156,7 +161,7 @@ public class InterpreterContext { RemoteInterpreterEventClient eventClient, Map<String, Integer> progressMap) { this(noteId, paragraphId, replName, paragraphTitle, paragraphText, authenticationInfo, - config, gui, angularObjectRegistry, resourcePool, contextRunners, output, + config, gui, noteGui, angularObjectRegistry, resourcePool, contextRunners, output, remoteWorksController, progressMap); this.client = new RemoteEventClient(eventClient); } @@ -193,6 +198,10 @@ public class InterpreterContext { return gui; } + public GUI getNoteGui() { + return noteGui; + } + public AngularObjectRegistry getAngularObjectRegistry() { return angularObjectRegistry; } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java index 86f35c6..c2a578c 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java @@ -462,7 +462,8 @@ public class RemoteInterpreterServer } return convert(result, context.getConfig(), - context.getGui()); + context.getGui(), + context.getNoteGui()); } @Override @@ -749,6 +750,7 @@ public class RemoteInterpreterServer (Map<String, Object>) gson.fromJson(ric.getConfig(), new TypeToken<Map<String, Object>>() {}.getType()), GUI.fromJson(ric.getGui()), + GUI.fromJson(ric.getNoteGui()), interpreterGroup.getAngularObjectRegistry(), interpreterGroup.getResourcePool(), contextRunners, output, remoteWorksController, eventClient, progressMap); @@ -880,7 +882,7 @@ public class RemoteInterpreterServer } private RemoteInterpreterResult convert(InterpreterResult result, - Map<String, Object> config, GUI gui) { + Map<String, Object> config, GUI gui, GUI noteGui) { List<RemoteInterpreterResultMessage> msg = new LinkedList<>(); for (InterpreterResultMessage m : result.message()) { @@ -893,7 +895,8 @@ public class RemoteInterpreterServer result.code().name(), msg, gson.toJson(config), - gui.toJson()); + gui.toJson(), + noteGui.toJson()); } @Override http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/CallbackInfo.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/CallbackInfo.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/CallbackInfo.java index b0c7e9a..c36a7ac 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/CallbackInfo.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/CallbackInfo.java @@ -51,7 +51,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"}) -@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-6-17") +@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22") public class CallbackInfo implements org.apache.thrift.TBase<CallbackInfo, CallbackInfo._Fields>, java.io.Serializable, Cloneable, Comparable<CallbackInfo> { private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("CallbackInfo"); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java index 43713e9..2ec653e 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/InterpreterCompletion.java @@ -51,7 +51,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"}) -@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27") +@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22") public class InterpreterCompletion implements org.apache.thrift.TBase<InterpreterCompletion, InterpreterCompletion._Fields>, java.io.Serializable, Cloneable, Comparable<InterpreterCompletion> { private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("InterpreterCompletion"); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java index cf8e50a..0398bf9 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteApplicationResult.java @@ -51,7 +51,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"}) -@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27") +@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22") public class RemoteApplicationResult implements org.apache.thrift.TBase<RemoteApplicationResult, RemoteApplicationResult._Fields>, java.io.Serializable, Cloneable, Comparable<RemoteApplicationResult> { private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("RemoteApplicationResult"); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterCallbackService.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterCallbackService.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterCallbackService.java index 6ef08f6..baa5a2d 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterCallbackService.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterCallbackService.java @@ -51,7 +51,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"}) -@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-6-17") +@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22") public class RemoteInterpreterCallbackService { public interface Iface {
