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

commit d289eefbbc947e4c52dc5e46a0f3ece91f6823c5
Author: JamesBognar <[email protected]>
AuthorDate: Sun Sep 12 12:21:36 2021 -0400

    Context API refactoring.
---
 .../java/org/apache/juneau/ContextBuilder.java     | 15 ++++
 .../java/org/apache/juneau/rest/RestContext.java   | 82 +---------------------
 .../org/apache/juneau/rest/RestContextBuilder.java | 77 +++++++++++++++++++-
 3 files changed, 91 insertions(+), 83 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
index d5ee9ec..4987384 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
@@ -59,6 +59,7 @@ public abstract class ContextBuilder {
 
        boolean debug;
        Class<?> type;
+       Context impl;
 
        private final List<Object> builders = new ArrayList<>();
        private final AnnotationWorkList applied = new AnnotationWorkList();
@@ -112,6 +113,8 @@ public abstract class ContextBuilder {
         *      <br>Subsequent calls to this method will create new instances 
(unless context object is cacheable).
         */
        public Context build() {
+               if (impl != null)
+                       return impl;
                if (type == null)
                        throw runtimeException("Context class not specified.");
                try {
@@ -150,6 +153,18 @@ public abstract class ContextBuilder {
        }
 
        /**
+        * Specifies a pre-instantiated bean for the {@link #build()} method to 
return.
+        *
+        * @param value The value for this setting.
+        * @return This object.
+        */
+       @FluentSetter
+       public ContextBuilder impl(Context value) {
+               impl = value;
+               return this;
+       }
+
+       /**
         * Copies the settings from the specified property store into this 
builder.
         *
         * <h5 class='section'>Example:</h5>
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 c6fd518..4acdcf8 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
@@ -263,12 +263,10 @@ public class RestContext extends Context {
                        callLogger = bs.add(RestLogger.class, 
builder.callLogger().beanStore(beanStore).loggerOnce(logger).thrownStoreOnce(thrownStore).build());
                        partSerializer = bs.add(HttpPartSerializer.class, 
builder.partSerializer().create());
                        partParser = bs.add(HttpPartParser.class, 
builder.partParser().create());
+                       jsonSchemaGenerator = bs.add(JsonSchemaGenerator.class, 
builder.jsonSchemaGenerator().build());
 
                        Object r = resource.get();
 
-                       jsonSchemaGenerator = createJsonSchemaGenerator(r, 
builder, bs);
-                       bs.addBean(JsonSchemaGenerator.class, 
jsonSchemaGenerator);
-
                        fileFinder = createFileFinder(r, builder, bs);
                        bs.addBean(FileFinder.class, fileFinder);
                        fileFinderDefault = 
builder.fileFinderDefault.value().orElse(fileFinder);
@@ -706,82 +704,6 @@ public class RestContext extends Context {
        }
 
        /**
-        * Instantiates the JSON schema generator for this REST resource.
-        *
-        * <p>
-        * Instantiates based on the following logic:
-        * <ul>
-        *      <li>Looks for a static or non-static 
<c>createJsonSchemaGenerator()</> method that returns <c>{@link 
JsonSchemaGenerator}</c> on the
-        *              resource class with any of the following arguments:
-        *              <ul>
-        *                      <li>{@link RestContext}
-        *                      <li>{@link BeanStore}
-        *                      <li>Any {@doc RestInjection injected beans}.
-        *              </ul>
-        *      <li>Resolves it via the bean store registered in this context.
-        *      <li>Instantiates a new {@link JsonSchemaGenerator} using the 
property store of this context..
-        * </ul>
-        *
-        * @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 JSON schema generator for this REST resource.
-        * @throws Exception If JSON schema generator could not be instantiated.
-        */
-       protected JsonSchemaGenerator createJsonSchemaGenerator(Object 
resource, RestContextBuilder builder, BeanStore beanStore) throws Exception {
-               JsonSchemaGenerator x = 
beanStore.getBean(JsonSchemaGenerator.class).orElse(null);
-
-               if (x == null)
-                       x = createJsonSchemaGeneratorBuilder(resource, builder, 
beanStore).build();
-
-               x = BeanStore
-                       .of(beanStore, resource)
-                       .addBean(JsonSchemaGenerator.class, x)
-                       .beanCreateMethodFinder(JsonSchemaGenerator.class, 
resource)
-                       .find("createJsonSchemaGenerator")
-                       .withDefault(x)
-                       .run();
-
-               return x;
-       }
-
-       /**
-        * Instantiates the JSON-schema generator builder for this REST 
resource.
-        *
-        * <p>
-        * Allows subclasses to intercept and modify the builder used by the 
{@link #createJsonSchemaGenerator(Object,RestContextBuilder,BeanStore)} method.
-        *
-        * @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 JSON-schema generator builder for this REST resource.
-        * @throws Exception If JSON-schema generator builder could not be 
instantiated.
-        */
-       protected JsonSchemaGeneratorBuilder 
createJsonSchemaGeneratorBuilder(Object resource, RestContextBuilder builder, 
BeanStore beanStore) throws Exception {
-               JsonSchemaGeneratorBuilder x = JsonSchemaGenerator
-                       .create()
-                       .apply(builder.getApplied());
-
-               x = BeanStore
-                       .of(beanStore, resource)
-                       .addBean(JsonSchemaGeneratorBuilder.class, x)
-                       
.beanCreateMethodFinder(JsonSchemaGeneratorBuilder.class, resource)
-                       .find("createJsonSchemaGeneratorBuilder")
-                       .withDefault(x)
-                       .run();
-
-               return x;
-       }
-
-       /**
         * Instantiates the REST info provider for this REST resource.
         *
         * <p>
@@ -876,7 +798,7 @@ public class RestContext extends Context {
                                .fileFinder(fileFinder)
                                .messages(messages)
                                .varResolver(varResolver)
-                               
.jsonSchemaGenerator(createJsonSchemaGenerator(resource, builder, beanStore))
+                               
.jsonSchemaGenerator(beanStore.getBean(JsonSchemaGenerator.class).get())
                                .implClass(c);
 
                x = BeanStore
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 caf1143..95c1813 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
@@ -47,6 +47,7 @@ import org.apache.juneau.http.header.*;
 import org.apache.juneau.http.response.*;
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.internal.*;
+import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.mstat.*;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.parser.*;
@@ -133,6 +134,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        private RestLogger.Builder callLogger;
        private HttpPartSerializer.Creator partSerializer;
        private HttpPartParser.Creator partParser;
+       private JsonSchemaGeneratorBuilder jsonSchemaGenerator;
 
        String
                allowedHeaderParams = env("RestContext.allowedHeaderParams", 
"Accept,Content-Type"),
@@ -307,13 +309,13 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                BeanStore bs = beanStore();
 
                runInitHooks(bs, resource());
-               logger();
-               messages();
-               responseProcessors();
 
                VarResolverSession vrs = varResolver().build().createSession();
                AnnotationWorkList al = 
rci.getAnnotationList(ContextApplyFilter.INSTANCE).getWork(vrs);
                apply(al);
+               partSerializer().apply(al);
+               partParser().apply(al);
+               jsonSchemaGenerator().apply(al);
 
                return this;
        }
@@ -1563,6 +1565,75 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                return v.get();
        }
 
+       /**
+        * Returns the JSON schema generator builder for this context.
+        *
+        * @return The JSON schema generator builder for this context.
+        */
+       public final JsonSchemaGeneratorBuilder jsonSchemaGenerator() {
+               if (jsonSchemaGenerator == null)
+                       jsonSchemaGenerator = 
createJsonSchemaGenerator(beanStore(), resource());
+               return jsonSchemaGenerator;
+       }
+
+
+       /**
+        * Instantiates the JSON schema generator for this REST resource.
+        *
+        * <p>
+        * Instantiates based on the following logic:
+        * <ul>
+        *      <li>Looks for a static or non-static 
<c>createJsonSchemaGenerator()</> method that returns <c>{@link 
JsonSchemaGenerator}</c> on the
+        *              resource class with any of the following arguments:
+        *              <ul>
+        *                      <li>{@link RestContext}
+        *                      <li>{@link BeanStore}
+        *                      <li>Any {@doc RestInjection injected beans}.
+        *              </ul>
+        *      <li>Resolves it via the bean store registered in this context.
+        *      <li>Instantiates a new {@link JsonSchemaGenerator} using the 
property store of this context..
+        * </ul>
+        *
+        * @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 JSON schema generator builder for this REST resource.
+        */
+       protected JsonSchemaGeneratorBuilder 
createJsonSchemaGenerator(BeanStore beanStore, Supplier<?> resource) {
+
+               Value<JsonSchemaGeneratorBuilder> v = Value.empty();
+               Object r = resource.get();
+
+               beanStore.getBean(JsonSchemaGeneratorBuilder.class).map(x -> 
x.copy()).ifPresent(x -> v.set(x));
+
+               if (v.isEmpty()) {
+                       v.set(
+                               JsonSchemaGenerator.create()
+                       );
+               }
+
+               beanStore.getBean(JsonSchemaGenerator.class).ifPresent(x -> 
v.get().impl(x));
+
+               BeanStore
+                       .of(beanStore, r)
+                       .addBean(JsonSchemaGeneratorBuilder.class, v.get())
+                       
.beanCreateMethodFinder(JsonSchemaGeneratorBuilder.class, r)
+                       .find("createJsonSchemaGenerator")
+                       .execute()
+                       .ifPresent(x -> v.set(x));
+
+               BeanStore
+                       .of(beanStore, r)
+                       .addBean(JsonSchemaGeneratorBuilder.class, v.get())
+                       .beanCreateMethodFinder(JsonSchemaGenerator.class, r)
+                       .find("createJsonSchemaGenerator")
+                       .execute()
+                       .ifPresent(x -> v.get().impl(x));
+
+               return v.get();
+       }
+
        
//----------------------------------------------------------------------------------------------------
        // Methods that give access to the config file, var resolver, and 
properties.
        
//----------------------------------------------------------------------------------------------------

Reply via email to