Allow reuse of SerializerSession objects.

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

Branch: refs/heads/master
Commit: 8879750c6b768e61a1a5edcd872c519f56a5bbce
Parents: 7c785c3
Author: JamesBognar <[email protected]>
Authored: Sun Jul 16 16:36:20 2017 -0400
Committer: JamesBognar <[email protected]>
Committed: Fri Jul 21 12:53:59 2017 -0400

----------------------------------------------------------------------
 juneau-build.launch                             | 23 ++++++
 juneau-build.sh                                 | 16 +++++
 .../org/apache/juneau/jena/RdfSerializer.java   |  8 +--
 .../juneau/jena/RdfSerializerSession.java       |  8 +--
 .../org/apache/juneau/xml/XmlContentTest.java   | 21 +++---
 .../org/apache/juneau/csv/CsvSerializer.java    | 16 ++---
 .../apache/juneau/csv/CsvSerializerSession.java |  5 +-
 .../apache/juneau/html/HtmlDocSerializer.java   | 16 +++--
 .../juneau/html/HtmlDocSerializerSession.java   | 16 +----
 .../juneau/html/HtmlDocTemplateBasic.java       |  4 +-
 .../juneau/html/HtmlSchemaDocSerializer.java    |  8 +--
 .../org/apache/juneau/html/HtmlSerializer.java  |  8 +--
 .../juneau/html/HtmlSerializerSession.java      | 21 +++---
 .../juneau/html/HtmlStrippedDocSerializer.java  |  6 +-
 .../org/apache/juneau/jso/JsoSerializer.java    |  4 +-
 .../juneau/json/JsonSchemaSerializer.java       |  8 +--
 .../org/apache/juneau/json/JsonSerializer.java  |  9 ++-
 .../juneau/json/JsonSerializerSession.java      | 21 +++---
 .../juneau/msgpack/MsgPackSerializer.java       |  8 +--
 .../msgpack/MsgPackSerializerSession.java       | 23 +++---
 .../juneau/plaintext/PlainTextSerializer.java   |  4 +-
 .../serializer/OutputStreamSerializer.java      |  8 ++-
 .../apache/juneau/serializer/Serializer.java    | 61 +++++-----------
 .../juneau/serializer/SerializerOutput.java     | 36 ++++++++--
 .../juneau/serializer/SerializerSession.java    | 75 +-------------------
 .../juneau/serializer/WriterSerializer.java     | 10 +--
 .../apache/juneau/soap/SoapXmlSerializer.java   |  7 +-
 .../org/apache/juneau/uon/UonSerializer.java    |  8 +--
 .../apache/juneau/uon/UonSerializerSession.java | 20 +++---
 .../urlencoding/UrlEncodingSerializer.java      | 13 ++--
 .../UrlEncodingSerializerSession.java           |  6 +-
 .../org/apache/juneau/xml/XmlDocSerializer.java |  7 +-
 .../juneau/xml/XmlSchemaDocSerializer.java      |  7 +-
 .../apache/juneau/xml/XmlSchemaSerializer.java  | 19 ++---
 .../org/apache/juneau/xml/XmlSerializer.java    |  8 +--
 .../apache/juneau/xml/XmlSerializerSession.java | 20 +++---
 .../juneau/examples/rest/PhotosResource.java    |  4 +-
 .../apache/juneau/rest/jaxrs/BaseProvider.java  | 10 +--
 .../juneau/rest/test/AcceptCharsetResource.java |  4 +-
 .../rest/test/CharsetEncodingsResource.java     |  4 +-
 .../rest/test/DefaultContentTypesResource.java  |  4 +-
 .../apache/juneau/rest/test/GroupsResource.java |  4 +-
 .../juneau/rest/test/InheritanceResource.java   |  4 +-
 .../juneau/rest/test/NlsPropertyResource.java   |  4 +-
 .../juneau/rest/test/OnPostCallResource.java    |  4 +-
 .../juneau/rest/test/PropertiesResource.java    |  8 +--
 .../juneau/rest/test/SerializersResource.java   | 16 ++---
 .../juneau/rest/response/DefaultHandler.java    | 15 ++--
 48 files changed, 315 insertions(+), 324 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-build.launch
----------------------------------------------------------------------
diff --git a/juneau-build.launch b/juneau-build.launch
new file mode 100644
index 0000000..5b02ce6
--- /dev/null
+++ b/juneau-build.launch
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ 
***************************************************************************************************************************
+ * 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.  
                                            *
+ 
***************************************************************************************************************************
+-->
+<launchConfiguration 
type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
+<stringAttribute key="bad_container_name" value="/juneau-root/ju"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.ui.externaltools.launchGroup"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" 
value="${workspace_loc:/juneau-root/juneau-build.sh}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" 
value="${workspace_loc:/juneau-root}"/>
+</launchConfiguration>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-build.sh
----------------------------------------------------------------------
diff --git a/juneau-build.sh b/juneau-build.sh
new file mode 100755
index 0000000..87d068f
--- /dev/null
+++ b/juneau-build.sh
@@ -0,0 +1,16 @@
+# 
***************************************************************************************************************************
+# * 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. 
                                             *
+# 
***************************************************************************************************************************
+
+. ~/.profile
+set -e
+mvn clean install

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java 
b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
index 82cd176..30c5163 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
@@ -185,7 +185,7 @@ public class RdfSerializer extends WriterSerializer {
        }
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
 
                RdfSerializerSession s = (RdfSerializerSession)session;
 
@@ -210,7 +210,7 @@ public class RdfSerializer extends WriterSerializer {
                                r.addProperty(s.getRootProp(), "true");
                }
 
-               s.getRdfWriter().write(model, session.getWriter(), 
"http://unknown/";);
+               s.getRdfWriter().write(model, out.getWriter(), 
"http://unknown/";);
        }
 
        private RDFNode serializeAnything(RdfSerializerSession session, Object 
o, boolean isURI, ClassMeta<?> eType, 
@@ -449,8 +449,8 @@ public class RdfSerializer extends WriterSerializer {
        
//--------------------------------------------------------------------------------
 
        @Override /* Serializer */
-       public RdfSerializerSession createSession(Object output, ObjectMap op, 
Method javaMethod, Locale locale, 
+       public RdfSerializerSession createSession(ObjectMap op, Method 
javaMethod, Locale locale, 
                        TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
-               return new RdfSerializerSession(ctx, op, output, javaMethod, 
locale, timeZone, mediaType, uriContext);
+               return new RdfSerializerSession(ctx, op, javaMethod, locale, 
timeZone, mediaType, uriContext);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
 
b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
index 6595801..d7dabb8 100644
--- 
a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
+++ 
b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
@@ -21,7 +21,6 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.http.*;
-import org.apache.juneau.json.*;
 import org.apache.juneau.msgpack.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.xml.*;
@@ -57,9 +56,6 @@ public final class RdfSerializerSession extends 
SerializerSession {
         * @param ctx 
         *      The context creating this session object.
         *      The context contains all the configuration settings for this 
object.
-        * @param output 
-        *      The output object.  
-        *      See {@link JsonSerializerSession#getWriter()} for valid class 
types.
         * @param op 
         *      The override properties.
         *      These override any context properties defined in the context.
@@ -75,9 +71,9 @@ public final class RdfSerializerSession extends 
SerializerSession {
         *      The URI context.
         *      Identifies the current request URI used for resolution of URIs 
to absolute or root-relative form.
         */
-       protected RdfSerializerSession(RdfSerializerContext ctx, ObjectMap op, 
Object output, Method javaMethod, 
+       protected RdfSerializerSession(RdfSerializerContext ctx, ObjectMap op, 
Method javaMethod, 
                        Locale locale, TimeZone timeZone, MediaType mediaType, 
UriContext uriContext) {
-               super(ctx, op, output, javaMethod, locale, timeZone, mediaType, 
uriContext);
+               super(ctx, op, javaMethod, locale, timeZone, mediaType, 
uriContext);
                ObjectMap jenaSettings = new ObjectMap();
                jenaSettings.put("rdfXml.tab", isUseWhitespace() ? 2 : 0);
                jenaSettings.put("rdfXml.attributeQuoteChar", 
Character.toString(getQuoteChar()));

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java 
b/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
index 65e23e7..18f0ed6 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
@@ -21,6 +21,7 @@ import java.io.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.serializer.*;
 import org.apache.juneau.xml.annotation.*;
 import org.junit.*;
 
@@ -46,16 +47,18 @@ public class XmlContentTest {
                t.f2 = null;
 
                sw = new StringWriter();
-               session = s1.createSession(sw, new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null, null, null, null, 
null);
-               s1.serialize(session, t);
+               SerializerOutput out = new SerializerOutput(sw);
+               session = s1.createSession(new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null, null, null, null, 
null);
+               s1.serialize(session, out, t);
                r = sw.toString();
                assertEquals("<A f1='f1'>_x0000_</A>", r);
                t2 = p.parse(r, A.class);
                assertEqualObjects(t, t2);
 
                sw = new StringWriter();
-               session = s2.createSession(sw, new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null, null, null, null, 
null);
-               s2.serialize(session, t);
+               out = new SerializerOutput(sw);
+               session = s2.createSession(new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null, null, null, null, 
null);
+               s2.serialize(session, out, t);
                r = sw.toString();
                assertEquals("<A f1='f1'>_x0000_</A>\n", r);
                t2 = p.parse(r, A.class);
@@ -154,16 +157,18 @@ public class XmlContentTest {
                t.f2 = null;
 
                sw = new StringWriter();
-               session = s1.createSession(sw, new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null, null, null, null, 
null);
-               s1.serialize(session, t);
+               SerializerOutput out = new SerializerOutput(sw);
+               session = s1.createSession(new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null, null, null, null, 
null);
+               s1.serialize(session, out, t);
                r = sw.toString();
                assertEquals("<A f1='f1'>_x0000_</A>", r);
                t2 = p.parse(r, B.class);
                assertEqualObjects(t, t2);
 
                sw = new StringWriter();
-               session = s2.createSession(sw, new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null, null, null, null, 
null);
-               s2.serialize(session, t);
+               out = new SerializerOutput(sw);
+               session = s2.createSession(new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null, null, null, null, 
null);
+               s2.serialize(session, out, t);
                r = sw.toString();
                assertEquals("<A f1='f1'>_x0000_</A>\n", r);
                t2 = p.parse(r, B.class);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializer.java
index b010719..c9f2afc 100644
--- a/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializer.java
@@ -49,8 +49,8 @@ public final class CsvSerializer extends WriterSerializer {
        
//--------------------------------------------------------------------------------
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
-               Writer out = session.getWriter();
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
+               Writer w = out.getWriter();
                ClassMeta cm = session.getClassMetaForObject(o);
                Collection l = null;
                if (cm.isArray()) {
@@ -66,19 +66,19 @@ public final class CsvSerializer extends WriterSerializer {
                                int i = 0;
                                for (BeanPropertyMeta pm : 
bm.getPropertyMetas()) {
                                        if (i++ > 0)
-                                               out.append(',');
-                                       append(out, pm.getName());
+                                               w.append(',');
+                                       append(w, pm.getName());
                                }
-                               out.append('\n');
+                               w.append('\n');
                                for (Object o2 : l) {
                                        i = 0;
                                        BeanMap bean = session.toBeanMap(o2);
                                        for (BeanPropertyMeta pm : 
bm.getPropertyMetas()) {
                                                if (i++ > 0)
-                                                       out.append(',');
-                                               append(out, pm.get(bean, 
pm.getName()));
+                                                       w.append(',');
+                                               append(w, pm.get(bean, 
pm.getName()));
                                        }
-                                       out.append('\n');
+                                       w.append('\n');
                                }
                        }
                }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializerSession.java 
b/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializerSession.java
index c9fd758..6cb3e1b 100644
--- a/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializerSession.java
@@ -33,7 +33,6 @@ public final class CsvSerializerSession extends 
SerializerSession {
         * @param ctx
         *      The context creating this session object.
         *      The context contains all the configuration settings for this 
object.
-        * @param output The output object.
         * @param op
         *      The override properties.
         *      These override any context properties defined in the context.
@@ -48,8 +47,8 @@ public final class CsvSerializerSession extends 
SerializerSession {
         * @param uriContext The URI context.
         * Identifies the current request URI used for resolution of URIs to 
absolute or root-relative form.
         */
-       protected CsvSerializerSession(CsvSerializerContext ctx, ObjectMap op, 
Object output, Method javaMethod,
+       protected CsvSerializerSession(CsvSerializerContext ctx, ObjectMap op, 
Method javaMethod,
                        Locale locale, TimeZone timeZone, MediaType mediaType, 
UriContext uriContext) {
-               super(ctx, op, output, javaMethod, locale, timeZone, mediaType, 
uriContext);
+               super(ctx, op, javaMethod, locale, timeZone, mediaType, 
uriContext);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
index f1be67a..58ac1cd 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
@@ -68,16 +68,16 @@ public class HtmlDocSerializer extends 
HtmlStrippedDocSerializer {
        
//--------------------------------------------------------------------------------
 
        @Override /* Serializer */
-       public HtmlDocSerializerSession createSession(Object output, ObjectMap 
op, Method javaMethod, Locale locale,
+       public HtmlDocSerializerSession createSession(ObjectMap op, Method 
javaMethod, Locale locale,
                        TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
-               return new HtmlDocSerializerSession(ctx, op, output, 
javaMethod, locale, timeZone, mediaType, uriContext);
+               return new HtmlDocSerializerSession(ctx, op, javaMethod, 
locale, timeZone, mediaType, uriContext);
        }
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
 
                HtmlDocSerializerSession s = (HtmlDocSerializerSession)session;
-               HtmlWriter w = s.getWriter();
+               HtmlWriter w = s.getHtmlWriter(out);
                HtmlDocTemplate t = s.getTemplate();
 
                w.sTag("html").nl(0);
@@ -91,13 +91,15 @@ public class HtmlDocSerializer extends 
HtmlStrippedDocSerializer {
        }
 
        /**
-        * Calls the parent {@link #doSerialize(SerializerSession, Object)} 
method which invokes just the HTML serializer.
+        * Calls the parent {@link #doSerialize(SerializerSession, 
SerializerOutput, Object)} method which invokes just the HTML serializer.
         *
         * @param session The serializer session.
+        * @param out
+        *      Where to send the output from the serializer.
         * @param o The object being serialized.
         * @throws Exception
         */
-       public void parentSerialize(SerializerSession session, Object o) throws 
Exception {
-               super.doSerialize(session, o);
+       public void parentSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
+               super.doSerialize(session, out, o);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
index 072bbd8..0b8179f 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
@@ -20,7 +20,6 @@ import java.util.*;
 import org.apache.juneau.*;
 import org.apache.juneau.http.*;
 import org.apache.juneau.internal.*;
-import org.apache.juneau.json.*;
 import org.apache.juneau.serializer.*;
 
 /**
@@ -45,9 +44,6 @@ public final class HtmlDocSerializerSession extends 
HtmlSerializerSession {
         * @param ctx
         *      The context creating this session object.
         *      The context contains all the configuration settings for this 
object.
-        * @param output
-        *      The output object.
-        *      See {@link JsonSerializerSession#getWriter()} for valid class 
types.
         * @param op
         *      The override properties.
         *      These override any context properties defined in the context.
@@ -63,9 +59,9 @@ public final class HtmlDocSerializerSession extends 
HtmlSerializerSession {
         *      The URI context.
         *      Identifies the current request URI used for resolution of URIs 
to absolute or root-relative form.
         */
-       protected HtmlDocSerializerSession(HtmlDocSerializerContext ctx, 
ObjectMap op, Object output, Method javaMethod,
+       protected HtmlDocSerializerSession(HtmlDocSerializerContext ctx, 
ObjectMap op, Method javaMethod,
                        Locale locale, TimeZone timeZone, MediaType mediaType, 
UriContext uriContext) {
-               super(ctx, op, output, javaMethod, locale, timeZone, mediaType, 
uriContext);
+               super(ctx, op, javaMethod, locale, timeZone, mediaType, 
uriContext);
                if (op == null || op.isEmpty()) {
                        header = ctx.header;
                        nav = ctx.nav;
@@ -220,12 +216,4 @@ public final class HtmlDocSerializerSession extends 
HtmlSerializerSession {
        public final String getNoResultsMessage() {
                return noResultsMessage;
        }
-
-       @Override /* XmlSerializerSession */
-       public HtmlWriter getWriter() throws Exception {
-               Object output = getOutput();
-               if (output instanceof HtmlWriter)
-                       return (HtmlWriter)output;
-               return new HtmlWriter(super.getWriter(), isUseWhitespace(), 
getMaxIndent(), isTrimStrings(), getQuoteChar(), getUriResolver());
-       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java
index a2101e7..126097b 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.html;
 
 import org.apache.juneau.internal.*;
+import org.apache.juneau.serializer.*;
 
 /**
  * A basic template for the HTML doc serializer.
@@ -158,7 +159,8 @@ public class HtmlDocTemplateBasic implements 
HtmlDocTemplate {
                                w.append(6, m).nl(6);
                } else {
                        session.indent = 6;
-                       s.parentSerialize(session, o);
+                       w.flush();
+                       s.parentSerialize(session, new SerializerOutput(w), o);
                }
 
                w.ie(5).eTag("div").nl(5);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
index 0c50698..5d95e3f 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
@@ -78,15 +78,15 @@ public final class HtmlSchemaDocSerializer extends 
HtmlDocSerializer {
        }
 
        @Override /* Serializer */
-       public HtmlDocSerializerSession createSession(Object output, ObjectMap 
op, Method javaMethod, Locale locale, TimeZone timeZone, MediaType mediaType, 
UriContext uriContext) {
-               return new HtmlDocSerializerSession(ctx, op, output, 
javaMethod, locale, timeZone, mediaType, uriContext);
+       public HtmlDocSerializerSession createSession(ObjectMap op, Method 
javaMethod, Locale locale, TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
+               return new HtmlDocSerializerSession(ctx, op, javaMethod, 
locale, timeZone, mediaType, uriContext);
        }
 
        @Override /* ISchemaSerializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
                HtmlSerializerSession s = (HtmlSerializerSession)session;
                ObjectMap schema = getSchema(s, 
session.getClassMetaForObject(o), "root", null);
-               super.doSerialize(s, schema);
+               super.doSerialize(s, out, schema);
        }
 
        /*

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
index 0bacd20..47ba3e8 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
@@ -797,14 +797,14 @@ public class HtmlSerializer extends XmlSerializer {
        
//--------------------------------------------------------------------------------
 
        @Override /* Serializer */
-       public HtmlSerializerSession createSession(Object output, ObjectMap op, 
Method javaMethod, Locale locale,
+       public HtmlSerializerSession createSession(ObjectMap op, Method 
javaMethod, Locale locale,
                        TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
-               return new HtmlSerializerSession(ctx, op, output, javaMethod, 
locale, timeZone, mediaType, uriContext);
+               return new HtmlSerializerSession(ctx, op, javaMethod, locale, 
timeZone, mediaType, uriContext);
        }
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
                HtmlSerializerSession s = (HtmlSerializerSession)session;
-               doSerialize(s, o, s.getWriter());
+               doSerialize(s, o, s.getHtmlWriter(out));
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
index 8a4f27f..6de1afc 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
@@ -22,7 +22,7 @@ import java.util.regex.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.http.*;
-import org.apache.juneau.json.*;
+import org.apache.juneau.serializer.*;
 import org.apache.juneau.xml.*;
 
 /**
@@ -54,7 +54,6 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
         * @param ctx
         *      The context creating this session object.
         *      The context contains all the configuration settings for this 
object.
-        * @param output The output object.  See {@link 
JsonSerializerSession#getWriter()} for valid class types.
         * @param op
         *      The override properties.
         *      These override any context properties defined in the context.
@@ -70,9 +69,9 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
         *      The URI context.
         *      Identifies the current request URI used for resolution of URIs 
to absolute or root-relative form.
         */
-       protected HtmlSerializerSession(HtmlSerializerContext ctx, ObjectMap 
op, Object output, Method javaMethod,
+       protected HtmlSerializerSession(HtmlSerializerContext ctx, ObjectMap 
op, Method javaMethod,
                        Locale locale, TimeZone timeZone, MediaType mediaType, 
UriContext uriContext) {
-               super(ctx, op, output, javaMethod, locale, timeZone, mediaType, 
uriContext);
+               super(ctx, op, javaMethod, locale, timeZone, mediaType, 
uriContext);
                String labelParameter;
                if (op == null || op.isEmpty()) {
                        anchorText = Enum.valueOf(AnchorText.class, 
ctx.uriAnchorText);
@@ -92,12 +91,18 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                labelPattern = Pattern.compile("[\\?\\&]" + 
Pattern.quote(labelParameter) + "=([^\\&]*)");
        }
 
-       @Override /* XmlSerializerSession */
-       public HtmlWriter getWriter() throws Exception {
-               Object output = getOutput();
+       /**
+        * Converts the specified output target object to an {@link HtmlWriter}.
+        *
+        * @param out The output target object.
+        * @return The output target object wrapped in an {@link HtmlWriter}.
+        * @throws Exception
+        */
+       public HtmlWriter getHtmlWriter(SerializerOutput out) throws Exception {
+               Object output = out.getRawOutput();
                if (output instanceof HtmlWriter)
                        return (HtmlWriter)output;
-               return new HtmlWriter(super.getWriter(), isUseWhitespace(), 
getMaxIndent(), isTrimStrings(), getQuoteChar(),
+               return new HtmlWriter(out.getWriter(), isUseWhitespace(), 
getMaxIndent(), isTrimStrings(), getQuoteChar(),
                        getUriResolver());
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializer.java
 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializer.java
index 83552c2..938fecf 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializer.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializer.java
@@ -52,14 +52,14 @@ public class HtmlStrippedDocSerializer extends 
HtmlSerializer {
        
//---------------------------------------------------------------------------
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
                HtmlSerializerSession s = (HtmlSerializerSession)session;
-               HtmlWriter w = s.getWriter();
+               HtmlWriter w = s.getHtmlWriter(out);
                if (o == null
                        || (o instanceof Collection && 
((Collection<?>)o).size() == 0)
                        || (o.getClass().isArray() && Array.getLength(o) == 0))
                        w.sTag(1, "p").append("No Results").eTag("p").nl(1);
                else
-                       super.doSerialize(s, o);
+                       super.doSerialize(s, out, o);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/jso/JsoSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/jso/JsoSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/jso/JsoSerializer.java
index 92cde21..6ea9e43 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jso/JsoSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/jso/JsoSerializer.java
@@ -54,8 +54,8 @@ public class JsoSerializer extends OutputStreamSerializer {
        
//--------------------------------------------------------------------------------
 
        @Override /* OutputStreamSerializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
-               ObjectOutputStream oos = new 
ObjectOutputStream(session.getOutputStream());
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
+               ObjectOutputStream oos = new 
ObjectOutputStream(out.getOutputStream());
                oos.writeObject(o);
                oos.flush();
                oos.close();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
index f4fda17..9829016 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
@@ -74,16 +74,16 @@ public final class JsonSchemaSerializer extends 
JsonSerializer {
        
//--------------------------------------------------------------------------------
 
        @Override /* Serializer */
-       public JsonSerializerSession createSession(Object output, ObjectMap op, 
Method javaMethod, Locale locale,
+       public JsonSerializerSession createSession(ObjectMap op, Method 
javaMethod, Locale locale,
                        TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
-               return new JsonSerializerSession(ctx, op, output, javaMethod, 
locale, timeZone, mediaType, uriContext);
+               return new JsonSerializerSession(ctx, op, javaMethod, locale, 
timeZone, mediaType, uriContext);
        }
 
        @Override /* JsonSerializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
                JsonSerializerSession s = (JsonSerializerSession)session;
                ObjectMap schema = getSchema(s, 
session.getClassMetaForObject(o), "root", null);
-               serializeAnything(s, s.getWriter(), schema, 
s.getExpectedRootType(o), "root", null);
+               serializeAnything(s, s.getJsonWriter(out), schema, 
s.getExpectedRootType(o), "root", null);
        }
 
        /*

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
index 5c6449e..82edd79 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
@@ -404,20 +404,19 @@ public class JsonSerializer extends WriterSerializer {
                return schemaSerializer;
        }
 
-
        
//--------------------------------------------------------------------------------
        // Entry point methods
        
//--------------------------------------------------------------------------------
 
        @Override /* Serializer */
-       public JsonSerializerSession createSession(Object output, ObjectMap op, 
Method javaMethod, Locale locale,
+       public JsonSerializerSession createSession(ObjectMap op, Method 
javaMethod, Locale locale,
                        TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
-               return new JsonSerializerSession(ctx, op, output, javaMethod, 
locale, timeZone, mediaType, uriContext);
+               return new JsonSerializerSession(ctx, op, javaMethod, locale, 
timeZone, mediaType, uriContext);
        }
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
                JsonSerializerSession s = (JsonSerializerSession)session;
-               serializeAnything(s, s.getWriter(), o, 
s.getExpectedRootType(o), "root", null);
+               serializeAnything(s, s.getJsonWriter(out), o, 
s.getExpectedRootType(o), "root", null);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
index a4beae0..2808f59 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
@@ -40,9 +40,6 @@ public final class JsonSerializerSession extends 
SerializerSession {
         * @param ctx
         *      The context creating this session object.
         *      The context contains all the configuration settings for this 
object.
-        * @param output
-        *      The output object.
-        *      See {@link JsonSerializerSession#getWriter()} for valid class 
types.
         * @param op
         *      The override properties.
         *      These override any context properties defined in the context.
@@ -58,9 +55,9 @@ public final class JsonSerializerSession extends 
SerializerSession {
         *      The URI context.
         *      Identifies the current request URI used for resolution of URIs 
to absolute or root-relative form.
         */
-       protected JsonSerializerSession(JsonSerializerContext ctx, ObjectMap 
op, Object output, Method javaMethod,
+       protected JsonSerializerSession(JsonSerializerContext ctx, ObjectMap 
op, Method javaMethod,
                        Locale locale, TimeZone timeZone, MediaType mediaType, 
UriContext uriContext) {
-               super(ctx, op, output, javaMethod, locale, timeZone, mediaType, 
uriContext);
+               super(ctx, op, javaMethod, locale, timeZone, mediaType, 
uriContext);
                if (op == null || op.isEmpty()) {
                        simpleMode = ctx.simpleMode;
                        escapeSolidus = ctx.escapeSolidus;
@@ -100,12 +97,18 @@ public final class JsonSerializerSession extends 
SerializerSession {
                return addBeanTypeProperties;
        }
 
-       @Override /* ParserSession */
-       public JsonWriter getWriter() throws Exception {
-               Object output = getOutput();
+       /**
+        * Converts the specified output target object to an {@link JsonWriter}.
+        *
+        * @param out The output target object.
+        * @return The output target object wrapped in an {@link JsonWriter}.
+        * @throws Exception
+        */
+       public JsonWriter getJsonWriter(SerializerOutput out) throws Exception {
+               Object output = out.getRawOutput();
                if (output instanceof JsonWriter)
                        return (JsonWriter)output;
-               return new JsonWriter(super.getWriter(), isUseWhitespace(), 
getMaxIndent(), isEscapeSolidus(), getQuoteChar(),
+               return new JsonWriter(out.getWriter(), isUseWhitespace(), 
getMaxIndent(), isEscapeSolidus(), getQuoteChar(),
                        isSimpleMode(), isTrimStrings(), getUriResolver());
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
index b301fa0..ad5ed97 100644
--- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
@@ -218,14 +218,14 @@ public class MsgPackSerializer extends 
OutputStreamSerializer {
        
//--------------------------------------------------------------------------------
 
        @Override /* Serializer */
-       public MsgPackSerializerSession createSession(Object output, ObjectMap 
op, Method javaMethod, Locale locale,
+       public MsgPackSerializerSession createSession(ObjectMap op, Method 
javaMethod, Locale locale,
                        TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
-               return new MsgPackSerializerSession(ctx, op, output, 
javaMethod, locale, timeZone, mediaType, uriContext);
+               return new MsgPackSerializerSession(ctx, op, javaMethod, 
locale, timeZone, mediaType, uriContext);
        }
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
                MsgPackSerializerSession s = (MsgPackSerializerSession)session;
-               serializeAnything(s, s.getOutputStream(), o, 
s.getExpectedRootType(o), "root", null);
+               serializeAnything(s, s.getMsgPackOutputStream(out), o, 
s.getExpectedRootType(o), "root", null);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
 
b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
index 860989a..f632c84 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
@@ -19,7 +19,6 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.http.*;
-import org.apache.juneau.json.*;
 import org.apache.juneau.serializer.*;
 
 /**
@@ -39,9 +38,6 @@ public final class MsgPackSerializerSession extends 
SerializerSession {
         * @param ctx
         *      The context creating this session object.
         *      The context contains all the configuration settings for this 
object.
-        * @param output
-        *      The output object.
-        *      See {@link JsonSerializerSession#getOutputStream()} for valid 
class types.
         * @param op
         *      The override properties.
         *      These override any context properties defined in the context.
@@ -57,9 +53,9 @@ public final class MsgPackSerializerSession extends 
SerializerSession {
         *      The URI context.
         *      Identifies the current request URI used for resolution of URIs 
to absolute or root-relative form.
         */
-       protected MsgPackSerializerSession(MsgPackSerializerContext ctx, 
ObjectMap op, Object output, Method javaMethod,
+       protected MsgPackSerializerSession(MsgPackSerializerContext ctx, 
ObjectMap op, Method javaMethod,
                        Locale locale, TimeZone timeZone, MediaType mediaType, 
UriContext uriContext) {
-               super(ctx, op, output, javaMethod, locale, timeZone, mediaType, 
uriContext);
+               super(ctx, op, javaMethod, locale, timeZone, mediaType, 
uriContext);
                if (op == null || op.isEmpty()) {
                        addBeanTypeProperties = ctx.addBeanTypeProperties;
                } else {
@@ -77,11 +73,18 @@ public final class MsgPackSerializerSession extends 
SerializerSession {
                return addBeanTypeProperties;
        }
 
-       @Override /*SerializerSession */
-       public MsgPackOutputStream getOutputStream() throws Exception {
-               Object output = getOutput();
+       /**
+        * Converts the specified output target object to an {@link 
MsgPackOutputStream}.
+        *
+        * @param out The output target object.
+        * @return The output target object wrapped in an {@link 
MsgPackOutputStream}.
+        * @throws Exception
+        */
+       @SuppressWarnings("static-method")
+       public MsgPackOutputStream getMsgPackOutputStream(SerializerOutput out) 
throws Exception {
+               Object output = out.getRawOutput();
                if (output instanceof MsgPackOutputStream)
                        return (MsgPackOutputStream)output;
-               return new MsgPackOutputStream(super.getOutputStream());
+               return new MsgPackOutputStream(out.getOutputStream());
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
 
b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
index 2dd95b6..cf0975c 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
@@ -70,7 +70,7 @@ public class PlainTextSerializer extends WriterSerializer {
        
//--------------------------------------------------------------------------------
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
-               session.getWriter().write(o == null ? "null" : 
session.convertToType(o, String.class));
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
+               out.getWriter().write(o == null ? "null" : 
session.convertToType(o, String.class));
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java
 
b/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java
index 9b86b70..8c743b6 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java
@@ -27,7 +27,7 @@ import org.apache.juneau.annotation.*;
  * This class is typically the parent class of all byte-based serializers.
  * It has 1 abstract method to implement...
  * <ul>
- *     <li>{@link #doSerialize(SerializerSession, Object)}
+ *     <li>{@link #doSerialize(SerializerSession, SerializerOutput, Object)}
  * </ul>
  *
  * <h6 class='topic'>@Produces annotation</h6>
@@ -69,7 +69,8 @@ public abstract class OutputStreamSerializer extends 
Serializer {
        @Override
        public final byte[] serialize(Object o) throws SerializeException {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-               serialize(createSession(baos), o);
+               SerializerOutput out = new SerializerOutput(baos);
+               serialize(createSession(), out, o);
                return baos.toByteArray();
        }
 
@@ -82,7 +83,8 @@ public abstract class OutputStreamSerializer extends 
Serializer {
         */
        public final String serializeToHex(Object o) throws SerializeException {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-               serialize(createSession(baos), o);
+               SerializerOutput out = new SerializerOutput(baos);
+               serialize(createSession(), out, o);
                return toHex(baos.toByteArray());
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java 
b/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
index 6e1d9d0..bb0e623 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
@@ -90,13 +90,15 @@ public abstract class Serializer extends CoreObject {
         * This method should NOT close the context object.
         *
         * @param session
-        *      The serializer session object return by {@link 
#createSession(Object, ObjectMap, Method, Locale, TimeZone,
+        *      The serializer session object return by {@link 
#createSession(ObjectMap, Method, Locale, TimeZone,
         *      MediaType, UriContext)}.
-        *      If <jk>null</jk>, session is created using {@link 
#createSession(Object)}.
+        *      If <jk>null</jk>, session is created using {@link 
#createSession()}.
+        * @param out
+        *      Where to send the output from the serializer.
         * @param o The object to serialize.
         * @throws Exception If thrown from underlying stream, or if the input 
contains a syntax error or is malformed.
         */
-       protected abstract void doSerialize(SerializerSession session, Object 
o) throws Exception;
+       protected abstract void doSerialize(SerializerSession session, 
SerializerOutput out, Object o) throws Exception;
 
        /**
         * Shortcut method for serializing objects directly to either a 
<code>String</code> or <code><jk>byte</jk>[]</code>
@@ -119,15 +121,17 @@ public abstract class Serializer extends CoreObject {
         * Serialize the specified object using the specified session.
         *
         * @param session
-        *      The serializer session object return by {@link 
#createSession(Object, ObjectMap, Method, Locale, TimeZone,
+        *      The serializer session object return by {@link 
#createSession(ObjectMap, Method, Locale, TimeZone,
         *      MediaType, UriContext)}.
-        *      If <jk>null</jk>, session is created using {@link 
#createSession(Object)}.
+        *      If <jk>null</jk>, session is created using {@link 
#createSession()}.
+        * @param out
+        *      Where to send the output from the serializer.
         * @param o The object to serialize.
         * @throws SerializeException If a problem occurred trying to convert 
the output.
         */
-       public final void serialize(SerializerSession session, Object o) throws 
SerializeException {
+       public final void serialize(SerializerSession session, SerializerOutput 
out, Object o) throws SerializeException {
                try {
-                       doSerialize(session, o);
+                       doSerialize(session, out, o);
                } catch (SerializeException e) {
                        throw e;
                } catch (StackOverflowError e) {
@@ -164,8 +168,9 @@ public abstract class Serializer extends CoreObject {
         * @throws SerializeException If a problem occurred trying to convert 
the output.
         */
        public final void serialize(Object o, Object output) throws 
SerializeException {
-               SerializerSession session = createSession(output);
-               serialize(session, o);
+               SerializerSession session = createSession();
+               SerializerOutput out = new SerializerOutput(output);
+               serialize(session, out, o);
        }
 
        /**
@@ -175,20 +180,6 @@ public abstract class Serializer extends CoreObject {
         * It's up to implementers to decide what the session object looks 
like, although typically it's going to be a
         * subclass of {@link SerializerSession}.
         *
-        * @param output
-        *      The output object.
-        *      <br>Character-based serializers can handle the following output 
class types:
-        *      <ul>
-        *              <li>{@link Writer}
-        *              <li>{@link OutputStream} - Output will be written as 
UTF-8 encoded stream.
-        *              <li>{@link File} - Output will be written as 
system-default encoded stream.
-        *              <li>{@link StringBuilder} - Output will be written to 
the specified string builder.
-        *      </ul>
-        *      <br>Stream-based serializers can handle the following output 
class types:
-        *      <ul>
-        *              <li>{@link OutputStream}
-        *              <li>{@link File}
-        *      </ul>
         * @param op Optional additional properties.
         * @param javaMethod
         *      Java method that invoked this serializer.
@@ -206,9 +197,9 @@ public abstract class Serializer extends CoreObject {
         *      Identifies the current request URI used for resolution of URIs 
to absolute or root-relative form.
         * @return The new session.
         */
-       public SerializerSession createSession(Object output, ObjectMap op, 
Method javaMethod, Locale locale,
+       public SerializerSession createSession(ObjectMap op, Method javaMethod, 
Locale locale,
                        TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
-               return new SerializerSession(ctx, op, output, javaMethod, 
locale, timeZone, mediaType, uriContext);
+               return new SerializerSession(ctx, op, javaMethod, locale, 
timeZone, mediaType, uriContext);
        }
 
        /**
@@ -217,24 +208,10 @@ public abstract class Serializer extends CoreObject {
         * <p>
         * Equivalent to calling <code>createSession(<jk>null</jk>, 
<jk>null</jk>)</code>.
         *
-        * @param output
-        *      The output object.
-        *      <br>Character-based serializers can handle the following output 
class types:
-        *      <ul>
-        *              <li>{@link Writer}
-        *              <li>{@link OutputStream} - Output will be written as 
UTF-8 encoded stream.
-        *              <li>{@link File} - Output will be written as 
system-default encoded stream.
-        *              <li>{@link StringBuilder} - Output will be written to 
the specified string builder.
-        *      </ul>
-        *      <br>Stream-based serializers can handle the following output 
class types:
-        *      <ul>
-        *              <li>{@link OutputStream}
-        *              <li>{@link File}
-        *      </ul>
         * @return The new session.
         */
-       protected SerializerSession createSession(Object output) {
-               return createSession(output, null, null, null, null, 
getPrimaryMediaType(), null);
+       protected SerializerSession createSession() {
+               return createSession(null, null, null, null, 
getPrimaryMediaType(), null);
        }
 
        /**
@@ -296,7 +273,7 @@ public abstract class Serializer extends CoreObject {
         * or client).
         *
         * @param properties
-        *      Optional run-time properties (the same that are passed to 
{@link WriterSerializer#doSerialize(SerializerSession, Object)}.
+        *      Optional run-time properties (the same that are passed to 
{@link WriterSerializer#doSerialize(SerializerSession, SerializerOutput, 
Object)}.
         *      Can be <jk>null</jk>.
         * @return
         *      The HTTP headers to set on HTTP requests.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerOutput.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerOutput.java 
b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerOutput.java
index f138322..8cc9cc0 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerOutput.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerOutput.java
@@ -41,16 +41,31 @@ import org.apache.juneau.internal.*;
 public class SerializerOutput {
 
        private final Object output;
+       private final boolean autoClose;
        private OutputStream outputStream;
        private Writer writer, flushOnlyWriter;
 
        /**
         * Constructor.
         *
+        * <p>
+        * Equivalent to calling <code>SerializerOutput(output, 
<jk>true</jk>);</code>.
+        *
         * @param output The object to pipe the serializer output to.
         */
        public SerializerOutput(Object output) {
+               this(output, true);
+       }
+
+       /**
+        * Constructor.
+        *
+        * @param output The object to pipe the serializer output to.
+        * @param autoClose Close the stream or writer at the end of the 
session.
+        */
+       public SerializerOutput(Object output, boolean autoClose) {
                this.output = output;
+               this.autoClose = autoClose;
        }
 
        /**
@@ -137,12 +152,21 @@ public class SerializerOutput {
         */
        public void close() {
                try {
-                       if (outputStream != null)
-                               outputStream.close();
-                       if (flushOnlyWriter != null)
-                               flushOnlyWriter.flush();
-                       if (writer != null)
-                               writer.close();
+                       if (! autoClose) {
+                               if (outputStream != null)
+                                       outputStream.flush();
+                               if (flushOnlyWriter != null)
+                                       flushOnlyWriter.flush();
+                               if (writer != null)
+                                       writer.flush();
+                       } else {
+                               if (outputStream != null)
+                                       outputStream.close();
+                               if (flushOnlyWriter != null)
+                                       flushOnlyWriter.flush();
+                               if (writer != null)
+                                       writer.close();
+                       }
                } catch (IOException e) {
                        throw new BeanRuntimeException(e);
                }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java 
b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index 6da8b9d..ade91df 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -16,7 +16,6 @@ import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.serializer.SerializerContext.*;
 
-import java.io.*;
 import java.lang.reflect.*;
 import java.text.*;
 import java.util.*;
@@ -69,7 +68,6 @@ public class SerializerSession extends BeanSession {
        private final LinkedList<StackElement> stack = new 
LinkedList<StackElement>();  // Contains the current objects in the current 
branch of the model.
        private boolean isBottom;                                               
        // If 'true', then we're at a leaf in the model (i.e. a String, Number, 
Boolean, or null).
        private final Method javaMethod;                                        
        // Java method that invoked this serializer.
-       private SerializerOutput output;
        private BeanPropertyMeta currentProperty;
        private ClassMeta<?> currentClass;
        private final SerializerListener listener;
@@ -81,19 +79,6 @@ public class SerializerSession extends BeanSession {
         * @param ctx
         *      The context creating this session object.
         *      The context contains all the configuration settings for this 
object.
-        * @param output
-        *      The output object.
-        *      <br>Character-based serializers can handle the following output 
class types:
-        *      <ul>
-        *              <li>{@link Writer}
-        *              <li>{@link OutputStream} - Output will be written as 
UTF-8 encoded stream.
-        *              <li>{@link File} - Output will be written as 
system-default encoded stream.
-        *      </ul>
-        *      <br>Stream-based serializers can handle the following output 
class types:
-        *      <ul>
-        *              <li>{@link OutputStream}
-        *              <li>{@link File}
-        *      </ul>
         * @param op
         *      The override properties.
         *      These override any context properties defined in the context.
@@ -109,11 +94,10 @@ public class SerializerSession extends BeanSession {
         *      The URI context.
         *      Identifies the current request URI used for resolution of URIs 
to absolute or root-relative form.
         */
-       public SerializerSession(SerializerContext ctx, ObjectMap op, Object 
output, Method javaMethod, Locale locale,
+       public SerializerSession(SerializerContext ctx, ObjectMap op, Method 
javaMethod, Locale locale,
                        TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
                super(ctx, op, locale, timeZone, mediaType);
                this.javaMethod = javaMethod;
-               this.output = new SerializerOutput(output);
                UriResolution uriResolution;
                UriRelativity uriRelativity;
                Class<?> listenerClass;
@@ -170,57 +154,6 @@ public class SerializerSession extends BeanSession {
        }
 
        /**
-        * Wraps the specified output object inside an output stream.
-        *
-        * <p>
-        * Subclasses can override this method to implement their own 
specialized output streams.
-        *
-        * <p>
-        * This method can be used if the output object is any of the following 
class types:
-        * <ul>
-        *      <li>{@link OutputStream}
-        *      <li>{@link File}
-        * </ul>
-        *
-        * @return The output object wrapped in an output stream.
-        * @throws Exception If object could not be converted to an output 
stream.
-        */
-       public OutputStream getOutputStream() throws Exception {
-               return output.getOutputStream();
-       }
-
-
-       /**
-        * Wraps the specified output object inside a writer.
-        *
-        * <p>
-        * Subclasses can override this method to implement their own 
specialized writers.
-        *
-        * <p>
-        * This method can be used if the output object is any of the following 
class types:
-        * <ul>
-        *      <li>{@link Writer}
-        *      <li>{@link OutputStream} - Output will be written as UTF-8 
encoded stream.
-        *      <li>{@link File} - Output will be written as system-default 
encoded stream.
-        * </ul>
-        *
-        * @return The output object wrapped in a Writer.
-        * @throws Exception If object could not be converted to a writer.
-        */
-       public Writer getWriter() throws Exception {
-               return output.getWriter();
-       }
-
-       /**
-        * Returns the raw output object passed into this session.
-        *
-        * @return The raw output object passed into this session.
-        */
-       protected Object getOutput() {
-               return output.getRawOutput();
-       }
-
-       /**
         * Sets the current bean property being serialized for proper error 
messages.
         *
         * @param currentProperty The current property being serialized.
@@ -682,11 +615,7 @@ public class SerializerSession extends BeanSession {
 
        @Override
        public boolean close() {
-               if (super.close()) {
-                       output.close();
-                       return true;
-               }
-               return false;
+               return super.close();
        }
 
        private static class StackElement {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializer.java
index e80cb58..fc782d7 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializer.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializer.java
@@ -30,9 +30,9 @@ import org.apache.juneau.utils.*;
  * It has 2 abstract methods to implement...
  * <ul class='spaced-list'>
  *     <li>
- *             {@link #createSession(Object, ObjectMap, Method, Locale, 
TimeZone, MediaType, UriContext)}
+ *             {@link #createSession(ObjectMap, Method, Locale, TimeZone, 
MediaType, UriContext)}
  *     <li>
- *             {@link #doSerialize(SerializerSession, Object)}
+ *             {@link #doSerialize(SerializerSession, SerializerOutput, 
Object)}
  * </ul>
  *
  * <h6 class='topic'>@Produces annotation</h6>
@@ -74,7 +74,8 @@ public abstract class WriterSerializer extends Serializer {
        @Override
        public final String serialize(Object o) throws SerializeException {
                StringWriter w = new StringWriter();
-               serialize(createSession(w), o);
+               SerializerOutput out = new SerializerOutput(w);
+               serialize(createSession(), out, o);
                return w.toString();
        }
 
@@ -90,7 +91,8 @@ public abstract class WriterSerializer extends Serializer {
        public final String toString(Object o) {
                try {
                        StringWriter w = new StringWriter();
-                       serialize(createSession(w), o);
+                       SerializerOutput out = new SerializerOutput(w);
+                       serialize(createSession(), out, o);
                        return w.toString();
                } catch (Exception e) {
                        throw new RuntimeException(e);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializer.java
index 14cb23b..c9053a4 100644
--- a/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializer.java
@@ -59,9 +59,9 @@ public final class SoapXmlSerializer extends XmlSerializer {
        
//--------------------------------------------------------------------------------
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
                XmlSerializerSession s = (XmlSerializerSession)session;
-               XmlWriter w = s.getWriter();
+               XmlWriter w = s.getXmlWriter(out);
                w.append("<?xml")
                        .attr("version", "1.0")
                        .attr("encoding", "UTF-8")
@@ -71,7 +71,8 @@ public final class SoapXmlSerializer extends XmlSerializer {
                        .appendln(">");
                w.sTag(1, "soap", "Body").nl(1);
                s.indent += 2;
-               super.doSerialize(s, o);
+               w.flush();
+               super.doSerialize(s, out, o);
                w.ie(1).eTag("soap", "Body").nl(1);
                w.eTag("soap", "Envelope").nl(0);
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializer.java
index c910bab..7d5c100 100644
--- a/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializer.java
@@ -390,14 +390,14 @@ public class UonSerializer extends WriterSerializer {
        
//--------------------------------------------------------------------------------
 
        @Override /* Serializer */
-       public UonSerializerSession createSession(Object output, ObjectMap op, 
Method javaMethod, Locale locale,
+       public UonSerializerSession createSession(ObjectMap op, Method 
javaMethod, Locale locale,
                        TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
-               return new UonSerializerSession(ctx, null, op, output, 
javaMethod, locale, timeZone, mediaType, uriContext);
+               return new UonSerializerSession(ctx, null, op, javaMethod, 
locale, timeZone, mediaType, uriContext);
        }
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
                UonSerializerSession s = (UonSerializerSession)session;
-               serializeAnything(s, s.getWriter(), o, 
s.getExpectedRootType(o), "root", null);
+               serializeAnything(s, s.getUonWriter(out), o, 
s.getExpectedRootType(o), "root", null);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializerSession.java 
b/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
index df88809..67c50c5 100644
--- a/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
@@ -20,7 +20,6 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.http.*;
-import org.apache.juneau.json.*;
 import org.apache.juneau.serializer.*;
 
 /**
@@ -43,7 +42,6 @@ public class UonSerializerSession extends SerializerSession {
         *      The context creating this session object.
         *      The context contains all the configuration settings for this 
object.
         * @param encode Override the {@link 
UonSerializerContext#UON_encodeChars} setting.
-        * @param output The output object.  See {@link 
JsonSerializerSession#getWriter()} for valid class types.
         * @param op
         *      The override properties.
         *      These override any context properties defined in the context.
@@ -59,9 +57,9 @@ public class UonSerializerSession extends SerializerSession {
         *      The URI context.
         *      Identifies the current request URI used for resolution of URIs 
to absolute or root-relative form.
         */
-       protected UonSerializerSession(UonSerializerContext ctx, Boolean 
encode, ObjectMap op, Object output,
+       protected UonSerializerSession(UonSerializerContext ctx, Boolean 
encode, ObjectMap op,
                        Method javaMethod, Locale locale, TimeZone timeZone, 
MediaType mediaType, UriContext uriContext) {
-               super(ctx, op, output, javaMethod, locale, timeZone, mediaType, 
uriContext);
+               super(ctx, op, javaMethod, locale, timeZone, mediaType, 
uriContext);
                if (op == null || op.isEmpty()) {
                        encodeChars = encode == null ? ctx.encodeChars : encode;
                        addBeanTypeProperties = ctx.addBeanTypeProperties;
@@ -101,11 +99,17 @@ public class UonSerializerSession extends 
SerializerSession {
                return plainTextParams;
        }
 
-       @Override /* SerializerSession */
-       public final UonWriter getWriter() throws Exception {
-               Object output = getOutput();
+       /**
+        * Converts the specified output target object to an {@link UonWriter}.
+        *
+        * @param out The output target object.
+        * @return The output target object wrapped in an {@link UonWriter}.
+        * @throws Exception
+        */
+       public final UonWriter getUonWriter(SerializerOutput out) throws 
Exception {
+               Object output = out.getRawOutput();
                if (output instanceof UonWriter)
                        return (UonWriter)output;
-               return new UonWriter(this, super.getWriter(), 
isUseWhitespace(), getMaxIndent(), isEncodeChars(), isTrimStrings(), 
isPlainTextParams(), getUriResolver());
+               return new UonWriter(this, out.getWriter(), isUseWhitespace(), 
getMaxIndent(), isEncodeChars(), isTrimStrings(), isPlainTextParams(), 
getUriResolver());
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
index e5c40c4..6ceb906 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
@@ -438,8 +438,9 @@ public class UrlEncodingSerializer extends UonSerializer 
implements PartSerializ
                        }
 
                        StringWriter w = new StringWriter();
-                       UonSerializerSession s = new 
UrlEncodingSerializerSession(ctx, urlEncode, null, w, null, null, null, 
MediaType.UON, null);
-                       super.doSerialize(s, o);
+                       SerializerOutput out = new SerializerOutput(w);
+                       UonSerializerSession s = new 
UrlEncodingSerializerSession(ctx, urlEncode, null, null, null, null, 
MediaType.UON, null);
+                       super.doSerialize(s, out, o);
                        return w.toString();
                } catch (Exception e) {
                        throw new RuntimeException(e);
@@ -452,15 +453,15 @@ public class UrlEncodingSerializer extends UonSerializer 
implements PartSerializ
        
//--------------------------------------------------------------------------------
 
        @Override /* Serializer */
-       public UrlEncodingSerializerSession createSession(Object output, 
ObjectMap op, Method javaMethod, Locale locale,
+       public UrlEncodingSerializerSession createSession(ObjectMap op, Method 
javaMethod, Locale locale,
                        TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
-               return new UrlEncodingSerializerSession(ctx, null, op, output, 
javaMethod, locale, timeZone, mediaType, uriContext);
+               return new UrlEncodingSerializerSession(ctx, null, op, 
javaMethod, locale, timeZone, mediaType, uriContext);
        }
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
                UrlEncodingSerializerSession s = 
(UrlEncodingSerializerSession)session;
-               serializeAnything(s, s.getWriter(), o);
+               serializeAnything(s, s.getUonWriter(out), o);
        }
 
        @Override /* PartSerializer */

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerSession.java
 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerSession.java
index e2dd42a..6a0fb21 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerSession.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerSession.java
@@ -17,7 +17,6 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.http.*;
-import org.apache.juneau.json.*;
 import org.apache.juneau.uon.*;
 
 /**
@@ -37,7 +36,6 @@ public class UrlEncodingSerializerSession extends 
UonSerializerSession {
         *      The context creating this session object.
         *      The context contains all the configuration settings for this 
object.
         * @param encode Overrides the {@link 
UonSerializerContext#UON_encodeChars} setting.
-        * @param output The output object.  See {@link 
JsonSerializerSession#getWriter()} for valid class types.
         * @param op
         *      The override properties.
         *      These override any context properties defined in the context.
@@ -53,9 +51,9 @@ public class UrlEncodingSerializerSession extends 
UonSerializerSession {
         *      The URI context.
         *      Identifies the current request URI used for resolution of URIs 
to absolute or root-relative form.
         */
-       public UrlEncodingSerializerSession(UrlEncodingSerializerContext ctx, 
Boolean encode, ObjectMap op, Object output,
+       public UrlEncodingSerializerSession(UrlEncodingSerializerContext ctx, 
Boolean encode, ObjectMap op,
                        Method javaMethod, Locale locale, TimeZone timeZone, 
MediaType mediaType, UriContext uriContext) {
-               super(ctx, encode, op, output, javaMethod, locale, timeZone, 
mediaType, uriContext);
+               super(ctx, encode, op, javaMethod, locale, timeZone, mediaType, 
uriContext);
                if (op == null || op.isEmpty()) {
                        expandedParams = ctx.expandedParams;
                } else {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/xml/XmlDocSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/xml/XmlDocSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/xml/XmlDocSerializer.java
index 36b7376..e7e4548 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlDocSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlDocSerializer.java
@@ -69,13 +69,14 @@ public class XmlDocSerializer extends XmlSerializer {
        
//--------------------------------------------------------------------------------
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
                XmlSerializerSession s = (XmlSerializerSession)session;
-               XmlWriter w = s.getWriter();
+               XmlWriter w = s.getXmlWriter(out);
                w.append("<?xml")
                        .attr("version", "1.0")
                        .attr("encoding", "UTF-8")
                        .appendln("?>");
-               super.doSerialize(s, o);
+               w.flush();
+               super.doSerialize(s, out, o);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaDocSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaDocSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaDocSerializer.java
index 6667123..34cbab0 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaDocSerializer.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaDocSerializer.java
@@ -46,13 +46,14 @@ public class XmlSchemaDocSerializer extends 
XmlSchemaSerializer {
        }
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
                XmlSerializerSession s = (XmlSerializerSession)session;
-               XmlWriter w = s.getWriter();
+               XmlWriter w = s.getXmlWriter(out);
                w.append("<?xml")
                        .attr("version", "1.0")
                        .attr("encoding", "UTF-8")
                        .appendln("?>");
-               super.doSerialize(s, o);
+               w.flush();
+               super.doSerialize(s, out, o);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java
index 21769aa..c1af712 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java
@@ -81,7 +81,7 @@ public class XmlSchemaSerializer extends XmlSerializer {
        }
 
        @Override /* XmlSerializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
                XmlSerializerSession s = (XmlSerializerSession)session;
 
                if (s.isEnableNamespaces() && s.isAutoDetectNamespaces())
@@ -92,23 +92,24 @@ public class XmlSchemaSerializer extends XmlSerializer {
 
                Schemas schemas = new Schemas(s, xs, s.getDefaultNamespace(), 
allNs);
                schemas.process(s, o);
-               schemas.serializeTo(session.getWriter());
+               schemas.serializeTo(out.getWriter());
        }
 
        /**
-        * Returns an XML-Schema validator based on the output returned by 
{@link #doSerialize(SerializerSession, Object)};
+        * Returns an XML-Schema validator based on the output returned by 
{@link #doSerialize(SerializerSession, SerializerOutput, Object)};
         *
         * @param session
-        *      The serializer session object return by {@link 
#createSession(Object, ObjectMap, Method, Locale, TimeZone,
+        *      The serializer session object return by {@link 
#createSession(ObjectMap, Method, Locale, TimeZone,
         *      MediaType, UriContext)}.
         *      Can be <jk>null</jk>.
+        * @param out The target writer.
         * @param o The object to serialize.
         * @return The new validator.
         * @throws Exception If a problem was detected in the XML-Schema output 
produced by this serializer.
         */
-       public Validator getValidator(SerializerSession session, Object o) 
throws Exception {
-               doSerialize(session, o);
-               String xmlSchema = session.getWriter().toString();
+       public Validator getValidator(SerializerSession session, 
SerializerOutput out, Object o) throws Exception {
+               doSerialize(session, out, o);
+               String xmlSchema = out.getWriter().toString();
 
                // create a SchemaFactory capable of understanding WXS schemas
                SchemaFactory factory = 
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
@@ -586,11 +587,11 @@ public class XmlSchemaSerializer extends XmlSerializer {
        }
 
        @Override /* Serializer */
-       public XmlSerializerSession createSession(Object output, ObjectMap op, 
Method javaMethod, Locale locale, TimeZone timeZone, MediaType mediaType, 
UriContext uriContext) {
+       public XmlSerializerSession createSession(ObjectMap op, Method 
javaMethod, Locale locale, TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
                // This serializer must always have namespaces enabled.
                if (op == null)
                        op = new ObjectMap();
                op.put(XmlSerializerContext.XML_enableNamespaces, true);
-               return new XmlSerializerSession(ctx, op, output, javaMethod, 
locale, timeZone, mediaType, uriContext);
+               return new XmlSerializerSession(ctx, op, javaMethod, locale, 
timeZone, mediaType, uriContext);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
index 702107d..b50dfae 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
@@ -842,16 +842,16 @@ public class XmlSerializer extends WriterSerializer {
        
//--------------------------------------------------------------------------------
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
+       protected void doSerialize(SerializerSession session, SerializerOutput 
out, Object o) throws Exception {
                XmlSerializerSession s = (XmlSerializerSession)session;
                if (s.isEnableNamespaces() && s.isAutoDetectNamespaces())
                        findNsfMappings(s, o);
-               serializeAnything(s, s.getWriter(), o, 
s.getExpectedRootType(o), null, null, s.isEnableNamespaces() && 
s.isAddNamespaceUrlsToRoot(), XmlFormat.DEFAULT, false, false, null);
+               serializeAnything(s, s.getXmlWriter(out), o, 
s.getExpectedRootType(o), null, null, s.isEnableNamespaces() && 
s.isAddNamespaceUrlsToRoot(), XmlFormat.DEFAULT, false, false, null);
        }
 
        @Override /* Serializer */
-       public XmlSerializerSession createSession(Object output, ObjectMap op, 
Method javaMethod, Locale locale,
+       public XmlSerializerSession createSession(ObjectMap op, Method 
javaMethod, Locale locale,
                        TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
-               return new XmlSerializerSession(ctx, op, output, javaMethod, 
locale, timeZone, mediaType, uriContext);
+               return new XmlSerializerSession(ctx, op, javaMethod, locale, 
timeZone, mediaType, uriContext);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java 
b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
index 3033b17..f711dc1 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
@@ -23,7 +23,6 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.http.*;
-import org.apache.juneau.json.*;
 import org.apache.juneau.serializer.*;
 
 /**
@@ -54,7 +53,6 @@ public class XmlSerializerSession extends SerializerSession {
         * @param ctx
         *      The context creating this session object.
         *      The context contains all the configuration settings for this 
object.
-        * @param output The output object.  See {@link 
JsonSerializerSession#getWriter()} for valid class types.
         * @param op
         *      The override properties.
         *      These override any context properties defined in the context.
@@ -70,9 +68,9 @@ public class XmlSerializerSession extends SerializerSession {
         *      The URI context.
         *      Identifies the current request URI used for resolution of URIs 
to absolute or root-relative form.
         */
-       public XmlSerializerSession(XmlSerializerContext ctx, ObjectMap op, 
Object output, Method javaMethod, Locale locale,
+       public XmlSerializerSession(XmlSerializerContext ctx, ObjectMap op, 
Method javaMethod, Locale locale,
                        TimeZone timeZone, MediaType mediaType, UriContext 
uriContext) {
-               super(ctx, op, output, javaMethod, locale, timeZone, mediaType, 
uriContext);
+               super(ctx, op, javaMethod, locale, timeZone, mediaType, 
uriContext);
                if (op == null || op.isEmpty()) {
                        enableNamespaces = ctx.enableNamespaces;
                        autoDetectNamespaces = ctx.autoDetectNamespaces;
@@ -203,11 +201,17 @@ public class XmlSerializerSession extends 
SerializerSession {
                return false;
        }
 
-       @Override /* SerializerSession */
-       public XmlWriter getWriter() throws Exception {
-               Object output = getOutput();
+       /**
+        * Converts the specified output target object to an {@link XmlWriter}.
+        *
+        * @param out The output target object.
+        * @return The output target object wrapped in an {@link XmlWriter}.
+        * @throws Exception
+        */
+       public XmlWriter getXmlWriter(SerializerOutput out) throws Exception {
+               Object output = out.getRawOutput();
                if (output instanceof XmlWriter)
                        return (XmlWriter)output;
-               return new XmlWriter(super.getWriter(), isUseWhitespace(), 
getMaxIndent(), isTrimStrings(), getQuoteChar(), getUriResolver(), 
isEnableNamespaces(), getDefaultNamespace());
+               return new XmlWriter(out.getWriter(), isUseWhitespace(), 
getMaxIndent(), isTrimStrings(), getQuoteChar(), getUriResolver(), 
isEnableNamespaces(), getDefaultNamespace());
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PhotosResource.java
----------------------------------------------------------------------
diff --git 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PhotosResource.java
 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PhotosResource.java
index b7018f3..94cefcc 100644
--- 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PhotosResource.java
+++ 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PhotosResource.java
@@ -143,10 +143,10 @@ public class PhotosResource extends Resource {
                }
 
                @Override /* Serializer */
-               protected void doSerialize(SerializerSession session, Object o) 
throws Exception {
+               protected void doSerialize(SerializerSession session, 
SerializerOutput out, Object o) throws Exception {
                        RenderedImage image = (RenderedImage)o;
                        String mediaType = session.getProperty("mediaType");
-                       ImageIO.write(image, 
mediaType.substring(mediaType.indexOf('/')+1), session.getOutputStream());
+                       ImageIO.write(image, 
mediaType.substring(mediaType.indexOf('/')+1), out.getOutputStream());
                }
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java
 
b/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java
index ce95bb0..a2137a1 100644
--- 
a/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java
+++ 
b/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java
@@ -118,14 +118,16 @@ public class BaseProvider implements 
MessageBodyReader<Object>, MessageBodyWrite
                        if (s.isWriterSerializer()) {
                                WriterSerializer s2 = (WriterSerializer)s;
                                OutputStreamWriter w = new 
OutputStreamWriter(out, UTF8);
-                               SerializerSession session = s.createSession(w, 
mp, null, locale, timeZone, sm.getMediaType(), null);
-                               s2.serialize(session, o);
+                               SerializerOutput sout = new SerializerOutput(w);
+                               SerializerSession session = s.createSession(mp, 
null, locale, timeZone, sm.getMediaType(), null);
+                               s2.serialize(session, sout, o);
                                w.flush();
                                w.close();
                        } else {
                                OutputStreamSerializer s2 = 
(OutputStreamSerializer)s;
-                               SerializerSession session = s.createSession(s2, 
mp, null, locale, timeZone, sm.getMediaType(), null);
-                               s2.serialize(session, o);
+                               SerializerOutput sout = new 
SerializerOutput(s2);
+                               SerializerSession session = s.createSession(mp, 
null, locale, timeZone, sm.getMediaType(), null);
+                               s2.serialize(session, sout, o);
                                out.flush();
                                out.close();
                        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8879750c/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java
 
b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java
index 3f5ef8b..94051a7 100644
--- 
a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java
+++ 
b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java
@@ -76,8 +76,8 @@ public class AcceptCharsetResource extends RestServlet {
                }
 
                @Override /* Serializer */
-               protected void doSerialize(SerializerSession session, Object o) 
throws Exception {
-                       Writer w = new 
OutputStreamWriter(session.getOutputStream());
+               protected void doSerialize(SerializerSession session, 
SerializerOutput out, Object o) throws Exception {
+                       Writer w = new 
OutputStreamWriter(out.getOutputStream());
                        
w.append(o.toString()).append('/').append(session.getProperty("characterEncoding"));
                        w.flush();
                        w.close();


Reply via email to