Repository: incubator-juneau
Updated Branches:
  refs/heads/master 9dc9b7515 -> 949921157


Add addBeanTypeProperties settings for individual serializers.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/94992115
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/94992115
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/94992115

Branch: refs/heads/master
Commit: 94992115738f8b55ae104556ebd08e91feb56847
Parents: 9dc9b75
Author: JamesBognar <[email protected]>
Authored: Thu Feb 16 16:30:29 2017 -0500
Committer: JamesBognar <[email protected]>
Committed: Thu Feb 16 16:31:37 2017 -0500

----------------------------------------------------------------------
 .../juneau/jena/RdfSerializerContext.java       | 29 ++++++++++++++++-
 .../juneau/jena/RdfSerializerSession.java       | 21 ++++++++++++-
 .../juneau/html/HtmlSerializerContext.java      | 29 ++++++++++++++++-
 .../juneau/html/HtmlSerializerSession.java      | 18 ++++++++++-
 .../juneau/json/JsonSerializerContext.java      | 23 +++++++++++++-
 .../juneau/json/JsonSerializerSession.java      | 17 +++++++++-
 .../msgpack/MsgPackSerializerContext.java       | 24 ++++++++++++++
 .../msgpack/MsgPackSerializerSession.java       | 22 ++++++++++++-
 .../juneau/serializer/SerializerSession.java    |  4 +--
 .../urlencoding/UonSerializerContext.java       | 24 +++++++++++++-
 .../urlencoding/UonSerializerSession.java       | 33 ++++++++++++++------
 .../juneau/urlencoding/doc-files/rfc_uon.txt    | 28 ++++++++---------
 .../apache/juneau/xml/XmlSerializerContext.java | 24 +++++++++++++-
 .../apache/juneau/xml/XmlSerializerSession.java | 16 +++++++++-
 juneau-core/src/main/javadoc/overview.html      | 26 +++++++++++++++
 15 files changed, 303 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java
 
b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java
index 7dcd923..8c91057 100644
--- 
a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java
+++ 
b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java
@@ -103,8 +103,33 @@ public final class RdfSerializerContext extends 
SerializerContext implements Rdf
         */
        public static final String RDF_namespaces = 
"RdfSerializer.namespaces.list";
 
+       /**
+        * <b>Configuration property:</b>  Add <js>"_type"</js> properties when 
needed.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"RdfSerializer.addBeanTypeProperties"</js>
+        *      <li><b>Data type:</b> <code>Boolean</code>
+        *      <li><b>Default:</b> <jk>false</jk>
+        *      <li><b>Session-overridable:</b> <jk>true</jk>
+        * </ul>
+        * <p>
+        * If <jk>true</jk>, then <js>"_type"</js> properties will be added to 
beans if their type cannot be inferred through reflection.
+        * This is used to recreate the correct objects during parsing if the 
object types cannot be inferred.
+        * For example, when serializing a {@code Map<String,Object>} field, 
where the bean class cannot be determined from the value type.
+        * <p>
+        * When present, this value overrides the {@link 
SerializerContext#SERIALIZER_addBeanTypeProperties} setting and is
+        * provided to customize the behavior of specific serializers in a 
{@link SerializerGroup}.
+        */
+       public static final String RDF_addBeanTypeProperties = 
"RdfSerializer.addBeanTypeProperties";
+
 
-       final boolean addLiteralTypes, addRootProperty, useXmlNamespaces, 
looseCollections, autoDetectNamespaces;
+       final boolean 
+               addLiteralTypes, 
+               addRootProperty, 
+               useXmlNamespaces, 
+               looseCollections, 
+               autoDetectNamespaces,
+               addBeanTypeProperties;
        final String rdfLanguage;
        final Namespace juneauNs;
        final Namespace juneauBpNs;
@@ -131,6 +156,7 @@ public final class RdfSerializerContext extends 
SerializerContext implements Rdf
                juneauBpNs = cf.getProperty(RDF_juneauBpNs, Namespace.class, 
new Namespace("jp", "http://www.apache.org/juneaubp/";));
                collectionFormat = cf.getProperty(RDF_collectionFormat, 
RdfCollectionFormat.class, RdfCollectionFormat.DEFAULT);
                namespaces = cf.getProperty(RDF_namespaces, Namespace[].class, 
new Namespace[0]);
+               addBeanTypeProperties = 
cf.getProperty(RDF_addBeanTypeProperties, boolean.class, 
cf.getProperty(SERIALIZER_addBeanTypeProperties, boolean.class, true));
        }
 
        @Override /* Context */
@@ -147,6 +173,7 @@ public final class RdfSerializerContext extends 
SerializerContext implements Rdf
                                .append("juneauBpNs", juneauBpNs)
                                .append("collectionFormat", collectionFormat)
                                .append("namespaces", namespaces)
+                               .append("addBeanTypeProperties", 
addBeanTypeProperties)
                        );
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
 
b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
index d03b775..ef9f347 100644
--- 
a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
+++ 
b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
@@ -21,6 +21,7 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.json.*;
+import org.apache.juneau.msgpack.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.xml.*;
 
@@ -35,7 +36,13 @@ public final class RdfSerializerSession extends 
SerializerSession {
 
        private final String rdfLanguage;
        private final Namespace juneauNs, juneauBpNs;
-       private final boolean addLiteralTypes, addRootProperty, 
useXmlNamespaces, looseCollections, autoDetectNamespaces;
+       private final boolean 
+               addLiteralTypes, 
+               addRootProperty, 
+               useXmlNamespaces, 
+               looseCollections, 
+               autoDetectNamespaces,
+               addBeanTypeProperties;
        private final Property pRoot, pValue, pType;
        private final Model model;
        private final RDFWriter writer;
@@ -74,6 +81,7 @@ public final class RdfSerializerSession extends 
SerializerSession {
                        this.useXmlNamespaces = ctx.useXmlNamespaces;
                        this.autoDetectNamespaces = ctx.autoDetectNamespaces;
                        this.namespaces = ctx.namespaces;
+                       addBeanTypeProperties = ctx.addBeanTypeProperties;
                } else {
                        this.rdfLanguage = op.getString(RDF_language, 
ctx.rdfLanguage);
                        this.juneauNs = (op.containsKey(RDF_juneauNs) ? 
NamespaceFactory.parseNamespace(op.get(RDF_juneauNs)) : ctx.juneauNs);
@@ -90,6 +98,7 @@ public final class RdfSerializerSession extends 
SerializerSession {
                        this.useXmlNamespaces = 
op.getBoolean(RDF_useXmlNamespaces, ctx.useXmlNamespaces);
                        this.autoDetectNamespaces = 
op.getBoolean(RDF_autoDetectNamespaces, ctx.autoDetectNamespaces);
                        this.namespaces = op.get(Namespace[].class, 
RDF_namespaces, ctx.namespaces);
+                       addBeanTypeProperties = 
op.getBoolean(RDF_addBeanTypeProperties, ctx.addBeanTypeProperties);
                }
                this.model = ModelFactory.createDefaultModel();
                addModelPrefix(juneauNs);
@@ -202,6 +211,16 @@ public final class RdfSerializerSession extends 
SerializerSession {
        }
 
        /**
+        * Returns the {@link 
MsgPackSerializerContext#MSGPACK_addBeanTypeProperties} setting value for this 
session.
+        *
+        * @return The {@link 
MsgPackSerializerContext#MSGPACK_addBeanTypeProperties} setting value for this 
session.
+        */
+       @Override /* SerializerSession */
+       public final boolean isAddBeanTypeProperties() {
+               return addBeanTypeProperties;
+       }
+
+       /**
         * Returns the RDF property that identifies the root node in the RDF 
model.
         *
         * @return The RDF property that identifies the root node in the RDF 
model.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/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 b15271a..b2096c1 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
@@ -13,6 +13,7 @@
 package org.apache.juneau.html;
 
 import org.apache.juneau.*;
+import org.apache.juneau.serializer.*;
 import org.apache.juneau.xml.*;
 
 /**
@@ -126,8 +127,32 @@ public class HtmlSerializerContext extends 
XmlSerializerContext {
         */
        public static final String HTML_addKeyValueTableHeaders = 
"HtmlSerializer.addKeyValueTableHeaders";
 
+       /**
+        * <b>Configuration property:</b>  Add <js>"_type"</js> properties when 
needed.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"HtmlSerializer.addBeanTypeProperties"</js>
+        *      <li><b>Data type:</b> <code>Boolean</code>
+        *      <li><b>Default:</b> <jk>false</jk>
+        *      <li><b>Session-overridable:</b> <jk>true</jk>
+        * </ul>
+        * <p>
+        * If <jk>true</jk>, then <js>"_type"</js> properties will be added to 
beans if their type cannot be inferred through reflection.
+        * This is used to recreate the correct objects during parsing if the 
object types cannot be inferred.
+        * For example, when serializing a {@code Map<String,Object>} field, 
where the bean class cannot be determined from the value type.
+        * <p>
+        * When present, this value overrides the {@link 
SerializerContext#SERIALIZER_addBeanTypeProperties} setting and is
+        * provided to customize the behavior of specific serializers in a 
{@link SerializerGroup}.
+        */
+       public static final String HTML_addBeanTypeProperties = 
"HtmlSerializer.addBeanTypeProperties";
+
+
        final String uriAnchorText;
-       final boolean lookForLabelParameters, detectLinksInStrings, 
addKeyValueTableHeaders;
+       final boolean
+               lookForLabelParameters,
+               detectLinksInStrings,
+               addKeyValueTableHeaders,
+               addBeanTypeProperties;
        final String labelParameter;
 
        /**
@@ -144,6 +169,7 @@ public class HtmlSerializerContext extends 
XmlSerializerContext {
                detectLinksInStrings = 
cf.getProperty(HTML_detectLinksInStrings, Boolean.class, true);
                labelParameter = cf.getProperty(HTML_labelParameter, 
String.class, "label");
                addKeyValueTableHeaders = 
cf.getProperty(HTML_addKeyValueTableHeaders, Boolean.class, false);
+               addBeanTypeProperties = 
cf.getProperty(HTML_addBeanTypeProperties, boolean.class, 
cf.getProperty(SERIALIZER_addBeanTypeProperties, boolean.class, true));
        }
 
        @Override /* Context */
@@ -155,6 +181,7 @@ public class HtmlSerializerContext extends 
XmlSerializerContext {
                                .append("detectLinksInStrings", 
detectLinksInStrings)
                                .append("labelParameter", labelParameter)
                                .append("addKeyValueTableHeaders", 
addKeyValueTableHeaders)
+                               .append("addBeanTypeProperties", 
addBeanTypeProperties)
                        );
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
index 3d67924..ad573c8 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.html;
 
 import static org.apache.juneau.html.HtmlSerializerContext.*;
+import static org.apache.juneau.msgpack.MsgPackSerializerContext.*;
 
 import java.lang.reflect.*;
 import java.util.*;
@@ -31,7 +32,11 @@ import org.apache.juneau.xml.*;
 public class HtmlSerializerSession extends XmlSerializerSession {
 
        private final AnchorText anchorText;
-       private final boolean detectLinksInStrings, lookForLabelParameters, 
addKeyValueTableHeaders;
+       private final boolean
+               detectLinksInStrings,
+               lookForLabelParameters,
+               addKeyValueTableHeaders,
+               addBeanTypeProperties;
        private final Pattern urlPattern = 
Pattern.compile("http[s]?\\:\\/\\/.*");
        private final Pattern labelPattern;
        private final String absolutePathUriBase, relativeUriBase;
@@ -66,12 +71,14 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                        lookForLabelParameters = ctx.lookForLabelParameters;
                        labelParameter = ctx.labelParameter;
                        addKeyValueTableHeaders = ctx.addKeyValueTableHeaders;
+                       addBeanTypeProperties = ctx.addBeanTypeProperties;
                } else {
                        anchorText = Enum.valueOf(AnchorText.class, 
op.getString(HTML_uriAnchorText, ctx.uriAnchorText));
                        detectLinksInStrings = 
op.getBoolean(HTML_detectLinksInStrings, ctx.detectLinksInStrings);
                        lookForLabelParameters = 
op.getBoolean(HTML_lookForLabelParameters, ctx.lookForLabelParameters);
                        labelParameter = op.getString(HTML_labelParameter, 
ctx.labelParameter);
                        addKeyValueTableHeaders = 
op.getBoolean(HTML_addKeyValueTableHeaders, ctx.addKeyValueTableHeaders);
+                       addBeanTypeProperties = 
op.getBoolean(MSGPACK_addBeanTypeProperties, ctx.addBeanTypeProperties);
                }
                labelPattern = Pattern.compile("[\\?\\&]" + 
Pattern.quote(labelParameter) + "=([^\\&]*)");
                this.absolutePathUriBase = getAbsolutePathUriBase();
@@ -165,4 +172,13 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                return addKeyValueTableHeaders;
        }
 
+       /**
+        * Returns the {@link HtmlSerializerContext#HTML_addBeanTypeProperties} 
setting value for this session.
+        *
+        * @return The {@link HtmlSerializerContext#HTML_addBeanTypeProperties} 
setting value for this session.
+        */
+       @Override /* SerializerSession */
+       public final boolean isAddBeanTypeProperties() {
+               return addBeanTypeProperties;
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/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 6cdceb3..9b0afc5 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
@@ -65,10 +65,29 @@ public final class JsonSerializerContext extends 
SerializerContext {
         */
        public static final String JSON_escapeSolidus = 
"JsonSerializer.escapeSolidus";
 
+       /**
+        * <b>Configuration property:</b>  Add <js>"_type"</js> properties when 
needed.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"JsonSerializer.addBeanTypeProperties"</js>
+        *      <li><b>Data type:</b> <code>Boolean</code>
+        *      <li><b>Default:</b> <jk>false</jk>
+        *      <li><b>Session-overridable:</b> <jk>true</jk>
+        * </ul>
+        * <p>
+        * If <jk>true</jk>, then <js>"_type"</js> properties will be added to 
beans if their type cannot be inferred through reflection.
+        * This is used to recreate the correct objects during parsing if the 
object types cannot be inferred.
+        * For example, when serializing a {@code Map<String,Object>} field, 
where the bean class cannot be determined from the value type.
+        * <p>
+        * When present, this value overrides the {@link 
SerializerContext#SERIALIZER_addBeanTypeProperties} setting and is
+        * provided to customize the behavior of specific serializers in a 
{@link SerializerGroup}.
+        */
+       public static final String JSON_addBeanTypeProperties = 
"JsonSerializer.addBeanTypeProperties";
 
        final boolean
                simpleMode,
-               escapeSolidus;
+               escapeSolidus,
+               addBeanTypeProperties;
 
        /**
         * Constructor.
@@ -81,6 +100,7 @@ public final class JsonSerializerContext extends 
SerializerContext {
                super(cf);
                simpleMode = cf.getProperty(JSON_simpleMode, boolean.class, 
false);
                escapeSolidus = cf.getProperty(JSON_escapeSolidus, 
boolean.class, false);
+               addBeanTypeProperties = 
cf.getProperty(JSON_addBeanTypeProperties, boolean.class, 
cf.getProperty(SERIALIZER_addBeanTypeProperties, boolean.class, true));
        }
 
        @Override /* Context */
@@ -89,6 +109,7 @@ public final class JsonSerializerContext extends 
SerializerContext {
                        .append("JsonSerializerContext", new ObjectMap()
                                .append("simpleMode", simpleMode)
                                .append("escapeSolidus", escapeSolidus)
+                               .append("addBeanTypeProperties", 
addBeanTypeProperties)
                        );
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
index 1d99bf7..ebe569a 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
@@ -27,7 +27,10 @@ import org.apache.juneau.serializer.*;
  */
 public final class JsonSerializerSession extends SerializerSession {
 
-       private final boolean simpleMode, escapeSolidus;
+       private final boolean
+               simpleMode,
+               escapeSolidus,
+               addBeanTypeProperties;
 
        /**
         * Create a new session using properties specified in the context.
@@ -49,9 +52,11 @@ public final class JsonSerializerSession extends 
SerializerSession {
                if (op == null || op.isEmpty()) {
                        simpleMode = ctx.simpleMode;
                        escapeSolidus = ctx.escapeSolidus;
+                       addBeanTypeProperties = ctx.addBeanTypeProperties;
                } else {
                        simpleMode = op.getBoolean(JSON_simpleMode, 
ctx.simpleMode);
                        escapeSolidus = op.getBoolean(JSON_escapeSolidus, 
ctx.escapeSolidus);
+                       addBeanTypeProperties = 
op.getBoolean(JSON_addBeanTypeProperties, ctx.addBeanTypeProperties);
                }
        }
 
@@ -73,6 +78,16 @@ public final class JsonSerializerSession extends 
SerializerSession {
                return escapeSolidus;
        }
 
+       /**
+        * Returns the {@link JsonSerializerContext#JSON_addBeanTypeProperties} 
setting value for this session.
+        *
+        * @return The {@link JsonSerializerContext#JSON_addBeanTypeProperties} 
setting value for this session.
+        */
+       @Override /* SerializerSession */
+       public final boolean isAddBeanTypeProperties() {
+               return addBeanTypeProperties;
+       }
+
        @Override /* ParserSession */
        public JsonWriter getWriter() throws Exception {
                Object output = getOutput();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/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 7fa6019..e74a041 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
@@ -34,6 +34,28 @@ import org.apache.juneau.serializer.*;
 public final class MsgPackSerializerContext extends SerializerContext {
 
        /**
+        * <b>Configuration property:</b>  Add <js>"_type"</js> properties when 
needed.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> 
<js>"MsgPackSerializer.addBeanTypeProperties"</js>
+        *      <li><b>Data type:</b> <code>Boolean</code>
+        *      <li><b>Default:</b> <jk>false</jk>
+        *      <li><b>Session-overridable:</b> <jk>true</jk>
+        * </ul>
+        * <p>
+        * If <jk>true</jk>, then <js>"_type"</js> properties will be added to 
beans if their type cannot be inferred through reflection.
+        * This is used to recreate the correct objects during parsing if the 
object types cannot be inferred.
+        * For example, when serializing a {@code Map<String,Object>} field, 
where the bean class cannot be determined from the value type.
+        * <p>
+        * When present, this value overrides the {@link 
SerializerContext#SERIALIZER_addBeanTypeProperties} setting and is
+        * provided to customize the behavior of specific serializers in a 
{@link SerializerGroup}.
+        */
+       public static final String MSGPACK_addBeanTypeProperties = 
"MsgPackSerializer.addBeanTypeProperties";
+
+       final boolean
+               addBeanTypeProperties;
+
+       /**
         * Constructor.
         * <p>
         * Typically only called from {@link ContextFactory#getContext(Class)}.
@@ -42,12 +64,14 @@ public final class MsgPackSerializerContext extends 
SerializerContext {
         */
        public MsgPackSerializerContext(ContextFactory cf) {
                super(cf);
+               addBeanTypeProperties = 
cf.getProperty(MSGPACK_addBeanTypeProperties, boolean.class, 
cf.getProperty(SERIALIZER_addBeanTypeProperties, boolean.class, true));
        }
 
        @Override /* Context */
        public ObjectMap asMap() {
                return super.asMap()
                        .append("MsgPackSerializerContext", new ObjectMap()
+                               .append("addBeanTypeProperties", 
addBeanTypeProperties)
                        );
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
 
b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
index aa3eb0f..4b87867 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.msgpack;
 
+import static org.apache.juneau.msgpack.MsgPackSerializerContext.*;
+
 import java.lang.reflect.*;
 import java.util.*;
 
@@ -27,6 +29,9 @@ import org.apache.juneau.serializer.*;
  */
 public final class MsgPackSerializerSession extends SerializerSession {
 
+       private final boolean
+               addBeanTypeProperties;
+
        /**
         * Create a new session using properties specified in the context.
         *
@@ -44,9 +49,24 @@ public final class MsgPackSerializerSession extends 
SerializerSession {
         */
        protected MsgPackSerializerSession(MsgPackSerializerContext ctx, 
ObjectMap op, Object output, Method javaMethod, Locale locale, TimeZone 
timeZone, MediaType mediaType) {
                super(ctx, op, output, javaMethod, locale, timeZone, mediaType);
+               if (op == null || op.isEmpty()) {
+                       addBeanTypeProperties = ctx.addBeanTypeProperties;
+               } else {
+                       addBeanTypeProperties = 
op.getBoolean(MSGPACK_addBeanTypeProperties, ctx.addBeanTypeProperties);
+               }
+       }
+
+       /**
+        * Returns the {@link 
MsgPackSerializerContext#MSGPACK_addBeanTypeProperties} setting value for this 
session.
+        *
+        * @return The {@link 
MsgPackSerializerContext#MSGPACK_addBeanTypeProperties} setting value for this 
session.
+        */
+       @Override /* SerializerSession */
+       public final boolean isAddBeanTypeProperties() {
+               return addBeanTypeProperties;
        }
 
-       @Override
+       @Override /*SerializerSession */
        public MsgPackOutputStream getOutputStream() throws Exception {
                Object output = getOutput();
                if (output instanceof MsgPackOutputStream)

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/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 7d499e6..69b6b26 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
@@ -285,7 +285,7 @@ public class SerializerSession extends BeanSession {
         *
         * @return The {@link 
SerializerContext#SERIALIZER_addBeanTypeProperties} setting value for this 
session.
         */
-       public final boolean isAddBeanTypeProperties() {
+       public boolean isAddBeanTypeProperties() {
                return addBeanTypeProperties;
        }
 
@@ -702,7 +702,7 @@ public class SerializerSession extends BeanSession {
                if (eType == aType)
                        return null;
 
-               if (! addBeanTypeProperties)
+               if (! isAddBeanTypeProperties())
                        return null;
 
                String eTypeTn = eType.getDictionaryName();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java
 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java
index 65867a5..ec9dca9 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java
@@ -51,9 +51,29 @@ public class UonSerializerContext extends SerializerContext {
         */
        public static final String UON_encodeChars = 
"UonSerializer.encodeChars";
 
+       /**
+        * <b>Configuration property:</b>  Add <js>"_type"</js> properties when 
needed.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"UonSerializer.addBeanTypeProperties"</js>
+        *      <li><b>Data type:</b> <code>Boolean</code>
+        *      <li><b>Default:</b> <jk>false</jk>
+        *      <li><b>Session-overridable:</b> <jk>true</jk>
+        * </ul>
+        * <p>
+        * If <jk>true</jk>, then <js>"_type"</js> properties will be added to 
beans if their type cannot be inferred through reflection.
+        * This is used to recreate the correct objects during parsing if the 
object types cannot be inferred.
+        * For example, when serializing a {@code Map<String,Object>} field, 
where the bean class cannot be determined from the value type.
+        * <p>
+        * When present, this value overrides the {@link 
SerializerContext#SERIALIZER_addBeanTypeProperties} setting and is
+        * provided to customize the behavior of specific serializers in a 
{@link SerializerGroup}.
+        */
+       public static final String UON_addBeanTypeProperties = 
"UonSerializer.addBeanTypeProperties";
+
 
        final boolean
-               encodeChars;
+               encodeChars,
+               addBeanTypeProperties;
 
        /**
         * Constructor.
@@ -65,6 +85,7 @@ public class UonSerializerContext extends SerializerContext {
        public UonSerializerContext(ContextFactory cf) {
                super(cf);
                encodeChars = cf.getProperty(UON_encodeChars, boolean.class, 
false);
+               addBeanTypeProperties = 
cf.getProperty(UON_addBeanTypeProperties, boolean.class, 
cf.getProperty(SERIALIZER_addBeanTypeProperties, boolean.class, true));
        }
 
        @Override /* Context */
@@ -72,6 +93,7 @@ public class UonSerializerContext extends SerializerContext {
                return super.asMap()
                        .append("UonSerializerContext", new ObjectMap()
                                .append("encodeChars", encodeChars)
+                               .append("addBeanTypeProperties", 
addBeanTypeProperties)
                        );
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerSession.java
 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerSession.java
index b10f68e..e0beaf3 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerSession.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerSession.java
@@ -12,6 +12,7 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.urlencoding;
 
+import static org.apache.juneau.msgpack.MsgPackSerializerContext.*;
 import static org.apache.juneau.urlencoding.UonSerializerContext.*;
 
 import java.lang.reflect.*;
@@ -28,7 +29,9 @@ import org.apache.juneau.serializer.*;
  */
 public class UonSerializerSession extends SerializerSession {
 
-       private final boolean encodeChars;
+       private final boolean
+               encodeChars,
+               addBeanTypeProperties;
 
        /**
         * Create a new session using properties specified in the context.
@@ -49,19 +52,13 @@ public class UonSerializerSession extends SerializerSession 
{
                super(ctx, op, output, javaMethod, locale, timeZone, mediaType);
                if (op == null || op.isEmpty()) {
                        encodeChars = ctx.encodeChars;
+                       addBeanTypeProperties = ctx.addBeanTypeProperties;
                } else {
                        encodeChars = op.getBoolean(UON_encodeChars, 
ctx.encodeChars);
+                       addBeanTypeProperties = 
op.getBoolean(MSGPACK_addBeanTypeProperties, ctx.addBeanTypeProperties);
                }
        }
 
-       @Override /* SerializerSession */
-       public final UonWriter getWriter() throws Exception {
-               Object output = getOutput();
-               if (output instanceof UonWriter)
-                       return (UonWriter)output;
-               return new UonWriter(this, super.getWriter(), 
isUseWhitespace(), isEncodeChars(), isTrimStrings(), getRelativeUriBase(), 
getAbsolutePathUriBase());
-       }
-
        /**
         * Returns the {@link UonSerializerContext#UON_encodeChars} setting 
value for this session.
         *
@@ -70,4 +67,22 @@ public class UonSerializerSession extends SerializerSession {
        public final boolean isEncodeChars() {
                return encodeChars;
        }
+
+       /**
+        * Returns the {@link UonSerializerContext#UON_addBeanTypeProperties} 
setting value for this session.
+        *
+        * @return The {@link UonSerializerContext#UON_addBeanTypeProperties} 
setting value for this session.
+        */
+       @Override /* SerializerSession */
+       public final boolean isAddBeanTypeProperties() {
+               return addBeanTypeProperties;
+       }
+
+       @Override /* SerializerSession */
+       public final UonWriter getWriter() throws Exception {
+               Object output = getOutput();
+               if (output instanceof UonWriter)
+                       return (UonWriter)output;
+               return new UonWriter(this, super.getWriter(), 
isUseWhitespace(), isEncodeChars(), isTrimStrings(), getRelativeUriBase(), 
getAbsolutePathUriBase());
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/rfc_uon.txt
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/rfc_uon.txt 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/rfc_uon.txt
index a78153f..7880064 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/rfc_uon.txt
+++ 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/rfc_uon.txt
@@ -81,12 +81,12 @@ Abstract
       Using the syntax defined in this document, the equivalent 
       UON notation would be as follows:
 
-         x=(id=1,name=John+Smith,uri=http://sample/
+         x=(id=1,name='John+Smith',uri=http://sample/
          addressBook/person/1,addressBookUri=http://sample/
-         addressBook,birthDate=1946-08-12T00:00:00Z,otherIds=%00,
+         addressBook,birthDate=1946-08-12T00:00:00Z,otherIds=null,
          addresses=@((uri=http://sample/addressBook/
          address/1,personUri=http://sample/addressBook/
-         person/1,id=1,street=100+Main+Street,city=
+         person/1,id=1,street='100+Main+Street',city=
          Anywhereville,state=NY,zip=12345,isCurrent=true))) 
 
 1. Language constraints
@@ -167,7 +167,13 @@ Abstract
 
       a1=123&a2=1.23e1
 
-2.5. Strings
+2.5. Null values
+
+   Nulls are represented by the keyword 'null':
+
+      a1=null
+
+2.6. Strings
 
    Strings are encapsulated in single quote (') characters.
    
@@ -209,13 +215,7 @@ Abstract
 
       a1='foo~'bar~~baz'
    
-2.7. Null values
-
-   Nulls are represented by the keyword 'null':
-
-      a1=null
-
-2.8. Top-level attribute names
+2.7. Top-level attribute names
 
    Top-level attribute names (e.g. "a1" in "&a1=foobar") are treated
    as strings but for one exception.  The '=' character must be
@@ -231,7 +231,7 @@ Abstract
    Note that the '=' character is encoded in the attribute name,
    but it is not necessary to have it encoded in the attribute value.
 
-2.9. URL-encoded characters
+2.8. URL-encoded characters
 
    UON notation allows for any character, even UON grammar
    characters, to be URL-encoded.
@@ -239,7 +239,7 @@ Abstract
    The following query strings are fully equivalent in structure:
    
      a1=(b1='x1',b2='x2')
-     %61%31=%24%6F%28%62%31%3D%78%31%2C%62%32%3D%78%32%29
+     %61%31=%79%6f%75%20%61%72%65%20%61%20%6e%65%72%64%21
 
 
 3. BNF
@@ -251,7 +251,7 @@ Abstract
    value       = (var | string | null)
 
    string      = ("'" litchar* "'") | litchar*
-   null        = "%00"
+   null        = "null"
    
    var         = ovar | avar | nvar | boolean | number
    ovar        = "(" [pairs] ")"

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerContext.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerContext.java 
b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerContext.java
index 181eaa4..cac3b8a 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerContext.java
@@ -138,11 +138,31 @@ public class XmlSerializerContext extends 
SerializerContext {
         */
        public static final String XML_namespaces = 
"XmlSerializer.namespaces.list";
 
+       /**
+        * <b>Configuration property:</b>  Add <js>"_type"</js> properties when 
needed.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"XmlSerializer.addBeanTypeProperties"</js>
+        *      <li><b>Data type:</b> <code>Boolean</code>
+        *      <li><b>Default:</b> <jk>false</jk>
+        *      <li><b>Session-overridable:</b> <jk>true</jk>
+        * </ul>
+        * <p>
+        * If <jk>true</jk>, then <js>"_type"</js> properties will be added to 
beans if their type cannot be inferred through reflection.
+        * This is used to recreate the correct objects during parsing if the 
object types cannot be inferred.
+        * For example, when serializing a {@code Map<String,Object>} field, 
where the bean class cannot be determined from the value type.
+        * <p>
+        * When present, this value overrides the {@link 
SerializerContext#SERIALIZER_addBeanTypeProperties} setting and is
+        * provided to customize the behavior of specific serializers in a 
{@link SerializerGroup}.
+        */
+       public static final String XML_addBeanTypeProperties = 
"XmlSerializer.addBeanTypeProperties";
+
 
        final boolean
                autoDetectNamespaces,
                enableNamespaces,
-               addNamespaceUrlsToRoot;
+               addNamespaceUrlsToRoot,
+               addBeanTypeProperties;
 
        final String defaultNamespace;
 
@@ -166,6 +186,7 @@ public class XmlSerializerContext extends SerializerContext 
{
                defaultNamespace = cf.getProperty(XML_defaultNamespace, 
String.class, "{juneau:'http://www.apache.org/2013/Juneau'}");
                xsNamespace = cf.getProperty(XML_xsNamespace, Namespace.class, 
new Namespace("xs", "http://www.w3.org/2001/XMLSchema";));
                namespaces = cf.getProperty(XML_namespaces, Namespace[].class, 
new Namespace[0]);
+               addBeanTypeProperties = 
cf.getProperty(XML_addBeanTypeProperties, boolean.class, 
cf.getProperty(SERIALIZER_addBeanTypeProperties, boolean.class, true));
        }
 
        @Override /* Context */
@@ -178,6 +199,7 @@ public class XmlSerializerContext extends SerializerContext 
{
                                .append("defaultNamespace", defaultNamespace)
                                .append("xsNamespace", xsNamespace)
                                .append("namespaces", namespaces)
+                               .append("addBeanTypeProperties", 
addBeanTypeProperties)
                        );
        }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java 
b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
index 5ab38d3..c806704 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
@@ -12,6 +12,7 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.xml;
 
+import static org.apache.juneau.msgpack.MsgPackSerializerContext.*;
 import static org.apache.juneau.xml.NamespaceFactory.*;
 import static org.apache.juneau.xml.XmlSerializerContext.*;
 
@@ -34,7 +35,8 @@ public class XmlSerializerSession extends SerializerSession {
        private final boolean
                autoDetectNamespaces,
                enableNamespaces,
-               addNamespaceUrlsToRoot;
+               addNamespaceUrlsToRoot,
+               addBeanTypeProperties;
 
        private Namespace
                defaultNamespace;
@@ -67,6 +69,7 @@ public class XmlSerializerSession extends SerializerSession {
                        addNamespaces(ctx.namespaces);
                        defaultNamespace = 
findDefaultNamespace(ctx.defaultNamespace);
                        xsNamespace = ctx.xsNamespace;
+                       addBeanTypeProperties = ctx.addBeanTypeProperties;
                } else {
                        enableNamespaces = op.getBoolean(XML_enableNamespaces, 
ctx.enableNamespaces);
                        autoDetectNamespaces = 
op.getBoolean(XML_autoDetectNamespaces, ctx.autoDetectNamespaces);
@@ -74,6 +77,7 @@ public class XmlSerializerSession extends SerializerSession {
                        namespaces = (op.containsKey(XML_namespaces) ? 
parseNamespaces(op.get(XML_namespaces)) : ctx.namespaces);
                        defaultNamespace = 
findDefaultNamespace(op.containsKey(XML_defaultNamespace) ? 
op.getString(XML_defaultNamespace) : ctx.defaultNamespace);
                        xsNamespace = (op.containsKey(XML_xsNamespace) ? 
parseNamespace(op.get(XML_xsNamespace)) : ctx.xsNamespace);
+                       addBeanTypeProperties = 
op.getBoolean(MSGPACK_addBeanTypeProperties, ctx.addBeanTypeProperties);
                }
        }
 
@@ -148,6 +152,16 @@ public class XmlSerializerSession extends 
SerializerSession {
        }
 
        /**
+        * Returns the {@link XmlSerializerContext#XML_addBeanTypeProperties} 
setting value for this session.
+        *
+        * @return The {@link XmlSerializerContext#XML_addBeanTypeProperties} 
setting value for this session.
+        */
+       @Override /* SerializerSession */
+       public boolean isAddBeanTypeProperties() {
+               return addBeanTypeProperties;
+       }
+
+       /**
         * Returns the {@link XmlSerializerContext#XML_defaultNamespace} 
setting value in this context.
         *
         * @return The {@link XmlSerializerContext#XML_defaultNamespace} 
setting value in this context.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/94992115/juneau-core/src/main/javadoc/overview.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/javadoc/overview.html 
b/juneau-core/src/main/javadoc/overview.html
index c2f8fb9..af45a96 100644
--- a/juneau-core/src/main/javadoc/overview.html
+++ b/juneau-core/src/main/javadoc/overview.html
@@ -5383,6 +5383,7 @@
        
        <h5 class='toc'>What's new in each release</h5>
        <ul class='toc'>
+               <li><p><a class='doclink' href='#6.1.1'>6.1.1 (TBD)</a></p>
                <li><p><a class='doclink' href='#6.1.0'>6.1.0 (TBD)</a></p>
                <li><p><a class='doclink' href='#6.0.1'>6.0.1 (Jan 3, 
2017)</a></p>
                <li><p><a class='doclink' href='#6.0.0'>6.0.0 (Oct 3, 
2016)</a></p>
@@ -5450,6 +5451,31 @@
 
 
        <!-- 
========================================================================================================
 -->
+       <a id="6.1.1"></a>
+       <h3 class='topic' onclick='toggle(this)'>6.1.1 (TBD)</h3>
+       <div class='topic'>
+               <p>
+                       Juneau 6.1.1 is ...
+               </p>
+
+               <h6 class='topic'>org.apache.juneau</h6>
+               <ul class='spaced-list'>
+                       <li>New <code>addBeanTypeProperties</code> setting 
added to serializers to override the 
+                       {@link 
org.apache.juneau.serializer.SerializerContext#SERIALIZER_addBeanTypeProperties}
 setting
+                       for individual serializers in a serializer group:
+                       <ul>
+                               <li>{@link 
org.apache.juneau.html.HtmlSerializerContext#HTML_addBeanTypeProperties}
+                               <li>{@link 
org.apache.juneau.json.JsonSerializerContext#JSON_addBeanTypeProperties}
+                               <li>{@link 
org.apache.juneau.msgpack.MsgPackSerializerContext#MSGPACK_addBeanTypeProperties}
+                               <li>{@link 
org.apache.juneau.uon.UonSerializerContext#UON_addBeanTypeProperties}
+                               <li>{@link 
org.apache.juneau.xml.XmlSerializerContext#XML_addBeanTypeProperties}
+                               <li>{@link 
org.apache.juneau.rdf.RdfSerializerContext#RDF_addBeanTypeProperties}
+                       </ul>
+               </ul>
+       </div>
+       
+       
+       <!-- 
========================================================================================================
 -->
        <a id="6.1.0"></a>
        <h3 class='topic' onclick='toggle(this)'>6.1.0 (TBD)</h3>
        <div class='topic'>


Reply via email to