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

commit f14d7cafef0bba11880b66ac81e203ef455389ea
Author: JamesBognar <[email protected]>
AuthorDate: Sun Sep 12 18:58:53 2021 -0400

    Context API refactoring.
---
 .../main/java/org/apache/juneau/cp/BeanStore.java  |  13 ++
 .../org/apache/juneau/http/header/HeaderList.java  |  14 ++
 .../java/org/apache/juneau/rest/RestContext.java   |  91 +-----------
 .../org/apache/juneau/rest/RestContextBuilder.java | 155 ++++++++++++++++++++-
 4 files changed, 179 insertions(+), 94 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
index fdcaeac..010c86a 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
@@ -297,6 +297,19 @@ public class BeanStore {
        }
 
        /**
+        * Same as {@link #addBean(String, Object)} but returns the bean 
instead of this object.
+        *
+        * @param name The name to associate this bean with.
+        * @param t The bean.
+        * @return The bean.
+        */
+       public <T> T add(String name, T t) {
+               assertCanWrite();
+               addBean(name, t);
+               return t;
+       }
+
+       /**
         * Adds a named bean of the specified type to this factory.
         *
         * @param <T> The class to associate this bean with.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
index e69724d..a1c9f4b 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
@@ -244,6 +244,7 @@ public class HeaderList {
 
                final List<Header> entries;
                List<Header> defaultEntries;
+               HeaderList impl;
                private VarResolver varResolver;
                boolean caseSensitive;
 
@@ -293,6 +294,8 @@ public class HeaderList {
                 * @return A new {@link HeaderList} bean.
                 */
                public HeaderList build() {
+                       if (impl != null)
+                               return impl;
                        return entries.isEmpty() && defaultEntries == null ? 
EMPTY : new HeaderList(this);
                }
 
@@ -1154,6 +1157,17 @@ public class HeaderList {
                        return Optional.empty();
                }
 
+               /**
+                * 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(HeaderList value) {
+                       impl = value;
+                       return this;
+               }
+
                @Override /* Object */
                public String toString() {
                        return "[" + join(entries, ", ") + "]";
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 da56b082..5b14dc5 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
@@ -262,13 +262,12 @@ public class RestContext extends Context {
                        jsonSchemaGenerator = bs.add(JsonSchemaGenerator.class, 
builder.jsonSchemaGenerator().build());
                        fileFinder = bs.add(FileFinder.class, 
builder.fileFinder().build());
                        staticFiles = bs.add(StaticFiles.class, 
builder.staticFiles().build());
+                       defaultRequestHeaders = 
bs.add("RestContext.defaultRequestHeaders", 
builder.defaultRequestHeaders().build());
+                       defaultResponseHeaders = 
bs.add("RestContext.defaultResponseHeaders", 
builder.defaultResponseHeaders().build());
+                       defaultRequestAttributes = 
bs.add("RestContext.defaultRequestAttributes", 
builder.defaultRequestAttributes());
 
                        Object r = resource.get();
 
-                       defaultRequestHeaders = createDefaultRequestHeaders(r, 
builder, bs).build();
-                       defaultResponseHeaders = 
createDefaultResponseHeaders(r, builder, bs).build();
-                       defaultRequestAttributes = 
createDefaultRequestAttributes(r, builder, bs);
-
                        opArgs = createOpArgs(r, builder, bs).asArray();
                        hookMethodArgs = createHookMethodArgs(r, builder, 
bs).asArray();
 
@@ -562,90 +561,6 @@ public class RestContext extends Context {
        }
 
        /**
-        * Instantiates the default request headers for this REST object.
-        *
-        * @param resource
-        *      The REST servlet or bean that this context defines.
-        * @param builder
-        *      The builder for this object.
-        * @param beanStore
-        *      The factory used for creating beans and retrieving injected 
beans.
-        *      <br>Created by {@link RestContextBuilder#beanStore()}.
-        * @return The default request headers for this REST object.
-        * @throws Exception If stack trace store could not be instantiated.
-        */
-       protected HeaderList.Builder createDefaultRequestHeaders(Object 
resource, RestContextBuilder builder, BeanStore beanStore) throws Exception {
-
-               HeaderList.Builder x = builder.defaultRequestHeaders;
-
-               x = BeanStore
-                       .of(beanStore, resource)
-                       .addBean(HeaderList.Builder.class, x)
-                       .beanCreateMethodFinder(HeaderList.Builder.class, 
resource)
-                       .find("createDefaultRequestHeaders")
-                       .withDefault(x)
-                       .run();
-
-               return x;
-       }
-
-       /**
-        * Instantiates the default response headers for this REST object.
-        *
-        * @param resource
-        *      The REST servlet or bean that this context defines.
-        * @param builder
-        *      The builder for this object.
-        * @param beanStore
-        *      The factory used for creating beans and retrieving injected 
beans.
-        *      <br>Created by {@link RestContextBuilder#beanStore()}.
-        * @return The default response headers for this REST object.
-        * @throws Exception If stack trace store could not be instantiated.
-        */
-       protected HeaderList.Builder createDefaultResponseHeaders(Object 
resource, RestContextBuilder builder, BeanStore beanStore) throws Exception {
-
-               HeaderList.Builder x = builder.defaultResponseHeaders;
-
-               x = BeanStore
-                       .of(beanStore, resource)
-                       .addBean(HeaderList.Builder.class, x)
-                       .beanCreateMethodFinder(HeaderList.Builder.class, 
resource)
-                       .find("createDefaultResponseHeaders")
-                       .withDefault(x)
-                       .run();
-
-               return x;
-       }
-
-       /**
-        * Instantiates the default response headers for this REST object.
-        *
-        * @param resource
-        *      The REST servlet or bean that this context defines.
-        * @param builder
-        *      The builder for this object.
-        * @param beanStore
-        *      The factory used for creating beans and retrieving injected 
beans.
-        *      <br>Created by {@link RestContextBuilder#beanStore()}.
-        * @return The default response headers for this REST object.
-        * @throws Exception If stack trace store could not be instantiated.
-        */
-       protected NamedAttributeList createDefaultRequestAttributes(Object 
resource, RestContextBuilder builder, BeanStore beanStore) throws Exception {
-
-               NamedAttributeList x = builder.defaultRequestAttributes;
-
-               x = BeanStore
-                       .of(beanStore, resource)
-                       .addBean(NamedAttributeList.class, x)
-                       .beanCreateMethodFinder(NamedAttributeList.class, 
resource)
-                       .find("createDefaultRequestAttributes")
-                       .withDefault(x)
-                       .run();
-
-               return x;
-       }
-
-       /**
         * Instantiates the debug enablement bean for this REST object.
         *
         * @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 76ddfd2..02aa843 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
@@ -137,6 +137,9 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        private JsonSchemaGeneratorBuilder jsonSchemaGenerator;
        private FileFinder.Builder fileFinder;
        private StaticFiles.Builder staticFiles;
+       private HeaderList.Builder defaultRequestHeaders;
+       private HeaderList.Builder defaultResponseHeaders;
+       private NamedAttributeList defaultRequestAttributes;
 
        String
                allowedHeaderParams = env("RestContext.allowedHeaderParams", 
"Accept,Content-Type"),
@@ -161,9 +164,6 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
 
        BeanRef<SwaggerProvider> swaggerProvider = 
BeanRef.of(SwaggerProvider.class);
        BeanRef<DebugEnablement> debugEnablement = 
BeanRef.of(DebugEnablement.class);
-       NamedAttributeList defaultRequestAttributes = 
NamedAttributeList.create();
-       HeaderList.Builder defaultRequestHeaders = HeaderList.create();
-       HeaderList.Builder defaultResponseHeaders = HeaderList.create();
        EncoderGroup.Builder encoders = 
EncoderGroup.create().add(IdentityEncoder.INSTANCE);
        SerializerGroup.Builder serializers = SerializerGroup.create();
        ParserGroup.Builder parsers = ParserGroup.create();
@@ -1991,6 +1991,149 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                return v.get();
        }
 
+       /**
+        * Returns the builder for the default request headers in the REST 
context.
+        *
+        * @return The builder for the default request headers in the REST 
context.
+        */
+       public final HeaderList.Builder defaultRequestHeaders() {
+               if (defaultRequestHeaders == null)
+                       defaultRequestHeaders = 
createDefaultRequestHeaders(beanStore(), resource());
+               return defaultRequestHeaders;
+       }
+
+       /**
+        * Instantiates the default request headers 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 default request headers for this REST object.
+        */
+       protected HeaderList.Builder createDefaultRequestHeaders(BeanStore 
beanStore, Supplier<?> resource) {
+
+               Value<HeaderList.Builder> v = Value.empty();
+               Object r = resource.get();
+
+               beanStore.getBean("RestContext.defaultRequestHeaders", 
HeaderList.Builder.class).map(x -> x.copy()).ifPresent(x -> v.set(x));
+
+               if (v.isEmpty())
+                       v.set(HeaderList.create());
+
+               beanStore.getBean("RestContext.defaultRequestHeaders", 
HeaderList.class).ifPresent(x -> v.get().impl(x));
+
+               BeanStore
+                       .of(beanStore, r)
+                       .addBean(HeaderList.Builder.class, v.get())
+                       .beanCreateMethodFinder(HeaderList.Builder.class, r)
+                       .find("createDefaultRequestHeaders")
+                       .execute()
+                       .ifPresent(x -> v.set(x));
+
+               BeanStore
+                       .of(beanStore, r)
+                       .addBean(HeaderList.Builder.class, v.get())
+                       .beanCreateMethodFinder(HeaderList.class, r)
+                       .find("createDefaultRequestHeaders")
+                       .execute()
+                       .ifPresent(x -> v.get().impl(x));
+
+               return v.get();
+       }
+
+       /**
+        * Returns the builder for the default response headers in the REST 
context.
+        *
+        * @return The builder for the default response headers in the REST 
context.
+        */
+       public final HeaderList.Builder defaultResponseHeaders() {
+               if (defaultResponseHeaders == null)
+                       defaultResponseHeaders = 
createDefaultResponseHeaders(beanStore(), resource());
+               return defaultResponseHeaders;
+       }
+
+       /**
+        * Instantiates the default response headers 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 default response headers for this REST object.
+        */
+       protected HeaderList.Builder createDefaultResponseHeaders(BeanStore 
beanStore, Supplier<?> resource) {
+
+               Value<HeaderList.Builder> v = Value.empty();
+               Object r = resource.get();
+
+               beanStore.getBean("RestContext.defaultResponseHeaders", 
HeaderList.Builder.class).map(x -> x.copy()).ifPresent(x -> v.set(x));
+
+               if (v.isEmpty())
+                       v.set(HeaderList.create());
+
+               beanStore.getBean("RestContext.defaultResponseHeaders", 
HeaderList.class).ifPresent(x -> v.get().impl(x));
+
+               BeanStore
+                       .of(beanStore, r)
+                       .addBean(HeaderList.Builder.class, v.get())
+                       .beanCreateMethodFinder(HeaderList.Builder.class, r)
+                       .find("createDefaultResponseHeaders")
+                       .execute()
+                       .ifPresent(x -> v.set(x));
+
+               BeanStore
+                       .of(beanStore, r)
+                       .addBean(HeaderList.Builder.class, v.get())
+                       .beanCreateMethodFinder(HeaderList.class, r)
+                       .find("createDefaultResponseHeaders")
+                       .execute()
+                       .ifPresent(x -> v.get().impl(x));
+
+               return v.get();
+       }
+
+       /**
+        * Returns the builder for the default requests attributes in the REST 
context.
+        *
+        * @return The builder for the default request attributer object in the 
REST context.
+        */
+       public final NamedAttributeList defaultRequestAttributes() {
+               if (defaultRequestAttributes == null)
+                       defaultRequestAttributes = 
createDefaultRequestAttributes(beanStore(), resource());
+               return defaultRequestAttributes;
+       }
+
+       /**
+        * Instantiates the default response headers 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 default response headers for this REST object.
+        */
+       protected NamedAttributeList createDefaultRequestAttributes(BeanStore 
beanStore, Supplier<?> resource) {
+
+               Value<NamedAttributeList> v = Value.empty();
+               Object r = resource.get();
+
+               beanStore.getBean("RestContext.defaultRequestAttributes", 
NamedAttributeList.class).map(x -> x.copy()).ifPresent(x -> v.set(x));
+
+               if (v.isEmpty())
+                       v.set(NamedAttributeList.create());
+
+               BeanStore
+                       .of(beanStore, r)
+                       .addBean(NamedAttributeList.class, v.get())
+                       .beanCreateMethodFinder(NamedAttributeList.class, r)
+                       .find("createDefaultRequestAttributes")
+                       .execute()
+                       .ifPresent(x -> v.set(x));
+
+               return v.get();
+       }
+
        
//----------------------------------------------------------------------------------------------------
        // Methods that give access to the config file, var resolver, and 
properties.
        
//----------------------------------------------------------------------------------------------------
@@ -2679,7 +2822,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         */
        @FluentSetter
        public RestContextBuilder 
defaultRequestAttributes(NamedAttribute...values) {
-               defaultRequestAttributes.appendUnique(values);
+               defaultRequestAttributes().appendUnique(values);
                return this;
        }
 
@@ -2740,7 +2883,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         */
        @FluentSetter
        public RestContextBuilder defaultRequestHeaders(Header...values) {
-               defaultRequestHeaders.setDefault(values);
+               defaultRequestHeaders().setDefault(values);
                return this;
        }
 
@@ -2797,7 +2940,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         */
        @FluentSetter
        public RestContextBuilder defaultResponseHeaders(Header...values) {
-               defaultResponseHeaders.setDefault(values);
+               defaultResponseHeaders().setDefault(values);
                return this;
        }
 

Reply via email to