You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by zj...@apache.org on 2020/09/15 03:09:11 UTC

[zeppelin] branch master updated: [ZEPPELIN-5031]. Introduce zeppelin-common module

This is an automated email from the ASF dual-hosted git repository.

zjffdu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zeppelin.git


The following commit(s) were added to refs/heads/master by this push:
     new 847e12d  [ZEPPELIN-5031]. Introduce zeppelin-common module
847e12d is described below

commit 847e12db3e61b19fd0301281df17424b8572601f
Author: Jeff Zhang <zj...@apache.org>
AuthorDate: Wed Sep 9 16:39:56 2020 +0800

    [ZEPPELIN-5031]. Introduce zeppelin-common module
    
    ### What is this PR for?
    
    This is a refactoring PR which introduce zeppelin-common module that contains the common code for both zeppelin server and client api.
    
    ### What type of PR is it?
    [Refactoring]
    
    ### Todos
    * [ ] - Task
    
    ### What is the Jira issue?
    * https://issues.apache.org/jira/browse/ZEPPELIN-5031
    
    ### How should this be tested?
    * First time? Setup Travis CI as described on https://zeppelin.apache.org/contribution/contributions.html#continuous-integration
    * Strongly recommended: add automated unit tests for any new or changed behavior
    * Outline any manual steps to test the PR here.
    
    ### Screenshots (if appropriate)
    
    ### Questions:
    * Does the licenses files need update?
    * Is there breaking changes for older versions?
    * Does this needs documentation?
    
    Author: Jeff Zhang <zj...@apache.org>
    
    Closes #3900 from zjffdu/ZEPPELIN-5031 and squashes the following commits:
    
    65865d350 [Jeff Zhang] [ZEPPELIN-5031]. Introduce zeppelin-common module
---
 pom.xml                                            |   1 +
 zeppelin-client/pom.xml                            |   6 +
 .../org/apache/zeppelin/client/SessionInfo.java    |  95 -------
 .../java/org/apache/zeppelin/client/ZSession.java  |   3 +-
 .../org/apache/zeppelin/client/ZeppelinClient.java |  31 ++-
 .../client/websocket/AbstractMessageHandler.java   |   2 +
 .../client/websocket/JsonSerializable.java         |  26 --
 .../client/websocket/ZeppelinWebSocketClient.java  |   2 +
 {zeppelin-client => zeppelin-common}/pom.xml       |  38 +--
 .../apache/zeppelin/common/JsonSerializable.java   |   0
 .../java/org/apache/zeppelin/common}/Message.java  |   8 +-
 .../org/apache/zeppelin/common}/SessionInfo.java   |  21 +-
 zeppelin-interpreter/pom.xml                       |   6 +
 .../apache/zeppelin/rest/InterpreterRestApi.java   |   4 +-
 .../org/apache/zeppelin/rest/NotebookRestApi.java  |   2 +-
 .../org/apache/zeppelin/rest/SessionManager.java   |   2 +-
 .../org/apache/zeppelin/rest/SessionRestApi.java   |   2 +-
 .../apache/zeppelin/service/NotebookService.java   |   2 +-
 .../apache/zeppelin/socket/ConnectionManager.java  |   2 +-
 .../org/apache/zeppelin/socket/NotebookServer.java |   6 +-
 .../apache/zeppelin/socket/NotebookServerTest.java |   4 +-
 zeppelin-zengine/pom.xml                           |   6 +
 .../repo/zeppelinhub/security/Authentication.java  |   4 +-
 .../repo/zeppelinhub/websocket/Client.java         |   2 +-
 .../repo/zeppelinhub/websocket/ZeppelinClient.java |   4 +-
 .../zeppelinhub/websocket/ZeppelinhubClient.java   |   4 +-
 .../websocket/listener/WatcherWebsocket.java       |   4 +-
 .../websocket/protocol/ZeppelinhubMessage.java     |   5 +-
 .../websocket/utils/ZeppelinhubUtils.java          |   3 +-
 .../apache/zeppelin/notebook/socket/Message.java   | 286 ---------------------
 30 files changed, 106 insertions(+), 475 deletions(-)

diff --git a/pom.xml b/pom.xml
index 78f66de..67db0e7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -93,6 +93,7 @@
     <module>geode</module>
     <module>ksql</module>
     <module>sparql</module>
+    <module>zeppelin-common</module>
     <module>zeppelin-client</module>
     <module>zeppelin-client-examples</module>
     <module>zeppelin-web</module>
diff --git a/zeppelin-client/pom.xml b/zeppelin-client/pom.xml
index 5fab859..9f264bc 100644
--- a/zeppelin-client/pom.xml
+++ b/zeppelin-client/pom.xml
@@ -43,6 +43,12 @@
   <dependencies>
 
     <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>zeppelin-common</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
+    <dependency>
       <groupId>org.eclipse.jetty.websocket</groupId>
       <artifactId>websocket-client</artifactId>
       <version>${jetty.version}</version>
diff --git a/zeppelin-client/src/main/java/org/apache/zeppelin/client/SessionInfo.java b/zeppelin-client/src/main/java/org/apache/zeppelin/client/SessionInfo.java
deleted file mode 100644
index 4eac5c4..0000000
--- a/zeppelin-client/src/main/java/org/apache/zeppelin/client/SessionInfo.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * 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.client;
-
-import kong.unirest.json.JSONObject;
-
-
-/**
- * Represent each ZSession info.
- */
-public class SessionInfo {
-
-  private String sessionId;
-  private String noteId;
-  private String interpreter;
-  private String state;
-  private String weburl;
-  private String startTime;
-
-  public SessionInfo(String sessionId) {
-    this.sessionId = sessionId;
-  }
-
-  public SessionInfo(JSONObject sessionJson) {
-    if (sessionJson.has("sessionId")) {
-      this.sessionId = sessionJson.getString("sessionId");
-    }
-    if (sessionJson.has("noteId")) {
-      this.noteId = sessionJson.getString("noteId");
-    }
-    if (sessionJson.has("interpreter")) {
-      this.interpreter = sessionJson.getString("interpreter");
-    }
-    if (sessionJson.has("state")) {
-      this.state = sessionJson.getString("state");
-    }
-    if (sessionJson.has("weburl")) {
-      this.weburl = sessionJson.getString("weburl");
-    }
-    if (sessionJson.has("startTime")) {
-      this.startTime = sessionJson.getString("startTime");
-    }
-  }
-
-  public String getSessionId() {
-    return sessionId;
-  }
-
-  public String getNoteId() {
-    return noteId;
-  }
-
-  public String getInterpreter() {
-    return interpreter;
-  }
-
-  public String getState() {
-    return state;
-  }
-
-  public String getWeburl() {
-    return weburl;
-  }
-
-  public String getStartTime() {
-    return startTime;
-  }
-
-  @Override
-  public String toString() {
-    return "SessionResult{" +
-            "sessionId='" + sessionId + '\'' +
-            ", interpreter='" + interpreter + '\'' +
-            ", state='" + state + '\'' +
-            ", weburl='" + weburl + '\'' +
-            ", startTime='" + startTime + '\'' +
-            '}';
-  }
-}
diff --git a/zeppelin-client/src/main/java/org/apache/zeppelin/client/ZSession.java b/zeppelin-client/src/main/java/org/apache/zeppelin/client/ZSession.java
index ffedf40..cc07e5d 100644
--- a/zeppelin-client/src/main/java/org/apache/zeppelin/client/ZSession.java
+++ b/zeppelin-client/src/main/java/org/apache/zeppelin/client/ZSession.java
@@ -18,7 +18,8 @@
 package org.apache.zeppelin.client;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.zeppelin.client.websocket.Message;
+import org.apache.zeppelin.common.Message;
+import org.apache.zeppelin.common.SessionInfo;
 import org.apache.zeppelin.client.websocket.MessageHandler;
 import org.apache.zeppelin.client.websocket.StatementMessageHandler;
 import org.apache.zeppelin.client.websocket.ZeppelinWebSocketClient;
diff --git a/zeppelin-client/src/main/java/org/apache/zeppelin/client/ZeppelinClient.java b/zeppelin-client/src/main/java/org/apache/zeppelin/client/ZeppelinClient.java
index 9bb5265..539f119 100644
--- a/zeppelin-client/src/main/java/org/apache/zeppelin/client/ZeppelinClient.java
+++ b/zeppelin-client/src/main/java/org/apache/zeppelin/client/ZeppelinClient.java
@@ -29,6 +29,7 @@ import org.apache.commons.text.StringEscapeUtils;
 import org.apache.http.conn.ssl.NoopHostnameVerifier;
 import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
 import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.zeppelin.common.SessionInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import unirest.shaded.org.apache.http.client.HttpClient;
@@ -137,7 +138,7 @@ public class ZeppelinClient {
     checkResponse(response);
     JsonNode jsonNode = response.getBody();
     checkJsonNodeStatus(jsonNode);
-    return new SessionInfo(jsonNode.getObject().getJSONObject("body"));
+    return createSessionInfoFromJson(jsonNode.getObject().getJSONObject("body"));
   }
 
   /**
@@ -172,7 +173,7 @@ public class ZeppelinClient {
     checkJsonNodeStatus(jsonNode);
 
     JSONObject bodyObject = jsonNode.getObject().getJSONObject("body");
-    return new SessionInfo(bodyObject);
+    return createSessionInfoFromJson(bodyObject);
   }
 
   /**
@@ -204,11 +205,35 @@ public class ZeppelinClient {
     JSONArray sessionJsonArray = jsonNode.getObject().getJSONArray("body");
     List<SessionInfo> sessionInfos = new ArrayList<>();
     for (int i = 0; i< sessionJsonArray.length();++i) {
-      sessionInfos.add(new SessionInfo(sessionJsonArray.getJSONObject(i)));
+      sessionInfos.add(createSessionInfoFromJson(sessionJsonArray.getJSONObject(i)));
     }
     return sessionInfos;
   }
 
+  private SessionInfo createSessionInfoFromJson(JSONObject sessionJson) {
+    SessionInfo sessionInfo = new SessionInfo();
+    if (sessionJson.has("sessionId")) {
+      sessionInfo.setSessionId(sessionJson.getString("sessionId"));
+    }
+    if (sessionJson.has("noteId")) {
+      sessionInfo.setNoteId(sessionJson.getString("noteId"));
+    }
+    if (sessionJson.has("interpreter")) {
+      sessionInfo.setInterpreter(sessionJson.getString("interpreter"));
+    }
+    if (sessionJson.has("state")) {
+      sessionInfo.setState(sessionJson.getString("state"));
+    }
+    if (sessionJson.has("weburl")) {
+      sessionInfo.setWeburl(sessionJson.getString("weburl"));
+    }
+    if (sessionJson.has("startTime")) {
+      sessionInfo.setStartTime(sessionJson.getString("startTime"));
+    }
+
+    return sessionInfo;
+  }
+
   /**
    * Login zeppelin with userName and password, throw exception if login fails.
    *
diff --git a/zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/AbstractMessageHandler.java b/zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/AbstractMessageHandler.java
index 1aa9eee..da015f1 100644
--- a/zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/AbstractMessageHandler.java
+++ b/zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/AbstractMessageHandler.java
@@ -17,6 +17,8 @@
 
 package org.apache.zeppelin.client.websocket;
 
+import org.apache.zeppelin.common.Message;
+
 import com.google.gson.Gson;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/JsonSerializable.java b/zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/JsonSerializable.java
deleted file mode 100644
index 914243c..0000000
--- a/zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/JsonSerializable.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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.client.websocket;
-
-/**
- * Interface for class that can be serialized to json
- */
-public interface JsonSerializable {
-
-  String toJson();
-}
diff --git a/zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/ZeppelinWebSocketClient.java b/zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/ZeppelinWebSocketClient.java
index 4a72c0a..a3e7003 100644
--- a/zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/ZeppelinWebSocketClient.java
+++ b/zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/ZeppelinWebSocketClient.java
@@ -18,6 +18,8 @@
 package org.apache.zeppelin.client.websocket;
 
 import com.google.gson.Gson;
+import org.apache.zeppelin.common.Message;
+
 import org.eclipse.jetty.websocket.api.Session;
 import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
 import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
diff --git a/zeppelin-client/pom.xml b/zeppelin-common/pom.xml
similarity index 70%
copy from zeppelin-client/pom.xml
copy to zeppelin-common/pom.xml
index 5fab859..7f29cf3 100644
--- a/zeppelin-client/pom.xml
+++ b/zeppelin-common/pom.xml
@@ -29,47 +29,21 @@
   </parent>
 
   <groupId>org.apache.zeppelin</groupId>
-  <artifactId>zeppelin-client</artifactId>
+  <artifactId>zeppelin-common</artifactId>
   <packaging>jar</packaging>
   <version>0.9.0-SNAPSHOT</version>
-  <name>Zeppelin: Client</name>
-  <description>Zeppelin Client</description>
+  <name>Zeppelin: Common</name>
+  <description>Zeppelin Common</description>
 
   <properties>
-    <unirest.version>3.7.04</unirest.version>
-    <commons-text.version>1.8</commons-text.version>
+
   </properties>
 
   <dependencies>
 
     <dependency>
-      <groupId>org.eclipse.jetty.websocket</groupId>
-      <artifactId>websocket-client</artifactId>
-      <version>${jetty.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>com.konghq</groupId>
-      <artifactId>unirest-java</artifactId>
-      <version>${unirest.version}</version>
-      <classifier>standalone</classifier>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jetty.websocket</groupId>
-      <artifactId>websocket-client</artifactId>
-      <version>${jetty.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-text</artifactId>
-      <version>${commons-text.version}</version>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
     </dependency>
 
     <dependency>
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/common/JsonSerializable.java b/zeppelin-common/src/main/java/org/apache/zeppelin/common/JsonSerializable.java
similarity index 100%
rename from zeppelin-interpreter/src/main/java/org/apache/zeppelin/common/JsonSerializable.java
rename to zeppelin-common/src/main/java/org/apache/zeppelin/common/JsonSerializable.java
diff --git a/zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/Message.java b/zeppelin-common/src/main/java/org/apache/zeppelin/common/Message.java
similarity index 98%
rename from zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/Message.java
rename to zeppelin-common/src/main/java/org/apache/zeppelin/common/Message.java
index cca3a46..bf738df 100644
--- a/zeppelin-client/src/main/java/org/apache/zeppelin/client/websocket/Message.java
+++ b/zeppelin-common/src/main/java/org/apache/zeppelin/common/Message.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.zeppelin.client.websocket;
+package org.apache.zeppelin.common;
 
 import com.google.gson.Gson;
 import org.slf4j.Logger;
@@ -218,7 +218,7 @@ public class Message implements JsonSerializable {
           OP.DEL_NOTE,
           OP.PATCH_PARAGRAPH)));
 
-  private static final Gson gson = new Gson();
+  private static final Gson GSON = new Gson();
   public static final Message EMPTY = new Message(null);
   
   public OP op;
@@ -279,10 +279,10 @@ public class Message implements JsonSerializable {
   }
 
   public String toJson() {
-    return gson.toJson(this);
+    return GSON.toJson(this);
   }
 
   public static Message fromJson(String json) {
-    return gson.fromJson(json, Message.class);
+    return GSON.fromJson(json, Message.class);
   }
 }
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/SessionInfo.java b/zeppelin-common/src/main/java/org/apache/zeppelin/common/SessionInfo.java
similarity index 87%
rename from zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/SessionInfo.java
rename to zeppelin-common/src/main/java/org/apache/zeppelin/common/SessionInfo.java
index 8e8f2ab..3a87b40 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/SessionInfo.java
+++ b/zeppelin-common/src/main/java/org/apache/zeppelin/common/SessionInfo.java
@@ -15,11 +15,8 @@
  * limitations under the License.
  */
 
-package org.apache.zeppelin.rest.message;
+package org.apache.zeppelin.common;
 
-/**
- * (TODO) Move it to zeppelin-common, so that we don't need to have 2 copies.
- */
 public class SessionInfo {
 
   private String sessionId;
@@ -29,6 +26,10 @@ public class SessionInfo {
   private String weburl;
   private String startTime;
 
+  public SessionInfo(){
+
+  }
+
   public SessionInfo(String sessionId) {
     this.sessionId = sessionId;
   }
@@ -83,4 +84,16 @@ public class SessionInfo {
   public void setWeburl(String weburl) {
     this.weburl = weburl;
   }
+
+  public void setSessionId(String sessionId) {
+    this.sessionId = sessionId;
+  }
+
+  public void setNoteId(String noteId) {
+    this.noteId = noteId;
+  }
+
+  public void setInterpreter(String interpreter) {
+    this.interpreter = interpreter;
+  }
 }
diff --git a/zeppelin-interpreter/pom.xml b/zeppelin-interpreter/pom.xml
index c91721c..7894f01 100644
--- a/zeppelin-interpreter/pom.xml
+++ b/zeppelin-interpreter/pom.xml
@@ -52,6 +52,12 @@
 
   <dependencies>
     <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>zeppelin-common</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
+    <dependency>
       <groupId>io.atomix</groupId>
       <artifactId>atomix</artifactId>
       <version>${atomix.version}</version>
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java
index 54769be..7b12312 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java
@@ -29,8 +29,8 @@ import org.apache.zeppelin.interpreter.InterpreterPropertyType;
 import org.apache.zeppelin.interpreter.InterpreterSetting;
 import org.apache.zeppelin.interpreter.InterpreterSettingManager;
 import org.apache.zeppelin.notebook.AuthorizationService;
-import org.apache.zeppelin.notebook.socket.Message;
-import org.apache.zeppelin.notebook.socket.Message.OP;
+import org.apache.zeppelin.common.Message;
+import org.apache.zeppelin.common.Message.OP;
 import org.apache.zeppelin.rest.message.InterpreterInstallationRequest;
 import org.apache.zeppelin.rest.message.NewInterpreterSettingRequest;
 import org.apache.zeppelin.rest.message.RestartInterpreterRequest;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java
index 3009676..b00b091 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java
@@ -75,7 +75,7 @@ import org.quartz.CronExpression;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.zeppelin.notebook.socket.Message.MSG_ID_NOT_DEFINED;
+import static org.apache.zeppelin.common.Message.MSG_ID_NOT_DEFINED;
 
 /**
  * Rest api endpoint for the notebook.
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SessionManager.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SessionManager.java
index 342374f..16cafa9 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SessionManager.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SessionManager.java
@@ -25,7 +25,7 @@ import org.apache.zeppelin.interpreter.remote.RemoteInterpreterProcess;
 import org.apache.zeppelin.notebook.Note;
 import org.apache.zeppelin.notebook.NoteInfo;
 import org.apache.zeppelin.notebook.Notebook;
-import org.apache.zeppelin.rest.message.SessionInfo;
+import org.apache.zeppelin.common.SessionInfo;
 import org.apache.zeppelin.user.AuthenticationInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SessionRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SessionRestApi.java
index 8c5b164..fb4728b 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SessionRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SessionRestApi.java
@@ -22,7 +22,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.interpreter.InterpreterSettingManager;
 import org.apache.zeppelin.notebook.Notebook;
-import org.apache.zeppelin.rest.message.SessionInfo;
+import org.apache.zeppelin.common.SessionInfo;
 import org.apache.zeppelin.server.JsonResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/service/NotebookService.java b/zeppelin-server/src/main/java/org/apache/zeppelin/service/NotebookService.java
index 3763345..2bc3c46 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/service/NotebookService.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/service/NotebookService.java
@@ -48,7 +48,7 @@ import org.apache.zeppelin.notebook.Paragraph;
 import org.apache.zeppelin.notebook.AuthorizationService;
 import org.apache.zeppelin.notebook.repo.NotebookRepoWithVersionControl;
 import org.apache.zeppelin.notebook.scheduler.SchedulerService;
-import org.apache.zeppelin.notebook.socket.Message;
+import org.apache.zeppelin.common.Message;
 import org.apache.zeppelin.rest.SessionManager;
 import org.apache.zeppelin.rest.exception.BadRequestException;
 import org.apache.zeppelin.rest.exception.ForbiddenException;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/ConnectionManager.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/ConnectionManager.java
index a36f895..ceec50e 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/ConnectionManager.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/ConnectionManager.java
@@ -31,7 +31,7 @@ import org.apache.zeppelin.notebook.NoteInfo;
 import org.apache.zeppelin.notebook.NotebookImportDeserializer;
 import org.apache.zeppelin.notebook.Paragraph;
 import org.apache.zeppelin.notebook.AuthorizationService;
-import org.apache.zeppelin.notebook.socket.Message;
+import org.apache.zeppelin.common.Message;
 import org.apache.zeppelin.notebook.socket.WatcherMessage;
 import org.apache.zeppelin.user.AuthenticationInfo;
 import org.apache.zeppelin.util.WatcherSecurityKey;
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 0a16c21..6c8e039 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
@@ -72,8 +72,8 @@ import org.apache.zeppelin.notebook.Paragraph;
 import org.apache.zeppelin.notebook.ParagraphJobListener;
 import org.apache.zeppelin.notebook.AuthorizationService;
 import org.apache.zeppelin.notebook.repo.NotebookRepoWithVersionControl.Revision;
-import org.apache.zeppelin.notebook.socket.Message;
-import org.apache.zeppelin.notebook.socket.Message.OP;
+import org.apache.zeppelin.common.Message;
+import org.apache.zeppelin.common.Message.OP;
 import org.apache.zeppelin.rest.exception.ForbiddenException;
 import org.apache.zeppelin.scheduler.Job.Status;
 import org.apache.zeppelin.service.ConfigurationService;
@@ -96,7 +96,7 @@ import org.glassfish.hk2.api.ServiceLocator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.zeppelin.notebook.socket.Message.MSG_ID_NOT_DEFINED;
+import static org.apache.zeppelin.common.Message.MSG_ID_NOT_DEFINED;
 
 /**
  * Zeppelin websocket service. This class used setter injection because all servlet should have
diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java
index 48631bd..06816c4 100644
--- a/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java
+++ b/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java
@@ -61,8 +61,8 @@ import org.apache.zeppelin.notebook.Paragraph;
 import org.apache.zeppelin.notebook.repo.NotebookRepoWithVersionControl;
 import org.apache.zeppelin.notebook.scheduler.QuartzSchedulerService;
 import org.apache.zeppelin.notebook.scheduler.SchedulerService;
-import org.apache.zeppelin.notebook.socket.Message;
-import org.apache.zeppelin.notebook.socket.Message.OP;
+import org.apache.zeppelin.common.Message;
+import org.apache.zeppelin.common.Message.OP;
 import org.apache.zeppelin.rest.AbstractTestRestApi;
 import org.apache.zeppelin.scheduler.Job;
 import org.apache.zeppelin.service.ConfigurationService;
diff --git a/zeppelin-zengine/pom.xml b/zeppelin-zengine/pom.xml
index 7cd4368..a41add5 100644
--- a/zeppelin-zengine/pom.xml
+++ b/zeppelin-zengine/pom.xml
@@ -53,6 +53,12 @@
   <dependencies>
     <dependency>
       <groupId>${project.groupId}</groupId>
+      <artifactId>zeppelin-common</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>${project.groupId}</groupId>
       <artifactId>zeppelin-interpreter</artifactId>
       <version>${project.version}</version>
     </dependency>
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/security/Authentication.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/security/Authentication.java
index a53479e..49e63a3 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/security/Authentication.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/security/Authentication.java
@@ -23,8 +23,8 @@ import org.apache.commons.httpclient.methods.GetMethod;
 import org.apache.commons.httpclient.methods.PostMethod;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
-import org.apache.zeppelin.notebook.socket.Message;
-import org.apache.zeppelin.notebook.socket.Message.OP;
+import org.apache.zeppelin.common.Message;
+import org.apache.zeppelin.common.Message.OP;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/Client.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/Client.java
index 87a1a8f..5a29823 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/Client.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/Client.java
@@ -16,8 +16,8 @@
  */
 package org.apache.zeppelin.notebook.repo.zeppelinhub.websocket;
 
+import org.apache.zeppelin.common.Message;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
-import org.apache.zeppelin.notebook.socket.Message;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/ZeppelinClient.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/ZeppelinClient.java
index 20b9e0f..6e90204 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/ZeppelinClient.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/ZeppelinClient.java
@@ -29,6 +29,7 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.zeppelin.common.Message;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.apache.zeppelin.notebook.AuthorizationService;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.model.UserTokenContainer;
@@ -38,8 +39,7 @@ import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.listener.Zeppelin
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.protocol.ZeppelinhubMessage;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.scheduler.SchedulerService;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.scheduler.ZeppelinHeartbeat;
-import org.apache.zeppelin.notebook.socket.Message;
-import org.apache.zeppelin.notebook.socket.Message.OP;
+import org.apache.zeppelin.common.Message.OP;
 import org.apache.zeppelin.util.WatcherSecurityKey;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.websocket.api.Session;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/ZeppelinhubClient.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/ZeppelinhubClient.java
index e747900..3674e0e 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/ZeppelinhubClient.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/ZeppelinhubClient.java
@@ -34,8 +34,8 @@ import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.scheduler.Schedul
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.scheduler.ZeppelinHubHeartbeat;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.session.ZeppelinhubSession;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.utils.ZeppelinhubUtils;
-import org.apache.zeppelin.notebook.socket.Message;
-import org.apache.zeppelin.notebook.socket.Message.OP;
+import org.apache.zeppelin.common.Message;
+import org.apache.zeppelin.common.Message.OP;
 import org.apache.zeppelin.ticket.TicketContainer;
 import org.codehaus.jettison.json.JSONArray;
 import org.codehaus.jettison.json.JSONException;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/listener/WatcherWebsocket.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/listener/WatcherWebsocket.java
index 9a356e3..2a6458d 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/listener/WatcherWebsocket.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/listener/WatcherWebsocket.java
@@ -18,8 +18,8 @@ package org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.listener;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.ZeppelinClient;
-import org.apache.zeppelin.notebook.socket.Message;
-import org.apache.zeppelin.notebook.socket.Message.OP;
+import org.apache.zeppelin.common.Message;
+import org.apache.zeppelin.common.Message.OP;
 import org.apache.zeppelin.notebook.socket.WatcherMessage;
 import org.apache.zeppelin.ticket.TicketContainer;
 import org.eclipse.jetty.websocket.api.Session;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/protocol/ZeppelinhubMessage.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/protocol/ZeppelinhubMessage.java
index aa14cd2..cd4763f 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/protocol/ZeppelinhubMessage.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/protocol/ZeppelinhubMessage.java
@@ -20,9 +20,10 @@ import java.util.Map;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.common.JsonSerializable;
+import org.apache.zeppelin.common.Message;
+import org.apache.zeppelin.common.Message.OP;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.Client;
-import org.apache.zeppelin.notebook.socket.Message;
-import org.apache.zeppelin.notebook.socket.Message.OP;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/utils/ZeppelinhubUtils.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/utils/ZeppelinhubUtils.java
index 2ab8d0e..83ca1ee 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/utils/ZeppelinhubUtils.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/utils/ZeppelinhubUtils.java
@@ -19,11 +19,12 @@ package org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.utils;
 import java.util.HashMap;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.zeppelin.common.Message;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.model.UserTokenContainer;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.ZeppelinhubClient;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.protocol.ZeppelinHubOp;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.protocol.ZeppelinhubMessage;
-import org.apache.zeppelin.notebook.socket.Message;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/socket/Message.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/socket/Message.java
deleted file mode 100644
index 9d6803e..0000000
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/socket/Message.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * 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.socket;
-
-import com.google.gson.Gson;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import org.apache.zeppelin.common.JsonSerializable;
-import org.slf4j.Logger;
-/**
- * Zeppelin websocket massage template class.
- */
-public class Message implements JsonSerializable {
-  /**
-   * Representation of event type.
-   */
-  public static enum OP {
-    GET_HOME_NOTE,    // [c-s] load note for home screen
-
-    GET_NOTE,         // [c-s] client load note
-                      // @param id note id
-
-    NOTE,             // [s-c] note info
-                      // @param note serialized Note object
-
-    PARAGRAPH,        // [s-c] paragraph info
-                      // @param paragraph serialized paragraph object
-
-    PROGRESS,         // [s-c] progress update
-                      // @param id paragraph id
-                      // @param progress percentage progress
-
-    NEW_NOTE,         // [c-s] create new notebook
-    DEL_NOTE,         // [c-s] delete notebook
-                      // @param id note id
-    REMOVE_FOLDER,
-    MOVE_NOTE_TO_TRASH,
-    MOVE_FOLDER_TO_TRASH,
-    RESTORE_FOLDER,
-    RESTORE_NOTE,
-    RESTORE_ALL,
-    EMPTY_TRASH,
-    CLONE_NOTE,       // [c-s] clone new notebook
-                      // @param id id of note to clone
-                      // @param name name for the cloned note
-    IMPORT_NOTE,      // [c-s] import notebook
-                      // @param object notebook
-
-    CONVERT_NOTE_NBFORMAT,     // [c-s] converting note to nbformat
-    CONVERTED_NOTE_NBFORMAT,     // [s-c] converting note to nbformat
-
-    NOTE_UPDATE,
-
-    NOTE_RENAME,
-
-    UPDATE_PERSONALIZED_MODE, // [c-s] update personalized mode (boolean)
-                              // @param note id and boolean personalized mode value
-
-    FOLDER_RENAME,
-
-    RUN_PARAGRAPH,    // [c-s] run paragraph
-                      // @param id paragraph id
-                      // @param paragraph paragraph content.ie. script
-                      // @param config paragraph config
-                      // @param params paragraph params
-
-    COMMIT_PARAGRAPH, // [c-s] commit paragraph
-                      // @param id paragraph id
-                      // @param title paragraph title
-                      // @param paragraph paragraph content.ie. script
-                      // @param config paragraph config
-                      // @param params paragraph params
-
-    CANCEL_PARAGRAPH, // [c-s] cancel paragraph run
-                      // @param id paragraph id
-
-    MOVE_PARAGRAPH,   // [c-s] move paragraph order
-                      // @param id paragraph id
-                      // @param index index the paragraph want to go
-
-    INSERT_PARAGRAPH, // [c-s] create new paragraph below current paragraph
-                      // @param target index
-
-    COPY_PARAGRAPH,   // [c-s] create new para below current para as a copy of current para
-                      // @param target index
-                      // @param title paragraph title
-                      // @param paragraph paragraph content.ie. script
-                      // @param config paragraph config
-                      // @param params paragraph params
-
-    EDITOR_SETTING,   // [c-s] ask paragraph editor setting
-                      // @param paragraph text keyword written in paragraph
-                      // ex) spark.spark or spark
-
-    COMPLETION,       // [c-s] ask completion candidates
-                      // @param id
-                      // @param buf current code
-                      // @param cursor cursor position in code
-
-    COMPLETION_LIST,  // [s-c] send back completion candidates list
-                      // @param id
-                      // @param completions list of string
-
-    LIST_NOTES,                   // [c-s] ask list of note
-    RELOAD_NOTES_FROM_REPO,       // [c-s] reload notes from repo
-
-    NOTES_INFO,                   // [s-c] list of note infos
-                                  // @param notes serialized List<NoteInfo> object
-
-    PARAGRAPH_REMOVE,
-    PARAGRAPH_CLEAR_OUTPUT,       // [c-s] clear output of paragraph
-    PARAGRAPH_CLEAR_ALL_OUTPUT,   // [c-s] clear output of all paragraphs
-    PARAGRAPH_APPEND_OUTPUT,      // [s-c] append output
-    PARAGRAPH_UPDATE_OUTPUT,      // [s-c] update (replace) output
-    PING,
-    AUTH_INFO,
-
-    ANGULAR_OBJECT_UPDATE,        // [s-c] add/update angular object
-    ANGULAR_OBJECT_REMOVE,        // [s-c] add angular object del
-    
-    ANGULAR_OBJECT_UPDATED,       // [c-s] angular object value updated,
-
-    ANGULAR_OBJECT_CLIENT_BIND,   // [c-s] angular object updated from AngularJS z object
-
-    ANGULAR_OBJECT_CLIENT_UNBIND, // [c-s] angular object unbind from AngularJS z object
-
-    LIST_CONFIGURATIONS,          // [c-s] ask all key/value pairs of configurations
-    CONFIGURATIONS_INFO,          // [s-c] all key/value pairs of configurations
-                                  // @param settings serialized Map<String, String> object
-
-    CHECKPOINT_NOTE,              // [c-s] checkpoint note to storage repository
-                                  // @param noteId
-                                  // @param checkpointName
-
-    LIST_REVISION_HISTORY,        // [c-s] list revision history of the notebook
-                                  // @param noteId
-    NOTE_REVISION,                // [c-s] get certain revision of note
-                                  // @param noteId
-                                  // @param revisionId
-    SET_NOTE_REVISION,            // [c-s] set current notebook head to this revision
-                                  // @param noteId
-                                  // @param revisionId
-    NOTE_REVISION_FOR_COMPARE,    // [c-s] get certain revision of note for compare
-                                  // @param noteId
-                                  // @param revisionId
-                                  // @param position
-    APP_APPEND_OUTPUT,            // [s-c] append output
-    APP_UPDATE_OUTPUT,            // [s-c] update (replace) output
-    APP_LOAD,                     // [s-c] on app load
-    APP_STATUS_CHANGE,            // [s-c] on app status change
-
-    LIST_NOTE_JOBS,               // [c-s] get note job management information
-    LIST_UPDATE_NOTE_JOBS,        // [c-s] get job management information for until unixtime
-    UNSUBSCRIBE_UPDATE_NOTE_JOBS, // [c-s] unsubscribe job information for job management
-    // @param unixTime
-    GET_INTERPRETER_BINDINGS,    // [c-s] get interpreter bindings
-    SAVE_INTERPRETER_BINDINGS,    // [c-s] save interpreter bindings
-    INTERPRETER_BINDINGS,         // [s-c] interpreter bindings
-
-    GET_INTERPRETER_SETTINGS,     // [c-s] get interpreter settings
-    INTERPRETER_SETTINGS,         // [s-c] interpreter settings
-    ERROR_INFO,                   // [s-c] error information to be sent
-    SESSION_LOGOUT,               // [s-c] error information to be sent
-    WATCHER,                      // [s-c] Change websocket to watcher mode.
-    PARAGRAPH_ADDED,              // [s-c] paragraph is added
-    PARAGRAPH_REMOVED,            // [s-c] paragraph deleted
-    PARAGRAPH_MOVED,              // [s-c] paragraph moved
-    NOTE_UPDATED,                 // [s-c] paragraph updated(name, config)
-    RUN_ALL_PARAGRAPHS,           // [c-s] run all paragraphs
-    PARAGRAPH_EXECUTED_BY_SPELL,  // [c-s] paragraph was executed by spell
-    RUN_PARAGRAPH_USING_SPELL,    // [s-c] run paragraph using spell
-    PARAS_INFO,                   // [s-c] paragraph runtime infos
-    SAVE_NOTE_FORMS,              // save note forms
-    REMOVE_NOTE_FORMS,            // remove note forms
-    INTERPRETER_INSTALL_STARTED,  // [s-c] start to download an interpreter
-    INTERPRETER_INSTALL_RESULT,   // [s-c] Status of an interpreter installation
-    COLLABORATIVE_MODE_STATUS,    // [s-c] collaborative mode status
-    PATCH_PARAGRAPH,              // [c-s][s-c] patch editor text
-    NOTE_RUNNING_STATUS,        // [s-c] sequential run status will be change
-    NOTICE                        // [s-c] Notice
-  }
-
-  // these messages will be ignored during the sequential run of the note
-  private static final Set<OP> disabledForRunningNoteMessages = Collections
-      .unmodifiableSet(new HashSet<>(Arrays.asList(
-          OP.COMMIT_PARAGRAPH,
-          OP.RUN_PARAGRAPH,
-          OP.RUN_PARAGRAPH_USING_SPELL,
-          OP.RUN_ALL_PARAGRAPHS,
-          OP.PARAGRAPH_CLEAR_OUTPUT,
-          OP.PARAGRAPH_CLEAR_ALL_OUTPUT,
-          OP.INSERT_PARAGRAPH,
-          OP.MOVE_PARAGRAPH,
-          OP.COPY_PARAGRAPH,
-          OP.PARAGRAPH_REMOVE,
-          OP.MOVE_NOTE_TO_TRASH,
-          OP.DEL_NOTE,
-          OP.PATCH_PARAGRAPH)));
-
-  private static final Gson gson = new Gson();
-  public static final Message EMPTY = new Message(null);
-  
-  public OP op;
-  public Map<String, Object> data = new HashMap<>();
-  public String ticket = "anonymous";
-  public String principal = "anonymous";
-  public String roles = "";
-
-  // Unique id generated from client side. to identify message.
-  // When message from server is response to the client request
-  // includes the msgId in response message, client can pair request and response message.
-  // When server send message that is not response to the client request, set null;
-  public String msgId = MSG_ID_NOT_DEFINED;
-  public static String MSG_ID_NOT_DEFINED = null;
-
-  public Message(OP op) {
-    this.op = op;
-  }
-
-  public Message withMsgId(String msgId) {
-    this.msgId = msgId;
-    return this;
-  }
-
-  public Message put(String k, Object v) {
-    data.put(k, v);
-    return this;
-  }
-
-  public Object get(String k) {
-    return data.get(k);
-  }
-
-  public static boolean isDisabledForRunningNotes(OP eventType) {
-    return disabledForRunningNoteMessages.contains(eventType);
-  }
-
-  public <T> T getType(String key) {
-    return (T) data.get(key);
-  }
-
-  public <T> T getType(String key, Logger LOG) {
-    try {
-      return getType(key);
-    } catch (ClassCastException e) {
-      LOG.error("Failed to get " + key + " from message (Invalid type). " , e);
-      return null;
-    }
-  }
-
-  @Override
-  public String toString() {
-    final StringBuilder sb = new StringBuilder("Message{");
-    sb.append("data=").append(data);
-    sb.append(", op=").append(op);
-    sb.append('}');
-    return sb.toString();
-  }
-
-  public String toJson() {
-    return gson.toJson(this);
-  }
-
-  public static Message fromJson(String json) {
-    return gson.fromJson(json, Message.class);
-  }
-}