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

commit ec12a37c68aa84da49ea44b9591f898e2acb43cb
Author: JamesBognar <[email protected]>
AuthorDate: Sat Sep 11 17:07:40 2021 -0400

    Context API refactoring.
---
 .../main/java/org/apache/juneau/cp/Messages.java   | 199 +++++++++++++++++++--
 .../java/org/apache/juneau/cp/MessagesBuilder.java | 128 -------------
 .../java/org/apache/juneau/rest/RestContext.java   |  84 +--------
 .../org/apache/juneau/rest/RestContextBuilder.java |  87 +++++++--
 .../org/apache/juneau/rest/annotation/Rest.java    |   4 +-
 5 files changed, 268 insertions(+), 234 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java
index 6f39857..5150747 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.cp;
 
+import static org.apache.juneau.internal.ExceptionUtils.*;
+import static org.apache.juneau.internal.ObjectUtils.*;
 import static org.apache.juneau.internal.ResourceBundleUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 
@@ -20,6 +22,10 @@ import java.util.*;
 import java.util.concurrent.*;
 
 import org.apache.juneau.collections.*;
+import org.apache.juneau.internal.*;
+import org.apache.juneau.marshall.*;
+import org.apache.juneau.parser.ParseException;
+import org.apache.juneau.utils.*;
 
 /**
  * An enhanced {@link ResourceBundle}.
@@ -87,7 +93,7 @@ import org.apache.juneau.collections.*;
  *     </ul>
  *
  * <p>
- *     These patterns can be customized using the {@link 
MessagesBuilder#baseNames(String...)} method.
+ *     These patterns can be customized using the {@link 
Builder#baseNames(String...)} method.
  *
  * <p>
  *     Localized messages can be retrieved in the following way:
@@ -119,8 +125,8 @@ public class Messages extends ResourceBundle {
         *      The class we're creating this object for.
         * @return A new builder.
         */
-       public static final MessagesBuilder create(Class<?> forClass) {
-               return new MessagesBuilder(forClass);
+       public static final Builder create(Class<?> forClass) {
+               return new Builder(forClass);
        }
 
        /**
@@ -152,15 +158,14 @@ public class Messages extends ResourceBundle {
        /**
         * Constructor.
         *
-        * @param forClass
-        *      The class we're creating this object for.
-        * @param rb
-        *      The resource bundle we're encapsulating.  Can be <jk>null</jk>.
-        * @param locale The locale of these messages.
-        * @param parent
-        *      The parent resource.  Can be <jk>null</jk>.
+        * @param builder
+        *      The builder for this object.
         */
-       public Messages(Class<?> forClass, ResourceBundle rb, Locale locale, 
Messages parent) {
+       protected Messages(Builder builder) {
+               this(builder.forClass, builder.getBundle(), builder.locale, 
builder.parent);
+       }
+
+       Messages(Class<?> forClass, ResourceBundle rb, Locale locale, Messages 
parent) {
                this.c = forClass;
                this.rb = rb;
                this.parent = parent;
@@ -195,6 +200,178 @@ public class Messages extends ResourceBundle {
        }
 
        /**
+        * The builder for this object.
+        */
+       public static class Builder {
+
+               Class<?> forClass;
+               Locale locale = Locale.getDefault();
+               Messages impl;
+               String name;
+               Messages parent;
+               List<Tuple2<Class<?>,String>> locations = new ArrayList<>();
+
+               private String[] baseNames = 
{"{package}.{name}","{package}.i18n.{name}","{package}.nls.{name}","{package}.messages.{name}"};
+
+               /**
+                * Constructor.
+                *
+                * @param forClass The base class.
+                */
+               protected Builder(Class<?> forClass) {
+                       this.forClass = forClass;
+                       this.name = forClass.getSimpleName();
+               }
+
+               /**
+                * Adds a parent bundle.
+                *
+                * @param parent The parent bundle.  Can be <jk>null</jk>.
+                * @return This object.
+                */
+               public Builder parent(Messages parent) {
+                       this.parent = parent;
+                       return this;
+               }
+
+               /**
+                * Specifies the bundle name (e.g. <js>"Messages"</js>).
+                *
+                * @param name
+                *      The bundle name.
+                *      <br>If <jk>null</jk>, the forClass class name is used.
+                * @return This object.
+                */
+               public Builder name(String name) {
+                       this.name = isEmpty(name) ? forClass.getSimpleName() : 
name;
+                       return this;
+               }
+
+               /**
+                * Specifies the base name patterns to use for finding the 
resource bundle.
+                *
+                * @param baseNames
+                *      The bundle base names.
+                *      <br>The default is the following:
+                *      <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>
+                * @return This object.
+                */
+               public Builder baseNames(String...baseNames) {
+                       this.baseNames = baseNames == null ? new String[]{} : 
baseNames;
+                       return this;
+               }
+
+               /**
+                * Specifies the locale.
+                *
+                * @param locale
+                *      The locale.
+                *      If <jk>null</jk>, the default locale is used.
+                * @return This object.
+                */
+               public Builder locale(Locale locale) {
+                       this.locale = locale == null ? Locale.getDefault() : 
locale;
+                       return this;
+               }
+
+               /**
+                * Specifies the locale.
+                *
+                * @param locale
+                *      The locale.
+                *      If <jk>null</jk>, the default locale is used.
+                * @return This object.
+                */
+               public Builder locale(String locale) {
+                       return locale(locale == null ? null : 
Locale.forLanguageTag(locale));
+               }
+
+               /**
+                * Specifies a pre-instantiated bean for the {@link #build()} 
method to return.
+                *
+                * @param value The value for this setting.
+                * @return This object.
+                */
+               public Builder impl(Messages value) {
+                       this.impl = value;
+                       return this;
+               }
+
+               /**
+                * Specifies a location of where to look for messages.
+                *
+                * @param baseClass The base class.
+                * @param bundlePath The bundle path.
+                * @return This object.
+                */
+               public Builder location(Class<?> baseClass, String bundlePath) {
+                       this.locations.add(0, Tuple2.of(baseClass, bundlePath));
+                       return this;
+               }
+
+               /**
+                * Creates a new {@link Messages} based on the setting of this 
builder.
+                *
+                * @return A new {@link Messages} object.
+                */
+               public Messages build() {
+
+                       if (impl != null)
+                               return impl;
+
+                       if (! locations.isEmpty()) {
+                               Tuple2<Class<?>,String>[] mbl = 
locations.toArray(new Tuple2[0]);
+
+                               Builder x = null;
+
+                               for (int i = mbl.length-1; i >= 0; i--) {
+                                       Class<?> c = 
firstNonNull(mbl[i].getA(), forClass);
+                                       String value = mbl[i].getB();
+                                       if (isJsonObject(value, true)) {
+                                               MessagesString ms;
+                                               try {
+                                                       ms = 
SimpleJson.DEFAULT.read(value, MessagesString.class);
+                                               } catch (ParseException e) {
+                                                       throw 
runtimeException(e);
+                                               }
+                                               x = 
Messages.create(c).name(ms.name).baseNames(split(ms.baseNames, 
',')).locale(ms.locale).parent(x == null ? null : x.build());
+                                       } else {
+                                               x = 
Messages.create(c).name(value).parent(x == null ? null : x.build());
+                                       }
+                               }
+
+                               return x == null ? null : x.build();  // 
Shouldn't be null.
+                       }
+
+                       return new Messages(this);
+               }
+
+               private static class MessagesString {
+                       public String name;
+                       public String[] baseNames;
+                       public String locale;
+               }
+
+               ResourceBundle getBundle() {
+                       ClassLoader cl = forClass.getClassLoader();
+                       OMap m = OMap.of("name", name, "package", 
forClass.getPackage().getName());
+                       for (String bn : baseNames) {
+                               bn = StringUtils.replaceVars(bn, m);
+                               ResourceBundle rb = findBundle(bn, locale, cl);
+                               if (rb != null)
+                                       return rb;
+                       }
+                       return null;
+               }
+       }
+
+
+       /**
         * Returns this message bundle for the specified locale.
         *
         * @param locale The locale to get the messages for.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/MessagesBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/MessagesBuilder.java
deleted file mode 100644
index 67db127..0000000
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/MessagesBuilder.java
+++ /dev/null
@@ -1,128 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.cp;
-
-import static org.apache.juneau.internal.StringUtils.*;
-import static org.apache.juneau.internal.ResourceBundleUtils.*;
-
-import java.util.*;
-
-import org.apache.juneau.collections.*;
-import org.apache.juneau.internal.*;
-
-/**
- * Builder for {@link Messages} objects.
- */
-public class MessagesBuilder {
-
-       private Class<?> forClass;
-       private Locale locale = Locale.getDefault();
-       private String name;
-       private Messages parent;
-
-       private String[] baseNames = 
{"{package}.{name}","{package}.i18n.{name}","{package}.nls.{name}","{package}.messages.{name}"};
-
-       MessagesBuilder(Class<?> forClass) {
-               this.forClass = forClass;
-               this.name = forClass.getSimpleName();
-       }
-
-       /**
-        * Adds a parent bundle.
-        *
-        * @param parent The parent bundle.  Can be <jk>null</jk>.
-        * @return This object (for method chaining).
-        */
-       public MessagesBuilder parent(Messages parent) {
-               this.parent = parent;
-               return this;
-       }
-
-       /**
-        * Specifies the bundle name (e.g. <js>"Messages"</js>).
-        *
-        * @param name
-        *      The bundle name.
-        *      <br>If <jk>null</jk>, the forClass class name is used.
-        * @return This object (for method chaining).
-        */
-       public MessagesBuilder name(String name) {
-               this.name = isEmpty(name) ? forClass.getSimpleName() : name;
-               return this;
-       }
-
-       /**
-        * Specifies the base name patterns to use for finding the resource 
bundle.
-        *
-        * @param baseNames
-        *      The bundle base names.
-        *      <br>The default is the following:
-        *      <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>
-        * @return This object (for method chaining).
-        */
-       public MessagesBuilder baseNames(String...baseNames) {
-               this.baseNames = baseNames == null ? new String[]{} : baseNames;
-               return this;
-       }
-
-       /**
-        * Specifies the locale.
-        *
-        * @param locale
-        *      The locale.
-        *      If <jk>null</jk>, the default locale is used.
-        * @return This object (for method chaining).
-        */
-       public MessagesBuilder locale(Locale locale) {
-               this.locale = locale == null ? Locale.getDefault() : locale;
-               return this;
-       }
-
-       /**
-        * Specifies the locale.
-        *
-        * @param locale
-        *      The locale.
-        *      If <jk>null</jk>, the default locale is used.
-        * @return This object (for method chaining).
-        */
-       public MessagesBuilder locale(String locale) {
-               return locale(locale == null ? null : 
Locale.forLanguageTag(locale));
-       }
-
-       /**
-        * Creates a new {@link Messages} based on the setting of this builder.
-        *
-        * @return A new {@link Messages} object.
-        */
-       public Messages build() {
-               return new Messages(forClass, getBundle(), locale, parent);
-       }
-
-       private ResourceBundle getBundle() {
-               ClassLoader cl = forClass.getClassLoader();
-               OMap m = OMap.of("name", name, "package", 
forClass.getPackage().getName());
-               for (String bn : baseNames) {
-                       bn = StringUtils.replaceVars(bn, m);
-                       ResourceBundle rb = findBundle(bn, locale, cl);
-                       if (rb != null)
-                               return rb;
-               }
-               return null;
-       }
-}
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 8d1662a..39f8200 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
@@ -13,7 +13,6 @@
 package org.apache.juneau.rest;
 
 import static javax.servlet.http.HttpServletResponse.*;
-import static org.apache.juneau.internal.ObjectUtils.*;
 import static org.apache.juneau.http.HttpHeaders.*;
 import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.internal.IOUtils.*;
@@ -52,7 +51,6 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.httppart.bean.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.jsonschema.*;
-import org.apache.juneau.marshall.*;
 import org.apache.juneau.mstat.*;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.parser.*;
@@ -261,9 +259,9 @@ public class RestContext extends Context {
                        logger = bs.add(Logger.class, builder.logger());
                        thrownStore = bs.add(ThrownStore.class, 
builder.thrownStore().build());
                        methodExecStore = bs.add(MethodExecStore.class, 
builder.methodExecStore().thrownStoreOnce(thrownStore).build());
+                       messages = bs.add(Messages.class, 
builder.messages().build());
 
                        Object r = resource.get();
-                       Messages m = messages = createMessages(r, builder);
 
                        VarResolver vr = varResolver = builder
                                .varResolver()
@@ -360,7 +358,7 @@ public class RestContext extends Context {
 
                        restChildren = createRestChildren(r, builder, bs, 
builder.inner);
 
-                       swaggerProvider = createSwaggerProvider(r, builder, bs, 
fileFinder, m, vr);
+                       swaggerProvider = createSwaggerProvider(r, builder, bs, 
fileFinder, messages, vr);
 
                } catch (BasicHttpException e) {
                        _initException = e;
@@ -1127,7 +1125,7 @@ public class RestContext extends Context {
         *      The factory used for creating beans and retrieving injected 
beans.
         *      <br>Created by {@link RestContextBuilder#beanStore()}.
         * @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,RestContextBuilder)}.
+        * @param messages The localized messages configured on this bean.
         * @param varResolver The variable resolver configured on this bean.
         * @return The info provider for this REST resource.
         * @throws Exception If info provider could not be instantiated.
@@ -1171,7 +1169,7 @@ public class RestContext extends Context {
         *      The factory used for creating beans and retrieving injected 
beans.
         *      <br>Created by {@link RestContextBuilder#beanStore()}.
         * @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,RestContextBuilder)}.
+        * @param messages The localized messages configured on this bean.
         * @param varResolver The variable resolver configured on this bean.
         * @return The REST API builder for this REST resource.
         * @throws Exception If REST API builder could not be instantiated.
@@ -1383,80 +1381,6 @@ public class RestContext extends Context {
        }
 
        /**
-        * Instantiates the messages for this REST object.
-        *
-        * @param resource
-        *      The REST servlet or bean that this context defines.
-        * @param builder
-        *      The builder for this object.
-        * @return The messages for this REST object.
-        * @throws Exception An error occurred.
-        */
-       protected Messages createMessages(Object resource, RestContextBuilder 
builder) throws Exception {
-
-               Messages x = createMessagesBuilder(resource, builder).build();
-
-               x = BeanStore
-                       .of(beanStore, resource)
-                       .addBean(Messages.class, x)
-                       .beanCreateMethodFinder(Messages.class, resource)
-                       .find("createMessages")
-                       .withDefault(x)
-                       .run();
-
-               return x;
-       }
-
-       /**
-        * Instantiates the Messages builder for this REST resource.
-        *
-        * <p>
-        * 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 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, 
RestContextBuilder builder) throws Exception {
-
-               Tuple2<Class<?>,String>[] mbl = builder.messages.toArray(new 
Tuple2[0]);
-               MessagesBuilder x = null;
-
-               for (int i = mbl.length-1; i >= 0; i--) {
-                       Class<?> c = firstNonNull(mbl[i].getA(), 
resource.getClass());
-                       String value = mbl[i].getB();
-                       if (isJsonObject(value,true)) {
-                               MessagesString ms = 
SimpleJson.DEFAULT.read(value, MessagesString.class);
-                               x = 
Messages.create(c).name(ms.name).baseNames(split(ms.baseNames, 
',')).locale(ms.locale).parent(x == null ? null : x.build());
-                       } else {
-                               x = Messages.create(c).name(value).parent(x == 
null ? null : x.build());
-                       }
-               }
-
-               if (x == null)
-                       x = Messages.create(resource.getClass());
-
-               x = BeanStore
-                       .of(beanStore, resource)
-                       .addBean(MessagesBuilder.class, x)
-                       .beanCreateMethodFinder(MessagesBuilder.class, resource)
-                       .find("createMessagesBuilder")
-                       .withDefault(x)
-                       .run();
-
-               return x;
-       }
-
-       private static class MessagesString {
-               public String name;
-               public String[] baseNames;
-               public String locale;
-       }
-
-       /**
         * Creates the set of {@link RestOpContext} objects that represent the 
methods on this resource.
         *
         * @param 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 dc1cab6..30ec709 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
@@ -16,6 +16,7 @@ import static org.apache.juneau.assertions.Assertions.*;
 import static org.apache.juneau.http.HttpHeaders.*;
 import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.internal.ExceptionUtils.*;
+import static org.apache.juneau.internal.ObjectUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.parser.Parser.*;
 import static org.apache.juneau.rest.HttpRuntimeException.*;
@@ -124,6 +125,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        private Logger logger;
        private ThrownStore.Builder thrownStore;
        private MethodExecStore.Builder methodExecStore;
+       private Messages.Builder messages;
 
        String
                allowedHeaderParams = env("RestContext.allowedHeaderParams", 
"Accept,Content-Type"),
@@ -163,8 +165,6 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        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(
@@ -241,8 +241,6 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                        this.inner = servletConfig;
                        this.parentContext = parentContext;
 
-                       ClassInfo rci = ClassInfo.of(resourceClass);
-
                        // Pass-through default values.
                        if (parentContext != null) {
                                callLoggerDefault = 
parentContext.callLoggerDefault;
@@ -280,10 +278,6 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                                }
                        }
 
-                       VarResolverSession vrs = vr.createSession();
-                       AnnotationWorkList al = 
rci.getAnnotationList(ContextApplyFilter.INSTANCE).getWork(vrs);
-                       apply(al);
-
                } catch (Exception e) {
                        throw new ServletException(e);
                }
@@ -315,10 +309,16 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        public RestContextBuilder init(Object resource) throws ServletException 
{
                this.resource = resource instanceof Supplier ? 
(Supplier<?>)resource : ()->resource;
 
+               ClassInfo rci = ClassInfo.of(resourceClass);
                BeanStore bs = beanStore();
 
                runInitHooks(bs, resource());
                logger();
+               messages();
+
+               VarResolverSession vrs = varResolver().build().createSession();
+               AnnotationWorkList al = 
rci.getAnnotationList(ContextApplyFilter.INSTANCE).getWork(vrs);
+               apply(al);
 
                return this;
        }
@@ -912,11 +912,10 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        /**
         * Instantiates the method execution statistics store for this REST 
resource.
         *
-        * @param resource
-        *      The REST servlet or bean that this context defines.
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
-        *      <br>Created by {@link RestContextBuilder#beanStore()}.
+        * @param resource
+        *      The REST servlet or bean that this context defines.
         * @return The stack trace store for this REST resource.
         */
        protected MethodExecStore.Builder createMethodExecStore(BeanStore 
beanStore, Supplier<?> resource) {
@@ -953,6 +952,68 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                return v.get();
        }
 
+       /**
+        * Returns the builder for the {@link Messages} object in the REST 
context.
+        *
+        * @return The builder for the {@link Messages} object in the REST 
context.
+        */
+       public final Messages.Builder messages() {
+               if (messages == null)
+                       messages = createMessages(beanStore(), resource());
+               return messages;
+       }
+
+       /**
+        * Sets the builder for the {@link MethodExecStore} object in the REST 
context.
+        *
+        * @param value The builder for the {@link MethodExecStore} object in 
the REST context.
+        * @return This object.
+        * @throws RuntimeException If {@link #init(Object)} has not been 
called.
+        */
+       public final RestContextBuilder messages(Messages value) {
+               messages().impl(value);
+               return this;
+       }
+
+       /**
+        * Instantiates the messages for this REST object.
+        *
+        * @param beanStore
+        *      The factory used for creating beans and retrieving injected 
beans.
+        * @param resource
+        *      The REST servlet or bean that this context defines.
+        * @return The messages builder for this REST object.
+        */
+       protected Messages.Builder createMessages(BeanStore beanStore, 
Supplier<?> resource) {
+
+               Value<Messages.Builder> v = Value.empty();
+               Object r = resource.get();
+
+               BeanStore
+                       .of(beanStore, resource)
+                       .beanCreateMethodFinder(Messages.Builder.class, r)
+                       .find("createMessages")
+                       .execute()
+                       .ifPresent(x -> v.set(x));
+
+               if (v.isEmpty()) {
+                       v.set(
+                               Messages
+                                       .create(r.getClass())
+                       );
+               }
+
+               BeanStore
+                       .of(beanStore, resource)
+                       .addBean(Messages.Builder.class, v.get())
+                       .beanCreateMethodFinder(Messages.class, r)
+                       .find("createMessages")
+                       .execute()
+                       .ifPresent(x -> v.get().impl(x));
+
+               return v.get();
+       }
+
        
//----------------------------------------------------------------------------------------------------
        // Methods that give access to the config file, var resolver, and 
properties.
        
//----------------------------------------------------------------------------------------------------
@@ -2300,7 +2361,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         */
        @FluentSetter
        public RestContextBuilder messages(Class<?> baseClass, String 
bundlePath) {
-               messages.add(0, Tuple2.of(baseClass, bundlePath));
+               messages().location(baseClass, bundlePath);
                return this;
        }
 
@@ -2315,7 +2376,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         */
        @FluentSetter
        public RestContextBuilder messages(String bundlePath) {
-               messages.add(0, Tuple2.of(null, bundlePath));
+               messages().location(null, bundlePath);
                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 89c83cb..6751339 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
@@ -736,13 +736,13 @@ public @interface Rest {
         * <p>
         * There are two possible formats:
         * <ul>
-        *      <li>A simple string - Represents the {@link 
MessagesBuilder#name(String) name} of the resource bundle.
+        *      <li>A simple string - Represents the {@link 
org.apache.juneau.cp.Messages.Builder#name(String) name} of the resource bundle.
         *              <br><br><i>Example:</i>
         *              <p class='bcode w800'>
         *      <jc>// Bundle name is Messages.properties.</jc>
         *      <ja>@Rest</ja>(messages=<js>"Messages"</js>)
         *              </p>
-        *      <li>Simplified JSON - Represents parameters for the {@link 
MessagesBuilder} class.
+        *      <li>Simplified JSON - Represents parameters for the {@link 
org.apache.juneau.cp.Messages.Builder} class.
         *              <br><br><i>Example:</i>
         *              <p class='bcode w800'>
         *      <jc>// Bundles can be found in two packages.</jc>

Reply via email to