[JOHNZON-347] some adjustment for recent java versions, need some more love to be faster
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
index 7d24e23..b74c105 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
@@ -163,7 +163,7 @@
}
final JsonObjectGenerator objectGenerator = new JsonObjectGenerator(builderFactory);
writeObject(object, objectGenerator, null,
- isDeduplicateObjects(object.getClass()) ? new JsonPointerTracker(null, "/") : null);
+ isDedup(object.getClass()) ? new JsonPointerTracker(null, "/") : null);
return objectGenerator.getResult();
}
@@ -193,19 +193,7 @@
public void writeObjectWithGenerator(final Object object, final JsonGenerator generator) {
writeObject(object, generator, null,
- isDeduplicateObjects(object.getClass()) ? new JsonPointerTracker(null, "/") : null);
- }
-
- private boolean isDeduplicateObjects(Class<?> rootType) {
- Boolean dedup = config.isDeduplicateObjects();
- if (dedup == null) {
- Mappings.ClassMapping classMapping = mappings.findOrCreateClassMapping(rootType);
- if (classMapping != null) {
- dedup = classMapping.isDeduplicateObjects();
- }
- }
-
- return dedup != null ? dedup : false;
+ isDedup(object.getClass()) ? new JsonPointerTracker(null, "/") : null);
}
public void writeObject(final Object object, final OutputStream stream) {
@@ -389,7 +377,17 @@
if (clazz instanceof Class &&
JsonValue.class != clazz && JsonStructure.class != clazz &&
JsonObject.class != clazz && JsonArray.class != clazz) {
- return isDeduplicateObjects((Class) clazz);
+ Boolean dedup = config.isDeduplicateObjects();
+ if (dedup == null) {
+ // TODO: never call it more than once per clazz, should be done after once ClassMapping is obtained, not here!
+ // -> revisit org.apache.johnzon.mapper.Mappings.findOrCreateClassMapping (isPrimitive should drop)
+ // -> revisit org.apache.johnzon.mapper.access.FieldAccessMode.isIgnored(java.lang.String, java.lang.Class<?>)
+ Mappings.ClassMapping classMapping = mappings.findOrCreateClassMapping(clazz);
+ if (classMapping != null) {
+ dedup = classMapping.isDeduplicateObjects();
+ }
+ }
+ return dedup != null ? dedup : false;
}
return false;
}
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
index 37259d7..23141be 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
@@ -408,6 +408,9 @@
}
public ClassMapping findOrCreateClassMapping(final Type clazz) {
+ if (isPrimitive(clazz)) {
+ return null;
+ }
return doFindOrCreateClassMapping(clazz, emptyMap(), false);
}
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
index d87cd1b..d954cdc 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
@@ -23,6 +23,7 @@
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.apache.johnzon.mapper.Adapter;
@@ -41,7 +42,7 @@
final Map<String, Reader> readers = new HashMap<String, Reader>();
for (final Map.Entry<String, Field> f : fields(clazz, true).entrySet()) {
final String key = f.getKey();
- if (isIgnored(key) || Meta.getAnnotation(f.getValue(), JohnzonAny.class) != null) {
+ if (isIgnored(key, f.getValue().getDeclaringClass()) || Meta.getAnnotation(f.getValue(), JohnzonAny.class) != null) {
continue;
}
@@ -56,7 +57,7 @@
final Map<String, Writer> writers = new HashMap<String, Writer>();
for (final Map.Entry<String, Field> f : fields(clazz, false).entrySet()) {
final String key = f.getKey();
- if (isIgnored(key)) {
+ if (isIgnored(key, f.getValue().getDeclaringClass())) {
continue;
}
@@ -71,6 +72,10 @@
return property != null ? property.value() : key;
}
+ protected boolean isIgnored(final String key, final Class<?> clazz) {
+ return isIgnored(key) || (clazz.getName().startsWith("java.") && (Map.class.isAssignableFrom(clazz) || List.class.isAssignableFrom(clazz)));
+ }
+
protected boolean isIgnored(final String key) {
return key.contains("$");
}