You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/12/23 16:50:48 UTC

[07/21] juneau git commit: JUNEAU-76 Improvements to Context/Builder APIs

http://git-wip-us.apache.org/repos/asf/juneau/blob/227719b2/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
index 3c2c380..1969ada 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
@@ -28,7 +28,7 @@ import org.apache.juneau.http.*;
  * <p>
  * The purpose of this class is:
  * <ul>
- * 	<li>Maintain a read-only configuration state of a serializer (i.e. {@link SerializerContext}).
+ * 	<li>Maintain a read-only configuration state of a serializer.
  * 	<li>Create session objects used for serializing POJOs (i.e. {@link SerializerSession}).
  * 	<li>Provide convenience methods for serializing POJOs without having to construct session objects.
  * </ul>
@@ -37,7 +37,7 @@ import org.apache.juneau.http.*;
  * Subclasses should extend directly from {@link OutputStreamSerializer} or {@link WriterSerializer} depending on
  * whether it's a stream or character based serializer.
  */
-public abstract class Serializer extends CoreObject {
+public abstract class Serializer extends BeanContext {
 
 	//-------------------------------------------------------------------------------------------------------------------
 	// Configurable properties
@@ -49,7 +49,7 @@ public abstract class Serializer extends CoreObject {
 	 * <b>Configuration property:</b>  Max serialization depth.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.maxDepth"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.maxDepth.i"</js>
 	 * 	<li><b>Data type:</b> <code>Integer</code>
 	 * 	<li><b>Default:</b> <code>100</code>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -60,13 +60,13 @@ public abstract class Serializer extends CoreObject {
 	 * If this depth is exceeded, an exception is thrown.
 	 * This prevents stack overflows from occurring when trying to serialize models with recursive references.
 	 */
-	public static final String SERIALIZER_maxDepth = PREFIX + "maxDepth";
+	public static final String SERIALIZER_maxDepth = PREFIX + "maxDepth.i";
 
 	/**
 	 * <b>Configuration property:</b>  Initial depth.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.initialDepth"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.initialDepth.i"</js>
 	 * 	<li><b>Data type:</b> <code>Integer</code>
 	 * 	<li><b>Default:</b> <code>0</code>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -76,13 +76,13 @@ public abstract class Serializer extends CoreObject {
 	 * The initial indentation level at the root.
 	 * Useful when constructing document fragments that need to be indented at a certain level.
 	 */
-	public static final String SERIALIZER_initialDepth = PREFIX + "initialDepth";
+	public static final String SERIALIZER_initialDepth = PREFIX + "initialDepth.i";
 
 	/**
 	 * <b>Configuration property:</b>  Automatically detect POJO recursions.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.detectRecursions"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.detectRecursions.b"</js>
 	 * 	<li><b>Data type:</b> <code>Boolean</code>
 	 * 	<li><b>Default:</b> <jk>false</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -107,13 +107,13 @@ public abstract class Serializer extends CoreObject {
 	 * 	<li>Checking for recursion can cause a small performance penalty.
 	 * </ul>
 	 */
-	public static final String SERIALIZER_detectRecursions = PREFIX + "detectRecursions";
+	public static final String SERIALIZER_detectRecursions = PREFIX + "detectRecursions.b";
 
 	/**
 	 * <b>Configuration property:</b>  Ignore recursion errors.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.ignoreRecursions"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.ignoreRecursions.b"</js>
 	 * 	<li><b>Data type:</b> <code>Boolean</code>
 	 * 	<li><b>Default:</b> <jk>false</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -127,13 +127,13 @@ public abstract class Serializer extends CoreObject {
 	 * If <jk>true</jk>, when we encounter the same object when serializing a tree, we set the value to <jk>null</jk>.
 	 * Otherwise, an exception is thrown.
 	 */
-	public static final String SERIALIZER_ignoreRecursions = PREFIX + "ignoreRecursions";
+	public static final String SERIALIZER_ignoreRecursions = PREFIX + "ignoreRecursions.b";
 
 	/**
 	 * <b>Configuration property:</b>  Use whitespace.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.useWhitespace"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.useWhitespace.b"</js>
 	 * 	<li><b>Data type:</b> <code>Boolean</code>
 	 * 	<li><b>Default:</b> <jk>false</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -145,13 +145,13 @@ public abstract class Serializer extends CoreObject {
 	 * <p>
 	 * This setting does not apply to the MessagePack serializer.
 	 */
-	public static final String SERIALIZER_useWhitespace = PREFIX + "useWhitespace";
+	public static final String SERIALIZER_useWhitespace = PREFIX + "useWhitespace.b";
 
 	/**
 	 * <b>Configuration property:</b>  Maximum indentation.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.maxIndent"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.maxIndent.i"</js>
 	 * 	<li><b>Data type:</b> <code>Integer</code>
 	 * 	<li><b>Default:</b> <code>100</code>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -163,13 +163,13 @@ public abstract class Serializer extends CoreObject {
 	 * <p>
 	 * This setting does not apply to the MessagePack or RDF serializers.
 	 */
-	public static final String SERIALIZER_maxIndent = PREFIX + "maxIndent";
+	public static final String SERIALIZER_maxIndent = PREFIX + "maxIndent.i";
 
 	/**
 	 * <b>Configuration property:</b>  Add <js>"_type"</js> properties when needed.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.addBeanTypeProperties"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.addBeanTypeProperties.b"</js>
 	 * 	<li><b>Data type:</b> <code>Boolean</code>
 	 * 	<li><b>Default:</b> <jk>true</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -182,13 +182,13 @@ public abstract class Serializer extends CoreObject {
 	 * For example, when serializing a {@code Map<String,Object>} field, where the bean class cannot be determined from
 	 * the value type.
 	 */
-	public static final String SERIALIZER_addBeanTypeProperties = PREFIX + "addBeanTypeProperties";
+	public static final String SERIALIZER_addBeanTypeProperties = PREFIX + "addBeanTypeProperties.b";
 
 	/**
 	 * <b>Configuration property:</b>  Quote character.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.quoteChar"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.quoteChar.s"</js>
 	 * 	<li><b>Data type:</b> <code>Character</code>
 	 * 	<li><b>Default:</b> <js>'"'</js>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -200,13 +200,13 @@ public abstract class Serializer extends CoreObject {
 	 * <p>
 	 * This setting does not apply to the MessagePack or RDF serializers.
 	 */
-	public static final String SERIALIZER_quoteChar = PREFIX + "quoteChar";
+	public static final String SERIALIZER_quoteChar = PREFIX + "quoteChar.s";
 
 	/**
 	 * <b>Configuration property:</b>  Trim null bean property values.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.trimNullProperties"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.trimNullProperties.b"</js>
 	 * 	<li><b>Data type:</b> <code>Boolean</code>
 	 * 	<li><b>Default:</b> <jk>true</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -222,13 +222,13 @@ public abstract class Serializer extends CoreObject {
 	 * 		Map entries with <jk>null</jk> values will be lost.
 	 * </ul>
 	 */
-	public static final String SERIALIZER_trimNullProperties = PREFIX + "trimNullProperties";
+	public static final String SERIALIZER_trimNullProperties = PREFIX + "trimNullProperties.b";
 
 	/**
 	 * <b>Configuration property:</b>  Trim empty lists and arrays.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.trimEmptyLists"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.trimEmptyLists.b"</js>
 	 * 	<li><b>Data type:</b> <code>Boolean</code>
 	 * 	<li><b>Default:</b> <jk>false</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -246,13 +246,13 @@ public abstract class Serializer extends CoreObject {
 	 * 		Bean properties with empty list values will not be set.
 	 * </ul>
 	 */
-	public static final String SERIALIZER_trimEmptyCollections = PREFIX + "trimEmptyLists";
+	public static final String SERIALIZER_trimEmptyCollections = PREFIX + "trimEmptyLists.b";
 
 	/**
 	 * <b>Configuration property:</b>  Trim empty maps.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.trimEmptyMaps"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.trimEmptyMaps.b"</js>
 	 * 	<li><b>Data type:</b> <code>Boolean</code>
 	 * 	<li><b>Default:</b> <jk>false</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -268,13 +268,13 @@ public abstract class Serializer extends CoreObject {
 	 * 		Bean properties with empty map values will not be set.
 	 * </ul>
 	 */
-	public static final String SERIALIZER_trimEmptyMaps = PREFIX + "trimEmptyMaps";
+	public static final String SERIALIZER_trimEmptyMaps = PREFIX + "trimEmptyMaps.b";
 
 	/**
 	 * <b>Configuration property:</b>  Trim strings.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.trimStrings"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.trimStrings.b"</js>
 	 * 	<li><b>Data type:</b> <code>Boolean</code>
 	 * 	<li><b>Default:</b> <jk>false</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -283,15 +283,15 @@ public abstract class Serializer extends CoreObject {
 	 * <p>
 	 * If <jk>true</jk>, string values will be trimmed of whitespace using {@link String#trim()} before being serialized.
 	 */
-	public static final String SERIALIZER_trimStrings = PREFIX + "trimStrings";
+	public static final String SERIALIZER_trimStrings = PREFIX + "trimStrings.b";
 
 	/**
 	 * <b>Configuration property:</b>  URI context bean.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.uriContext"</js>
-	 * 	<li><b>Data type:</b> {@link UriContext}
-	 * 	<li><b>Default:</b> {@link UriContext#DEFAULT}
+	 * 	<li><b>Name:</b> <js>"Serializer.uriContext.s"</js>
+	 * 	<li><b>Data type:</b> JSON {@link String}
+	 * 	<li><b>Default:</b> <js>"{}"</js>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
 	 * </ul>
 	 *
@@ -303,13 +303,13 @@ public abstract class Serializer extends CoreObject {
 	 * 	<js>"{authority:'http://localhost:10000',contextRoot:'/myContext',servletPath:'/myServlet',pathInfo:'/foo'}"</js>
 	 * </p>
 	 */
-	public static final String SERIALIZER_uriContext = PREFIX + "uriContext";
+	public static final String SERIALIZER_uriContext = PREFIX + "uriContext.s";
 
 	/**
 	 * <b>Configuration property:</b>  URI resolution.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.uriResolution"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.uriResolution.s"</js>
 	 * 	<li><b>Data type:</b> {@link UriResolution}
 	 * 	<li><b>Default:</b> {@link UriResolution#NONE}
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -334,13 +334,13 @@ public abstract class Serializer extends CoreObject {
 	 * 		- Don't do any URL resolution.
 	 * </ul>
 	 */
-	public static final String SERIALIZER_uriResolution = PREFIX + "uriResolution";
+	public static final String SERIALIZER_uriResolution = PREFIX + "uriResolution.s";
 
 	/**
 	 * <b>Configuration property:</b>  URI relativity.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.uriRelativity"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.uriRelativity.s"</js>
 	 * 	<li><b>Data type:</b> {@link UriRelativity}
 	 * 	<li><b>Default:</b> {@link UriRelativity#RESOURCE}
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -363,13 +363,13 @@ public abstract class Serializer extends CoreObject {
 	 * 		- Relative URIs should be considered relative to the request URI.
 	 * </ul>
 	 */
-	public static final String SERIALIZER_uriRelativity = PREFIX + "uriRelativity";
+	public static final String SERIALIZER_uriRelativity = PREFIX + "uriRelativity.s";
 
 	/**
 	 * <b>Configuration property:</b>  Sort arrays and collections alphabetically.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.sortCollections"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.sortCollections.b"</js>
 	 * 	<li><b>Data type:</b> <code>Boolean</code>
 	 * 	<li><b>Default:</b> <jk>false</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -378,13 +378,13 @@ public abstract class Serializer extends CoreObject {
 	 * <p>
 	 * Note that this introduces a performance penalty.
 	 */
-	public static final String SERIALIZER_sortCollections = PREFIX + "sortCollections";
+	public static final String SERIALIZER_sortCollections = PREFIX + "sortCollections.b";
 
 	/**
 	 * <b>Configuration property:</b>  Sort maps alphabetically.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.sortMaps"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.sortMaps.b"</js>
 	 * 	<li><b>Data type:</b> <code>Boolean</code>
 	 * 	<li><b>Default:</b> <jk>false</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -393,13 +393,13 @@ public abstract class Serializer extends CoreObject {
 	 * <p>
 	 * Note that this introduces a performance penalty.
 	 */
-	public static final String SERIALIZER_sortMaps = PREFIX + "sortMaps";
+	public static final String SERIALIZER_sortMaps = PREFIX + "sortMaps.b";
 
 	/**
 	 * <b>Configuration property:</b>  Abridged output.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.abridged"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.abridged.b"</js>
 	 * 	<li><b>Data type:</b> <code>Boolean</code>
 	 * 	<li><b>Default:</b> <jk>false</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -413,13 +413,13 @@ public abstract class Serializer extends CoreObject {
 	 * For example, when serializing a POJO with a {@link Bean#typeName()} value, a <js>"_type"</js> will be added when
 	 * this setting is disabled, but not added when it is enabled.
 	 */
-	public static final String SERIALIZER_abridged = PREFIX + "abridged";
+	public static final String SERIALIZER_abridged = PREFIX + "abridged.b";
 
 	/**
 	 * <b>Configuration property:</b>  Serializer listener.
 	 *
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.listener"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.listener.c"</js>
 	 * 	<li><b>Data type:</b> <code>Class&lt;? extends SerializerListener&gt;</code>
 	 * 	<li><b>Default:</b> <jk>null</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
@@ -428,19 +428,65 @@ public abstract class Serializer extends CoreObject {
 	 * <p>
 	 * Class used to listen for errors and warnings that occur during serialization.
 	 */
-	public static final String SERIALIZER_listener = PREFIX + "listener";
+	public static final String SERIALIZER_listener = PREFIX + "listener.c";
 
 	
+	static final Serializer DEFAULT = new Serializer(PropertyStore2.create().build(), "") {
+		@Override
+		public SerializerSession createSession(SerializerSessionArgs args) {
+			throw new NoSuchMethodError();
+		}
+	};
+	
 	//-------------------------------------------------------------------------------------------------------------------
 	// Instance
 	//-------------------------------------------------------------------------------------------------------------------
 
+	final int maxDepth, initialDepth, maxIndent;
+	final boolean
+		detectRecursions,
+		ignoreRecursions,
+		useWhitespace,
+		addBeanTypeProperties,
+		trimNulls,
+		trimEmptyCollections,
+		trimEmptyMaps,
+		trimStrings,
+		sortCollections,
+		sortMaps,
+		abridged;
+	final char quoteChar;
+	final UriContext uriContext;
+	final UriResolution uriResolution;
+	final UriRelativity uriRelativity;
+	final Class<? extends SerializerListener> listener;
+
 	private final MediaType[] accept;
 	private final MediaType produces;
 
 	// Hidden constructors to force subclass from OuputStreamSerializer or WriterSerializer.
-	Serializer(PropertyStore propertyStore, String produces, String...accept) {
-		super(propertyStore);
+	Serializer(PropertyStore2 ps, String produces, String...accept) {
+		super(ps);
+		
+		maxDepth = getProperty(SERIALIZER_maxDepth, Integer.class, 100);
+		initialDepth = getProperty(SERIALIZER_initialDepth, Integer.class, 0);
+		detectRecursions = getProperty(SERIALIZER_detectRecursions, boolean.class, false);
+		ignoreRecursions = getProperty(SERIALIZER_ignoreRecursions, boolean.class, false);
+		useWhitespace = getProperty(SERIALIZER_useWhitespace, boolean.class, false);
+		maxIndent = getProperty(SERIALIZER_maxIndent, Integer.class, 100);
+		addBeanTypeProperties = getProperty(SERIALIZER_addBeanTypeProperties, boolean.class, true);
+		trimNulls = getProperty(SERIALIZER_trimNullProperties, boolean.class, true);
+		trimEmptyCollections = getProperty(SERIALIZER_trimEmptyCollections, boolean.class, false);
+		trimEmptyMaps = getProperty(SERIALIZER_trimEmptyMaps, boolean.class, false);
+		trimStrings = getProperty(SERIALIZER_trimStrings, boolean.class, false);
+		sortCollections = getProperty(SERIALIZER_sortCollections, boolean.class, false);
+		sortMaps = getProperty(SERIALIZER_sortMaps, boolean.class, false);
+		abridged = getProperty(SERIALIZER_abridged, boolean.class, false);
+		quoteChar = getProperty(SERIALIZER_quoteChar, String.class, "\"").charAt(0);
+		uriContext = getProperty(SERIALIZER_uriContext, UriContext.class, UriContext.DEFAULT);
+		uriResolution = getProperty(SERIALIZER_uriResolution, UriResolution.class, UriResolution.NONE);
+		uriRelativity = getProperty(SERIALIZER_uriRelativity, UriRelativity.class, UriRelativity.RESOURCE);
+		listener = getClassProperty(SERIALIZER_listener, SerializerListener.class, null);
 
 		this.produces = MediaType.forString(produces);
 		if (accept.length == 0) {
@@ -453,9 +499,9 @@ public abstract class Serializer extends CoreObject {
 		}
 	}
 
-	@Override /* CoreObject */
+	@Override /* Context */
 	public SerializerBuilder builder() {
-		return new SerializerBuilder(propertyStore);
+		return null;
 	}
 
 	//--------------------------------------------------------------------------------
@@ -467,7 +513,9 @@ public abstract class Serializer extends CoreObject {
 	 *
 	 * @return <jk>true</jk> if this serializer subclasses from {@link WriterSerializer}.
 	 */
-	public abstract boolean isWriterSerializer();
+	public boolean isWriterSerializer() {
+		return true;
+	}
 
 	/**
 	 * Create the session object used for actual serialization of objects.
@@ -487,23 +535,12 @@ public abstract class Serializer extends CoreObject {
 	// Convenience methods
 	//--------------------------------------------------------------------------------
 
-	/**
-	 * Shortcut for calling <code>createSession(<jk>null</jk>)</code>.
-	 *
-	 * @return
-	 * 	The new session object.
-	 */
+	@Override /* Context */
 	public final SerializerSession createSession() {
 		return createSession(createDefaultSessionArgs());
 	}
 
-	/**
-	 * Creates the session arguments object that gets passed to the {@link #createSession(SerializerSessionArgs)} method.
-	 *
-	 * @return
-	 * 	A new default session arguments object.
-	 * 	<p>The arguments can be modified before passing to the {@link #createSession(SerializerSessionArgs)}.
-	 */
+	@Override /* Context */
 	public final SerializerSessionArgs createDefaultSessionArgs() {
 		return new SerializerSessionArgs(ObjectMap.EMPTY_MAP, null, null, null, getResponseContentType(), null);
 	}
@@ -582,4 +619,30 @@ public abstract class Serializer extends CoreObject {
 	public final MediaType getResponseContentType() {
 		return produces;
 	}
+	
+	@Override /* Context */
+	public ObjectMap asMap() {
+		return super.asMap()
+			.append("Serializer", new ObjectMap()
+				.append("maxDepth", maxDepth)
+				.append("initialDepth", initialDepth)
+				.append("detectRecursions", detectRecursions)
+				.append("ignoreRecursions", ignoreRecursions)
+				.append("useWhitespace", useWhitespace)
+				.append("maxIndent", maxIndent)
+				.append("addBeanTypeProperties", addBeanTypeProperties)
+				.append("trimNulls", trimNulls)
+				.append("trimEmptyCollections", trimEmptyCollections)
+				.append("trimEmptyMaps", trimEmptyMaps)
+				.append("trimStrings", trimStrings)
+				.append("sortCollections", sortCollections)
+				.append("sortMaps", sortMaps)
+				.append("parserKnowsRootTypes", abridged)
+				.append("quoteChar", quoteChar)
+				.append("uriContext", uriContext)
+				.append("uriResolution", uriResolution)
+				.append("uriRelativity", uriRelativity)
+				.append("listener", listener)
+			);
+	}
 }

http://git-wip-us.apache.org/repos/asf/juneau/blob/227719b2/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
index c46b813..a0cbde0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
@@ -23,7 +23,7 @@ import org.apache.juneau.http.*;
 /**
  * Builder class for building instances of serializers.
  */
-public class SerializerBuilder extends CoreObjectBuilder {
+public class SerializerBuilder extends BeanContextBuilder {
 
 	/**
 	 * Constructor, default settings.
@@ -35,15 +35,10 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	/**
 	 * Constructor.
 	 *
-	 * @param propertyStore The initial configuration settings for this builder.
+	 * @param ps The initial configuration settings for this builder.
 	 */
-	public SerializerBuilder(PropertyStore propertyStore) {
-		super(propertyStore);
-	}
-
-	@Override /* CoreObjectBuilder */
-	public Serializer build() {
-		return null;
+	public SerializerBuilder(PropertyStore2 ps) {
+		super(ps);
 	}
 
 
@@ -54,13 +49,6 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	/**
 	 * <b>Configuration property:</b>  Max serialization depth.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.maxDepth"</js>
-	 * 	<li><b>Data type:</b> <code>Integer</code>
-	 * 	<li><b>Default:</b> <code>100</code>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 *
 	 * <p>
 	 * Abort serialization if specified depth is reached in the POJO tree.
 	 * If this depth is exceeded, an exception is thrown.
@@ -76,19 +64,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_maxDepth
 	 */
 	public SerializerBuilder maxDepth(int value) {
-		return property(SERIALIZER_maxDepth, value);
+		return set(SERIALIZER_maxDepth, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  Initial depth.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.initialDepth"</js>
-	 * 	<li><b>Data type:</b> <code>Integer</code>
-	 * 	<li><b>Default:</b> <code>0</code>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 *
 	 * <p>
 	 * The initial indentation level at the root.
 	 * Useful when constructing document fragments that need to be indented at a certain level.
@@ -103,19 +84,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_initialDepth
 	 */
 	public SerializerBuilder initialDepth(int value) {
-		return property(SERIALIZER_initialDepth, value);
+		return set(SERIALIZER_initialDepth, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  Automatically detect POJO recursions.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.detectRecursions"</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>
 	 * Specifies that recursions should be checked for during serialization.
 	 *
@@ -142,19 +116,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_detectRecursions
 	 */
 	public SerializerBuilder detectRecursions(boolean value) {
-		return property(SERIALIZER_detectRecursions, value);
+		return set(SERIALIZER_detectRecursions, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  Ignore recursion errors.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.ignoreRecursions"</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>
 	 * Used in conjunction with {@link Serializer#SERIALIZER_detectRecursions}.
 	 * Setting is ignored if <jsf>SERIALIZER_detectRecursions</jsf> is <jk>false</jk>.
@@ -174,19 +141,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_ignoreRecursions
 	 */
 	public SerializerBuilder ignoreRecursions(boolean value) {
-		return property(SERIALIZER_ignoreRecursions, value);
+		return set(SERIALIZER_ignoreRecursions, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  Use whitespace.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.useWhitepace"</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>, newlines and indentation and spaces are added to the output to improve readability.
 	 *
@@ -200,7 +160,7 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_useWhitespace
 	 */
 	public SerializerBuilder useWhitespace(boolean value) {
-		return property(SERIALIZER_useWhitespace, value);
+		return set(SERIALIZER_useWhitespace, value);
 	}
 
 	/**
@@ -215,13 +175,6 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	/**
 	 * <b>Configuration property:</b>  Maximum indentation.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.maxIndent"</js>
-	 * 	<li><b>Data type:</b> <code>Integer</code>
-	 * 	<li><b>Default:</b> <code>100</code>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 *
 	 * <p>
 	 * Specifies the maximum indentation level in the serialized document.
 	 *
@@ -235,19 +188,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_maxIndent
 	 */
 	public SerializerBuilder maxIndent(int value) {
-		return property(SERIALIZER_maxIndent, value);
+		return set(SERIALIZER_maxIndent, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  Add <js>"_type"</js> properties when needed.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.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.
@@ -266,19 +212,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_addBeanTypeProperties
 	 */
 	public SerializerBuilder addBeanTypeProperties(boolean value) {
-		return property(SERIALIZER_addBeanTypeProperties, value);
+		return set(SERIALIZER_addBeanTypeProperties, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  Quote character.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.quoteChar"</js>
-	 * 	<li><b>Data type:</b> <code>Character</code>
-	 * 	<li><b>Default:</b> <js>'"'</js>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 *
 	 * <p>
 	 * This is the character used for quoting attributes and values.
 	 *
@@ -292,7 +231,7 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_quoteChar
 	 */
 	public SerializerBuilder quoteChar(char value) {
-		return property(SERIALIZER_quoteChar, value);
+		return set(SERIALIZER_quoteChar, value);
 	}
 
 	/**
@@ -307,13 +246,6 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	/**
 	 * <b>Configuration property:</b>  Trim null bean property values.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.trimNullProperties"</js>
-	 * 	<li><b>Data type:</b> <code>Boolean</code>
-	 * 	<li><b>Default:</b> <jk>true</jk>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 *
 	 * <p>
 	 * If <jk>true</jk>, null bean values will not be serialized to the output.
 	 *
@@ -331,19 +263,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_trimNullProperties
 	 */
 	public SerializerBuilder trimNullProperties(boolean value) {
-		return property(SERIALIZER_trimNullProperties, value);
+		return set(SERIALIZER_trimNullProperties, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  Trim empty lists and arrays.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.trimEmptyLists"</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>, empty list values will not be serialized to the output.
 	 *
@@ -362,19 +287,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_trimEmptyCollections
 	 */
 	public SerializerBuilder trimEmptyCollections(boolean value) {
-		return property(SERIALIZER_trimEmptyCollections, value);
+		return set(SERIALIZER_trimEmptyCollections, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  Trim empty maps.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.trimEmptyMaps"</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>, empty map values will not be serialized to the output.
 	 *
@@ -392,19 +310,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_trimEmptyMaps
 	 */
 	public SerializerBuilder trimEmptyMaps(boolean value) {
-		return property(SERIALIZER_trimEmptyMaps, value);
+		return set(SERIALIZER_trimEmptyMaps, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  Trim strings.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.trimStrings"</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>, string values will be trimmed of whitespace using {@link String#trim()} before being serialized.
 	 *
@@ -418,19 +329,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_trimStrings
 	 */
 	public SerializerBuilder trimStrings(boolean value) {
-		return property(SERIALIZER_trimStrings, value);
+		return set(SERIALIZER_trimStrings, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  URI context bean.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.uriContext"</js>
-	 * 	<li><b>Data type:</b> {@link UriContext}
-	 * 	<li><b>Default:</b> {@link UriContext#DEFAULT}
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 *
 	 * <p>
 	 * Bean used for resolution of URIs to absolute or root-relative form.
 	 *
@@ -449,19 +353,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_uriContext
 	 */
 	public SerializerBuilder uriContext(UriContext value) {
-		return property(SERIALIZER_uriContext, value);
+		return set(SERIALIZER_uriContext, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  URI resolution.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.uriResolution"</js>
-	 * 	<li><b>Data type:</b> {@link UriResolution}
-	 * 	<li><b>Default:</b> {@link UriResolution#ROOT_RELATIVE}
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 *
 	 * <p>
 	 * Defines the resolution level for URIs when serializing any of the following:
 	 * <ul>
@@ -491,19 +388,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_uriResolution
 	 */
 	public SerializerBuilder uriResolution(UriResolution value) {
-		return property(SERIALIZER_uriResolution, value);
+		return set(SERIALIZER_uriResolution, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  URI relativity.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.uriRelativity"</js>
-	 * 	<li><b>Data type:</b> {@link UriRelativity}
-	 * 	<li><b>Default:</b> {@link UriRelativity#RESOURCE}
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 *
 	 * <p>
 	 * Defines what relative URIs are relative to when serializing any of the following:
 	 * <ul>
@@ -531,19 +421,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_uriRelativity
 	 */
 	public SerializerBuilder uriRelativity(UriRelativity value) {
-		return property(SERIALIZER_uriRelativity, value);
+		return set(SERIALIZER_uriRelativity, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  Sort arrays and collections alphabetically.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.sortCollections"</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>
-	 *
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul>
 	 * 	<li>This is equivalent to calling <code>property(<jsf>SERIALIZER_sortCollections</jsf>, value)</code>.
@@ -555,19 +438,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_sortCollections
 	 */
 	public SerializerBuilder sortCollections(boolean value) {
-		return property(SERIALIZER_sortCollections, value);
+		return set(SERIALIZER_sortCollections, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  Sort maps alphabetically.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.sortMaps"</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>
-	 *
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul>
 	 * 	<li>This is equivalent to calling <code>property(<jsf>SERIALIZER_sortMaps</jsf>, value)</code>.
@@ -579,19 +455,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_sortMaps
 	 */
 	public SerializerBuilder sortMaps(boolean value) {
-		return property(SERIALIZER_sortMaps, value);
+		return set(SERIALIZER_sortMaps, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  Abridged output.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.parserKnowsRootTypes"</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>
 	 * When enabled, it is assumed that the parser knows the exact Java POJO type being parsed, and therefore top-level
 	 * type information that might normally be included to determine the data type will not be serialized.
@@ -605,19 +474,12 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @see Serializer#SERIALIZER_sortMaps
 	 */
 	public SerializerBuilder abridged(boolean value) {
-		return property(SERIALIZER_abridged, value);
+		return set(SERIALIZER_abridged, value);
 	}
 
 	/**
 	 * <b>Configuration property:</b>  Serializer listener.
 	 *
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.listener"</js>
-	 * 	<li><b>Data type:</b> <code>Class&lt;? extends SerializerListener&gt;</code>
-	 * 	<li><b>Default:</b> <jk>null</jk>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 *
 	 * <p>
 	 * Class used to listen for errors and warnings that occur during serialization.
 	 *
@@ -625,420 +487,419 @@ public class SerializerBuilder extends CoreObjectBuilder {
 	 * @return This object (for method chaining).
 	 */
 	public SerializerBuilder listener(Class<? extends SerializerListener> value) {
-		return property(SERIALIZER_listener, value);
+		return set(SERIALIZER_listener, value);
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder beansRequireDefaultConstructor(boolean value) {
 		super.beansRequireDefaultConstructor(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder beansRequireSerializable(boolean value) {
 		super.beansRequireSerializable(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder beansRequireSettersForGetters(boolean value) {
 		super.beansRequireSettersForGetters(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder beansRequireSomeProperties(boolean value) {
 		super.beansRequireSomeProperties(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder beanMapPutReturnsOldValue(boolean value) {
 		super.beanMapPutReturnsOldValue(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder beanConstructorVisibility(Visibility value) {
 		super.beanConstructorVisibility(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder beanClassVisibility(Visibility value) {
 		super.beanClassVisibility(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder beanFieldVisibility(Visibility value) {
 		super.beanFieldVisibility(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder methodVisibility(Visibility value) {
 		super.methodVisibility(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder useJavaBeanIntrospector(boolean value) {
 		super.useJavaBeanIntrospector(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder useInterfaceProxies(boolean value) {
 		super.useInterfaceProxies(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder ignoreUnknownBeanProperties(boolean value) {
 		super.ignoreUnknownBeanProperties(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder ignoreUnknownNullBeanProperties(boolean value) {
 		super.ignoreUnknownNullBeanProperties(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder ignorePropertiesWithoutSetters(boolean value) {
 		super.ignorePropertiesWithoutSetters(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
 		super.ignoreInvocationExceptionsOnGetters(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
 		super.ignoreInvocationExceptionsOnSetters(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder sortProperties(boolean value) {
 		super.sortProperties(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder notBeanPackages(String...values) {
 		super.notBeanPackages(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder notBeanPackages(Collection<String> values) {
 		super.notBeanPackages(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder setNotBeanPackages(String...values) {
 		super.setNotBeanPackages(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder setNotBeanPackages(Collection<String> values) {
 		super.setNotBeanPackages(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder removeNotBeanPackages(String...values) {
 		super.removeNotBeanPackages(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder removeNotBeanPackages(Collection<String> values) {
 		super.removeNotBeanPackages(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder notBeanClasses(Class<?>...values) {
 		super.notBeanClasses(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder notBeanClasses(Collection<Class<?>> values) {
 		super.notBeanClasses(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder setNotBeanClasses(Class<?>...values) {
 		super.setNotBeanClasses(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder setNotBeanClasses(Collection<Class<?>> values) {
 		super.setNotBeanClasses(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder removeNotBeanClasses(Class<?>...values) {
 		super.removeNotBeanClasses(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder removeNotBeanClasses(Collection<Class<?>> values) {
 		super.removeNotBeanClasses(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder beanFilters(Class<?>...values) {
 		super.beanFilters(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder beanFilters(Collection<Class<?>> values) {
 		super.beanFilters(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder setBeanFilters(Class<?>...values) {
 		super.setBeanFilters(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder setBeanFilters(Collection<Class<?>> values) {
 		super.setBeanFilters(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder removeBeanFilters(Class<?>...values) {
 		super.removeBeanFilters(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder removeBeanFilters(Collection<Class<?>> values) {
 		super.removeBeanFilters(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder pojoSwaps(Class<?>...values) {
 		super.pojoSwaps(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder pojoSwaps(Collection<Class<?>> values) {
 		super.pojoSwaps(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder setPojoSwaps(Class<?>...values) {
 		super.setPojoSwaps(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder setPojoSwaps(Collection<Class<?>> values) {
 		super.setPojoSwaps(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder removePojoSwaps(Class<?>...values) {
 		super.removePojoSwaps(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder removePojoSwaps(Collection<Class<?>> values) {
 		super.removePojoSwaps(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public SerializerBuilder implClasses(Map<Class<?>,Class<?>> values) {
+	@Override /* ContextBuilder */
+	public SerializerBuilder implClasses(Map<String,Class<?>> values) {
 		super.implClasses(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public <T> CoreObjectBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
+	@Override /* ContextBuilder */
+	public <T> SerializerBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
 		super.implClass(interfaceClass, implClass);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public CoreObjectBuilder includeProperties(Map<String,String> values) {
+	@Override /* ContextBuilder */
+	public SerializerBuilder includeProperties(Map<String,String> values) {
 		super.includeProperties(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public CoreObjectBuilder includeProperties(String beanClassName, String properties) {
+	@Override /* ContextBuilder */
+	public SerializerBuilder includeProperties(String beanClassName, String properties) {
 		super.includeProperties(beanClassName, properties);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public CoreObjectBuilder includeProperties(Class<?> beanClass, String properties) {
+	@Override /* ContextBuilder */
+	public SerializerBuilder includeProperties(Class<?> beanClass, String properties) {
 		super.includeProperties(beanClass, properties);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public CoreObjectBuilder excludeProperties(Map<String,String> values) {
+	@Override /* ContextBuilder */
+	public SerializerBuilder excludeProperties(Map<String,String> values) {
 		super.excludeProperties(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public CoreObjectBuilder excludeProperties(String beanClassName, String properties) {
+	@Override /* ContextBuilder */
+	public SerializerBuilder excludeProperties(String beanClassName, String properties) {
 		super.excludeProperties(beanClassName, properties);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public CoreObjectBuilder excludeProperties(Class<?> beanClass, String properties) {
+	@Override /* ContextBuilder */
+	public SerializerBuilder excludeProperties(Class<?> beanClass, String properties) {
 		super.excludeProperties(beanClass, properties);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder beanDictionary(Class<?>...values) {
 		super.beanDictionary(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder beanDictionary(Collection<Class<?>> values) {
 		super.beanDictionary(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder setBeanDictionary(Class<?>...values) {
 		super.setBeanDictionary(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder setBeanDictionary(Collection<Class<?>> values) {
 		super.setBeanDictionary(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder removeFromBeanDictionary(Class<?>...values) {
 		super.removeFromBeanDictionary(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder removeFromBeanDictionary(Collection<Class<?>> values) {
 		super.removeFromBeanDictionary(values);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder beanTypePropertyName(String value) {
 		super.beanTypePropertyName(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder defaultParser(Class<?> value) {
 		super.defaultParser(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder locale(Locale value) {
 		super.locale(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder timeZone(TimeZone value) {
 		super.timeZone(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder mediaType(MediaType value) {
 		super.mediaType(value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
+	@Override /* ContextBuilder */
 	public SerializerBuilder debug() {
 		super.debug();
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public SerializerBuilder property(String name, Object value) {
-		super.property(name, value);
-		return this;
-	}
-
-	@Override /* CoreObjectBuilder */
-	public SerializerBuilder properties(Map<String,Object> properties) {
-		super.properties(properties);
+	@Override /* ContextBuilder */
+	public SerializerBuilder set(String name, Object value) {
+		super.set(name, value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public SerializerBuilder addToProperty(String name, Object value) {
-		super.addToProperty(name, value);
+	@Override /* ContextBuilder */
+	public SerializerBuilder set(Map<String,Object> properties) {
+		super.set(properties);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public SerializerBuilder putToProperty(String name, Object key, Object value) {
-		super.putToProperty(name, key, value);
+	@Override /* ContextBuilder */
+	public SerializerBuilder add(Map<String,Object> properties) {
+		super.add(properties);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public SerializerBuilder putToProperty(String name, Object value) {
-		super.putToProperty(name, value);
+	@Override /* ContextBuilder */
+	public SerializerBuilder addTo(String name, Object value) {
+		super.addTo(name, value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public SerializerBuilder removeFromProperty(String name, Object value) {
-		super.removeFromProperty(name, value);
+	@Override /* ContextBuilder */
+	public SerializerBuilder addTo(String name, String key, Object value) {
+		super.addTo(name, key, value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public SerializerBuilder classLoader(ClassLoader classLoader) {
-		super.classLoader(classLoader);
+	@Override /* ContextBuilder */
+	public SerializerBuilder removeFrom(String name, Object value) {
+		super.removeFrom(name, value);
 		return this;
 	}
 
-	@Override /* CoreObjectBuilder */
-	public SerializerBuilder apply(PropertyStore copyFrom) {
+	@Override /* ContextBuilder */
+	public SerializerBuilder apply(PropertyStore2 copyFrom) {
 		super.apply(copyFrom);
 		return this;
 	}
+	
+	@Override /* Context */
+	public Serializer build() {
+		return null;
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/juneau/blob/227719b2/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerContext.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerContext.java
deleted file mode 100644
index 8d31f4f..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerContext.java
+++ /dev/null
@@ -1,102 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.serializer;
-
-import static org.apache.juneau.serializer.Serializer.*;
-
-import org.apache.juneau.*;
-
-/**
- * Contains a snapshot-in-time read-only copy of the settings on the {@link Serializer} class.
- */
-public class SerializerContext extends BeanContext {
-
-	/**
-	 * Default context with all default values.
-	 */
-	static final SerializerContext DEFAULT = new SerializerContext(PropertyStore.create());
-
-
-	final int maxDepth, initialDepth, maxIndent;
-	final boolean
-		detectRecursions,
-		ignoreRecursions,
-		useWhitespace,
-		addBeanTypeProperties,
-		trimNulls,
-		trimEmptyCollections,
-		trimEmptyMaps,
-		trimStrings,
-		sortCollections,
-		sortMaps,
-		abridged;
-	final char quoteChar;
-	final UriContext uriContext;
-	final UriResolution uriResolution;
-	final UriRelativity uriRelativity;
-	final Class<? extends SerializerListener> listener;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param ps The property store that created this context.
-	 */
-	public SerializerContext(PropertyStore ps) {
-		super(ps);
-		maxDepth = ps.getProperty(SERIALIZER_maxDepth, int.class, 100);
-		initialDepth = ps.getProperty(SERIALIZER_initialDepth, int.class, 0);
-		detectRecursions = ps.getProperty(SERIALIZER_detectRecursions, boolean.class, false);
-		ignoreRecursions = ps.getProperty(SERIALIZER_ignoreRecursions, boolean.class, false);
-		useWhitespace = ps.getProperty(SERIALIZER_useWhitespace, boolean.class, false);
-		maxIndent = ps.getProperty(SERIALIZER_maxIndent, int.class, 100);
-		addBeanTypeProperties = ps.getProperty(SERIALIZER_addBeanTypeProperties, boolean.class, true);
-		trimNulls = ps.getProperty(SERIALIZER_trimNullProperties, boolean.class, true);
-		trimEmptyCollections = ps.getProperty(SERIALIZER_trimEmptyCollections, boolean.class, false);
-		trimEmptyMaps = ps.getProperty(SERIALIZER_trimEmptyMaps, boolean.class, false);
-		trimStrings = ps.getProperty(SERIALIZER_trimStrings, boolean.class, false);
-		sortCollections = ps.getProperty(SERIALIZER_sortCollections, boolean.class, false);
-		sortMaps = ps.getProperty(SERIALIZER_sortMaps, boolean.class, false);
-		abridged = ps.getProperty(SERIALIZER_abridged, boolean.class, false);
-		quoteChar = ps.getProperty(SERIALIZER_quoteChar, String.class, "\"").charAt(0);
-		uriContext = ps.getProperty(SERIALIZER_uriContext, UriContext.class, UriContext.DEFAULT);
-		uriResolution = ps.getProperty(SERIALIZER_uriResolution, UriResolution.class, UriResolution.NONE);
-		uriRelativity = ps.getProperty(SERIALIZER_uriRelativity, UriRelativity.class, UriRelativity.RESOURCE);
-		listener = ps.getProperty(SERIALIZER_listener, Class.class, null);
-	}
-
-	@Override /* Context */
-	public ObjectMap asMap() {
-		return super.asMap()
-			.append("SerializerContext", new ObjectMap()
-				.append("maxDepth", maxDepth)
-				.append("initialDepth", initialDepth)
-				.append("detectRecursions", detectRecursions)
-				.append("ignoreRecursions", ignoreRecursions)
-				.append("useWhitespace", useWhitespace)
-				.append("maxIndent", maxIndent)
-				.append("addBeanTypeProperties", addBeanTypeProperties)
-				.append("trimNulls", trimNulls)
-				.append("trimEmptyCollections", trimEmptyCollections)
-				.append("trimEmptyMaps", trimEmptyMaps)
-				.append("trimStrings", trimStrings)
-				.append("sortCollections", sortCollections)
-				.append("sortMaps", sortMaps)
-				.append("parserKnowsRootTypes", abridged)
-				.append("quoteChar", quoteChar)
-				.append("uriContext", uriContext)
-				.append("uriResolution", uriResolution)
-				.append("uriRelativity", uriRelativity)
-				.append("listener", listener)
-			);
-	}
-}

http://git-wip-us.apache.org/repos/asf/juneau/blob/227719b2/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
----------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroup.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
index 9b49e8f..da475d9 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
@@ -70,8 +70,7 @@ public final class SerializerGroup {
 	private final List<MediaType> mediaTypesList;
 	private final Serializer[] mediaTypeSerializers;
 	private final List<Serializer> serializers;
-	private final PropertyStore propertyStore;
-	private final BeanContext beanContext;
+	private final PropertyStore2 propertyStore;
 
 	/**
 	 * Instantiates a new clean-slate {@link SerializerGroupBuilder} object.
@@ -97,7 +96,7 @@ public final class SerializerGroup {
 	/**
 	 * Constructor.
 	 *
-	 * @param propertyStore
+	 * @param ps
 	 * 	The modifiable properties that were used to initialize the serializers.
 	 * 	A snapshot of these will be made so that we can clone and modify this group.
 	 * @param serializers
@@ -105,9 +104,8 @@ public final class SerializerGroup {
 	 * 	The order is important because they will be tried in reverse order (e.g.newer first) in which they will be tried
 	 * 	to match against media types.
 	 */
-	public SerializerGroup(PropertyStore propertyStore, Serializer[] serializers) {
-		this.propertyStore = propertyStore.copy();
-		this.beanContext = propertyStore.getBeanContext();
+	public SerializerGroup(PropertyStore2 ps, Serializer[] serializers) {
+		this.propertyStore = ps;
 		this.serializers = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(serializers)));
 
 		List<MediaType> lmt = new ArrayList<>();
@@ -255,8 +253,8 @@ public final class SerializerGroup {
 	 *
 	 * @return A new copy of the property store passed in to the constructor.
 	 */
-	public PropertyStore createPropertyStore() {
-		return propertyStore.copy();
+	public PropertyStore2 getPropertyStore() {
+		return propertyStore;
 	}
 
 	/**
@@ -267,13 +265,4 @@ public final class SerializerGroup {
 	public List<Serializer> getSerializers() {
 		return serializers;
 	}
-
-	/**
-	 * Returns a bean context with the same properties as this group.
-	 *
-	 * @return The bean context.
-	 */
-	public BeanContext getBeanContext() {
-		return beanContext;
-	}
 }