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

commit 2e6e824fc3aba386babad654a7f2865c82803432
Author: JamesBognar <[email protected]>
AuthorDate: Sun Sep 19 17:06:29 2021 -0400

    Context API refactoring.
---
 .../java/org/apache/juneau/rest/RestContext.java   |  11 +++
 .../org/apache/juneau/rest/RestContextBuilder.java |  71 +++++++++++++-
 .../java/org/apache/juneau/rest/RestOpContext.java | 106 +--------------------
 .../apache/juneau/rest/RestOpContextBuilder.java   |  97 ++++++++-----------
 .../juneau/rest/annotation/RestAnnotation.java     |   2 +-
 .../juneau/rest/annotation/RestOpAnnotation.java   |   2 +-
 .../juneau/rest/annotation/RestPostAnnotation.java |   2 +-
 .../juneau/rest/annotation/RestPutAnnotation.java  |   2 +-
 8 files changed, 126 insertions(+), 167 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 c003e25..dba45c7 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
@@ -170,6 +170,7 @@ public class RestContext extends Context {
        private final BeanContext beanContext;
        private final EncoderGroup encoders;
        private final SerializerGroup serializers;
+       private final ParserGroup parsers;
        private final HttpPartSerializer partSerializer;
        private final HttpPartParser partParser;
        private final JsonSchemaGenerator jsonSchemaGenerator;
@@ -279,6 +280,7 @@ public class RestContext extends Context {
                        beanContext = bs.add(BeanContext.class, 
builder.beanContext().build());
                        encoders = bs.add(EncoderGroup.class, 
builder.encoders().build());
                        serializers = bs.add(SerializerGroup.class, 
builder.serializers().build());
+                       parsers = bs.add(ParserGroup.class, 
builder.parsers().build());
                        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());
@@ -398,6 +400,15 @@ public class RestContext extends Context {
        }
 
        /**
+        * Returns the parsers associated with this context.
+        *
+        * @return The parsers associated with this context.
+        */
+       public ParserGroup getParsers() {
+               return parsers;
+       }
+
+       /**
         * Returns the time statistics gatherer for the specified method.
         *
         * @param m The method to get statistics for.
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 6dc21d6..b98b3fc 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
@@ -151,6 +151,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        private BeanContextBuilder beanContext;
        private EncoderGroup.Builder encoders;
        private SerializerGroup.Builder serializers;
+       private ParserGroup.Builder parsers;
 
        String
                allowedHeaderParams = env("RestContext.allowedHeaderParams", 
"Accept,Content-Type"),
@@ -173,9 +174,6 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        Class<? extends RestOpContext> opContextClass = RestOpContext.class;
        Class<? extends RestOperations> operationsClass = RestOperations.class;
 
-       // TODO
-       ParserGroup.Builder parsers = ParserGroup.create();
-
        List<Object> children = new ArrayList<>();
 
        /**
@@ -1082,6 +1080,73 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
+       // parsers
+       
//-----------------------------------------------------------------------------------------------------------------
+
+       /**
+        * Returns the builder for the {@link ParserGroup} object in the REST 
context.
+        *
+        * @return The builder for the {@link ParserGroup} object in the REST 
context.
+        */
+       public final ParserGroup.Builder parsers() {
+               if (parsers == null)
+                       parsers = createParsers(beanStore(), resource());
+               return parsers;
+       }
+
+       /**
+        * Instantiates the parser group builder for this REST object.
+        *
+        * @param resource
+        *      The REST servlet/bean instance that this context is defined 
against.
+        * @param beanStore
+        *      The factory used for creating beans and retrieving injected 
beans.
+        *      <br>Created by {@link RestContextBuilder#beanStore()}.
+        * @return The parser group builder for this REST resource.
+        */
+       protected ParserGroup.Builder createParsers(BeanStore beanStore, 
Supplier<?> resource) {
+
+               // Default value.
+               Value<ParserGroup.Builder> v = Value.of(
+                       ParserGroup
+                               .create()
+                               .beanStore(beanStore)
+               );
+
+               // Specify the implementation class if its set as a default.
+               defaultClasses()
+                       .get(ParserGroup.class)
+                       .ifPresent(x -> v.get().type(x));
+
+               // Replace with builder from bean store.
+               beanStore
+                       .getBean(ParserGroup.Builder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x->v.set(x));
+
+               // Replace with bean from bean store.
+               beanStore
+                       .getBean(ParserGroup.class)
+                       .ifPresent(x->v.get().impl(x));
+
+               // Replace with builder from:  public [static] 
ParserGroup.Builder createParsers(<args>)
+               beanStore
+                       .beanCreateMethodFinder(ParserGroup.Builder.class)
+                       .addBean(ParserGroup.Builder.class, v.get())
+                       .find("createParsers")
+                       .run(x -> v.set(x));
+
+               // Replace with bean from:  public [static] ParserGroup 
createParsers(<args>)
+               beanStore
+                       .beanCreateMethodFinder(ParserGroup.class)
+                       .addBean(ParserGroup.Builder.class, v.get())
+                       .find("createParsers")
+                       .run(x -> v.get().impl(x));
+
+               return v.get();
+       }
+
+       
//-----------------------------------------------------------------------------------------------------------------
        // methodExecStore
        
//-----------------------------------------------------------------------------------------------------------------
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
index b224ead..cd1962d 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
@@ -150,9 +150,7 @@ public class RestOpContext extends Context implements 
Comparable<RestOpContext>
                        beanContext = bs.add(BeanContext.class, 
builder.getBeanContext().orElse(context.getBeanContext()));
                        encoders = bs.add(EncoderGroup.class, 
builder.getEncoders().orElse(context.getEncoders()));
                        serializers = bs.add(SerializerGroup.class, 
builder.getSerializers().orElse(context.getSerializers()));
-
-                       parsers = createParsers(r, builder, bs);
-                       bs.addBean(ParserGroup.class, parsers);
+                       parsers = bs.add(ParserGroup.class, 
builder.getParsers().orElse(context.getParsers()));
 
                        partSerializer = createPartSerializer(r, builder, bs);
                        bs.addBean(HttpPartSerializer.class, partSerializer);
@@ -328,108 +326,6 @@ public class RestOpContext extends Context implements 
Comparable<RestOpContext>
                return x.build();
        }
 
-//     /**
-//      * Instantiates the serializers for this REST resource.
-//      *
-//      * <p>
-//      * Instantiates based on the following logic:
-//      * <ul>
-//      *      <li>Looks for serializers set via any of the following:
-//      *              <ul>
-//      *                      <li>{@link RestOpContext#getSerializers()}
-//      *                      <li>{@link Rest#serializers()}.
-//      *              </ul>
-//      *      <li>Looks for a static or non-static <c>createSerializers()</> 
method that returns <c>{@link Serializer}[]</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 <c>Serializer[0]</c>.
-//      * </ul>
-//      *
-//      * @param resource The REST resource object.
-//      * @param builder The builder for this object.
-//      * @param beanStore The bean store to use for retrieving and creating 
beans.
-//      * @return The serializers for this REST resource.
-//      * @throws Exception If serializers could not be instantiated.
-//      */
-//     protected SerializerGroup createSerializers(Object resource, 
RestOpContextBuilder builder, BeanStore beanStore) throws Exception {
-//
-//             SerializerGroup g = 
beanStore.getBean(SerializerGroup.class).orElse(null);
-//
-//             if (g != null)
-//                     return g;
-//
-//             SerializerGroup.Builder x = builder.serializers;
-//             if (x == null)
-//                     x = builder.restContext.builder.serializers;
-//
-//             x = BeanStore
-//                     .of(beanStore, resource)
-//                     .addBean(SerializerGroup.Builder.class, x)
-//                     .createMethodFinder(SerializerGroup.Builder.class, 
resource)
-//                     .find("createSerializers", Method.class)
-//                     .thenFind("createSerializers")
-//                     .withDefault(x)
-//                     .run();
-//
-//             return x.build();
-//     }
-
-       /**
-        * Instantiates the parsers for this REST resource.
-        *
-        * <p>
-        * Instantiates based on the following logic:
-        * <ul>
-        *      <li>Looks for parsers set via any of the following:
-        *              <ul>
-        *                      <li>{@link RestContextBuilder#getParsers()}.
-        *                      <li>{@link Rest#parsers()}.
-        *              </ul>
-        *      <li>Looks for a static or non-static <c>createParsers()</> 
method that returns <c>{@link Parser}[]</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 <c>Parser[0]</c>.
-        * </ul>
-        *
-        * @param resource The REST resource object.
-        * @param builder The builder for this object.
-        * @param beanStore The bean store to use for retrieving and creating 
beans.
-        * @return The parsers for this REST resource.
-        * @throws Exception If parsers could not be instantiated.
-        */
-       protected ParserGroup createParsers(Object resource, 
RestOpContextBuilder builder, BeanStore beanStore) throws Exception {
-
-               ParserGroup g = 
beanStore.getBean(ParserGroup.class).orElse(null);
-
-               if (g != null)
-                       return g;
-
-               ParserGroup.Builder x = builder.parsers;
-               if (x == null)
-                       x = builder.restContext.builder.parsers;
-
-               x = BeanStore
-                       .of(beanStore, resource)
-                       .addBean(ParserGroup.Builder.class, x)
-                       .createMethodFinder(ParserGroup.Builder.class, resource)
-                       .find("createParsers", Method.class)
-                       .thenFind("createParsers")
-                       .withDefault(x)
-                       .run();
-
-               return x.build();
-       }
-
        /**
         * Instantiates the HTTP part serializer for this REST resource.
         *
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java
index 8c604e2..21b4933 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContextBuilder.java
@@ -132,8 +132,8 @@ public class RestOpContextBuilder extends ContextBuilder {
                                beanContext().apply(al);
                        if (context.builder.serializers().canApply(al))
                                serializers().apply(al);
-                       if (context.builder.parsers.canApply(al))
-                               getParsers().apply(al);
+                       if (context.builder.parsers().canApply(al))
+                               parsers().apply(al);
                        if (context.builder.partSerializer().canApply(al))
                                getPartSerializer().apply(al);
                        if (context.builder.partParser().canApply(al))
@@ -310,6 +310,46 @@ public class RestOpContextBuilder extends ContextBuilder {
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
+       // parsers
+       
//-----------------------------------------------------------------------------------------------------------------
+
+       /**
+        * Returns the builder for the {@link ParserGroup} object in the REST 
context.
+        *
+        * @return The builder for the {@link ParserGroup} object in the REST 
context.
+        */
+       public final ParserGroup.Builder parsers() {
+               if (parsers == null)
+                       parsers = createParsers(beanStore(), parent, 
resource());
+               return parsers;
+       }
+
+       /**
+        * Constructs the parser group builder for this REST method.
+        *
+        * @param beanStore
+        *      The factory used for creating beans and retrieving injected 
beans.
+        * @param parent
+        *      The builder for the REST resource class.
+        * @param resource
+        *      The REST servlet/bean instance that this context is defined 
against.
+        * @return The serializer group builder for this REST resource.
+        */
+       protected ParserGroup.Builder createParsers(BeanStore beanStore, 
RestContextBuilder parent, Supplier<?> resource) {
+
+               // Default value.
+               Value<ParserGroup.Builder> v = Value.of(
+                       parent.parsers().copy()
+               );
+
+               return v.get();
+       }
+
+       final Optional<ParserGroup> getParsers() {
+               return parsers == null ? empty() : of(parsers.build());
+       }
+
+       
//-----------------------------------------------------------------------------------------------------------------
        // converters
        
//-----------------------------------------------------------------------------------------------------------------
 
@@ -443,11 +483,6 @@ public class RestOpContextBuilder extends ContextBuilder {
                return v.get();
        }
 
-
-
-
-       private int TODO;
-
        /**
         * When enabled, append <js>"/*"</js> to path patterns if not already 
present.
         *
@@ -469,54 +504,6 @@ public class RestOpContextBuilder extends ContextBuilder {
                return this;
        }
 
-//     /**
-//      * Returns the serializer group builder containing the serializers for 
marshalling POJOs into response bodies.
-//      *
-//      * <p>
-//      * This method can be used to override serializers defined at the class 
level via {@link RestContextBuilder#getSerializers()}.
-//      * On first call, the builder from the class context is copied into a 
modifiable builder for this method.
-//      * If never called, then the builder from the class context is used.
-//      *
-//      * <p>
-//      * The builder is initialized with serializers defined via the {@link 
RestOp#serializers()} (and related) annotation.
-//      * That annotation is applied from parent-to-child order with child 
entries given priority over parent entries.
-//      *
-//      * <ul class='seealso'>
-//      *      <li class='link'>{@doc RestSerializers}
-//      * </ul>
-//      *
-//      * @return The serializer group builder for this context builder.
-//      */
-//     public SerializerGroup.Builder getSerializers() {
-//             if (serializers == null)
-//                     serializers = restContext.builder.serializers.copy();
-//             return serializers;
-//     }
-
-       /**
-        * Returns the parser group builder containing the parsers for 
converting request bodies into POJOs.
-        *
-        * <p>
-        * This method can be used to override parsers defined at the class 
level via {@link RestContextBuilder#getParsers()}.
-        * On first call, the builder from the class context is copied into a 
modifiable builder for this method.
-        * If never called, then the builder from the class context is used.
-        *
-        * <p>
-        * The builder is initialized with parsers defined via the {@link 
RestOp#parsers()} (and related) annotation.
-        * That annotation is applied from parent-to-child order with child 
entries given priority over parent entries.
-        *
-        * <ul class='seealso'>
-        *      <li class='link'>{@doc RestParsers}
-        * </ul>
-        *
-        * @return The parser group builder for this context builder.
-        */
-       public ParserGroup.Builder getParsers() {
-               if (parsers == null)
-                       parsers = restContext.builder.parsers.copy();
-               return parsers;
-       }
-
        /**
         * Returns the HTTP part parser creator containing the part parser for 
parsing HTTP parts into POJOs.
         *
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 f1fbcc5..ee2f9be 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
@@ -1063,7 +1063,7 @@ public class RestAnnotation {
                        ClassInfo c = ai.getClassOn();
 
                        classes(a.serializers()).ifPresent(x -> 
b.serializers().add(x));
-                       classes(a.parsers()).ifPresent(x -> 
b.getParsers().add(x));
+                       classes(a.parsers()).ifPresent(x -> b.parsers().add(x));
                        type(a.partSerializer()).ifPresent(x -> 
b.partSerializer().type(x));
                        type(a.partParser()).ifPresent(x -> 
b.partParser().type(x));
                        strings(a.produces()).map(MediaType::of).forEach(x -> 
b.produces(x));
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOpAnnotation.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOpAnnotation.java
index 77d01c2..1fc5bfd 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOpAnnotation.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestOpAnnotation.java
@@ -630,7 +630,7 @@ public class RestOpAnnotation {
                        RestOp a = ai.getAnnotation();
 
                        classes(a.serializers()).ifPresent(x -> 
b.serializers().set(x));
-                       classes(a.parsers()).ifPresent(x -> 
b.getParsers().set(x));
+                       classes(a.parsers()).ifPresent(x -> b.parsers().set(x));
                        classes(a.encoders()).ifPresent(x -> 
b.encoders().set(x));
                        type(a.contextClass()).ifPresent(x -> b.type(x));
                        strings(a.produces()).map(MediaType::of).forEach(x -> 
b.produces(x));
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPostAnnotation.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPostAnnotation.java
index 2942db2..33087ab 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPostAnnotation.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPostAnnotation.java
@@ -614,7 +614,7 @@ public class RestPostAnnotation {
                        b.httpMethod("post");
 
                        classes(a.serializers()).ifPresent(x -> 
b.serializers().set(x));
-                       classes(a.parsers()).ifPresent(x -> 
b.getParsers().set(x));
+                       classes(a.parsers()).ifPresent(x -> b.parsers().set(x));
                        classes(a.encoders()).ifPresent(x -> 
b.encoders().set(x));
                        type(a.contextClass()).ifPresent(x -> b.type(x));
                        strings(a.produces()).map(MediaType::of).forEach(x -> 
b.produces(x));
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPutAnnotation.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPutAnnotation.java
index 3db145a..8f9a327 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPutAnnotation.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestPutAnnotation.java
@@ -614,7 +614,7 @@ public class RestPutAnnotation {
                        b.httpMethod("put");
 
                        classes(a.serializers()).ifPresent(x -> 
b.serializers().set(x));
-                       classes(a.parsers()).ifPresent(x -> 
b.getParsers().set(x));
+                       classes(a.parsers()).ifPresent(x -> b.parsers().set(x));
                        classes(a.encoders()).ifPresent(x -> 
b.encoders().set(x));
                        type(a.contextClass()).ifPresent(x -> b.type(x));
                        strings(a.produces()).map(MediaType::of).forEach(x -> 
b.produces(x));

Reply via email to