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);
}
}