This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch jbFixRestNpe
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/jbFixRestNpe by this push:
new acb29a5a4 Rest bean refactoring.
acb29a5a4 is described below
commit acb29a5a4949944a56c0ce3f05ed625084eff404
Author: JamesBognar <[email protected]>
AuthorDate: Sun Jul 10 12:49:31 2022 -0400
Rest bean refactoring.
---
.../org/apache/juneau/rest/ResourceSupplier.java | 18 ++++-
.../java/org/apache/juneau/rest/RestContext.java | 91 ++++++++--------------
.../rest/filefinder/BasicRestFileFinder.java | 4 +-
.../juneau/rest/staticfile/BasicStaticFiles.java | 20 +++++
4 files changed, 70 insertions(+), 63 deletions(-)
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResourceSupplier.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResourceSupplier.java
index 63c836ebb..042e861b0 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResourceSupplier.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResourceSupplier.java
@@ -23,16 +23,32 @@ import java.util.function.*;
public class ResourceSupplier implements Supplier<Object> {
private final Supplier<?> supplier;
+ private final Class<?> resourceClass;
/**
* Constructor.
*
+ * @param resourceClass The resource class.
+ * <br>May or may not be the same as the object returned by the
supplier (e.g. supplier returns a proxy).
* @param supplier The supplier of the bean.
*/
- public ResourceSupplier(Supplier<?> supplier) {
+ public ResourceSupplier(Class<?> resourceClass, Supplier<?> supplier) {
+ this.resourceClass = resourceClass;
this.supplier = supplier;
}
+ /**
+ * Returns the resource class.
+ *
+ * <p>
+ * May or may not be the same as the object returned by the supplier
(e.g. supplier returns a proxy).
+ *
+ * @return The resource class.
+ */
+ public Class<?> getResourceClass() {
+ return resourceClass;
+ }
+
@Override
public Object get() {
return supplier.get();
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 26c83c555..3cf0a94d8 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
@@ -235,7 +235,7 @@ public class RestContext extends Context {
private HttpPartParser.Creator partParser;
private JsonSchemaGenerator.Builder jsonSchemaGenerator;
private BeanCreator<FileFinder> fileFinder;
- private StaticFiles.Builder staticFiles;
+ private BeanCreator<StaticFiles> staticFiles;
private HeaderList.Builder defaultRequestHeaders,
defaultResponseHeaders;
private NamedAttributeList.Builder defaultRequestAttributes;
private RestOpArgList.Builder restOpArgs;
@@ -325,7 +325,7 @@ public class RestContext extends Context {
return this;
initialized = true;
- this.resource = new ResourceSupplier(resource);
+ this.resource = new ResourceSupplier(resourceClass,
resource);
Supplier<?> r = this.resource;
Class<?> rc = resourceClass;
@@ -2533,40 +2533,40 @@ public class RestContext extends Context {
//-----------------------------------------------------------------------------------------------------------------
/**
- * Returns the static files sub-builder.
+ * Returns the static files bean creator.
*
- * @return The static files sub-builder.
+ * @return The static files bean creator.
*/
- public StaticFiles.Builder staticFiles() {
+ public BeanCreator<StaticFiles> staticFiles() {
if (staticFiles == null)
- staticFiles = createStaticFiles(beanStore(),
resource());
+ staticFiles = createStaticFiles();
return staticFiles;
}
/**
- * Applies an operation to the static files sub-builder.
+ * Specifies the static files class to use for this REST
context.
*
- * <p>
- * Typically used to allow you to execute operations without
breaking the fluent flow of the context builder.
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bjava'>
- * RestContext <jv>context</jv> = RestContext
- * .<jsm>create</jsm>(<jv>resourceClass</jv>,
<jv>parentContext</jv>, <jv>servletConfig</jv>)
- * .staticFiles(<jv>x</jv> ->
<jv>x</jv>.dir(<js>"/mydir"</js>)))
- * .build();
- * </p>
+ * @param value The new value for this setting.
+ * @return This object.
+ */
+ public Builder staticFiles(Class<? extends StaticFiles> value) {
+ staticFiles().type(value);
+ return this;
+ }
+
+ /**
+ * Specifies the static files class to use for this REST
context.
*
- * @param operation The operation to apply.
+ * @param value The new value for this setting.
* @return This object.
*/
- public Builder staticFiles(Consumer<StaticFiles.Builder>
operation) {
- operation.accept(staticFiles());
+ public Builder staticFiles(StaticFiles value) {
+ staticFiles().impl(value);
return this;
}
/**
- * Instantiates the static files sub-builder.
+ * Instantiates the static files bean creator.
*
* <p>
* Used to retrieve localized files to be served up as static
files through the REST API via the following
@@ -2584,7 +2584,7 @@ public class RestContext extends Context {
* </ul>
*
* <p>
- * The static file finder is instantiated via the {@link
RestContext.Builder#createStaticFiles(BeanStore,Supplier)} method which in turn
instantiates
+ * The static file finder is instantiated via the {@link
RestContext.Builder#createStaticFiles()} method which in turn instantiates
* based on the following logic:
*
* <ol class='spaced-list'>
@@ -2657,57 +2657,28 @@ public class RestContext extends Context {
* <jk>public class</jk> MyResource {...}
* </p>
*
- * @param beanStore
- * The factory used for creating beans and retrieving
injected beans.
- * @param resource
- * The REST servlet/bean instance that this context is
defined against.
* @return A new static files sub-builder.
*/
- protected StaticFiles.Builder createStaticFiles(BeanStore
beanStore, Supplier<?> resource) {
+ protected BeanCreator<StaticFiles> createStaticFiles() {
- // Default value.
- Value<StaticFiles.Builder> v = Value.of(
- StaticFiles
- .create(beanStore)
- .type(BasicStaticFiles.class)
- .dir("static")
- .dir("htdocs")
- .cp(resourceClass, "htdocs", true)
- .cp(resourceClass, "/htdocs", true)
- .caching(1_000_000)
- .exclude("(?i).*\\.(class|properties)")
- .headers(cacheControl("max-age=86400,
public"))
- );
-
- // Replace with bean from bean store.
- rootBeanStore
- .getBean(StaticFiles.class)
- .ifPresent(x -> v.get().impl(x));
-
- // Replace with this bean.
- resourceAs(StaticFiles.class)
- .ifPresent(x -> v.get().impl(x));
+ BeanCreator<StaticFiles> creator =
beanStore.createBean(StaticFiles.class).type(BasicStaticFiles.class);
// Specify the bean type if its set as a default.
defaultClasses()
.get(StaticFiles.class)
- .ifPresent(x -> v.get().type(x));
+ .ifPresent(x -> creator.type(x));
- // Replace with builder from: public [static]
StaticFiles.Builder createStaticFiles(<args>)
- beanStore
- .createMethodFinder(StaticFiles.Builder.class)
- .addBean(StaticFiles.Builder.class, v.get())
- .find("createStaticFiles")
- .run(x -> v.set(x));
+ rootBeanStore
+ .getBean(StaticFiles.class)
+ .ifPresent(x -> creator.impl(x));
// Replace with bean from: public [static] StaticFiles
createStaticFiles(<args>)
beanStore
.createMethodFinder(StaticFiles.class)
- .addBean(StaticFiles.Builder.class, v.get())
.find("createStaticFiles")
- .run(x -> v.get().impl(x));
+ .run(x -> creator.impl(x));
- return v.get();
+ return creator;
}
//-----------------------------------------------------------------------------------------------------------------
@@ -5810,7 +5781,7 @@ public class RestContext extends Context {
partParser = bs.add(HttpPartParser.class,
builder.partParser().create());
jsonSchemaGenerator = bs.add(JsonSchemaGenerator.class,
builder.jsonSchemaGenerator().build());
fileFinder = bs.add(FileFinder.class,
builder.fileFinder().orElse(null));
- staticFiles = bs.add(StaticFiles.class,
builder.staticFiles().build());
+ staticFiles = bs.add(StaticFiles.class,
builder.staticFiles().orElse(null));
defaultRequestHeaders = bs.add(HeaderList.class,
builder.defaultRequestHeaders().build(), "RestContext.defaultRequestHeaders");
defaultResponseHeaders = bs.add(HeaderList.class,
builder.defaultResponseHeaders().build(), "RestContext.defaultResponseHeaders");
defaultRequestAttributes =
bs.add(NamedAttributeList.class, builder.defaultRequestAttributes().build(),
"RestContext.defaultRequestAttributes");
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/filefinder/BasicRestFileFinder.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/filefinder/BasicRestFileFinder.java
index b454abbae..9ac3b52b5 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/filefinder/BasicRestFileFinder.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/filefinder/BasicRestFileFinder.java
@@ -31,8 +31,8 @@ public class BasicRestFileFinder extends BasicFileFinder {
.create(beanStore)
.dir("static")
.dir("htdocs")
-
.cp(beanStore.getBean(ResourceSupplier.class).get().getClass(), "htdocs", true)
-
.cp(beanStore.getBean(ResourceSupplier.class).get().getClass(), "/htdocs", true)
+
.cp(beanStore.getBean(ResourceSupplier.class).get().getResourceClass(),
"htdocs", true)
+
.cp(beanStore.getBean(ResourceSupplier.class).get().getResourceClass(),
"/htdocs", true)
.caching(1_000_000)
.exclude("(?i).*\\.(class|properties)")
);
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/staticfile/BasicStaticFiles.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/staticfile/BasicStaticFiles.java
index 6fb6cc09b..57d4312c6 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/staticfile/BasicStaticFiles.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/staticfile/BasicStaticFiles.java
@@ -29,6 +29,7 @@ import org.apache.juneau.cp.*;
import org.apache.juneau.http.resource.*;
import org.apache.juneau.http.response.*;
import org.apache.juneau.internal.*;
+import org.apache.juneau.rest.*;
/**
* API for retrieving localized static files from either the classpath or file
system.
@@ -59,6 +60,25 @@ public class BasicStaticFiles implements StaticFiles {
return new StaticFiles.Builder(beanStore);
}
+ /**
+ * Constructor.
+ *
+ * @param beanStore The bean store containing injectable beans for this
logger.
+ */
+ public BasicStaticFiles(BeanStore beanStore) {
+ this(StaticFiles
+ .create(beanStore)
+ .type(BasicStaticFiles.class)
+ .dir("static")
+ .dir("htdocs")
+
.cp(beanStore.getBean(ResourceSupplier.class).get().getResourceClass(),
"htdocs", true)
+
.cp(beanStore.getBean(ResourceSupplier.class).get().getResourceClass(),
"/htdocs", true)
+ .caching(1_000_000)
+ .exclude("(?i).*\\.(class|properties)")
+ .headers(cacheControl("max-age=86400, public"))
+ );
+ }
+
/**
* Constructor.
*