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.
//----------------------------------------------------------------------------------------------------