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 8f4da95 Context API refactoring.
8f4da95 is described below
commit 8f4da95a22d09f0c981ae3ea0aa401e3ae000ee4
Author: JamesBognar <[email protected]>
AuthorDate: Thu Sep 9 20:01:47 2021 -0400
Context API refactoring.
---
.../java/org/apache/juneau/rest/RestContext.java | 129 ++-------------------
.../org/apache/juneau/rest/RestContextBuilder.java | 90 ++++++++++++--
.../java/org/apache/juneau/rest/RestRequest.java | 1 -
.../org/apache/juneau/rest/annotation/Rest.java | 4 -
.../juneau/rest/annotation/RestAnnotation.java | 3 +-
5 files changed, 94 insertions(+), 133 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 0e0f741..5eae1f4 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
@@ -139,105 +139,6 @@ public class RestContext extends BeanContext {
*/
public static final String REST_beanStore = PREFIX + ".beanStore.o";
- /**
- * Configuration property: Messages.
- *
- * <h5 class='section'>Property:</h5>
- * <ul class='spaced-list'>
- * <li><b>ID:</b> {@link
org.apache.juneau.rest.RestContext#REST_messages REST_messages}
- * <li><b>Name:</b> <js>"RestContext.messages.lo"</js>
- * <li><b>Data type:</b> <c>List<{@link
org.apache.juneau.utils.Tuple2}<Class,String>></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#messages()}
- * </ul>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link
org.apache.juneau.rest.RestContextBuilder#messages(String)},
- * </ul>
- * </ul>
- *
- * <h5 class='section'>Description:</h5>
- * <p>
- * Identifies the location of the resource bundle for this class if
it's different from the class name.
- *
- * <p>
- * By default, the resource bundle name is assumed to match the class
name. For example, given the class
- * <c>MyClass.java</c>, the resource bundle is assumed to be
<c>MyClass.properties</c>. This property
- * allows you to override this setting to specify a different location
such as <c>MyMessages.properties</c> by
- * specifying a value of <js>"MyMessages"</js>.
- *
- * <p>
- * Resource bundles are searched using the following base name
patterns:
- * <ul>
- * <li><js>"{package}.{name}"</js>
- * <li><js>"{package}.i18n.{name}"</js>
- * <li><js>"{package}.nls.{name}"</js>
- * <li><js>"{package}.messages.{name}"</js>
- * </ul>
- *
- * <p>
- * This annotation is used to provide request-localized (based on
<c>Accept-Language</c>) messages for the following methods:
- * <ul class='javatree'>
- * <li class='jm'>{@link RestRequest#getMessage(String, Object...)}
- * <li class='jm'>{@link RestContext#getMessages()
RestContext.getMessages()}
- * </ul>
- *
- * <p>
- * Request-localized messages are also available by passing either of
the following parameter types into your Java method:
- * <ul class='javatree'>
- * <li class='jc'>{@link ResourceBundle} - Basic Java resource
bundle.
- * <li class='jc'>{@link Messages} - Extended resource bundle with
several convenience methods.
- * </ul>
- *
- * The value can be a relative path like <js>"nls/Messages"</js>,
indicating to look for the resource bundle
- * <js>"com.foo.sample.nls.Messages"</js> if the resource class is in
<js>"com.foo.sample"</js>, or it can be an
- * absolute path like <js>"com.foo.sample.nls.Messages"</js>
- *
- * <h5 class='section'>Examples:</h5>
- * <p class='bcode w800'>
- * <cc># Contents of org/apache/foo/nls/MyMessages.properties</cc>
- *
- * <ck>HelloMessage</ck> = <cv>Hello {0}!</cv>
- * </p>
- * <p class='bcode w800'>
- * <jc>// Contents of org/apache/foo/MyResource.java</jc>
- *
- * <ja>@Rest</ja>(messages=<js>"nls/MyMessages"</js>)
- * <jk>public class</jk> MyResource {...}
- *
- * <ja>@RestGet</ja>(<js>"/hello/{you}"</js>)
- * <jk>public</jk> Object helloYou(RestRequest
<jv>req</jv>, Messages <jv>messages</jv>, <ja>@Path</ja>(<js>"name"</js>)
String <jv>you</jv>) {
- * String <jv>s</jv>;
- *
- * <jc>// Get it from the RestRequest object.</jc>
- * <jv>s</jv> =
<jv>req</jv>.getMessage(<js>"HelloMessage"</js>, <jv>you</jv>);
- *
- * <jc>// Or get it from the method parameter.</jc>
- * <jv>s</jv> =
<jv>messages</jv>.getString(<js>"HelloMessage"</js>, <jv>you</jv>);
- *
- * <jc>// Or get the message in a locale different
from the request.</jc>
- * <jv>s</jv> =
<jv>messages</jv>.forLocale(Locale.<jsf>UK</jsf>).getString(<js>"HelloMessage"</js>,
<jv>you</jv>);
- *
- * <jk>return</jk> <jv>s</jv>;
- * }
- * }
- * </p>
- *
- * <ul class='notes'>
- * <li>Mappings are cumulative from super classes.
- * <br>Therefore, you can find and retrieve messages up
the class-hierarchy chain.
- * </ul>
- *
- * <ul class='seealso'>
- * <li class='jc'>{@link Messages}
- * <li class='link'>{@doc RestMessages}
- * </ul>
- */
- public static final String REST_messages = PREFIX + ".messages.lo";
-
//-------------------------------------------------------------------------------------------------------------------
// Static
//-------------------------------------------------------------------------------------------------------------------
@@ -404,7 +305,7 @@ public class RestContext extends BeanContext {
methodExecStore = createMethodExecStore(r, cp, bf, ts);
bf.addBean(MethodExecStore.class, methodExecStore);
- Messages m = messages = createMessages(r, cp);
+ Messages m = messages = createMessages(r, builder);
VarResolver vr = varResolver = createVarResolver(r, cp,
bf, m);
bf.addBean(VarResolver.class, vr);
@@ -1439,7 +1340,7 @@ public class RestContext extends BeanContext {
* The factory used for creating beans and retrieving injected
beans.
* <br>Created by {@link
#createBeanStore(Object,ContextProperties,RestContext)}.
* @param fileFinder The file finder configured on this bean created by
{@link #createFileFinder(Object,RestContextBuilder,BeanStore)}.
- * @param messages The localized messages configured on this bean
created by {@link #createMessages(Object,ContextProperties)}.
+ * @param messages The localized messages configured on this bean
created by {@link #createMessages(Object,RestContextBuilder)}.
* @param varResolver The variable resolver configured on this bean
created by {@link
#createVarResolver(Object,ContextProperties,BeanStore,Messages)}.
* @return The info provider for this REST resource.
* @throws Exception If info provider could not be instantiated.
@@ -1483,7 +1384,7 @@ public class RestContext extends BeanContext {
* The factory used for creating beans and retrieving injected
beans.
* <br>Created by {@link
#createBeanStore(Object,ContextProperties,RestContext)}.
* @param fileFinder The file finder configured on this bean created by
{@link #createFileFinder(Object,RestContextBuilder,BeanStore)}.
- * @param messages The localized messages configured on this bean
created by {@link #createMessages(Object,ContextProperties)}.
+ * @param messages The localized messages configured on this bean
created by {@link #createMessages(Object,RestContextBuilder)}.
* @param varResolver The variable resolver configured on this bean
created by {@link
#createVarResolver(Object,ContextProperties,BeanStore,Messages)}.
* @return The REST API builder for this REST resource.
* @throws Exception If REST API builder could not be instantiated.
@@ -1968,15 +1869,14 @@ public class RestContext extends BeanContext {
*
* @param resource
* The REST servlet or bean that this context defines.
- * @param properties
- * The properties of this bean.
- * <br>Consists of all properties gathered through the builder and
annotations on this class and all parent classes.
+ * @param builder
+ * The builder for this object.
* @return The messages for this REST object.
* @throws Exception An error occurred.
*/
- protected Messages createMessages(Object resource, ContextProperties
properties) throws Exception {
+ protected Messages createMessages(Object resource, RestContextBuilder
builder) throws Exception {
- Messages x = createMessagesBuilder(resource,
properties).build();
+ Messages x = createMessagesBuilder(resource, builder).build();
x = BeanStore
.of(beanStore, resource)
@@ -1993,19 +1893,18 @@ public class RestContext extends BeanContext {
* Instantiates the Messages builder for this REST resource.
*
* <p>
- * Allows subclasses to intercept and modify the builder used by the
{@link #createMessages(Object,ContextProperties)} method.
+ * Allows subclasses to intercept and modify the builder used by the
{@link #createMessages(Object,RestContextBuilder)} method.
*
* @param resource
* The REST servlet or bean that this context defines.
- * @param properties
- * The properties of this bean.
- * <br>Consists of all properties gathered through the builder and
annotations on this class and all parent classes.
+ * @param builder
+ * The builder for this object.
* @return The messages builder for this REST resource.
* @throws Exception If messages builder could not be instantiated.
*/
- protected MessagesBuilder createMessagesBuilder(Object resource,
ContextProperties properties) throws Exception {
+ protected MessagesBuilder createMessagesBuilder(Object resource,
RestContextBuilder builder) throws Exception {
- Tuple2<Class<?>,String>[] mbl =
properties.getInstanceArray(REST_messages, Tuple2.class).orElse(new Tuple2[0]);
+ Tuple2<Class<?>,String>[] mbl = builder.messages.toArray(new
Tuple2[0]);
MessagesBuilder x = null;
for (int i = mbl.length-1; i >= 0; i--) {
@@ -2658,10 +2557,6 @@ public class RestContext extends BeanContext {
/**
* Returns the resource bundle used by this resource.
*
- * <ul class='seealso'>
- * <li class='jf'>{@link #REST_messages}
- * </ul>
- *
* @return
* The resource bundle for this resource.
* <br>Never <jk>null</jk>.
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 834b1c9..1b98c17 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
@@ -153,6 +153,8 @@ public class RestContextBuilder extends BeanContextBuilder
implements ServletCon
HttpPartSerializer.Creator partSerializer =
HttpPartSerializer.creator().set(OpenApiSerializer.class);
HttpPartParser.Creator partParser =
HttpPartParser.creator().set(OpenApiParser.class);
+ List<Tuple2<Class<?>,String>> messages = new ArrayList<>();
+
Enablement debugDefault, debug;
ResponseProcessorList.Builder responseProcessors =
ResponseProcessorList.create().add(
@@ -1828,10 +1830,82 @@ public class RestContextBuilder extends
BeanContextBuilder implements ServletCon
}
/**
- * <i><l>RestContext</l> configuration property: </i> Messages.
+ * Messages.
+ *
+ * <p>
+ * Identifies the location of the resource bundle for this class if
it's different from the class name.
+ *
+ * <p>
+ * By default, the resource bundle name is assumed to match the class
name. For example, given the class
+ * <c>MyClass.java</c>, the resource bundle is assumed to be
<c>MyClass.properties</c>. This property
+ * allows you to override this setting to specify a different location
such as <c>MyMessages.properties</c> by
+ * specifying a value of <js>"MyMessages"</js>.
+ *
+ * <p>
+ * Resource bundles are searched using the following base name
patterns:
+ * <ul>
+ * <li><js>"{package}.{name}"</js>
+ * <li><js>"{package}.i18n.{name}"</js>
+ * <li><js>"{package}.nls.{name}"</js>
+ * <li><js>"{package}.messages.{name}"</js>
+ * </ul>
+ *
+ * <p>
+ * This annotation is used to provide request-localized (based on
<c>Accept-Language</c>) messages for the following methods:
+ * <ul class='javatree'>
+ * <li class='jm'>{@link RestRequest#getMessage(String, Object...)}
+ * <li class='jm'>{@link RestContext#getMessages()
RestContext.getMessages()}
+ * </ul>
+ *
+ * <p>
+ * Request-localized messages are also available by passing either of
the following parameter types into your Java method:
+ * <ul class='javatree'>
+ * <li class='jc'>{@link ResourceBundle} - Basic Java resource
bundle.
+ * <li class='jc'>{@link Messages} - Extended resource bundle with
several convenience methods.
+ * </ul>
+ *
+ * The value can be a relative path like <js>"nls/Messages"</js>,
indicating to look for the resource bundle
+ * <js>"com.foo.sample.nls.Messages"</js> if the resource class is in
<js>"com.foo.sample"</js>, or it can be an
+ * absolute path like <js>"com.foo.sample.nls.Messages"</js>
+ *
+ * <h5 class='section'>Examples:</h5>
+ * <p class='bcode w800'>
+ * <cc># Contents of org/apache/foo/nls/MyMessages.properties</cc>
+ *
+ * <ck>HelloMessage</ck> = <cv>Hello {0}!</cv>
+ * </p>
+ * <p class='bcode w800'>
+ * <jc>// Contents of org/apache/foo/MyResource.java</jc>
+ *
+ * <ja>@Rest</ja>(messages=<js>"nls/MyMessages"</js>)
+ * <jk>public class</jk> MyResource {...}
+ *
+ * <ja>@RestGet</ja>(<js>"/hello/{you}"</js>)
+ * <jk>public</jk> Object helloYou(RestRequest
<jv>req</jv>, Messages <jv>messages</jv>, <ja>@Path</ja>(<js>"name"</js>)
String <jv>you</jv>) {
+ * String <jv>s</jv>;
+ *
+ * <jc>// Get it from the RestRequest object.</jc>
+ * <jv>s</jv> =
<jv>req</jv>.getMessage(<js>"HelloMessage"</js>, <jv>you</jv>);
+ *
+ * <jc>// Or get it from the method parameter.</jc>
+ * <jv>s</jv> =
<jv>messages</jv>.getString(<js>"HelloMessage"</js>, <jv>you</jv>);
+ *
+ * <jc>// Or get the message in a locale different
from the request.</jc>
+ * <jv>s</jv> =
<jv>messages</jv>.forLocale(Locale.<jsf>UK</jsf>).getString(<js>"HelloMessage"</js>,
<jv>you</jv>);
+ *
+ * <jk>return</jk> <jv>s</jv>;
+ * }
+ * }
+ * </p>
+ *
+ * <ul class='notes'>
+ * <li>Mappings are cumulative from super classes.
+ * <br>Therefore, you can find and retrieve messages up
the class-hierarchy chain.
+ * </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_messages}
+ * <li class='jc'>{@link Messages}
+ * <li class='link'>{@doc RestMessages}
* </ul>
*
* @param baseClass
@@ -1842,25 +1916,23 @@ public class RestContextBuilder extends
BeanContextBuilder implements ServletCon
*/
@FluentSetter
public RestContextBuilder messages(Class<?> baseClass, String
bundlePath) {
- return prependTo(REST_messages, Tuple2.of(baseClass,
bundlePath));
+ messages.add(0, Tuple2.of(baseClass, bundlePath));
+ return this;
}
/**
- * <i><l>RestContext</l> configuration property: </i> Messages.
+ * Messages.
*
* <p>
* Same as {@link #messages(Class,String)} except assumes the base
class is the resource class itself.
*
- * <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_messages}
- * </ul>
- *
* @param bundlePath The bundle path relative to the base class.
* @return This object (for method chaining).
*/
@FluentSetter
public RestContextBuilder messages(String bundlePath) {
- return prependTo(REST_messages, Tuple2.of(null, bundlePath));
+ messages.add(0, Tuple2.of(null, bundlePath));
+ return this;
}
/**
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index e4b5bff..4986c43 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -1618,7 +1618,6 @@ public final class RestRequest {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link
org.apache.juneau.rest.RestContext#REST_messages}
* <li class='jm'>{@link
org.apache.juneau.rest.RestRequest#getMessage(String,Object...)}
* <li class='link'>{@doc RestMessages}
* </ul>
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 b30bbfe..c9fe1c7 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
@@ -740,10 +740,6 @@ public @interface Rest {
* Supports {@doc RestSvlVariables}
* (e.g. <js>"$L{my.localized.variable}"</js>).
* </ul>
- *
- * <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_messages}
- * </ul>
*/
String messages() 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 ffb8acc..4b34a48 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
@@ -29,7 +29,6 @@ import org.apache.juneau.rest.*;
import org.apache.juneau.rest.logging.*;
import org.apache.juneau.serializer.*;
import org.apache.juneau.svl.*;
-import org.apache.juneau.utils.*;
/**
* Utility classes and methods for the {@link Rest @Rest} annotation.
@@ -1061,7 +1060,7 @@ public class RestAnnotation {
string(a.uriAuthority()).ifPresent(x ->
b.uriAuthority(x));
string(a.uriRelativity()).map(UriRelativity::valueOf).ifPresent(x ->
b.uriRelativity(x));
string(a.uriResolution()).map(UriResolution::valueOf).ifPresent(x ->
b.uriResolution(x));
- b.prependTo(REST_messages, Tuple2.of(c.inner(),
string(a.messages()).orElse(null)));
+ b.messages(c.inner(),
string(a.messages()).orElse(null));
type(a.fileFinder()).ifPresent(x -> b.fileFinder(x));
type(a.staticFiles()).ifPresent(x -> b.staticFiles(x));
string(a.path()).ifPresent(x -> b.path(x));