You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by mo...@apache.org on 2016/06/24 14:51:48 UTC
zeppelin git commit: [ZEPPELIN-1028] Fix exported notebook importing
error
Repository: zeppelin
Updated Branches:
refs/heads/master 878a8c76c -> 57e0dc883
[ZEPPELIN-1028] Fix exported notebook importing error
### What is this PR for?
This bug seems to be produced by #862. Currently a exported notebook is not imported with below error message.
```
ERROR [2016-06-20 17:19:21,797] ({qtp559670971-14} NotebookServer.java[onMessage]:231) - Can't handle message
com.google.gson.JsonSyntaxException: 2016-06-20T14:33:31-0700
at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:81)
at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:66)
at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:41)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
at com.google.gson.Gson.fromJson(Gson.java:791)
at org.apache.zeppelin.notebook.Notebook.importNote(Notebook.java:199)
at org.apache.zeppelin.socket.NotebookServer.importNote(NotebookServer.java:656)
at org.apache.zeppelin.socket.NotebookServer.onMessage(NotebookServer.java:175)
at org.apache.zeppelin.socket.NotebookSocket.onWebSocketText(NotebookSocket.java:56)
at org.eclipse.jetty.websocket.common.events.JettyListenerEventDriver.onTextMessage(JettyListenerEventDriver.java:128)
at org.eclipse.jetty.websocket.common.message.SimpleTextMessage.messageComplete(SimpleTextMessage.java:69)
at org.eclipse.jetty.websocket.common.events.AbstractEventDriver.appendMessage(AbstractEventDriver.java:65)
at org.eclipse.jetty.websocket.common.events.JettyListenerEventDriver.onTextFrame(JettyListenerEventDriver.java:122)
at org.eclipse.jetty.websocket.common.events.AbstractEventDriver.incomingFrame(AbstractEventDriver.java:161)
at org.eclipse.jetty.websocket.common.WebSocketSession.incomingFrame(WebSocketSession.java:309)
at org.eclipse.jetty.websocket.common.extensions.ExtensionStack.incomingFrame(ExtensionStack.java:214)
at org.eclipse.jetty.websocket.common.Parser.notifyFrame(Parser.java:220)
at org.eclipse.jetty.websocket.common.Parser.parse(Parser.java:258)
at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.readParse(AbstractWebSocketConnection.java:632)
at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillable(AbstractWebSocketConnection.java:480)
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.text.ParseException: Unparseable date: "2016-06-20T14:33:31-0700"
at java.text.DateFormat.parse(DateFormat.java:366)
at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:79)
```
### What type of PR is it?
Bug Fix
### Todos
### What is the Jira issue?
[ZEPPELIN-1028](https://issues.apache.org/jira/browse/ZEPPELIN-1028)
### How should this be tested?
1. Apply this patch (Build the source and restart Zeppelin)
2. Export a notebook and try to import it again
3. It should be imported as before
### Screenshots (if appropriate)
With this patch, we can import the below two types of date format notebooks.
- Exported after #862 merged : `yyyy-MM-dd'T'HH:mm:ssZ`
<img width="289" alt="screen shot 2016-06-22 at 12 18 01 pm" src="https://cloud.githubusercontent.com/assets/10060731/16280468/6ebad710-3874-11e6-9ce6-b38e239649a2.png">
- Exported before #862 merged : `MMM dd, yyyy HH:mm:ss`
<img width="288" alt="screen shot 2016-06-22 at 12 17 31 pm" src="https://cloud.githubusercontent.com/assets/10060731/16280459/6a4f256e-3874-11e6-848e-ec1ff6e9b441.png">
### Questions:
* Does the licenses files need update? No
* Is there breaking changes for older versions? No
* Does this needs documentation? No
Author: AhyoungRyu <fb...@hanmail.net>
Closes #1055 from AhyoungRyu/ZEPPELIN-1028 and squashes the following commits:
8f91d2d [AhyoungRyu] Fix class description
829bcae [AhyoungRyu] Rename NotebookImportSerializer -> NotebookImportDeserializer
2dff9bb [AhyoungRyu] Support two date format for backward compatibility
2d8fc66 [AhyoungRyu] Remove new line
7c493bf [AhyoungRyu] Change date format in importNote
479c0d0 [AhyoungRyu] Fix exported notebook importing error
Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/57e0dc88
Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/57e0dc88
Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/57e0dc88
Branch: refs/heads/master
Commit: 57e0dc88310b9dbdece780beab5c9e3e496be1b9
Parents: 878a8c7
Author: AhyoungRyu <fb...@hanmail.net>
Authored: Wed Jun 22 15:06:35 2016 -0700
Committer: Lee moon soo <mo...@apache.org>
Committed: Fri Jun 24 07:53:34 2016 -0700
----------------------------------------------------------------------
.../apache/zeppelin/socket/NotebookServer.java | 3 +-
.../org/apache/zeppelin/notebook/Notebook.java | 4 +-
.../notebook/NotebookImportDeserializer.java | 53 ++++++++++++++++++++
3 files changed, 57 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/57e0dc88/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
index 17650dd..f4cf9d9 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
@@ -77,8 +77,7 @@ public class NotebookServer extends WebSocketServlet implements
}
private static final Logger LOG = LoggerFactory.getLogger(NotebookServer.class);
- Gson gson = new GsonBuilder()
- .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();
+ Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();
final Map<String, List<NotebookSocket>> noteSocketMap = new HashMap<>();
final Queue<NotebookSocket> connectedSockets = new ConcurrentLinkedQueue<>();
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/57e0dc88/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java
index adaaa2a..d590223 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java
@@ -195,7 +195,9 @@ public class Notebook {
throws IOException {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setPrettyPrinting();
- Gson gson = gsonBuilder.create();
+
+ Gson gson = gsonBuilder.registerTypeAdapter(Date.class, new NotebookImportDeserializer())
+ .create();
JsonReader reader = new JsonReader(new StringReader(sourceJson));
reader.setLenient(true);
Note newNote;
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/57e0dc88/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/NotebookImportDeserializer.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/NotebookImportDeserializer.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/NotebookImportDeserializer.java
new file mode 100644
index 0000000..1aadf75
--- /dev/null
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/NotebookImportDeserializer.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.zeppelin.notebook;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+
+import java.lang.reflect.Type;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * importNote date format deserializer
+ */
+public class NotebookImportDeserializer implements JsonDeserializer<Date> {
+ private static final String[] DATE_FORMATS = new String[] {
+ "yyyy-MM-dd'T'HH:mm:ssZ",
+ "MMM dd, yyyy HH:mm:ss"
+ };
+
+ @Override
+ public Date deserialize(JsonElement jsonElement, Type typeOF,
+ JsonDeserializationContext context) throws JsonParseException {
+ for (String format : DATE_FORMATS) {
+ try {
+ return new SimpleDateFormat(format, Locale.US).parse(jsonElement.getAsString());
+ } catch (ParseException e) {
+ }
+ }
+ throw new JsonParseException("Unparsable date: \"" + jsonElement.getAsString()
+ + "\". Supported formats: " + Arrays.toString(DATE_FORMATS));
+ }
+}