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 2018/07/10 16:57:06 UTC

[juneau] branch master updated: Session init optimization.

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 35fdd18  Session init optimization.
35fdd18 is described below

commit 35fdd18c9a4f194488acaaa03e343ed6f255d95b
Author: JamesBognar <ja...@apache.org>
AuthorDate: Tue Jul 10 12:56:53 2018 -0400

    Session init optimization.
---
 .../juneau/transforms/LocalizedDatesTest.java      |  2 +-
 .../java/org/apache/juneau/xml/XmlContentTest.java |  8 ++++----
 .../main/java/org/apache/juneau/BeanContext.java   |  3 ++-
 .../main/java/org/apache/juneau/BeanSession.java   |  8 ++++----
 .../java/org/apache/juneau/BeanSessionArgs.java    | 22 ++++++++++++++++++++--
 .../src/main/java/org/apache/juneau/Session.java   |  2 +-
 .../juneau/httppart/OpenApiPartSerializer.java     | 12 +++++++++---
 .../main/java/org/apache/juneau/parser/Parser.java |  2 +-
 .../apache/juneau/parser/ParserSessionArgs.java    |  7 +++++--
 .../org/apache/juneau/serializer/Serializer.java   |  2 +-
 .../juneau/serializer/SerializerSession.java       | 12 ++++++------
 .../juneau/serializer/SerializerSessionArgs.java   | 13 +++++++++++--
 .../apache/juneau/uon/UonSerializerSession.java    |  2 +-
 .../org/apache/juneau/rest/jaxrs/BaseProvider.java |  4 ++--
 .../apache/juneau/rest/BasicRestInfoProvider.java  |  2 +-
 .../java/org/apache/juneau/rest/RequestBody.java   |  2 +-
 .../java/org/apache/juneau/rest/RestRequest.java   | 11 +++++++++++
 .../juneau/rest/response/DefaultHandler.java       |  2 +-
 .../apache/juneau/rest/widget/MenuItemWidget.java  |  2 +-
 19 files changed, 83 insertions(+), 35 deletions(-)

diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/transforms/LocalizedDatesTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/transforms/LocalizedDatesTest.java
index d8a5f69..0c101c0 100644
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/transforms/LocalizedDatesTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/transforms/LocalizedDatesTest.java
@@ -642,7 +642,7 @@ public class LocalizedDatesTest {
 
 	@Test
 	public void test() {
-		BeanSession session = bc.createSession(new BeanSessionArgs(null, sessionLocale, sessionTimeZone, null));
+		BeanSession session = bc.createSession(new BeanSessionArgs(null, sessionLocale, sessionTimeZone, null, null));
 		String actual = session.convertToType(calendar, String.class);
 		String actual2 = actual;
 		if (expected.indexOf('(') == -1)
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
index f3085d6..047e3e7 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
@@ -44,7 +44,7 @@ public class XmlContentTest {
 		t.f2 = null;
 
 		sw = new StringWriter();
-		session = s1.createSession(new SerializerSessionArgs(null, null, null, null, null, null));
+		session = s1.createSession(new SerializerSessionArgs(null, null, null, null, null, null, null));
 		session.serialize(t, sw);
 		r = sw.toString();
 		assertEquals("<A f1='f1'>_x0000_</A>", r);
@@ -52,7 +52,7 @@ public class XmlContentTest {
 		assertEqualObjects(t, t2);
 
 		sw = new StringWriter();
-		session = s2.createSession(new SerializerSessionArgs(null, null, null, null, null, null));
+		session = s2.createSession(new SerializerSessionArgs(null, null, null, null, null, null, null));
 		session.serialize(t, sw);
 		r = sw.toString();
 		assertEquals("<A f1='f1'>_x0000_</A>\n", r);
@@ -152,7 +152,7 @@ public class XmlContentTest {
 		t.f2 = null;
 
 		sw = new StringWriter();
-		session = s1.createSession(new SerializerSessionArgs(null, null, null, null, null, null));
+		session = s1.createSession(new SerializerSessionArgs(null, null, null, null, null, null, null));
 		session.serialize(t, sw);
 		r = sw.toString();
 		assertEquals("<A f1='f1'>_x0000_</A>", r);
@@ -160,7 +160,7 @@ public class XmlContentTest {
 		assertEqualObjects(t, t2);
 
 		sw = new StringWriter();
-		session = s2.createSession(new SerializerSessionArgs(null, null, null, null, null, null));
+		session = s2.createSession(new SerializerSessionArgs(null, null, null, null, null, null, null));
 		session.serialize(t, sw);
 		r = sw.toString();
 		assertEquals("<A f1='f1'>_x0000_</A>\n", r);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
index 30a4199..b1f8e91 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
@@ -752,6 +752,7 @@ public class BeanContext extends Context {
 	 * 		<ul>
 	 * 			<li class='jm'>{@link BeanContextBuilder#debug(boolean)}
 	 * 			<li class='jm'>{@link BeanContextBuilder#debug()}
+	 * 			<li class='jm'>{@link BeanSessionArgs#debug(Boolean)}
 	 * 		</ul>
 	 * </ul>
 	 *
@@ -2141,7 +2142,7 @@ public class BeanContext extends Context {
 	 * @return A new session arguments object.
 	 */
 	public final BeanSessionArgs createDefaultBeanSessionArgs() {
-		return new BeanSessionArgs(null, null, null, null);
+		return new BeanSessionArgs();
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
index 69b706c..bb15230 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
@@ -58,10 +58,10 @@ public class BeanSession extends Session {
 	protected BeanSession(BeanContext ctx, BeanSessionArgs args) {
 		super(args);
 		this.ctx = ctx;
-		locale = getProperty(BEAN_locale, Locale.class, args.locale, ctx.getLocale(), Locale.getDefault());
-		timeZone = getProperty(BEAN_timeZone, TimeZone.class, args.timeZone, ctx.getTimeZone());
-		debug = getProperty(BEAN_debug, boolean.class, ctx.isDebug());
-		mediaType = getProperty(BEAN_mediaType, MediaType.class, args.mediaType, ctx.getMediaType());
+		locale = ObjectUtils.firstNonNull(args.locale, ctx.getLocale(), Locale.getDefault());
+		timeZone = ObjectUtils.firstNonNull(args.timeZone, ctx.getTimeZone());
+		debug = ObjectUtils.firstNonNull(args.debug, ctx.isDebug(), false);
+		mediaType = ObjectUtils.firstNonNull(args.mediaType, ctx.getMediaType());
 	}
 
 	@Override /* Session */
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSessionArgs.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSessionArgs.java
index f562e7a..d14a929 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSessionArgs.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSessionArgs.java
@@ -24,11 +24,12 @@ public class BeanSessionArgs extends SessionArgs {
 	/**
 	 * Default empty session arguments.
 	 */
-	public static final BeanSessionArgs DEFAULT = new BeanSessionArgs(ObjectMap.EMPTY_MAP, null, null, null);
+	public static final BeanSessionArgs DEFAULT = new BeanSessionArgs();
 
 	Locale locale;
 	TimeZone timeZone;
 	MediaType mediaType;
+	Boolean debug;
 
 	/**
 	 * Constructor
@@ -51,12 +52,16 @@ public class BeanSessionArgs extends SessionArgs {
 	 * @param mediaType
 	 * 	The session media type (e.g. <js>"application/json"</js>).
 	 * 	<br>Can be <jk>null</jk>.
+	 * @param debug
+	 * 	Enable debug mode for this session.
+	 * 	<br>Can be <jk>null</jk> to use the debug setting on the bean context..
 	 */
-	public BeanSessionArgs(ObjectMap properties, Locale locale, TimeZone timeZone, MediaType mediaType) {
+	public BeanSessionArgs(ObjectMap properties, Locale locale, TimeZone timeZone, MediaType mediaType, Boolean debug) {
 		super(properties);
 		this.locale = locale;
 		this.timeZone = timeZone;
 		this.mediaType = mediaType;
+		this.debug = debug;
 	}
 
 	/**
@@ -98,6 +103,19 @@ public class BeanSessionArgs extends SessionArgs {
 		return this;
 	}
 
+	/**
+	 * Debug mode.
+	 *
+	 * @param debug
+	 * 	Debug mode flag.
+	 * 	<br>Can be <jk>null</jk>.
+	 * @return This object (for method chaining).
+	 */
+	public BeanSessionArgs debug(Boolean debug) {
+		this.debug = debug;
+		return this;
+	}
+
 	@Override /* SessionArgs */
 	public BeanSessionArgs properties(ObjectMap properties) {
 		super.properties(properties);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Session.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Session.java
index 6e34b47..783a1c9 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Session.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Session.java
@@ -45,7 +45,7 @@ public abstract class Session {
 	 * 	Runtime arguments.
 	 */
 	protected Session(SessionArgs args) {
-		this.properties = args.properties;
+		this.properties = args.properties == null ? ObjectMap.EMPTY_MAP : args.properties;
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/OpenApiPartSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/OpenApiPartSerializer.java
index f14c42a..6344926 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/OpenApiPartSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/OpenApiPartSerializer.java
@@ -263,7 +263,7 @@ public class OpenApiPartSerializer extends UonPartSerializer {
 	}
 
 	@SuppressWarnings("rawtypes")
-	private ObjectMap toMap(HttpPartType partType, ClassMeta<?> type, Object o, HttpPartSchema s) throws SerializeException, SchemaValidationException {
+	private Map toMap(HttpPartType partType, ClassMeta<?> type, Object o, HttpPartSchema s) throws SerializeException, SchemaValidationException {
 		if (s == null)
 			s = DEFAULT_SCHEMA;
 		ObjectMap m = new ObjectMap();
@@ -279,10 +279,13 @@ public class OpenApiPartSerializer extends UonPartSerializer {
 			for (Map.Entry e : (Set<Map.Entry>)((Map)o).entrySet())
 				m.put(asString(e.getKey()), toObject(partType, e.getValue(), s.getProperty(asString(e.getKey()))));
 		}
+		if (isSortMaps())
+			return createSession().sort(m);
 		return m;
 	}
 
-	private ObjectList toList(HttpPartType partType, ClassMeta<?> type, Object o, HttpPartSchema s) throws SerializeException, SchemaValidationException {
+	@SuppressWarnings("rawtypes")
+	private Collection toList(HttpPartType partType, ClassMeta<?> type, Object o, HttpPartSchema s) throws SerializeException, SchemaValidationException {
 		if (s == null)
 			s = DEFAULT_SCHEMA;
 		ObjectList l = new ObjectList();
@@ -296,9 +299,12 @@ public class OpenApiPartSerializer extends UonPartSerializer {
 		} else {
 			l.add(toObject(partType, o, items));
 		}
+		if (isSortCollections())
+			return createSession().sort(l);
 		return l;
 	}
 
+	@SuppressWarnings("rawtypes")
 	private Object toObject(HttpPartType partType, Object o, HttpPartSchema s) throws SerializeException, SchemaValidationException {
 		if (o == null)
 			return null;
@@ -321,7 +327,7 @@ public class OpenApiPartSerializer extends UonPartSerializer {
 				return toIsoDateTime(toType(o, CM_Calendar));
 			return o;
 		} else if (t == ARRAY) {
-			ObjectList l = toList(partType, getClassMetaForObject(o), o, s);
+			Collection l = toList(partType, getClassMetaForObject(o), o, s);
 			if (cf == CSV)
 				return joine(l, ',');
 			if (cf == PIPES)
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/Parser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/Parser.java
index 6c8a318..d3a4a6c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/Parser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/Parser.java
@@ -699,7 +699,7 @@ public abstract class Parser extends BeanContext {
 
 	@Override /* Context */
 	public final ParserSessionArgs createDefaultSessionArgs() {
-		return new ParserSessionArgs(ObjectMap.EMPTY_MAP, null, null, null, getPrimaryMediaType(), null);
+		return new ParserSessionArgs().mediaType(getPrimaryMediaType());
 	}
 
 	//--------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSessionArgs.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSessionArgs.java
index 9532dab..8e3c5bb 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSessionArgs.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSessionArgs.java
@@ -50,11 +50,14 @@ public final class ParserSessionArgs extends BeanSessionArgs {
 	 * @param mediaType
 	 * 	The session media type (e.g. <js>"application/json"</js>).
 	 * 	<br>Can be <jk>null</jk>.
+	 * @param debug
+	 * 	Enable debug mode for this session.
+	 * 	<br>Can be <jk>null</jk> to use the debug setting on the bean context..
 	 * @param outer
 	 * 	The outer object for instantiating top-level non-static inner classes.
 	 */
-	public ParserSessionArgs(ObjectMap properties, Method javaMethod, Locale locale, TimeZone timeZone, MediaType mediaType, Object outer) {
-		super(properties, locale, timeZone, mediaType);
+	public ParserSessionArgs(ObjectMap properties, Method javaMethod, Locale locale, TimeZone timeZone, MediaType mediaType, Boolean debug, Object outer) {
+		super(properties, locale, timeZone, mediaType, debug);
 		this.javaMethod = javaMethod;
 		this.outer = outer;
 	}
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 b630877..e086afa 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
@@ -959,7 +959,7 @@ public abstract class Serializer extends BeanContext {
 
 	@Override /* Context */
 	public final SerializerSessionArgs createDefaultSessionArgs() {
-		return new SerializerSessionArgs(ObjectMap.EMPTY_MAP, null, null, null, getResponseContentType(), null);
+		return new SerializerSessionArgs().mediaType(getResponseContentType());
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index d8bc0bd..96437f2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -83,8 +83,8 @@ public abstract class SerializerSession extends BeanSession {
 		super(ctx, args);
 		this.ctx = ctx;
 		this.javaMethod = args.javaMethod;
-		uriResolver = new UriResolver(ctx.getUriResolution(), ctx.getUriRelativity(), args.uriContext == null ? ctx.getUriContext() : args.uriContext);
-		listener = newInstance(SerializerListener.class, ctx.getListener());
+		this.uriResolver = new UriResolver(ctx.getUriResolution(), ctx.getUriRelativity(), args.uriContext == null ? ctx.getUriContext() : args.uriContext);
+		this.listener = newInstance(SerializerListener.class, ctx.getListener());
 
 		this.indent = getInitialDepth();
 		if (isDetectRecursions() || isDebug()) {
@@ -360,7 +360,7 @@ public abstract class SerializerSession extends BeanSession {
 	 * @param o The input string to trim.
 	 * @return The trimmed string, or <jk>null</jk> if the input was <jk>null</jk>.
 	 */
-	protected final String trim(Object o) {
+	public final String trim(Object o) {
 		if (o == null)
 			return null;
 		String s = o.toString();
@@ -402,7 +402,7 @@ public abstract class SerializerSession extends BeanSession {
 	 * @return <jk>true</jk> if the specified value should not be serialized.
 	 * @throws SerializeException If recursion occurred.
 	 */
-	protected final boolean canIgnoreValue(ClassMeta<?> cm, String attrName, Object value) throws SerializeException {
+	public final boolean canIgnoreValue(ClassMeta<?> cm, String attrName, Object value) throws SerializeException {
 
 		if (isTrimNullProperties() && value == null)
 			return true;
@@ -443,7 +443,7 @@ public abstract class SerializerSession extends BeanSession {
 	 * @param m The map being sorted.
 	 * @return A new sorted {@link TreeMap}.
 	 */
-	protected final <K,V> Map<K,V> sort(Map<K,V> m) {
+	public final <K,V> Map<K,V> sort(Map<K,V> m) {
 		if (isSortMaps() && m != null && (! m.isEmpty()) && m.keySet().iterator().next() instanceof Comparable<?>)
 			return new TreeMap<>(m);
 		return m;
@@ -455,7 +455,7 @@ public abstract class SerializerSession extends BeanSession {
 	 * @param c The collection being sorted.
 	 * @return A new sorted {@link TreeSet}.
 	 */
-	protected final <E> Collection<E> sort(Collection<E> c) {
+	public final <E> Collection<E> sort(Collection<E> c) {
 		if (isSortCollections() && c != null && (! c.isEmpty()) && c.iterator().next() instanceof Comparable<?>)
 			return new TreeSet<>(c);
 		return c;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSessionArgs.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSessionArgs.java
index 87cef6b..26a0593 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSessionArgs.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSessionArgs.java
@@ -53,12 +53,15 @@ public final class SerializerSessionArgs extends BeanSessionArgs {
 	 * @param mediaType
 	 * 	The session media type (e.g. <js>"application/json"</js>).
 	 * 	<br>Can be <jk>null</jk>.
+	 * @param debug
+	 * 	Enable debug mode for this session.
+	 * 	<br>Can be <jk>null</jk> to use the debug setting on the bean context..
 	 * @param uriContext
 	 * 	The URI context.
 	 * 	<br>Identifies the current request URI used for resolution of URIs to absolute or root-relative form.
 	 */
-	public SerializerSessionArgs(ObjectMap properties, Method javaMethod, Locale locale, TimeZone timeZone, MediaType mediaType, UriContext uriContext) {
-		super(properties, locale, timeZone, mediaType);
+	public SerializerSessionArgs(ObjectMap properties, Method javaMethod, Locale locale, TimeZone timeZone, MediaType mediaType, Boolean debug, UriContext uriContext) {
+		super(properties, locale, timeZone, mediaType, debug);
 		this.javaMethod = javaMethod;
 		this.uriContext = uriContext;
 	}
@@ -107,6 +110,12 @@ public final class SerializerSessionArgs extends BeanSessionArgs {
 		return this;
 	}
 
+	@Override /* BeanSessionArgs */
+	public SerializerSessionArgs debug(Boolean debug) {
+		super.debug(debug);
+		return this;
+	}
+
 	@Override /* SessionArgs */
 	public SerializerSessionArgs properties(ObjectMap properties) {
 		super.properties(properties);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
index 1674a70..602ee9f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
@@ -47,7 +47,7 @@ public class UonSerializerSession extends WriterSerializerSession {
 	public UonSerializerSession(UonSerializer ctx, Boolean encode, SerializerSessionArgs args) {
 		super(ctx, args);
 		this.ctx = ctx;
-		plainTextParams = getProperty(UON_paramFormat, ParamFormat.class, ctx.getParamFormat()) == ParamFormat.PLAINTEXT;
+		plainTextParams = ctx.getParamFormat() == ParamFormat.PLAINTEXT;
 	}
 
 	@Override /* Session */
diff --git a/juneau-rest/juneau-rest-server-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java b/juneau-rest/juneau-rest-server-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java
index b3f220f..edf6010 100644
--- a/juneau-rest/juneau-rest-server-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java
+++ b/juneau-rest/juneau-rest-server-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java
@@ -121,7 +121,7 @@ public class BaseProvider implements MessageBodyReader<Object>, MessageBodyWrite
 			Locale locale = getLocale(headers);
 			TimeZone timeZone = getTimeZone(headers);
 
-			SerializerSession session = s.createSession(new SerializerSessionArgs(mp, null, locale, timeZone, sm.getMediaType(), null));
+			SerializerSession session = s.createSession(new SerializerSessionArgs(mp, null, locale, timeZone, sm.getMediaType(), null, null));
 
 			// Leave this open in case an error occurs.
 			Closeable c = s.isWriterSerializer() ? new OutputStreamWriter(os, UTF8) : os;
@@ -149,7 +149,7 @@ public class BaseProvider implements MessageBodyReader<Object>, MessageBodyWrite
 			mp.put("mediaType", mediaType.toString());
 			Locale locale = getLocale(headers);
 			TimeZone timeZone = getTimeZone(headers);
-			ParserSession session = p.createSession(new ParserSessionArgs(mp, null, locale, timeZone, pm.getMediaType(), null));
+			ParserSession session = p.createSession(new ParserSessionArgs(mp, null, locale, timeZone, pm.getMediaType(), null, null));
 			Object in2 = session.isReaderParser() ? new InputStreamReader(in, UTF8) : in;
 			return session.parse(in2, p.getClassMeta(gType));
 		} catch (ParseException e) {
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
index 86b692e..105b303 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
@@ -922,7 +922,7 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 				if (mt != MediaType.HTML) {
 					Serializer s2 = sm.getSerializers().getSerializer(mt);
 					if (s2 != null) {
-						SerializerSessionArgs args = new SerializerSessionArgs(sprops, req.getJavaMethod(), req.getLocale(), null, mt, req.getUriContext());
+						SerializerSessionArgs args = new SerializerSessionArgs(sprops, req.getJavaMethod(), req.getLocale(), null, mt, req.isDebug() ? true : null, req.getUriContext());
 						try {
 							String eVal = s2.createSession(args).serializeToString(example);
 							examples.put(s2.getPrimaryMediaType().toString(), eVal);
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestBody.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestBody.java
index a3f2611..fa57141 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestBody.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestBody.java
@@ -462,7 +462,7 @@ public class RequestBody {
 			Parser p = pm.getParser();
 			MediaType mediaType = pm.getMediaType();
 			req.getProperties().append("mediaType", mediaType).append("characterEncoding", req.getCharacterEncoding());
-			ParserSession session = p.createSession(new ParserSessionArgs(req.getProperties(), req.getJavaMethod(), locale, timeZone, mediaType, req.getContext().getResource()));
+			ParserSession session = p.createSession(new ParserSessionArgs(req.getProperties(), req.getJavaMethod(), locale, timeZone, mediaType, req.isDebug() ? true : null, req.getContext().getResource()));
 			try (Closeable in = session.isReaderParser() ? getUnbufferedReader() : getInputStream()) {
 				T o = session.parse(in, cm);
 				if (schema != null)
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index 7be8ced..9a75f96 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -1232,6 +1232,17 @@ public final class RestRequest extends HttpServletRequestWrapper {
 	}
 
 	/**
+	 * Returns <jk>true</jk> if debug mode is enabled.
+	 *
+	 * Debug mode is enabled by simply adding <js>"?debug=true"</js> to the query string or adding a <code>Debug: true</code> header on the request.
+	 *
+	 * @return <jk>true</jk> if debug mode is enabled.
+	 */
+	public boolean isDebug() {
+		return debug;
+	}
+
+	/**
 	 * Request-level variable resolver session.
 	 *
 	 * <p>
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java
index 5344c10..ae76234 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java
@@ -69,7 +69,7 @@ public class DefaultHandler implements ResponseHandler {
 				}
 				p.append("mediaType", mediaType).append("characterEncoding", res.getCharacterEncoding());
 
-				SerializerSession session = s.createSession(new SerializerSessionArgs(p, req.getJavaMethod(), req.getLocale(), req.getHeaders().getTimeZone(), mediaType, req.getUriContext()));
+				SerializerSession session = s.createSession(new SerializerSessionArgs(p, req.getJavaMethod(), req.getLocale(), req.getHeaders().getTimeZone(), mediaType, req.isDebug() ? true : null, req.getUriContext()));
 
 				for (Map.Entry<String,String> h : session.getResponseHeaders().entrySet())
 					res.setHeader(h.getKey(), h.getValue());
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/MenuItemWidget.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/MenuItemWidget.java
index 06f9e72..d6b5f41 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/MenuItemWidget.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/MenuItemWidget.java
@@ -95,7 +95,7 @@ public abstract class MenuItemWidget extends Widget {
 		} else if (o instanceof CharSequence) {
 			sb.append((CharSequence)o);
 		} else {
-			SerializerSessionArgs args = new SerializerSessionArgs(req.getProperties(), null, req.getLocale(), null, null, req.getUriContext());
+			SerializerSessionArgs args = new SerializerSessionArgs(req.getProperties(), null, req.getLocale(), null, null, req.isDebug() ? true : null, req.getUriContext());
 			WriterSerializerSession session = HtmlSerializer.DEFAULT.createSession(args);
 			session.indent = 2;
 			session.serialize(o, sb);