ZEPPELIN-2397. Add toJson and fromJson method for serializable objects ### What is this PR for? Add toJson and fromJson method for all the objects that need ser/der in zeppelin.
### What type of PR is it? [Refactoring] ### Todos * [ ] - Task ### What is the Jira issue? * https://issues.apache.org/jira/browse/ZEPPELIN-2397?filter=-2 ### How should this be tested? Outline the steps to test the PR here. ### Screenshots (if appropriate) ### Questions: * Does the licenses files need update? No * Is there breaking changes for older versions? No * Does this needs documentation? No Author: Jeff Zhang <zjf...@apache.org> Closes #2272 from zjffdu/ZEPPELIN-2397 and squashes the following commits: 4fb12fe [Jeff Zhang] ZEPPELIN-2397. Add toJson and fromJson method for serializable objects Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/f36b1a15 Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/f36b1a15 Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/f36b1a15 Branch: refs/heads/master Commit: f36b1a1577ccd7dce438cf834985c9d72abca1e3 Parents: f3f24f3 Author: Jeff Zhang <zjf...@apache.org> Authored: Wed Apr 12 18:43:34 2017 +0800 Committer: Jeff Zhang <zjf...@apache.org> Committed: Tue Jul 4 18:24:16 2017 +0800 ---------------------------------------------------------------------- .../zeppelin/common/JsonSerializable.java | 26 +++++++ .../org/apache/zeppelin/dep/Repository.java | 14 +++- .../apache/zeppelin/display/AngularObject.java | 15 +++- .../java/org/apache/zeppelin/display/GUI.java | 35 ++++++++- .../java/org/apache/zeppelin/display/Input.java | 67 ++++++++++++---- .../apache/zeppelin/helium/HeliumPackage.java | 15 +++- .../zeppelin/interpreter/InterpreterResult.java | 14 +++- .../RemoteZeppelinServerResource.java | 15 +++- .../InvokeResourceMethodEventMessage.java | 14 +++- .../remote/RemoteInterpreterEventClient.java | 19 ++--- .../remote/RemoteInterpreterEventPoller.java | 19 +++-- .../remote/RemoteInterpreterServer.java | 17 ++-- .../zeppelin/resource/RemoteResource.java | 15 +++- .../org/apache/zeppelin/resource/Resource.java | 14 +++- .../apache/zeppelin/resource/ResourceId.java | 15 +++- .../zeppelin/resource/ResourcePoolUtils.java | 7 +- .../apache/zeppelin/resource/ResourceSet.java | 15 +++- .../zeppelin/user/AuthenticationInfo.java | 16 +++- .../org/apache/zeppelin/user/Credentials.java | 3 +- .../zeppelin/user/CredentialsInfoSaving.java | 15 +++- .../org/apache/zeppelin/display/GUITest.java | 49 ++++++++++++ .../zeppelin/helium/HeliumPackageTest.java | 4 +- .../apache/zeppelin/realm/ZeppelinHubRealm.java | 20 +++-- .../org/apache/zeppelin/rest/HeliumRestApi.java | 2 +- .../zeppelin/rest/InterpreterRestApi.java | 12 +-- .../zeppelin/rest/NotebookRepoRestApi.java | 7 +- .../apache/zeppelin/rest/NotebookRestApi.java | 10 +-- .../zeppelin/rest/message/CronRequest.java | 14 +++- .../message/NewInterpreterSettingRequest.java | 13 +++- .../zeppelin/rest/message/NewNoteRequest.java | 14 +++- .../rest/message/NewParagraphRequest.java | 15 +++- .../message/NotebookRepoSettingsRequest.java | 13 +++- .../rest/message/RestartInterpreterRequest.java | 15 +++- .../RunParagraphWithParametersRequest.java | 15 +++- .../UpdateInterpreterSettingRequest.java | 14 +++- .../apache/zeppelin/socket/NotebookServer.java | 4 +- .../zeppelin/rest/AbstractTestRestApi.java | 2 - .../zeppelin/rest/ZeppelinSparkClusterTest.java | 3 - .../zeppelin/socket/NotebookServerTest.java | 12 +-- .../java/org/apache/zeppelin/helium/Helium.java | 13 +--- .../helium/HeliumApplicationFactory.java | 4 +- .../zeppelin/helium/HeliumBundleFactory.java | 9 +-- .../org/apache/zeppelin/helium/HeliumConf.java | 19 ++++- .../org/apache/zeppelin/helium/NpmPackage.java | 15 +++- .../apache/zeppelin/helium/WebpackResult.java | 15 +++- .../interpreter/InterpreterFactory.java | 72 ++++------------- .../interpreter/InterpreterInfoSaving.java | 16 +++- .../interpreter/InterpreterSettingManager.java | 8 +- .../interpreter/remote/RemoteInterpreter.java | 4 +- .../java/org/apache/zeppelin/notebook/Note.java | 80 ++++++++++++++++--- .../org/apache/zeppelin/notebook/Notebook.java | 14 +--- .../notebook/NotebookAuthorization.java | 3 +- .../NotebookAuthorizationInfoSaving.java | 16 +++- .../notebook/NotebookImportDeserializer.java | 3 +- .../org/apache/zeppelin/notebook/Paragraph.java | 71 ++++++++++++++++- .../json/NotebookTypeAdapterFactory.java | 82 ++++++++++++++++++++ .../notebook/repo/AzureNotebookRepo.java | 15 +--- .../notebook/repo/MongoNotebookRepo.java | 11 +-- .../zeppelin/notebook/repo/S3NotebookRepo.java | 14 +--- .../zeppelin/notebook/repo/VFSNotebookRepo.java | 11 +-- .../zeppelinhub/websocket/ZeppelinClient.java | 20 ++--- .../websocket/ZeppelinhubClient.java | 2 +- .../websocket/listener/WatcherWebsocket.java | 7 +- .../websocket/protocol/ZeppelinhubMessage.java | 9 ++- .../websocket/utils/ZeppelinhubUtils.java | 12 +-- .../zeppelin/notebook/socket/Message.java | 14 +++- .../notebook/socket/WatcherMessage.java | 11 ++- .../interpreter/InterpreterFactoryTest.java | 34 +++----- .../org/apache/zeppelin/notebook/NoteTest.java | 30 +++++++ .../apache/zeppelin/notebook/NotebookTest.java | 10 ++- .../protocol/ZeppelinhubMessageTest.java | 8 +- .../resource/DistributedResourcePoolTest.java | 12 +-- 72 files changed, 929 insertions(+), 343 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/common/JsonSerializable.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/common/JsonSerializable.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/common/JsonSerializable.java new file mode 100644 index 0000000..7764138 --- /dev/null +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/common/JsonSerializable.java @@ -0,0 +1,26 @@ +/* + * 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.common; + +/** + * Interface for class that can be serialized to json + */ +public interface JsonSerializable { + + String toJson(); +} http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Repository.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Repository.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Repository.java index 86f39bd..74adce8 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Repository.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Repository.java @@ -18,6 +18,8 @@ package org.apache.zeppelin.dep; import static org.apache.commons.lang.StringUtils.isNotBlank; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; import org.sonatype.aether.repository.Authentication; import org.sonatype.aether.repository.Proxy; @@ -25,7 +27,9 @@ import org.sonatype.aether.repository.Proxy; * * */ -public class Repository { +public class Repository implements JsonSerializable { + private static final Gson gson = new Gson(); + private boolean snapshot = false; private String id; private String url; @@ -98,4 +102,12 @@ public class Repository { } return null; } + + public String toJson() { + return gson.toJson(this); + } + + public static Repository fromJson(String json) { + return gson.fromJson(json, Repository.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/AngularObject.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/AngularObject.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/AngularObject.java index 84ee67e..2187705 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/AngularObject.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/AngularObject.java @@ -22,6 +22,8 @@ import java.util.List; import java.util.Objects; import java.util.concurrent.ExecutorService; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; import org.apache.zeppelin.scheduler.ExecutorFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,8 +35,9 @@ import org.slf4j.LoggerFactory; * * @param <T> */ -public class AngularObject<T> { +public class AngularObject<T> implements JsonSerializable { private static final Logger LOGGER = LoggerFactory.getLogger(AngularObject.class); + private static final Gson gson = new Gson(); private String name; private T object; @@ -63,7 +66,7 @@ public class AngularObject<T> { * @param paragraphId paragraphId belongs to. can be null * @param listener event listener */ - protected AngularObject(String name, T o, String noteId, String paragraphId, + public AngularObject(String name, T o, String noteId, String paragraphId, AngularObjectListener listener) { this.name = name; this.noteId = noteId; @@ -253,4 +256,12 @@ public class AngularObject<T> { sb.append('}'); return sb.toString(); } + + public String toJson() { + return gson.toJson(this); + } + + public static AngularObject fromJson(String json) { + return gson.fromJson(json, AngularObject.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java index 66b21c6..086f805 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java @@ -25,8 +25,12 @@ import org.apache.zeppelin.display.ui.Select; import org.apache.zeppelin.display.ui.TextBox; import java.io.Serializable; - -import java.util.*; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; /** @@ -96,7 +100,7 @@ public class GUI implements Serializable { } public List<Object> checkbox(String id, Collection<Object> defaultChecked, - ParamOption[] options) { + ParamOption[] options) { Collection<Object> checked = (Collection<Object>) params.get(id); if (checked == null) { checked = defaultChecked; @@ -124,6 +128,31 @@ public class GUI implements Serializable { this.forms = new LinkedHashMap<>(); } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + GUI gui = (GUI) o; + + if (params != null ? !params.equals(gui.params) : gui.params != null) { + return false; + } + return forms != null ? forms.equals(gui.forms) : gui.forms == null; + + } + + @Override + public int hashCode() { + int result = params != null ? params.hashCode() : 0; + result = 31 * result + (forms != null ? forms.hashCode() : 0); + return result; + } + public String toJson() { return gson.toJson(this); } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/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 12fa782..f713f4a 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 @@ -18,6 +18,7 @@ package org.apache.zeppelin.display; import org.apache.commons.lang.StringUtils; +import org.apache.zeppelin.common.JsonSerializable; import org.apache.zeppelin.display.ui.*; import org.apache.zeppelin.display.ui.OptionInput.ParamOption; @@ -37,13 +38,13 @@ public class Input<T> implements Serializable { // in future. public static final RuntimeTypeAdapterFactory TypeAdapterFactory = RuntimeTypeAdapterFactory.of(Input.class, "type") - .registerSubtype(TextBox.class, "TextBox") - .registerSubtype(Select.class, "Select") - .registerSubtype(CheckBox.class, "CheckBox") - .registerSubtype(OldInput.OldTextBox.class, "input") - .registerSubtype(OldInput.OldSelect.class, "select") - .registerSubtype(OldInput.OldCheckBox.class, "checkbox") - .registerSubtype(OldInput.class, null); + .registerSubtype(TextBox.class, "TextBox") + .registerSubtype(Select.class, "Select") + .registerSubtype(CheckBox.class, "CheckBox") + .registerSubtype(OldInput.OldTextBox.class, "input") + .registerSubtype(OldInput.OldSelect.class, "select") + .registerSubtype(OldInput.OldCheckBox.class, "checkbox") + .registerSubtype(OldInput.class, null); protected String name; protected String displayName; @@ -86,6 +87,44 @@ public class Input<T> implements Serializable { return argument; } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Input<?> input = (Input<?>) o; + + if (hidden != input.hidden) { + return false; + } + if (name != null ? !name.equals(input.name) : input.name != null) { + return false; + } + if (displayName != null ? !displayName.equals(input.displayName) : input.displayName != null) { + return false; + } + if (defaultValue != null ? + !defaultValue.equals(input.defaultValue) : input.defaultValue != null) { + return false; + } + return argument != null ? argument.equals(input.argument) : input.argument == null; + + } + + @Override + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + (displayName != null ? displayName.hashCode() : 0); + result = 31 * result + (defaultValue != null ? defaultValue.hashCode() : 0); + result = 31 * result + (hidden ? 1 : 0); + result = 31 * result + (argument != null ? argument.hashCode() : 0); + return result; + } + public static TextBox textbox(String name, String defaultValue) { return new TextBox(name, defaultValue); } @@ -276,7 +315,7 @@ public class Input<T> implements Serializable { delimiter = DEFAULT_DELIMITER; } Collection<Object> checked = value instanceof Collection ? (Collection<Object>) value - : Arrays.asList((Object[]) value); + : Arrays.asList((Object[]) value); List<Object> validChecked = new LinkedList<>(); for (Object o : checked) { // filter out obsolete checked values for (ParamOption option : optionInput.getOptions()) { @@ -316,22 +355,22 @@ public class Input<T> implements Serializable { } public static String[] split(String str, char split) { - return split(str, new String[] {String.valueOf(split)}, false); + return split(str, new String[]{String.valueOf(split)}, false); } public static String[] split(String str, String[] splitters, boolean includeSplitter) { String escapeSeq = "\"',;${}"; char escapeChar = '\\'; - String[] blockStart = new String[] {"\"", "'", "${", "N_(", "N_<"}; - String[] blockEnd = new String[] {"\"", "'", "}", "N_)", "N_>"}; + String[] blockStart = new String[]{"\"", "'", "${", "N_(", "N_<"}; + String[] blockEnd = new String[]{"\"", "'", "}", "N_)", "N_>"}; return split(str, escapeSeq, escapeChar, blockStart, blockEnd, splitters, includeSplitter); } public static String[] split(String str, String escapeSeq, char escapeChar, String[] blockStart, - String[] blockEnd, String[] splitters, boolean includeSplitter) { + String[] blockEnd, String[] splitters, boolean includeSplitter) { List<String> splits = new ArrayList<>(); @@ -442,7 +481,7 @@ public class Input<T> implements Serializable { // check if block is started for (int b = 0; b < blockStart.length; b++) { if (curString.substring(lastEscapeOffset + 1) - .endsWith(getBlockStr(blockStart[b])) == true) { + .endsWith(getBlockStr(blockStart[b])) == true) { blockStack.add(0, b); // block is started blockStartPos = i; break; @@ -453,7 +492,7 @@ public class Input<T> implements Serializable { if (curString.length() > 0) { splits.add(curString.toString().trim()); } - return splits.toArray(new String[] {}); + return splits.toArray(new String[]{}); } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/helium/HeliumPackage.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/helium/HeliumPackage.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/helium/HeliumPackage.java index c1af75f..759b991 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/helium/HeliumPackage.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/helium/HeliumPackage.java @@ -16,7 +16,10 @@ */ package org.apache.zeppelin.helium; +import com.google.gson.Gson; import org.apache.zeppelin.annotation.Experimental; +import org.apache.zeppelin.common.JsonSerializable; +import org.apache.zeppelin.dep.Repository; import java.util.Map; @@ -24,7 +27,9 @@ import java.util.Map; * Helium package definition */ @Experimental -public class HeliumPackage { +public class HeliumPackage implements JsonSerializable { + private static final Gson gson = new Gson(); + private HeliumType type; private String name; // user friendly name of this application private String description; // description @@ -129,4 +134,12 @@ public class HeliumPackage { } public Map<String, Object> getConfig() { return config; } + + public String toJson() { + return gson.toJson(this); + } + + public static HeliumPackage fromJson(String json) { + return gson.fromJson(json, HeliumPackage.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterResult.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterResult.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterResult.java index 7aab8a3..b08a97e 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterResult.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterResult.java @@ -20,6 +20,8 @@ package org.apache.zeppelin.interpreter; import java.io.IOException; import java.io.Serializable; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,8 +30,10 @@ import java.util.*; /** * Interpreter result template. */ -public class InterpreterResult implements Serializable { +public class InterpreterResult implements Serializable, JsonSerializable { transient Logger logger = LoggerFactory.getLogger(InterpreterResult.class); + private static final Gson gson = new Gson(); + /** * Type of result after code execution. */ @@ -109,6 +113,14 @@ public class InterpreterResult implements Serializable { return msg; } + public String toJson() { + return gson.toJson(this); + } + + public static InterpreterResult fromJson(String json) { + return gson.fromJson(json, InterpreterResult.class); + } + public String toString() { StringBuilder sb = new StringBuilder(); Type prevType = null; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/RemoteZeppelinServerResource.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/RemoteZeppelinServerResource.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/RemoteZeppelinServerResource.java index b2a87aa..bf96a09 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/RemoteZeppelinServerResource.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/RemoteZeppelinServerResource.java @@ -17,10 +17,15 @@ package org.apache.zeppelin.interpreter; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; + /** * Remote Zeppelin Server Resource */ -public class RemoteZeppelinServerResource { +public class RemoteZeppelinServerResource implements JsonSerializable { + private static final Gson gson = new Gson(); + /** * Resource Type for Zeppelin Server */ @@ -55,4 +60,12 @@ public class RemoteZeppelinServerResource { public void setData(Object data) { this.data = data; } + + public String toJson() { + return gson.toJson(this); + } + + public static RemoteZeppelinServerResource fromJson(String json) { + return gson.fromJson(json, RemoteZeppelinServerResource.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/InvokeResourceMethodEventMessage.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/InvokeResourceMethodEventMessage.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/InvokeResourceMethodEventMessage.java index a2b0690..aaf3d7b 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/InvokeResourceMethodEventMessage.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/InvokeResourceMethodEventMessage.java @@ -16,12 +16,16 @@ */ package org.apache.zeppelin.interpreter.remote; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; import org.apache.zeppelin.resource.ResourceId; /** * message payload to invoke method of resource in the resourcepool */ -public class InvokeResourceMethodEventMessage { +public class InvokeResourceMethodEventMessage implements JsonSerializable { + private static final Gson gson = new Gson(); + public final ResourceId resourceId; public final String methodName; public final String[] paramClassnames; @@ -91,4 +95,12 @@ public class InvokeResourceMethodEventMessage { return false; } } + + public String toJson() { + return gson.toJson(this); + } + + public static InvokeResourceMethodEventMessage fromJson(String json) { + return gson.fromJson(json, InvokeResourceMethodEventMessage.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventClient.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventClient.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventClient.java index 2cdbf39..5f8ccb7 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventClient.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventClient.java @@ -85,7 +85,7 @@ public class RemoteInterpreterEventClient implements ResourcePoolConnector { */ public void angularObjectAdd(AngularObject object) { sendEvent(new RemoteInterpreterEvent( - RemoteInterpreterEventType.ANGULAR_OBJECT_ADD, gson.toJson(object))); + RemoteInterpreterEventType.ANGULAR_OBJECT_ADD, object.toJson())); } /** @@ -93,7 +93,7 @@ public class RemoteInterpreterEventClient implements ResourcePoolConnector { */ public void angularObjectUpdate(AngularObject object) { sendEvent(new RemoteInterpreterEvent( - RemoteInterpreterEventType.ANGULAR_OBJECT_UPDATE, gson.toJson(object))); + RemoteInterpreterEventType.ANGULAR_OBJECT_UPDATE, object.toJson())); } /** @@ -146,10 +146,9 @@ public class RemoteInterpreterEventClient implements ResourcePoolConnector { } // send request - Gson gson = new Gson(); sendEvent(new RemoteInterpreterEvent( RemoteInterpreterEventType.RESOURCE_GET, - gson.toJson(resourceId))); + resourceId.toJson())); // wait for response while (!getResourceResponse.containsKey(resourceId)) { @@ -198,11 +197,9 @@ public class RemoteInterpreterEventClient implements ResourcePoolConnector { } } // send request - Gson gson = new Gson(); - sendEvent(new RemoteInterpreterEvent( RemoteInterpreterEventType.RESOURCE_INVOKE_METHOD, - gson.toJson(invokeMethod))); + invokeMethod.toJson())); // wait for response while (!getInvokeResponse.containsKey(invokeMethod)) { try { @@ -252,11 +249,9 @@ public class RemoteInterpreterEventClient implements ResourcePoolConnector { } } // send request - Gson gson = new Gson(); - sendEvent(new RemoteInterpreterEvent( RemoteInterpreterEventType.RESOURCE_INVOKE_METHOD, - gson.toJson(invokeMethod))); + invokeMethod.toJson())); // wait for response while (!getInvokeResponse.containsKey(invokeMethod)) { try { @@ -279,7 +274,7 @@ public class RemoteInterpreterEventClient implements ResourcePoolConnector { ResourceSet resourceSet = new ResourceSet(); for (String res : resources) { - RemoteResource resource = gson.fromJson(res, RemoteResource.class); + RemoteResource resource = RemoteResource.fromJson(res); resource.setResourcePoolConnector(this); resourceSet.add(resource); } @@ -296,7 +291,7 @@ public class RemoteInterpreterEventClient implements ResourcePoolConnector { * @param object java serialized of the object */ public void putResponseGetResource(String resourceId, ByteBuffer object) { - ResourceId rid = gson.fromJson(resourceId, ResourceId.class); + ResourceId rid = ResourceId.fromJson(resourceId); logger.debug("Response resource {} from RemoteInterpreter", rid.getName()); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventPoller.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventPoller.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventPoller.java index 126a46f..6927b3b 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventPoller.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventPoller.java @@ -130,12 +130,11 @@ public class RemoteInterpreterEventPoller extends Thread { if (event.getType() == RemoteInterpreterEventType.NO_OP) { continue; } else if (event.getType() == RemoteInterpreterEventType.ANGULAR_OBJECT_ADD) { - AngularObject angularObject = gson.fromJson(event.getData(), AngularObject.class); + AngularObject angularObject = AngularObject.fromJson(event.getData()); angularObjectRegistry.add(angularObject.getName(), angularObject.get(), angularObject.getNoteId(), angularObject.getParagraphId()); } else if (event.getType() == RemoteInterpreterEventType.ANGULAR_OBJECT_UPDATE) { - AngularObject angularObject = gson.fromJson(event.getData(), - AngularObject.class); + AngularObject angularObject = AngularObject.fromJson(event.getData()); AngularObject localAngularObject = angularObjectRegistry.get( angularObject.getName(), angularObject.getNoteId(), angularObject.getParagraphId()); if (localAngularObject instanceof RemoteAngularObject) { @@ -146,7 +145,7 @@ public class RemoteInterpreterEventPoller extends Thread { localAngularObject.set(angularObject.get()); } } else if (event.getType() == RemoteInterpreterEventType.ANGULAR_OBJECT_REMOVE) { - AngularObject angularObject = gson.fromJson(event.getData(), AngularObject.class); + AngularObject angularObject = AngularObject.fromJson(event.getData()); angularObjectRegistry.remove(angularObject.getName(), angularObject.getNoteId(), angularObject.getParagraphId()); } else if (event.getType() == RemoteInterpreterEventType.RUN_INTERPRETER_CONTEXT_RUNNER) { @@ -161,14 +160,14 @@ public class RemoteInterpreterEventPoller extends Thread { sendResourcePoolResponseGetAll(resourceSet); } else if (event.getType() == RemoteInterpreterEventType.RESOURCE_GET) { String resourceIdString = event.getData(); - ResourceId resourceId = gson.fromJson(resourceIdString, ResourceId.class); + ResourceId resourceId = ResourceId.fromJson(resourceIdString); logger.debug("RESOURCE_GET {} {}", resourceId.getResourcePoolId(), resourceId.getName()); Object o = getResource(resourceId); sendResourceResponseGet(resourceId, o); } else if (event.getType() == RemoteInterpreterEventType.RESOURCE_INVOKE_METHOD) { String message = event.getData(); InvokeResourceMethodEventMessage invokeMethodMessage = - gson.fromJson(message, InvokeResourceMethodEventMessage.class); + InvokeResourceMethodEventMessage.fromJson(message); Object ret = invokeResourceMethod(invokeMethodMessage); sendInvokeMethodResult(invokeMethodMessage, ret); } else if (event.getType() == RemoteInterpreterEventType.OUTPUT_APPEND) { @@ -237,8 +236,8 @@ public class RemoteInterpreterEventPoller extends Thread { appListener.onStatusChange(noteId, paragraphId, appId, status); } else if (event.getType() == RemoteInterpreterEventType.REMOTE_ZEPPELIN_SERVER_RESOURCE) { - RemoteZeppelinServerResource reqResourceBody = gson.fromJson( - event.getData(), RemoteZeppelinServerResource.class); + RemoteZeppelinServerResource reqResourceBody = RemoteZeppelinServerResource.fromJson( + event.getData()); progressRemoteZeppelinControlEvent( reqResourceBody.getResourceType(), listener, reqResourceBody); @@ -326,7 +325,7 @@ public class RemoteInterpreterEventPoller extends Thread { resResource.setData(remoteRunners); try { - eventClient.onReceivedZeppelinResource(gson.toJson(resResource)); + eventClient.onReceivedZeppelinResource(resResource.toJson()); } catch (Exception e) { clientBroken = true; logger.error("Can't get RemoteInterpreterEvent", e); @@ -398,7 +397,7 @@ public class RemoteInterpreterEventPoller extends Thread { List<String> resourceList = client.resourcePoolGetAll(); Gson gson = new Gson(); for (String res : resourceList) { - resourceSet.add(gson.fromJson(res, Resource.class)); + resourceSet.add(Resource.fromJson(res)); } } catch (Exception e) { logger.error(e.getMessage(), e); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/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 4df3088..f501014 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 @@ -355,9 +355,7 @@ public class RemoteInterpreterServer @Override public void onReceivedZeppelinResource(String responseJson) throws TException { - RemoteZeppelinServerResource response = gson.fromJson( - responseJson, RemoteZeppelinServerResource.class); - + RemoteZeppelinServerResource response = RemoteZeppelinServerResource.fromJson(responseJson); if (response == null) { throw new TException("Bad response for remote resource"); } @@ -609,7 +607,7 @@ public class RemoteInterpreterServer ric.getReplName(), ric.getParagraphTitle(), ric.getParagraphText(), - gson.fromJson(ric.getAuthenticationInfo(), AuthenticationInfo.class), + AuthenticationInfo.fromJson(ric.getAuthenticationInfo()), (Map<String, Object>) gson.fromJson(ric.getConfig(), new TypeToken<Map<String, Object>>() {}.getType()), GUI.fromJson(ric.getGui()), @@ -942,11 +940,8 @@ public class RemoteInterpreterServer } ResourceSet resourceSet = resourcePool.getAll(false); - - Gson gson = new Gson(); - for (Resource r : resourceSet) { - result.add(gson.toJson(r)); + result.add(r.toJson()); } return result; @@ -981,7 +976,7 @@ public class RemoteInterpreterServer public ByteBuffer resourceInvokeMethod( String noteId, String paragraphId, String resourceName, String invokeMessage) { InvokeResourceMethodEventMessage message = - gson.fromJson(invokeMessage, InvokeResourceMethodEventMessage.class); + InvokeResourceMethodEventMessage.fromJson(invokeMessage); Resource resource = resourcePool.get(noteId, paragraphId, resourceName, false); if (resource == null || resource.get() == null) { @@ -1030,7 +1025,7 @@ public class RemoteInterpreterServer public void resourceResponseInvokeMethod( String invokeResourceMethodEventMessage, ByteBuffer object) throws TException { InvokeResourceMethodEventMessage message = - gson.fromJson(invokeResourceMethodEventMessage, InvokeResourceMethodEventMessage.class); + InvokeResourceMethodEventMessage.fromJson(invokeResourceMethodEventMessage); if (message.shouldPutResultIntoResourcePool()) { Resource resource = resourcePool.get( @@ -1102,7 +1097,7 @@ public class RemoteInterpreterServer logger.warn("Application instance {} is already running"); return new RemoteApplicationResult(true, ""); } - HeliumPackage pkgInfo = gson.fromJson(packageInfo, HeliumPackage.class); + HeliumPackage pkgInfo = HeliumPackage.fromJson(packageInfo); ApplicationContext context = getApplicationContext( pkgInfo, noteId, paragraphId, applicationInstanceId); try { http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/RemoteResource.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/RemoteResource.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/RemoteResource.java index 6342231..874c1cb 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/RemoteResource.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/RemoteResource.java @@ -16,10 +16,15 @@ */ package org.apache.zeppelin.resource; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; + /** * Resource that can retrieve data from remote */ -public class RemoteResource extends Resource { +public class RemoteResource extends Resource implements JsonSerializable { + private static final Gson gson = new Gson(); + ResourcePoolConnector resourcePoolConnector; RemoteResource(ResourceId resourceId, Object r) { @@ -91,4 +96,12 @@ public class RemoteResource extends Resource { returnResourceName); return resource; } + + public String toJson() { + return gson.toJson(this); + } + + public static RemoteResource fromJson(String json) { + return gson.fromJson(json, RemoteResource.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/Resource.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/Resource.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/Resource.java index 098e7ba..b57d46b 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/Resource.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/Resource.java @@ -16,6 +16,8 @@ */ package org.apache.zeppelin.resource; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,7 +28,9 @@ import java.nio.ByteBuffer; /** * Information and reference to the resource */ -public class Resource { +public class Resource implements JsonSerializable { + private static final Gson gson = new Gson(); + private final transient Object r; private final transient LocalResourcePool pool; private final boolean serializable; @@ -203,4 +207,12 @@ public class Resource { Logger logger = LoggerFactory.getLogger(Resource.class); logger.error(e.getMessage(), e); } + + public String toJson() { + return gson.toJson(this); + } + + public static Resource fromJson(String json) { + return gson.fromJson(json, Resource.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourceId.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourceId.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourceId.java index 3fb3102..bef9e3f 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourceId.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourceId.java @@ -16,10 +16,15 @@ */ package org.apache.zeppelin.resource; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; + /** * Identifying resource */ -public class ResourceId { +public class ResourceId implements JsonSerializable { + private static final Gson gson = new Gson(); + private final String resourcePoolId; private final String name; private final String noteId; @@ -80,4 +85,12 @@ public class ResourceId { return false; } } + + public String toJson() { + return gson.toJson(this); + } + + public static ResourceId fromJson(String json) { + return gson.fromJson(json, ResourceId.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourcePoolUtils.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourcePoolUtils.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourcePoolUtils.java index a55cdf9..b26995a 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourcePoolUtils.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourcePoolUtils.java @@ -17,7 +17,6 @@ package org.apache.zeppelin.resource; -import com.google.gson.Gson; import org.apache.zeppelin.interpreter.InterpreterGroup; import org.apache.zeppelin.interpreter.remote.RemoteInterpreterProcess; import org.apache.zeppelin.interpreter.thrift.RemoteInterpreterService; @@ -59,9 +58,8 @@ public class ResourcePoolUtils { continue; } List<String> resourceList = client.resourcePoolGetAll(); - Gson gson = new Gson(); for (String res : resourceList) { - resourceSet.add(gson.fromJson(res, Resource.class)); + resourceSet.add(Resource.fromJson(res)); } } catch (Exception e) { logger.error(e.getMessage(), e); @@ -108,9 +106,8 @@ public class ResourcePoolUtils { try { client = remoteInterpreterProcess.getClient(); List<String> resourceList = client.resourcePoolGetAll(); - Gson gson = new Gson(); for (String res : resourceList) { - resourceSet.add(gson.fromJson(res, Resource.class)); + resourceSet.add(Resource.fromJson(res)); } if (noteId != null) { http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourceSet.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourceSet.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourceSet.java index bbc3f06..01d3c70 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourceSet.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/resource/ResourceSet.java @@ -16,6 +16,9 @@ */ package org.apache.zeppelin.resource; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; + import java.util.Collection; import java.util.LinkedList; import java.util.regex.Pattern; @@ -23,7 +26,9 @@ import java.util.regex.Pattern; /** * List of resources */ -public class ResourceSet extends LinkedList<Resource> { +public class ResourceSet extends LinkedList<Resource> implements JsonSerializable { + + private static final Gson gson = new Gson(); public ResourceSet(Collection<Resource> resources) { super(resources); @@ -102,4 +107,12 @@ public class ResourceSet extends LinkedList<Resource> { return false; } } + + public String toJson() { + return gson.toJson(this); + } + + public static ResourceSet fromJson(String json) { + return gson.fromJson(json, ResourceSet.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/AuthenticationInfo.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/AuthenticationInfo.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/AuthenticationInfo.java index 766418a..d00d160 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/AuthenticationInfo.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/AuthenticationInfo.java @@ -18,19 +18,23 @@ package org.apache.zeppelin.user; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; - +import com.google.gson.Gson; import org.apache.commons.lang.StringUtils; +import org.apache.zeppelin.common.JsonSerializable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /*** * */ -public class AuthenticationInfo { +public class AuthenticationInfo implements JsonSerializable { private static final Logger LOG = LoggerFactory.getLogger(AuthenticationInfo.class); + private static final Gson gson = new Gson(); + String user; List<String> roles; String ticket; @@ -115,4 +119,12 @@ public class AuthenticationInfo { return ANONYMOUS.equals(this) || "anonymous".equalsIgnoreCase(this.getUser()) || StringUtils.isEmpty(this.getUser()); } + + public String toJson() { + return gson.toJson(this); + } + + public static AuthenticationInfo fromJson(String json) { + return gson.fromJson(json, AuthenticationInfo.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java index 6a2fae3..e80a89f 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/Credentials.java @@ -20,6 +20,7 @@ package org.apache.zeppelin.user; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import org.apache.zeppelin.common.JsonSerializable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -118,7 +119,7 @@ public class Credentials { fis.close(); String json = sb.toString(); - CredentialsInfoSaving info = gson.fromJson(json, CredentialsInfoSaving.class); + CredentialsInfoSaving info = CredentialsInfoSaving.fromJson(json); this.credentialsMap = info.credentialsMap; } catch (IOException e) { LOG.error("Error loading credentials file", e); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/CredentialsInfoSaving.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/CredentialsInfoSaving.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/CredentialsInfoSaving.java index 20b586c..48bb24d 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/CredentialsInfoSaving.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/CredentialsInfoSaving.java @@ -17,11 +17,24 @@ package org.apache.zeppelin.user; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; + import java.util.Map; /** * Helper class to save credentials */ -public class CredentialsInfoSaving { +public class CredentialsInfoSaving implements JsonSerializable { + private static final Gson gson = new Gson(); + public Map<String, UserCredentials> credentialsMap; + + public String toJson() { + return gson.toJson(this); + } + + public static CredentialsInfoSaving fromJson(String json) { + return gson.fromJson(json, CredentialsInfoSaving.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/GUITest.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/GUITest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/GUITest.java index 6def2e7..15af2e6 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/GUITest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/GUITest.java @@ -117,4 +117,53 @@ public class GUITest { assertTrue(gui2.forms.get("checkbox_1") instanceof CheckBox); assertEquals(options, ((CheckBox) gui2.forms.get("checkbox_1")).getOptions()); } + + // load old json file and will convert it into new forms of Input + @Test + public void testOldGson_3() throws IOException { + String oldJson = "{\n" + + " \"params\": {\n" + + " \"maxAge\": \"35\"\n" + + " },\n" + + " \"forms\": {\n" + + " \"maxAge\": {\n" + + " \"name\": \"maxAge\",\n" + + " \"defaultValue\": \"30\",\n" + + " \"hidden\": false\n" + + " }\n" + + " }\n" + + " }"; + GUI gui = GUI.fromJson(oldJson); + assertEquals(1, gui.forms.size()); + assertTrue(gui.forms.get("maxAge") instanceof TextBox); + assertEquals("30", gui.forms.get("maxAge").getDefaultValue()); + + oldJson = "{\n" + + " \"params\": {\n" + + " \"marital\": \"single\"\n" + + " },\n" + + " \"forms\": {\n" + + " \"marital\": {\n" + + " \"name\": \"marital\",\n" + + " \"defaultValue\": \"single\",\n" + + " \"options\": [\n" + + " {\n" + + " \"value\": \"single\"\n" + + " },\n" + + " {\n" + + " \"value\": \"divorced\"\n" + + " },\n" + + " {\n" + + " \"value\": \"married\"\n" + + " }\n" + + " ],\n" + + " \"hidden\": false\n" + + " }\n" + + " }\n" + + " }"; + gui = GUI.fromJson(oldJson); + assertEquals(1, gui.forms.size()); + assertTrue(gui.forms.get("marital") instanceof Select); + assertEquals("single", gui.forms.get("marital").getDefaultValue()); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-interpreter/src/test/java/org/apache/zeppelin/helium/HeliumPackageTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/helium/HeliumPackageTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/helium/HeliumPackageTest.java index a697fbd..4b91c82 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/helium/HeliumPackageTest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/helium/HeliumPackageTest.java @@ -43,7 +43,7 @@ public class HeliumPackageTest { " }\n" + "}"; - HeliumPackage p = gson.fromJson(examplePackage, HeliumPackage.class); + HeliumPackage p = HeliumPackage.fromJson(examplePackage); assertEquals(p.getSpellInfo().getMagic(), "%echo"); assertEquals(p.getSpellInfo().getUsage(), "%echo <TEXT>"); } @@ -70,7 +70,7 @@ public class HeliumPackageTest { " }\n" + "}"; - HeliumPackage p = gson.fromJson(examplePackage, HeliumPackage.class); + HeliumPackage p = HeliumPackage.fromJson(examplePackage); Map<String, Object> config = p.getConfig(); Map<String, Object> accessToken = (Map<String, Object>) config.get("access-token"); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ZeppelinHubRealm.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ZeppelinHubRealm.java b/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ZeppelinHubRealm.java index d84207d..113469f 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ZeppelinHubRealm.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ZeppelinHubRealm.java @@ -37,6 +37,7 @@ import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; +import org.apache.zeppelin.common.JsonSerializable; import org.apache.zeppelin.notebook.repo.zeppelinhub.model.UserSessionContainer; import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.utils.ZeppelinhubUtils; import org.apache.zeppelin.server.ZeppelinServer; @@ -62,7 +63,6 @@ public class ZeppelinHubRealm extends AuthorizingRealm { private static final AtomicInteger INSTANCE_COUNT = new AtomicInteger(); private final HttpClient httpClient; - private final Gson gson; private String zeppelinhubUrl; private String name; @@ -73,7 +73,6 @@ public class ZeppelinHubRealm extends AuthorizingRealm { //TODO(anthonyc): think about more setting for this HTTP client. // eg: if user uses proxy etcetc... httpClient = new HttpClient(); - gson = new Gson(); name = getClass().getName() + "_" + INSTANCE_COUNT.getAndIncrement(); } @@ -150,9 +149,9 @@ public class ZeppelinHubRealm extends AuthorizingRealm { User account = null; try { - account = gson.fromJson(responseBody, User.class); + account = User.fromJson(responseBody); } catch (JsonParseException e) { - LOG.error("Cannot deserialize ZeppelinHub response to User instance", e); + LOG.error("Cannot fromJson ZeppelinHub response to User instance", e); throw new AuthenticationException("Cannot login to ZeppelinHub"); } @@ -200,12 +199,21 @@ public class ZeppelinHubRealm extends AuthorizingRealm { } /** - * Helper class that will be use to deserialize ZeppelinHub response. + * Helper class that will be use to fromJson ZeppelinHub response. */ - protected class User { + protected static class User implements JsonSerializable { + private static final Gson gson = new Gson(); public String login; public String email; public String name; + + public String toJson() { + return gson.toJson(this); + } + + public static User fromJson(String json) { + return gson.fromJson(json, User.class); + } } public void onLoginSuccess(String username, String session) { http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java index 1342f42..c8cd79a 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java @@ -134,7 +134,7 @@ public class HeliumRestApi { return new JsonResponse(Response.Status.NOT_FOUND, "Paragraph " + paragraphId + " not found") .build(); } - HeliumPackage pkg = gson.fromJson(heliumPackage, HeliumPackage.class); + HeliumPackage pkg = HeliumPackage.fromJson(heliumPackage); String appId = helium.getApplicationFactory().loadAndRun(pkg, paragraph); return new JsonResponse(Response.Status.OK, "", appId).build(); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java ---------------------------------------------------------------------- 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 a324e57..8824d90 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 @@ -35,7 +35,6 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; -import com.google.gson.Gson; import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.zeppelin.interpreter.InterpreterSettingManager; import org.apache.zeppelin.rest.message.RestartInterpreterRequest; @@ -47,7 +46,6 @@ import org.sonatype.aether.repository.RemoteRepository; import org.apache.zeppelin.annotation.ZeppelinApi; import org.apache.zeppelin.dep.Repository; import org.apache.zeppelin.interpreter.InterpreterException; -import org.apache.zeppelin.interpreter.InterpreterFactory; import org.apache.zeppelin.interpreter.InterpreterSetting; import org.apache.zeppelin.rest.message.NewInterpreterSettingRequest; import org.apache.zeppelin.rest.message.UpdateInterpreterSettingRequest; @@ -65,8 +63,6 @@ public class InterpreterRestApi { private InterpreterSettingManager interpreterSettingManager; private NotebookServer notebookServer; - Gson gson = new Gson(); - public InterpreterRestApi() { } @@ -118,7 +114,7 @@ public class InterpreterRestApi { public Response newSettings(String message) { try { NewInterpreterSettingRequest request = - gson.fromJson(message, NewInterpreterSettingRequest.class); + NewInterpreterSettingRequest.fromJson(message); if (request == null) { return new JsonResponse<>(Status.BAD_REQUEST).build(); } @@ -144,7 +140,7 @@ public class InterpreterRestApi { try { UpdateInterpreterSettingRequest request = - gson.fromJson(message, UpdateInterpreterSettingRequest.class); + UpdateInterpreterSettingRequest.fromJson(message); interpreterSettingManager .setPropertyAndRestart(settingId, request.getOption(), request.getProperties(), request.getDependencies()); @@ -187,7 +183,7 @@ public class InterpreterRestApi { InterpreterSetting setting = interpreterSettingManager.get(settingId); try { - RestartInterpreterRequest request = gson.fromJson(message, RestartInterpreterRequest.class); + RestartInterpreterRequest request = RestartInterpreterRequest.fromJson(message); String noteId = request == null ? null : request.getNoteId(); if (null == noteId) { @@ -239,7 +235,7 @@ public class InterpreterRestApi { @ZeppelinApi public Response addRepository(String message) { try { - Repository request = gson.fromJson(message, Repository.class); + Repository request = Repository.fromJson(message); interpreterSettingManager.addRepository(request.getId(), request.getUrl(), request.isSnapshot(), request.getAuthentication(), request.getProxy()); logger.info("New repository {} added", request.getId()); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java index 5a66334..a8bcbef 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java @@ -39,7 +39,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableMap; -import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; /** @@ -52,7 +51,6 @@ public class NotebookRepoRestApi { private static final Logger LOG = LoggerFactory.getLogger(NotebookRepoRestApi.class); - private Gson gson = new Gson(); private NotebookRepoSync noteRepos; private NotebookServer notebookWsServer; @@ -91,8 +89,7 @@ public class NotebookRepoRestApi { /** * Update a specific note repo. * - * @param message - * @param settingId + * @param payload * @return */ @PUT @@ -104,7 +101,7 @@ public class NotebookRepoRestApi { AuthenticationInfo subject = new AuthenticationInfo(SecurityUtils.getPrincipal()); NotebookRepoSettingsRequest newSettings = NotebookRepoSettingsRequest.EMPTY; try { - newSettings = gson.fromJson(payload, NotebookRepoSettingsRequest.class); + newSettings = NotebookRepoSettingsRequest.fromJson(payload); } catch (JsonSyntaxException e) { LOG.error("Cannot update notebook repo settings", e); return new JsonResponse<>(Status.NOT_ACCEPTABLE, "", http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java ---------------------------------------------------------------------- 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 e18a2e7..a343879 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 @@ -332,9 +332,9 @@ public class NotebookRestApi { public Response createNote(String message) throws IOException { String user = SecurityUtils.getPrincipal(); LOG.info("Create new note by JSON {}", message); + NewNoteRequest request = NewNoteRequest.fromJson(message); AuthenticationInfo subject = new AuthenticationInfo(user); Note note = notebook.createNote(subject); - NewNoteRequest request = gson.fromJson(message, NewNoteRequest.class); if (request != null) { List<NewParagraphRequest> initialParagraphs = request.getParagraphs(); if (initialParagraphs != null) { @@ -396,7 +396,7 @@ public class NotebookRestApi { throws IOException, CloneNotSupportedException, IllegalArgumentException { LOG.info("clone note by JSON {}", message); checkIfUserCanWrite(noteId, "Insufficient privileges you cannot clone this note"); - NewNoteRequest request = gson.fromJson(message, NewNoteRequest.class); + NewNoteRequest request = NewNoteRequest.fromJson(message); String newNoteName = null; if (request != null) { newNoteName = request.getName(); @@ -427,7 +427,7 @@ public class NotebookRestApi { checkIfNoteIsNotNull(note); checkIfUserCanWrite(noteId, "Insufficient privileges you cannot add paragraph to this note"); - NewParagraphRequest request = gson.fromJson(message, NewParagraphRequest.class); + NewParagraphRequest request = NewParagraphRequest.fromJson(message); AuthenticationInfo subject = new AuthenticationInfo(user); Paragraph p; Double indexDouble = request.getIndex(); @@ -787,7 +787,7 @@ public class NotebookRestApi { throws IOException, IllegalArgumentException { LOG.info("Register cron job note={} request cron msg={}", noteId, message); - CronRequest request = gson.fromJson(message, CronRequest.class); + CronRequest request = CronRequest.fromJson(message); Note note = notebook.getNote(noteId); checkIfNoteIsNotNull(note); @@ -937,7 +937,7 @@ public class NotebookRestApi { // handle params if presented if (!StringUtils.isEmpty(message)) { RunParagraphWithParametersRequest request = - gson.fromJson(message, RunParagraphWithParametersRequest.class); + RunParagraphWithParametersRequest.fromJson(message); Map<String, Object> paramsForUpdating = request.getParams(); if (paramsForUpdating != null) { paragraph.settings.getParams().putAll(paramsForUpdating); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/CronRequest.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/CronRequest.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/CronRequest.java index 5a33931..0cd1b63 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/CronRequest.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/CronRequest.java @@ -19,13 +19,17 @@ package org.apache.zeppelin.rest.message; import java.util.Map; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; import org.apache.zeppelin.interpreter.InterpreterOption; /** * CronRequest rest api request message * */ -public class CronRequest { +public class CronRequest implements JsonSerializable { + private static final Gson gson = new Gson(); + String cron; public CronRequest (){ @@ -35,4 +39,12 @@ public class CronRequest { public String getCronString() { return cron; } + + public String toJson() { + return gson.toJson(this); + } + + public static CronRequest fromJson(String json) { + return gson.fromJson(json, CronRequest.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewInterpreterSettingRequest.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewInterpreterSettingRequest.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewInterpreterSettingRequest.java index 7e3a414..feaa303 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewInterpreterSettingRequest.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewInterpreterSettingRequest.java @@ -20,13 +20,16 @@ package org.apache.zeppelin.rest.message; import java.util.List; import java.util.Map; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; import org.apache.zeppelin.dep.Dependency; import org.apache.zeppelin.interpreter.InterpreterOption; /** * NewInterpreterSetting rest api request message */ -public class NewInterpreterSettingRequest { +public class NewInterpreterSettingRequest implements JsonSerializable { + private static final Gson gson = new Gson(); private String name; private String group; @@ -57,4 +60,12 @@ public class NewInterpreterSettingRequest { public InterpreterOption getOption() { return option; } + + public String toJson() { + return gson.toJson(this); + } + + public static NewInterpreterSettingRequest fromJson(String json) { + return gson.fromJson(json, NewInterpreterSettingRequest.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewNoteRequest.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewNoteRequest.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewNoteRequest.java index 67c1b67..42477e4 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewNoteRequest.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewNoteRequest.java @@ -20,13 +20,17 @@ package org.apache.zeppelin.rest.message; import java.util.List; import java.util.Map; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; import org.apache.zeppelin.interpreter.InterpreterOption; /** * NewNoteRequest rest api request message * */ -public class NewNoteRequest { +public class NewNoteRequest implements JsonSerializable { + private static final Gson gson = new Gson(); + String name; List<NewParagraphRequest> paragraphs; @@ -41,4 +45,12 @@ public class NewNoteRequest { public List<NewParagraphRequest> getParagraphs() { return paragraphs; } + + public String toJson() { + return gson.toJson(this); + } + + public static NewNoteRequest fromJson(String json) { + return gson.fromJson(json, NewNoteRequest.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewParagraphRequest.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewParagraphRequest.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewParagraphRequest.java index 5be732f..b7182e9 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewParagraphRequest.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewParagraphRequest.java @@ -17,6 +17,9 @@ package org.apache.zeppelin.rest.message; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; + import java.util.HashMap; /** @@ -27,7 +30,9 @@ import java.util.HashMap; * table,pieChart,multibarChart,stackedAreaChart,lineChart,scatterChart * colWidth (optional), e.g. 12.0 */ -public class NewParagraphRequest { +public class NewParagraphRequest implements JsonSerializable { + private static final Gson gson = new Gson(); + String title; String text; Double index; @@ -50,4 +55,12 @@ public class NewParagraphRequest { } public HashMap< String, Object > getConfig() { return config; } + + public String toJson() { + return gson.toJson(this); + } + + public static NewParagraphRequest fromJson(String json) { + return gson.fromJson(json, NewParagraphRequest.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NotebookRepoSettingsRequest.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NotebookRepoSettingsRequest.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NotebookRepoSettingsRequest.java index 9884476..84b3794 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NotebookRepoSettingsRequest.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NotebookRepoSettingsRequest.java @@ -19,12 +19,15 @@ package org.apache.zeppelin.rest.message; import java.util.Collections; import java.util.Map; +import com.google.gson.Gson; import org.apache.commons.lang.StringUtils; +import org.apache.zeppelin.common.JsonSerializable; /** * Represent payload of a notebook repo settings. */ -public class NotebookRepoSettingsRequest { +public class NotebookRepoSettingsRequest implements JsonSerializable { + private static final Gson gson = new Gson(); public static final NotebookRepoSettingsRequest EMPTY = new NotebookRepoSettingsRequest(); @@ -46,4 +49,12 @@ public class NotebookRepoSettingsRequest { } return repoSetting.isEmpty(); } + + public String toJson() { + return gson.toJson(this); + } + + public static NotebookRepoSettingsRequest fromJson(String json) { + return gson.fromJson(json, NotebookRepoSettingsRequest.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/RestartInterpreterRequest.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/RestartInterpreterRequest.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/RestartInterpreterRequest.java index f28be61..4a8fa44 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/RestartInterpreterRequest.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/RestartInterpreterRequest.java @@ -17,10 +17,15 @@ package org.apache.zeppelin.rest.message; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; + /** * RestartInterpreter rest api request message */ -public class RestartInterpreterRequest { +public class RestartInterpreterRequest implements JsonSerializable { + private static final Gson gson = new Gson(); + String noteId; public RestartInterpreterRequest() { @@ -30,4 +35,12 @@ public class RestartInterpreterRequest { public String getNoteId() { return noteId; } + + public String toJson() { + return gson.toJson(this); + } + + public static RestartInterpreterRequest fromJson(String json) { + return gson.fromJson(json, RestartInterpreterRequest.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/RunParagraphWithParametersRequest.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/RunParagraphWithParametersRequest.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/RunParagraphWithParametersRequest.java index 7d8095f..ff6d314 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/RunParagraphWithParametersRequest.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/RunParagraphWithParametersRequest.java @@ -17,12 +17,17 @@ package org.apache.zeppelin.rest.message; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; + import java.util.Map; /** * RunParagraphWithParametersRequest rest api request message */ -public class RunParagraphWithParametersRequest { +public class RunParagraphWithParametersRequest implements JsonSerializable { + private static final Gson gson = new Gson(); + Map<String, Object> params; public RunParagraphWithParametersRequest() { @@ -32,4 +37,12 @@ public class RunParagraphWithParametersRequest { public Map<String, Object> getParams() { return params; } + + public String toJson() { + return gson.toJson(this); + } + + public static RunParagraphWithParametersRequest fromJson(String json) { + return gson.fromJson(json, RunParagraphWithParametersRequest.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/UpdateInterpreterSettingRequest.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/UpdateInterpreterSettingRequest.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/UpdateInterpreterSettingRequest.java index c2deeff..8764e8b 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/UpdateInterpreterSettingRequest.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/UpdateInterpreterSettingRequest.java @@ -20,13 +20,17 @@ package org.apache.zeppelin.rest.message; import java.util.List; import java.util.Properties; +import com.google.gson.Gson; +import org.apache.zeppelin.common.JsonSerializable; import org.apache.zeppelin.dep.Dependency; import org.apache.zeppelin.interpreter.InterpreterOption; /** * UpdateInterpreterSetting rest api request message */ -public class UpdateInterpreterSettingRequest { +public class UpdateInterpreterSettingRequest implements JsonSerializable { + private static final Gson gson = new Gson(); + Properties properties; List<Dependency> dependencies; InterpreterOption option; @@ -49,4 +53,12 @@ public class UpdateInterpreterSettingRequest { public InterpreterOption getOption() { return option; } + + public String toJson() { + return gson.toJson(this); + } + + public static UpdateInterpreterSettingRequest fromJson(String json) { + return gson.fromJson(json, UpdateInterpreterSettingRequest.class); + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/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 667daa9..9a4ed7a 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 @@ -115,7 +115,7 @@ public class NotebookServer extends WebSocketServlet private static final Logger LOG = LoggerFactory.getLogger(NotebookServer.class); - Gson gson = new GsonBuilder() + private static Gson gson = new GsonBuilder() .registerTypeAdapterFactory(new NotebookTypeAdapterFactory<Paragraph>(Paragraph.class) { @Override protected void beforeWrite(Paragraph source, JsonElement toSerialize) { @@ -2432,7 +2432,7 @@ public class NotebookServer extends WebSocketServlet try { watcher.send( WatcherMessage.builder(noteId).subject(subject).message(serializeMessage(message)) - .build().serialize()); + .build().toJson()); } catch (IOException e) { LOG.error("Cannot broadcast message to watcher", e); } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/test/java/org/apache/zeppelin/rest/AbstractTestRestApi.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/AbstractTestRestApi.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/AbstractTestRestApi.java index 00b82fd..ac991f5 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/AbstractTestRestApi.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/AbstractTestRestApi.java @@ -52,7 +52,6 @@ import org.hamcrest.TypeSafeMatcher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import com.google.gson.JsonParser; @@ -66,7 +65,6 @@ public abstract class AbstractTestRestApi { protected static final boolean wasRunning = checkIfServerIsRunning(); static boolean pySpark = false; static boolean sparkR = false; - static Gson gson = new Gson(); static boolean isRunningWithAuth = false; private static File shiroIni = null; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java index 2714352..e1700b2 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java @@ -39,14 +39,11 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import com.google.gson.Gson; - /** * Test against spark cluster. * Spark cluster is started by CI server using testing/startSparkCluster.sh */ public class ZeppelinSparkClusterTest extends AbstractTestRestApi { - Gson gson = new Gson(); AuthenticationInfo anonymous; @BeforeClass http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java ---------------------------------------------------------------------- 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 f905227..3a0749f 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 @@ -129,19 +129,19 @@ public class NotebookServerTest extends AbstractTestRestApi { notebookServer.onOpen(sock2); verify(sock1, times(0)).send(anyString()); // getNote, getAngularObject // open the same notebook from sockets - notebookServer.onMessage(sock1, gson.toJson(new Message(OP.GET_NOTE).put("id", note1.getId()))); - notebookServer.onMessage(sock2, gson.toJson(new Message(OP.GET_NOTE).put("id", note1.getId()))); + notebookServer.onMessage(sock1, new Message(OP.GET_NOTE).put("id", note1.getId()).toJson()); + notebookServer.onMessage(sock2, new Message(OP.GET_NOTE).put("id", note1.getId()).toJson()); reset(sock1); reset(sock2); // update object from sock1 - notebookServer.onMessage(sock1, gson.toJson( + notebookServer.onMessage(sock1, new Message(OP.ANGULAR_OBJECT_UPDATED) .put("noteId", note1.getId()) .put("name", "object1") .put("value", "value1") - .put("interpreterGroupId", interpreterGroup.getId()))); + .put("interpreterGroupId", interpreterGroup.getId()).toJson()); // expect object is broadcasted except for where the update is created @@ -379,10 +379,10 @@ public class NotebookServerTest extends AbstractTestRestApi { defaultInterpreterId = settings.get(1).getId(); } // create note from sock1 - notebookServer.onMessage(sock1, gson.toJson( + notebookServer.onMessage(sock1, new Message(OP.NEW_NOTE) .put("name", noteName) - .put("defaultInterpreterId", defaultInterpreterId))); + .put("defaultInterpreterId", defaultInterpreterId).toJson()); // expect the events are broadcasted properly verify(sock1, times(2)).send(anyString()); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/Helium.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/Helium.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/Helium.java index 08014c4..2b9e320 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/Helium.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/Helium.java @@ -20,6 +20,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.zeppelin.common.JsonSerializable; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.notebook.Paragraph; import org.apache.zeppelin.resource.DistributedResourcePool; @@ -45,7 +46,6 @@ public class Helium { private final String registryPaths; private final File registryCacheDir; - private final Gson gson; private final HeliumBundleFactory bundleFactory; private final HeliumApplicationFactory applicationFactory; @@ -63,13 +63,6 @@ public class Helium { this.registryCacheDir = registryCacheDir; this.bundleFactory = bundleFactory; this.applicationFactory = applicationFactory; - - GsonBuilder builder = new GsonBuilder(); - builder.setPrettyPrinting(); - builder.registerTypeAdapter( - HeliumRegistry.class, new HeliumRegistrySerializer()); - gson = builder.create(); - heliumConf = loadConf(heliumConfPath); } @@ -124,7 +117,7 @@ public class Helium { return conf; } else { String jsonString = FileUtils.readFileToString(heliumConfFile); - HeliumConf conf = gson.fromJson(jsonString, HeliumConf.class); + HeliumConf conf = HeliumConf.fromJson(jsonString); return conf; } } @@ -133,7 +126,7 @@ public class Helium { String jsonString; synchronized (registry) { clearNotExistsPackages(); - jsonString = gson.toJson(heliumConf); + jsonString = heliumConf.toJson(); } File heliumConfFile = new File(heliumConfPath); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumApplicationFactory.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumApplicationFactory.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumApplicationFactory.java index bfebdf0..84368a7 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumApplicationFactory.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumApplicationFactory.java @@ -16,7 +16,6 @@ */ package org.apache.zeppelin.helium; -import com.google.gson.Gson; import org.apache.thrift.TException; import org.apache.zeppelin.interpreter.*; import org.apache.zeppelin.interpreter.remote.RemoteAngularObjectRegistry; @@ -38,7 +37,6 @@ import java.util.concurrent.ExecutorService; public class HeliumApplicationFactory implements ApplicationEventListener, NotebookEventListener { private final Logger logger = LoggerFactory.getLogger(HeliumApplicationFactory.class); private final ExecutorService executor; - private final Gson gson = new Gson(); private Notebook notebook; private ApplicationEventListener applicationEventListener; @@ -117,7 +115,7 @@ public class HeliumApplicationFactory implements ApplicationEventListener, Noteb try { appStatusChange(paragraph, appState.getId(), ApplicationState.Status.LOADING); - String pkgInfo = gson.toJson(pkg); + String pkgInfo = pkg.toJson(); String appId = appState.getId(); client = intpProcess.getClient(); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f36b1a15/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumBundleFactory.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumBundleFactory.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumBundleFactory.java index 2bf19d1..1ab14ba 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumBundleFactory.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumBundleFactory.java @@ -589,8 +589,7 @@ public class HeliumBundleFactory { } } } - Gson gson = new Gson(); - return gson.fromJson(sb.toString(), WebpackResult.class); + return WebpackResult.fromJson(sb.toString()); } catch (IOException e) { logger.error(e.getMessage(), e); return new WebpackResult(); @@ -609,11 +608,9 @@ public class HeliumBundleFactory { if (!packageJson.isFile()) { return null; } - Gson gson = new Gson(); try { - NpmPackage npmPackage = gson.fromJson( - FileUtils.readFileToString(packageJson), - NpmPackage.class); + NpmPackage npmPackage = NpmPackage.fromJson( + FileUtils.readFileToString(packageJson)); String[] nameVersion = new String[2]; nameVersion[0] = npmPackage.name;