Repository: zeppelin Updated Branches: refs/heads/master 8da3e23a9 -> a9d064c90
ZEPPELIN-1129 Zeppelin fails to load notebooks with old date format ### What is this PR for? Old notebook fails to load due to date parse exception ### What type of PR is it? Bug Fix ### What is the Jira issue? https://issues.apache.org/jira/browse/ZEPPELIN-1129 ### How should this be tested? Keep a notebook with old date format in the notebook dir and reload notebooks on zeppelin home page ### Questions: * Does the licenses files need update? n/a * Is there breaking changes for older versions? n/a * Does this needs documentation? n/a Author: Renjith Kamath <[email protected]> Closes #1146 from r-kamath/ZEPPELIN-1129 and squashes the following commits: 901bf2b [Renjith Kamath] ZEPPELIN-1129 Zeppelin fails to load notebooks with old date format 5391d12 [Renjith Kamath] ZEPPELIN-1129 Zeppelin fails to load notebooks with old format Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/a9d064c9 Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/a9d064c9 Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/a9d064c9 Branch: refs/heads/master Commit: a9d064c90f8830779b4339dcf60edff94cc228a8 Parents: 8da3e23 Author: Renjith Kamath <[email protected]> Authored: Thu Jul 7 17:58:56 2016 +0530 Committer: Lee moon soo <[email protected]> Committed: Fri Jul 8 07:58:46 2016 -0700 ---------------------------------------------------------------------- .../notebook/repo/AzureNotebookRepo.java | 5 +- .../zeppelin/notebook/repo/S3NotebookRepo.java | 5 +- .../zeppelin/notebook/repo/VFSNotebookRepo.java | 5 +- .../apache/zeppelin/notebook/NotebookTest.java | 28 +++++--- .../src/test/resources/2BQA35CJZ/note.json | 69 ++++++++++++++++++++ 5 files changed, 100 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zeppelin/blob/a9d064c9/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/AzureNotebookRepo.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/AzureNotebookRepo.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/AzureNotebookRepo.java index fdb6bbf..be6fbb6 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/AzureNotebookRepo.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/AzureNotebookRepo.java @@ -27,6 +27,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.zeppelin.conf.ZeppelinConfiguration; import org.apache.zeppelin.notebook.Note; import org.apache.zeppelin.notebook.NoteInfo; +import org.apache.zeppelin.notebook.NotebookImportDeserializer; import org.apache.zeppelin.notebook.Paragraph; import org.apache.zeppelin.scheduler.Job; import org.apache.zeppelin.user.AuthenticationInfo; @@ -35,6 +36,7 @@ import org.slf4j.LoggerFactory; import java.io.*; import java.net.URISyntaxException; import java.security.InvalidKeyException; +import java.util.Date; import java.util.LinkedList; import java.util.List; @@ -121,7 +123,8 @@ public class AzureNotebookRepo implements NotebookRepo { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setPrettyPrinting(); - Gson gson = gsonBuilder.create(); + Gson gson = gsonBuilder.registerTypeAdapter(Date.class, new NotebookImportDeserializer()) + .create(); Note note = gson.fromJson(json, Note.class); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/a9d064c9/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/S3NotebookRepo.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/S3NotebookRepo.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/S3NotebookRepo.java index fc69186..460c993 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/S3NotebookRepo.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/S3NotebookRepo.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; +import java.util.Date; import java.util.LinkedList; import java.util.List; @@ -36,6 +37,7 @@ import org.apache.zeppelin.conf.ZeppelinConfiguration; import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars; import org.apache.zeppelin.notebook.Note; import org.apache.zeppelin.notebook.NoteInfo; +import org.apache.zeppelin.notebook.NotebookImportDeserializer; import org.apache.zeppelin.notebook.Paragraph; import org.apache.zeppelin.scheduler.Job.Status; import org.apache.zeppelin.user.AuthenticationInfo; @@ -166,7 +168,8 @@ public class S3NotebookRepo implements NotebookRepo { private Note getNote(String key) throws IOException { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setPrettyPrinting(); - Gson gson = gsonBuilder.create(); + Gson gson = gsonBuilder.registerTypeAdapter(Date.class, new NotebookImportDeserializer()) + .create(); S3Object s3object; try { http://git-wip-us.apache.org/repos/asf/zeppelin/blob/a9d064c9/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java index a74e6c7..430a069 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java @@ -23,6 +23,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; +import java.util.Date; import java.util.LinkedList; import java.util.List; @@ -40,6 +41,7 @@ import org.apache.zeppelin.notebook.ApplicationState; import org.apache.zeppelin.notebook.Note; import org.apache.zeppelin.notebook.NoteInfo; import org.apache.zeppelin.notebook.Paragraph; +import org.apache.zeppelin.notebook.NotebookImportDeserializer; import org.apache.zeppelin.scheduler.Job.Status; import org.apache.zeppelin.user.AuthenticationInfo; import org.slf4j.Logger; @@ -158,7 +160,8 @@ public class VFSNotebookRepo implements NotebookRepo { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setPrettyPrinting(); - Gson gson = gsonBuilder.create(); + Gson gson = gsonBuilder.registerTypeAdapter(Date.class, new NotebookImportDeserializer()) + .create(); FileContent content = noteJson.getContent(); InputStream ins = content.getInputStream(); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/a9d064c9/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java index e67344f..6790297 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java @@ -145,12 +145,19 @@ public class NotebookTest implements JobListenerFactory{ @Test public void testReloadAllNotes() throws IOException { - File srcDir = new File("src/test/resources/2A94M5J1Z"); - File destDir = new File(notebookDir.getAbsolutePath() + "/2A94M5J1Z"); + /** + * 2A94M5J1Z old date format without timezone + * 2BQA35CJZ new date format with timezone + */ + String[] noteNames = new String[]{"2A94M5J1Z", "2BQA35CJZ"}; // copy the notebook try { - FileUtils.copyDirectory(srcDir, destDir); + for (String note : noteNames) { + File srcDir = new File("src/test/resources/" + note); + File destDir = new File(notebookDir.getAbsolutePath() + "/" + note); + FileUtils.copyDirectory(srcDir, destDir); + } } catch (IOException e) { logger.error(e.toString(), e); } @@ -163,17 +170,20 @@ public class NotebookTest implements JobListenerFactory{ Note copiedNote = notebookRepo.get("2A94M5J1Z", null); notebook.reloadAllNotes(null); notes = notebook.getAllNotes(); - assertEquals(notes.size(), 1); - assertEquals(notes.get(0).id(), copiedNote.id()); - assertEquals(notes.get(0).getName(), copiedNote.getName()); - assertEquals(notes.get(0).getParagraphs(), copiedNote.getParagraphs()); + assertEquals(notes.size(), 2); + assertEquals(notes.get(1).id(), copiedNote.id()); + assertEquals(notes.get(1).getName(), copiedNote.getName()); + assertEquals(notes.get(1).getParagraphs(), copiedNote.getParagraphs()); // delete the notebook - FileUtils.deleteDirectory(destDir); + for (String note : noteNames) { + File destDir = new File(notebookDir.getAbsolutePath() + "/" + note); + FileUtils.deleteDirectory(destDir); + } // keep notebook in memory before reloading notes = notebook.getAllNotes(); - assertEquals(notes.size(), 1); + assertEquals(notes.size(), 2); // delete notebook from notebook list when reloadAllNotes() is called notebook.reloadAllNotes(null); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/a9d064c9/zeppelin-zengine/src/test/resources/2BQA35CJZ/note.json ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/resources/2BQA35CJZ/note.json b/zeppelin-zengine/src/test/resources/2BQA35CJZ/note.json new file mode 100644 index 0000000..56f0033 --- /dev/null +++ b/zeppelin-zengine/src/test/resources/2BQA35CJZ/note.json @@ -0,0 +1,69 @@ +{ + "angularObjects": { + "2BJB693M8:shared_process": [] + }, + "config": { + "looknfeel": "default" + }, + "id": "2BQA35CJZ", + "info": {}, + "lastReplName": { + "value": "phoenix" + }, + "name": "Activity Dashboard", + "paragraphs": [ + { + "$$hashKey": "object:266", + "config": { + "colWidth": 4, + "editorHide": true, + "editorMode": "ace/mode/scala", + "enabled": true, + "graph": { + "groups": [], + "height": 353, + "keys": [ + { + "aggr": "sum", + "index": 0, + "name": "JOB_ID" + } + ], + "mode": "table", + "optionOpen": false, + "scatter": { + "xAxis": { + "aggr": "sum", + "index": 0, + "name": "JOB_ID" + } + }, + "values": [ + { + "aggr": "sum", + "index": 1, + "name": "TYPE" + } + ] + }, + "title": true + }, + "dateCreated": "2016-03-29T16:21:09-0700", + "dateFinished": "2016-07-02T02:11:16-0700", + "dateStarted": "2016-07-02T02:11:12-0700", + "dateUpdated": "2016-07-02T02:11:12-0700", + "errorMessage": "", + "id": "20160616-201120_1946745827", + "jobName": "paragraph_1466629190560_-1015742222", + "progressUpdateIntervalMs": 500, + "settings": { + "forms": {}, + "params": {} + }, + "status": "FINISHED", + "text": "SELECT job_id, \n \"type\" AS type, \n \"user\" AS user, \n ( duration_millis / 3600000 ) AS duration_hr \nFROM activity.job \nORDER BY duration_millis DESC \nLIMIT 10 ", + "title": "Top 10 Longest Running Jobs", + "user": "admin" + } + ] +} \ No newline at end of file
