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));