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/11/04 01:52:31 UTC

[zeppelin] branch master updated: [ZEPPELIN-5115]. Unable to register repository with authentication info

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 8d86e65  [ZEPPELIN-5115]. Unable to register repository with authentication info
8d86e65 is described below

commit 8d86e65f67c535363531e71cc273fbfac1d88f38
Author: Jeff Zhang <zj...@apache.org>
AuthorDate: Thu Oct 29 17:13:56 2020 +0800

    [ZEPPELIN-5115]. Unable to register repository with authentication info
    
    ### What is this PR for?
    
    The root cause is `Authentication`  in `RemoteRepository` is interface. This PR fix the issue by creating `InterfaceAdapter` which works all interface types.
    
    ### What type of PR is it?
    [Bug Fix]
    
    ### Todos
    * [ ] - Task
    
    ### What is the Jira issue?
    * https://issues.apache.org/jira/browse/ZEPPELIN-5115
    
    ### How should this be tested?
    * Manually tested
    https://travis-ci.org/github/zjffdu/zeppelin/builds/739862453
    
    ### 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 <zj...@apache.org>
    
    Closes #3959 from zjffdu/ZEPPELIN-5115 and squashes the following commits:
    
    7ee6b1245 [Jeff Zhang] [ZEPPELIN-5115]. Unable to register repository with authentication info
---
 .../interpreter/InterpreterInfoSaving.java         | 53 ++++++++++++++++++++--
 1 file changed, 50 insertions(+), 3 deletions(-)

diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterInfoSaving.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterInfoSaving.java
index 04da876..80051d0 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterInfoSaving.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterInfoSaving.java
@@ -19,10 +19,17 @@ package org.apache.zeppelin.interpreter;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
 import com.google.gson.JsonParser;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
 import org.apache.commons.io.IOUtils;
 import org.apache.zeppelin.common.JsonSerializable;
+import org.eclipse.aether.repository.Authentication;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.eclipse.aether.repository.RemoteRepository;
@@ -30,6 +37,7 @@ import org.eclipse.aether.repository.RemoteRepository;
 import java.io.BufferedReader;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.lang.reflect.Type;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -45,7 +53,11 @@ import static java.nio.file.attribute.PosixFilePermission.OWNER_WRITE;
 public class InterpreterInfoSaving implements JsonSerializable {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(InterpreterInfoSaving.class);
-  private static final Gson GSON =  new GsonBuilder().setPrettyPrinting().create();
+
+  // Authentication is an interface so that we need to create an InterfaceAdapter for that.
+  private static final Gson GSON =  new GsonBuilder().setPrettyPrinting()
+          .registerTypeAdapter(Authentication.class, new InterfaceAdapter<Authentication>())
+          .create();
 
   public Map<String, InterpreterSetting> interpreterSettings = new HashMap<>();
   public List<RemoteRepository> interpreterRepositories = new ArrayList<>();
@@ -61,8 +73,8 @@ public class InterpreterInfoSaving implements JsonSerializable {
       if (infoSaving != null && infoSaving.interpreterSettings != null) {
         for (InterpreterSetting interpreterSetting : infoSaving.interpreterSettings.values()) {
           interpreterSetting.convertPermissionsFromUsersToOwners(
-              jsonObject.getAsJsonObject("interpreterSettings")
-                  .getAsJsonObject(interpreterSetting.getId()));
+                  jsonObject.getAsJsonObject("interpreterSettings")
+                          .getAsJsonObject(interpreterSetting.getId()));
         }
       }
     }
@@ -92,4 +104,39 @@ public class InterpreterInfoSaving implements JsonSerializable {
   public static InterpreterInfoSaving fromJson(String json) {
     return GSON.fromJson(json, InterpreterInfoSaving.class);
   }
+
+  static class InterfaceAdapter<T> implements JsonSerializer<T>, JsonDeserializer<T> {
+    public JsonElement serialize(T object, Type interfaceType, JsonSerializationContext context) {
+      final JsonObject wrapper = new JsonObject();
+      wrapper.addProperty("type", object.getClass().getName());
+      wrapper.add("data", context.serialize(object));
+      return wrapper;
+    }
+
+    public T deserialize(JsonElement elem,
+                         Type interfaceType,
+                         JsonDeserializationContext context) throws JsonParseException {
+      final JsonObject wrapper = (JsonObject) elem;
+      final JsonElement typeName = get(wrapper, "type");
+      final JsonElement data = get(wrapper, "data");
+      final Type actualType = typeForName(typeName);
+      return context.deserialize(data, actualType);
+    }
+
+    private Type typeForName(final JsonElement typeElem) {
+      try {
+        return Class.forName(typeElem.getAsString());
+      } catch (ClassNotFoundException e) {
+        throw new JsonParseException(e);
+      }
+    }
+
+    private JsonElement get(final JsonObject wrapper, String memberName) {
+      final JsonElement elem = wrapper.get(memberName);
+      if (elem == null)
+        throw new JsonParseException("no '" + memberName +
+                "' member found in what was expected to be an interface wrapper");
+      return elem;
+    }
+  }
 }