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

technoboy pushed a commit to branch restful-api
in repository https://gitbox.apache.org/repos/asf/shardingsphere-elasticjob.git


The following commit(s) were added to refs/heads/restful-api by this push:
     new 7ec1294  Improve flexibility of (de)serializer (#1390)
7ec1294 is described below

commit 7ec129425ddfeb0e4d24565b5d63d503c20f079f
Author: 吴伟杰 <[email protected]>
AuthorDate: Fri Aug 21 12:27:03 2020 +0800

    Improve flexibility of (de)serializer (#1390)
---
 .../RequestBodyDeserializerFactory.java            | 48 +++++++++++++++++++++-
 .../DeserializerFactory.java}                      | 35 ++++++++--------
 ...DefaultJsonRequestBodyDeserializerFactory.java} | 18 +++-----
 ...ltTextPlainRequestBodyDeserializerFactory.java} | 20 ++++-----
 ...ava => DefaultJsonRequestBodyDeserializer.java} |  8 +++-
 ...> DefaultTextPlainRequestBodyDeserializer.java} |  4 +-
 .../serializer/ResponseBodySerializerFactory.java  | 48 +++++++++++++++++++++-
 .../SerializerFactory.java}                        | 35 ++++++++--------
 .../DefaultJsonResponseBodySerializerFactory.java} | 17 ++++----
 ...java => DefaultJsonResponseBodySerializer.java} | 10 +++--
 ...stful.deserializer.factory.DeserializerFactory} |  4 +-
 ...b.restful.serializer.factory.SerializerFactory} |  2 +-
 .../RequestBodyDeserializerFactoryTest.java}       | 29 ++++++-------
 .../ResponseBodySerializerFactoryTest.java}        | 29 ++++++-------
 14 files changed, 194 insertions(+), 113 deletions(-)

diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/RequestBodyDeserializerFactory.java
 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/RequestBodyDeserializerFactory.java
index 7dc6ada..5971712 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/RequestBodyDeserializerFactory.java
+++ 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/RequestBodyDeserializerFactory.java
@@ -19,8 +19,10 @@ package 
org.apache.shardingsphere.elasticjob.restful.deserializer;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.elasticjob.restful.deserializer.factory.DeserializerFactory;
 
 import java.util.Map;
+import java.util.Optional;
 import java.util.ServiceLoader;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -32,19 +34,63 @@ public final class RequestBodyDeserializerFactory {
     
     private static final Map<String, RequestBodyDeserializer> 
REQUEST_BODY_DESERIALIZERS = new ConcurrentHashMap<>();
     
+    private static final Map<String, DeserializerFactory> 
DEFAULT_REQUEST_BODY_DESERIALIZER_FACTORIES = new ConcurrentHashMap<>();
+    
+    private static final RequestBodyDeserializer MISSING_DESERIALIZER = new 
RequestBodyDeserializer() {
+        @Override
+        public String mimeType() {
+            throw new UnsupportedOperationException();
+        }
+        
+        @Override
+        public <T> T deserialize(final Class<T> targetType, final byte[] 
requestBodyBytes) {
+            throw new UnsupportedOperationException();
+        }
+    };
+    
     static {
         for (RequestBodyDeserializer deserializer : 
ServiceLoader.load(RequestBodyDeserializer.class)) {
             REQUEST_BODY_DESERIALIZERS.put(deserializer.mimeType(), 
deserializer);
         }
+        for (DeserializerFactory factory : 
ServiceLoader.load(DeserializerFactory.class)) {
+            
DEFAULT_REQUEST_BODY_DESERIALIZER_FACTORIES.put(factory.mimeType(), factory);
+        }
     }
     
     /**
      * Get deserializer for specific HTTP content type.
      *
+     * <p>
+     * This method will look for a deserializer instance of specific MIME type.
+     * If deserializer not found, this method would look for deserializer 
factory by MIME type.
+     * If it is still not found, the MIME type would be marked as 
<code>MISSING_DESERIALIZER</code>.
+     * </p>
+     *
+     * <p>
+     * Some default deserializer will be provided by {@link 
DeserializerFactory},
+     * so developers can implement {@link RequestBodyDeserializer} and 
register it by SPI to override default deserializer.
+     * </p>
+     *
      * @param contentType HTTP content type
      * @return Deserializer
      */
     public static RequestBodyDeserializer getRequestBodyDeserializer(final 
String contentType) {
-        return REQUEST_BODY_DESERIALIZERS.get(contentType);
+        RequestBodyDeserializer deserializer = 
REQUEST_BODY_DESERIALIZERS.get(contentType);
+        if (null == deserializer) {
+            synchronized (RequestBodyDeserializerFactory.class) {
+                if (null == REQUEST_BODY_DESERIALIZERS.get(contentType)) {
+                    
instantiateRequestBodyDeserializerFromFactories(contentType);
+                }
+                deserializer = REQUEST_BODY_DESERIALIZERS.get(contentType);
+            }
+        }
+        return deserializer != MISSING_DESERIALIZER ? deserializer : null;
+    }
+    
+    private static void instantiateRequestBodyDeserializerFromFactories(final 
String contentType) {
+        RequestBodyDeserializer deserializer;
+        DeserializerFactory factory = 
DEFAULT_REQUEST_BODY_DESERIALIZER_FACTORIES.get(contentType);
+        deserializer = 
Optional.ofNullable(factory).map(DeserializerFactory::createDeserializer).orElse(MISSING_DESERIALIZER);
+        REQUEST_BODY_DESERIALIZERS.put(contentType, deserializer);
     }
 }
diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/factory/DeserializerFactory.java
similarity index 60%
copy from 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
copy to 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/factory/DeserializerFactory.java
index e742a6f..5106d85 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
+++ 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/factory/DeserializerFactory.java
@@ -15,28 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.elasticjob.restful.deserializer.impl;
+package org.apache.shardingsphere.elasticjob.restful.deserializer.factory;
 
-import com.google.gson.Gson;
-import io.netty.handler.codec.http.HttpHeaderValues;
 import 
org.apache.shardingsphere.elasticjob.restful.deserializer.RequestBodyDeserializer;
 
-import java.nio.charset.StandardCharsets;
-
 /**
- * Deserializer for <code>application/json</code>.
+ * Deserializer factory.
+ *
+ * @see RequestBodyDeserializer
+ * @see 
org.apache.shardingsphere.elasticjob.restful.deserializer.RequestBodyDeserializerFactory
  */
-public final class JsonRequestBodyDeserializer implements 
RequestBodyDeserializer {
-    
-    private final Gson gson = new Gson();
+public interface DeserializerFactory {
     
-    @Override
-    public String mimeType() {
-        return HttpHeaderValues.APPLICATION_JSON.toString();
-    }
+    /**
+     * Specify which type would be deserialized by the deserializer created by 
this factory.
+     *
+     * @return MIME type
+     */
+    String mimeType();
     
-    @Override
-    public <T> T deserialize(final Class<T> targetType, final byte[] 
requestBodyBytes) {
-        return gson.fromJson(new String(requestBodyBytes, 
StandardCharsets.UTF_8), targetType);
-    }
+    /**
+     * Deserializer factory method.
+     *
+     * @return Instance of deserializer
+     */
+    RequestBodyDeserializer createDeserializer();
 }
diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/factory/impl/DefaultJsonRequestBodyDeserializerFactory.java
similarity index 71%
copy from 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
copy to 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/factory/impl/DefaultJsonRequestBodyDeserializerFactory.java
index e742a6f..4fc01a8 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
+++ 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/factory/impl/DefaultJsonRequestBodyDeserializerFactory.java
@@ -15,20 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.elasticjob.restful.deserializer.impl;
+package org.apache.shardingsphere.elasticjob.restful.deserializer.factory.impl;
 
-import com.google.gson.Gson;
 import io.netty.handler.codec.http.HttpHeaderValues;
 import 
org.apache.shardingsphere.elasticjob.restful.deserializer.RequestBodyDeserializer;
+import 
org.apache.shardingsphere.elasticjob.restful.deserializer.factory.DeserializerFactory;
+import 
org.apache.shardingsphere.elasticjob.restful.deserializer.impl.DefaultJsonRequestBodyDeserializer;
 
-import java.nio.charset.StandardCharsets;
-
-/**
- * Deserializer for <code>application/json</code>.
- */
-public final class JsonRequestBodyDeserializer implements 
RequestBodyDeserializer {
-    
-    private final Gson gson = new Gson();
+public final class DefaultJsonRequestBodyDeserializerFactory implements 
DeserializerFactory {
     
     @Override
     public String mimeType() {
@@ -36,7 +30,7 @@ public final class JsonRequestBodyDeserializer implements 
RequestBodyDeserialize
     }
     
     @Override
-    public <T> T deserialize(final Class<T> targetType, final byte[] 
requestBodyBytes) {
-        return gson.fromJson(new String(requestBodyBytes, 
StandardCharsets.UTF_8), targetType);
+    public RequestBodyDeserializer createDeserializer() {
+        return new DefaultJsonRequestBodyDeserializer();
     }
 }
diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/factory/impl/DefaultTextPlainRequestBodyDeserializerFactory.java
similarity index 67%
copy from 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
copy to 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/factory/impl/DefaultTextPlainRequestBodyDeserializerFactory.java
index e742a6f..5544f63 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
+++ 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/factory/impl/DefaultTextPlainRequestBodyDeserializerFactory.java
@@ -15,28 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.elasticjob.restful.deserializer.impl;
+package org.apache.shardingsphere.elasticjob.restful.deserializer.factory.impl;
 
-import com.google.gson.Gson;
 import io.netty.handler.codec.http.HttpHeaderValues;
 import 
org.apache.shardingsphere.elasticjob.restful.deserializer.RequestBodyDeserializer;
+import 
org.apache.shardingsphere.elasticjob.restful.deserializer.factory.DeserializerFactory;
+import 
org.apache.shardingsphere.elasticjob.restful.deserializer.impl.DefaultTextPlainRequestBodyDeserializer;
 
-import java.nio.charset.StandardCharsets;
-
-/**
- * Deserializer for <code>application/json</code>.
- */
-public final class JsonRequestBodyDeserializer implements 
RequestBodyDeserializer {
-    
-    private final Gson gson = new Gson();
+public final class DefaultTextPlainRequestBodyDeserializerFactory implements 
DeserializerFactory {
     
     @Override
     public String mimeType() {
-        return HttpHeaderValues.APPLICATION_JSON.toString();
+        return HttpHeaderValues.TEXT_PLAIN.toString();
     }
     
     @Override
-    public <T> T deserialize(final Class<T> targetType, final byte[] 
requestBodyBytes) {
-        return gson.fromJson(new String(requestBodyBytes, 
StandardCharsets.UTF_8), targetType);
+    public RequestBodyDeserializer createDeserializer() {
+        return new DefaultTextPlainRequestBodyDeserializer();
     }
 }
diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/DefaultJsonRequestBodyDeserializer.java
similarity index 83%
copy from 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
copy to 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/DefaultJsonRequestBodyDeserializer.java
index e742a6f..0491ed2 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
+++ 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/DefaultJsonRequestBodyDeserializer.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.elasticjob.restful.deserializer.impl;
 
 import com.google.gson.Gson;
 import io.netty.handler.codec.http.HttpHeaderValues;
+import org.apache.shardingsphere.elasticjob.infra.json.GsonFactory;
 import 
org.apache.shardingsphere.elasticjob.restful.deserializer.RequestBodyDeserializer;
 
 import java.nio.charset.StandardCharsets;
@@ -26,9 +27,9 @@ import java.nio.charset.StandardCharsets;
 /**
  * Deserializer for <code>application/json</code>.
  */
-public final class JsonRequestBodyDeserializer implements 
RequestBodyDeserializer {
+public final class DefaultJsonRequestBodyDeserializer implements 
RequestBodyDeserializer {
     
-    private final Gson gson = new Gson();
+    private final Gson gson = GsonFactory.getGson();
     
     @Override
     public String mimeType() {
@@ -37,6 +38,9 @@ public final class JsonRequestBodyDeserializer implements 
RequestBodyDeserialize
     
     @Override
     public <T> T deserialize(final Class<T> targetType, final byte[] 
requestBodyBytes) {
+        if (0 == requestBodyBytes.length) {
+            return null;
+        }
         return gson.fromJson(new String(requestBodyBytes, 
StandardCharsets.UTF_8), targetType);
     }
 }
diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/TextPlainRequestBodyDeserializer.java
 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/DefaultTextPlainRequestBodyDeserializer.java
similarity index 92%
rename from 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/TextPlainRequestBodyDeserializer.java
rename to 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/DefaultTextPlainRequestBodyDeserializer.java
index 3268f0c..d27c761 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/TextPlainRequestBodyDeserializer.java
+++ 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/DefaultTextPlainRequestBodyDeserializer.java
@@ -24,9 +24,9 @@ import java.nio.charset.StandardCharsets;
 import java.text.MessageFormat;
 
 /**
- * Deserializer for <code>text/plain</code>.
+ * Default deserializer for <code>text/plain</code>.
  */
-public final class TextPlainRequestBodyDeserializer implements 
RequestBodyDeserializer {
+public final class DefaultTextPlainRequestBodyDeserializer implements 
RequestBodyDeserializer {
     
     @Override
     public String mimeType() {
diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/ResponseBodySerializerFactory.java
 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/ResponseBodySerializerFactory.java
index 118dfb3..1377bab 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/ResponseBodySerializerFactory.java
+++ 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/ResponseBodySerializerFactory.java
@@ -19,8 +19,10 @@ package 
org.apache.shardingsphere.elasticjob.restful.serializer;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.elasticjob.restful.serializer.factory.SerializerFactory;
 
 import java.util.Map;
+import java.util.Optional;
 import java.util.ServiceLoader;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -32,19 +34,63 @@ public final class ResponseBodySerializerFactory {
     
     private static final Map<String, ResponseBodySerializer> 
RESPONSE_BODY_SERIALIZERS = new ConcurrentHashMap<>();
     
+    private static final Map<String, SerializerFactory> 
RESPONSE_BODY_SERIALIZER_FACTORIES = new ConcurrentHashMap<>();
+    
+    private static final ResponseBodySerializer MISSING_SERIALIZER = new 
ResponseBodySerializer() {
+        @Override
+        public String mimeType() {
+            throw new UnsupportedOperationException();
+        }
+        
+        @Override
+        public byte[] serialize(final Object responseBody) {
+            throw new UnsupportedOperationException();
+        }
+    };
+    
     static {
         for (ResponseBodySerializer serializer : 
ServiceLoader.load(ResponseBodySerializer.class)) {
             RESPONSE_BODY_SERIALIZERS.put(serializer.mimeType(), serializer);
         }
+        for (SerializerFactory factory : 
ServiceLoader.load(SerializerFactory.class)) {
+            RESPONSE_BODY_SERIALIZER_FACTORIES.put(factory.mimeType(), 
factory);
+        }
     }
     
     /**
      * Get serializer for specific HTTP content type.
      *
+     * <p>
+     * This method will look for a serializer instance of specific MIME type.
+     * If serializer not found, this method would look for serializer factory 
by MIME type.
+     * If it is still not found, the MIME type would be marked as 
<code>MISSING_SERIALIZER</code>.
+     * </p>
+     *
+     * <p>
+     * Some default serializer will be provided by {@link SerializerFactory},
+     * so developers can implement {@link ResponseBodySerializer} and register 
it by SPI to override default serializer.
+     * </p>
+     *
      * @param contentType HTTP content type
      * @return Serializer
      */
     public static ResponseBodySerializer getResponseBodySerializer(final 
String contentType) {
-        return RESPONSE_BODY_SERIALIZERS.get(contentType);
+        ResponseBodySerializer serializer = 
RESPONSE_BODY_SERIALIZERS.get(contentType);
+        if (null == serializer) {
+            synchronized (ResponseBodySerializerFactory.class) {
+                if (null == RESPONSE_BODY_SERIALIZERS.get(contentType)) {
+                    
instantiateResponseBodySerializerFromFactories(contentType);
+                }
+                serializer = RESPONSE_BODY_SERIALIZERS.get(contentType);
+            }
+        }
+        return serializer != MISSING_SERIALIZER ? serializer : null;
+    }
+    
+    private static void instantiateResponseBodySerializerFromFactories(final 
String contentType) {
+        ResponseBodySerializer serializer;
+        SerializerFactory factory = 
RESPONSE_BODY_SERIALIZER_FACTORIES.get(contentType);
+        serializer = 
Optional.ofNullable(factory).map(SerializerFactory::createSerializer).orElse(MISSING_SERIALIZER);
+        RESPONSE_BODY_SERIALIZERS.put(contentType, serializer);
     }
 }
diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/JsonResponseBodySerializer.java
 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/factory/SerializerFactory.java
similarity index 63%
copy from 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/JsonResponseBodySerializer.java
copy to 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/factory/SerializerFactory.java
index 5552fcb..3591fff 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/JsonResponseBodySerializer.java
+++ 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/factory/SerializerFactory.java
@@ -15,28 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.elasticjob.restful.serializer.impl;
+package org.apache.shardingsphere.elasticjob.restful.serializer.factory;
 
-import com.google.gson.Gson;
-import io.netty.handler.codec.http.HttpHeaderValues;
 import 
org.apache.shardingsphere.elasticjob.restful.serializer.ResponseBodySerializer;
 
-import java.nio.charset.StandardCharsets;
-
 /**
- * Serializer for <code>application/json</code>.
+ * Serializer factory.
+ *
+ * @see ResponseBodySerializer
+ * @see 
org.apache.shardingsphere.elasticjob.restful.serializer.ResponseBodySerializerFactory
  */
-public final class JsonResponseBodySerializer implements 
ResponseBodySerializer {
-    
-    private final Gson gson = new Gson();
+public interface SerializerFactory {
     
-    @Override
-    public String mimeType() {
-        return HttpHeaderValues.APPLICATION_JSON.toString();
-    }
+    /**
+     * Specify which type would be serialized by the serializer created by 
this factory.
+     *
+     * @return MIME type
+     */
+    String mimeType();
     
-    @Override
-    public byte[] serialize(final Object responseBody) {
-        return gson.toJson(responseBody).getBytes(StandardCharsets.UTF_8);
-    }
+    /**
+     * Serializer factory method.
+     *
+     * @return Instance of serializer
+     */
+    ResponseBodySerializer createSerializer();
 }
diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/JsonResponseBodySerializer.java
 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/factory/impl/DefaultJsonResponseBodySerializerFactory.java
similarity index 71%
copy from 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/JsonResponseBodySerializer.java
copy to 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/factory/impl/DefaultJsonResponseBodySerializerFactory.java
index 5552fcb..bb7de3c 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/JsonResponseBodySerializer.java
+++ 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/factory/impl/DefaultJsonResponseBodySerializerFactory.java
@@ -15,20 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.elasticjob.restful.serializer.impl;
+package org.apache.shardingsphere.elasticjob.restful.serializer.factory.impl;
 
-import com.google.gson.Gson;
 import io.netty.handler.codec.http.HttpHeaderValues;
 import 
org.apache.shardingsphere.elasticjob.restful.serializer.ResponseBodySerializer;
-
-import java.nio.charset.StandardCharsets;
+import 
org.apache.shardingsphere.elasticjob.restful.serializer.factory.SerializerFactory;
+import 
org.apache.shardingsphere.elasticjob.restful.serializer.impl.DefaultJsonResponseBodySerializer;
 
 /**
- * Serializer for <code>application/json</code>.
+ * Factory for {@link DefaultJsonResponseBodySerializer}.
  */
-public final class JsonResponseBodySerializer implements 
ResponseBodySerializer {
-    
-    private final Gson gson = new Gson();
+public final class DefaultJsonResponseBodySerializerFactory implements 
SerializerFactory {
     
     @Override
     public String mimeType() {
@@ -36,7 +33,7 @@ public final class JsonResponseBodySerializer implements 
ResponseBodySerializer
     }
     
     @Override
-    public byte[] serialize(final Object responseBody) {
-        return gson.toJson(responseBody).getBytes(StandardCharsets.UTF_8);
+    public ResponseBodySerializer createSerializer() {
+        return new DefaultJsonResponseBodySerializer();
     }
 }
diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/JsonResponseBodySerializer.java
 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/DefaultJsonResponseBodySerializer.java
similarity index 77%
copy from 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/JsonResponseBodySerializer.java
copy to 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/DefaultJsonResponseBodySerializer.java
index 5552fcb..3baef78 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/JsonResponseBodySerializer.java
+++ 
b/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/DefaultJsonResponseBodySerializer.java
@@ -19,16 +19,17 @@ package 
org.apache.shardingsphere.elasticjob.restful.serializer.impl;
 
 import com.google.gson.Gson;
 import io.netty.handler.codec.http.HttpHeaderValues;
+import org.apache.shardingsphere.elasticjob.infra.json.GsonFactory;
 import 
org.apache.shardingsphere.elasticjob.restful.serializer.ResponseBodySerializer;
 
 import java.nio.charset.StandardCharsets;
 
 /**
- * Serializer for <code>application/json</code>.
+ * Default serializer for <code>application/json</code>.
  */
-public final class JsonResponseBodySerializer implements 
ResponseBodySerializer {
+public final class DefaultJsonResponseBodySerializer implements 
ResponseBodySerializer {
     
-    private final Gson gson = new Gson();
+    private final Gson gson = GsonFactory.getGson();
     
     @Override
     public String mimeType() {
@@ -37,6 +38,9 @@ public final class JsonResponseBodySerializer implements 
ResponseBodySerializer
     
     @Override
     public byte[] serialize(final Object responseBody) {
+        if (responseBody instanceof String) {
+            return ((String) responseBody).getBytes(StandardCharsets.UTF_8);
+        }
         return gson.toJson(responseBody).getBytes(StandardCharsets.UTF_8);
     }
 }
diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.restful.deserializer.RequestBodyDeserializer
 
b/elasticjob-infra/elasticjob-restful/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.restful.deserializer.factory.DeserializerFactory
similarity index 77%
rename from 
elasticjob-infra/elasticjob-restful/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.restful.deserializer.RequestBodyDeserializer
rename to 
elasticjob-infra/elasticjob-restful/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.restful.deserializer.factory.DeserializerFactory
index b0a4b73..27acaea 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.restful.deserializer.RequestBodyDeserializer
+++ 
b/elasticjob-infra/elasticjob-restful/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.restful.deserializer.factory.DeserializerFactory
@@ -15,5 +15,5 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.elasticjob.restful.deserializer.impl.JsonRequestBodyDeserializer
-org.apache.shardingsphere.elasticjob.restful.deserializer.impl.TextPlainRequestBodyDeserializer
+org.apache.shardingsphere.elasticjob.restful.deserializer.factory.impl.DefaultJsonRequestBodyDeserializerFactory
+org.apache.shardingsphere.elasticjob.restful.deserializer.factory.impl.DefaultTextPlainRequestBodyDeserializerFactory
diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.restful.serializer.ResponseBodySerializer
 
b/elasticjob-infra/elasticjob-restful/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.restful.serializer.factory.SerializerFactory
similarity index 87%
rename from 
elasticjob-infra/elasticjob-restful/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.restful.serializer.ResponseBodySerializer
rename to 
elasticjob-infra/elasticjob-restful/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.restful.serializer.factory.SerializerFactory
index 5b02313..a24048b 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.restful.serializer.ResponseBodySerializer
+++ 
b/elasticjob-infra/elasticjob-restful/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.restful.serializer.factory.SerializerFactory
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.elasticjob.restful.serializer.impl.JsonResponseBodySerializer
+org.apache.shardingsphere.elasticjob.restful.serializer.factory.impl.DefaultJsonResponseBodySerializerFactory
diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
 
b/elasticjob-infra/elasticjob-restful/src/test/java/org/apache/shardingsphere/elasticjob/restful/deserializer/RequestBodyDeserializerFactoryTest.java
similarity index 58%
rename from 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
rename to 
elasticjob-infra/elasticjob-restful/src/test/java/org/apache/shardingsphere/elasticjob/restful/deserializer/RequestBodyDeserializerFactoryTest.java
index e742a6f..6181e10 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/deserializer/impl/JsonRequestBodyDeserializer.java
+++ 
b/elasticjob-infra/elasticjob-restful/src/test/java/org/apache/shardingsphere/elasticjob/restful/deserializer/RequestBodyDeserializerFactoryTest.java
@@ -15,28 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.elasticjob.restful.deserializer.impl;
+package org.apache.shardingsphere.elasticjob.restful.deserializer;
 
-import com.google.gson.Gson;
 import io.netty.handler.codec.http.HttpHeaderValues;
-import 
org.apache.shardingsphere.elasticjob.restful.deserializer.RequestBodyDeserializer;
+import org.junit.Test;
 
-import java.nio.charset.StandardCharsets;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 
-/**
- * Deserializer for <code>application/json</code>.
- */
-public final class JsonRequestBodyDeserializer implements 
RequestBodyDeserializer {
-    
-    private final Gson gson = new Gson();
+public class RequestBodyDeserializerFactoryTest {
     
-    @Override
-    public String mimeType() {
-        return HttpHeaderValues.APPLICATION_JSON.toString();
+    @Test
+    public void assertGetJsonDefaultDeserializer() {
+        RequestBodyDeserializer deserializer = 
RequestBodyDeserializerFactory.getRequestBodyDeserializer(HttpHeaderValues.APPLICATION_JSON.toString());
+        assertNotNull(deserializer);
     }
     
-    @Override
-    public <T> T deserialize(final Class<T> targetType, final byte[] 
requestBodyBytes) {
-        return gson.fromJson(new String(requestBodyBytes, 
StandardCharsets.UTF_8), targetType);
+    @Test
+    public void assertDeserializerNotFound() {
+        RequestBodyDeserializer deserializer = 
RequestBodyDeserializerFactory.getRequestBodyDeserializer("Unknown");
+        assertNull(deserializer);
     }
 }
diff --git 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/JsonResponseBodySerializer.java
 
b/elasticjob-infra/elasticjob-restful/src/test/java/org/apache/shardingsphere/elasticjob/restful/serializer/ResponseBodySerializerFactoryTest.java
similarity index 56%
rename from 
elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/JsonResponseBodySerializer.java
rename to 
elasticjob-infra/elasticjob-restful/src/test/java/org/apache/shardingsphere/elasticjob/restful/serializer/ResponseBodySerializerFactoryTest.java
index 5552fcb..552a3d8 100644
--- 
a/elasticjob-infra/elasticjob-restful/src/main/java/org/apache/shardingsphere/elasticjob/restful/serializer/impl/JsonResponseBodySerializer.java
+++ 
b/elasticjob-infra/elasticjob-restful/src/test/java/org/apache/shardingsphere/elasticjob/restful/serializer/ResponseBodySerializerFactoryTest.java
@@ -15,28 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.elasticjob.restful.serializer.impl;
+package org.apache.shardingsphere.elasticjob.restful.serializer;
 
-import com.google.gson.Gson;
 import io.netty.handler.codec.http.HttpHeaderValues;
-import 
org.apache.shardingsphere.elasticjob.restful.serializer.ResponseBodySerializer;
+import org.junit.Test;
 
-import java.nio.charset.StandardCharsets;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 
-/**
- * Serializer for <code>application/json</code>.
- */
-public final class JsonResponseBodySerializer implements 
ResponseBodySerializer {
-    
-    private final Gson gson = new Gson();
+public class ResponseBodySerializerFactoryTest {
     
-    @Override
-    public String mimeType() {
-        return HttpHeaderValues.APPLICATION_JSON.toString();
+    @Test
+    public void assertGetJsonDefaultSerializer() {
+        ResponseBodySerializer serializer = 
ResponseBodySerializerFactory.getResponseBodySerializer(HttpHeaderValues.APPLICATION_JSON.toString());
+        assertNotNull(serializer);
     }
     
-    @Override
-    public byte[] serialize(final Object responseBody) {
-        return gson.toJson(responseBody).getBytes(StandardCharsets.UTF_8);
+    @Test
+    public void assertSerializerNotFound() {
+        ResponseBodySerializer serializer = 
ResponseBodySerializerFactory.getResponseBodySerializer("Unknown");
+        assertNull(serializer);
     }
 }

Reply via email to