You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2016/09/10 13:40:33 UTC
[2/2] incubator-juneau git commit: Continuation of bean dictionary
support.
Continuation of bean dictionary support.
Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/f479285a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/f479285a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/f479285a
Branch: refs/heads/master
Commit: f479285a7378e454ad1a2fcfac8096ffcd0856b8
Parents: 864893f
Author: jamesbognar <ja...@gmail.com>
Authored: Sat Sep 10 09:40:27 2016 -0400
Committer: jamesbognar <ja...@gmail.com>
Committed: Sat Sep 10 09:40:27 2016 -0400
----------------------------------------------------------------------
.../org/apache/juneau/client/RestClient.java | 12 ++++
.../java/org/apache/juneau/BeanContext.java | 6 +-
.../java/org/apache/juneau/BeanDictionary.java | 32 +++-------
.../apache/juneau/BeanDictionaryBuilder.java | 12 +---
.../org/apache/juneau/BeanPropertyMeta.java | 57 +++++++++--------
.../java/org/apache/juneau/ContextFactory.java | 17 +++++-
.../main/java/org/apache/juneau/CoreApi.java | 15 +++++
.../java/org/apache/juneau/html/HtmlParser.java | 64 +++++++++++---------
.../apache/juneau/html/HtmlParserContext.java | 1 +
.../org/apache/juneau/html/HtmlSerializer.java | 10 ++-
.../juneau/html/HtmlSerializerContext.java | 1 +
.../java/org/apache/juneau/jena/RdfParser.java | 6 ++
.../apache/juneau/jena/RdfParserContext.java | 1 +
.../org/apache/juneau/jena/RdfSerializer.java | 6 ++
.../juneau/jena/RdfSerializerContext.java | 1 +
.../java/org/apache/juneau/json/JsonParser.java | 57 +++++++++--------
.../apache/juneau/json/JsonParserContext.java | 1 +
.../org/apache/juneau/json/JsonSerializer.java | 10 ++-
.../juneau/json/JsonSerializerContext.java | 1 +
.../apache/juneau/msgpack/MsgPackParser.java | 45 ++++++++------
.../juneau/msgpack/MsgPackParserContext.java | 1 +
.../juneau/msgpack/MsgPackSerializer.java | 10 ++-
.../msgpack/MsgPackSerializerContext.java | 1 +
.../java/org/apache/juneau/parser/Parser.java | 6 ++
.../org/apache/juneau/parser/ParserGroup.java | 14 +++++
.../apache/juneau/serializer/Serializer.java | 6 ++
.../juneau/serializer/SerializerGroup.java | 14 +++++
.../juneau/serializer/SerializerSession.java | 9 +--
.../apache/juneau/urlencoding/UonParser.java | 62 ++++++++++---------
.../juneau/urlencoding/UonParserContext.java | 1 +
.../juneau/urlencoding/UonSerializer.java | 10 ++-
.../urlencoding/UonSerializerContext.java | 1 +
.../juneau/urlencoding/UrlEncodingParser.java | 25 +++++---
.../urlencoding/UrlEncodingParserContext.java | 1 +
.../urlencoding/UrlEncodingSerializer.java | 10 ++-
.../UrlEncodingSerializerContext.java | 1 +
.../java/org/apache/juneau/xml/XmlParser.java | 45 ++++++++------
.../org/apache/juneau/xml/XmlParserContext.java | 1 +
.../apache/juneau/xml/XmlSchemaSerializer.java | 14 +----
.../org/apache/juneau/xml/XmlSerializer.java | 6 ++
.../apache/juneau/xml/XmlSerializerContext.java | 1 +
.../java/org/apache/juneau/BeanMapTest.java | 16 ++---
.../a/rttests/RoundTripAddClassAttrsTest.java | 12 ++++
.../apache/juneau/a/rttests/RoundTripTest.java | 14 ++++-
.../apache/juneau/html/CommonParserTest.java | 5 +-
.../apache/juneau/json/CommonParserTest.java | 6 +-
.../urlencoding/CommonParser_UonTest.java | 4 +-
.../CommonParser_UrlEncodingTest.java | 4 +-
.../org/apache/juneau/utils/PojoRestTest.java | 8 ++-
49 files changed, 427 insertions(+), 236 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-client/src/main/java/org/apache/juneau/client/RestClient.java
----------------------------------------------------------------------
diff --git a/juneau-client/src/main/java/org/apache/juneau/client/RestClient.java b/juneau-client/src/main/java/org/apache/juneau/client/RestClient.java
index e28e656..887dd35 100755
--- a/juneau-client/src/main/java/org/apache/juneau/client/RestClient.java
+++ b/juneau-client/src/main/java/org/apache/juneau/client/RestClient.java
@@ -926,6 +926,18 @@ public class RestClient extends CoreApi {
}
@Override /* CoreAPI */
+ public RestClient addToDictionary(Class<?>...classes) throws LockedException {
+ super.addToDictionary(classes);
+ if (serializer != null)
+ serializer.addToDictionary(classes);
+ if (parser != null)
+ parser.addToDictionary(classes);
+ if (urlEncodingSerializer != null)
+ urlEncodingSerializer.addToDictionary(classes);
+ return this;
+ }
+
+ @Override /* CoreAPI */
public <T> RestClient addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
super.addImplClass(interfaceClass, implClass);
if (serializer != null)
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
index bfa3d87..d00f029 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
@@ -646,8 +646,6 @@ public class BeanContext extends Context {
}
pojoSwaps = lpf.toArray(new PojoSwap[0]);
- beanDictionary = new BeanDictionaryBuilder().add(pm.get(BEAN_beanDictionary, Class[].class, new Class[0])).setBeanContext(this).build();
-
implClasses = new TreeMap<Class<?>,Class<?>>(new ClassComparator());
Map<Class,Class> m = pm.getMap(BEAN_implClasses, Class.class, Class.class, null);
if (m != null)
@@ -666,6 +664,8 @@ public class BeanContext extends Context {
this.cmString = cmCache.get(String.class);
this.cmObject = cmCache.get(Object.class);
this.cmClass = cmCache.get(Class.class);
+
+ beanDictionary = new BeanDictionaryBuilder().add(pm.get(BEAN_beanDictionary, Class[].class, new Class[0])).setBeanContext(this).build();
}
/**
@@ -1503,7 +1503,7 @@ public class BeanContext extends Context {
*
* @return The bean dictionary defined in this bean context. Never <jk>null</jk>.
*/
- protected BeanDictionary getBeanDictionary() {
+ public BeanDictionary getBeanDictionary() {
return beanDictionary;
}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java b/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java
index 3b8ce26..d5dddc0 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java
@@ -35,15 +35,12 @@ import org.apache.juneau.annotation.*;
public class BeanDictionary {
private final Map<String,ClassMeta<?>> map;
- private final Map<Class<?>,String> reverseMap;
private final BeanContext beanContext;
private final String beanTypePropertyName;
- private final BeanDictionary parent;
- BeanDictionary(BeanContext beanContext, BeanDictionary parent, Map<String,Class<?>> map) {
+ BeanDictionary(BeanContext beanContext, Map<String,Class<?>> map) {
this.beanContext = beanContext;
this.beanTypePropertyName = beanContext.getBeanTypePropertyName();
- this.parent = parent == null ? beanContext.getBeanDictionary() : parent;
Map<String,ClassMeta<?>> m1 = new HashMap<String,ClassMeta<?>>();
for (Map.Entry<String,Class<?>> e : map.entrySet()) {
ClassMeta<?> cm = beanContext.getClassMeta(e.getValue());
@@ -52,20 +49,6 @@ public class BeanDictionary {
m1.put(e.getKey(), cm);
}
this.map = Collections.unmodifiableMap(m1);
- Map<Class<?>,String> m2 = new HashMap<Class<?>,String>();
- for (Map.Entry<String,Class<?>> e : map.entrySet())
- m2.put(e.getValue(), e.getKey());
- this.reverseMap = Collections.unmodifiableMap(m2);
- }
-
- /**
- * Returns the name associated with the specified class.
- *
- * @param c The class associated with the name.
- * @return The name associated with the specified class, or <jk>null</jk> if no association exists.
- */
- public String getNameForClass(Class<?> c) {
- return reverseMap.get(c);
}
/**
@@ -79,7 +62,7 @@ public class BeanDictionary {
if (o == null)
return m;
String typeName = o.toString();
- ClassMeta<?> cm = findClassMeta(typeName);
+ ClassMeta<?> cm = getClassMeta(typeName);
BeanMap<?> bm = beanContext.newBeanMap(cm.getInnerClass());
// Iterate through all the entries in the map and set the individual field values.
@@ -96,10 +79,15 @@ public class BeanDictionary {
return bm.getBean();
}
- private ClassMeta<?> findClassMeta(String typeName) {
+ /**
+ * Gets the class metadata for the specified bean type name.
+ *
+ * @param typeName The bean type name as defined by {@link Bean#typeName()}.
+ * @return The class metadata for the bean.
+ * @throws BeanRuntimeException If name wasn't found in this dictionary.
+ */
+ public ClassMeta<?> getClassMeta(String typeName) {
ClassMeta<?> cm = map.get(typeName);
- if (cm == null && parent != null)
- cm = parent.findClassMeta(typeName);
if (cm == null)
throw new BeanRuntimeException("Could not find bean type ''{0}'' in dictionary.", typeName);
return cm;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java b/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java
index a56dd84..5900b53 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java
@@ -28,7 +28,6 @@ import org.apache.juneau.internal.*;
public class BeanDictionaryBuilder {
private Map<String,Class<?>> map = new HashMap<String,Class<?>>();
- private BeanDictionary parent;
private BeanContext beanContext;
/**
@@ -57,7 +56,7 @@ public class BeanDictionaryBuilder {
} else {
Bean b = c.getAnnotation(Bean.class);
if (b == null || b.typeName().isEmpty())
- throw new BeanRuntimeException("Class ''{0}'' was passed to TypeDictionaryBuilder but it doesn't have a @Bean.typeName() annotation defined.");
+ throw new BeanRuntimeException("Class ''{0}'' was passed to TypeDictionaryBuilder but it doesn't have a @Bean.typeName() annotation defined.", c.getName());
map.put(b.typeName(), c);
}
}
@@ -65,19 +64,12 @@ public class BeanDictionaryBuilder {
return this;
}
- BeanDictionaryBuilder setParent(BeanDictionary parent) {
- this.parent = parent;
- return this;
- }
-
BeanDictionaryBuilder setBeanContext(BeanContext beanContext) {
this.beanContext = beanContext;
return this;
}
BeanDictionary build() {
- if (map.isEmpty())
- return parent;
- return new BeanDictionary(beanContext, parent, map);
+ return new BeanDictionary(beanContext, map);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 5a3dc5d..434ef46 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -49,6 +49,7 @@ public class BeanPropertyMeta {
private boolean isConstructorArg, isUri;
private final BeanMeta<?> beanMeta;
+ private final BeanContext beanContext;
private String name;
private ClassMeta<?>
@@ -68,6 +69,7 @@ public class BeanPropertyMeta {
*/
protected BeanPropertyMeta(BeanMeta<?> beanMeta, String name) {
this.beanMeta = beanMeta;
+ this.beanContext = beanMeta.ctx;
this.name = name;
}
@@ -139,7 +141,7 @@ public class BeanPropertyMeta {
*/
public ClassMeta<?> getClassMeta() {
if (typeMeta == null)
- typeMeta = (swap != null ? swap.getSwapClassMeta(beanMeta.ctx) : rawTypeMeta == null ? beanMeta.ctx.object() : rawTypeMeta.getSerializedClassMeta());
+ typeMeta = (swap != null ? swap.getSwapClassMeta(beanContext) : rawTypeMeta == null ? beanContext.object() : rawTypeMeta.getSerializedClassMeta());
return typeMeta;
}
@@ -154,7 +156,7 @@ public class BeanPropertyMeta {
* @return The bean dictionary in use for this bean property. Never <jk>null</jk>.
*/
public BeanDictionary getBeanDictionary() {
- return beanDictionary;
+ return beanDictionary == null ? beanContext.getBeanDictionary() : beanDictionary;
}
/**
@@ -256,7 +258,7 @@ public class BeanPropertyMeta {
if (p.properties().length != 0)
properties = p.properties();
if (p.beanDictionary().length > 0)
- this.beanDictionary = new BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(this.beanMeta.ctx).build();
+ this.beanDictionary = new BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(beanContext).build();
}
}
@@ -271,7 +273,7 @@ public class BeanPropertyMeta {
if (properties != null && p.properties().length != 0)
properties = p.properties();
if (p.beanDictionary().length > 0)
- this.beanDictionary = new BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(this.beanMeta.ctx).build();
+ this.beanDictionary = new BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(beanContext).build();
}
}
@@ -286,7 +288,7 @@ public class BeanPropertyMeta {
if (properties != null && p.properties().length != 0)
properties = p.properties();
if (p.beanDictionary().length > 0)
- this.beanDictionary = new BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(this.beanMeta.ctx).build();
+ this.beanDictionary = new BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(beanContext).build();
}
}
@@ -369,7 +371,7 @@ public class BeanPropertyMeta {
} catch (SerializeException e) {
throw new BeanRuntimeException(e);
} catch (Throwable e) {
- if (beanMeta.ctx.ignoreInvocationExceptionsOnGetters) {
+ if (beanContext.ignoreInvocationExceptionsOnGetters) {
if (rawTypeMeta.isPrimitive())
return rawTypeMeta.getPrimitiveDefault();
return null;
@@ -391,7 +393,6 @@ public class BeanPropertyMeta {
try {
// Comvert to raw form.
value = unswap(value);
- BeanContext bc = this.beanMeta.ctx;
if (m.bean == null) {
@@ -411,7 +412,7 @@ public class BeanPropertyMeta {
boolean isCollection = rawTypeMeta.isCollection();
if (field == null && setter == null && ! (isMap || isCollection)) {
- if ((value == null && bc.ignoreUnknownNullBeanProperties) || bc.ignorePropertiesWithoutSetters)
+ if ((value == null && beanContext.ignoreUnknownNullBeanProperties) || beanContext.ignorePropertiesWithoutSetters)
return null;
throw new BeanRuntimeException(beanMeta.c, "Setter or public field not defined on property ''{0}''", name);
}
@@ -420,7 +421,7 @@ public class BeanPropertyMeta {
try {
- Object r = beanMeta.ctx.beanMapPutReturnsOldValue || isMap || isCollection ? get(m) : null;
+ Object r = beanContext.beanMapPutReturnsOldValue || isMap || isCollection ? get(m) : null;
Class<?> propertyClass = rawTypeMeta.getInnerClass();
if (value == null && (isMap || isCollection)) {
@@ -438,7 +439,7 @@ public class BeanPropertyMeta {
if (! (value instanceof Map)) {
if (value instanceof CharSequence)
- value = new ObjectMap((CharSequence)value).setBeanContext(beanMeta.ctx);
+ value = new ObjectMap((CharSequence)value).setBeanContext(beanContext);
else
throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}''", name, propertyClass.getName(), findClassName(value));
}
@@ -489,7 +490,7 @@ public class BeanPropertyMeta {
Object k = e.getKey();
Object v = e.getValue();
if (! valueType.isObject())
- v = beanMeta.ctx.convertToType(v, valueType);
+ v = beanContext.convertToType(v, valueType);
propMap.put(k, v);
}
@@ -497,7 +498,7 @@ public class BeanPropertyMeta {
if (! (value instanceof Collection)) {
if (value instanceof CharSequence)
- value = new ObjectList((CharSequence)value).setBeanContext(beanMeta.ctx);
+ value = new ObjectList((CharSequence)value).setBeanContext(beanContext);
else
throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}''", name, propertyClass.getName(), findClassName(value));
}
@@ -519,7 +520,7 @@ public class BeanPropertyMeta {
for (ListIterator<Object> i = l.listIterator(); i.hasNext(); ) {
Object v = i.next();
if (v != null && (! elementType.getInnerClass().isInstance(v))) {
- i.set(bc.convertToType(v, elementType));
+ i.set(beanContext.convertToType(v, elementType));
}
}
valueList = l;
@@ -550,15 +551,15 @@ public class BeanPropertyMeta {
// Set the values.
for (Object v : valueList) {
if (! elementType.isObject())
- v = beanMeta.ctx.convertToType(v, elementType);
+ v = beanContext.convertToType(v, elementType);
propList.add(v);
}
} else {
if (swap != null && value != null && isParentClass(swap.getSwapClass(), value.getClass())) {
- value = swap.unswap(value, rawTypeMeta, beanMeta.ctx);
+ value = swap.unswap(value, rawTypeMeta, beanContext);
} else {
- value = beanMeta.ctx.convertToType(value, rawTypeMeta);
+ value = beanContext.convertToType(value, rawTypeMeta);
}
if (setter != null)
setter.invoke(bean, new Object[] { value });
@@ -572,7 +573,7 @@ public class BeanPropertyMeta {
throw e;
} catch (Exception e) {
e.printStackTrace();
- if (beanMeta.ctx.ignoreInvocationExceptionsOnSetters) {
+ if (beanContext.ignoreInvocationExceptionsOnSetters) {
if (rawTypeMeta.isPrimitive())
return rawTypeMeta.getPrimitiveDefault();
return null;
@@ -615,12 +616,10 @@ public class BeanPropertyMeta {
*/
public void add(BeanMap<?> m, Object value) throws BeanRuntimeException {
- BeanContext bc = beanMeta.ctx;
-
// Read-only beans get their properties stored in a cache.
if (m.bean == null) {
if (! m.propertyCache.containsKey(name))
- m.propertyCache.put(name, new ObjectList(bc));
+ m.propertyCache.put(name, new ObjectList(beanContext));
((ObjectList)m.propertyCache.get(name)).add(value);
return;
}
@@ -636,7 +635,7 @@ public class BeanPropertyMeta {
ClassMeta<?> elementType = rawTypeMeta.getElementType();
try {
- Object v = bc.convertToType(value, elementType);
+ Object v = beanContext.convertToType(value, elementType);
if (isCollection) {
Collection c = null;
@@ -656,7 +655,7 @@ public class BeanPropertyMeta {
if (rawTypeMeta.canCreateNewInstance())
c = (Collection)rawTypeMeta.newInstance();
else
- c = new ObjectList(bc);
+ c = new ObjectList(beanContext);
c.add(v);
@@ -729,31 +728,31 @@ public class BeanPropertyMeta {
private Object transform(Object o) throws SerializeException {
// First use swap defined via @BeanProperty.
if (swap != null)
- return swap.swap(o, beanMeta.ctx);
+ return swap.swap(o, beanContext);
if (o == null)
return null;
// Otherwise, look it up via bean context.
if (rawTypeMeta.hasChildPojoSwaps()) {
Class c = o.getClass();
- ClassMeta<?> cm = rawTypeMeta.innerClass == c ? rawTypeMeta : beanMeta.ctx.getClassMeta(c);
+ ClassMeta<?> cm = rawTypeMeta.innerClass == c ? rawTypeMeta : beanContext.getClassMeta(c);
PojoSwap f = cm.getPojoSwap();
if (f != null)
- return f.swap(o, beanMeta.ctx);
+ return f.swap(o, beanContext);
}
return o;
}
private Object unswap(Object o) throws ParseException {
if (swap != null)
- return swap.unswap(o, rawTypeMeta, beanMeta.ctx);
+ return swap.unswap(o, rawTypeMeta, beanContext);
if (o == null)
return null;
if (rawTypeMeta.hasChildPojoSwaps()) {
Class c = o.getClass();
- ClassMeta<?> cm = rawTypeMeta.innerClass == c ? rawTypeMeta : beanMeta.ctx.getClassMeta(c);
+ ClassMeta<?> cm = rawTypeMeta.innerClass == c ? rawTypeMeta : beanContext.getClassMeta(c);
PojoSwap f = cm.getPojoSwap();
if (f != null)
- return f.unswap(o, rawTypeMeta, beanMeta.ctx);
+ return f.unswap(o, rawTypeMeta, beanContext);
}
return o;
}
@@ -768,7 +767,7 @@ public class BeanPropertyMeta {
if (cm.isObject()) {
if (o instanceof Map)
return new FilteredMap((Map)o, properties);
- BeanMeta bm = this.getBeanMeta().ctx.getBeanMeta(o.getClass());
+ BeanMeta bm = beanContext.getBeanMeta(o.getClass());
if (bm != null)
return new BeanMap(o, new BeanMetaFiltered(cm.getBeanMeta(), properties));
}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java b/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java
index ba2f909..f0b0b14 100644
--- a/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java
+++ b/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java
@@ -711,7 +711,7 @@ public final class ContextFactory extends Lockable {
}
/**
- * Shortcut for calling <code>addTo(<jsf>BEAN_transforms</jsf>, <jf>classes</jf>)</code>.
+ * Shortcut for calling <code>addTo(<jsf>BEAN_pojoSwaps</jsf>, <jf>classes</jf>)</code>.
*
* @param classes The new setting value for the bean context.
* @throws LockedException If {@link ContextFactory#lock()} was called on this class or the bean context.
@@ -726,6 +726,21 @@ public final class ContextFactory extends Lockable {
}
/**
+ * Shortcut for calling <code>addTo(<jsf>BEAN_beanDictionary</jsf>, <jf>classes</jf>)</code>.
+ *
+ * @param classes The new setting value for the bean context.
+ * @throws LockedException If {@link ContextFactory#lock()} was called on this class or the bean context.
+ * @return This object (for method chaining).
+ * @see ContextFactory#addToProperty(String, Object)
+ * @see BeanContext#BEAN_beanDictionary
+ */
+ public ContextFactory addToDictionary(Class<?>...classes) throws LockedException {
+ checkLock();
+ addToProperty(BEAN_beanDictionary, classes);
+ return this;
+ }
+
+ /**
* Shortcut for calling <code>putTo(<jsf>BEAN_implCLasses</jsf>, <jf>interfaceClass</jf>, <jf>implClass</jf>)</code>.
*
* @param interfaceClass The interface class.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/CoreApi.java b/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
index af66833..7a9d9a3 100644
--- a/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
+++ b/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
@@ -146,6 +146,21 @@ public abstract class CoreApi extends Lockable {
}
/**
+ * Shortcut for calling <code>getContextFactory().addToDictionary(<jf>classes</jf>)</code>.
+ *
+ * @param classes The bean classes (or BeanDictionaryBuilder) classes to add to the bean dictionary.
+ * @throws LockedException If {@link ContextFactory#lock()} was called on this class or the bean context.
+ * @return This object (for method chaining).
+ * @see ContextFactory#addToProperty(String, Object)
+ * @see BeanContext#BEAN_beanDictionary
+ */
+ public CoreApi addToDictionary(Class<?>...classes) throws LockedException {
+ checkLock();
+ contextFactory.addToDictionary(classes);
+ return this;
+ }
+
+ /**
* Shortcut for calling <code>getContextFactory().addImplClass(<jf>interfaceClass</jf>, <jf>implClass</jf>)</code>.
*
* @param interfaceClass The interface class.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
index 52180eb..2c04a79 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
@@ -67,7 +67,7 @@ public final class HtmlParser extends ReaderParser {
* Precondition: Must be pointing at START_ELEMENT or CHARACTERS event.
* Postcondition: Pointing at next event to be processed.
*/
- private <T> T parseAnything(HtmlParserSession session, ClassMeta<T> eType, XMLEventReader r, Object outer) throws Exception {
+ private <T> T parseAnything(HtmlParserSession session, ClassMeta<T> eType, XMLEventReader r, Object outer, BeanPropertyMeta pMeta) throws Exception {
BeanContext bc = session.getBeanContext();
if (eType == null)
@@ -75,6 +75,7 @@ public final class HtmlParser extends ReaderParser {
PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
ClassMeta<?> sType = eType.getSerializedClassMeta();
session.setCurrentClass(sType);
+ BeanDictionary bd = (pMeta == null ? bc.getBeanDictionary() : pMeta.getBeanDictionary());
Object o = null;
@@ -117,7 +118,7 @@ public final class HtmlParser extends ReaderParser {
tableType = attrs.get("type");
String c = attrs.get(bc.getBeanTypePropertyName());
if (c != null)
- sType = eType = (ClassMeta<T>)bc.getClassMetaFromString(c);
+ sType = eType = (ClassMeta<T>)bd.getClassMeta(c);
}
boolean isValid = true;
@@ -135,14 +136,14 @@ public final class HtmlParser extends ReaderParser {
o = Boolean.parseBoolean(text);
else if (tag == TABLE) {
if (tableType.equals("object")) {
- o = parseIntoMap(session, r, (Map)new ObjectMap(bc), sType.getKeyType(), sType.getValueType());
+ o = parseIntoMap(session, r, (Map)new ObjectMap(bc), sType.getKeyType(), sType.getValueType(), pMeta);
} else if (tableType.equals("array")) {
- o = parseTableIntoCollection(session, r, (Collection)new ObjectList(bc), sType.getElementType());
+ o = parseTableIntoCollection(session, r, (Collection)new ObjectList(bc), sType.getElementType(), pMeta);
} else
isValid = false;
}
else if (tag == UL)
- o = parseIntoCollection(session, r, new ObjectList(bc), null);
+ o = parseIntoCollection(session, r, new ObjectList(bc), null, pMeta);
}
else if (tag == STRING && sType.isCharSequence())
o = text;
@@ -159,10 +160,10 @@ public final class HtmlParser extends ReaderParser {
else if (tag == TABLE) {
if (tableType.equals("object")) {
if (sType.isMap()) {
- o = parseIntoMap(session, r, (Map)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectMap(bc)), sType.getKeyType(), sType.getValueType());
+ o = parseIntoMap(session, r, (Map)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectMap(bc)), sType.getKeyType(), sType.getValueType(), pMeta);
} else if (sType.canCreateNewInstanceFromObjectMap(outer)) {
ObjectMap m = new ObjectMap(bc);
- parseIntoMap(session, r, m, string(), object());
+ parseIntoMap(session, r, m, string(), object(), pMeta);
o = sType.newInstanceFromObjectMap(outer, m);
} else if (sType.canCreateNewBean(outer)) {
BeanMap m = bc.newBeanMap(outer, sType.getInnerClass());
@@ -172,18 +173,18 @@ public final class HtmlParser extends ReaderParser {
isValid = false;
} else if (tableType.equals("array")) {
if (sType.isCollection())
- o = parseTableIntoCollection(session, r, (Collection)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectList(bc)), sType.getElementType());
+ o = parseTableIntoCollection(session, r, (Collection)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectList(bc)), sType.getElementType(), pMeta);
else if (sType.isArray())
- o = bc.toArray(sType, parseTableIntoCollection(session, r, new ArrayList(), sType.getElementType()));
+ o = bc.toArray(sType, parseTableIntoCollection(session, r, new ArrayList(), sType.getElementType(), pMeta));
else
isValid = false;
} else
isValid = false;
} else if (tag == UL) {
if (sType.isCollection())
- o = parseIntoCollection(session, r, (Collection)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectList(bc)), sType.getElementType());
+ o = parseIntoCollection(session, r, (Collection)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectList(bc)), sType.getElementType(), pMeta);
else if (sType.isArray())
- o = bc.toArray(sType, parseIntoCollection(session, r, new ArrayList(), sType.getElementType()));
+ o = bc.toArray(sType, parseIntoCollection(session, r, new ArrayList(), sType.getElementType(), pMeta));
else
isValid = false;
} else
@@ -235,7 +236,7 @@ public final class HtmlParser extends ReaderParser {
* Precondition: Must be pointing at <table> event.
* Postcondition: Pointing at next START_ELEMENT or END_DOCUMENT event.
*/
- private <K,V> Map<K,V> parseIntoMap(HtmlParserSession session, XMLEventReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType) throws Exception {
+ private <K,V> Map<K,V> parseIntoMap(HtmlParserSession session, XMLEventReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType, BeanPropertyMeta pMeta) throws Exception {
Tag tag = nextTag(r, TR);
// Skip over the column headers.
@@ -250,10 +251,10 @@ public final class HtmlParser extends ReaderParser {
if (tag == xTABLE)
break;
nextTag(r, TD);
- K key = parseAnything(session, keyType, r, m);
+ K key = parseAnything(session, keyType, r, m, pMeta);
nextTag(r, xTD);
nextTag(r, TD);
- V value = parseAnything(session, valueType, r, m);
+ V value = parseAnything(session, valueType, r, m, pMeta);
setName(valueType, value, key);
m.put(key, value);
nextTag(r, xTD);
@@ -268,12 +269,12 @@ public final class HtmlParser extends ReaderParser {
* Precondition: Must be pointing at event following <ul> event.
* Postcondition: Pointing at next START_ELEMENT or END_DOCUMENT event.
*/
- private <E> Collection<E> parseIntoCollection(HtmlParserSession session, XMLEventReader r, Collection<E> l, ClassMeta<E> elementType) throws Exception {
+ private <E> Collection<E> parseIntoCollection(HtmlParserSession session, XMLEventReader r, Collection<E> l, ClassMeta<E> elementType, BeanPropertyMeta pMeta) throws Exception {
while (true) {
Tag tag = nextTag(r, LI, xUL);
if (tag == xUL)
break;
- l.add(parseAnything(session, elementType, r, l));
+ l.add(parseAnything(session, elementType, r, l, pMeta));
nextTag(r, xLI);
}
return l;
@@ -291,7 +292,7 @@ public final class HtmlParser extends ReaderParser {
Tag tag = nextTag(r, LI, xUL);
if (tag == xUL)
break;
- o[i] = parseAnything(session, argTypes[i], r, session.getOuter());
+ o[i] = parseAnything(session, argTypes[i], r, session.getOuter(), null);
i++;
nextTag(r, xLI);
}
@@ -303,11 +304,12 @@ public final class HtmlParser extends ReaderParser {
* Precondition: Must be pointing at event following <ul> event.
* Postcondition: Pointing at next START_ELEMENT or END_DOCUMENT event.
*/
- private <E> Collection<E> parseTableIntoCollection(HtmlParserSession session, XMLEventReader r, Collection<E> l, ClassMeta<E> elementType) throws Exception {
+ private <E> Collection<E> parseTableIntoCollection(HtmlParserSession session, XMLEventReader r, Collection<E> l, ClassMeta<E> elementType, BeanPropertyMeta pMeta) throws Exception {
BeanContext bc = session.getBeanContext();
if (elementType == null)
elementType = (ClassMeta<E>)object();
+ BeanDictionary bd = (pMeta == null ? bc.getBeanDictionary() : pMeta.getBeanDictionary());
Tag tag = nextTag(r, TR);
List<String> keys = new ArrayList<String>();
@@ -336,11 +338,11 @@ public final class HtmlParser extends ReaderParser {
BeanMapEntry e = m.getProperty(key);
if (e == null) {
//onUnknownProperty(key, m, -1, -1);
- parseAnything(session, object(), r, l);
+ parseAnything(session, object(), r, l, null);
} else {
BeanPropertyMeta bpm = e.getMeta();
ClassMeta<?> cm = bpm.getClassMeta();
- Object value = parseAnything(session, cm, r, m.getBean(false));
+ Object value = parseAnything(session, cm, r, m.getBean(false), bpm);
setName(cm, value, key);
bpm.set(m, value);
}
@@ -360,7 +362,7 @@ public final class HtmlParser extends ReaderParser {
String key = keys.get(i);
if (m != null) {
ClassMeta<?> et = elementType.getElementType();
- Object value = parseAnything(session, et, r, l);
+ Object value = parseAnything(session, et, r, l, pMeta);
setName(et, value, key);
m.put(key, value);
}
@@ -369,7 +371,7 @@ public final class HtmlParser extends ReaderParser {
if (m != null && c != null) {
ObjectMap m2 = (m instanceof ObjectMap ? (ObjectMap)m : new ObjectMap(m).setBeanContext(session.getBeanContext()));
m2.put(bc.getBeanTypePropertyName(), c);
- l.add((E)m2.cast());
+ l.add((E)bd.cast(m2));
} else {
l.add((E)m);
}
@@ -404,15 +406,15 @@ public final class HtmlParser extends ReaderParser {
BeanPropertyMeta pMeta = m.getPropertyMeta(key);
if (pMeta == null) {
if (m.getMeta().isSubTyped()) {
- Object value = parseAnything(session, object(), r, m.getBean(false));
+ Object value = parseAnything(session, object(), r, m.getBean(false), null);
m.put(key, value);
} else {
onUnknownProperty(session, key, m, -1, -1);
- parseAnything(session, object(), r, null);
+ parseAnything(session, object(), r, null, null);
}
} else {
ClassMeta<?> cm = pMeta.getClassMeta();
- Object value = parseAnything(session, cm, r, m.getBean(false));
+ Object value = parseAnything(session, cm, r, m.getBean(false), pMeta);
setName(cm, value, key);
pMeta.set(m, value);
}
@@ -658,19 +660,19 @@ public final class HtmlParser extends ReaderParser {
protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception {
type = session.getBeanContext().normalizeClassMeta(type);
HtmlParserSession s = (HtmlParserSession)session;
- return parseAnything(s, type, s.getXmlEventReader(), session.getOuter());
+ return parseAnything(s, type, s.getXmlEventReader(), session.getOuter(), null);
}
@Override /* ReaderParser */
protected <K,V> Map<K,V> doParseIntoMap(ParserSession session, Map<K,V> m, Type keyType, Type valueType) throws Exception {
HtmlParserSession s = (HtmlParserSession)session;
- return parseIntoMap(s, s.getXmlEventReader(), m, s.getBeanContext().getClassMeta(keyType), s.getBeanContext().getClassMeta(valueType));
+ return parseIntoMap(s, s.getXmlEventReader(), m, s.getBeanContext().getClassMeta(keyType), s.getBeanContext().getClassMeta(valueType), null);
}
@Override /* ReaderParser */
protected <E> Collection<E> doParseIntoCollection(ParserSession session, Collection<E> c, Type elementType) throws Exception {
HtmlParserSession s = (HtmlParserSession)session;
- return parseIntoCollection(s, s.getXmlEventReader(), c, s.getBeanContext().getClassMeta(elementType));
+ return parseIntoCollection(s, s.getXmlEventReader(), c, s.getBeanContext().getClassMeta(elementType), null);
}
@Override /* ReaderParser */
@@ -710,6 +712,12 @@ public final class HtmlParser extends ReaderParser {
}
@Override /* CoreApi */
+ public HtmlParser addToDictionary(Class<?>...classes) throws LockedException {
+ super.addToDictionary(classes);
+ return this;
+ }
+
+ @Override /* CoreApi */
public <T> HtmlParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
super.addImplClass(interfaceClass, implClass);
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java
index f354526..44fe215 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java
@@ -30,6 +30,7 @@ import org.apache.juneau.parser.*;
* <li>{@link HtmlParser#addNotBeanClasses(Class[])}
* <li>{@link HtmlParser#addBeanFilters(Class[])}
* <li>{@link HtmlParser#addPojoSwaps(Class[])}
+ * <li>{@link HtmlParser#addToDictionary(Class[])}
* <li>{@link HtmlParser#addImplClass(Class,Class)}
* </ul>
* <p>
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
index 0ae595c..bb31659 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
@@ -219,7 +219,7 @@ public class HtmlSerializer extends XmlSerializer {
sType = aType.getSerializedClassMeta();
String typeName = null;
if (session.isAddBeanTypeProperties() && ! eType.equals(aType))
- typeName = aType.toString();
+ typeName = aType.getDictionaryName();
// Swap if necessary
PojoSwap swap = aType.getPojoSwap();
@@ -414,7 +414,7 @@ public class HtmlSerializer extends XmlSerializer {
}
if (cm != null && session.isAddBeanTypeProperties() && elementType.getInnerClass() != o.getClass())
- out.oTag(i+1, "tr").attr(bc.getBeanTypePropertyName(), o.getClass().getName()).append('>').nl();
+ out.oTag(i+1, "tr").attr(bc.getBeanTypePropertyName(), cm.getDictionaryName()).append('>').nl();
else
out.sTag(i+1, "tr").nl();
@@ -616,6 +616,12 @@ public class HtmlSerializer extends XmlSerializer {
}
@Override /* CoreApi */
+ public HtmlSerializer addToDictionary(Class<?>...classes) throws LockedException {
+ super.addToDictionary(classes);
+ return this;
+ }
+
+ @Override /* CoreApi */
public <T> HtmlSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
super.addImplClass(interfaceClass, implClass);
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java
index 940c797..b634645 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.xml.*;
* <li>{@link HtmlSerializer#addNotBeanClasses(Class[])}
* <li>{@link HtmlSerializer#addBeanFilters(Class[])}
* <li>{@link HtmlSerializer#addPojoSwaps(Class[])}
+ * <li>{@link HtmlSerializer#addToDictionary(Class[])}
* <li>{@link HtmlSerializer#addImplClass(Class,Class)}
* </ul>
* <p>
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java b/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java
index a237d0a..7a8b741 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java
@@ -476,6 +476,12 @@ public class RdfParser extends ReaderParser {
}
@Override /* CoreApi */
+ public RdfParser addToDictionary(Class<?>...classes) throws LockedException {
+ super.addToDictionary(classes);
+ return this;
+ }
+
+ @Override /* CoreApi */
public <T> RdfParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
super.addImplClass(interfaceClass, implClass);
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserContext.java b/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserContext.java
index a172999..91aa7c9 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserContext.java
@@ -31,6 +31,7 @@ import org.apache.juneau.xml.*;
* <li>{@link RdfParser#addNotBeanClasses(Class[])}
* <li>{@link RdfParser#addBeanFilters(Class[])}
* <li>{@link RdfParser#addPojoSwaps(Class[])}
+ * <li>{@link RdfParser#addToDictionary(Class[])}
* <li>{@link RdfParser#addImplClass(Class,Class)}
* </ul>
* <p>
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java b/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java
index 568716f..0ac2a62 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java
@@ -439,6 +439,12 @@ public class RdfSerializer extends WriterSerializer {
}
@Override /* CoreApi */
+ public RdfSerializer addToDictionary(Class<?>...classes) throws LockedException {
+ super.addToDictionary(classes);
+ return this;
+ }
+
+ @Override /* CoreApi */
public <T> RdfSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
super.addImplClass(interfaceClass, implClass);
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java
index f7f749c..5dd4bfa 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java
@@ -31,6 +31,7 @@ import org.apache.juneau.xml.*;
* <li>{@link RdfSerializer#addNotBeanClasses(Class[])}
* <li>{@link RdfSerializer#addBeanFilters(Class[])}
* <li>{@link RdfSerializer#addPojoSwaps(Class[])}
+ * <li>{@link RdfSerializer#addToDictionary(Class[])}
* <li>{@link RdfSerializer#addImplClass(Class,Class)}
* </ul>
* <p>
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
index 4ea926f..af4d5a6 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
@@ -99,7 +99,7 @@ public final class JsonParser extends ReaderParser {
/** Default parser, all default settings.*/
public static final JsonParser DEFAULT_STRICT = new JsonParser().setProperty(JSON_strictMode, true).lock();
- private <T> T parseAnything(JsonParserSession session, ClassMeta<T> eType, ParserReader r, Object outer) throws Exception {
+ private <T> T parseAnything(JsonParserSession session, ClassMeta<T> eType, ParserReader r, Object outer, BeanPropertyMeta pMeta) throws Exception {
BeanContext bc = session.getBeanContext();
if (eType == null)
@@ -108,6 +108,7 @@ public final class JsonParser extends ReaderParser {
ClassMeta<?> sType = eType.getSerializedClassMeta();
session.setCurrentClass(sType);
String wrapperAttr = sType.getExtendedMeta(JsonClassMeta.class).getWrapperAttr();
+ BeanDictionary bd = pMeta == null ? bc.getBeanDictionary() : pMeta.getBeanDictionary();
Object o = null;
@@ -127,10 +128,10 @@ public final class JsonParser extends ReaderParser {
} else if (sType.isObject()) {
if (c == '{') {
ObjectMap m2 = new ObjectMap(bc);
- parseIntoMap2(session, r, m2, string(), object());
- o = m2.cast();
+ parseIntoMap2(session, r, m2, string(), object(), pMeta);
+ o = bd.cast(m2);
} else if (c == '[')
- o = parseIntoCollection2(session, r, new ObjectList(bc), object());
+ o = parseIntoCollection2(session, r, new ObjectList(bc), object(), pMeta);
else if (c == '\'' || c == '"') {
o = parseString(session, r);
if (sType.isChar())
@@ -155,19 +156,19 @@ public final class JsonParser extends ReaderParser {
o = parseNumber(session, r, (Class<? extends Number>)sType.getInnerClass());
} else if (sType.isMap()) {
Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : new ObjectMap(bc));
- o = parseIntoMap2(session, r, m, sType.getKeyType(), sType.getValueType());
+ o = parseIntoMap2(session, r, m, sType.getKeyType(), sType.getValueType(), pMeta);
} else if (sType.isCollection()) {
if (c == '{') {
ObjectMap m = new ObjectMap(bc);
- parseIntoMap2(session, r, m, string(), object());
- o = m.cast();
+ parseIntoMap2(session, r, m, string(), object(), pMeta);
+ o = bd.cast(m);
} else {
Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new ObjectList(bc));
- o = parseIntoCollection2(session, r, l, sType.getElementType());
+ o = parseIntoCollection2(session, r, l, sType.getElementType(), pMeta);
}
} else if (sType.canCreateNewInstanceFromObjectMap(outer)) {
ObjectMap m = new ObjectMap(bc);
- parseIntoMap2(session, r, m, string(), object());
+ parseIntoMap2(session, r, m, string(), object(), pMeta);
o = sType.newInstanceFromObjectMap(outer, m);
} else if (sType.canCreateNewBean(outer)) {
BeanMap m = bc.newBeanMap(outer, sType.getInnerClass());
@@ -179,17 +180,17 @@ public final class JsonParser extends ReaderParser {
} else if (sType.isArray()) {
if (c == '{') {
ObjectMap m = new ObjectMap(bc);
- parseIntoMap2(session, r, m, string(), object());
- o = m.cast();
+ parseIntoMap2(session, r, m, string(), object(), pMeta);
+ o = bd.cast(m);
} else {
- ArrayList l = (ArrayList)parseIntoCollection2(session, r, new ArrayList(), sType.getElementType());
+ ArrayList l = (ArrayList)parseIntoCollection2(session, r, new ArrayList(), sType.getElementType(), pMeta);
o = bc.toArray(sType, l);
}
} else if (c == '{') {
Map m = new ObjectMap(bc);
- parseIntoMap2(session, r, m, sType.getKeyType(), sType.getValueType());
+ parseIntoMap2(session, r, m, sType.getKeyType(), sType.getValueType(), pMeta);
if (m.containsKey(bc.getBeanTypePropertyName()))
- o = ((ObjectMap)m).cast();
+ o = bd.cast((ObjectMap)m);
else
throw new ParseException(session, "Class ''{0}'' could not be instantiated. Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason());
} else if (sType.canCreateNewInstanceFromString(outer) && ! session.isStrictMode()) {
@@ -247,7 +248,7 @@ public final class JsonParser extends ReaderParser {
}
- private <K,V> Map<K,V> parseIntoMap2(JsonParserSession session, ParserReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType) throws Exception {
+ private <K,V> Map<K,V> parseIntoMap2(JsonParserSession session, ParserReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType, BeanPropertyMeta pMeta) throws Exception {
if (keyType == null)
keyType = (ClassMeta<K>)string();
@@ -283,7 +284,7 @@ public final class JsonParser extends ReaderParser {
skipCommentsAndSpace(session, r.unread());
} else if (! Character.isWhitespace(c)) {
K key = convertAttrToType(session, m, currAttr, keyType);
- V value = parseAnything(session, valueType, r.unread(), m);
+ V value = parseAnything(session, valueType, r.unread(), m, pMeta);
setName(valueType, value, key);
m.put(key, value);
state = S5;
@@ -335,7 +336,7 @@ public final class JsonParser extends ReaderParser {
throw new ParseException(session, "Could not find the end of the field name.");
}
- private <E> Collection<E> parseIntoCollection2(JsonParserSession session, ParserReader r, Collection<E> l, ClassMeta<E> elementType) throws Exception {
+ private <E> Collection<E> parseIntoCollection2(JsonParserSession session, ParserReader r, Collection<E> l, ClassMeta<E> elementType, BeanPropertyMeta pMeta) throws Exception {
int S0=0; // Looking for outermost [
int S1=1; // Looking for starting [ or { or " or ' or LITERAL
@@ -354,7 +355,7 @@ public final class JsonParser extends ReaderParser {
} else if (c == '/') {
skipCommentsAndSpace(session, r.unread());
} else if (! Character.isWhitespace(c)) {
- l.add(parseAnything(session, elementType, r.unread(), l));
+ l.add(parseAnything(session, elementType, r.unread(), l, pMeta));
state = S2;
}
} else if (state == S2) {
@@ -399,7 +400,7 @@ public final class JsonParser extends ReaderParser {
} else if (c == '/') {
skipCommentsAndSpace(session, r.unread());
} else if (! Character.isWhitespace(c)) {
- o[i] = parseAnything(session, argTypes[i], r.unread(), session.getOuter());
+ o[i] = parseAnything(session, argTypes[i], r.unread(), session.getOuter(), null);
i++;
state = S2;
}
@@ -466,15 +467,15 @@ public final class JsonParser extends ReaderParser {
session.setCurrentProperty(pMeta);
if (pMeta == null) {
if (m.getMeta().isSubTyped()) {
- Object value = parseAnything(session, object(), r.unread(), m.getBean(false));
+ Object value = parseAnything(session, object(), r.unread(), m.getBean(false), null);
m.put(currAttr, value);
} else {
onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
- parseAnything(session, object(), r.unread(), m.getBean(false)); // Read content anyway to ignore it
+ parseAnything(session, object(), r.unread(), m.getBean(false), null); // Read content anyway to ignore it
}
} else {
ClassMeta<?> cm = pMeta.getClassMeta();
- Object value = parseAnything(session, cm, r.unread(), m.getBean(false));
+ Object value = parseAnything(session, cm, r.unread(), m.getBean(false), pMeta);
setName(cm, value, currAttr);
pMeta.set(m, value);
}
@@ -740,7 +741,7 @@ public final class JsonParser extends ReaderParser {
ParserReader r = s.getReader();
if (r == null)
return null;
- T o = parseAnything(s, type, r, s.getOuter());
+ T o = parseAnything(s, type, r, s.getOuter(), null);
validateEnd(s, r);
return o;
}
@@ -749,7 +750,7 @@ public final class JsonParser extends ReaderParser {
protected <K,V> Map<K,V> doParseIntoMap(ParserSession session, Map<K,V> m, Type keyType, Type valueType) throws Exception {
JsonParserSession s = (JsonParserSession)session;
ParserReader r = s.getReader();
- m = parseIntoMap2(s, r, m, s.getBeanContext().getClassMeta(keyType), s.getBeanContext().getClassMeta(valueType));
+ m = parseIntoMap2(s, r, m, s.getBeanContext().getClassMeta(keyType), s.getBeanContext().getClassMeta(valueType), null);
validateEnd(s, r);
return m;
}
@@ -758,7 +759,7 @@ public final class JsonParser extends ReaderParser {
protected <E> Collection<E> doParseIntoCollection(ParserSession session, Collection<E> c, Type elementType) throws Exception {
JsonParserSession s = (JsonParserSession)session;
ParserReader r = s.getReader();
- c = parseIntoCollection2(s, r, c, s.getBeanContext().getClassMeta(elementType));
+ c = parseIntoCollection2(s, r, c, s.getBeanContext().getClassMeta(elementType), null);
validateEnd(s, r);
return c;
}
@@ -803,6 +804,12 @@ public final class JsonParser extends ReaderParser {
}
@Override /* CoreApi */
+ public JsonParser addToDictionary(Class<?>...classes) throws LockedException {
+ super.addToDictionary(classes);
+ return this;
+ }
+
+ @Override /* CoreApi */
public <T> JsonParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
super.addImplClass(interfaceClass, implClass);
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/json/JsonParserContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonParserContext.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonParserContext.java
index cf0b1cd..5a37d4a 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonParserContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.parser.*;
* <li>{@link JsonParser#addNotBeanClasses(Class[])}
* <li>{@link JsonParser#addBeanFilters(Class[])}
* <li>{@link JsonParser#addPojoSwaps(Class[])}
+ * <li>{@link JsonParser#addToDictionary(Class[])}
* <li>{@link JsonParser#addImplClass(Class,Class)}
* </ul>
* <p>
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
index 1b1598f..ee0b138 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
@@ -271,12 +271,12 @@ public class JsonSerializer extends WriterSerializer {
return out;
}
- private SerializerWriter serializeBeanMap(JsonSerializerSession session, JsonWriter out, BeanMap<?> m, boolean addClassAttr) throws Exception {
+ private SerializerWriter serializeBeanMap(JsonSerializerSession session, JsonWriter out, BeanMap<?> m, boolean addTypeProperty) throws Exception {
int depth = session.getIndent();
out.append('{');
boolean addComma = false;
- for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), addClassAttr ? session.createBeanTypeNameProperty(m, null) : null)) {
+ for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), addTypeProperty ? session.createBeanTypeNameProperty(m) : null)) {
BeanPropertyMeta pMeta = p.getMeta();
ClassMeta<?> cMeta = p.getClassMeta();
String key = p.getName();
@@ -381,6 +381,12 @@ public class JsonSerializer extends WriterSerializer {
}
@Override /* CoreApi */
+ public JsonSerializer addToDictionary(Class<?>...classes) throws LockedException {
+ super.addToDictionary(classes);
+ return this;
+ }
+
+ @Override /* CoreApi */
public <T> JsonSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
super.addImplClass(interfaceClass, implClass);
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
index 67c3e65..cf41764 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.serializer.*;
* <li>{@link JsonSerializer#addNotBeanClasses(Class[])}
* <li>{@link JsonSerializer#addBeanFilters(Class[])}
* <li>{@link JsonSerializer#addPojoSwaps(Class[])}
+ * <li>{@link JsonSerializer#addToDictionary(Class[])}
* <li>{@link JsonSerializer#addImplClass(Class,Class)}
* </ul>
* <p>
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
index 2cd8fb9..e066d3a 100644
--- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
@@ -51,7 +51,7 @@ public final class MsgPackParser extends InputStreamParser {
/**
* Workhorse method.
*/
- private <T> T parseAnything(MsgPackParserSession session, ClassMeta<T> eType, MsgPackInputStream is, Object outer) throws Exception {
+ private <T> T parseAnything(MsgPackParserSession session, ClassMeta<T> eType, MsgPackInputStream is, Object outer, BeanPropertyMeta pMeta) throws Exception {
BeanContext bc = session.getBeanContext();
if (eType == null)
@@ -59,6 +59,7 @@ public final class MsgPackParser extends InputStreamParser {
PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
ClassMeta<?> sType = eType.getSerializedClassMeta();
session.setCurrentClass(sType);
+ BeanDictionary bd = (pMeta == null ? bc.getBeanDictionary() : pMeta.getBeanDictionary());
Object o = null;
DataType dt = is.readDataType();
@@ -82,13 +83,13 @@ public final class MsgPackParser extends InputStreamParser {
else if (dt == ARRAY && sType.isObject()) {
ObjectList ol = new ObjectList(bc);
for (int i = 0; i < length; i++)
- ol.add(parseAnything(session, object(), is, outer));
+ ol.add(parseAnything(session, object(), is, outer, pMeta));
o = ol;
} else if (dt == MAP && sType.isObject()) {
ObjectMap om = new ObjectMap(bc);
for (int i = 0; i < length; i++)
- om.put(parseAnything(session, string(), is, outer), parseAnything(session, object(), is, om));
- o = om.cast();
+ om.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, om, pMeta));
+ o = bd.cast(om);
}
if (sType.isObject()) {
@@ -99,9 +100,9 @@ public final class MsgPackParser extends InputStreamParser {
if (dt == MAP) {
Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : new ObjectMap(bc));
for (int i = 0; i < length; i++) {
- Object key = parseAnything(session, sType.getKeyType(), is, outer);
+ Object key = parseAnything(session, sType.getKeyType(), is, outer, pMeta);
ClassMeta<?> vt = sType.getValueType();
- Object value = parseAnything(session, vt, is, m);
+ Object value = parseAnything(session, vt, is, m, pMeta);
setName(vt, value, key);
m.put(key, value);
}
@@ -112,22 +113,22 @@ public final class MsgPackParser extends InputStreamParser {
} else if (sType.canCreateNewInstanceFromObjectMap(outer)) {
ObjectMap m = new ObjectMap(bc);
for (int i = 0; i < length; i++)
- m.put(parseAnything(session, string(), is, outer), parseAnything(session, object(), is, m));
+ m.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, m, pMeta));
o = sType.newInstanceFromObjectMap(outer, m);
} else if (sType.canCreateNewBean(outer)) {
if (dt == MAP) {
BeanMap m = bc.newBeanMap(outer, sType.getInnerClass());
for (int i = 0; i < length; i++) {
- String pName = parseAnything(session, string(), is, m.getBean(false));
+ String pName = parseAnything(session, string(), is, m.getBean(false), null);
BeanPropertyMeta bpm = m.getPropertyMeta(pName);
if (bpm == null) {
if (pName.equals(bc.getBeanTypePropertyName()))
- parseAnything(session, bc.string(), is, null);
+ parseAnything(session, bc.string(), is, null, null);
else
onUnknownProperty(session, pName, m, 0, is.getPosition());
} else {
ClassMeta<?> cm = bpm.getClassMeta();
- Object value = parseAnything(session, cm, is, m.getBean(false));
+ Object value = parseAnything(session, cm, is, m.getBean(false), bpm);
setName(cm, value, pName);
bpm.set(m, value);
}
@@ -144,12 +145,12 @@ public final class MsgPackParser extends InputStreamParser {
if (dt == MAP) {
ObjectMap m = new ObjectMap(bc);
for (int i = 0; i < length; i++)
- m.put(parseAnything(session, string(), is, outer), parseAnything(session, object(), is, m));
- o = m.cast();
+ m.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, m, pMeta));
+ o = bd.cast(m);
} else if (dt == ARRAY) {
Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new ObjectList(bc));
for (int i = 0; i < length; i++)
- l.add(parseAnything(session, sType.getElementType(), is, l));
+ l.add(parseAnything(session, sType.getElementType(), is, l, pMeta));
o = l;
} else {
throw new ParseException(session, "Invalid data type {0} encountered for parse type {1}", dt, sType);
@@ -158,12 +159,12 @@ public final class MsgPackParser extends InputStreamParser {
if (dt == MAP) {
ObjectMap m = new ObjectMap(bc);
for (int i = 0; i < length; i++)
- m.put(parseAnything(session, string(), is, outer), parseAnything(session, object(), is, m));
- o = m.cast();
+ m.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, m, pMeta));
+ o = bd.cast(m);
} else if (dt == ARRAY) {
Collection l = (sType.isCollection() && sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new ObjectList(bc));
for (int i = 0; i < length; i++)
- l.add(parseAnything(session, sType.getElementType(), is, l));
+ l.add(parseAnything(session, sType.getElementType(), is, l, pMeta));
o = bc.toArray(sType, l);
} else {
throw new ParseException(session, "Invalid data type {0} encountered for parse type {1}", dt, sType);
@@ -171,9 +172,9 @@ public final class MsgPackParser extends InputStreamParser {
} else if (dt == MAP) {
ObjectMap m = new ObjectMap(bc);
for (int i = 0; i < length; i++)
- m.put(parseAnything(session, string(), is, outer), parseAnything(session, object(), is, m));
+ m.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, m, pMeta));
if (m.containsKey(bc.getBeanTypePropertyName()))
- o = m.cast();
+ o = bd.cast(m);
else
throw new ParseException(session, "Class ''{0}'' could not be instantiated. Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason());
} else {
@@ -204,7 +205,7 @@ public final class MsgPackParser extends InputStreamParser {
MsgPackParserSession s = (MsgPackParserSession)session;
type = s.getBeanContext().normalizeClassMeta(type);
MsgPackInputStream is = s.getInputStream();
- T o = parseAnything(s, type, is, s.getOuter());
+ T o = parseAnything(s, type, is, s.getOuter(), null);
return o;
}
@@ -239,6 +240,12 @@ public final class MsgPackParser extends InputStreamParser {
}
@Override /* CoreApi */
+ public MsgPackParser addToDictionary(Class<?>...classes) throws LockedException {
+ super.addToDictionary(classes);
+ return this;
+ }
+
+ @Override /* CoreApi */
public <T> MsgPackParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
super.addImplClass(interfaceClass, implClass);
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParserContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParserContext.java b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParserContext.java
index 56265dc..2d7d4dc 100644
--- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParserContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.parser.*;
* <li>{@link MsgPackParser#addNotBeanClasses(Class[])}
* <li>{@link MsgPackParser#addBeanFilters(Class[])}
* <li>{@link MsgPackParser#addPojoSwaps(Class[])}
+ * <li>{@link MsgPackParser#addToDictionary(Class[])}
* <li>{@link MsgPackParser#addImplClass(Class,Class)}
* </ul>
* <p>
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
index 6923ecd..b8cd99c 100644
--- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
@@ -144,9 +144,9 @@ public class MsgPackSerializer extends OutputStreamSerializer {
}
}
- private void serializeBeanMap(MsgPackSerializerSession session, MsgPackOutputStream out, final BeanMap<?> m, boolean addClassAttr) throws Exception {
+ private void serializeBeanMap(MsgPackSerializerSession session, MsgPackOutputStream out, final BeanMap<?> m, boolean addTypeProperty) throws Exception {
- List<BeanPropertyValue> values = m.getValues(session.isTrimNulls(), addClassAttr ? session.createBeanTypeNameProperty(m, null) : null);
+ List<BeanPropertyValue> values = m.getValues(session.isTrimNulls(), addTypeProperty ? session.createBeanTypeNameProperty(m) : null);
int size = values.size();
for (BeanPropertyValue p : values)
@@ -241,6 +241,12 @@ public class MsgPackSerializer extends OutputStreamSerializer {
}
@Override /* CoreApi */
+ public MsgPackSerializer addToDictionary(Class<?>...classes) throws LockedException {
+ super.addToDictionary(classes);
+ return this;
+ }
+
+ @Override /* CoreApi */
public <T> MsgPackSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
super.addImplClass(interfaceClass, implClass);
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerContext.java
index f730f01..fcc9f0d 100644
--- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.serializer.*;
* <li>{@link MsgPackSerializer#addNotBeanClasses(Class[])}
* <li>{@link MsgPackSerializer#addBeanFilters(Class[])}
* <li>{@link MsgPackSerializer#addPojoSwaps(Class[])}
+ * <li>{@link MsgPackSerializer#addToDictionary(Class[])}
* <li>{@link MsgPackSerializer#addImplClass(Class,Class)}
* </ul>
* <p>
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
index ef6e4a1..fcbb007 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
@@ -710,6 +710,12 @@ public abstract class Parser extends CoreApi {
}
@Override /* CoreApi */
+ public Parser addToDictionary(Class<?>...classes) throws LockedException {
+ super.addToDictionary(classes);
+ return this;
+ }
+
+ @Override /* CoreApi */
public <T> Parser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
super.addImplClass(interfaceClass, implClass);
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java b/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java
index 86caf2f..71797ce 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java
@@ -280,6 +280,20 @@ public final class ParserGroup extends Lockable {
}
/**
+ * Shortcut for calling {@link Parser#addToDictionary(Class[])} on all parsers in this group.
+ *
+ * @param classes The classes to add to the bean dictionary on the underlying bean context of all parsers in this group.
+ * @throws LockedException If {@link #lock()} was called on this object.
+ * @return This object (for method chaining).
+ */
+ public ParserGroup addToDictionary(Class<?>...classes) throws LockedException {
+ checkLock();
+ for (Parser p : parsers)
+ p.addToDictionary(classes);
+ return this;
+ }
+
+ /**
* Shortcut for calling {@link Parser#addImplClass(Class, Class)} on all parsers in this group.
*
* @param <T> The interface or abstract class type.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java b/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
index 60086a9..6895668 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
@@ -316,6 +316,12 @@ public abstract class Serializer extends CoreApi {
}
@Override /* CoreApi */
+ public Serializer addToDictionary(Class<?>...classes) throws LockedException {
+ super.addToDictionary(classes);
+ return this;
+ }
+
+ @Override /* CoreApi */
public <T> Serializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
super.addImplClass(interfaceClass, implClass);
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
index fd450e8..d18e7c9 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
@@ -303,6 +303,20 @@ public final class SerializerGroup extends Lockable {
}
/**
+ * Shortcut for calling {@link Serializer#addToDictionary(Class[])} on all serializers in this group.
+ *
+ * @param classes The classes to add to the bean dictionary on the underlying bean context of all serializers in this group.
+ * @throws LockedException If {@link #lock()} was called on this object.
+ * @return This object (for method chaining).
+ */
+ public SerializerGroup addToDictionary(Class<?>...classes) throws LockedException {
+ checkLock();
+ for (Serializer s : serializers)
+ s.addToDictionary(classes);
+ return this;
+ }
+
+ /**
* Shortcut for calling {@link Serializer#addImplClass(Class, Class)} on all serializers in this group.
*
* @param <T> The interface or abstract class type.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index 052a8de..49aefe7 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -746,17 +746,14 @@ public class SerializerSession extends Session {
*
* @param m
* The bean map to create a class property on.
- * @param beanDictionary
- * The bean dictionary map to use to resolve the name of the bean class.
* @return
* A new bean property value.
*/
- public BeanPropertyValue createBeanTypeNameProperty(BeanMap<?> m, BeanDictionary beanDictionary) {
+ public BeanPropertyValue createBeanTypeNameProperty(BeanMap<?> m) {
BeanMeta<?> bm = m.getMeta();
- Class<?> c = bm.getClassMeta().getInnerClass();
- String name = (beanDictionary == null ? null : beanDictionary.getNameForClass(c));
+ String name = bm.getClassMeta().getDictionaryName();
if (name == null)
- name = c.getName();
+ return null;
return new BeanPropertyValue(bm.getTypeProperty(), name, null);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java
index 3a51c03..41f340f 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java
@@ -85,16 +85,18 @@ public class UonParser extends ReaderParser {
* @param r The reader being parsed.
* @param outer The outer object (for constructing nested inner classes).
* @param isUrlParamValue If <jk>true</jk>, then we're parsing a top-level URL-encoded value which is treated a bit different than the default case.
+ * @param pMeta The current bean property being parsed.
* @return The parsed object.
* @throws Exception
*/
- protected <T> T parseAnything(UonParserSession session, ClassMeta<T> eType, ParserReader r, Object outer, boolean isUrlParamValue) throws Exception {
+ protected <T> T parseAnything(UonParserSession session, ClassMeta<T> eType, ParserReader r, Object outer, boolean isUrlParamValue, BeanPropertyMeta pMeta) throws Exception {
BeanContext bc = session.getBeanContext();
if (eType == null)
eType = (ClassMeta<T>)object();
PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
ClassMeta<?> sType = eType.getSerializedClassMeta();
+ BeanDictionary bd = (pMeta == null ? bc.getBeanDictionary() : pMeta.getBeanDictionary());
Object o = null;
@@ -121,11 +123,11 @@ public class UonParser extends ReaderParser {
o = parseNumber(session, r, null);
} else if (flag == 'o') {
ObjectMap m = new ObjectMap(bc);
- parseIntoMap(session, r, m, string(), object());
- o = m.cast();
+ parseIntoMap(session, r, m, string(), object(), pMeta);
+ o = bd.cast(m);
} else if (flag == 'a') {
Collection l = new ObjectList(bc);
- o = parseIntoCollection(session, r, l, sType.getElementType(), isUrlParamValue);
+ o = parseIntoCollection(session, r, l, sType.getElementType(), isUrlParamValue, pMeta);
} else {
throw new ParseException(session, "Unexpected flag character ''{0}''.", flag);
}
@@ -140,14 +142,14 @@ public class UonParser extends ReaderParser {
o = parseNumber(session, r, (Class<? extends Number>)sType.getInnerClass());
} else if (sType.isMap()) {
Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : new ObjectMap(bc));
- o = parseIntoMap(session, r, m, sType.getKeyType(), sType.getValueType());
+ o = parseIntoMap(session, r, m, sType.getKeyType(), sType.getValueType(), pMeta);
} else if (sType.isCollection()) {
if (flag == 'o') {
ObjectMap m = new ObjectMap(bc);
- parseIntoMap(session, r, m, string(), object());
+ parseIntoMap(session, r, m, string(), object(), pMeta);
// Handle case where it's a collection, but serialized as a map with a _type or _value key.
if (m.containsKey(bc.getBeanTypePropertyName()))
- o = m.cast();
+ o = bd.cast(m);
// Handle case where it's a collection, but only a single value was specified.
else {
Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance(outer) : new ObjectList(bc));
@@ -156,11 +158,11 @@ public class UonParser extends ReaderParser {
}
} else {
Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance(outer) : new ObjectList(bc));
- o = parseIntoCollection(session, r, l, sType.getElementType(), isUrlParamValue);
+ o = parseIntoCollection(session, r, l, sType.getElementType(), isUrlParamValue, pMeta);
}
} else if (sType.canCreateNewInstanceFromObjectMap(outer)) {
ObjectMap m = new ObjectMap(bc);
- parseIntoMap(session, r, m, string(), object());
+ parseIntoMap(session, r, m, string(), object(), pMeta);
o = sType.newInstanceFromObjectMap(outer, m);
} else if (sType.canCreateNewBean(outer)) {
BeanMap m = bc.newBeanMap(outer, sType.getInnerClass());
@@ -175,10 +177,10 @@ public class UonParser extends ReaderParser {
} else if (sType.isArray()) {
if (flag == 'o') {
ObjectMap m = new ObjectMap(bc);
- parseIntoMap(session, r, m, string(), object());
+ parseIntoMap(session, r, m, string(), object(), pMeta);
// Handle case where it's an array, but serialized as a map with a _type or _value key.
if (m.containsKey(bc.getBeanTypePropertyName()))
- o = m.cast();
+ o = bd.cast(m);
// Handle case where it's an array, but only a single value was specified.
else {
ArrayList l = new ArrayList(1);
@@ -186,15 +188,15 @@ public class UonParser extends ReaderParser {
o = bc.toArray(sType, l);
}
} else {
- ArrayList l = (ArrayList)parseIntoCollection(session, r, new ArrayList(), sType.getElementType(), isUrlParamValue);
+ ArrayList l = (ArrayList)parseIntoCollection(session, r, new ArrayList(), sType.getElementType(), isUrlParamValue, pMeta);
o = bc.toArray(sType, l);
}
} else if (flag == 'o') {
// It could be a non-bean with _type attribute.
ObjectMap m = new ObjectMap(bc);
- parseIntoMap(session, r, m, string(), object());
+ parseIntoMap(session, r, m, string(), object(), pMeta);
if (m.containsKey(bc.getBeanTypePropertyName()))
- o = m.cast();
+ o = bd.cast(m);
else
throw new ParseException(session, "Class ''{0}'' could not be instantiated. Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason());
} else {
@@ -210,7 +212,7 @@ public class UonParser extends ReaderParser {
return (T)o;
}
- private <K,V> Map<K,V> parseIntoMap(UonParserSession session, ParserReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType) throws Exception {
+ private <K,V> Map<K,V> parseIntoMap(UonParserSession session, ParserReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType, BeanPropertyMeta pMeta) throws Exception {
if (keyType == null)
keyType = (ClassMeta<K>)string();
@@ -266,7 +268,7 @@ public class UonParser extends ReaderParser {
return m;
state = S1;
} else {
- V value = parseAnything(session, valueType, r.unread(), m, false);
+ V value = parseAnything(session, valueType, r.unread(), m, false, pMeta);
setName(valueType, value, currAttr);
m.put(currAttr, value);
state = S4;
@@ -294,7 +296,7 @@ public class UonParser extends ReaderParser {
return null; // Unreachable.
}
- private <E> Collection<E> parseIntoCollection(UonParserSession session, ParserReader r, Collection<E> l, ClassMeta<E> elementType, boolean isUrlParamValue) throws Exception {
+ private <E> Collection<E> parseIntoCollection(UonParserSession session, ParserReader r, Collection<E> l, ClassMeta<E> elementType, boolean isUrlParamValue, BeanPropertyMeta pMeta) throws Exception {
int c = r.read();
if (c == -1 || c == NUL || c == AMP)
@@ -320,14 +322,14 @@ public class UonParser extends ReaderParser {
if (state == S1 || state == S2) {
if (c == ')') {
if (state == S2) {
- l.add(parseAnything(session, elementType, r.unread(), l, false));
+ l.add(parseAnything(session, elementType, r.unread(), l, false, pMeta));
r.read();
}
return l;
} else if ((c == '\n' || c == '\r') && session.isWhitespaceAware()) {
skipSpace(r);
} else {
- l.add(parseAnything(session, elementType, r.unread(), l, false));
+ l.add(parseAnything(session, elementType, r.unread(), l, false, pMeta));
state = S3;
}
} else if (state == S3) {
@@ -354,7 +356,7 @@ public class UonParser extends ReaderParser {
if ((c == '\n' || c == '\r') && session.isWhitespaceAware()) {
skipSpace(r);
} else {
- l.add(parseAnything(session, elementType, r.unread(), l, false));
+ l.add(parseAnything(session, elementType, r.unread(), l, false, pMeta));
state = S2;
}
} else if (state == S2) {
@@ -442,16 +444,16 @@ public class UonParser extends ReaderParser {
BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
if (pMeta == null) {
if (m.getMeta().isSubTyped()) {
- Object value = parseAnything(session, object(), r.unread(), m.getBean(false), false);
+ Object value = parseAnything(session, object(), r.unread(), m.getBean(false), false, null);
m.put(currAttr, value);
} else {
onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
- parseAnything(session, object(), r.unread(), m.getBean(false), false); // Read content anyway to ignore it
+ parseAnything(session, object(), r.unread(), m.getBean(false), false, null); // Read content anyway to ignore it
}
} else {
session.setCurrentProperty(pMeta);
ClassMeta<?> cm = pMeta.getClassMeta();
- Object value = parseAnything(session, cm, r.unread(), m.getBean(false), false);
+ Object value = parseAnything(session, cm, r.unread(), m.getBean(false), false, pMeta);
setName(cm, value, currAttr);
pMeta.set(m, value);
session.setCurrentProperty(null);
@@ -700,7 +702,7 @@ public class UonParser extends ReaderParser {
if (state == S1) {
if (c == ')')
return o;
- o[i] = parseAnything(session, argTypes[i], r.unread(), session.getOuter(), false);
+ o[i] = parseAnything(session, argTypes[i], r.unread(), session.getOuter(), false, null);
i++;
state = S2;
} else if (state == S2) {
@@ -743,7 +745,7 @@ public class UonParser extends ReaderParser {
UonParserSession s = (UonParserSession)session;
type = s.getBeanContext().normalizeClassMeta(type);
UonReader r = s.getReader();
- T o = parseAnything(s, type, r, s.getOuter(), true);
+ T o = parseAnything(s, type, r, s.getOuter(), true, null);
validateEnd(s, r);
return o;
}
@@ -753,7 +755,7 @@ public class UonParser extends ReaderParser {
UonParserSession s = (UonParserSession)session;
UonReader r = s.getReader();
readFlag(s, r, 'o');
- m = parseIntoMap(s, r, m, s.getBeanContext().getClassMeta(keyType), s.getBeanContext().getClassMeta(valueType));
+ m = parseIntoMap(s, r, m, s.getBeanContext().getClassMeta(keyType), s.getBeanContext().getClassMeta(valueType), null);
validateEnd(s, r);
return m;
}
@@ -763,7 +765,7 @@ public class UonParser extends ReaderParser {
UonParserSession s = (UonParserSession)session;
UonReader r = s.getReader();
readFlag(s, r, 'a');
- c = parseIntoCollection(s, r, c, s.getBeanContext().getClassMeta(elementType), false);
+ c = parseIntoCollection(s, r, c, s.getBeanContext().getClassMeta(elementType), false, null);
validateEnd(s, r);
return c;
}
@@ -808,6 +810,12 @@ public class UonParser extends ReaderParser {
}
@Override /* CoreApi */
+ public UonParser addToDictionary(Class<?>...classes) throws LockedException {
+ super.addToDictionary(classes);
+ return this;
+ }
+
+ @Override /* CoreApi */
public <T> UonParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
super.addImplClass(interfaceClass, implClass);
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java
index d220cf1..f64b800 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.parser.*;
* <li>{@link UonParser#addNotBeanClasses(Class[])}
* <li>{@link UonParser#addBeanFilters(Class[])}
* <li>{@link UonParser#addPojoSwaps(Class[])}
+ * <li>{@link UonParser#addToDictionary(Class[])}
* <li>{@link UonParser#addImplClass(Class,Class)}
* </ul>
* <p>