From f296406b920d7374f821f46d873b54e718137153 Mon Sep 17 00:00:00 2001 From: Jungtaek Lim Date: Tue, 22 Dec 2015 13:15:32 +0900 Subject: [PATCH 1/2] ZEPPELIN-527 Fix NPE while retrieving job status from notebook * Paragraph.getDateStarted() and Paragraph.getDateFinished() could be null --- .../zeppelin/rest/ZeppelinRestApiTest.java | 24 ++++++++++++++++++- .../org/apache/zeppelin/notebook/Note.java | 14 ++++------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java index caac5a08fe3..84b5adefda6 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java @@ -533,6 +533,28 @@ public void testCronJobs() throws InterruptedException, IOException{ assertThat("", deleteCron, isAllowed()); deleteCron.releaseConnection(); ZeppelinServer.notebook.removeNote(note.getId()); - } + } + + @Test + public void testRegressionZEPPELIN_527() throws IOException { + Note note = ZeppelinServer.notebook.createNote(); + + note.setName("note for run test"); + Paragraph paragraph = note.addParagraph(); + paragraph.setText("%spark\nval param = z.input(\"param\").toString\nprintln(param)"); + + note.persist(); + + GetMethod getNoteJobs = httpGet("/notebook/job/" + note.getId()); + assertThat("test notebook jobs run:", getNoteJobs, isAllowed()); + Map resp = gson.fromJson(getNoteJobs.getResponseBodyAsString(), new TypeToken>() { + }.getType()); + List> body = (List>) resp.get("body"); + assertNull(body.get(0).get("started")); + assertNull(body.get(0).get("finished")); + getNoteJobs.releaseConnection(); + + ZeppelinServer.notebook.removeNote(note.getId()); + } } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java index 93dcec582ae..61f60884c2b 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java @@ -19,11 +19,7 @@ import java.io.IOException; import java.io.Serializable; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Random; +import java.util.*; import org.apache.zeppelin.conf.ZeppelinConfiguration; import org.apache.zeppelin.display.AngularObject; @@ -293,7 +289,7 @@ public Paragraph getLastParagraph() { return paragraphs.get(paragraphs.size() - 1); } } - + public List> generateParagraphsInfo (){ List> paragraphsInfo = new LinkedList<>(); synchronized (paragraphs) { @@ -301,13 +297,13 @@ public List> generateParagraphsInfo (){ Map info = new HashMap<>(); info.put("id", p.getId()); info.put("status", p.getStatus().toString()); - info.put("started", p.getDateStarted().toString()); - info.put("finished", p.getDateFinished().toString()); + info.put("started", p.getDateStarted() == null ? null : p.getDateStarted().toString()); + info.put("finished", p.getDateFinished() == null ? null : p.getDateFinished().toString()); paragraphsInfo.add(info); } } return paragraphsInfo; - } + } /** * Run all paragraphs sequentially. From e08519ee4cae36f9fe9651ab3fe3ff3c7a9bfd4b Mon Sep 17 00:00:00 2001 From: Jungtaek Lim Date: Wed, 23 Dec 2015 13:45:14 +0900 Subject: [PATCH 2/2] ZEPPELIN-527 Don't include null value to the Map --- .../org/apache/zeppelin/rest/ZeppelinRestApiTest.java | 4 ++-- .../src/main/java/org/apache/zeppelin/notebook/Note.java | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java index 84b5adefda6..3971e630339 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java @@ -550,8 +550,8 @@ public void testRegressionZEPPELIN_527() throws IOException { Map resp = gson.fromJson(getNoteJobs.getResponseBodyAsString(), new TypeToken>() { }.getType()); List> body = (List>) resp.get("body"); - assertNull(body.get(0).get("started")); - assertNull(body.get(0).get("finished")); + assertFalse(body.get(0).containsKey("started")); + assertFalse(body.get(0).containsKey("finished")); getNoteJobs.releaseConnection(); ZeppelinServer.notebook.removeNote(note.getId()); diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java index 61f60884c2b..31647aeb6f5 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java @@ -297,8 +297,12 @@ public List> generateParagraphsInfo (){ Map info = new HashMap<>(); info.put("id", p.getId()); info.put("status", p.getStatus().toString()); - info.put("started", p.getDateStarted() == null ? null : p.getDateStarted().toString()); - info.put("finished", p.getDateFinished() == null ? null : p.getDateFinished().toString()); + if (p.getDateStarted() != null) { + info.put("started", p.getDateStarted().toString()); + } + if (p.getDateFinished() != null) { + info.put("finished", p.getDateFinished().toString()); + } paragraphsInfo.add(info); } }