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

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


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

commit d8ec44c1666fd4ccc86897643df3f4e859e56a29
Author: JamesBognar <[email protected]>
AuthorDate: Sat Aug 28 19:15:36 2021 -0400

    Context API refactoring.
---
 .../java/org/apache/juneau/rest/RestContext.java   | 143 +----------------
 .../org/apache/juneau/rest/RestContextBuilder.java | 171 +++++++++------------
 .../java/org/apache/juneau/rest/RestOpContext.java |   4 +-
 .../apache/juneau/rest/RestOpContextBuilder.java   |  69 +++++++++
 .../org/apache/juneau/rest/annotation/Rest.java    |   5 +-
 .../juneau/rest/annotation/RestAnnotation.java     |   9 +-
 .../org/apache/juneau/rest/annotation/RestGet.java |   3 +-
 .../juneau/rest/annotation/RestGetAnnotation.java  |   3 +-
 .../org/apache/juneau/rest/annotation/RestOp.java  |   5 +-
 .../juneau/rest/annotation/RestOpAnnotation.java   |   5 +-
 .../apache/juneau/rest/annotation/RestPost.java    |   5 +-
 .../juneau/rest/annotation/RestPostAnnotation.java |   5 +-
 .../org/apache/juneau/rest/annotation/RestPut.java |   5 +-
 .../juneau/rest/annotation/RestPutAnnotation.java  |   5 +-
 14 files changed, 176 insertions(+), 261 deletions(-)

diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index 9de62f4..44cb212 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -383,70 +383,6 @@ public class RestContext extends BeanContext {
        public static final String REST_children = PREFIX + ".children.lo";
 
        /**
-        * Configuration property:  Supported content media types.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.rest.RestContext#REST_consumes REST_consumes}
-        *      <li><b>Name:</b>  <js>"RestContext.consumes.ls"</js>
-        *      <li><b>Data type:</b>  <c>List&lt;String&gt;</c>
-        *      <li><b>System property:</b>  <c>RestContext.consumes</c>
-        *      <li><b>Environment variable:</b>  <c>RESTCONTEXT_CONSUMES</c>
-        *      <li><b>Default:</b>  empty list
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.rest.annotation.Rest#consumes()}
-        *                      <li class='ja'>{@link 
org.apache.juneau.rest.annotation.RestOp#consumes()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.rest.RestContextBuilder#consumes(String...)}
-        *                      <li class='jm'>{@link 
org.apache.juneau.rest.RestContextBuilder#consumes(MediaType...)}
-        *                      <li class='jm'>{@link 
org.apache.juneau.rest.RestContextBuilder#consumesReplace(String...)}
-        *                      <li class='jm'>{@link 
org.apache.juneau.rest.RestContextBuilder#consumesReplace(MediaType...)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * Overrides the media types inferred from the parsers that identify 
what media types can be consumed by the resource.
-        * <br>An example where this might be useful if you have parsers 
registered that handle media types that you
-        * don't want exposed in the Swagger documentation.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      <jc>// Option #1 - Defined via annotation resolving to a config 
file setting with default value.</jc>
-        *      
<ja>@Rest</ja>(consumes={<js>"$C{REST/supportedConsumes,application/json}"</js>})
-        *      <jk>public class</jk> MyResource {
-        *
-        *              <jc>// Option #2 - Defined via builder passed in 
through resource constructor.</jc>
-        *              <jk>public</jk> MyResource(RestContextBuilder 
<jv>builder</jv>) <jk>throws</jk> Exception {
-        *
-        *                      <jc>// Using method on builder.</jc>
-        *                      <jv>builder</jv>.consumes(<jk>false</jk>, 
<js>"application/json"</js>)
-        *
-        *                      <jc>// Same, but using property.</jc>
-        *                      <jv>builder</jv>.set(<jsf>REST_consumes</jsf>, 
<js>"application/json"</js>);
-        *              }
-        *
-        *              <jc>// Option #3 - Defined via builder passed in 
through init method.</jc>
-        *              <ja>@RestHook</ja>(<jsf>INIT</jsf>)
-        *              <jk>public void</jk> init(RestContextBuilder 
<jv>builder</jv>) <jk>throws</jk> Exception {
-        *                      <jv>builder</jv>.consumes(<jk>false</jk>, 
<js>"application/json"</js>);
-        *              }
-        *      }
-        * </p>
-        *
-        * <p>
-        * This affects the returned values from the following:
-        * <ul class='javatree'>
-        *      <li class='jm'>{@link RestContext#getConsumes() 
RestContext.getConsumes()}
-        * </ul>
-        */
-       public static final String REST_consumes = PREFIX + ".consumes.ls";
-
-       /**
         * Configuration property:  REST context class.
         *
         * <h5 class='section'>Property:</h5>
@@ -1649,71 +1585,6 @@ public class RestContext extends BeanContext {
        public static final String REST_partSerializer = PREFIX + 
".partSerializer.o";
 
        /**
-        * Configuration property:  Supported accept media types.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.rest.RestContext#REST_produces REST_produces}
-        *      <li><b>Name:</b>  <js>"RestContext.produces.ls"</js>
-        *      <li><b>Data type:</b>  <c>List&lt;String&gt;</c>
-        *      <li><b>System property:</b>  <c>RestContext.produces</c>
-        *      <li><b>Environment variable:</b>  <c>RESTCONTEXT_PRODUCES</c>
-        *      <li><b>Default:</b>  empty list
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.rest.annotation.Rest#produces()}
-        *                      <li class='ja'>{@link 
org.apache.juneau.rest.annotation.RestOp#produces()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.rest.RestContextBuilder#produces(String...)}
-        *                      <li class='jm'>{@link 
org.apache.juneau.rest.RestContextBuilder#produces(MediaType...)}
-        *                      <li class='jm'>{@link 
org.apache.juneau.rest.RestContextBuilder#producesReplace(String...)}
-        *                      <li class='jm'>{@link 
org.apache.juneau.rest.RestContextBuilder#producesReplace(MediaType...)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * Overrides the media types inferred from the serializers that 
identify what media types can be produced by the resource.
-        * <br>An example where this might be useful if you have serializers 
registered that handle media types that you
-        * don't want exposed in the Swagger documentation.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      <jc>// Option #1 - Defined via annotation resolving to a config 
file setting with default value.</jc>
-        *      
<ja>@Rest</ja>(produces={<js>"$C{REST/supportedProduces,application/json}"</js>})
-        *      <jk>public class</jk> MyResource {
-        *
-        *              <jc>// Option #2 - Defined via builder passed in 
through resource constructor.</jc>
-        *              <jk>public</jk> MyResource(RestContextBuilder 
<jv>builder</jv>) <jk>throws</jk> Exception {
-        *
-        *                      <jc>// Using method on builder.</jc>
-        *                      <jv>builder</jv>.produces(<jk>false</jk>, 
<js>"application/json"</js>)
-        *
-        *                      <jc>// Same, but using property.</jc>
-        *                      <jv>builder</jv>.set(<jsf>REST_produces</jsf>, 
<js>"application/json"</js>);
-        *              }
-        *
-        *              <jc>// Option #3 - Defined via builder passed in 
through init method.</jc>
-        *              <ja>@RestHook</ja>(<jsf>INIT</jsf>)
-        *              <jk>public void</jk> init(RestContextBuilder 
<jv>builder</jv>) <jk>throws</jk> Exception {
-        *                      <jv>builder</jv>.produces(<jk>false</jk>, 
<js>"application/json"</js>);
-        *              }
-        *      }
-        * </p>
-        *
-        * <p>
-        * This affects the returned values from the following:
-        * <ul class='javatree'>
-        *      <li class='jm'>{@link RestContext#getProduces() 
RestContext.getProduces()}
-        *      <li class='jm'>{@link 
SwaggerProvider#getSwagger(RestContext,Locale)} - Affects produces field.
-        * </ul>
-        */
-       public static final String REST_produces = PREFIX + ".produces.ls";
-
-       /**
         * Configuration property:  Render response stack traces in responses.
         *
         * <h5 class='section'>Property:</h5>
@@ -2806,20 +2677,18 @@ public class RestContext extends BeanContext {
 
                        restOperations = createRestOperations(r, cp, bf);
 
-                       List<MediaType> _produces = cp.getList(REST_produces, 
MediaType.class).orElse(null);
-                       List<MediaType> _consumes = cp.getList(REST_consumes, 
MediaType.class).orElse(null);
                        List<RestOpContext> opContexts = 
restOperations.getOpContexts();
 
-                       if (_produces != null)
-                               produces = AList.unmodifiable(_produces);
+                       if (builder.produces != null)
+                               produces = AList.unmodifiable(builder.produces);
                        else {
                                Set<MediaType> s = opContexts.isEmpty() ? 
emptySet() : new 
LinkedHashSet<>(opContexts.get(0).getSerializers().getSupportedMediaTypes());
                                opContexts.forEach(x -> 
s.retainAll(x.getSerializers().getSupportedMediaTypes()));
                                produces = AList.unmodifiable(s);
                        }
 
-                       if (_consumes != null)
-                               consumes = AList.unmodifiable(_consumes);
+                       if (builder.consumes != null)
+                               consumes = AList.unmodifiable(builder.consumes);
                        else {
                                Set<MediaType> s = opContexts.isEmpty() ? 
emptySet() : new 
LinkedHashSet<>(opContexts.get(0).getParsers().getSupportedMediaTypes());
                                opContexts.forEach(x -> 
s.retainAll(x.getParsers().getSupportedMediaTypes()));
@@ -5353,7 +5222,7 @@ public class RestContext extends BeanContext {
         * Consists of the media types for production common to all operations 
on this class.
         *
         * <p>
-        * Can be overridden by {@link RestContext#REST_produces}.
+        * Can be overridden by {@link 
RestContextBuilder#produces(MediaType...)}.
         *
         * @return
         *      An unmodifiable list of supported <c>Accept</c> header values 
for this resource.
@@ -5370,7 +5239,7 @@ public class RestContext extends BeanContext {
         * Consists of the media types for consumption common to all operations 
on this class.
         *
         * <p>
-        * Can be overridden by {@link RestContext#REST_consumes}.
+        * Can be overridden by {@link 
RestContextBuilder#consumes(MediaType...)}.
         *
         * @return
         *      An unmodifiable list of supported <c>Content-Type</c> header 
values for this resource.
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
index cee0ab8..5843142 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
@@ -117,6 +117,7 @@ public class RestContextBuilder extends BeanContextBuilder 
implements ServletCon
        UriResolution uriResolution;
        Charset defaultCharset;
        long maxInput;
+       List<MediaType> consumes, produces;
 
        RestContextBuilder(Optional<RestContext> parentContext, 
Optional<ServletConfig> servletConfig, Class<?> resourceClass, Optional<Object> 
resource) throws ServletException {
                try {
@@ -2122,49 +2123,47 @@ public class RestContextBuilder extends 
BeanContextBuilder implements ServletCon
        }
 
        /**
-        * <i><l>RestContext</l> configuration property:&emsp;</i>  Supported 
accept media types.
+        * Supported accept media types.
         *
         * <p>
         * Overrides the media types inferred from the serializers that 
identify what media types can be produced by the resource.
+        * <br>An example where this might be useful if you have serializers 
registered that handle media types that you
+        * don't want exposed in the Swagger documentation.
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_produces}
-        * </ul>
-        *
-        * @param values The values to add to this setting.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestContextBuilder produces(String...values) {
-               return prependTo(REST_produces, values);
-       }
-
-       /**
-        * <i><l>RestContext</l> configuration property:&emsp;</i>  Supported 
accept media types.
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      <jc>// Option #1 - Defined via annotation resolving to a config 
file setting with default value.</jc>
+        *      
<ja>@Rest</ja>(produces={<js>"$C{REST/supportedProduces,application/json}"</js>})
+        *      <jk>public class</jk> MyResource {
         *
-        * <p>
-        * Same as {@link #produces(String...)} but replaces any previous 
values.
+        *              <jc>// Option #2 - Defined via builder passed in 
through resource constructor.</jc>
+        *              <jk>public</jk> MyResource(RestContextBuilder 
<jv>builder</jv>) <jk>throws</jk> Exception {
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_produces}
-        * </ul>
+        *                      <jc>// Using method on builder.</jc>
+        *                      <jv>builder</jv>.produces(<jk>false</jk>, 
<js>"application/json"</js>)
+        *              }
         *
-        * @param values The values to set on this setting.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestContextBuilder producesReplace(String...values) {
-               return set(REST_produces, values);
-       }
-
-       /**
-        * <i><l>RestContext</l> configuration property:&emsp;</i>  Supported 
accept media types.
+        *              <jc>// Option #3 - Defined via builder passed in 
through init method.</jc>
+        *              <ja>@RestHook</ja>(<jsf>INIT</jsf>)
+        *              <jk>public void</jk> init(RestContextBuilder 
<jv>builder</jv>) <jk>throws</jk> Exception {
+        *                      <jv>builder</jv>.produces(<jk>false</jk>, 
<js>"application/json"</js>);
+        *              }
+        *      }
+        * </p>
         *
         * <p>
-        * Same as {@link #produces(String...)} except input is {@link 
MediaType} instances.
+        * This affects the returned values from the following:
+        * <ul class='javatree'>
+        *      <li class='jm'>{@link RestContext#getProduces() 
RestContext.getProduces()}
+        *      <li class='jm'>{@link 
SwaggerProvider#getSwagger(RestContext,Locale)} - Affects produces field.
+        * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_produces}
+        *      <li class='ja'>{@link Rest#produces}
+        *      <li class='ja'>{@link RestOp#produces}
+        *      <li class='ja'>{@link RestGet#produces}
+        *      <li class='ja'>{@link RestPut#produces}
+        *      <li class='ja'>{@link RestPost#produces}
         * </ul>
         *
         * @param values The values to add to this setting.
@@ -2172,71 +2171,53 @@ public class RestContextBuilder extends 
BeanContextBuilder implements ServletCon
         */
        @FluentSetter
        public RestContextBuilder produces(MediaType...values) {
-               return prependTo(REST_produces, values);
-       }
-
-       /**
-        * <i><l>RestContext</l> configuration property:&emsp;</i>  Supported 
accept media types.
-        *
-        * <p>
-        * Same as {@link #produces(MediaType...)} but replaces any previous 
values.
-        *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_produces}
-        * </ul>
-        *
-        * @param values The values to set on this setting.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestContextBuilder producesReplace(MediaType...values) {
-               return set(REST_produces, values);
+               if (produces == null)
+                       produces = new ArrayList<>(Arrays.asList(values));
+               else
+                       produces.addAll(Arrays.asList(values));
+               return this;
        }
 
        /**
-        * <i><l>RestContext</l> configuration property:&emsp;</i>  Supported 
content media types.
+        * Supported content media types.
         *
         * <p>
         * Overrides the media types inferred from the parsers that identify 
what media types can be consumed by the resource.
+        * <br>An example where this might be useful if you have parsers 
registered that handle media types that you
+        * don't want exposed in the Swagger documentation.
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_consumes}
-        * </ul>
-        *
-        * @param values The values to add to this setting.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestContextBuilder consumes(String...values) {
-               return prependTo(REST_consumes, values);
-       }
-
-       /**
-        * <i><l>RestContext</l> configuration property:&emsp;</i>  Supported 
content media types.
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      <jc>// Option #1 - Defined via annotation resolving to a config 
file setting with default value.</jc>
+        *      
<ja>@Rest</ja>(consumes={<js>"$C{REST/supportedConsumes,application/json}"</js>})
+        *      <jk>public class</jk> MyResource {
         *
-        * <p>
-        * Same as {@link #consumes(String...)} but replaces any existing 
values.
+        *              <jc>// Option #2 - Defined via builder passed in 
through resource constructor.</jc>
+        *              <jk>public</jk> MyResource(RestContextBuilder 
<jv>builder</jv>) <jk>throws</jk> Exception {
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_consumes}
-        * </ul>
+        *                      <jc>// Using method on builder.</jc>
+        *                      <jv>builder</jv>.consumes(<jk>false</jk>, 
<js>"application/json"</js>)
+        *              }
         *
-        * @param values The values to set on this setting.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestContextBuilder consumesReplace(String...values) {
-               return set(REST_consumes, values);
-       }
-
-       /**
-        * <i><l>RestContext</l> configuration property:&emsp;</i>  Supported 
content media types.
+        *              <jc>// Option #3 - Defined via builder passed in 
through init method.</jc>
+        *              <ja>@RestHook</ja>(<jsf>INIT</jsf>)
+        *              <jk>public void</jk> init(RestContextBuilder 
<jv>builder</jv>) <jk>throws</jk> Exception {
+        *                      <jv>builder</jv>.consumes(<jk>false</jk>, 
<js>"application/json"</js>);
+        *              }
+        *      }
+        * </p>
         *
         * <p>
-        * Same as {@link #consumes(String...)} except input is {@link 
MediaType} instances.
+        * This affects the returned values from the following:
+        * <ul class='javatree'>
+        *      <li class='jm'>{@link RestContext#getConsumes() 
RestContext.getConsumes()}
+        * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_consumes}
+        *      <li class='ja'>{@link Rest#consumes}
+        *      <li class='ja'>{@link RestOp#consumes}
+        *      <li class='ja'>{@link RestPut#consumes}
+        *      <li class='ja'>{@link RestPost#consumes}
         * </ul>
         *
         * @param values The values to add to this setting.
@@ -2244,25 +2225,11 @@ public class RestContextBuilder extends 
BeanContextBuilder implements ServletCon
         */
        @FluentSetter
        public RestContextBuilder consumes(MediaType...values) {
-               return prependTo(REST_consumes, values);
-       }
-
-       /**
-        * <i><l>RestContext</l> configuration property:&emsp;</i>  Supported 
content media types.
-        *
-        * <p>
-        * Same as {@link #consumes(MediaType...)} except replaces any existing 
values.
-        *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_consumes}
-        * </ul>
-        *
-        * @param values The values to set on this setting.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestContextBuilder consumesReplace(MediaType...values) {
-               return set(REST_consumes, values);
+               if (consumes == null)
+                       consumes = new ArrayList<>(Arrays.asList(values));
+               else
+                       consumes.addAll(Arrays.asList(values));
+               return this;
        }
 
        /**
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
index 45bfa9e..5813cbb 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
@@ -182,8 +182,8 @@ public class RestOpContext extends BeanContext implements 
Comparable<RestOpConte
                        jsonSchemaGenerator = createJsonSchemaGenerator(r, cp, 
bs);
                        bs.addBean(JsonSchemaGenerator.class, 
jsonSchemaGenerator);
 
-                       supportedAcceptTypes = 
unmodifiableList(cp.getList(REST_produces, 
MediaType.class).orElse(serializers.getSupportedMediaTypes()));
-                       supportedContentTypes = 
unmodifiableList(cp.getList(REST_consumes, 
MediaType.class).orElse(parsers.getSupportedMediaTypes()));
+                       supportedAcceptTypes = 
unmodifiableList(ofNullable(builder.produces).orElse(serializers.getSupportedMediaTypes()));
+                       supportedContentTypes = 
unmodifiableList(ofNullable(builder.consumes).orElse(parsers.getSupportedMediaTypes()));
 
                        defaultRequestHeaders = createDefaultRequestHeaders(r, 
builder, bs, method, context).build();
                        defaultResponseHeaders = 
createDefaultResponseHeaders(r, builder, bs, method, context).build();
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java
index d8a8b63..5b9e916 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java
@@ -44,6 +44,7 @@ public class RestOpContextBuilder extends BeanContextBuilder {
        NamedAttributeList defaultRequestAttributes;
        HeaderListBuilder defaultRequestHeaders, defaultResponseHeaders;
        RestMatcherListBuilder restMatchers;
+       List<MediaType> produces, consumes;
 
        Charset defaultCharset;
        Long maxInput;
@@ -632,6 +633,74 @@ public class RestOpContextBuilder extends 
BeanContextBuilder {
                return this;
        }
 
+       /**
+        * Supported accept media types.
+        *
+        * <p>
+        * Overrides the media types inferred from the serializers that 
identify what media types can be produced by the resource.
+        * <br>An example where this might be useful if you have serializers 
registered that handle media types that you
+        * don't want exposed in the Swagger documentation.
+        *
+        * <p>
+        * This affects the returned values from the following:
+        * <ul class='javatree'>
+        *      <li class='jm'>{@link RestContext#getProduces() 
RestContext.getProduces()}
+        *      <li class='jm'>{@link 
SwaggerProvider#getSwagger(RestContext,Locale)} - Affects produces field.
+        * </ul>
+        *
+        * <ul class='seealso'>
+        *      <li class='ja'>{@link Rest#produces}
+        *      <li class='ja'>{@link RestOp#produces}
+        *      <li class='ja'>{@link RestGet#produces}
+        *      <li class='ja'>{@link RestPut#produces}
+        *      <li class='ja'>{@link RestPost#produces}
+        * </ul>
+        *
+        * @param values The values to add to this setting.
+        * @return This object (for method chaining).
+        */
+       @FluentSetter
+       public RestOpContextBuilder produces(MediaType...values) {
+               if (produces == null)
+                       produces = new ArrayList<>(Arrays.asList(values));
+               else
+                       produces.addAll(Arrays.asList(values));
+               return this;
+       }
+
+       /**
+        * Supported content media types.
+        *
+        * <p>
+        * Overrides the media types inferred from the parsers that identify 
what media types can be consumed by the resource.
+        * <br>An example where this might be useful if you have parsers 
registered that handle media types that you
+        * don't want exposed in the Swagger documentation.
+        *
+        * <p>
+        * This affects the returned values from the following:
+        * <ul class='javatree'>
+        *      <li class='jm'>{@link RestContext#getConsumes() 
RestContext.getConsumes()}
+        * </ul>
+        *
+        * <ul class='seealso'>
+        *      <li class='ja'>{@link Rest#consumes}
+        *      <li class='ja'>{@link RestOp#consumes}
+        *      <li class='ja'>{@link RestPut#consumes}
+        *      <li class='ja'>{@link RestPost#consumes}
+        * </ul>
+        *
+        * @param values The values to add to this setting.
+        * @return This object (for method chaining).
+        */
+       @FluentSetter
+       public RestOpContextBuilder consumes(MediaType...values) {
+               if (consumes == null)
+                       consumes = new ArrayList<>(Arrays.asList(values));
+               else
+                       consumes.addAll(Arrays.asList(values));
+               return this;
+       }
+
        // <FluentSetters>
 
        @Override /* GENERATED - ContextBuilder */
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
index 9e3a544..9c2193d 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
@@ -24,6 +24,7 @@ import org.apache.juneau.annotation.*;
 import org.apache.juneau.config.*;
 import org.apache.juneau.cp.*;
 import org.apache.juneau.encoders.*;
+import org.apache.juneau.http.header.*;
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.logging.*;
@@ -265,7 +266,7 @@ public @interface Rest {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_consumes}
+        *      <li class='jm'>{@link RestContextBuilder#consumes(MediaType...)}
         * </ul>
         */
        String[] consumes() default {};
@@ -896,7 +897,7 @@ public @interface Rest {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_produces}
+        *      <li class='jm'>{@link RestContextBuilder#produces(MediaType...)}
         * </ul>
         */
        String[] produces() default {};
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
index ffebf75..73d5ec0 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
@@ -24,6 +24,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.cp.*;
 import org.apache.juneau.encoders.*;
+import org.apache.juneau.http.header.*;
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
@@ -1042,8 +1043,8 @@ public class RestAnnotation {
 
                        b.setIf(a.partSerializer() != 
HttpPartSerializer.Null.class, REST_partSerializer, a.partSerializer());
                        b.setIf(a.partParser() != HttpPartParser.Null.class, 
REST_partParser, a.partParser());
-                       b.setIfNotEmpty(REST_produces, 
stringList(a.produces()));
-                       b.setIfNotEmpty(REST_consumes, 
stringList(a.consumes()));
+                       stringStream(a.produces()).map(MediaType::of).forEach(x 
-> b.produces(x));
+                       stringStream(a.consumes()).map(MediaType::of).forEach(x 
-> b.consumes(x));
                        stringStream(a.defaultRequestAttributes()).map(x -> 
BasicNamedAttribute.ofPair(x)).forEach(x -> 
b.appendTo(REST_defaultRequestAttributes, x));
                        stringStream(a.defaultRequestHeaders()).map(x -> 
stringHeader(x)).forEach(x -> b.appendTo(REST_defaultRequestHeaders, x));
                        stringStream(a.defaultResponseHeaders()).map(x -> 
stringHeader(x)).forEach(x -> b.appendTo(REST_defaultResponseHeaders, x));
@@ -1102,8 +1103,8 @@ public class RestAnnotation {
                        b.setIf(a.partSerializer() != 
HttpPartSerializer.Null.class, REST_partSerializer, a.partSerializer());
                        b.setIf(a.partParser() != HttpPartParser.Null.class, 
REST_partParser, a.partParser());
                        b.prependTo(REST_encoders, a.encoders());
-                       b.setIfNotEmpty(REST_produces, 
stringList(a.produces()));
-                       b.setIfNotEmpty(REST_consumes, 
stringList(a.consumes()));
+                       stringStream(a.produces()).map(MediaType::of).forEach(x 
-> b.produces(x));
+                       stringStream(a.consumes()).map(MediaType::of).forEach(x 
-> b.consumes(x));
                        b.prependTo(REST_converters, a.converters());
                        b.prependTo(REST_guards, reverse(a.guards()));
                        
value(a.defaultCharset()).map(Charset::forName).ifPresent(x -> 
b.defaultCharset(x));
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGet.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGet.java
index 188bfc7..aef77f1 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGet.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGet.java
@@ -21,6 +21,7 @@ import java.nio.charset.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.dto.swagger.*;
+import org.apache.juneau.http.header.*;
 
 /**
  * Identifies a REST GET operation Java method on a {@link RestServlet} 
implementation class.
@@ -412,7 +413,7 @@ public @interface RestGet {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_produces}
+        *      <li class='jm'>{@link 
RestOpContextBuilder#produces(MediaType...)}
         * </ul>
         */
        String[] produces() default {};
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGetAnnotation.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGetAnnotation.java
index d2572e2..593b5d2 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGetAnnotation.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestGetAnnotation.java
@@ -23,6 +23,7 @@ import java.nio.charset.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.http.header.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
 import org.apache.juneau.rest.*;
@@ -512,7 +513,7 @@ public class RestGetAnnotation {
                        b.set(REST_serializers, 
merge(ConverterUtils.toType(b.peek(REST_serializers), Object[].class), 
a.serializers()));
                        b.set(REST_encoders, 
merge(ConverterUtils.toType(b.peek(REST_encoders), Object[].class), 
a.encoders()));
                        value(a.contextClass(), 
RestOpContext.Null.class).ifPresent(x -> b.contextClass(x));
-                       b.setIfNotEmpty(REST_produces, 
stringList(a.produces()));
+                       stringStream(a.produces()).map(MediaType::of).forEach(x 
-> b.produces(x));
                        stringStream(a.defaultRequestHeaders()).map(x -> 
stringHeader(x)).forEach(x -> b.defaultRequestHeaders(x));
                        stringStream(a.defaultResponseHeaders()).map(x -> 
stringHeader(x)).forEach(x -> b.defaultResponseHeaders(x));
                        stringStream(a.defaultRequestAttributes()).map(x -> 
BasicNamedAttribute.ofPair(x)).forEach(x -> b.defaultRequestAttributes(x));
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOp.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOp.java
index 14304e5..185b0bd 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOp.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOp.java
@@ -20,6 +20,7 @@ import java.nio.charset.*;
 
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.rest.*;
+import org.apache.juneau.http.header.*;
 import org.apache.juneau.http.remote.*;
 import org.apache.juneau.dto.swagger.*;
 
@@ -113,7 +114,7 @@ public @interface RestOp {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_consumes}
+        *      <li class='jm'>{@link 
RestOpContextBuilder#consumes(MediaType...)}
         * </ul>
         */
        String[] consumes() default {};
@@ -613,7 +614,7 @@ public @interface RestOp {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_produces}
+        *      <li class='jm'>{@link 
RestOpContextBuilder#produces(MediaType...)}
         * </ul>
         */
        String[] produces() default {};
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOpAnnotation.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOpAnnotation.java
index 5e34d85..f9c668a 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOpAnnotation.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOpAnnotation.java
@@ -23,6 +23,7 @@ import java.nio.charset.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.http.header.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
 import org.apache.juneau.rest.*;
@@ -613,8 +614,8 @@ public class RestOpAnnotation {
                        b.set(REST_parsers, 
merge(ConverterUtils.toType(b.peek(REST_parsers), Object[].class), 
a.parsers()));
                        b.set(REST_encoders, 
merge(ConverterUtils.toType(b.peek(REST_encoders), Object[].class), 
a.encoders()));
                        value(a.contextClass(), 
RestOpContext.Null.class).ifPresent(x -> b.contextClass(x));
-                       b.setIfNotEmpty(REST_produces, 
stringList(a.produces()));
-                       b.setIfNotEmpty(REST_consumes, 
stringList(a.consumes()));
+                       stringStream(a.produces()).map(MediaType::of).forEach(x 
-> b.produces(x));
+                       stringStream(a.consumes()).map(MediaType::of).forEach(x 
-> b.consumes(x));
                        stringStream(a.defaultRequestHeaders()).map(x -> 
stringHeader(x)).forEach(x -> b.defaultRequestHeaders(x));
                        stringStream(a.defaultResponseHeaders()).map(x -> 
stringHeader(x)).forEach(x -> b.defaultResponseHeaders(x));
                        stringStream(a.defaultRequestAttributes()).map(x -> 
BasicNamedAttribute.ofPair(x)).forEach(x -> b.defaultRequestAttributes(x));
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPost.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPost.java
index 8f85585..60a353c 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPost.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPost.java
@@ -21,6 +21,7 @@ import java.nio.charset.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.dto.swagger.*;
+import org.apache.juneau.http.header.*;
 
 /**
  * Identifies a REST POST operation Java method on a {@link RestServlet} 
implementation class.
@@ -115,7 +116,7 @@ public @interface RestPost {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_consumes}
+        *      <li class='jm'>{@link 
RestOpContextBuilder#consumes(MediaType...)}
         * </ul>
         */
        String[] consumes() default {};
@@ -539,7 +540,7 @@ public @interface RestPost {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_produces}
+        *      <li class='jm'>{@link 
RestOpContextBuilder#produces(MediaType...)}
         * </ul>
         */
        String[] produces() default {};
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPostAnnotation.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPostAnnotation.java
index ac4a714..0ccf4da 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPostAnnotation.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPostAnnotation.java
@@ -23,6 +23,7 @@ import java.nio.charset.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.http.header.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
 import org.apache.juneau.rest.*;
@@ -598,8 +599,8 @@ public class RestPostAnnotation {
                        b.set(REST_parsers, 
merge(ConverterUtils.toType(b.peek(REST_parsers), Object[].class), 
a.parsers()));
                        b.set(REST_encoders, 
merge(ConverterUtils.toType(b.peek(REST_encoders), Object[].class), 
a.encoders()));
                        value(a.contextClass(), 
RestOpContext.Null.class).ifPresent(x -> b.contextClass(x));
-                       b.setIfNotEmpty(REST_produces, 
stringList(a.produces()));
-                       b.setIfNotEmpty(REST_consumes, 
stringList(a.consumes()));
+                       stringStream(a.produces()).map(MediaType::of).forEach(x 
-> b.produces(x));
+                       stringStream(a.consumes()).map(MediaType::of).forEach(x 
-> b.consumes(x));
                        stringStream(a.defaultRequestHeaders()).map(x -> 
stringHeader(x)).forEach(x -> b.defaultRequestHeaders(x));
                        stringStream(a.defaultResponseHeaders()).map(x -> 
stringHeader(x)).forEach(x -> b.defaultResponseHeaders(x));
                        stringStream(a.defaultRequestAttributes()).map(x -> 
BasicNamedAttribute.ofPair(x)).forEach(x -> b.defaultRequestAttributes(x));
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPut.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPut.java
index 9139625..f8207f9 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPut.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPut.java
@@ -21,6 +21,7 @@ import java.nio.charset.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.dto.swagger.*;
+import org.apache.juneau.http.header.*;
 
 /**
  * Identifies a REST PUT operation Java method on a {@link RestServlet} 
implementation class.
@@ -115,7 +116,7 @@ public @interface RestPut {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_consumes}
+        *      <li class='jm'>{@link 
RestOpContextBuilder#consumes(MediaType...)}
         * </ul>
         */
        String[] consumes() default {};
@@ -539,7 +540,7 @@ public @interface RestPut {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_produces}
+        *      <li class='jm'>{@link 
RestOpContextBuilder#produces(MediaType...)}
         * </ul>
         */
        String[] produces() default {};
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPutAnnotation.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPutAnnotation.java
index b931366..9d0124b 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPutAnnotation.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPutAnnotation.java
@@ -23,6 +23,7 @@ import java.nio.charset.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.http.header.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
 import org.apache.juneau.rest.*;
@@ -598,8 +599,8 @@ public class RestPutAnnotation {
                        b.set(REST_parsers, 
merge(ConverterUtils.toType(b.peek(REST_parsers), Object[].class), 
a.parsers()));
                        b.set(REST_encoders, 
merge(ConverterUtils.toType(b.peek(REST_encoders), Object[].class), 
a.encoders()));
                        value(a.contextClass(), 
RestOpContext.Null.class).ifPresent(x -> b.contextClass(x));
-                       b.setIfNotEmpty(REST_produces, 
stringList(a.produces()));
-                       b.setIfNotEmpty(REST_consumes, 
stringList(a.consumes()));
+                       stringStream(a.produces()).map(MediaType::of).forEach(x 
-> b.produces(x));
+                       stringStream(a.consumes()).map(MediaType::of).forEach(x 
-> b.consumes(x));
                        stringStream(a.defaultRequestHeaders()).map(x -> 
stringHeader(x)).forEach(x -> b.defaultRequestHeaders(x));
                        stringStream(a.defaultResponseHeaders()).map(x -> 
stringHeader(x)).forEach(x -> b.defaultResponseHeaders(x));
                        stringStream(a.defaultRequestAttributes()).map(x -> 
BasicNamedAttribute.ofPair(x)).forEach(x -> b.defaultRequestAttributes(x));

Reply via email to