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 &&
<js>"http"</js>.equals(<jv>scheme</jv>) || port == 443 &&
<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: </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 &&
<js>"http"</js>.equals(<jv>scheme</jv>) || port == 443 &&
<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: </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: </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: </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());