Fixed broken test to ensure that a field JsonAdapter annotation supersedes the class JsonAdapter annotation.
Added a map in Gson to keep track of TypeAdapters which are generated by Gson.
diff --git a/gson/src/main/java/com/google/gson/Gson.java b/gson/src/main/java/com/google/gson/Gson.java
index 4196d9a..4027d37 100644
--- a/gson/src/main/java/com/google/gson/Gson.java
+++ b/gson/src/main/java/com/google/gson/Gson.java
@@ -49,8 +49,10 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* This is the main class for using Gson. Gson is typically used by first constructing a
@@ -897,11 +899,21 @@
@Override
public String toString() {
- return new StringBuilder("{serializeNulls:")
- .append(serializeNulls)
- .append("factories:").append(factories)
+ return new StringBuilder("{serializeNulls:")
+ .append(serializeNulls)
+ .append("factories:").append(factories)
.append(",instanceCreators:").append(constructorConstructor)
.append("}")
.toString();
}
+
+ private final Set<TypeAdapter<?>> generatedTypeAdapters = new HashSet<TypeAdapter<?>>();
+ public static final class $$Internal {
+ public static void addGeneratedTypeAdapter(Gson gson, TypeAdapter<?> typeAdapter) {
+ gson.generatedTypeAdapters.add(typeAdapter);
+ }
+ public static boolean isGeneratedTypeAdapter(Gson gson, TypeAdapter<?> typeAdapter) {
+ return gson.generatedTypeAdapters.contains(typeAdapter);
+ }
+ }
}
diff --git a/gson/src/main/java/com/google/gson/internal/bind/JsonAdapterAnnotationTypeAdapterFactory.java b/gson/src/main/java/com/google/gson/internal/bind/JsonAdapterAnnotationTypeAdapterFactory.java
index 7163fe2..34f9d38 100644
--- a/gson/src/main/java/com/google/gson/internal/bind/JsonAdapterAnnotationTypeAdapterFactory.java
+++ b/gson/src/main/java/com/google/gson/internal/bind/JsonAdapterAnnotationTypeAdapterFactory.java
@@ -43,15 +43,17 @@
Class<? super T> clazz = targetType.getRawType();
JsonAdapter annotation = clazz.getAnnotation(JsonAdapter.class);
if (annotation == null) return null;
- TypeAdapter adapter = getAnnotationTypeAdapter(constructorConstructor, annotation);
+ TypeAdapter adapter = getAnnotationTypeAdapter(gson, constructorConstructor, annotation);
return adapter;
}
- static TypeAdapter<?> getAnnotationTypeAdapter(
+ static TypeAdapter<?> getAnnotationTypeAdapter(Gson gson,
ConstructorConstructor constructorConstructor, JsonAdapter annotation) {
Class<? extends TypeAdapter<?>> adapterClass = annotation.value();
ObjectConstructor<? extends TypeAdapter<?>> constructor =
constructorConstructor.get(TypeToken.get(adapterClass));
- return constructor.construct();
+ TypeAdapter<?> adapter = constructor.construct();
+ Gson.$$Internal.addGeneratedTypeAdapter(gson, adapter);
+ return adapter;
}
}
diff --git a/gson/src/main/java/com/google/gson/internal/bind/ReflectiveTypeAdapterFactory.java b/gson/src/main/java/com/google/gson/internal/bind/ReflectiveTypeAdapterFactory.java
index cc9631a..10295fc 100644
--- a/gson/src/main/java/com/google/gson/internal/bind/ReflectiveTypeAdapterFactory.java
+++ b/gson/src/main/java/com/google/gson/internal/bind/ReflectiveTypeAdapterFactory.java
@@ -71,7 +71,9 @@
}
ObjectConstructor<T> constructor = constructorConstructor.get(type);
- return new Adapter<T>(constructor, getBoundFields(gson, type, raw));
+ Adapter<T> adapter = new Adapter<T>(constructor, getBoundFields(gson, type, raw));
+ Gson.$$Internal.addGeneratedTypeAdapter(gson, adapter);
+ return adapter;
}
private ReflectiveTypeAdapterFactory.BoundField createBoundField(
@@ -99,14 +101,13 @@
};
}
- private TypeAdapter<?> getFieldAdapter(Gson context, Field field, TypeToken<?> fieldType) {
- TypeAdapter<?> adapter = context.getAdapter(fieldType);
- // check if the registered adapter is a reflective type adapter. If so, JsonAdapter
- // annotation should take precedence. Somewhat hackish, but works.
- if (adapter instanceof Adapter && field.isAnnotationPresent(JsonAdapter.class)) {
+ private TypeAdapter<?> getFieldAdapter(Gson gson, Field field, TypeToken<?> fieldType) {
+ TypeAdapter<?> adapter = gson.getAdapter(fieldType);
+ boolean generatedAdapter = Gson.$$Internal.isGeneratedTypeAdapter(gson, adapter);
+ if (generatedAdapter && field.isAnnotationPresent(JsonAdapter.class)) {
JsonAdapter annotation = field.getAnnotation(JsonAdapter.class);
return JsonAdapterAnnotationTypeAdapterFactory.getAnnotationTypeAdapter(
- constructorConstructor, annotation);
+ gson, constructorConstructor, annotation);
}
return adapter;
}