aboutsummaryrefslogtreecommitdiffstats
path: root/extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java
diff options
context:
space:
mode:
Diffstat (limited to 'extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java')
-rw-r--r--extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java49
1 files changed, 49 insertions, 0 deletions
diff --git a/extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java b/extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java
new file mode 100644
index 00000000..907fca3a
--- /dev/null
+++ b/extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java
@@ -0,0 +1,49 @@
+package com.google.gson.interceptors;
+
+import com.google.gson.Gson;
+import com.google.gson.TypeAdapter;
+import com.google.gson.TypeAdapterFactory;
+import com.google.gson.reflect.TypeToken;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
+import java.io.IOException;
+
+/**
+ * A type adapter factory that implements {@code @Intercept}.
+ */
+public final class InterceptorFactory implements TypeAdapterFactory {
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
+ Intercept intercept = type.getRawType().getAnnotation(Intercept.class);
+ if (intercept == null) {
+ return null;
+ }
+
+ TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
+ return new InterceptorAdapter<T>(delegate, intercept);
+ }
+
+ static class InterceptorAdapter<T> extends TypeAdapter<T> {
+ private final TypeAdapter<T> delegate;
+ private final JsonPostDeserializer<T> postDeserializer;
+
+ @SuppressWarnings("unchecked") // ?
+ public InterceptorAdapter(TypeAdapter<T> delegate, Intercept intercept) {
+ try {
+ this.delegate = delegate;
+ this.postDeserializer = intercept.postDeserialize().newInstance();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override public void write(JsonWriter out, T value) throws IOException {
+ delegate.write(out, value);
+ }
+
+ @Override public T read(JsonReader in) throws IOException {
+ T result = delegate.read(in);
+ postDeserializer.postDeserialize(result);
+ return result;
+ }
+ }
+}