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 f14d7ca Context API refactoring.
f14d7ca is described below
commit f14d7cafef0bba11880b66ac81e203ef455389ea
Author: JamesBognar <[email protected]>
AuthorDate: Sun Sep 12 18:58:53 2021 -0400
Context API refactoring.
---
.../main/java/org/apache/juneau/cp/BeanStore.java | 13 ++
.../org/apache/juneau/http/header/HeaderList.java | 14 ++
.../java/org/apache/juneau/rest/RestContext.java | 91 +-----------
.../org/apache/juneau/rest/RestContextBuilder.java | 155 ++++++++++++++++++++-
4 files changed, 179 insertions(+), 94 deletions(-)
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
index fdcaeac..010c86a 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
@@ -297,6 +297,19 @@ public class BeanStore {
}
/**
+ * Same as {@link #addBean(String, Object)} but returns the bean
instead of this object.
+ *
+ * @param name The name to associate this bean with.
+ * @param t The bean.
+ * @return The bean.
+ */
+ public <T> T add(String name, T t) {
+ assertCanWrite();
+ addBean(name, t);
+ return t;
+ }
+
+ /**
* Adds a named bean of the specified type to this factory.
*
* @param <T> The class to associate this bean with.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
index e69724d..a1c9f4b 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
@@ -244,6 +244,7 @@ public class HeaderList {
final List<Header> entries;
List<Header> defaultEntries;
+ HeaderList impl;
private VarResolver varResolver;
boolean caseSensitive;
@@ -293,6 +294,8 @@ public class HeaderList {
* @return A new {@link HeaderList} bean.
*/
public HeaderList build() {
+ if (impl != null)
+ return impl;
return entries.isEmpty() && defaultEntries == null ?
EMPTY : new HeaderList(this);
}
@@ -1154,6 +1157,17 @@ public class HeaderList {
return Optional.empty();
}
+ /**
+ * Specifies a pre-instantiated bean for the {@link #build()}
method to return.
+ *
+ * @param value The value for this setting.
+ * @return This object.
+ */
+ public Builder impl(HeaderList value) {
+ impl = value;
+ return this;
+ }
+
@Override /* Object */
public String toString() {
return "[" + join(entries, ", ") + "]";
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 da56b082..5b14dc5 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
@@ -262,13 +262,12 @@ public class RestContext extends Context {
jsonSchemaGenerator = bs.add(JsonSchemaGenerator.class,
builder.jsonSchemaGenerator().build());
fileFinder = bs.add(FileFinder.class,
builder.fileFinder().build());
staticFiles = bs.add(StaticFiles.class,
builder.staticFiles().build());
+ defaultRequestHeaders =
bs.add("RestContext.defaultRequestHeaders",
builder.defaultRequestHeaders().build());
+ defaultResponseHeaders =
bs.add("RestContext.defaultResponseHeaders",
builder.defaultResponseHeaders().build());
+ defaultRequestAttributes =
bs.add("RestContext.defaultRequestAttributes",
builder.defaultRequestAttributes());
Object r = resource.get();
- defaultRequestHeaders = createDefaultRequestHeaders(r,
builder, bs).build();
- defaultResponseHeaders =
createDefaultResponseHeaders(r, builder, bs).build();
- defaultRequestAttributes =
createDefaultRequestAttributes(r, builder, bs);
-
opArgs = createOpArgs(r, builder, bs).asArray();
hookMethodArgs = createHookMethodArgs(r, builder,
bs).asArray();
@@ -562,90 +561,6 @@ public class RestContext extends Context {
}
/**
- * Instantiates the default request headers for this REST object.
- *
- * @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 default request headers for this REST object.
- * @throws Exception If stack trace store could not be instantiated.
- */
- protected HeaderList.Builder createDefaultRequestHeaders(Object
resource, RestContextBuilder builder, BeanStore beanStore) throws Exception {
-
- HeaderList.Builder x = builder.defaultRequestHeaders;
-
- x = BeanStore
- .of(beanStore, resource)
- .addBean(HeaderList.Builder.class, x)
- .beanCreateMethodFinder(HeaderList.Builder.class,
resource)
- .find("createDefaultRequestHeaders")
- .withDefault(x)
- .run();
-
- return x;
- }
-
- /**
- * Instantiates the default response headers for this REST object.
- *
- * @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 default response headers for this REST object.
- * @throws Exception If stack trace store could not be instantiated.
- */
- protected HeaderList.Builder createDefaultResponseHeaders(Object
resource, RestContextBuilder builder, BeanStore beanStore) throws Exception {
-
- HeaderList.Builder x = builder.defaultResponseHeaders;
-
- x = BeanStore
- .of(beanStore, resource)
- .addBean(HeaderList.Builder.class, x)
- .beanCreateMethodFinder(HeaderList.Builder.class,
resource)
- .find("createDefaultResponseHeaders")
- .withDefault(x)
- .run();
-
- return x;
- }
-
- /**
- * Instantiates the default response headers for this REST object.
- *
- * @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 default response headers for this REST object.
- * @throws Exception If stack trace store could not be instantiated.
- */
- protected NamedAttributeList createDefaultRequestAttributes(Object
resource, RestContextBuilder builder, BeanStore beanStore) throws Exception {
-
- NamedAttributeList x = builder.defaultRequestAttributes;
-
- x = BeanStore
- .of(beanStore, resource)
- .addBean(NamedAttributeList.class, x)
- .beanCreateMethodFinder(NamedAttributeList.class,
resource)
- .find("createDefaultRequestAttributes")
- .withDefault(x)
- .run();
-
- return x;
- }
-
- /**
* Instantiates the debug enablement bean for this REST object.
*
* @param resource
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 76ddfd2..02aa843 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
@@ -137,6 +137,9 @@ public class RestContextBuilder extends ContextBuilder
implements ServletConfig
private JsonSchemaGeneratorBuilder jsonSchemaGenerator;
private FileFinder.Builder fileFinder;
private StaticFiles.Builder staticFiles;
+ private HeaderList.Builder defaultRequestHeaders;
+ private HeaderList.Builder defaultResponseHeaders;
+ private NamedAttributeList defaultRequestAttributes;
String
allowedHeaderParams = env("RestContext.allowedHeaderParams",
"Accept,Content-Type"),
@@ -161,9 +164,6 @@ public class RestContextBuilder extends ContextBuilder
implements ServletConfig
BeanRef<SwaggerProvider> swaggerProvider =
BeanRef.of(SwaggerProvider.class);
BeanRef<DebugEnablement> debugEnablement =
BeanRef.of(DebugEnablement.class);
- NamedAttributeList defaultRequestAttributes =
NamedAttributeList.create();
- HeaderList.Builder defaultRequestHeaders = HeaderList.create();
- HeaderList.Builder defaultResponseHeaders = HeaderList.create();
EncoderGroup.Builder encoders =
EncoderGroup.create().add(IdentityEncoder.INSTANCE);
SerializerGroup.Builder serializers = SerializerGroup.create();
ParserGroup.Builder parsers = ParserGroup.create();
@@ -1991,6 +1991,149 @@ public class RestContextBuilder extends ContextBuilder
implements ServletConfig
return v.get();
}
+ /**
+ * Returns the builder for the default request headers in the REST
context.
+ *
+ * @return The builder for the default request headers in the REST
context.
+ */
+ public final HeaderList.Builder defaultRequestHeaders() {
+ if (defaultRequestHeaders == null)
+ defaultRequestHeaders =
createDefaultRequestHeaders(beanStore(), resource());
+ return defaultRequestHeaders;
+ }
+
+ /**
+ * Instantiates the default request headers for this REST object.
+ *
+ * @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 default request headers for this REST object.
+ */
+ protected HeaderList.Builder createDefaultRequestHeaders(BeanStore
beanStore, Supplier<?> resource) {
+
+ Value<HeaderList.Builder> v = Value.empty();
+ Object r = resource.get();
+
+ beanStore.getBean("RestContext.defaultRequestHeaders",
HeaderList.Builder.class).map(x -> x.copy()).ifPresent(x -> v.set(x));
+
+ if (v.isEmpty())
+ v.set(HeaderList.create());
+
+ beanStore.getBean("RestContext.defaultRequestHeaders",
HeaderList.class).ifPresent(x -> v.get().impl(x));
+
+ BeanStore
+ .of(beanStore, r)
+ .addBean(HeaderList.Builder.class, v.get())
+ .beanCreateMethodFinder(HeaderList.Builder.class, r)
+ .find("createDefaultRequestHeaders")
+ .execute()
+ .ifPresent(x -> v.set(x));
+
+ BeanStore
+ .of(beanStore, r)
+ .addBean(HeaderList.Builder.class, v.get())
+ .beanCreateMethodFinder(HeaderList.class, r)
+ .find("createDefaultRequestHeaders")
+ .execute()
+ .ifPresent(x -> v.get().impl(x));
+
+ return v.get();
+ }
+
+ /**
+ * Returns the builder for the default response headers in the REST
context.
+ *
+ * @return The builder for the default response headers in the REST
context.
+ */
+ public final HeaderList.Builder defaultResponseHeaders() {
+ if (defaultResponseHeaders == null)
+ defaultResponseHeaders =
createDefaultResponseHeaders(beanStore(), resource());
+ return defaultResponseHeaders;
+ }
+
+ /**
+ * Instantiates the default response headers for this REST object.
+ *
+ * @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 default response headers for this REST object.
+ */
+ protected HeaderList.Builder createDefaultResponseHeaders(BeanStore
beanStore, Supplier<?> resource) {
+
+ Value<HeaderList.Builder> v = Value.empty();
+ Object r = resource.get();
+
+ beanStore.getBean("RestContext.defaultResponseHeaders",
HeaderList.Builder.class).map(x -> x.copy()).ifPresent(x -> v.set(x));
+
+ if (v.isEmpty())
+ v.set(HeaderList.create());
+
+ beanStore.getBean("RestContext.defaultResponseHeaders",
HeaderList.class).ifPresent(x -> v.get().impl(x));
+
+ BeanStore
+ .of(beanStore, r)
+ .addBean(HeaderList.Builder.class, v.get())
+ .beanCreateMethodFinder(HeaderList.Builder.class, r)
+ .find("createDefaultResponseHeaders")
+ .execute()
+ .ifPresent(x -> v.set(x));
+
+ BeanStore
+ .of(beanStore, r)
+ .addBean(HeaderList.Builder.class, v.get())
+ .beanCreateMethodFinder(HeaderList.class, r)
+ .find("createDefaultResponseHeaders")
+ .execute()
+ .ifPresent(x -> v.get().impl(x));
+
+ return v.get();
+ }
+
+ /**
+ * Returns the builder for the default requests attributes in the REST
context.
+ *
+ * @return The builder for the default request attributer object in the
REST context.
+ */
+ public final NamedAttributeList defaultRequestAttributes() {
+ if (defaultRequestAttributes == null)
+ defaultRequestAttributes =
createDefaultRequestAttributes(beanStore(), resource());
+ return defaultRequestAttributes;
+ }
+
+ /**
+ * Instantiates the default response headers for this REST object.
+ *
+ * @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 default response headers for this REST object.
+ */
+ protected NamedAttributeList createDefaultRequestAttributes(BeanStore
beanStore, Supplier<?> resource) {
+
+ Value<NamedAttributeList> v = Value.empty();
+ Object r = resource.get();
+
+ beanStore.getBean("RestContext.defaultRequestAttributes",
NamedAttributeList.class).map(x -> x.copy()).ifPresent(x -> v.set(x));
+
+ if (v.isEmpty())
+ v.set(NamedAttributeList.create());
+
+ BeanStore
+ .of(beanStore, r)
+ .addBean(NamedAttributeList.class, v.get())
+ .beanCreateMethodFinder(NamedAttributeList.class, r)
+ .find("createDefaultRequestAttributes")
+ .execute()
+ .ifPresent(x -> v.set(x));
+
+ return v.get();
+ }
+
//----------------------------------------------------------------------------------------------------
// Methods that give access to the config file, var resolver, and
properties.
//----------------------------------------------------------------------------------------------------
@@ -2679,7 +2822,7 @@ public class RestContextBuilder extends ContextBuilder
implements ServletConfig
*/
@FluentSetter
public RestContextBuilder
defaultRequestAttributes(NamedAttribute...values) {
- defaultRequestAttributes.appendUnique(values);
+ defaultRequestAttributes().appendUnique(values);
return this;
}
@@ -2740,7 +2883,7 @@ public class RestContextBuilder extends ContextBuilder
implements ServletConfig
*/
@FluentSetter
public RestContextBuilder defaultRequestHeaders(Header...values) {
- defaultRequestHeaders.setDefault(values);
+ defaultRequestHeaders().setDefault(values);
return this;
}
@@ -2797,7 +2940,7 @@ public class RestContextBuilder extends ContextBuilder
implements ServletConfig
*/
@FluentSetter
public RestContextBuilder defaultResponseHeaders(Header...values) {
- defaultResponseHeaders.setDefault(values);
+ defaultResponseHeaders().setDefault(values);
return this;
}