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 1e9ffea  Context API refactoring.
1e9ffea is described below

commit 1e9ffead7209fa851b60fece3404dc2ea0903e5a
Author: JamesBognar <[email protected]>
AuthorDate: Sat Aug 28 15:38:38 2021 -0400

    Context API refactoring.
---
 .../java/org/apache/juneau/rest/RestContext.java   | 284 +--------------------
 .../org/apache/juneau/rest/RestContextBuilder.java | 209 +++++++++++++--
 .../org/apache/juneau/rest/annotation/Rest.java    |   8 +-
 .../juneau/rest/annotation/RestAnnotation.java     |   8 +-
 4 files changed, 202 insertions(+), 307 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 2a2a409..3375875 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
@@ -2650,274 +2650,6 @@ public class RestContext extends BeanContext {
         */
        public static final String REST_swaggerProvider = PREFIX + 
".swaggerProvider.o";
 
-       /**
-        * Configuration property:  Resource URI authority path.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.rest.RestContext#REST_uriAuthority REST_uriAuthority}
-        *      <li><b>Name:</b>  <js>"RestContext.uriAuthority.s"</js>
-        *      <li><b>Data type:</b>  <c>String</c>
-        *      <li><b>System property:</b>  <c>RestContext.uriAuthority</c>
-        *      <li><b>Environment variable:</b>  
<c>RESTCONTEXT_URIAUTHORITY</c>
-        *      <li><b>Default:</b>  <jk>null</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.rest.annotation.Rest#uriAuthority()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.rest.RestContextBuilder#uriAuthority(String)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * Overrides the authority path value for this resource and any child 
resources.
-        *
-        * <p>
-        * Affects the following methods:
-        * <ul class='javatree'>
-        *      <li class='jm'>{@link RestRequest#getAuthorityPath()}
-        * </ul>
-        *
-        * <p>
-        * If you do not specify the authority, it is automatically calculated 
via the following:
-        *
-        * <p class='bcode w800'>
-        *      String <jv>scheme</jv> = <jv>request</jv>.getScheme();
-        *      <jk>int</jk> <jv>port</jv> = <jv>request</jv>.getServerPort();
-        *      StringBuilder <jv>sb</jv> = <jk>new</jk> 
StringBuilder(<jv>request</jv>.getScheme()).append(<js>"://"</js>).append(<jv>request</jv>.getServerName());
-        *      <jk>if</jk> (! (<jv>port</jv> == 80 &amp;&amp; 
<js>"http"</js>.equals(<jv>scheme</jv>) || port == 443 &amp;&amp; 
<js>"https"</js>.equals(<jv>scheme</jv>)))
-        *              <jv>sb</jv>.append(<js>':'</js>).append(<jv>port</jv>);
-        *      <jv>authorityPath</jv> = <jv>sb</jv>.toString();
-        * </p>
-        *
-        * <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>(
-        *              path=<js>"/servlet"</js>,
-        *              
uriAuthority=<js>"$C{REST/authorityPathOverride,http://localhost:10000}";</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>.uriAuthority(<js>"http://localhost:10000";</js>);
-        *
-        *                      <jc>// Same, but using property.</jc>
-        *                      
<jv>builder</jv>.set(<jsf>REST_uriAuthority</jsf>, 
<js>"http://localhost:10000";</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>.uriAuthority(<js>"http://localhost:10000";</js>);
-        *              }
-        *      }
-        * </p>
-        */
-       public static final String REST_uriAuthority = PREFIX + 
".uriAuthority.s";
-
-       /**
-        * Configuration property:  Resource URI context path.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.rest.RestContext#REST_uriContext REST_uriContext}
-        *      <li><b>Name:</b>  <js>"RestContext.uriContext.s"</js>
-        *      <li><b>Data type:</b>  <c>String</c>
-        *      <li><b>System property:</b>  <c>RestContext.uriContext</c>
-        *      <li><b>Environment variable:</b>  <c>RESTCONTEXT_URICONTEXT</c>
-        *      <li><b>Default:</b>  <jk>null</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.rest.annotation.Rest#uriContext()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.rest.RestContextBuilder#uriContext(String)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * Overrides the context path value for this resource and any child 
resources.
-        *
-        * <p>
-        * This setting is useful if you want to use 
<js>"context:/child/path"</js> URLs in child resource POJOs but
-        * the context path is not actually specified on the servlet container.
-        *
-        * <p>
-        * Affects the following methods:
-        * <ul class='javatree'>
-        *      <li class='jm'>{@link RestRequest#getContextPath()} - Returns 
the overridden context path for the resource.
-        *      <li class='jm'>{@link RestRequest#getServletPath()} - Includes 
the overridden context path for the resource.
-        * </ul>
-        *
-        * <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>(
-        *              path=<js>"/servlet"</js>,
-        *              uriContext=<js>"$C{REST/contextPathOverride,/foo}"</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>.uriContext(<js>"/foo"</js>);
-        *
-        *                      <jc>// Same, but using property.</jc>
-        *                      
<jv>builder</jv>.set(<jsf>REST_uriContext</jsf>, <js>"/foo"</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>.uriContext(<js>"/foo"</js>);
-        *              }
-        *      }
-        * </p>
-        */
-       public static final String REST_uriContext = PREFIX + ".uriContext.s";
-
-       /**
-        * Configuration property:  URI resolution relativity.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.rest.RestContext#REST_uriRelativity REST_uriRelativity}
-        *      <li><b>Name:</b>  <js>"RestContext.uriRelativity.s"</js>
-        *      <li><b>Data type:</b>  <c>String</c>
-        *      <li><b>System property:</b>  <c>RestContext.uriRelativity</c>
-        *      <li><b>Environment variable:</b>  
<c>RESTCONTEXT_URIRELATIVITY</c>
-        *      <li><b>Default:</b>  <js>"RESOURCE"</js>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.rest.annotation.Rest#uriRelativity()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.rest.RestContextBuilder#uriRelativity(String)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * Specifies how relative URIs should be interpreted by serializers.
-        *
-        * <p>
-        * See {@link UriResolution} for possible values.
-        *
-        * <p>
-        * Affects the following methods:
-        * <ul class='javatree'>
-        *      <li class='jm'>{@link RestRequest#getUriResolver()}
-        * </ul>
-        *
-        * <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>(
-        *              path=<js>"/servlet"</js>,
-        *              
uriRelativity=<js>"$C{REST/uriRelativity,PATH_INFO}"</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>.uriRelativity(<js>"PATH_INFO"</js>);
-        *
-        *                      <jc>// Same, but using property.</jc>
-        *                      
<jv>builder</jv>.set(<jsf>REST_uriRelativity</jsf>, <js>"PATH_INFO"</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>.uriRelativity(<js>"PATH_INFO"</js>);
-        *              }
-        *      }
-        * </p>
-        */
-       public static final String REST_uriRelativity = PREFIX + 
".uriRelativity.s";
-
-       /**
-        * Configuration property:  URI resolution.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.rest.RestContext#REST_uriResolution REST_uriResolution}
-        *      <li><b>Name:</b>  <js>"RestContext.uriResolution.s"</js>
-        *      <li><b>Data type:</b>  <c>String</c>
-        *      <li><b>System property:</b>  <c>RestContext.uriResolution</c>
-        *      <li><b>Environment variable:</b>  
<c>RESTCONTEXT_URIRESOLUTION</c>
-        *      <li><b>Default:</b>  <js>"ROOT_RELATIVE"</js>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.rest.annotation.Rest#uriResolution()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.rest.RestContextBuilder#uriResolution(String)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * Specifies how relative URIs should be interpreted by serializers.
-        *
-        * <p>
-        * See {@link UriResolution} for possible values.
-        *
-        * <p>
-        * Affects the following methods:
-        * <ul class='javatree'>
-        *      <li class='jm'>{@link RestRequest#getUriResolver()}
-        * </ul>
-        *
-        * <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>(
-        *              path=<js>"/servlet"</js>,
-        *              uriResolution=<js>"$C{REST/uriResolution,ABSOLUTE}"</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>.uriResolution(<js>"ABSOLUTE"</js>);
-        *
-        *                      <jc>// Same, but using property.</jc>
-        *                      
<jv>builder</jv>.set(<jsf>REST_uriResolution</jsf>, <js>"ABSOLUTE"</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>.uriResolution(<js>"ABSOLUTE"</js>);
-        *              }
-        *      }
-        * </p>
-        */
-       public static final String REST_uriResolution = PREFIX + 
".uriResolution.s";
-
-
        
//-------------------------------------------------------------------------------------------------------------------
        // Static
        
//-------------------------------------------------------------------------------------------------------------------
@@ -3112,10 +2844,10 @@ public class RestContext extends BeanContext {
                        opArgs = createOpArgs(r, cp, bf).asArray();
                        hookMethodArgs = createHookMethodArgs(r, cp, 
bf).asArray();
 
-                       uriContext = 
nullIfEmpty(cp.getString(REST_uriContext).orElse(null));
-                       uriAuthority = 
nullIfEmpty(cp.getString(REST_uriAuthority).orElse(null));
-                       uriResolution = cp.get(REST_uriResolution, 
UriResolution.class).orElse(UriResolution.ROOT_RELATIVE);
-                       uriRelativity = cp.get(REST_uriRelativity, 
UriRelativity.class).orElse(UriRelativity.RESOURCE);
+                       uriContext = builder.uriContext;
+                       uriAuthority = builder.uriAuthority;
+                       uriResolution = builder.uriResolution;
+                       uriRelativity = builder.uriRelativity;
 
                        allowBodyParam = ! 
cp.getBoolean(REST_disableAllowBodyParam).orElse(false);
                        allowedHeaderParams = 
newCaseInsensitiveSet(Optional.of(builder.allowedHeaderParams).map(x -> 
"NONE".equals(x) ? "" : x).orElse(""));
@@ -5785,7 +5517,7 @@ public class RestContext extends BeanContext {
         * Returns the authority path of the resource.
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_uriAuthority}
+        *      <li class='jm'>{@link RestContextBuilder#uriAuthority(String)}
         * </ul>
         *
         * @return
@@ -5804,7 +5536,7 @@ public class RestContext extends BeanContext {
         * Returns the context path of the resource.
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_uriContext}
+        *      <li class='jm'>{@link RestContextBuilder#uriContext(String)}
         * </ul>
         *
         * @return
@@ -5823,7 +5555,7 @@ public class RestContext extends BeanContext {
         * Returns the setting on how relative URIs should be interpreted as 
relative to.
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_uriRelativity}
+        *      <li class='jm'>{@link 
RestContextBuilder#uriRelativity(UriRelativity)}
         * </ul>
         *
         * @return
@@ -5838,7 +5570,7 @@ public class RestContext extends BeanContext {
         * Returns the setting on how relative URIs should be resolved.
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_uriResolution}
+        *      <li class='jm'>{@link 
RestContextBuilder#uriResolution(UriResolution)}
         * </ul>
         *
         * @return
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 a3b48c2..d34c20c 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
@@ -112,7 +112,9 @@ public class RestContextBuilder extends BeanContextBuilder 
implements ServletCon
 
        Config config;
        VarResolverBuilder varResolverBuilder;
-       String allowedHeaderParams, allowedMethodHeaders, allowedMethodParams, 
clientVersionHeader;
+       String allowedHeaderParams, allowedMethodHeaders, allowedMethodParams, 
clientVersionHeader, uriAuthority, uriContext;
+       UriRelativity uriRelativity;
+       UriResolution uriResolution;
        Charset defaultCharset;
        long maxInput;
 
@@ -147,6 +149,10 @@ public class RestContextBuilder extends BeanContextBuilder 
implements ServletCon
                        clientVersionHeader = 
env("RestContext.clientVersionHeader", "Client-Version");
                        defaultCharset = env("RestContext.defaultCharset", 
IOUtils.UTF8);
                        maxInput = 
StringUtils.parseLongWithSuffix(env("RestContext.maxInput", "100M"));
+                       uriAuthority = env("RestContext.uriAuthority", 
(String)null);
+                       uriContext = env("RestContext.uriContext", 
(String)null);
+                       uriRelativity = env("RestContext.uriRelativity", 
UriRelativity.RESOURCE);
+                       uriResolution = env("RestContext.uriResolution", 
UriResolution.ROOT_RELATIVE);
 
                        // Pass-through default values.
                        if (parentContext.isPresent()) {
@@ -2343,7 +2349,7 @@ public class RestContextBuilder extends 
BeanContextBuilder implements ServletCon
        }
 
        /**
-        * <i><l>RestContext</l> configuration property:&emsp;</i>  Resource 
authority path.
+        * Resource authority path.
         *
         * <p>
         * Overrides the authority path value for this resource and any child 
resources.
@@ -2351,22 +2357,70 @@ public class RestContextBuilder extends 
BeanContextBuilder implements ServletCon
         * <p>
         * This setting is useful if you want to resolve relative URIs to 
absolute paths and want to explicitly specify the hostname/port.
         *
+        * <p>
+        * Affects the following methods:
+        * <ul class='javatree'>
+        *      <li class='jm'>{@link RestRequest#getAuthorityPath()}
+        * </ul>
+        *
+        * <p>
+        * If you do not specify the authority, it is automatically calculated 
via the following:
+        *
+        * <p class='bcode w800'>
+        *      String <jv>scheme</jv> = <jv>request</jv>.getScheme();
+        *      <jk>int</jk> <jv>port</jv> = <jv>request</jv>.getServerPort();
+        *      StringBuilder <jv>sb</jv> = <jk>new</jk> 
StringBuilder(<jv>request</jv>.getScheme()).append(<js>"://"</js>).append(<jv>request</jv>.getServerName());
+        *      <jk>if</jk> (! (<jv>port</jv> == 80 &amp;&amp; 
<js>"http"</js>.equals(<jv>scheme</jv>) || port == 443 &amp;&amp; 
<js>"https"</js>.equals(<jv>scheme</jv>)))
+        *              <jv>sb</jv>.append(<js>':'</js>).append(<jv>port</jv>);
+        *      <jv>authorityPath</jv> = <jv>sb</jv>.toString();
+        * </p>
+        *
+        * <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>(
+        *              path=<js>"/servlet"</js>,
+        *              
uriAuthority=<js>"$C{REST/authorityPathOverride,http://localhost:10000}";</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>.uriAuthority(<js>"http://localhost:10000";</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>.uriAuthority(<js>"http://localhost:10000";</js>);
+        *              }
+        *      }
+        * </p>
+        *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_uriAuthority}
+        *      <li class='ja'>{@link Rest#uriAuthority}
         * </ul>
         *
-        * @param value The new value for this setting.
+        * @param value
+        *      The new value for this setting.
+        *      <br>The default is the first value found:
+        *      <ul>
+        *              <li>System property <js>"RestContext.uriAuthority"
+        *              <li>Environment variable <js>"RESTCONTEXT_URIAUTHORITY"
+        *              <li><jk>null</jk>
+        *      </ul>
         * @return This object (for method chaining).
         */
        @FluentSetter
        public RestContextBuilder uriAuthority(String value) {
-               if (! value.isEmpty())
-                       set(REST_uriAuthority, value);
+               uriAuthority = value;
                return this;
        }
 
        /**
-        * <i><l>RestContext</l> configuration property:&emsp;</i>  Resource 
context path.
+        * Resource context path.
         *
         * <p>
         * Overrides the context path value for this resource and any child 
resources.
@@ -2375,22 +2429,59 @@ public class RestContextBuilder extends 
BeanContextBuilder implements ServletCon
         * This setting is useful if you want to use 
<js>"context:/child/path"</js> URLs in child resource POJOs but
         * the context path is not actually specified on the servlet container.
         *
+        * <p>
+        * Affects the following methods:
+        * <ul class='javatree'>
+        *      <li class='jm'>{@link RestRequest#getContextPath()} - Returns 
the overridden context path for the resource.
+        *      <li class='jm'>{@link RestRequest#getServletPath()} - Includes 
the overridden context path for the resource.
+        * </ul>
+        *
+        * <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>(
+        *              path=<js>"/servlet"</js>,
+        *              uriContext=<js>"$C{REST/contextPathOverride,/foo}"</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>.uriContext(<js>"/foo"</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>.uriContext(<js>"/foo"</js>);
+        *              }
+        *      }
+        * </p>
+        *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_uriContext}
+        *      <li class='ja'>{@link Rest#uriContext}
         * </ul>
         *
-        * @param value The new value for this setting.
+        * @param value
+        *      The new value for this setting.
+        *      <br>The default is the first value found:
+        *      <ul>
+        *              <li>System property <js>"RestContext.uriContext"
+        *              <li>Environment variable <js>"RESTCONTEXT_URICONTEXT"
+        *              <li><jk>null</jk>
+        *      </ul>
         * @return This object (for method chaining).
         */
        @FluentSetter
        public RestContextBuilder uriContext(String value) {
-               if (! value.isEmpty())
-                       set(REST_uriContext, value);
+               uriContext = value;
                return this;
        }
 
        /**
-        * <i><l>RestContext</l> configuration property:&emsp;</i>  URI 
resolution relativity.
+        * URI resolution relativity.
         *
         * <p>
         * Specifies how relative URIs should be interpreted by serializers.
@@ -2398,22 +2489,58 @@ public class RestContextBuilder extends 
BeanContextBuilder implements ServletCon
         * <p>
         * See {@link UriResolution} for possible values.
         *
+        * <p>
+        * Affects the following methods:
+        * <ul class='javatree'>
+        *      <li class='jm'>{@link RestRequest#getUriResolver()}
+        * </ul>
+        *
+        * <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>(
+        *              path=<js>"/servlet"</js>,
+        *              
uriRelativity=<js>"$C{REST/uriRelativity,PATH_INFO}"</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>.uriRelativity(<jsf>PATH_INFO</jsf>);
+        *              }
+        *
+        *              <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>.uriRelativity(<jsf>PATH_INFO</jsf>);
+        *              }
+        *      }
+        * </p>
+        *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_uriRelativity}
+        *      <li class='ja'>{@link Rest#uriRelativity}
         * </ul>
         *
-        * @param value The new value for this setting.
+        * @param value
+        *      The new value for this setting.
+        *      <br>The default is the first value found:
+        *      <ul>
+        *              <li>System property <js>"RestContext.uriRelativity"
+        *              <li>Environment variable <js>"RESTCONTEXT_URIRELATIVITY"
+        *              <li>{@link UriRelativity#RESOURCE}
+        *      </ul>
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestContextBuilder uriRelativity(String value) {
-               if (! value.isEmpty())
-                       set(REST_uriRelativity, value);
+       public RestContextBuilder uriRelativity(UriRelativity value) {
+               uriRelativity = value;
                return this;
        }
 
        /**
-        * <i><l>RestContext</l> configuration property:&emsp;</i>  URI 
resolution.
+        * URI resolution.
         *
         * <p>
         * Specifies how relative URIs should be interpreted by serializers.
@@ -2421,17 +2548,53 @@ public class RestContextBuilder extends 
BeanContextBuilder implements ServletCon
         * <p>
         * See {@link UriResolution} for possible values.
         *
+        * <p>
+        * Affects the following methods:
+        * <ul class='javatree'>
+        *      <li class='jm'>{@link RestRequest#getUriResolver()}
+        * </ul>
+        *
+        * <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>(
+        *              path=<js>"/servlet"</js>,
+        *              uriResolution=<js>"$C{REST/uriResolution,ABSOLUTE}"</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>.uriResolution(<jsf>ABSOLUTE</jsf>);
+        *              }
+        *
+        *              <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>.uriResolution(<jsf>ABSOLUTE</jsf>);
+        *              }
+        *      }
+        * </p>
+        *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_uriResolution}
+        *      <li class='ja'>{@link Rest#uriResolution}
         * </ul>
         *
-        * @param value The new value for this setting.
+        * @param value
+        *      The new value for this setting.
+        *      <br>The default is the first value found:
+        *      <ul>
+        *              <li>System property <js>"RestContext.uriResolution"
+        *              <li>Environment variable <js>"RESTCONTEXT_URIRESOLUTION"
+        *              <li>{@link UriResolution#ROOT_RELATIVE}
+        *      </ul>
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestContextBuilder uriResolution(String value) {
-               if (! value.isEmpty())
-                       set(REST_uriResolution, value);
+       public RestContextBuilder uriResolution(UriResolution value) {
+               uriResolution = value;
                return this;
        }
 
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 3d6b27f..024228e 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
@@ -1192,7 +1192,7 @@ public @interface Rest {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_uriAuthority}
+        *      <li class='jm'>{@link RestContextBuilder#uriAuthority(String)}
         * </ul>
         */
        String uriAuthority() default "";
@@ -1210,7 +1210,7 @@ public @interface Rest {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_uriContext}
+        *      <li class='jm'>{@link RestContextBuilder#uriContext(String)}
         * </ul>
         */
        String uriContext() default "";
@@ -1231,7 +1231,7 @@ public @interface Rest {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_uriRelativity}
+        *      <li class='jm'>{@link 
RestContextBuilder#uriRelativity(UriRelativity)}
         * </ul>
         */
        String uriRelativity() default "";
@@ -1252,7 +1252,7 @@ public @interface Rest {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link RestContext#REST_uriResolution}
+        *      <li class='jm'>{@link 
RestContextBuilder#uriResolution(UriResolution)}
         * </ul>
         */
        String uriResolution() 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 2536617..4a39841 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
@@ -1054,10 +1054,10 @@ public class RestAnnotation {
                        b.prependTo(REST_children, a.children());
                        b.prependTo(REST_restOperationArgs, a.restOpArgs());
                        b.setIf(a.contextClass() != RestContext.Null.class, 
REST_contextClass, a.contextClass());
-                       b.setIfNotEmpty(REST_uriContext, 
string(a.uriContext()));
-                       b.setIfNotEmpty(REST_uriAuthority, 
string(a.uriAuthority()));
-                       b.setIfNotEmpty(REST_uriRelativity, 
string(a.uriRelativity()));
-                       b.setIfNotEmpty(REST_uriResolution, 
string(a.uriResolution()));
+                       value(a.uriContext()).ifPresent(x -> b.uriContext(x));
+                       value(a.uriAuthority()).ifPresent(x -> 
b.uriAuthority(x));
+                       
value(a.uriRelativity()).map(UriRelativity::valueOf).ifPresent(x -> 
b.uriRelativity(x));
+                       
value(a.uriResolution()).map(UriResolution::valueOf).ifPresent(x -> 
b.uriResolution(x));
                        b.prependTo(REST_messages, Tuple2.of(c.inner(), 
string(a.messages())));
                        b.setIf(a.fileFinder() != FileFinder.Null.class, 
REST_fileFinder, a.fileFinder());
                        b.setIf(a.staticFiles() != StaticFiles.Null.class, 
REST_staticFiles, a.staticFiles());

Reply via email to