This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 6d2b74f  Context API refactoring.
6d2b74f is described below

commit 6d2b74f1c1ff601b9b26aecea6e85feb6469c155
Author: JamesBognar <[email protected]>
AuthorDate: Mon Sep 27 13:30:19 2021 -0400

    Context API refactoring.
---
 .../java/org/apache/juneau/jena/RdfParser.java     |   8 +-
 .../java/org/apache/juneau/jena/RdfSerializer.java |  10 +-
 .../main/java/org/apache/juneau/jena/RdfUtils.java |  14 +-
 .../java/org/apache/juneau/ContextBuilder.java     |  14 ++
 .../juneau/html/HtmlDocSerializerBuilder.java      |  12 --
 .../juneau/html/HtmlSchemaSerializerBuilder.java   |  12 --
 .../apache/juneau/html/HtmlSerializerBuilder.java  |  12 --
 .../html/HtmlStrippedDocSerializerBuilder.java     |  12 --
 .../org/apache/juneau/json/JsonSerializer.java     |   5 +-
 .../juneau/soap/SoapXmlSerializerBuilder.java      |  12 --
 .../main/java/org/apache/juneau/xml/Namespace.java |  12 +-
 .../org/apache/juneau/xml/XmlParserBuilder.java    |  15 ++
 .../java/org/apache/juneau/xml/XmlSerializer.java  | 223 +++------------------
 .../apache/juneau/xml/XmlSerializerBuilder.java    | 142 +++++++++----
 .../apache/juneau/xml/XmlSerializerSession.java    |  18 +-
 .../main/java/org/apache/juneau/xml/XmlUtils.java  |  14 +-
 .../apache/juneau/xml/annotation/XmlConfig.java    |  20 +-
 .../juneau/xml/annotation/XmlConfigAnnotation.java |  14 +-
 .../examples/core/xml/XmlConfigurationExample.java |   6 +-
 .../test/java/org/apache/juneau/ComboInput.java    |  10 +-
 .../java/org/apache/juneau/ComboRoundTripTest.java |  23 ++-
 .../juneau/SerializerPropertiesComboTest.java      |   5 +-
 .../java/org/apache/juneau/dto/atom/AtomTest.java  |   2 +-
 .../test/java/org/apache/juneau/xml/XmlTest.java   |  60 +++---
 24 files changed, 277 insertions(+), 398 deletions(-)

diff --git 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
index 04e48f8..39ad615 100644
--- 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
+++ 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
@@ -47,8 +47,8 @@ import org.apache.juneau.xml.*;
 public class RdfParser extends ReaderParser implements RdfCommon, 
RdfMetaProvider {
 
        private static final Namespace
-               DEFAULT_JUNEAU_NS = Namespace.create("j", 
"http://www.apache.org/juneau/";),
-               DEFAULT_JUNEAUBP_NS = Namespace.create("jp", 
"http://www.apache.org/juneaubp/";);
+               DEFAULT_JUNEAU_NS = Namespace.of("j", 
"http://www.apache.org/juneau/";),
+               DEFAULT_JUNEAUBP_NS = Namespace.of("jp", 
"http://www.apache.org/juneaubp/";);
 
        
//-------------------------------------------------------------------------------------------------------------------
        // Configurable properties
@@ -114,8 +114,8 @@ public class RdfParser extends ReaderParser implements 
RdfCommon, RdfMetaProvide
                trimWhitespace = 
cp.getBoolean(RDF_trimWhitespace).orElse(false);
                looseCollections = 
cp.getBoolean(RDF_looseCollections).orElse(false);
                rdfLanguage = 
cp.getString(RDF_language).orElse("RDF/XML-ABBREV");
-               juneauNs = cp.getInstance(RDF_juneauNs, 
Namespace.class).orElse(DEFAULT_JUNEAU_NS);
-               juneauBpNs = cp.getInstance(RDF_juneauBpNs, 
Namespace.class).orElse(DEFAULT_JUNEAUBP_NS);
+               juneauNs = cp.getInstance(RDF_juneauNs, 
String.class).map(Namespace::of).orElse(DEFAULT_JUNEAU_NS);
+               juneauBpNs = cp.getInstance(RDF_juneauBpNs, 
String.class).map(Namespace::of).orElse(DEFAULT_JUNEAUBP_NS);
                collectionFormat = cp.get(RDF_collectionFormat, 
RdfCollectionFormat.class).orElse(RdfCollectionFormat.DEFAULT);
 
                ASortedMap<String,Object> m = ASortedMap.create();
diff --git 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
index 5d7271f..ba062c7 100644
--- 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
+++ 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
@@ -46,8 +46,8 @@ import org.apache.juneau.xml.annotation.*;
 public class RdfSerializer extends WriterSerializer implements RdfCommon, 
RdfMetaProvider {
 
        private static final Namespace
-               DEFAULT_JUNEAU_NS = Namespace.create("j", 
"http://www.apache.org/juneau/";),
-               DEFAULT_JUNEAUBP_NS = Namespace.create("jp", 
"http://www.apache.org/juneaubp/";);
+               DEFAULT_JUNEAU_NS = Namespace.of("j", 
"http://www.apache.org/juneau/";),
+               DEFAULT_JUNEAUBP_NS = Namespace.of("jp", 
"http://www.apache.org/juneaubp/";);
 
        
//-------------------------------------------------------------------------------------------------------------------
        // Configurable properties
@@ -262,10 +262,10 @@ public class RdfSerializer extends WriterSerializer 
implements RdfCommon, RdfMet
                looseCollections = 
cp.getBoolean(RDF_looseCollections).orElse(false);
                autoDetectNamespaces = ! 
cp.getBoolean(RDF_disableAutoDetectNamespaces).orElse(false);
                rdfLanguage = 
cp.getString(RDF_language).orElse("RDF/XML-ABBREV");
-               juneauNs = cp.get(RDF_juneauNs, 
Namespace.class).orElse(DEFAULT_JUNEAU_NS);
-               juneauBpNs = cp.get(RDF_juneauBpNs, 
Namespace.class).orElse(DEFAULT_JUNEAUBP_NS);
+               juneauNs = cp.get(RDF_juneauNs, 
String.class).map(Namespace::of).orElse(DEFAULT_JUNEAU_NS);
+               juneauBpNs = cp.get(RDF_juneauBpNs, 
String.class).map(Namespace::of).orElse(DEFAULT_JUNEAUBP_NS);
                collectionFormat = cp.get(RDF_collectionFormat, 
RdfCollectionFormat.class).orElse(RdfCollectionFormat.DEFAULT);
-               namespaces = cp.get(RDF_namespaces, 
Namespace[].class).orElse(new Namespace[0]);
+               namespaces = cp.get(RDF_namespaces, 
String[].class).map(Namespace::createArray).orElse(new Namespace[0]);
                addBeanTypes = cp.getFirstBoolean(RDF_addBeanTypes, 
SERIALIZER_addBeanTypes).orElse(false);
 
                ASortedMap<String,Object> m = ASortedMap.create();
diff --git 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfUtils.java
 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfUtils.java
index cd59930..c5576c6 100644
--- 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfUtils.java
+++ 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfUtils.java
@@ -54,20 +54,20 @@ public class RdfUtils {
 
                // If both prefix and namespace specified, use that Namespace 
mapping.
                if (! (prefix.isEmpty() || ns.isEmpty()))
-                       return Namespace.create(prefix, ns);
+                       return Namespace.of(prefix, ns);
 
                // If only prefix specified, need to search for namespaceURI.
                if (! prefix.isEmpty()) {
                        if (rdfs != null)
                                for (Rdf rdf2 : rdfs)
                                        if (rdf2.prefix().equals(prefix) && ! 
rdf2.namespace().isEmpty())
-                                               return Namespace.create(prefix, 
rdf2.namespace());
+                                               return Namespace.of(prefix, 
rdf2.namespace());
                        for (RdfSchema schema : schemas) {
                                if (schema.prefix().equals(prefix) && ! 
schema.namespace().isEmpty())
-                                       return Namespace.create(prefix, 
schema.namespace());
+                                       return Namespace.of(prefix, 
schema.namespace());
                                for (RdfNs rdfNs : schema.rdfNs())
                                        if (rdfNs.prefix().equals(prefix))
-                                               return Namespace.create(prefix, 
rdfNs.namespaceURI());
+                                               return Namespace.of(prefix, 
rdfNs.namespaceURI());
                        }
                        throw new BeanRuntimeException("Found @Rdf.prefix 
annotation with no matching URI.  prefix='"+prefix+"'");
                }
@@ -77,13 +77,13 @@ public class RdfUtils {
                        if (rdfs != null)
                                for (Rdf rdf2 : rdfs)
                                        if (rdf2.namespace().equals(ns) && ! 
rdf2.prefix().isEmpty())
-                                               return 
Namespace.create(rdf2.prefix(), ns);
+                                               return 
Namespace.of(rdf2.prefix(), ns);
                        for (RdfSchema schema : schemas) {
                                if (schema.namespace().equals(ns) && ! 
schema.prefix().isEmpty())
-                                       return 
Namespace.create(schema.prefix(), ns);
+                                       return Namespace.of(schema.prefix(), 
ns);
                                for (RdfNs rdfNs : schema.rdfNs())
                                        if (rdfNs.namespaceURI().equals(ns))
-                                               return 
Namespace.create(rdfNs.prefix(), ns);
+                                               return 
Namespace.of(rdfNs.prefix(), ns);
                        }
                }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
index a9aa9ff..9074b87 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
@@ -132,6 +132,20 @@ public abstract class ContextBuilder {
        }
 
        /**
+        * Apply a consumer to this builder.
+        *
+        * @param subtype The builder subtype that this consumer can be applied 
to.
+        * @param consumer The consumer.
+        * @return This object.
+        */
+       @SuppressWarnings("unchecked")
+       public <T extends ContextBuilder> ContextBuilder apply(Class<T> 
subtype, Consumer<T> consumer) {
+               if (subtype.isInstance(this))
+                       consumer.accept((T)this);
+               return this;
+       }
+
+       /**
         * Associates a context class with this builder.
         *
         * @param value The context class that this builder should create.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerBuilder.java
index 8cfd10f..02cc9d9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerBuilder.java
@@ -1286,12 +1286,6 @@ public class HtmlDocSerializerBuilder extends 
HtmlStrippedDocSerializerBuilder {
        }
 
        @Override /* GENERATED - XmlSerializerBuilder */
-       public HtmlDocSerializerBuilder defaultNamespace(String value) {
-               super.defaultNamespace(value);
-               return this;
-       }
-
-       @Override /* GENERATED - XmlSerializerBuilder */
        public HtmlDocSerializerBuilder disableAutoDetectNamespaces() {
                super.disableAutoDetectNamespaces();
                return this;
@@ -1304,12 +1298,6 @@ public class HtmlDocSerializerBuilder extends 
HtmlStrippedDocSerializerBuilder {
        }
 
        @Override /* GENERATED - XmlSerializerBuilder */
-       public HtmlDocSerializerBuilder namespaces(String...values) {
-               super.namespaces(values);
-               return this;
-       }
-
-       @Override /* GENERATED - XmlSerializerBuilder */
        public HtmlDocSerializerBuilder namespaces(Namespace...values) {
                super.namespaces(values);
                return this;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
index 8f713f9..e1ab4b3 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
@@ -829,12 +829,6 @@ public class HtmlSchemaSerializerBuilder extends 
HtmlSerializerBuilder {
        }
 
        @Override /* GENERATED - XmlSerializerBuilder */
-       public HtmlSchemaSerializerBuilder defaultNamespace(String value) {
-               super.defaultNamespace(value);
-               return this;
-       }
-
-       @Override /* GENERATED - XmlSerializerBuilder */
        public HtmlSchemaSerializerBuilder disableAutoDetectNamespaces() {
                super.disableAutoDetectNamespaces();
                return this;
@@ -847,12 +841,6 @@ public class HtmlSchemaSerializerBuilder extends 
HtmlSerializerBuilder {
        }
 
        @Override /* GENERATED - XmlSerializerBuilder */
-       public HtmlSchemaSerializerBuilder namespaces(String...values) {
-               super.namespaces(values);
-               return this;
-       }
-
-       @Override /* GENERATED - XmlSerializerBuilder */
        public HtmlSchemaSerializerBuilder namespaces(Namespace...values) {
                super.namespaces(values);
                return this;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
index 3ca9b39..68133b9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
@@ -1117,12 +1117,6 @@ public class HtmlSerializerBuilder extends 
XmlSerializerBuilder {
        }
 
        @Override /* GENERATED - XmlSerializerBuilder */
-       public HtmlSerializerBuilder defaultNamespace(String value) {
-               super.defaultNamespace(value);
-               return this;
-       }
-
-       @Override /* GENERATED - XmlSerializerBuilder */
        public HtmlSerializerBuilder disableAutoDetectNamespaces() {
                super.disableAutoDetectNamespaces();
                return this;
@@ -1135,12 +1129,6 @@ public class HtmlSerializerBuilder extends 
XmlSerializerBuilder {
        }
 
        @Override /* GENERATED - XmlSerializerBuilder */
-       public HtmlSerializerBuilder namespaces(String...values) {
-               super.namespaces(values);
-               return this;
-       }
-
-       @Override /* GENERATED - XmlSerializerBuilder */
        public HtmlSerializerBuilder namespaces(Namespace...values) {
                super.namespaces(values);
                return this;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializerBuilder.java
index 63d4008..0286eec 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializerBuilder.java
@@ -649,12 +649,6 @@ public class HtmlStrippedDocSerializerBuilder extends 
HtmlSerializerBuilder {
        }
 
        @Override /* GENERATED - XmlSerializerBuilder */
-       public HtmlStrippedDocSerializerBuilder defaultNamespace(String value) {
-               super.defaultNamespace(value);
-               return this;
-       }
-
-       @Override /* GENERATED - XmlSerializerBuilder */
        public HtmlStrippedDocSerializerBuilder disableAutoDetectNamespaces() {
                super.disableAutoDetectNamespaces();
                return this;
@@ -667,12 +661,6 @@ public class HtmlStrippedDocSerializerBuilder extends 
HtmlSerializerBuilder {
        }
 
        @Override /* GENERATED - XmlSerializerBuilder */
-       public HtmlStrippedDocSerializerBuilder namespaces(String...values) {
-               super.namespaces(values);
-               return this;
-       }
-
-       @Override /* GENERATED - XmlSerializerBuilder */
        public HtmlStrippedDocSerializerBuilder namespaces(Namespace...values) {
                super.namespaces(values);
                return this;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
index 2cd0f18..16c5630 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
@@ -142,6 +142,7 @@ public class JsonSerializer extends WriterSerializer 
implements JsonMetaProvider
 
        final boolean addBeanTypesJson, escapeSolidus, simpleMode;
 
+       private final boolean addBeanTypes;
        private final Map<ClassMeta<?>,JsonClassMeta> jsonClassMetas = new 
ConcurrentHashMap<>();
        private final Map<BeanPropertyMeta,JsonBeanPropertyMeta> 
jsonBeanPropertyMetas = new ConcurrentHashMap<>();
 
@@ -157,6 +158,8 @@ public class JsonSerializer extends WriterSerializer 
implements JsonMetaProvider
                addBeanTypesJson = builder.addBeanTypesJson;
                simpleMode = builder.simpleMode;
                escapeSolidus = builder.escapeSolidus;
+
+               addBeanTypes = addBeanTypesJson || super.isAddBeanTypes();
        }
 
        @Override /* Context */
@@ -245,7 +248,7 @@ public class JsonSerializer extends WriterSerializer 
implements JsonMetaProvider
         */
        @Override
        protected final boolean isAddBeanTypes() {
-               return addBeanTypesJson || super.isAddBeanTypes();
+               return addBeanTypes;
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
index e3c1c14..ce77217 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
@@ -680,12 +680,6 @@ public class SoapXmlSerializerBuilder extends 
XmlSerializerBuilder {
        }
 
        @Override /* GENERATED - XmlSerializerBuilder */
-       public SoapXmlSerializerBuilder defaultNamespace(String value) {
-               super.defaultNamespace(value);
-               return this;
-       }
-
-       @Override /* GENERATED - XmlSerializerBuilder */
        public SoapXmlSerializerBuilder disableAutoDetectNamespaces() {
                super.disableAutoDetectNamespaces();
                return this;
@@ -698,12 +692,6 @@ public class SoapXmlSerializerBuilder extends 
XmlSerializerBuilder {
        }
 
        @Override /* GENERATED - XmlSerializerBuilder */
-       public SoapXmlSerializerBuilder namespaces(String...values) {
-               super.namespaces(values);
-               return this;
-       }
-
-       @Override /* GENERATED - XmlSerializerBuilder */
        public SoapXmlSerializerBuilder namespaces(Namespace...values) {
                super.namespaces(values);
                return this;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/Namespace.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/Namespace.java
index 90bce08..740e4c7 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/Namespace.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/Namespace.java
@@ -44,7 +44,7 @@ public final class Namespace {
         * @param uri The namespace URI.  See {@link Namespace#getUri()}.
         * @return The namespace object.
         */
-       public static Namespace create(String name, String uri) {
+       public static Namespace of(String name, String uri) {
                String key = name + ":" + uri;
                Namespace n = CACHE.get(key);
                if (n == null) {
@@ -61,16 +61,16 @@ public final class Namespace {
         * @param key The key/pair string.
         * @return The namespace object.
         */
-       public static Namespace create(String key) {
+       public static Namespace of(String key) {
                Namespace n = CACHE.get(key);
                if (n != null)
                        return n;
                int i = key.indexOf(':');
                if (i == -1)
-                       return create(key, null);
+                       return of(key, null);
                if (key.startsWith("http://";) || key.startsWith("https://";))
-                       return create(null, key);
-               return create(key.substring(0, i).trim(), 
key.substring(i+1).trim());
+                       return of(null, key);
+               return of(key.substring(0, i).trim(), 
key.substring(i+1).trim());
        }
 
        /**
@@ -92,7 +92,7 @@ public final class Namespace {
                if (o instanceof Namespace)
                        return (Namespace)o;
                if (o instanceof CharSequence)
-                       return create(o.toString());
+                       return of(o.toString());
                throw runtimeException("Invalid object type passed to 
Namespace.create(Object):  ''{0}''", className(o));
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserBuilder.java
index 1f1c0c0..9f02106 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserBuilder.java
@@ -45,6 +45,11 @@ public class XmlParserBuilder extends ReaderParserBuilder {
                super();
                consumes("text/xml,application/xml");
                type(XmlParser.class);
+               preserveRootElement = env("XmlParser.preserveRootElement", 
false);
+               validating = env("XmlParser.validating", false);
+               eventAllocator = null;
+               reporter = null;
+               resolver = null;
        }
 
        /**
@@ -54,6 +59,11 @@ public class XmlParserBuilder extends ReaderParserBuilder {
         */
        protected XmlParserBuilder(XmlParser copyFrom) {
                super(copyFrom);
+               preserveRootElement = copyFrom.preserveRootElement;
+               validating = copyFrom.validating;
+               eventAllocator = copyFrom.eventAllocator;
+               reporter = copyFrom.reporter;
+               resolver = copyFrom.resolver;
        }
 
        /**
@@ -63,6 +73,11 @@ public class XmlParserBuilder extends ReaderParserBuilder {
         */
        protected XmlParserBuilder(XmlParserBuilder copyFrom) {
                super(copyFrom);
+               preserveRootElement = copyFrom.preserveRootElement;
+               validating = copyFrom.validating;
+               eventAllocator = copyFrom.eventAllocator;
+               reporter = copyFrom.reporter;
+               resolver = copyFrom.resolver;
        }
 
        @Override /* ContextBuilder */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializer.java
index 69df583..3ff439a 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializer.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.xml;
 
+import static java.util.Optional.*;
+
 import java.util.*;
 import java.util.concurrent.*;
 
@@ -119,181 +121,7 @@ import org.apache.juneau.serializer.*;
 public class XmlSerializer extends WriterSerializer implements XmlMetaProvider 
{
 
        
//-------------------------------------------------------------------------------------------------------------------
-       // Configurable properties
-       
//-------------------------------------------------------------------------------------------------------------------
-
-       static final String PREFIX = "XmlSerializer";
-
-       /**
-        * Configuration property:  Add <js>"_type"</js> properties when needed.
-        *
-        * <p>
-        * If <jk>true</jk>, then <js>"_type"</js> properties will be added to 
beans if their type cannot be inferred
-        * through reflection.
-        *
-        * <p>
-        * When present, this value overrides the {@link 
#SERIALIZER_addBeanTypes} setting and is
-        * provided to customize the behavior of specific serializers in a 
{@link SerializerGroup}.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.xml.XmlSerializer#XML_addBeanTypes XML_addBeanTypes}
-        *      <li><b>Name:</b>  <js>"XmlSerializer.addBeanTypes.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  <c>XmlSerializer.addBeanTypes</c>
-        *      <li><b>Environment variable:</b>  
<c>XMLSERIALIZER_ADDBEANTYPES</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.xml.annotation.XmlConfig#addBeanTypes()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.xml.XmlSerializerBuilder#addBeanTypes()}
-        *              </ul>
-        * </ul>
-        */
-       public static final String XML_addBeanTypes = PREFIX + 
".addBeanTypes.b";
-
-       /**
-        * Configuration property:  Add namespace URLs to the root element.
-        *
-        * <p>
-        * Use this setting to add {@code xmlns:x} attributes to the root 
element for the default and all mapped namespaces.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.xml.XmlSerializer#XML_addNamespaceUrisToRoot 
XML_addNamespaceUrisToRoot}
-        *      <li><b>Name:</b>  
<js>"XmlSerializer.addNamespaceUrisToRoot.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  
<c>XmlSerializer.addNamespaceUrisToRoot</c>
-        *      <li><b>Environment variable:</b>  
<c>XMLSERIALIZER_ADDNAMESPACEURISTOROOT</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.xml.annotation.XmlConfig#addNamespaceUrisToRoot()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.xml.XmlSerializerBuilder#addNamespaceUrisToRoot()}
-        *              </ul>
-        * </ul>
-        */
-       public static final String XML_addNamespaceUrisToRoot = PREFIX + 
".addNamespaceUrisToRoot.b";
-
-       /**
-        * Configuration property:  Default namespace.
-        *
-        * <p>
-        * Specifies the default namespace URI for this document.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.xml.XmlSerializer#XML_defaultNamespace XML_defaultNamespace}
-        *      <li><b>Name:</b>  <js>"XmlSerializer.defaultNamespace.s"</js>
-        *      <li><b>Data type:</b>  {@link org.apache.juneau.xml.Namespace}
-        *      <li><b>System property:</b>  
<c>XmlSerializer.defaultNamespace</c>
-        *      <li><b>Environment variable:</b>  
<c>XMLSERIALIZER_DEFAULTNAMESPACE</c>
-        *      <li><b>Default:</b>  <js>"juneau: 
http://www.apache.org/2013/Juneau";</js>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.xml.annotation.XmlConfig#defaultNamespace()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.xml.XmlSerializerBuilder#defaultNamespace(String)}
-        *              </ul>
-        * </ul>
-        */
-       public static final String XML_defaultNamespace = PREFIX + 
".defaultNamespace.s";
-
-       /**
-        * Configuration property:  Don't auto-detect namespace usage.
-        *
-        * <p>
-        * Don't detect namespace usage before serialization.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.xml.XmlSerializer#XML_disableAutoDetectNamespaces 
XML_disableAutoDetectNamespaces}
-        *      <li><b>Name:</b>  
<js>"XmlSerializer.disableAutoDetectNamespaces.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  
<c>XmlSerializer.disableAutoDetectNamespaces</c>
-        *      <li><b>Environment variable:</b>  
<c>XMLSERIALIZER_DONTAUTODETECTNAMESPACES</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.xml.annotation.XmlConfig#disableAutoDetectNamespaces()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.xml.XmlSerializerBuilder#disableAutoDetectNamespaces()}
-        *              </ul>
-        * </ul>
-        */
-       public static final String XML_disableAutoDetectNamespaces = PREFIX + 
".disableAutoDetectNamespaces.b";
-
-       /**
-        * Configuration property:  Enable support for XML namespaces.
-        *
-        * <p>
-        * If not enabled, XML output will not contain any namespaces 
regardless of any other settings.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.xml.XmlSerializer#XML_enableNamespaces XML_enableNamespaces}
-        *      <li><b>Name:</b>  <js>"XmlSerializer.enableNamespaces.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  
<c>XmlSerializer.enableNamespaces</c>
-        *      <li><b>Environment variable:</b>  
<c>XMLSERIALIZER_ENABLENAMESPACES</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.xml.annotation.XmlConfig#enableNamespaces()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.xml.XmlSerializerBuilder#enableNamespaces()}
-        *                      <li class='jm'>{@link 
org.apache.juneau.xml.XmlSerializerBuilder#ns()}
-        *              </ul>
-        * </ul>
-        */
-       public static final String XML_enableNamespaces = PREFIX + 
".enableNamespaces.b";
-
-       /**
-        * Configuration property:  Default namespaces.
-        *
-        * <p>
-        * The default list of namespaces associated with this serializer.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.xml.XmlSerializer#XML_namespaces XML_namespaces}
-        *      <li><b>Name:</b>  <js>"XmlSerializer.namespaces.ls"</js>
-        *      <li><b>Data type:</b>  <c>Set&lt;{@link 
org.apache.juneau.xml.Namespace}&gt;</c>
-        *      <li><b>System property:</b>  <c>XmlSerializer.namespaces</c>
-        *      <li><b>Environment variable:</b>  
<c>XMLSERIALIZER_NAMESPACES</c>
-        *      <li><b>Default:</b>  empty set
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.xml.annotation.XmlConfig#defaultNamespace()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.xml.XmlSerializerBuilder#defaultNamespace(String)}
-        *              </ul>
-        * </ul>
-        */
-       public static final String XML_namespaces = PREFIX + ".namespaces.ls";
-
-       
//-------------------------------------------------------------------------------------------------------------------
-       // Predefined instances
+       // c
        
//-------------------------------------------------------------------------------------------------------------------
 
        /** Default serializer without namespaces. */
@@ -314,9 +142,8 @@ public class XmlSerializer extends WriterSerializer 
implements XmlMetaProvider {
        /** Default serializer, single quotes, whitespace added. */
        public static final XmlSerializer DEFAULT_NS_SQ_READABLE = new 
NsSqReadable(create());
 
-
        
//-------------------------------------------------------------------------------------------------------------------
-       // Predefined subclasses
+       // Static subclasses
        
//-------------------------------------------------------------------------------------------------------------------
 
        /** Default serializer, single quotes. */
@@ -386,20 +213,23 @@ public class XmlSerializer extends WriterSerializer 
implements XmlMetaProvider {
 
        @SuppressWarnings("javadoc")
        protected static final Namespace
-               DEFAULT_JUNEAU_NAMESPACE = Namespace.create("juneau", 
"http://www.apache.org/2013/Juneau";),
-               DEFAULT_XS_NAMESPACE = Namespace.create("xs", 
"http://www.w3.org/2001/XMLSchema";);
+               DEFAULT_JUNEAU_NAMESPACE = Namespace.of("juneau", 
"http://www.apache.org/2013/Juneau";),
+               DEFAULT_XS_NAMESPACE = Namespace.of("xs", 
"http://www.w3.org/2001/XMLSchema";);
 
        
//-------------------------------------------------------------------------------------------------------------------
        // Instance
        
//-------------------------------------------------------------------------------------------------------------------
 
-       private final boolean
+       final boolean
                autoDetectNamespaces,
                enableNamespaces,
                addNamespaceUrlsToRoot,
-               addBeanTypes;
-       private final Namespace defaultNamespace;
-       private final Namespace[] namespaces;
+               addBeanTypesXml;
+
+       final Namespace defaultNamespace;
+       final Namespace[] namespaces;
+
+       private final boolean addBeanTypes;
        private final Map<ClassMeta<?>,XmlClassMeta> xmlClassMetas = new 
ConcurrentHashMap<>();
        private final Map<BeanMeta<?>,XmlBeanMeta> xmlBeanMetas = new 
ConcurrentHashMap<>();
        private final Map<BeanPropertyMeta,XmlBeanPropertyMeta> 
xmlBeanPropertyMetas = new ConcurrentHashMap<>();
@@ -412,13 +242,14 @@ public class XmlSerializer extends WriterSerializer 
implements XmlMetaProvider {
         */
        protected XmlSerializer(XmlSerializerBuilder builder) {
                super(builder);
-               ContextProperties cp = getContextProperties();
-               autoDetectNamespaces = ! 
cp.getBoolean(XML_disableAutoDetectNamespaces).orElse(false);
-               enableNamespaces = 
cp.getBoolean(XML_enableNamespaces).orElse(false);
-               addNamespaceUrlsToRoot = 
cp.getBoolean(XML_addNamespaceUrisToRoot).orElse(false);
-               defaultNamespace = cp.getInstance(XML_defaultNamespace, 
Namespace.class).orElse(DEFAULT_JUNEAU_NAMESPACE);
-               addBeanTypes = cp.getFirstBoolean(XML_addBeanTypes, 
SERIALIZER_addBeanTypes).orElse(false);
-               namespaces = cp.getInstanceArray(XML_namespaces, 
Namespace.class).orElse(new Namespace[0]);
+               autoDetectNamespaces = ! builder.disableAutoDetectNamespaces;
+               enableNamespaces = builder.enableNamespaces;
+               addNamespaceUrlsToRoot = builder.addNamespaceUrisToRoot;
+               addBeanTypesXml = builder.addBeanTypesXml;
+               defaultNamespace = 
ofNullable(builder.defaultNamespace).orElse(DEFAULT_JUNEAU_NAMESPACE);
+               namespaces = ofNullable(builder.namespaces).map(x -> 
x.toArray(new Namespace[0])).orElse(new Namespace[0]);
+
+               addBeanTypes = addBeanTypesXml || super.isAddBeanTypes();
        }
 
        @Override /* Context */
@@ -493,7 +324,7 @@ public class XmlSerializer extends WriterSerializer 
implements XmlMetaProvider {
        /**
         * Add <js>"_type"</js> properties when needed.
         *
-        * @see #XML_addBeanTypes
+        * @see XmlSerializerBuilder#addBeanTypesXml()
         * @return
         *      <jk>true</jk> if<js>"_type"</js> properties will be added to 
beans if their type cannot be inferred
         *      through reflection.
@@ -506,7 +337,7 @@ public class XmlSerializer extends WriterSerializer 
implements XmlMetaProvider {
        /**
         * Add namespace URLs to the root element.
         *
-        * @see #XML_addNamespaceUrisToRoot
+        * @see XmlSerializerBuilder#addNamespaceUrisToRoot()
         * @return
         *      <jk>true</jk> if {@code xmlns:x} attributes are added to the 
root element for the default and all mapped namespaces.
         */
@@ -517,7 +348,7 @@ public class XmlSerializer extends WriterSerializer 
implements XmlMetaProvider {
        /**
         * Auto-detect namespace usage.
         *
-        * @see #XML_disableAutoDetectNamespaces
+        * @see XmlSerializerBuilder#disableAutoDetectNamespaces()
         * @return
         *      <jk>true</jk> if namespace usage is detected before 
serialization.
         */
@@ -528,7 +359,7 @@ public class XmlSerializer extends WriterSerializer 
implements XmlMetaProvider {
        /**
         * Default namespace.
         *
-        * @see #XML_defaultNamespace
+        * @see XmlSerializerBuilder#defaultNamespace(Namespace)
         * @return
         *      The default namespace URI for this document.
         */
@@ -539,7 +370,7 @@ public class XmlSerializer extends WriterSerializer 
implements XmlMetaProvider {
        /**
         * Enable support for XML namespaces.
         *
-        * @see #XML_enableNamespaces
+        * @see XmlSerializerBuilder#enableNamespaces()
         * @return
         *      <jk>false</jk> if XML output will not contain any namespaces 
regardless of any other settings.
         */
@@ -550,7 +381,7 @@ public class XmlSerializer extends WriterSerializer 
implements XmlMetaProvider {
        /**
         * Default namespaces.
         *
-        * @see #XML_namespaces
+        * @see XmlSerializerBuilder#namespaces(Namespace...)
         * @return
         *      The default list of namespaces associated with this serializer.
         */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
index b0a0de7..7d05a14 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
@@ -12,14 +12,13 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.xml;
 
-import static org.apache.juneau.xml.XmlSerializer.*;
-
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
 import java.util.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.collections.*;
 import org.apache.juneau.http.header.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.serializer.*;
@@ -31,6 +30,10 @@ import org.apache.juneau.serializer.*;
 @FluentSetters
 public class XmlSerializerBuilder extends WriterSerializerBuilder {
 
+       boolean addBeanTypesXml, addNamespaceUrisToRoot, 
disableAutoDetectNamespaces, enableNamespaces;
+       Namespace defaultNamespace;
+       List<Namespace> namespaces;
+
        /**
         * Constructor, default settings.
         */
@@ -38,6 +41,13 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
                super();
                produces("text/xml");
                type(XmlSerializer.class);
+               addBeanTypesXml = env("XmlSerializer.addBeanTypes", false);
+               addNamespaceUrisToRoot = 
env("XmlSerializer.addNamespaceUrisToRoot", false);
+               disableAutoDetectNamespaces = 
env("XmlSerializer.disableAutoDetectNamespaces", false);
+               enableNamespaces = env("XmlSerializer.enableNamespaces", false);
+               defaultNamespace = null;
+               namespaces = null;
+
        }
 
        /**
@@ -47,6 +57,12 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
         */
        protected XmlSerializerBuilder(XmlSerializer copyFrom) {
                super(copyFrom);
+               addBeanTypesXml = copyFrom.addBeanTypesXml;
+               addNamespaceUrisToRoot = copyFrom.addNamespaceUrlsToRoot;
+               disableAutoDetectNamespaces = ! copyFrom.autoDetectNamespaces;
+               enableNamespaces = copyFrom.enableNamespaces;
+               defaultNamespace = copyFrom.defaultNamespace;
+               namespaces = copyFrom.namespaces.length == 0 ? null : 
AList.of(copyFrom.namespaces);
        }
 
        /**
@@ -56,6 +72,12 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
         */
        protected XmlSerializerBuilder(XmlSerializerBuilder copyFrom) {
                super(copyFrom);
+               addBeanTypesXml = copyFrom.addBeanTypesXml;
+               addNamespaceUrisToRoot = copyFrom.addNamespaceUrisToRoot;
+               disableAutoDetectNamespaces = 
copyFrom.disableAutoDetectNamespaces;
+               enableNamespaces = copyFrom.enableNamespaces;
+               defaultNamespace = copyFrom.defaultNamespace;
+               namespaces = copyFrom.namespaces == null ? null : 
AList.of(copyFrom.namespaces);
        }
 
        @Override /* ContextBuilder */
@@ -73,6 +95,36 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
        
//-----------------------------------------------------------------------------------------------------------------
 
        /**
+        * Add <js>"_type"</js> properties when needed.
+        *
+        * <p>
+        * If <jk>true</jk>, then <js>"_type"</js> properties will be added to 
beans if their type cannot be inferred
+        * through reflection.
+        *
+        * <p>
+        * When present, this value overrides the {@link 
SerializerBuilder#addBeanTypes()} setting and is
+        * provided to customize the behavior of specific serializers in a 
{@link SerializerGroup}.
+        *
+        * @return This object.
+        */
+       @FluentSetter
+       public XmlSerializerBuilder addBeanTypesXml() {
+               return addBeanTypesXml(true);
+       }
+
+       /**
+        * Same as {@link #addBeanTypesXml()} but allows you to explicitly 
specify the value.
+        *
+        * @param value The value for this setting.
+        * @return This object.
+        */
+       @FluentSetter
+       public XmlSerializerBuilder addBeanTypesXml(boolean value) {
+               addBeanTypesXml = value;
+               return this;
+       }
+
+       /**
         * Add namespace URLs to the root element.
         *
         * <p>
@@ -82,7 +134,6 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
         * This setting is ignored if {@link #enableNamespaces()} is not 
enabled.
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link XmlSerializer#XML_addNamespaceUrisToRoot}
         *      <li class='link'>{@doc XmlNamespaces}
         * </ul>
         *
@@ -90,7 +141,19 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
         */
        @FluentSetter
        public XmlSerializerBuilder addNamespaceUrisToRoot() {
-               return set(XML_addNamespaceUrisToRoot);
+               return addNamespaceUrisToRoot(true);
+       }
+
+       /**
+        * Same as {@link #addNamespaceUrisToRoot()} but allows you to 
explicitly specify the value.
+        *
+        * @param value The value for this setting.
+        * @return This object.
+        */
+       @FluentSetter
+       public XmlSerializerBuilder addNamespaceUrisToRoot(boolean value) {
+               addNamespaceUrisToRoot = value;
+               return this;
        }
 
        /**
@@ -100,7 +163,7 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
         * Don't detect namespace usage before serialization.
         *
         * <p>
-        * Used in conjunction with {@link #XML_addNamespaceUrisToRoot} to 
reduce the list of namespace URLs appended to the
+        * Used in conjunction with {@link 
XmlSerializerBuilder#addNamespaceUrisToRoot()} to reduce the list of namespace 
URLs appended to the
         * root element to only those that will be used in the resulting 
document.
         *
         * <p>
@@ -108,17 +171,16 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
         * the root element is serialized.
         *
         * <p>
-        * This setting is ignored if {@link #XML_enableNamespaces} is not 
enabled.
+        * This setting is ignored if {@link 
XmlSerializerBuilder#enableNamespaces()} is not enabled.
         *
         * <ul class='notes'>
         *      <li>
         *              Auto-detection of namespaces can be costly 
performance-wise.
         *              <br>In high-performance environments, it's recommended 
that namespace detection be
-        *              disabled, and that namespaces be manually defined 
through the {@link #XML_namespaces} property.
+        *              disabled, and that namespaces be manually defined 
through the {@link XmlSerializerBuilder#namespaces(Namespace...)} property.
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link 
XmlSerializer#XML_disableAutoDetectNamespaces}
         *      <li class='link'>{@doc XmlNamespaces}
         * </ul>
         *
@@ -126,7 +188,19 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
         */
        @FluentSetter
        public XmlSerializerBuilder disableAutoDetectNamespaces() {
-               return set(XML_disableAutoDetectNamespaces);
+               return disableAutoDetectNamespaces(true);
+       }
+
+       /**
+        * Same as {@link #disableAutoDetectNamespaces()} but allows you to 
explicitly specify the value.
+        *
+        * @param value The value for this setting.
+        * @return This object.
+        */
+       @FluentSetter
+       public XmlSerializerBuilder disableAutoDetectNamespaces(boolean value) {
+               disableAutoDetectNamespaces = value;
+               return this;
        }
 
        /**
@@ -136,7 +210,6 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
         * Specifies the default namespace URI for this document.
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link XmlSerializer#XML_defaultNamespace}
         *      <li class='link'>{@doc XmlNamespaces}
         * </ul>
         *
@@ -146,8 +219,9 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public XmlSerializerBuilder defaultNamespace(String value) {
-               return set(XML_defaultNamespace, value);
+       public XmlSerializerBuilder defaultNamespace(Namespace value) {
+               defaultNamespace = value;
+               return this;
        }
 
        /**
@@ -157,7 +231,6 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
         * If not enabled, XML output will not contain any namespaces 
regardless of any other settings.
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link XmlSerializer#XML_enableNamespaces}
         *      <li class='link'>{@doc XmlNamespaces}
         * </ul>
         *
@@ -165,42 +238,32 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
         */
        @FluentSetter
        public XmlSerializerBuilder enableNamespaces() {
-               return set(XML_enableNamespaces);
+               return enableNamespaces(true);
        }
 
        /**
-        * Enable support for XML namespaces.
+        * Same as {@link #enableNamespaces()} but allows you to explicitly 
specify the value.
         *
-        * <p>
-        * Shortcut for calling <code>enableNamespaces(<jk>true</jk>)</code>.
-        *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link XmlSerializer#XML_enableNamespaces}
-        * </ul>
-        *
-        * @return This object (for method chaining).
+        * @param value The value for this setting.
+        * @return This object.
         */
        @FluentSetter
-       public XmlSerializerBuilder ns() {
-               return set(XML_enableNamespaces);
+       public XmlSerializerBuilder enableNamespaces(boolean value) {
+               enableNamespaces = value;
+               return this;
        }
 
        /**
-        * Default namespaces.
+        * Enable support for XML namespaces.
         *
         * <p>
-        * The default list of namespaces associated with this serializer.
-        *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link XmlSerializer#XML_namespaces}
-        * </ul>
+        * Shortcut for calling <code>enableNamespaces(<jk>true</jk>)</code>.
         *
-        * @param values The new value for this property.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public XmlSerializerBuilder namespaces(Namespace...values) {
-               return set(XML_namespaces, values);
+       public XmlSerializerBuilder ns() {
+               return enableNamespaces();
        }
 
        /**
@@ -209,16 +272,15 @@ public class XmlSerializerBuilder extends 
WriterSerializerBuilder {
         * <p>
         * The default list of namespaces associated with this serializer.
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link XmlSerializer#XML_namespaces}
-        * </ul>
-        *
         * @param values The new value for this property.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public XmlSerializerBuilder namespaces(String...values) {
-               return set(XML_namespaces, Namespace.createArray(values));
+       public XmlSerializerBuilder namespaces(Namespace...values) {
+               if (namespaces == null)
+                       namespaces = new ArrayList<>();
+               Collections.addAll(namespaces, values);
+               return this;
        }
 
        // <FluentSetters>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
index ebc5ff9..a8c8e87 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
@@ -14,7 +14,6 @@ package org.apache.juneau.xml;
 
 import static org.apache.juneau.internal.ArrayUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
-import static org.apache.juneau.xml.XmlSerializer.*;
 import static org.apache.juneau.xml.XmlSerializerSession.ContentResult.*;
 import static org.apache.juneau.xml.XmlSerializerSession.JsonType.*;
 import static org.apache.juneau.xml.annotation.XmlFormat.*;
@@ -60,9 +59,8 @@ public class XmlSerializerSession extends 
WriterSerializerSession {
        protected XmlSerializerSession(XmlSerializer ctx, SerializerSessionArgs 
args) {
                super(ctx, args);
                this.ctx = ctx;
-               SessionProperties sp = getSessionProperties();
-               namespaces = sp.getInstanceArray(XML_namespaces, 
Namespace.class).orElse(ctx.getNamespaces());
-               defaultNamespace = 
findDefaultNamespace(sp.getInstance(XML_defaultNamespace, 
Namespace.class).orElse(ctx.getDefaultNamespace()));
+               namespaces = ctx.getNamespaces();
+               defaultNamespace = 
findDefaultNamespace(ctx.getDefaultNamespace());
        }
 
        private Namespace findDefaultNamespace(Namespace n) {
@@ -750,7 +748,7 @@ public class XmlSerializerSession extends 
WriterSerializerSession {
        /**
         * Configuration property:  Add <js>"_type"</js> properties when needed.
         *
-        * @see XmlSerializer#XML_addBeanTypes
+        * @see XmlSerializerBuilder#addBeanTypesXml()
         * @return
         *      <jk>true</jk> if<js>"_type"</js> properties will be added to 
beans if their type cannot be inferred
         *      through reflection.
@@ -763,7 +761,7 @@ public class XmlSerializerSession extends 
WriterSerializerSession {
        /**
         * Configuration property:  Add namespace URLs to the root element.
         *
-        * @see XmlSerializer#XML_addNamespaceUrisToRoot
+        * @see XmlSerializerBuilder#addNamespaceUrisToRoot()
         * @return
         *      <jk>true</jk> if {@code xmlns:x} attributes are added to the 
root element for the default and all mapped namespaces.
         */
@@ -774,7 +772,7 @@ public class XmlSerializerSession extends 
WriterSerializerSession {
        /**
         * Configuration property:  Auto-detect namespace usage.
         *
-        * @see XmlSerializer#XML_disableAutoDetectNamespaces
+        * @see XmlSerializerBuilder#disableAutoDetectNamespaces()
         * @return
         *      <jk>true</jk> if namespace usage is detected before 
serialization.
         */
@@ -785,7 +783,7 @@ public class XmlSerializerSession extends 
WriterSerializerSession {
        /**
         * Configuration property:  Default namespace.
         *
-        * @see XmlSerializer#XML_defaultNamespace
+        * @see XmlSerializerBuilder#defaultNamespace(Namespace)
         * @return
         *      The default namespace URI for this document.
         */
@@ -796,7 +794,7 @@ public class XmlSerializerSession extends 
WriterSerializerSession {
        /**
         * Configuration property:  Enable support for XML namespaces.
         *
-        * @see XmlSerializer#XML_enableNamespaces
+        * @see XmlSerializerBuilder#enableNamespaces()
         * @return
         *      <jk>false</jk> if XML output will not contain any namespaces 
regardless of any other settings.
         */
@@ -807,7 +805,7 @@ public class XmlSerializerSession extends 
WriterSerializerSession {
        /**
         * Configuration property:  Default namespaces.
         *
-        * @see XmlSerializer#XML_namespaces
+        * @see XmlSerializerBuilder#namespaces(Namespace...)
         * @return
         *      The default list of namespaces associated with this serializer.
         */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlUtils.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlUtils.java
index 17bed61..31fb281 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlUtils.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlUtils.java
@@ -512,20 +512,20 @@ public final class XmlUtils {
 
                // If both prefix and namespace specified, use that Namespace 
mapping.
                if (! (prefix.isEmpty() || ns.isEmpty()))
-                       return Namespace.create(prefix, ns);
+                       return Namespace.of(prefix, ns);
 
                // If only prefix specified, need to search for namespaceURI.
                if (! prefix.isEmpty()) {
                        if (xmls != null)
                                for (Xml xml2 : xmls)
                                        if (xml2.prefix().equals(prefix) && ! 
xml2.namespace().isEmpty())
-                                               return Namespace.create(prefix, 
xml2.namespace());
+                                               return Namespace.of(prefix, 
xml2.namespace());
                        for (XmlSchema schema : schemas) {
                                if (schema.prefix().equals(prefix) && ! 
schema.namespace().isEmpty())
-                                       return Namespace.create(prefix, 
schema.namespace());
+                                       return Namespace.of(prefix, 
schema.namespace());
                                for (XmlNs xmlNs : schema.xmlNs())
                                        if (xmlNs.prefix().equals(prefix))
-                                               return Namespace.create(prefix, 
xmlNs.namespaceURI());
+                                               return Namespace.of(prefix, 
xmlNs.namespaceURI());
                        }
                        throw new BeanRuntimeException("Found @Xml.prefix 
annotation with no matching URI.  prefix='"+prefix+"'");
                }
@@ -535,13 +535,13 @@ public final class XmlUtils {
                        if (xmls != null)
                                for (Xml xml2 : xmls)
                                        if (xml2.namespace().equals(ns) && ! 
xml2.prefix().isEmpty())
-                                               return 
Namespace.create(xml2.prefix(), ns);
+                                               return 
Namespace.of(xml2.prefix(), ns);
                        for (XmlSchema schema : schemas) {
                                if (schema.namespace().equals(ns) && ! 
schema.prefix().isEmpty())
-                                       return 
Namespace.create(schema.prefix(), ns);
+                                       return Namespace.of(schema.prefix(), 
ns);
                                for (XmlNs xmlNs : schema.xmlNs())
                                        if (xmlNs.namespaceURI().equals(ns))
-                                               return 
Namespace.create(xmlNs.prefix(), ns);
+                                               return 
Namespace.of(xmlNs.prefix(), ns);
                        }
                }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
index fe46fdf..3a78dcc 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
@@ -172,7 +172,7 @@ public @interface XmlConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link XmlSerializer#XML_addBeanTypes}
+        *      <li class='jm'>{@link XmlSerializerBuilder#addBeanTypesXml()}
         * </ul>
         */
        String addBeanTypes() default "";
@@ -191,13 +191,13 @@ public @interface XmlConfig {
         *                      <li><js>"false"</js> (default)
         *              </ul>
         *      <li>
-        *              This setting is ignored if {@link 
XmlSerializer#XML_enableNamespaces} is not enabled.
+        *              This setting is ignored if {@link 
XmlSerializerBuilder#enableNamespaces()} is not enabled.
         *      <li>
         *              Supports {@doc DefaultVarResolver} (e.g. 
<js>"$C{myConfigVar}"</js>).
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link XmlSerializer#XML_addNamespaceUrisToRoot}
+        *      <li class='jm'>{@link 
XmlSerializerBuilder#addNamespaceUrisToRoot()}
         *      <li class='link'>{@doc XmlNamespaces}
         * </ul>
         */
@@ -210,7 +210,7 @@ public @interface XmlConfig {
         * Don't detect namespace usage before serialization.
         *
         * <p>
-        * Used in conjunction with {@link 
XmlSerializer#XML_addNamespaceUrisToRoot} to reduce the list of namespace URLs 
appended to the
+        * Used in conjunction with {@link 
XmlSerializerBuilder#addNamespaceUrisToRoot()} to reduce the list of namespace 
URLs appended to the
         * root element to only those that will be used in the resulting 
document.
         *
         * <p>
@@ -218,13 +218,13 @@ public @interface XmlConfig {
         * the root element is serialized.
         *
         * <p>
-        * This setting is ignored if {@link 
XmlSerializer#XML_enableNamespaces} is not enabled.
+        * This setting is ignored if {@link 
XmlSerializerBuilder#enableNamespaces()} is not enabled.
         *
         * <ul class='notes'>
         *      <li>
         *              Auto-detection of namespaces can be costly 
performance-wise.
         *              <br>In high-performance environments, it's recommended 
that namespace detection be
-        *              disabled, and that namespaces be manually defined 
through the {@link XmlSerializer#XML_namespaces} property.
+        *              disabled, and that namespaces be manually defined 
through the {@link XmlSerializerBuilder#namespaces(Namespace...)} property.
         *      <li>
         *              Possible values:
         *              <ul>
@@ -236,7 +236,7 @@ public @interface XmlConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link 
XmlSerializer#XML_disableAutoDetectNamespaces}
+        *      <li class='jm'>{@link 
XmlSerializerBuilder#disableAutoDetectNamespaces()}
         *      <li class='link'>{@doc XmlNamespaces}
         * </ul>
         */
@@ -254,7 +254,7 @@ public @interface XmlConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link XmlSerializer#XML_defaultNamespace}
+        *      <li class='jm'>{@link 
XmlSerializerBuilder#defaultNamespace(Namespace)}
         *      <li class='link'>{@doc XmlNamespaces}
         * </ul>
         */
@@ -278,7 +278,7 @@ public @interface XmlConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link XmlSerializer#XML_enableNamespaces}
+        *      <li class='jm'>{@link XmlSerializerBuilder#enableNamespaces()}
         *      <li class='link'>{@doc XmlNamespaces}
         * </ul>
         */
@@ -296,7 +296,7 @@ public @interface XmlConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link XmlSerializer#XML_namespaces}
+        *      <li class='jm'>{@link 
XmlSerializerBuilder#namespaces(Namespace...)}
         *      <li class='link'>{@doc XmlNamespaces}
         * </ul>
         */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfigAnnotation.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfigAnnotation.java
index a1c90df..762569e 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfigAnnotation.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfigAnnotation.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.xml.annotation;
 
-import static org.apache.juneau.xml.XmlSerializer.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.reflect.*;
 import org.apache.juneau.svl.*;
@@ -42,12 +40,12 @@ public class XmlConfigAnnotation {
                public void apply(AnnotationInfo<XmlConfig> ai, 
XmlSerializerBuilder b) {
                        XmlConfig a = ai.getAnnotation();
 
-                       bool(a.addBeanTypes()).ifPresent(x -> 
b.set(XML_addBeanTypes, x));
-                       bool(a.addNamespaceUrisToRoot()).ifPresent(x -> 
b.set(XML_addNamespaceUrisToRoot, x));
-                       bool(a.disableAutoDetectNamespaces()).ifPresent(x -> 
b.set(XML_disableAutoDetectNamespaces, x));
-                       string(a.defaultNamespace()).ifPresent(x -> 
b.set(XML_defaultNamespace, x));
-                       bool(a.enableNamespaces()).ifPresent(x -> 
b.set(XML_enableNamespaces, x));
-                       b.setIf(a.namespaces().length > 0, XML_namespaces, 
Namespace.createArray(stringList(a.namespaces())));
+                       bool(a.addBeanTypes()).ifPresent(x -> 
b.addBeanTypesXml(x));
+                       bool(a.addNamespaceUrisToRoot()).ifPresent(x -> 
b.addNamespaceUrisToRoot(x));
+                       bool(a.disableAutoDetectNamespaces()).ifPresent(x -> 
b.disableAutoDetectNamespaces(x));
+                       
string(a.defaultNamespace()).map(Namespace::create).ifPresent(x -> 
b.defaultNamespace(x));
+                       bool(a.enableNamespaces()).ifPresent(x -> 
b.enableNamespaces(x));
+                       
strings(a.namespaces()).map(Namespace::createArray).ifPresent(x -> 
b.namespaces(x));
                }
        }
 
diff --git 
a/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlConfigurationExample.java
 
b/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlConfigurationExample.java
index f646a11..985bca2 100644
--- 
a/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlConfigurationExample.java
+++ 
b/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlConfigurationExample.java
@@ -14,7 +14,7 @@ package org.apache.juneau.examples.core.xml;
 
 import org.apache.juneau.examples.core.pojo.Pojo;
 import org.apache.juneau.examples.core.pojo.PojoComplex;
-import org.apache.juneau.xml.XmlSerializer;
+import org.apache.juneau.xml.*;
 
 import java.util.HashMap;
 import java.util.List;
@@ -76,8 +76,8 @@ public class XmlConfigurationExample {
 
                //Produces
                //<object 
xmlns="http://www.pierobon.org/iis/review1.htm.html#one";><name>&lt;pojo&gt;</name><id>a</id></object>
-               String dNamsSpace = 
XmlSerializer.create().enableNamespaces().defaultNamespace("http://www.pierobon.org";
 +
-                       
"/iis/review1.htm.html#one").addNamespaceUrisToRoot().build()
+               String dNamsSpace = 
XmlSerializer.create().enableNamespaces().defaultNamespace(Namespace.create("http://www.pierobon.org";
 +
+                       
"/iis/review1.htm.html#one")).addNamespaceUrisToRoot().build()
                        .serialize(aPojo);
                // the output will have new default namespace added.
                System.out.println(dNamsSpace);
diff --git a/juneau-utest/src/test/java/org/apache/juneau/ComboInput.java 
b/juneau-utest/src/test/java/org/apache/juneau/ComboInput.java
index 4e9b851..54de083 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/ComboInput.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/ComboInput.java
@@ -18,6 +18,7 @@ import java.util.function.*;
 
 import org.apache.juneau.collections.*;
 import org.apache.juneau.internal.*;
+import org.apache.juneau.utils.*;
 
 /**
  * Represents the input to a ComboTest.
@@ -32,14 +33,19 @@ public class ComboInput<T> {
        private Predicate<String> skipTest;
        private Function<T,T> convert;
        private List<Function<T,String>> verify = AList.create();
-       List<Consumer<BeanContextBuilder>> beanContextApplies = AList.create();
        List<Class<?>> swaps = AList.create();
        final Type type;
        String json, jsonT, jsonR, xml, xmlT, xmlR, xmlNs, html, htmlT, htmlR, 
uon, uonT, uonR, urlEncoding,
                urlEncodingT, urlEncodingR, msgPack, msgPackT, rdfXml, rdfXmlT, 
rdfXmlR;
+       List<Tuple2<Class<?>,Consumer<?>>> applies = AList.create();
 
        public ComboInput<T> beanContext(Consumer<BeanContextBuilder> c) {
-               this.beanContextApplies.add(c);
+               apply(BeanContextBuilder.class, c);
+               return this;
+       }
+
+       public <T2> ComboInput<T> apply(Class<T2> t, Consumer<T2> c) {
+               applies.add(Tuple2.of(t, c));
                return this;
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTest.java
index 3a0899c..59c9da0 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTest.java
@@ -29,6 +29,7 @@ import org.apache.juneau.parser.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.uon.*;
 import org.apache.juneau.urlencoding.*;
+import org.apache.juneau.utils.*;
 import org.apache.juneau.xml.*;
 import org.junit.*;
 
@@ -61,11 +62,16 @@ public abstract class ComboRoundTripTest {
                Serializer s2 = serializerMap.get(s);
                if (s2 == null) {
                        s2 = applySettings(s);
-                       if (! (comboInput.swaps.isEmpty() && 
comboInput.beanContextApplies.isEmpty())) {
+                       if (! (comboInput.swaps.isEmpty() && 
comboInput.applies.isEmpty())) {
                                SerializerBuilder b = s2.copy();
                                
b.swaps((Class<?>[])comboInput.swaps.toArray(new Class[0]));
-                               for (Consumer<BeanContextBuilder> c : 
(List<Consumer<BeanContextBuilder>>)comboInput.beanContextApplies)
-                                       b.beanContext(c);
+                               List<Tuple2<Class<?>,Consumer<?>>> pairs = 
comboInput.applies;
+                               for (Tuple2<Class<?>,Consumer<?>> pair : pairs) 
{
+                                       if 
(pair.getA().equals(BeanContextBuilder.class))
+                                               
b.beanContext((Consumer<BeanContextBuilder>) pair.getB());
+                                       else if (pair.getA().isInstance(b))
+                                               
b.apply(SerializerBuilder.class, (Consumer<SerializerBuilder>) pair.getB());
+                               }
                                s2 = b.build();
                        }
                        serializerMap.put(s, s2);
@@ -77,11 +83,16 @@ public abstract class ComboRoundTripTest {
                Parser p2 = parserMap.get(p);
                if (p2 == null) {
                        p2 = applySettings(p);
-                       if (! (comboInput.swaps.isEmpty() && 
comboInput.beanContextApplies.isEmpty())) {
+                       if (! (comboInput.swaps.isEmpty() && 
comboInput.applies.isEmpty())) {
                                ParserBuilder b = p2.copy();
                                
b.swaps((Class<?>[])comboInput.swaps.toArray(new Class[0]));
-                               for (Consumer<BeanContextBuilder> c : 
(List<Consumer<BeanContextBuilder>>)comboInput.beanContextApplies)
-                                       b.beanContext(c);
+                               List<Tuple2<Class<?>,Consumer<?>>> pairs = 
comboInput.applies;
+                               for (Tuple2<Class<?>,Consumer<?>> pair : pairs) 
{
+                                       if 
(pair.getA().equals(BeanContextBuilder.class))
+                                               
b.beanContext((Consumer<BeanContextBuilder>) pair.getB());
+                                       else if (pair.getA().isInstance(b))
+                                               b.apply(ParserBuilder.class, 
(Consumer<ParserBuilder>) pair.getB());
+                               }
                                p2 = b.build();
                        }
                        parserMap.put(p, p2);
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
index 8a0bde1..f22f025 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
@@ -14,11 +14,11 @@ package org.apache.juneau;
 
 import static org.apache.juneau.serializer.Serializer.*;
 import static org.apache.juneau.serializer.WriterSerializer.*;
-import static org.apache.juneau.xml.XmlSerializer.*;
 import java.util.*;
 
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.collections.*;
+import org.apache.juneau.xml.*;
 import org.junit.runner.*;
 import org.junit.runners.*;
 
@@ -382,7 +382,8 @@ public class SerializerPropertiesComboTest extends 
ComboRoundTripTest {
                                
.rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:_type>T11</jp:_type>\n<jp:f>\n<rdf:Seq>\n<rdf:li
 
rdf:parseType='Resource'>\n<jp:f>\n<rdf:Seq>\n<rdf:li>_x0020_foo_x0020_</rdf:li>\n</rdf:Seq>\n</jp:f>\n</rdf:li>\n</rdf:Seq>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
                                
.rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:t>T11</jp:t>\n<jp:f>\n<rdf:Seq>\n<rdf:li
 
rdf:parseType='Resource'>\n<jp:f>\n<rdf:Seq>\n<rdf:li>_x0020_foo_x0020_</rdf:li>\n</rdf:Seq>\n</jp:f>\n</rdf:li>\n</rdf:Seq>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
                                .rdfXmlR("<rdf:RDF>\n  <rdf:Description>\n    
<jp:_type>T11</jp:_type>\n    <jp:f>\n      <rdf:Seq>\n        <rdf:li 
rdf:parseType='Resource'>\n          <jp:f>\n            <rdf:Seq>\n            
  <rdf:li>_x0020_foo_x0020_</rdf:li>\n            </rdf:Seq>\n          
</jp:f>\n        </rdf:li>\n      </rdf:Seq>\n    </jp:f>\n  
</rdf:Description>\n</rdf:RDF>\n")
-                               
.properties(OMap.of(WSERIALIZER_quoteCharOverride, '|', 
SERIALIZER_addBeanTypes, true, SERIALIZER_addRootType, true, 
XML_addNamespaceUrisToRoot, true))
+                               .apply(XmlSerializerBuilder.class, x -> 
x.addNamespaceUrisToRoot())
+                               
.properties(OMap.of(WSERIALIZER_quoteCharOverride, '|', 
SERIALIZER_addBeanTypes, true, SERIALIZER_addRootType, true))
                                .skipTest(x -> x.startsWith("parse") || 
x.startsWith("verify"))
                        },
                });
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/atom/AtomTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/dto/atom/AtomTest.java
index 835d3cd..2ff2586 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/atom/AtomTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/atom/AtomTest.java
@@ -187,7 +187,7 @@ public class AtomTest {
                        +"      <updated>2016-12-31T05:02:03Z</updated>\n"
                        +"</feed>\n";
 
-               s = 
XmlSerializer.create().sq().ws().defaultNamespace("atom").enableNamespaces().addNamespaceUrisToRoot().sortProperties().build();
+               s = 
XmlSerializer.create().sq().ws().defaultNamespace(Namespace.of("atom")).enableNamespaces().addNamespaceUrisToRoot().sortProperties().build();
                r = s.serialize(f);
                assertEquals(expected, r);
                f2 = p.parse(r, Feed.class);
diff --git a/juneau-utest/src/test/java/org/apache/juneau/xml/XmlTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/xml/XmlTest.java
index a6d6725..c52d827 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/xml/XmlTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/xml/XmlTest.java
@@ -138,7 +138,7 @@ public class XmlTest {
                OMap m = (OMap) JsonParser.DEFAULT.parse(json1, Object.class);
                String r = XmlSerializer.create().ns().sq().ws()
                        .addNamespaceUrisToRoot()
-                       .defaultNamespace("http://www.apache.org";)
+                       .defaultNamespace(Namespace.of("http://www.apache.org";))
                        .keepNullProperties()
                        .build()
                        .serialize(m);
@@ -541,9 +541,9 @@ public class XmlTest {
 
                // Manually set namespaces
                s.namespaces(
-                       Namespace.create("foo","http://foo";),
-                       Namespace.create("bar","http://bar";),
-                       Namespace.create("baz","http://baz";)
+                       Namespace.of("foo","http://foo";),
+                       Namespace.of("bar","http://bar";),
+                       Namespace.of("baz","http://baz";)
                );
                r = s.build().serialize(t);
                assertEquals("<object xmlns='http://www.apache.org/2013/Juneau' 
xmlns:foo='http://foo' xmlns:bar='http://bar' 
xmlns:baz='http://baz'><foo:f1>1</foo:f1><bar:f2>2</bar:f2><foo:f3>3</foo:f3><baz:f4>4</baz:f4></object>",
 r);
@@ -593,9 +593,9 @@ public class XmlTest {
 
                // Manually set namespaces
                s.namespaces(
-                       Namespace.create("foo","http://foo";),
-                       Namespace.create("bar","http://bar";),
-                       Namespace.create("baz","http://baz";)
+                       Namespace.of("foo","http://foo";),
+                       Namespace.of("bar","http://bar";),
+                       Namespace.of("baz","http://baz";)
                );
                r = s.build().serialize(t);
                assertEquals("<foo:T2 xmlns='http://www.apache.org/2013/Juneau' 
xmlns:foo='http://foo' xmlns:bar='http://bar' 
xmlns:baz='http://baz'><foo:f1>1</foo:f1><bar:f2>2</bar:f2><foo:f3>3</foo:f3><baz:f4>4</baz:f4></foo:T2>",
 r);
@@ -646,9 +646,9 @@ public class XmlTest {
                // Manually set namespaces
                s.disableAutoDetectNamespaces();
                s.namespaces(
-                       Namespace.create("p1","http://p1";),
-                       Namespace.create("bar","http://bar";),
-                       Namespace.create("baz","http://baz";)
+                       Namespace.of("p1","http://p1";),
+                       Namespace.of("bar","http://bar";),
+                       Namespace.of("baz","http://baz";)
                );
                r = s.build().serialize(t);
                assertEquals("<object xmlns='http://www.apache.org/2013/Juneau' 
xmlns:p1='http://p1' xmlns:bar='http://bar' 
xmlns:baz='http://baz'><p1:f1>1</p1:f1><bar:f2>2</bar:f2><p1:f3>3</p1:f3><baz:f4>4</baz:f4></object>",
 r);
@@ -696,10 +696,10 @@ public class XmlTest {
 
                // Manually set namespaces
                s.namespaces(
-                       Namespace.create("foo","http://foo";),
-                       Namespace.create("bar","http://bar";),
-                       Namespace.create("baz","http://baz";),
-                       Namespace.create("p1","http://p1";)
+                       Namespace.of("foo","http://foo";),
+                       Namespace.of("bar","http://bar";),
+                       Namespace.of("baz","http://baz";),
+                       Namespace.of("p1","http://p1";)
                );
                r = s.build().serialize(t);
                assertEquals("<p1:T4 xmlns='http://www.apache.org/2013/Juneau' 
xmlns:foo='http://foo' xmlns:bar='http://bar' xmlns:baz='http://baz' 
xmlns:p1='http://p1'><p1:f1>1</p1:f1><bar:f2>2</bar:f2><p1:f3>3</p1:f3><baz:f4>4</baz:f4></p1:T4>",
 r);
@@ -748,9 +748,9 @@ public class XmlTest {
 
                // Manually set namespaces
                s.namespaces(
-                       Namespace.create("foo","http://foo";),
-                       Namespace.create("bar","http://bar";),
-                       Namespace.create("baz","http://baz";)
+                       Namespace.of("foo","http://foo";),
+                       Namespace.of("bar","http://bar";),
+                       Namespace.of("baz","http://baz";)
                );
                r = s.build().serialize(t);
                assertEquals("<foo:T5 xmlns='http://www.apache.org/2013/Juneau' 
xmlns:foo='http://foo' xmlns:bar='http://bar' 
xmlns:baz='http://baz'><foo:f1>1</foo:f1><bar:f2>2</bar:f2><foo:f3>3</foo:f3><baz:f4>4</baz:f4></foo:T5>",
 r);
@@ -800,9 +800,9 @@ public class XmlTest {
 
                // Manually set namespaces
                s.namespaces(
-                       Namespace.create("foo","http://foo";),
-                       Namespace.create("bar","http://bar";),
-                       Namespace.create("baz","http://baz";)
+                       Namespace.of("foo","http://foo";),
+                       Namespace.of("bar","http://bar";),
+                       Namespace.of("baz","http://baz";)
                );
                r = s.build().serialize(t);
                assertEquals("<object xmlns='http://www.apache.org/2013/Juneau' 
xmlns:foo='http://foo' xmlns:bar='http://bar' 
xmlns:baz='http://baz'><foo:f1>1</foo:f1><bar:f2>2</bar:f2><foo:f3>3</foo:f3><baz:f4>4</baz:f4></object>",
 r);
@@ -852,10 +852,10 @@ public class XmlTest {
 
                // Manually set namespaces
                s.namespaces(
-                       Namespace.create("foo","http://foo";),
-                       Namespace.create("bar","http://bar";),
-                       Namespace.create("baz","http://baz";),
-                       Namespace.create("p1","http://p1";)
+                       Namespace.of("foo","http://foo";),
+                       Namespace.of("bar","http://bar";),
+                       Namespace.of("baz","http://baz";),
+                       Namespace.of("p1","http://p1";)
                );
                r = s.build().serialize(t);
                assertEquals("<object xmlns='http://www.apache.org/2013/Juneau' 
xmlns:foo='http://foo' xmlns:bar='http://bar' xmlns:baz='http://baz' 
xmlns:p1='http://p1'><p1:g1>1</p1:g1><bar:g2>2</bar:g2><p1:g3>3</p1:g3><baz:g4>4</baz:g4></object>",
 r);
@@ -901,9 +901,9 @@ public class XmlTest {
 
                // Manually set namespaces
                s.namespaces(
-                       Namespace.create("foo","http://foo";),
-                       Namespace.create("bar","http://bar";),
-                       Namespace.create("baz","http://baz";)
+                       Namespace.of("foo","http://foo";),
+                       Namespace.of("bar","http://bar";),
+                       Namespace.of("baz","http://baz";)
                );
                r = s.build().serialize(t);
                assertEquals("<object xmlns='http://www.apache.org/2013/Juneau' 
xmlns:foo='http://foo' xmlns:bar='http://bar' 
xmlns:baz='http://baz'><p2:f1>1</p2:f1><p1:f2>2</p1:f2><c1:f3>3</c1:f3><f1:f4>4</f1:f4></object>",
 r);
@@ -952,9 +952,9 @@ public class XmlTest {
 
                // Manually set namespaces
                s.namespaces(
-                       Namespace.create("foo","http://foo";),
-                       Namespace.create("bar","http://bar";),
-                       Namespace.create("baz","http://baz";)
+                       Namespace.of("foo","http://foo";),
+                       Namespace.of("bar","http://bar";),
+                       Namespace.of("baz","http://baz";)
                );
                r = s.build().serialize(t);
                assertEquals("<object xmlns='http://www.apache.org/2013/Juneau' 
xmlns:foo='http://foo' xmlns:bar='http://bar' 
xmlns:baz='http://baz'><p1:f1>1</p1:f1></object>", r);

Reply via email to