blob: 3f28a86d6871e3375cbef17e6e6d9be2b00bf74b [file] [log] [blame]
### Eclipse Workspace Patch 1.0
#P jackson-trunk
Index: src/java/org/codehaus/jackson/map/ClassIntrospector.java
===================================================================
--- src/java/org/codehaus/jackson/map/ClassIntrospector.java (revision 321)
+++ src/java/org/codehaus/jackson/map/ClassIntrospector.java (working copy)
@@ -1,5 +1,7 @@
package org.codehaus.jackson.map;
+import java.util.Set;
+
/**
* Helper class used to introspect features of POJO value classes
* used with Jackson. The main use is for finding out
@@ -21,7 +23,7 @@
* Factory method that constructs an introspector that has all
* information needed for serialization purposes.
*/
- public abstract T forSerialization(SerializationConfig cfg, Class<?> c);
+ public abstract T forSerialization(SerializationConfig cfg, Class<?> c, Set<Class<?>> mixins);
/**
* Factory method that constructs an introspector that has all
@@ -42,6 +44,6 @@
* information regarding annotations class itself has, but nothing
* on methods or constructors.
*/
- public abstract T forClassAnnotations(Class<?> c);
+ public abstract T forClassAnnotations(Class<?> c, Set<Class<?>> mixins);
}
Index: src/java/org/codehaus/jackson/map/SerializationConfig.java
===================================================================
--- src/java/org/codehaus/jackson/map/SerializationConfig.java (revision 321)
+++ src/java/org/codehaus/jackson/map/SerializationConfig.java (working copy)
@@ -1,6 +1,7 @@
package org.codehaus.jackson.map;
import java.text.DateFormat;
+import java.util.Set;
import org.codehaus.jackson.annotate.*;
import org.codehaus.jackson.map.util.StdDateFormat;
@@ -243,8 +244,9 @@
* of building a bean serializer
*/
@SuppressWarnings("unchecked")
- public <T extends BeanDescription> T introspect(Class<?> cls) {
- return (T) _classIntrospector.forSerialization(this, cls);
+ public <T extends BeanDescription> T introspect(Class<?> cls, Set<Class<?>> mixins) {
+ System.out.println("1111 " + cls + ", " + mixins);
+ return (T) _classIntrospector.forSerialization(this, cls, mixins);
}
/**
@@ -252,8 +254,8 @@
* annotations: useful if no getter/setter/creator information is needed.
*/
@SuppressWarnings("unchecked")
- public <T extends BeanDescription> T introspectClassAnnotations(Class<?> cls) {
- return (T) _classIntrospector.forClassAnnotations(cls);
+ public <T extends BeanDescription> T introspectClassAnnotations(Class<?> cls, Set<Class<?>> mixins) {
+ return (T) _classIntrospector.forClassAnnotations(cls, mixins);
}
/*
@@ -287,6 +289,8 @@
disable(f);
}
}
+
+
//protected int getFeatures() { return _features; }
Index: src/java/org/codehaus/jackson/map/ObjectMapper.java
===================================================================
--- src/java/org/codehaus/jackson/map/ObjectMapper.java (revision 321)
+++ src/java/org/codehaus/jackson/map/ObjectMapper.java (working copy)
@@ -161,6 +161,7 @@
public ObjectMapper(SerializerFactory sf)
{
this(null, null, null);
+ System.out.println("hello world");
setSerializerFactory(sf);
}
Index: src/java/org/codehaus/jackson/map/DeserializationConfig.java
===================================================================
--- src/java/org/codehaus/jackson/map/DeserializationConfig.java (revision 321)
+++ src/java/org/codehaus/jackson/map/DeserializationConfig.java (working copy)
@@ -340,7 +340,7 @@
*/
@SuppressWarnings("unchecked")
public <T extends BeanDescription> T introspectClassAnnotations(Class<?> cls) {
- return (T) _classIntrospector.forClassAnnotations(cls);
+ return (T) _classIntrospector.forClassAnnotations(cls, null);
}
/*
Index: src/java/org/codehaus/jackson/map/introspect/BasicClassIntrospector.java
===================================================================
--- src/java/org/codehaus/jackson/map/introspect/BasicClassIntrospector.java (revision 321)
+++ src/java/org/codehaus/jackson/map/introspect/BasicClassIntrospector.java (working copy)
@@ -111,15 +111,17 @@
*/
public BasicBeanDescription forSerialization(SerializationConfig cfg,
- Class<?> c)
+ Class<?> c, Set<Class<?>> mixins)
{
/* Simpler for serialization; just need class annotations
* and setters, not creators.
*/
+ System.out.println("forSerialization");
+ System.out.println("ugh " + c + ", " + mixins);
MethodFilter mf = getSerializationMethodFilter(cfg);
AnnotatedClass ac = AnnotatedClass.constructFull
(c, JacksonAnnotationFilter.instance, false, mf);
- return new BasicBeanDescription(c, ac);
+ return new BasicBeanDescription(c, ac, mixins);
}
@Override
@@ -129,10 +131,11 @@
/* More info needed than with serialization, also need creator
* info
*/
+ System.out.println("forDeserialization");
MethodFilter mf = getDeserializationMethodFilter(cfg);
AnnotatedClass ac = AnnotatedClass.constructFull
(c, JacksonAnnotationFilter.instance, true, mf);
- return new BasicBeanDescription(c, ac);
+ return new BasicBeanDescription(c, ac, null);
}
@Override
@@ -142,20 +145,22 @@
/* Just need constructors and factory methods, but no
* member methods
*/
+ System.out.println("forCreation");
AnnotatedClass ac = AnnotatedClass.constructFull
(c, JacksonAnnotationFilter.instance, true, null);
- return new BasicBeanDescription(c, ac);
+ return new BasicBeanDescription(c, ac, null);
}
@Override
- public BasicBeanDescription forClassAnnotations(Class<?> c)
+ public BasicBeanDescription forClassAnnotations(Class<?> c, Set<Class<?>> mixins)
{
/* More infor for serialization, also need creator
* info
*/
+ System.out.println("forClassAnnotation");
AnnotatedClass ac = AnnotatedClass.constructFull
(c, JacksonAnnotationFilter.instance, false, null);
- return new BasicBeanDescription(c, ac);
+ return new BasicBeanDescription(c, ac, mixins);
}
/*
Index: src/java/org/codehaus/jackson/map/ser/BasicSerializerFactory.java
===================================================================
--- src/java/org/codehaus/jackson/map/ser/BasicSerializerFactory.java (revision 321)
+++ src/java/org/codehaus/jackson/map/ser/BasicSerializerFactory.java (working copy)
@@ -145,6 +145,8 @@
final NullSerializer nullS = NullSerializer.instance;
_concrete.put(Void.TYPE.getName(), nullS);
}
+
+ protected Map<Class<?>, Set<Class<?>>> _mixins = new HashMap<Class<?>, Set<Class<?>>>();
/*
////////////////////////////////////////////////////////////
@@ -189,6 +191,7 @@
@SuppressWarnings("unchecked")
public <T> JsonSerializer<T> createSerializer(Class<T> type, SerializationConfig config)
{
+ System.out.println("hello");
// First, fast lookup for exact type:
JsonSerializer<?> ser = findSerializerByLookup(type);
if (ser == null) {
@@ -201,6 +204,7 @@
ser = findSerializerByAddonType(type);
}
}
+
return (JsonSerializer<T>) ser;
}
@@ -274,7 +278,7 @@
* was found out that annotations do not work with
* Enum classes.
*/
- BasicBeanDescription desc = config.introspectClassAnnotations(type);
+ BasicBeanDescription desc = config.introspectClassAnnotations(type, _mixins.get(type));
JsonSerializer<Object> ser = findSerializerFromAnnotation(desc.getClassInfo());
if (ser != null) {
return ser;
@@ -629,4 +633,18 @@
value.serialize(jgen, provider);
}
}
+
+ @Override
+ public final void addMixIn(Class<?> type, Class<?> mixin) {
+ synchronized(_mixins) {
+ Set<Class<?>> m = _mixins.get(type);
+ if (m == null) {
+ m = new HashSet<Class<?>>();
+ }
+
+ m.add(mixin);
+ _mixins.put(type, m);
+ }
+
+ }
}
Index: src/java/org/codehaus/jackson/map/introspect/BasicBeanDescription.java
===================================================================
--- src/java/org/codehaus/jackson/map/introspect/BasicBeanDescription.java (revision 321)
+++ src/java/org/codehaus/jackson/map/introspect/BasicBeanDescription.java (working copy)
@@ -16,6 +16,7 @@
import org.codehaus.jackson.annotate.JsonValue;
import org.codehaus.jackson.annotate.JsonWriteNullProperties;
import org.codehaus.jackson.map.BeanDescription;
+import org.codehaus.jackson.map.introspect.BasicClassIntrospector.GetterMethodFilter;
public class BasicBeanDescription extends BeanDescription
{
@@ -29,6 +30,8 @@
* Information collected about the class introspected.
*/
final AnnotatedClass _classInfo;
+
+ final Set<BasicBeanDescription> _mixinInfos;
/*
///////////////////////////////////////////////////////
@@ -36,11 +39,21 @@
///////////////////////////////////////////////////////
*/
- public BasicBeanDescription(Class<?> forClass, AnnotatedClass ac)
+ public BasicBeanDescription(Class<?> forClass, AnnotatedClass ac, Set<Class<?>> mixins)
{
super(forClass);
_classInfo = ac;
+ System.out.println(mixins);
+ if (mixins != null && !mixins.isEmpty()) {
+ _mixinInfos = new HashSet<BasicBeanDescription>();
+ for (Class<?> m : mixins) {
+ AnnotatedClass mac = AnnotatedClass.constructFull(m, JacksonAnnotationFilter.instance, false, GetterMethodFilter.instance);
+ _mixinInfos.add(new BasicBeanDescription(m, mac, null));
+ }
+ } else {
+ _mixinInfos = null;
+ }
}
/*
@@ -416,6 +429,7 @@
protected String okNameForGetter(AnnotatedMethod am)
{
String name = am.getName();
+
if (name.startsWith("get")) {
/* 16-Feb-2009, tatus: To handle [JACKSON-53], need to block
* CGLib-provided method "getCallbacks". Not sure of exact
@@ -428,7 +442,14 @@
if (isCglibGetCallbacks(am)) {
return null;
}
+ } else if ("getMetaClass".equals(name)) {
+ if (isGroovyMeta(am)) {
+ return null;
+ }
}
+
+ System.out.println(name);
+
return mangleGetterName(am, name.substring(3));
}
if (name.startsWith("is")) {
@@ -479,6 +500,23 @@
}
return false;
}
+
+ protected boolean isGroovyMeta(AnnotatedMethod am)
+ {
+ System.out.println(am.getDeclaringClass().getName());
+ Class<?> rt = am.getReturnType();
+
+ if (rt == null || rt.isArray()) {
+ return false;
+ }
+
+ Package pkg = rt.getPackage();
+
+ if (pkg != null && pkg.getName().startsWith("groovy.lang")) {
+ return true;
+ }
+ return false;
+ }
/*
///////////////////////////////////////////////////////
@@ -547,7 +585,21 @@
protected boolean isIgnored(AnnotatedMethod am)
{
JsonIgnore ann = am.getAnnotation(JsonIgnore.class);
- return (ann != null && ann.value());
+ if (ann != null)
+ return ann.value();
+ if (_mixinInfos != null) {
+ for (BasicBeanDescription mbd : _mixinInfos) {
+ AnnotatedMethod mam = mbd.findMethod(am.getName(), am.getParameterTypes());
+ if (mam == null)
+ return false;
+ JsonIgnore mann = mam.getAnnotation(JsonIgnore.class);
+ if (mann != null && mann.value())
+ return true;
+ }
+ return false;
+ }
+
+ return false;
}
Index: src/java/org/codehaus/jackson/map/ser/BeanSerializerFactory.java
===================================================================
--- src/java/org/codehaus/jackson/map/ser/BeanSerializerFactory.java (revision 321)
+++ src/java/org/codehaus/jackson/map/ser/BeanSerializerFactory.java (working copy)
@@ -2,6 +2,7 @@
import java.util.*;
+import java.beans.BeanDescriptor;
import java.lang.reflect.Method;
import org.codehaus.jackson.map.JsonSerializer;
@@ -102,6 +103,8 @@
}
}
}
+
+ System.out.println(ser.getClass().getName());
return (JsonSerializer<T>) ser;
}
@@ -122,7 +125,8 @@
if (!isPotentialBeanType(type)) {
return null;
}
- BasicBeanDescription beanDesc = config.introspect(type);
+ System.out.println("..... "+ type + ", "+ _mixins);
+ BasicBeanDescription beanDesc = config.introspect(type, _mixins.get(type));
JsonSerializer<Object> ser = findSerializerFromAnnotation(beanDesc.getClassInfo());
if (ser != null) {
return ser;
@@ -202,6 +206,7 @@
boolean methodNulls = am.willWriteNullProperties(writeNulls);
props.add(new BeanPropertyWriter(en.getKey(), m, ser, methodNulls));
}
+
return props;
}
}
Index: src/java/org/codehaus/jackson/map/SerializerFactory.java
===================================================================
--- src/java/org/codehaus/jackson/map/SerializerFactory.java (revision 321)
+++ src/java/org/codehaus/jackson/map/SerializerFactory.java (working copy)
@@ -21,4 +21,5 @@
* @param config Generic serialization configuration
*/
public abstract <T> JsonSerializer<T> createSerializer(Class<T> type, SerializationConfig config);
+ public abstract void addMixIn(Class<?> type, Class<?> mixin);
}