http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 66d6bae..42ae307 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 @@ -15,7 +15,6 @@ package org.apache.juneau.json; import static org.apache.juneau.serializer.SerializerContext.*; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.serializer.*; /** @@ -31,7 +30,6 @@ import org.apache.juneau.serializer.*; * * Produces the JSON-schema for the JSON produced by the {@link JsonSerializer} class with the same properties. */ -@Produces(value="application/json+schema,text/json+schema",contentType="application/json") public final class JsonSchemaSerializer extends JsonSerializer { /** @@ -42,8 +40,10 @@ public final class JsonSchemaSerializer extends JsonSerializer { public JsonSchemaSerializer(PropertyStore propertyStore) { super( propertyStore.copy() - .append(SERIALIZER_detectRecursions, true) - .append(SERIALIZER_ignoreRecursions, true) + .append(SERIALIZER_detectRecursions, true) + .append(SERIALIZER_ignoreRecursions, true), + "application/json", + "application/json+schema", "text/json+schema" ); }
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java index f9e875d..17e3a31 100644 --- a/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java @@ -40,7 +40,6 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ protected JsonSchemaSerializerSession(JsonSerializerContext ctx, SerializerSessionArgs args) { super(ctx, args); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 db0a78d..0709660 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 @@ -17,7 +17,6 @@ import static org.apache.juneau.json.JsonSerializerContext.*; import java.util.*; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.serializer.*; /** @@ -98,7 +97,6 @@ import org.apache.juneau.serializer.*; * String json = serializer.serialize(someObject); * </p> */ -@Produces("application/json,text/json") public class JsonSerializer extends WriterSerializer { /** Default serializer, all default settings.*/ @@ -137,7 +135,6 @@ public class JsonSerializer extends WriterSerializer { } /** Default serializer, single quotes, simple mode. */ - @Produces(value="application/json+simple,text/json+simple",contentType="application/json") public static class Simple extends JsonSerializer { /** @@ -148,8 +145,10 @@ public class JsonSerializer extends WriterSerializer { public Simple(PropertyStore propertyStore) { super( propertyStore.copy() - .append(JSON_simpleMode, true) - .append(SERIALIZER_quoteChar, '\'') + .append(JSON_simpleMode, true) + .append(SERIALIZER_quoteChar, '\''), + "application/json", + "application/json+simple", "text/json+simple" ); } } @@ -201,10 +200,36 @@ public class JsonSerializer extends WriterSerializer { /** * Constructor. * - * @param propertyStore The property store containing all the settings for this object. + * @param propertyStore + * The property store containing all the settings for this object. */ public JsonSerializer(PropertyStore propertyStore) { - super(propertyStore); + this(propertyStore, "application/json", "application/json", "text/json"); + } + + /** + * Constructor. + * + * @param propertyStore + * The property store containing all the settings for this object. + * @param produces + * The media type that this serializer produces. + * @param accept + * The accept media types that the serializer can handle. + * <p> + * Can contain meta-characters per the <code>media-type</code> specification of + * <a class="doclink" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">RFC2616/14.1</a> + * <p> + * If empty, then assumes the only media type supported is <code>produces</code>. + * <p> + * For example, if this serializer produces <js>"application/json"</js> but should handle media types of + * <js>"application/json"</js> and <js>"text/json"</js>, then the arguments should be: + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"application/json"</js>, <js>"text/json"</js>);</code> + * <br>...or... + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"*​/json"</js>);</code> + */ + public JsonSerializer(PropertyStore propertyStore, String produces, String...accept) { + super(propertyStore, produces, accept); this.ctx = createContext(JsonSerializerContext.class); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 12c9433..c9266a2 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 @@ -17,6 +17,7 @@ import static org.apache.juneau.json.JsonSerializerContext.*; import java.util.*; import org.apache.juneau.*; +import org.apache.juneau.internal.*; import org.apache.juneau.serializer.*; import org.apache.juneau.transform.*; @@ -45,7 +46,6 @@ public class JsonSerializerSession extends WriterSerializerSession { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ protected JsonSerializerSession(JsonSerializerContext ctx, SerializerSessionArgs args) { super(ctx, args); @@ -135,6 +135,9 @@ public class JsonSerializerSession extends WriterSerializerSession { else if (sType.isArray()) { serializeCollection(out, toList(sType.getInnerClass(), o), eType); } + else if (sType.isReader() || sType.isInputStream()) { + IOUtils.pipe(o, out); + } else out.stringValue(toString(o)); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java index 0d9ab31..e30d678 100644 --- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java +++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java @@ -13,7 +13,6 @@ package org.apache.juneau.msgpack; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.parser.*; /** @@ -30,13 +29,12 @@ import org.apache.juneau.parser.*; * <li>{@link MsgPackParserContext} * </ul> */ -@Consumes("octal/msgpack") public class MsgPackParser extends InputStreamParser { /** Default parser, all default settings.*/ public static final MsgPackParser DEFAULT = new MsgPackParser(PropertyStore.create()); - + private final MsgPackParserContext ctx; /** @@ -45,7 +43,7 @@ public class MsgPackParser extends InputStreamParser { * @param propertyStore The property store containing all the settings for this object. */ public MsgPackParser(PropertyStore propertyStore) { - super(propertyStore); + super(propertyStore, "octal/msgpack"); this.ctx = createContext(MsgPackParserContext.class); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 ad4dbce..ab5442f 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 @@ -13,7 +13,6 @@ package org.apache.juneau.msgpack; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.serializer.*; /** @@ -34,7 +33,6 @@ import org.apache.juneau.serializer.*; * <li>{@link BeanContext} * </ul> */ -@Produces("octal/msgpack") public class MsgPackSerializer extends OutputStreamSerializer { /** Default serializer, all default settings.*/ @@ -49,7 +47,7 @@ public class MsgPackSerializer extends OutputStreamSerializer { * @param propertyStore The property store containing all the settings for this object. */ public MsgPackSerializer(PropertyStore propertyStore) { - super(propertyStore); + super(propertyStore, "octal/msgpack"); this.ctx = createContext(MsgPackSerializerContext.class); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 4a8177d..9b81a16 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 @@ -17,6 +17,7 @@ import static org.apache.juneau.msgpack.MsgPackSerializerContext.*; import java.util.*; import org.apache.juneau.*; +import org.apache.juneau.internal.*; import org.apache.juneau.serializer.*; import org.apache.juneau.transform.*; @@ -43,7 +44,6 @@ public final class MsgPackSerializerSession extends OutputStreamSerializerSessio * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ protected MsgPackSerializerSession(MsgPackSerializerContext ctx, SerializerSessionArgs args) { super(ctx, args); @@ -143,7 +143,11 @@ public final class MsgPackSerializerSession extends OutputStreamSerializerSessio } else if (sType.isArray()) { serializeCollection(out, toList(sType.getInnerClass(), o), eType); - } else + } + else if (sType.isReader() || sType.isInputStream()) { + IOUtils.pipe(o, out); + } + else out.appendString(toString(o)); if (! isRecursion) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/parser/InputStreamParser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/InputStreamParser.java b/juneau-core/src/main/java/org/apache/juneau/parser/InputStreamParser.java index 9fb15d6..29b11ce 100644 --- a/juneau-core/src/main/java/org/apache/juneau/parser/InputStreamParser.java +++ b/juneau-core/src/main/java/org/apache/juneau/parser/InputStreamParser.java @@ -13,7 +13,6 @@ package org.apache.juneau.parser; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; /** * Subclass of {@link Parser} for byte-based parsers. @@ -25,23 +24,17 @@ import org.apache.juneau.annotation.*; * <ul> * <li><code>parse(InputStream, ClassMeta, ParserContext)</code> * </ul> - * - * <h6 class='topic'>@Consumes annotation</h6> - * - * The media types that this parser can handle is specified through the {@link Consumes @Consumes} annotation. - * - * <p> - * However, the media types can also be specified programmatically by overriding the {@link #getMediaTypes()} method. - */ + */ public abstract class InputStreamParser extends Parser { /** * Constructor. * * @param propertyStore The property store containing all the settings for this object. + * @param consumes The list of media types that this parser consumes (e.g. <js>"application/json"</js>). */ - protected InputStreamParser(PropertyStore propertyStore) { - super(propertyStore); + protected InputStreamParser(PropertyStore propertyStore, String...consumes) { + super(propertyStore, consumes); } @Override /* Parser */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java index b077654..b365a54 100644 --- a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java +++ b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java @@ -12,15 +12,11 @@ // *************************************************************************************************************************** package org.apache.juneau.parser; -import static org.apache.juneau.internal.StringUtils.*; -import static org.apache.juneau.internal.ReflectionUtils.*; - import java.io.*; import java.lang.reflect.*; import java.util.*; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.http.*; import org.apache.juneau.transform.*; import org.apache.juneau.transforms.*; @@ -29,13 +25,6 @@ import org.apache.juneau.utils.*; /** * Parent class for all Juneau parsers. * - * <h6 class='topic'>@Consumes annotation</h6> - * - * The media types that this parser can handle is specified through the {@link Consumes @Consumes} annotation. - * - * <p> - * However, the media types can also be specified programmatically by overriding the {@link #getMediaTypes()} method. - * * <h6 class='topic'>Valid data conversions</h6> * * Parsers can parse any parsable POJO types, as specified in the <a class="doclink" @@ -144,20 +133,15 @@ import org.apache.juneau.utils.*; public abstract class Parser extends CoreObject { /** General parser properties currently set on this parser. */ - private final MediaType[] mediaTypes; + private final MediaType[] consumes; // Hidden constructor to force subclass from InputStreamParser or ReaderParser. - Parser(PropertyStore propertyStore) { + Parser(PropertyStore propertyStore, String...consumes) { super(propertyStore); - Consumes c = getAnnotation(Consumes.class, getClass()); - if (c == null) - throw new FormattedRuntimeException("Class ''{0}'' is missing the @Consumes annotation", c); - - String[] mt = split(c.value()); - this.mediaTypes = new MediaType[mt.length]; - for (int i = 0; i < mt.length; i++) { - mediaTypes[i] = MediaType.forString(mt[i]); + this.consumes = new MediaType[consumes.length]; + for (int i = 0; i < consumes.length; i++) { + this.consumes[i] = MediaType.forString(consumes[i]); } } @@ -359,9 +343,19 @@ public abstract class Parser extends CoreObject { * @return The new context. */ public final ParserSession createSession() { - return createSession(null); + return createSession(createDefaultSessionArgs()); } + /** + * Creates the session arguments object that gets passed to the {@link #createSession(ParserSessionArgs)} method. + * + * @return + * A new default session arguments object. + * <p>The arguments can be modified before passing to the {@link #createSession(ParserSessionArgs)}. + */ + protected final ParserSessionArgs createDefaultSessionArgs() { + return new ParserSessionArgs(ObjectMap.EMPTY_MAP, null, null, null, getPrimaryMediaType(), null); + } //-------------------------------------------------------------------------------- // Optional methods @@ -467,23 +461,20 @@ public abstract class Parser extends CoreObject { //-------------------------------------------------------------------------------- /** - * Returns the media types handled based on the value of the {@link Consumes} annotation on the parser class. - * - * <p> - * This method can be overridden by subclasses to determine the media types programmatically. + * Returns the media types handled based on the values passed to the <code>consumes</code> constructor parameter. * * @return The list of media types. Never <jk>null</jk>. */ - public MediaType[] getMediaTypes() { - return mediaTypes; + public final MediaType[] getMediaTypes() { + return consumes; } /** - * Returns the first media type specified on this parser via the {@link Consumes} annotation. + * Returns the first media type handled based on the values passed to the <code>consumes</code> constructor parameter. * * @return The media type. */ - public MediaType getPrimaryMediaType() { - return mediaTypes == null || mediaTypes.length == 0 ? null : mediaTypes[0]; + public final MediaType getPrimaryMediaType() { + return consumes == null || consumes.length == 0 ? null : consumes[0]; } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/parser/ParserSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/ParserSession.java b/juneau-core/src/main/java/org/apache/juneau/parser/ParserSession.java index 938f643..cbb2a85 100644 --- a/juneau-core/src/main/java/org/apache/juneau/parser/ParserSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/parser/ParserSession.java @@ -54,11 +54,9 @@ public abstract class ParserSession extends BeanSession { * Runtime session arguments. */ protected ParserSession(ParserContext ctx, ParserSessionArgs args) { - super(ctx != null ? ctx : ParserContext.DEFAULT, args != null ? args : ParserSessionArgs.DEFAULT); + super(ctx != null ? ctx : ParserContext.DEFAULT, args); if (ctx == null) ctx = ParserContext.DEFAULT; - if (args == null) - args = ParserSessionArgs.DEFAULT; Class<?> listenerClass; ObjectMap p = getProperties(); if (p.isEmpty()) { http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/parser/ParserSessionArgs.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/ParserSessionArgs.java b/juneau-core/src/main/java/org/apache/juneau/parser/ParserSessionArgs.java index 65ce23e..8e43052 100644 --- a/juneau-core/src/main/java/org/apache/juneau/parser/ParserSessionArgs.java +++ b/juneau-core/src/main/java/org/apache/juneau/parser/ParserSessionArgs.java @@ -23,11 +23,6 @@ import org.apache.juneau.http.*; */ public final class ParserSessionArgs extends BeanSessionArgs { - /** - * Default session arguments. - */ - protected static final ParserSessionArgs DEFAULT = new ParserSessionArgs(ObjectMap.EMPTY_MAP, null, null, null, null, null); - final Method javaMethod; final Object outer; http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/parser/ReaderParser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/ReaderParser.java b/juneau-core/src/main/java/org/apache/juneau/parser/ReaderParser.java index a987a5e..0d107a8 100644 --- a/juneau-core/src/main/java/org/apache/juneau/parser/ReaderParser.java +++ b/juneau-core/src/main/java/org/apache/juneau/parser/ReaderParser.java @@ -13,7 +13,6 @@ package org.apache.juneau.parser; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; /** * Subclass of {@link Parser} for characters-based parsers. @@ -25,13 +24,6 @@ import org.apache.juneau.annotation.*; * <ul> * <li><code>parse(ParserSession, ClassMeta)</code> * </ul> - * - * <h6 class='topic'>@Consumes annotation</h6> - * - * The media types that this parser can handle is specified through the {@link Consumes @Consumes} annotation. - * - * <p> - * However, the media types can also be specified programmatically by overriding the {@link #getMediaTypes()} method. */ public abstract class ReaderParser extends Parser { @@ -39,9 +31,10 @@ public abstract class ReaderParser extends Parser { * Constructor. * * @param propertyStore The property store containing all the settings for this object. + * @param consumes The list of media types that this parser consumes (e.g. <js>"application/json"</js>, <js>"*​/json"</js>). */ - protected ReaderParser(PropertyStore propertyStore) { - super(propertyStore); + protected ReaderParser(PropertyStore propertyStore, String...consumes) { + super(propertyStore, consumes); } @Override /* Parser */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/parser/package.html ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/package.html b/juneau-core/src/main/java/org/apache/juneau/parser/package.html index f3203e9..98a4ca0 100644 --- a/juneau-core/src/main/java/org/apache/juneau/parser/package.html +++ b/juneau-core/src/main/java/org/apache/juneau/parser/package.html @@ -112,15 +112,13 @@ <p> Defining a new parser is quite simple if you subclass directly from {@link org.apache.juneau.parser.ReaderParser} or {@link org.apache.juneau.parser.InputStreamParser}. - In each case, you simply need to implement a single method and specify a - {@link org.apache.juneau.annotation.Consumes} annotation. + In each case, you simply need to implement a single method . </p> <p> The following example shows a simple parser that converts input streams to images using standard JRE classes. </p> <p class='bcode'> <jd>/** Parser for converting byte streams to images */</jd> - <ja>@Consumes</ja>(<js>"image/png,image/jpeg"</js>) <jk>public class</jk> ImageParser <jk>extends</jk> InputStreamParser { <jd>/** @@ -128,7 +126,7 @@ * <ja>@param</ja> propertyStore The property store containing all the settings for this object. */</jd> <jk>public</jk> ImageParser(PropertyStore propertyStore) { - <jk>super</jk>(propertyStore); + <jk>super</jk>(propertyStore, <js>"image/png"</js>, <js>"image/jpeg"</js>); } <ja>@Override</ja> <jc>/* Parser */</jc> http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java index c5a2695..959560a 100644 --- a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java +++ b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java @@ -13,7 +13,6 @@ package org.apache.juneau.plaintext; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.parser.*; import org.apache.juneau.transform.*; @@ -44,7 +43,6 @@ import org.apache.juneau.transform.*; * <li>{@link ParserContext} * </ul> */ -@Consumes("text/plain") public class PlainTextParser extends ReaderParser { /** Default parser, all default settings.*/ @@ -57,7 +55,20 @@ public class PlainTextParser extends ReaderParser { * @param propertyStore The property store containing all the settings for this object. */ public PlainTextParser(PropertyStore propertyStore) { - super(propertyStore); + this(propertyStore, "text/plain"); + } + + /** + * Constructor. + * + * @param propertyStore The property store containing all the settings for this object. + * @param consumes The media types that this parser consumes. + * <p> + * Can contain meta-characters per the <code>media-type</code> specification of + * <a class="doclink" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">RFC2616/14.1</a> + */ + public PlainTextParser(PropertyStore propertyStore, String...consumes) { + super(propertyStore, consumes); } @Override /* CoreObject */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 910e2d5..a813865 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 @@ -13,7 +13,6 @@ package org.apache.juneau.plaintext; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.serializer.*; import org.apache.juneau.transform.*; @@ -43,7 +42,6 @@ import org.apache.juneau.transform.*; * <li>{@link BeanContext} * </ul> */ -@Produces("text/plain") public class PlainTextSerializer extends WriterSerializer { /** Default serializer, all default settings.*/ @@ -54,13 +52,40 @@ public class PlainTextSerializer extends WriterSerializer { /** * Constructor. * - * @param propertyStore The property store containing all the settings for this object. + * @param propertyStore + * The property store containing all the settings for this object. */ public PlainTextSerializer(PropertyStore propertyStore) { - super(propertyStore); + this(propertyStore, "text/plain"); + } + + /** + * Constructor. + * + * @param propertyStore + * The property store containing all the settings for this object. + * @param produces + * The media type that this serializer produces. + * @param accept + * The accept media types that the serializer can handle. + * <p> + * Can contain meta-characters per the <code>media-type</code> specification of + * <a class="doclink" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">RFC2616/14.1</a> + * <p> + * If empty, then assumes the only media type supported is <code>produces</code>. + * <p> + * For example, if this serializer produces <js>"application/json"</js> but should handle media types of + * <js>"application/json"</js> and <js>"text/json"</js>, then the arguments should be: + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"application/json"</js>, <js>"text/json"</js>);</code> + * <br>...or... + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"*​/json"</js>);</code> + */ + public PlainTextSerializer(PropertyStore propertyStore, String produces, String...accept) { + super(propertyStore, produces, accept); this.ctx = createContext(SerializerContext.class); } + @Override /* CoreObject */ public PlainTextSerializerBuilder builder() { return new PlainTextSerializerBuilder(propertyStore); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerSession.java index 0e69e09..5915f82 100644 --- a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerSession.java @@ -34,7 +34,6 @@ public class PlainTextSerializerSession extends WriterSerializerSession { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ protected PlainTextSerializerSession(SerializerContext ctx, SerializerSessionArgs args) { super(ctx, args); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 b481f2e..2baede9 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 @@ -15,28 +15,35 @@ package org.apache.juneau.serializer; import static org.apache.juneau.internal.StringUtils.*; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; /** * Subclass of {@link Serializer} for byte-based serializers. - * - * <h6 class='topic'>@Produces annotation</h6> - * - * The media types that this serializer can produce is specified through the {@link Produces @Produces} annotation. - * - * <p> - * However, the media types can also be specified programmatically by overriding the {@link #getMediaTypes()} - * and {@link #getResponseContentType()} methods. */ public abstract class OutputStreamSerializer extends Serializer { /** * Constructor. * - * @param propertyStore The property store containing all the settings for this object. + * @param propertyStore + * The property store containing all the settings for this object. + * @param produces + * The media type that this serializer produces. + * @param accept + * The accept media types that the serializer can handle. + * <p> + * Can contain meta-characters per the <code>media-type</code> specification of + * <a class="doclink" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">RFC2616/14.1</a> + * <p> + * If empty, then assumes the only media type supported is <code>produces</code>. + * <p> + * For example, if this serializer produces <js>"application/json"</js> but should handle media types of + * <js>"application/json"</js> and <js>"text/json"</js>, then the arguments should be: + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"application/json"</js>, <js>"text/json"</js>);</code> + * <br>...or... + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"*​/json"</js>);</code> */ - protected OutputStreamSerializer(PropertyStore propertyStore) { - super(propertyStore); + protected OutputStreamSerializer(PropertyStore propertyStore, String produces, String...accept) { + super(propertyStore, produces, accept); } @@ -66,7 +73,7 @@ public abstract class OutputStreamSerializer extends Serializer { */ @Override public final byte[] serialize(Object o) throws SerializeException { - return createSession(null).serialize(o); + return createSession(createDefaultSessionArgs()).serialize(o); } /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerSession.java index 8098566..f0637f5 100644 --- a/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerSession.java @@ -38,7 +38,6 @@ public abstract class OutputStreamSerializerSession extends SerializerSession { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ protected OutputStreamSerializerSession(SerializerContext ctx, SerializerSessionArgs args) { super(ctx, args); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 d2640c3..f04e615 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 @@ -12,13 +12,9 @@ // *************************************************************************************************************************** package org.apache.juneau.serializer; -import static org.apache.juneau.internal.StringUtils.*; -import static org.apache.juneau.internal.ReflectionUtils.*; - import java.io.*; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.http.*; /** @@ -39,35 +35,25 @@ import org.apache.juneau.http.*; * <p> * Subclasses should extend directly from {@link OutputStreamSerializer} or {@link WriterSerializer} depending on * whether it's a stream or character based serializer. - * - * <h6 class='topic'>@Produces annotation</h6> - * - * The media types that this serializer can produce is specified through the {@link Produces @Produces} annotation. - * <br> - * However, the media types can also be specified programmatically by overriding the {@link #getMediaTypes()} - * and {@link #getResponseContentType()} methods. */ public abstract class Serializer extends CoreObject { - private final MediaType[] mediaTypes; - private final MediaType contentType; + private final MediaType[] accept; + private final MediaType produces; // Hidden constructors to force subclass from OuputStreamSerializer or WriterSerializer. - Serializer(PropertyStore propertyStore) { + Serializer(PropertyStore propertyStore, String produces, String...accept) { super(propertyStore); - Produces p = getAnnotation(Produces.class, getClass()); - if (p == null) - throw new FormattedRuntimeException("Class ''{0}'' is missing the @Produces annotation", getClass()); - - String[] mt = split(p.value()); - this.mediaTypes = new MediaType[mt.length]; - for (int i = 0; i < mt.length; i++) { - mediaTypes[i] = MediaType.forString(mt[i]); + this.produces = MediaType.forString(produces); + if (accept.length == 0) { + this.accept = new MediaType[]{this.produces}; + } else { + this.accept = new MediaType[accept.length]; + for (int i = 0; i < accept.length; i++) { + this.accept[i] = MediaType.forString(accept[i]); + } } - - String ct = p.contentType().isEmpty() ? this.mediaTypes[0].toString() : p.contentType(); - contentType = ct.isEmpty() ? null : MediaType.forString(ct); } @Override /* CoreObject */ @@ -94,7 +80,6 @@ public abstract class Serializer extends CoreObject { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and serializer * contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. * @return * The new session object. * <br>Note that you must call {@link SerializerSession#close()} on this object to perform any necessary @@ -116,7 +101,18 @@ public abstract class Serializer extends CoreObject { * cleanup. */ public final SerializerSession createSession() { - return createSession(null); + return createSession(createDefaultSessionArgs()); + } + + /** + * Creates the session arguments object that gets passed to the {@link #createSession(SerializerSessionArgs)} method. + * + * @return + * A new default session arguments object. + * <p>The arguments can be modified before passing to the {@link #createSession(SerializerSessionArgs)}. + */ + public final SerializerSessionArgs createDefaultSessionArgs() { + return new SerializerSessionArgs(ObjectMap.EMPTY_MAP, null, null, null, getResponseContentType(), null); } /** @@ -176,24 +172,12 @@ public abstract class Serializer extends CoreObject { //-------------------------------------------------------------------------------- /** - * Returns the media types handled based on the value of the {@link Produces} annotation on the serializer class. - * - * <p> - * This method can be overridden by subclasses to determine the media types programmatically. + * Returns the media types handled based on the value of the <code>accept</code> parameter passed into the constructor. * * @return The list of media types. Never <jk>null</jk>. */ public final MediaType[] getMediaTypes() { - return mediaTypes; - } - - /** - * Returns the first media type specified on this serializer via the {@link Produces} annotation. - * - * @return The media type. - */ - public final MediaType getPrimaryMediaType() { - return mediaTypes == null || mediaTypes.length == 0 ? null : mediaTypes[0]; + return accept; } /** @@ -212,7 +196,7 @@ public abstract class Serializer extends CoreObject { * * @return The response content type. If <jk>null</jk>, then the matched media type is used. */ - public MediaType getResponseContentType() { - return contentType; + public final MediaType getResponseContentType() { + return produces; } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 f2428b6..a243fcc 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 @@ -90,14 +90,11 @@ public abstract class SerializerSession extends BeanSession { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ protected SerializerSession(SerializerContext ctx, SerializerSessionArgs args) { - super(ctx != null ? ctx : SerializerContext.DEFAULT, args != null ? args : SerializerSessionArgs.DEFAULT); + super(ctx != null ? ctx : SerializerContext.DEFAULT, args); if (ctx == null) ctx = SerializerContext.DEFAULT; - if (args == null) - args = SerializerSessionArgs.DEFAULT; this.javaMethod = args.javaMethod; UriResolution uriResolution; UriRelativity uriRelativity; http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSessionArgs.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSessionArgs.java b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSessionArgs.java index 68077b4..e1c2928 100644 --- a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSessionArgs.java +++ b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSessionArgs.java @@ -26,11 +26,6 @@ import org.apache.juneau.http.*; */ public final class SerializerSessionArgs extends BeanSessionArgs { - /** - * Default session arguments. - */ - public static final SerializerSessionArgs DEFAULT = new SerializerSessionArgs(ObjectMap.EMPTY_MAP, null, null, null, null, null); - final Method javaMethod; final UriContext uriContext; http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 11d2138..3449dff 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 @@ -13,29 +13,36 @@ package org.apache.juneau.serializer; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.utils.*; /** * Subclass of {@link Serializer} for character-based serializers. - * - * <h6 class='topic'>@Produces annotation</h6> - * - * The media types that this serializer can produce is specified through the {@link Produces @Produces} annotation. - * - * <p> - * However, the media types can also be specified programmatically by overriding the {@link #getMediaTypes()} - * and {@link #getResponseContentType()} methods. */ public abstract class WriterSerializer extends Serializer { /** * Constructor. * - * @param propertyStore The property store containing all the settings for this object. + * @param propertyStore + * The property store containing all the settings for this object. + * @param produces + * The media type that this serializer produces. + * @param accept + * The accept media types that the serializer can handle. + * <p> + * Can contain meta-characters per the <code>media-type</code> specification of + * <a class="doclink" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">RFC2616/14.1</a> + * <p> + * If empty, then assumes the only media type supported is <code>produces</code>. + * <p> + * For example, if this serializer produces <js>"application/json"</js> but should handle media types of + * <js>"application/json"</js> and <js>"text/json"</js>, then the arguments should be: + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"application/json"</js>, <js>"text/json"</js>);</code> + * <br>...or... + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"*​/json"</js>);</code> */ - protected WriterSerializer(PropertyStore propertyStore) { - super(propertyStore); + protected WriterSerializer(PropertyStore propertyStore, String produces, String...accept) { + super(propertyStore, produces, accept); } @@ -65,7 +72,7 @@ public abstract class WriterSerializer extends Serializer { */ @Override /* Serializer */ public final String serialize(Object o) throws SerializeException { - return createSession(null).serialize(o); + return createSession(createDefaultSessionArgs()).serialize(o); } /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializerSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializerSession.java index b91085f..fdea9d3 100644 --- a/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializerSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializerSession.java @@ -43,7 +43,6 @@ public abstract class WriterSerializerSession extends SerializerSession { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ protected WriterSerializerSession(SerializerContext ctx, SerializerSessionArgs args) { super(ctx, args); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/serializer/package.html ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/package.html b/juneau-core/src/main/java/org/apache/juneau/serializer/package.html index 0057ce8..a7d9f87 100644 --- a/juneau-core/src/main/java/org/apache/juneau/serializer/package.html +++ b/juneau-core/src/main/java/org/apache/juneau/serializer/package.html @@ -114,8 +114,7 @@ <p> Defining a new serializer is quite simple if you subclass directly from {@link org.apache.juneau.serializer.WriterSerializer} or {@link org.apache.juneau.serializer.OutputStreamSerializer}. - <br>In each case, you simply need to implement a single method and specify a - {@link org.apache.juneau.annotation.Produces} annotation. + <br>In each case, you simply need to implement a single method . </p> <p> The following example shows a simple serializer that converts images to output streams using standard JRE @@ -123,7 +122,6 @@ </p> <p class='bcode'> <jd>/** Serializer for converting images to byte streams */</jd> - <ja>@Produces</ja>(<js>"image/png,image/jpeg"</js>) <jk>public class</jk> ImageSerializer <jk>extends</jk> OutputStreamSerializer { <jd>/** @@ -131,7 +129,7 @@ * <ja>@param</ja> propertyStore The property store containing all the settings for this object. */</jd> <jk>public</jk> ImageSerializer(PropertyStore propertyStore) { - <jk>super</jk>(propertyStore); + <jk>super</jk>(propertyStore, <jk>null</jk>, <js>"image/png"</js>, <js>"image/jpeg"</js>); } <ja>@Override</ja> <jc>/* Serializer */</jc> http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 77f722b..1c58cb9 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 @@ -13,7 +13,6 @@ package org.apache.juneau.soap; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.serializer.*; import org.apache.juneau.xml.*; @@ -39,7 +38,6 @@ import org.apache.juneau.xml.*; * <li>{@link BeanContext} * </ul> */ -@Produces(value="text/xml+soap",contentType="text/xml") public final class SoapXmlSerializer extends XmlSerializer { private final SoapXmlSerializerContext ctx; @@ -50,7 +48,7 @@ public final class SoapXmlSerializer extends XmlSerializer { * @param propertyStore The property store containing all the settings for this object. */ public SoapXmlSerializer(PropertyStore propertyStore) { - super(propertyStore); + super(propertyStore, "text/xml", "text/xml+soap"); this.ctx = createContext(SoapXmlSerializerContext.class); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializerSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializerSession.java index c899e44..39857b2 100644 --- a/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializerSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializerSession.java @@ -40,7 +40,6 @@ public class SoapXmlSerializerSession extends XmlSerializerSession { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ public SoapXmlSerializerSession(SoapXmlSerializerContext ctx, SerializerSessionArgs args) { super(ctx, args); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java b/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java index 7410a7d..ffc8a6b 100644 --- a/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java +++ b/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java @@ -15,7 +15,6 @@ package org.apache.juneau.uon; import static org.apache.juneau.uon.UonParserContext.*; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.parser.*; /** @@ -38,7 +37,6 @@ import org.apache.juneau.parser.*; * <li>{@link BeanContext} * </ul> */ -@Consumes("text/uon") public class UonParser extends ReaderParser { /** Reusable instance of {@link UonParser}, all default settings. */ @@ -67,10 +65,23 @@ public class UonParser extends ReaderParser { /** * Constructor. * - * @param propertyStore The property store containing all the settings for this object. + * @param propertyStore + * The property store containing all the settings for this object. */ public UonParser(PropertyStore propertyStore) { - super(propertyStore); + this(propertyStore, "text/uon"); + } + + /** + * Constructor. + * + * @param propertyStore + * The property store containing all the settings for this object. + * @param consumes + * The list of media types that this parser consumes (e.g. <js>"application/json"</js>, <js>"*​/json"</js>). + */ + public UonParser(PropertyStore propertyStore, String...consumes) { + super(propertyStore, consumes); this.ctx = createContext(UonParserContext.class); } @@ -85,7 +96,7 @@ public class UonParser extends ReaderParser { * @return A new parser session. */ protected final UonParserSession createParameterSession() { - return new UonParserSession(ctx); + return new UonParserSession(ctx, createDefaultSessionArgs(), false); } @Override /* Parser */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/uon/UonParserSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/uon/UonParserSession.java b/juneau-core/src/main/java/org/apache/juneau/uon/UonParserSession.java index 7d50309..9f731d4 100644 --- a/juneau-core/src/main/java/org/apache/juneau/uon/UonParserSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/uon/UonParserSession.java @@ -68,11 +68,17 @@ public class UonParserSession extends ReaderParserSession { * The main difference is that characters are never decoded, and the {@link UonParserContext#UON_decodeChars} * property is always ignored. * - * @param ctx The context to copy setting from. + * @param ctx + * The context creating this session object. + * The context contains all the configuration settings for this object. + * @param args + * Runtime session arguments. + * @param decodeChars + * Whether to decode characters. */ - protected UonParserSession(UonParserContext ctx) { - super(ctx, null); - decodeChars = false; + protected UonParserSession(UonParserContext ctx, ParserSessionArgs args, boolean decodeChars) { + super(ctx, args); + this.decodeChars = decodeChars; } @Override /* ParserSession */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 5f1dc23..bb99e3c 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 @@ -16,7 +16,6 @@ import static org.apache.juneau.serializer.SerializerContext.*; import static org.apache.juneau.uon.UonSerializerContext.*; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.serializer.*; /** @@ -125,7 +124,6 @@ import org.apache.juneau.serializer.*; * String s = UonSerializer.<jsf>DEFAULT</jsf>.serialize(s); * </p> */ -@Produces("text/uon") public class UonSerializer extends WriterSerializer { /** Reusable instance of {@link UonSerializer}, all default settings. */ @@ -173,10 +171,36 @@ public class UonSerializer extends WriterSerializer { /** * Constructor. * - * @param propertyStore The property store containing all the settings for this object. + * @param propertyStore + * The property store containing all the settings for this object. */ public UonSerializer(PropertyStore propertyStore) { - super(propertyStore); + this(propertyStore, "text/uon"); + } + + /** + * Constructor. + * + * @param propertyStore + * The property store containing all the settings for this object. + * @param produces + * The media type that this serializer produces. + * @param accept + * The accept media types that the serializer can handle. + * <p> + * Can contain meta-characters per the <code>media-type</code> specification of + * <a class="doclink" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">RFC2616/14.1</a> + * <p> + * If empty, then assumes the only media type supported is <code>produces</code>. + * <p> + * For example, if this serializer produces <js>"application/json"</js> but should handle media types of + * <js>"application/json"</js> and <js>"text/json"</js>, then the arguments should be: + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"application/json"</js>, <js>"text/json"</js>);</code> + * <br>...or... + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"*​/json"</js>);</code> + */ + public UonSerializer(PropertyStore propertyStore, String produces, String...accept) { + super(propertyStore, produces, accept); this.ctx = createContext(UonSerializerContext.class); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 34039bc..b6e8952 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 @@ -18,6 +18,7 @@ import static org.apache.juneau.uon.UonSerializerContext.*; import java.util.*; import org.apache.juneau.*; +import org.apache.juneau.internal.*; import org.apache.juneau.serializer.*; import org.apache.juneau.transform.*; @@ -45,7 +46,6 @@ public class UonSerializerSession extends WriterSerializerSession { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ public UonSerializerSession(UonSerializerContext ctx, Boolean encode, SerializerSessionArgs args) { super(ctx, args); @@ -166,6 +166,9 @@ public class UonSerializerSession extends WriterSerializerSession { else if (sType.isArray()) { serializeCollection(out, toList(sType.getInnerClass(), o), eType); } + else if (sType.isReader() || sType.isInputStream()) { + IOUtils.pipe(o, out); + } else { out.appendObject(o, false); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java index 399c882..3c2d729 100644 --- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java +++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java @@ -19,7 +19,6 @@ import static org.apache.juneau.internal.StringUtils.*; import java.util.*; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.parser.*; import org.apache.juneau.uon.*; @@ -49,7 +48,6 @@ import org.apache.juneau.uon.*; * </ul> */ @SuppressWarnings({ "unchecked", "hiding" }) -@Consumes("application/x-www-form-urlencoded") public class UrlEncodingParser extends UonParser implements PartParser { /** Reusable instance of {@link UrlEncodingParser}. */ @@ -64,7 +62,7 @@ public class UrlEncodingParser extends UonParser implements PartParser { * @param propertyStore The property store containing all the settings for this object. */ public UrlEncodingParser(PropertyStore propertyStore) { - super(propertyStore.copy().append(UON_decodeChars, true)); + super(propertyStore.copy().append(UON_decodeChars, true), "application/x-www-form-urlencoded"); this.ctx = createContext(UrlEncodingParserContext.class); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 9f872c0..9170cc2 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 @@ -21,7 +21,6 @@ import java.io.*; import java.net.*; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.serializer.*; import org.apache.juneau.uon.*; @@ -126,7 +125,6 @@ import org.apache.juneau.uon.*; * String s = UrlEncodingSerializer.<jsf>DEFAULT</jsf>.serialize(s); * </p> */ -@Produces("application/x-www-form-urlencoded") @SuppressWarnings("hiding") public class UrlEncodingSerializer extends UonSerializer implements PartSerializer { @@ -145,7 +143,6 @@ public class UrlEncodingSerializer extends UonSerializer implements PartSerializ /** * Equivalent to <code><jk>new</jk> UrlEncodingSerializerBuilder().expandedParams(<jk>true</jk>).build();</code>. */ - @Produces(value="application/x-www-form-urlencoded",contentType="application/x-www-form-urlencoded") public static class Expanded extends UrlEncodingSerializer { /** @@ -193,13 +190,40 @@ public class UrlEncodingSerializer extends UonSerializer implements PartSerializ /** * Constructor. * - * @param propertyStore The property store containing all the settings for this object. + * @param propertyStore + * The property store containing all the settings for this object. */ public UrlEncodingSerializer(PropertyStore propertyStore) { - super(propertyStore.copy().append(UON_encodeChars, true)); + this(propertyStore, "application/x-www-form-urlencoded"); + } + + /** + * Constructor. + * + * @param propertyStore + * The property store containing all the settings for this object. + * @param produces + * The media type that this serializer produces. + * @param accept + * The accept media types that the serializer can handle. + * <p> + * Can contain meta-characters per the <code>media-type</code> specification of + * <a class="doclink" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">RFC2616/14.1</a> + * <p> + * If empty, then assumes the only media type supported is <code>produces</code>. + * <p> + * For example, if this serializer produces <js>"application/json"</js> but should handle media types of + * <js>"application/json"</js> and <js>"text/json"</js>, then the arguments should be: + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"application/json"</js>, <js>"text/json"</js>);</code> + * <br>...or... + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"*​/json"</js>);</code> + */ + public UrlEncodingSerializer(PropertyStore propertyStore, String produces, String...accept) { + super(propertyStore.copy().append(UON_encodeChars, true), produces, accept); this.ctx = createContext(UrlEncodingSerializerContext.class); } + @Override /* CoreObject */ public UrlEncodingSerializerBuilder builder() { return new UrlEncodingSerializerBuilder(propertyStore); @@ -242,7 +266,7 @@ public class UrlEncodingSerializer extends UonSerializer implements PartSerializ } StringWriter w = new StringWriter(); - UonSerializerSession s = new UonSerializerSession(ctx, urlEncode, SerializerSessionArgs.DEFAULT); + UonSerializerSession s = new UonSerializerSession(ctx, urlEncode, createDefaultSessionArgs()); s.serialize(w, o); return w.toString(); } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 46e36d2..cce9b4d 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 @@ -18,6 +18,7 @@ import java.lang.reflect.*; import java.util.*; import org.apache.juneau.*; +import org.apache.juneau.internal.*; import org.apache.juneau.serializer.*; import org.apache.juneau.transform.*; import org.apache.juneau.uon.*; @@ -46,7 +47,6 @@ public class UrlEncodingSerializerSession extends UonSerializerSession { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ protected UrlEncodingSerializerSession(UrlEncodingSerializerContext ctx, Boolean encode, SerializerSessionArgs args) { super(ctx, encode, args); @@ -128,6 +128,8 @@ public class UrlEncodingSerializerSession extends UonSerializerSession { } else if (sType.isCollection() || sType.isArray()) { Map m = sType.isCollection() ? getCollectionMap((Collection)o) : getCollectionMap(o); serializeCollectionMap(out, m, getClassMeta(Map.class, Integer.class, Object.class)); + } else if (sType.isReader() || sType.isInputStream()) { + IOUtils.pipe(o, out); } else { // All other types can't be serialized as key/value pairs, so we create a // mock key/value pair with a "_value" key. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 6e70c35..f04c2d4 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 @@ -15,7 +15,6 @@ package org.apache.juneau.xml; import static org.apache.juneau.xml.XmlSerializerContext.*; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.serializer.*; /** @@ -37,7 +36,6 @@ import org.apache.juneau.serializer.*; public class XmlDocSerializer extends XmlSerializer { /** Default serializer without namespaces. */ - @Produces(value="text/xml",contentType="text/xml") public static class Ns extends XmlDocSerializer { /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/xml/XmlDocSerializerSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlDocSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlDocSerializerSession.java index b889889..a7a8748 100644 --- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlDocSerializerSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlDocSerializerSession.java @@ -34,7 +34,6 @@ public class XmlDocSerializerSession extends XmlSerializerSession { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ protected XmlDocSerializerSession(XmlSerializerContext ctx, SerializerSessionArgs args) { super(ctx, args); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java index cd81507..fbc6ae2 100644 --- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java +++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java @@ -13,7 +13,6 @@ package org.apache.juneau.xml; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.parser.*; /** @@ -35,7 +34,6 @@ import org.apache.juneau.parser.*; * <li>{@link BeanContext} * </ul> */ -@Consumes("text/xml,application/xml") public class XmlParser extends ReaderParser { /** Default parser, all default settings.*/ @@ -47,10 +45,23 @@ public class XmlParser extends ReaderParser { /** * Constructor. * - * @param propertyStore The property store containing all the settings for this object. + * @param propertyStore + * The property store containing all the settings for this object. */ public XmlParser(PropertyStore propertyStore) { - super(propertyStore); + this(propertyStore, "text/xml", "application/xml"); + } + + /** + * Constructor. + * + * @param propertyStore + * The property store containing all the settings for this object. + * @param consumes + * The list of media types that this parser consumes (e.g. <js>"application/json"</js>, <js>"*​/json"</js>). + */ + public XmlParser(PropertyStore propertyStore, String...consumes) { + super(propertyStore, consumes); this.ctx = createContext(XmlParserContext.class); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaDocSerializerSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaDocSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaDocSerializerSession.java index 23429a4..8d4a7aa 100644 --- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaDocSerializerSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaDocSerializerSession.java @@ -34,7 +34,6 @@ public class XmlSchemaDocSerializerSession extends XmlSchemaSerializerSession { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ protected XmlSchemaDocSerializerSession(XmlSerializerContext ctx, SerializerSessionArgs args) { super(ctx, args); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 26ba629..aba1879 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 @@ -13,7 +13,6 @@ package org.apache.juneau.xml; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.serializer.*; /** @@ -38,7 +37,6 @@ import org.apache.juneau.serializer.*; * <li>{@link BeanContext} * </ul> */ -@Produces(value="text/xml+schema",contentType="text/xml") public class XmlSchemaSerializer extends XmlSerializer { /** @@ -47,7 +45,7 @@ public class XmlSchemaSerializer extends XmlSerializer { * @param propertyStore Initialize with the specified config property store. */ public XmlSchemaSerializer(PropertyStore propertyStore) { - super(propertyStore.copy().append(XmlSerializerContext.XML_enableNamespaces, true)); + super(propertyStore.copy().append(XmlSerializerContext.XML_enableNamespaces, true), "text/xml", "text/xml+schema"); } @Override /* Serializer */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializerSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializerSession.java index f3b9120..6de01ec 100644 --- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializerSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializerSession.java @@ -49,7 +49,6 @@ public class XmlSchemaSerializerSession extends XmlSerializerSession { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ protected XmlSchemaSerializerSession(XmlSerializerContext ctx, SerializerSessionArgs args) { super(ctx, args); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 e836a67..2a81c03 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 @@ -16,7 +16,6 @@ import static org.apache.juneau.serializer.SerializerContext.*; import static org.apache.juneau.xml.XmlSerializerContext.*; import org.apache.juneau.*; -import org.apache.juneau.annotation.*; import org.apache.juneau.json.*; import org.apache.juneau.serializer.*; @@ -121,7 +120,6 @@ import org.apache.juneau.serializer.*; * <li>{@link SqReadable} - Default serializer, single quotes, whitespace added. * </ul> */ -@Produces("text/xml") public class XmlSerializer extends WriterSerializer { /** Default serializer without namespaces. */ @@ -170,7 +168,6 @@ public class XmlSerializer extends WriterSerializer { } /** Default serializer without namespaces. */ - @Produces(value="text/xml+simple",contentType="text/xml") public static class Ns extends XmlSerializer { /** @@ -179,7 +176,7 @@ public class XmlSerializer extends WriterSerializer { * @param propertyStore The property store containing all the settings for this object. */ public Ns(PropertyStore propertyStore) { - super(propertyStore.copy().append(XML_enableNamespaces, true)); + super(propertyStore.copy().append(XML_enableNamespaces, true), "text/xml", "text/xml+simple"); } } @@ -217,10 +214,36 @@ public class XmlSerializer extends WriterSerializer { /** * Constructor. * - * @param propertyStore The property store containing all the settings for this object. + * @param propertyStore + * The property store containing all the settings for this object. */ public XmlSerializer(PropertyStore propertyStore) { - super(propertyStore); + this(propertyStore, "text/xml"); + } + + /** + * Constructor. + * + * @param propertyStore + * The property store containing all the settings for this object. + * @param produces + * The media type that this serializer produces. + * @param accept + * The accept media types that the serializer can handle. + * <p> + * Can contain meta-characters per the <code>media-type</code> specification of + * <a class="doclink" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">RFC2616/14.1</a> + * <p> + * If empty, then assumes the only media type supported is <code>produces</code>. + * <p> + * For example, if this serializer produces <js>"application/json"</js> but should handle media types of + * <js>"application/json"</js> and <js>"text/json"</js>, then the arguments should be: + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"application/json"</js>, <js>"text/json"</js>);</code> + * <br>...or... + * <br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"*​/json"</js>);</code> + */ + public XmlSerializer(PropertyStore propertyStore, String produces, String...accept) { + super(propertyStore, produces, accept); this.ctx = createContext(XmlSerializerContext.class); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/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 1603f0d..d1c348d 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 @@ -25,6 +25,7 @@ import java.lang.reflect.*; import java.util.*; import org.apache.juneau.*; +import org.apache.juneau.internal.*; import org.apache.juneau.serializer.*; import org.apache.juneau.transform.*; import org.apache.juneau.xml.annotation.*; @@ -63,7 +64,6 @@ public class XmlSerializerSession extends WriterSerializerSession { * These specify session-level information such as locale and URI context. * It also include session-level properties that override the properties defined on the bean and * serializer contexts. - * <br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}. */ protected XmlSerializerSession(XmlSerializerContext ctx, SerializerSessionArgs args) { super(ctx, args); @@ -344,6 +344,7 @@ public class XmlSerializerSession extends WriterSerializerSession { o = null; boolean isCollapsed = false; // If 'true', this is a collection and we're not rendering the outer element. + boolean isRaw = (sType.isReader() || sType.isInputStream()) && o != null; // Get the JSON type string. if (o == null) { @@ -390,7 +391,7 @@ public class XmlSerializerSession extends WriterSerializerSession { boolean cr = o != null && (sType.isMapOrBean() || sType.isCollectionOrArray()) && ! isMixed; String en = elementName; - if (en == null) { + if (en == null && ! isRaw) { en = type.toString(); type = null; } @@ -406,25 +407,29 @@ public class XmlSerializerSession extends WriterSerializerSession { // Render the start tag. if (! isCollapsed) { - out.oTag(i, elementNs, en, encodeEn); - if (addNamespaceUris) { - out.attr((String)null, "xmlns", defaultNamespace.getUri()); + if (en != null) { + out.oTag(i, elementNs, en, encodeEn); + if (addNamespaceUris) { + out.attr((String)null, "xmlns", defaultNamespace.getUri()); - for (Namespace n : namespaces) - out.attr("xmlns", n.getName(), n.getUri()); - } - if (! isExpectedType) { - if (resolvedDictionaryName != null) - out.attr(dns, getBeanTypePropertyName(eType), resolvedDictionaryName); - else if (type != null && type != STRING) - out.attr(dns, getBeanTypePropertyName(eType), type); + for (Namespace n : namespaces) + out.attr("xmlns", n.getName(), n.getUri()); + } + if (! isExpectedType) { + if (resolvedDictionaryName != null) + out.attr(dns, getBeanTypePropertyName(eType), resolvedDictionaryName); + else if (type != null && type != STRING) + out.attr(dns, getBeanTypePropertyName(eType), type); + } + } else { + out.i(i); } if (o == null) { if ((sType.isBoolean() || sType.isNumber()) && ! sType.isNullable()) o = sType.getPrimitiveDefault(); } - if (o != null && ! (sType.isMapOrBean())) + if (o != null && ! (sType.isMapOrBean() || en == null)) out.append('>'); if (cr && ! (sType.isMapOrBean())) @@ -463,6 +468,8 @@ public class XmlSerializerSession extends WriterSerializerSession { serializeCollection(out, o, sType, eType, pMeta, isMixed); if (isCollapsed) this.indent++; + } else if (sType.isReader() || sType.isInputStream()) { + IOUtils.pipe(o, out); } else { if (format == XMLTEXT) out.append(toString(o)); @@ -475,16 +482,18 @@ public class XmlSerializerSession extends WriterSerializerSession { // Render the end tag. if (! isCollapsed) { - if (rc == CR_EMPTY) { - if (isHtmlMode()) - out.append('>').eTag(elementNs, en, encodeEn); - else + if (en != null) { + if (rc == CR_EMPTY) { + if (isHtmlMode()) + out.append('>').eTag(elementNs, en, encodeEn); + else + out.append('/').append('>'); + } else if (rc == CR_VOID || o == null) { out.append('/').append('>'); - } else if (rc == CR_VOID || o == null) { - out.append('/').append('>'); + } + else + out.ie(cr && rc != CR_MIXED ? i : 0).eTag(elementNs, en, encodeEn); } - else - out.ie(cr && rc != CR_MIXED ? i : 0).eTag(elementNs, en, encodeEn); if (! isMixed) out.nl(i); }
