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
commit 09d0bb07d140bb4259ddda4de392fba605f7af9e Author: James Bognar <[email protected]> AuthorDate: Fri May 8 12:52:10 2026 -0400 refactor(inject): TODO-15 phase-3 batch 5 — flip framework defaults to BeanStore, unlock RestContext.java:1199 Flip constructor signatures and `init(...)` template-method parameters of all framework defaults (`CallLogger`, `DebugEnablement`, `BasicCallLogger`, `BasicDebugEnablement`, `BasicTestCallLogger`, `BasicTestCaptureCallLogger`, `BasicDisabledCallLogger`, `BasicStaticFiles`, `BasicSwaggerProvider`) from legacy `BasicBeanStore` to the read-only v2 `BeanStore` interface. This is a breaking change for any user subclass that overrode `init(BasicBeanStore)`. Widen `BeanBuilder<T>` field, ctor, and public `beanStore()` accessor from `WritableBeanStore` to `BeanStore` — read-only is correct because builders only consult the bean store for parameter resolution at `build()` time. `VarResolver.Builder.bean(c, v)` re-architected to store beans on a local `userBeans` map and merge them into the resolver's local bean store at `build()` time, which isolates beans to that resolver instead of mutating the parent. Cascade companions flipped: `CallLoggerRule`, `StaticFiles`, `SwaggerProvider`, `DebugEnablement`, `FileFinder`, `MethodExecStore`, `MethodExecStats`, `ThrownStore`, `ThrownStats`. Test class `Rest_BeanCreatorOverrides_Test`'s 4 user-class ctors flipped to `BeanStore` to match. `BasicBeanStore` and `BasicBeanStore2` self-register under `BeanStore.class` and `WritableBeanStore.class` so `BeanCreator` parameter resolution finds the bean store via either of those interface types — required for the `BasicDebugEnablement(BeanStore)` ctor to resolve correctly. Unlocked `RestContext.java:1199`: migrated `BasicBeanStore.create().overridingParent((BasicBeanStore) bootstrapBeanStore).build()` to `new BasicBeanStore2(bootstrapBeanStore)`, dropping the deeper-blocker comment block. Full build + tests + jetty-ftest green. Co-authored-by: Cursor <[email protected]> --- .../juneau/commons/inject/BasicBeanStore2.java | 2 ++ .../src/main/java/org/apache/juneau/BeanBuilder.java | 20 +++++++++++--------- .../java/org/apache/juneau/cp/BasicBeanStore.java | 7 +++++++ .../main/java/org/apache/juneau/cp/FileFinder.java | 6 +++--- .../main/java/org/apache/juneau/svl/VarResolver.java | 20 +++++++++++++++++--- .../java/org/apache/juneau/rest/RestContext.java | 14 ++------------ .../juneau/rest/debug/BasicDebugEnablement.java | 5 +++-- .../apache/juneau/rest/debug/DebugEnablement.java | 14 +++++++------- .../apache/juneau/rest/logger/BasicCallLogger.java | 5 +++-- .../juneau/rest/logger/BasicDisabledCallLogger.java | 5 +++-- .../juneau/rest/logger/BasicTestCallLogger.java | 5 +++-- .../rest/logger/BasicTestCaptureCallLogger.java | 5 +++-- .../org/apache/juneau/rest/logger/CallLogger.java | 13 +++++++------ .../apache/juneau/rest/logger/CallLoggerRule.java | 5 +++-- .../juneau/rest/staticfile/BasicStaticFiles.java | 6 +++--- .../apache/juneau/rest/staticfile/StaticFiles.java | 6 +++--- .../apache/juneau/rest/stats/MethodExecStats.java | 6 +++--- .../apache/juneau/rest/stats/MethodExecStore.java | 8 ++++---- .../org/apache/juneau/rest/stats/ThrownStats.java | 8 ++++---- .../org/apache/juneau/rest/stats/ThrownStore.java | 8 ++++---- .../juneau/rest/swagger/BasicSwaggerProvider.java | 6 +++--- .../apache/juneau/rest/swagger/SwaggerProvider.java | 8 ++++---- .../annotation/Rest_BeanCreatorOverrides_Test.java | 9 +++++---- todo/TODO-15-replace-basicbeanstore-with-v2.md | 1 + 24 files changed, 108 insertions(+), 84 deletions(-) diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java index bf9e65edd1..e90889ff92 100644 --- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java +++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java @@ -126,6 +126,8 @@ public class BasicBeanStore2 implements WritableBeanStore { defaults = new ConcurrentHashMap<>(); typeBindings = new ConcurrentHashMap<>(); addSupplier(BasicBeanStore2.class, ()->this, null); + addSupplier(BeanStore.class, ()->this, null); + addSupplier(WritableBeanStore.class, ()->this, null); } /** diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanBuilder.java index 50c212e83a..c873a1a519 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanBuilder.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanBuilder.java @@ -20,7 +20,7 @@ import static org.apache.juneau.commons.utils.Utils.*; import java.util.*; -import org.apache.juneau.commons.inject.WritableBeanStore; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.cp.*; /** @@ -34,7 +34,7 @@ public class BeanBuilder<T> { private Class<? extends T> type; private Class<? extends T> defaultType; private T impl; - private final WritableBeanStore beanStore; + private final BeanStore beanStore; /** * Copy constructor. @@ -51,15 +51,17 @@ public class BeanBuilder<T> { * Constructor. * * <p> - * Accepts any {@link WritableBeanStore} \u2014 legacy {@link BasicBeanStore} (which - * implements {@link WritableBeanStore}) or the v2 - * {@link org.apache.juneau.commons.inject.BasicBeanStore2 BasicBeanStore2}. Cascade-builder - * subclasses no longer need to downcast to {@link BasicBeanStore} when calling {@code super(...)}. + * Accepts any {@link BeanStore} (read-only interface) \u2014 legacy {@link BasicBeanStore}, v2 + * {@link org.apache.juneau.commons.inject.BasicBeanStore2 BasicBeanStore2}, or any other + * implementation. Subclasses use the bean store solely for parameter resolution at + * {@link #build()} time; they do not mutate it. Subclasses needing to register additional beans + * for the resolved instance to see should hold them on the builder and merge in {@code build()} + * (see {@code VarResolver.Builder.bean(...)} for an example). * - * @param beanStore The bean store to use for creating beans. + * @param beanStore The bean store to use for parameter resolution. Must not be <jk>null</jk>. * @param defaultType The default bean type that this builder creates. */ - protected BeanBuilder(Class<? extends T> defaultType, WritableBeanStore beanStore) { + protected BeanBuilder(Class<? extends T> defaultType, BeanStore beanStore) { this.defaultType = type = defaultType; this.beanStore = beanStore; } @@ -69,7 +71,7 @@ public class BeanBuilder<T> { * * @return The bean store passed in through the constructor. */ - public WritableBeanStore beanStore() { + public BeanStore beanStore() { return beanStore; } diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BasicBeanStore.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BasicBeanStore.java index 1c4bca7f5f..85d76ecce0 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BasicBeanStore.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BasicBeanStore.java @@ -31,6 +31,7 @@ import java.util.function.*; import org.apache.juneau.commons.collections.*; import org.apache.juneau.commons.concurrent.*; import org.apache.juneau.commons.inject.BeanCreationException; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.commons.inject.WritableBeanStore; import org.apache.juneau.commons.reflect.*; @@ -326,6 +327,12 @@ public class BasicBeanStore implements WritableBeanStore { var e = createEntry(BasicBeanStore.class, ()->this, null); entries.addFirst(e); unnamedEntries.put(BasicBeanStore.class, e); + var e2 = createEntry(BeanStore.class, ()->this, null); + entries.addFirst(e2); + unnamedEntries.put(BeanStore.class, e2); + var e3 = createEntry(WritableBeanStore.class, ()->this, null); + entries.addFirst(e3); + unnamedEntries.put(WritableBeanStore.class, e3); } BasicBeanStore() { diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/FileFinder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/FileFinder.java index 2d808788d1..7bf096b4f7 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/FileFinder.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/FileFinder.java @@ -26,7 +26,7 @@ import java.util.*; import java.util.regex.*; import org.apache.juneau.*; -import org.apache.juneau.commons.inject.WritableBeanStore; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.commons.io.*; /** @@ -113,7 +113,7 @@ public interface FileFinder { * * @param beanStore The bean store to use for creating beans. */ - protected Builder(WritableBeanStore beanStore) { + protected Builder(BeanStore beanStore) { super(BasicFileFinder.class, beanStore); roots = set(); cachingLimit = -1; @@ -236,7 +236,7 @@ public interface FileFinder { * @param beanStore The bean store to use for creating beans. * @return A new builder for this object. */ - static Builder create(WritableBeanStore beanStore) { + static Builder create(BeanStore beanStore) { return new Builder(beanStore); } diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolver.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolver.java index 2c861d9325..5f7b8cea7f 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolver.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolver.java @@ -81,6 +81,7 @@ public class VarResolver { public static class Builder extends BeanBuilder<VarResolver> { final VarList vars; + final java.util.LinkedHashMap<Class<?>,Object> userBeans; /** * Constructor. @@ -88,6 +89,7 @@ public class VarResolver { protected Builder() { super(VarResolver.class, BasicBeanStore.create().build()); vars = VarList.create(); + userBeans = new java.util.LinkedHashMap<>(); } /** @@ -98,10 +100,16 @@ public class VarResolver { protected Builder(VarResolver copyFrom) { super(copyFrom.getClass(), copyFrom.beanStore); vars = VarList.of(copyFrom.vars); + userBeans = new java.util.LinkedHashMap<>(); } /** - * Adds a bean to the bean store in this session. + * Adds a bean to the resolved {@link VarResolver}'s local bean store. + * + * <p> + * The bean is stored on this builder and merged into the resolver's local bean store at + * {@link #build()} time. The parent bean store passed at construction is not mutated, so beans + * added here are isolated to {@link VarResolver}s built from this builder. * * @param <T> The bean type. * @param c The bean type. @@ -109,7 +117,7 @@ public class VarResolver { * @return This object . */ public <T> Builder bean(Class<T> c, T value) { - super.beanStore().addBean(c, value); + userBeans.put(c, value); return this; } @@ -249,6 +257,10 @@ public class VarResolver { * * @param builder The builder for this object. */ + @SuppressWarnings({ + "unchecked", // Type erasure on userBeans map: the runtime types match by construction + "rawtypes" // Same reason — Builder.bean(Class<T>, T) ensures Class/value pairing + }) protected VarResolver(Builder builder) { this.vars = builder.vars.stream().map(x -> toVar(builder.beanStore(), x)).toArray(Var[]::new); @@ -257,7 +269,9 @@ public class VarResolver { m.put(v.getName(), v); this.varMap = u(m); - this.beanStore = new BasicBeanStore2(builder.beanStore()); + var bs = new BasicBeanStore2(builder.beanStore()); + builder.userBeans.forEach((c, v) -> bs.addBean((Class) c, v)); + this.beanStore = bs; } /** 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 ee1860cda8..09601af34e 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 @@ -1194,20 +1194,10 @@ public class RestContext extends Context { .addBean(ServletContext.class, (nn(builder.inner) ? builder.inner : builder).getServletContext()); // @formatter:on - // If no parent store, promote bs to bootstrap and layer a fresh per-resource store on top. - // NOTE: Stays on legacy `BasicBeanStore.create()...` chain (vs `new BasicBeanStore2(null, X)`) - // because (1) `BeanCreator` resolves `BasicBeanStore`-typed constructor params (e.g. - // `BasicDebugEnablement(BasicBeanStore)`) by walking the parent chain — a `BasicBeanStore2` - // here does not satisfy that lookup, and the walk falls through to `bootstrapBeanStore` - // (legacy, self-registered as `BasicBeanStore.class`) which does NOT have the - // per-resource framework default suppliers, breaking init() Bean lookups; and (2) user-facing - // `@RestPostCall void hook(BasicBeanStore bs)` parameters are resolved via `RestOpSessionArgs` - // which propagates this same bean store. Migration deferred until either - // `BasicDebugEnablement` / `BeanCreator` constructor-param resolution moves off legacy - // `BasicBeanStore`, or Phase 4 cutover absorbs the legacy statics into v2. + // If no parent store, promote bs to bootstrap and layer a fresh per-resource v2 store on top. if (parentBs == null) { bootstrapBeanStore = bs; - bs = BasicBeanStore.create().overridingParent((BasicBeanStore) bootstrapBeanStore).build(); + bs = new BasicBeanStore2(bootstrapBeanStore); } else { bootstrapBeanStore = parentBs; } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java index 642fe9aeaf..4631406f8c 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java @@ -23,6 +23,7 @@ import static org.apache.juneau.rest.annotation.RestOpAnnotation.*; import java.util.*; import org.apache.juneau.*; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.commons.reflect.*; import org.apache.juneau.commons.utils.*; import org.apache.juneau.cp.*; @@ -54,12 +55,12 @@ public class BasicDebugEnablement extends DebugEnablement { * * @param beanStore The bean store containing injectable beans for this enablement. */ - public BasicDebugEnablement(BasicBeanStore beanStore) { + public BasicDebugEnablement(BeanStore beanStore) { super(beanStore); } @Override - protected Builder init(BasicBeanStore beanStore) { + protected Builder init(BeanStore beanStore) { var b = super.init(beanStore); var resource = beanStore.getBean(ResourceSupplier.class).orElseThrow(() -> new IllegalStateException("ResourceSupplier not found")); diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/DebugEnablement.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/DebugEnablement.java index dbfeb38cf8..73e5fbd018 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/DebugEnablement.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/DebugEnablement.java @@ -24,7 +24,7 @@ import java.util.function.*; import org.apache.juneau.*; import org.apache.juneau.commons.collections.*; -import org.apache.juneau.commons.inject.WritableBeanStore; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.commons.reflect.*; import org.apache.juneau.cp.*; import org.apache.juneau.http.response.*; @@ -67,7 +67,7 @@ public abstract class DebugEnablement { * * @param beanStore The bean store to use for creating beans. */ - protected Builder(WritableBeanStore beanStore) { + protected Builder(BeanStore beanStore) { mapBuilder = ReflectionMap.create(Enablement.class); defaultEnablement = NEVER; conditional = x -> eqic("true", x.getHeader(HEADER_Debug)); @@ -207,7 +207,7 @@ public abstract class DebugEnablement { * Represents no DebugEnablement. */ public abstract class Void extends DebugEnablement { - Void(BasicBeanStore beanStore) { + Void(BeanStore beanStore) { super(beanStore); } } @@ -218,7 +218,7 @@ public abstract class DebugEnablement { * @param beanStore The bean store to use for creating beans. * @return A new builder for this object. */ - public static Builder create(WritableBeanStore beanStore) { + public static Builder create(BeanStore beanStore) { return new Builder(beanStore); } @@ -229,11 +229,11 @@ public abstract class DebugEnablement { /** * Constructor. * <p> - * Subclasses typically override the {@link #init(BasicBeanStore)} method when using this constructor. + * Subclasses typically override the {@link #init(BeanStore)} method when using this constructor. * * @param beanStore The bean store containing injectable beans for this enablement. */ - protected DebugEnablement(BasicBeanStore beanStore) { + protected DebugEnablement(BeanStore beanStore) { var builder = init(beanStore); this.defaultEnablement = firstNonNull(builder.defaultEnablement, NEVER); this.enablementMap = builder.mapBuilder.build(); @@ -308,7 +308,7 @@ public abstract class DebugEnablement { * @param beanStore The bean store containing injectable beans for this logger. * @return A new builder object. */ - protected Builder init(BasicBeanStore beanStore) { + protected Builder init(BeanStore beanStore) { return new Builder(beanStore); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicCallLogger.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicCallLogger.java index 085a5395ce..19650dc5a6 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicCallLogger.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicCallLogger.java @@ -19,6 +19,7 @@ package org.apache.juneau.rest.logger; import static java.util.logging.Level.*; import static org.apache.juneau.rest.logger.CallLoggingDetail.*; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.cp.*; import org.apache.juneau.rest.*; @@ -52,12 +53,12 @@ public class BasicCallLogger extends CallLogger { * * @param beanStore The bean store containing injectable beans for this logger. */ - public BasicCallLogger(BasicBeanStore beanStore) { + public BasicCallLogger(BeanStore beanStore) { super(beanStore); } @Override - protected Builder init(BasicBeanStore beanStore) { + protected Builder init(BeanStore beanStore) { // @formatter:off return super.init(beanStore) .normalRules( // Rules when debugging is not enabled. diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicDisabledCallLogger.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicDisabledCallLogger.java index 7ac563c8d3..adb214328e 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicDisabledCallLogger.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicDisabledCallLogger.java @@ -16,6 +16,7 @@ */ package org.apache.juneau.rest.logger; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.cp.*; /** @@ -32,12 +33,12 @@ public class BasicDisabledCallLogger extends CallLogger { * * @param beanStore The bean store containing injectable beans for this logger. */ - public BasicDisabledCallLogger(BasicBeanStore beanStore) { + public BasicDisabledCallLogger(BeanStore beanStore) { super(beanStore); } @Override - protected Builder init(BasicBeanStore beanStore) { + protected Builder init(BeanStore beanStore) { return super.init(beanStore).disabled(); } } \ No newline at end of file diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCallLogger.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCallLogger.java index 48f12d0755..7c27549146 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCallLogger.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCallLogger.java @@ -21,6 +21,7 @@ import static org.apache.juneau.Enablement.*; import static org.apache.juneau.commons.utils.Utils.*; import static org.apache.juneau.rest.logger.CallLoggingDetail.*; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.cp.*; import org.apache.juneau.rest.*; @@ -69,12 +70,12 @@ public class BasicTestCallLogger extends CallLogger { * * @param beanStore The bean store containing injectable beans for this logger. */ - public BasicTestCallLogger(BasicBeanStore beanStore) { + public BasicTestCallLogger(BeanStore beanStore) { super(beanStore); } @Override - protected Builder init(BasicBeanStore beanStore) { + protected Builder init(BeanStore beanStore) { // @formatter:off return super.init(beanStore) .normalRules( // Rules when debugging is not enabled. diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCaptureCallLogger.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCaptureCallLogger.java index 3820c1007e..b0f842ab0a 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCaptureCallLogger.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCaptureCallLogger.java @@ -23,6 +23,7 @@ import java.util.concurrent.atomic.*; import java.util.logging.*; import org.apache.juneau.assertions.*; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.cp.*; /** @@ -92,7 +93,7 @@ public class BasicTestCaptureCallLogger extends CallLogger { * * @param beanStore The bean store containing injectable beans for this logger. */ - public BasicTestCaptureCallLogger(BasicBeanStore beanStore) { + public BasicTestCaptureCallLogger(BeanStore beanStore) { super(beanStore); } @@ -175,7 +176,7 @@ public class BasicTestCaptureCallLogger extends CallLogger { } @Override - protected Builder init(BasicBeanStore beanStore) { + protected Builder init(BeanStore beanStore) { // @formatter:off return super.init(beanStore) .normalRules( // Rules when debugging is not enabled. diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLogger.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLogger.java index e3945576ff..4668406934 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLogger.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLogger.java @@ -31,6 +31,7 @@ import java.util.logging.*; import org.apache.juneau.*; import org.apache.juneau.commons.collections.*; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.commons.utils.*; import org.apache.juneau.cp.*; import org.apache.juneau.rest.annotation.*; @@ -129,7 +130,7 @@ public class CallLogger { * * @param beanStore The bean store to use for creating beans. */ - protected Builder(BasicBeanStore beanStore) { + protected Builder(BeanStore beanStore) { logger = Logger.getLogger(env(SP_logger, "global")); enabled = env(SP_enabled, ALWAYS); enabledTest = x -> false; @@ -420,7 +421,7 @@ public class CallLogger { /** Represents no logger */ public abstract class Void extends CallLogger { - Void(BasicBeanStore beanStore) { + Void(BeanStore beanStore) { super(beanStore); } } @@ -500,7 +501,7 @@ public class CallLogger { * @param beanStore The bean store to use for creating beans. * @return A new builder for this object. */ - public static Builder create(BasicBeanStore beanStore) { + public static Builder create(BeanStore beanStore) { return new Builder(beanStore); } @@ -517,11 +518,11 @@ public class CallLogger { /** * Constructor. * <p> - * Subclasses typically override the {@link #init(BasicBeanStore)} method when using this constructor. + * Subclasses typically override the {@link #init(BeanStore)} method when using this constructor. * * @param beanStore The bean store containing injectable beans for this logger. */ - public CallLogger(BasicBeanStore beanStore) { + public CallLogger(BeanStore beanStore) { var builder = init(beanStore); this.logger = builder.logger; this.thrownStore = builder.thrownStore; @@ -749,7 +750,7 @@ public class CallLogger { * @param beanStore The bean store containing injectable beans for this logger. * @return A new builder object. */ - protected Builder init(BasicBeanStore beanStore) { + protected Builder init(BeanStore beanStore) { return new Builder(beanStore).logger(beanStore.getBean(Logger.class).orElse(null)).thrownStore(beanStore.getBean(ThrownStore.class).orElse(null)); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLoggerRule.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLoggerRule.java index dcc27b84d3..9687174f55 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLoggerRule.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLoggerRule.java @@ -24,6 +24,7 @@ import java.util.logging.*; import org.apache.juneau.*; import org.apache.juneau.commons.collections.*; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.cp.*; import jakarta.servlet.http.*; @@ -72,7 +73,7 @@ public class CallLoggerRule { * * @param beanStore The bean store to use for creating beans. */ - protected Builder(BasicBeanStore beanStore) { + protected Builder(BeanStore beanStore) { super(CallLoggerRule.class, beanStore); } @@ -319,7 +320,7 @@ public class CallLoggerRule { * @param beanStore The bean store to use for creating beans. * @return A new builder for this object. */ - public static Builder create(BasicBeanStore beanStore) { + public static Builder create(BeanStore beanStore) { return new Builder(beanStore); } 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 05ec948514..7a209bef1e 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 @@ -27,7 +27,7 @@ import java.util.*; import org.apache.http.*; import org.apache.juneau.commons.collections.*; -import org.apache.juneau.commons.inject.WritableBeanStore; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.commons.io.*; import org.apache.juneau.cp.*; import org.apache.juneau.http.resource.*; @@ -60,7 +60,7 @@ public class BasicStaticFiles implements StaticFiles { * @param beanStore The bean store to use for creating beans. * @return A new builder for this object. */ - public static StaticFiles.Builder create(WritableBeanStore beanStore) { + public static StaticFiles.Builder create(BeanStore beanStore) { return new StaticFiles.Builder(beanStore); } @@ -75,7 +75,7 @@ public class BasicStaticFiles implements StaticFiles { * * @param beanStore The bean store containing injectable beans for this logger. */ - public BasicStaticFiles(BasicBeanStore beanStore) { + public BasicStaticFiles(BeanStore beanStore) { // @formatter:off this(StaticFiles .create(beanStore) diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/staticfile/StaticFiles.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/staticfile/StaticFiles.java index 400760e824..06160b7597 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/staticfile/StaticFiles.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/staticfile/StaticFiles.java @@ -23,7 +23,7 @@ import java.util.*; import org.apache.http.*; import org.apache.juneau.*; -import org.apache.juneau.commons.inject.WritableBeanStore; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.commons.io.*; import org.apache.juneau.cp.*; import org.apache.juneau.http.resource.*; @@ -51,7 +51,7 @@ public interface StaticFiles extends FileFinder { * * @param beanStore The bean store to use for creating beans. */ - protected Builder(WritableBeanStore beanStore) { + protected Builder(BeanStore beanStore) { super(BasicStaticFiles.class, beanStore); headers = list(); fileFinder = FileFinder.create(beanStore); @@ -193,7 +193,7 @@ public interface StaticFiles extends FileFinder { * @param beanStore The bean store to use for creating beans. * @return A new builder for this object. */ - static Builder create(WritableBeanStore beanStore) { + static Builder create(BeanStore beanStore) { return new Builder(beanStore); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/MethodExecStats.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/MethodExecStats.java index 3285c84555..fddf15b991 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/MethodExecStats.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/MethodExecStats.java @@ -25,7 +25,7 @@ import java.util.concurrent.atomic.*; import org.apache.juneau.*; import org.apache.juneau.commons.collections.*; -import org.apache.juneau.commons.inject.WritableBeanStore; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.cp.*; /** @@ -67,7 +67,7 @@ public class MethodExecStats { * * @param beanStore The bean store to use for creating beans. */ - protected Builder(WritableBeanStore beanStore) { + protected Builder(BeanStore beanStore) { super(MethodExecStats.class, beanStore); } @@ -117,7 +117,7 @@ public class MethodExecStats { * @param beanStore The bean store to use for creating beans. * @return A new builder for this object. */ - public static Builder create(WritableBeanStore beanStore) { + public static Builder create(BeanStore beanStore) { return new Builder(beanStore); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/MethodExecStore.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/MethodExecStore.java index db7d161216..f7b4b416a3 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/MethodExecStore.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/MethodExecStore.java @@ -23,7 +23,7 @@ import java.util.*; import java.util.concurrent.*; import org.apache.juneau.*; -import org.apache.juneau.commons.inject.WritableBeanStore; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.cp.*; /** @@ -51,7 +51,7 @@ public class MethodExecStore { * * @param beanStore The bean store to use for creating beans. */ - protected Builder(WritableBeanStore beanStore) { + protected Builder(BeanStore beanStore) { super(MethodExecStore.class, beanStore); } @@ -128,12 +128,12 @@ public class MethodExecStore { * @param beanStore The bean store to use for creating beans. * @return A new builder for this object. */ - public static Builder create(WritableBeanStore beanStore) { + public static Builder create(BeanStore beanStore) { return new Builder(beanStore); } private final ThrownStore thrownStore; - private final WritableBeanStore beanStore; + private final BeanStore beanStore; private final Class<? extends MethodExecStats> statsImplClass; private final ConcurrentHashMap<Method,MethodExecStats> db = new ConcurrentHashMap<>(); diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/ThrownStats.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/ThrownStats.java index f986d3657c..1135f75abf 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/ThrownStats.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/ThrownStats.java @@ -23,7 +23,7 @@ import java.util.*; import java.util.concurrent.atomic.*; import org.apache.juneau.commons.collections.*; -import org.apache.juneau.commons.inject.WritableBeanStore; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.cp.*; /** @@ -54,7 +54,7 @@ public class ThrownStats { */ public static class Builder { - final WritableBeanStore beanStore; + final BeanStore beanStore; Throwable throwable; long hash; List<String> stackTrace; @@ -67,7 +67,7 @@ public class ThrownStats { * * @param beanStore The bean store to use for creating beans. */ - protected Builder(WritableBeanStore beanStore) { + protected Builder(BeanStore beanStore) { this.beanStore = beanStore; this.creator = BeanCreator.of(ThrownStats.class, beanStore).builder(Builder.class, this); } @@ -143,7 +143,7 @@ public class ThrownStats { * @param beanStore The bean store to use for creating beans. * @return A new builder for this object. */ - public static Builder create(WritableBeanStore beanStore) { + public static Builder create(BeanStore beanStore) { return new Builder(beanStore); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/ThrownStore.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/ThrownStore.java index 6edbe10cf8..6d29977fa6 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/ThrownStore.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/stats/ThrownStore.java @@ -25,7 +25,7 @@ import java.util.*; import java.util.concurrent.*; import org.apache.juneau.*; -import org.apache.juneau.commons.inject.WritableBeanStore; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.cp.*; /** @@ -54,7 +54,7 @@ public class ThrownStore { * * @param beanStore The bean store to use for creating beans. */ - protected Builder(WritableBeanStore beanStore) { + protected Builder(BeanStore beanStore) { super(ThrownStore.class, beanStore); } @@ -134,13 +134,13 @@ public class ThrownStore { * @param beanStore The bean store to use for creating beans. * @return A new builder for this object. */ - public static Builder create(WritableBeanStore beanStore) { + public static Builder create(BeanStore beanStore) { return new Builder(beanStore); } private final ConcurrentHashMap<Long,ThrownStats> db = new ConcurrentHashMap<>(); private final Optional<ThrownStore> parent; - private final WritableBeanStore beanStore; + private final BeanStore beanStore; private final Class<? extends ThrownStats> statsImplClass; private final Set<String> ignoreClasses; diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProvider.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProvider.java index e2fceb4f3d..ae4ed044ed 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProvider.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProvider.java @@ -21,7 +21,7 @@ import static org.apache.juneau.commons.utils.Utils.*; import java.util.*; import org.apache.juneau.bean.swagger.Swagger; -import org.apache.juneau.commons.inject.WritableBeanStore; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.cp.*; import org.apache.juneau.jsonschema.*; import org.apache.juneau.rest.*; @@ -41,14 +41,14 @@ public class BasicSwaggerProvider implements SwaggerProvider { private final JsonSchemaGenerator js; private final Messages messages; private final FileFinder fileFinder; - private final WritableBeanStore beanStore; + private final BeanStore beanStore; /** * Constructor. * * @param beanStore The bean store containing injectable beans for this logger. */ - public BasicSwaggerProvider(WritableBeanStore beanStore) { + public BasicSwaggerProvider(BeanStore beanStore) { // @formatter:off this( SwaggerProvider diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/SwaggerProvider.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/SwaggerProvider.java index 3b3aebe3a5..a560c427f1 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/SwaggerProvider.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/SwaggerProvider.java @@ -22,7 +22,7 @@ import java.util.*; import java.util.function.*; import org.apache.juneau.bean.swagger.Swagger; -import org.apache.juneau.commons.inject.WritableBeanStore; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.cp.*; import org.apache.juneau.http.response.*; import org.apache.juneau.jsonschema.*; @@ -44,7 +44,7 @@ public interface SwaggerProvider { */ public class Builder { - final WritableBeanStore beanStore; + final BeanStore beanStore; Class<?> resourceClass; Supplier<VarResolver> varResolver; Supplier<JsonSchemaGenerator> jsonSchemaGenerator; @@ -57,7 +57,7 @@ public interface SwaggerProvider { * * @param beanStore The bean store to use for creating beans. */ - protected Builder(WritableBeanStore beanStore) { + protected Builder(BeanStore beanStore) { this.beanStore = beanStore; this.creator = BeanCreator.of(SwaggerProvider.class, this.beanStore).type(BasicSwaggerProvider.class).builder(Builder.class, this); } @@ -204,7 +204,7 @@ public interface SwaggerProvider { * @param beanStore The bean store to use for creating beans. * @return A new builder for this object. */ - static Builder create(WritableBeanStore beanStore) { + static Builder create(BeanStore beanStore) { return new Builder(beanStore); } diff --git a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Rest_BeanCreatorOverrides_Test.java b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Rest_BeanCreatorOverrides_Test.java index 03d54d08a5..eb18fb2845 100644 --- a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Rest_BeanCreatorOverrides_Test.java +++ b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Rest_BeanCreatorOverrides_Test.java @@ -19,6 +19,7 @@ package org.apache.juneau.rest.annotation; import static org.junit.jupiter.api.Assertions.*; import org.apache.juneau.*; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.cp.*; import org.apache.juneau.rest.*; import org.apache.juneau.rest.debug.*; @@ -52,7 +53,7 @@ class Rest_BeanCreatorOverrides_Test extends TestBase { //------------------------------------------------------------------------------------------------------------------ public static class CustomDebugEnablement extends BasicDebugEnablement { - public CustomDebugEnablement(BasicBeanStore beanStore) { + public CustomDebugEnablement(BeanStore beanStore) { super(beanStore); } } @@ -80,7 +81,7 @@ class Rest_BeanCreatorOverrides_Test extends TestBase { //------------------------------------------------------------------------------------------------------------------ public static class CustomStaticFiles extends BasicStaticFiles { - public CustomStaticFiles(BasicBeanStore beanStore) { + public CustomStaticFiles(BeanStore beanStore) { super(beanStore); } } @@ -108,7 +109,7 @@ class Rest_BeanCreatorOverrides_Test extends TestBase { //------------------------------------------------------------------------------------------------------------------ public static class CustomSwaggerProvider extends BasicSwaggerProvider { - public CustomSwaggerProvider(BasicBeanStore beanStore) { + public CustomSwaggerProvider(BeanStore beanStore) { super(beanStore); } } @@ -136,7 +137,7 @@ class Rest_BeanCreatorOverrides_Test extends TestBase { //------------------------------------------------------------------------------------------------------------------ public static class CustomDebugEnablement2 extends BasicDebugEnablement { - public CustomDebugEnablement2(BasicBeanStore beanStore) { + public CustomDebugEnablement2(BeanStore beanStore) { super(beanStore); } } diff --git a/todo/TODO-15-replace-basicbeanstore-with-v2.md b/todo/TODO-15-replace-basicbeanstore-with-v2.md index b1721815b6..8a38c90271 100644 --- a/todo/TODO-15-replace-basicbeanstore-with-v2.md +++ b/todo/TODO-15-replace-basicbeanstore-with-v2.md @@ -15,6 +15,7 @@ Eliminate the legacy injection stack in `org.apache.juneau.cp` (`BasicBeanStore` - ~~Four-memoizer migration to `BeanInstantiator` (Phase 3 sub-task)~~ — **ATTEMPTED + REVERTED (2026-05-08).** `callLogger` / `debugEnablement` / `staticFiles` / `swaggerProvider` were migrated to `BeanInstantiator.of(...).beanSubType(...).run()`; this broke documented `@Rest(callLogger=…)` / `@Rest(debugEnablement=…)` / `@Rest(swaggerProvider=…)` annotation overrides (3 `Rest_BeanCreatorOverrides_Test` failures) plus `juneau-examples-rest-jetty-ftest` (static files no longer served — ` [...] - ~~Phase 3 batch-3: drop vestigial `(BasicBeanStore)` casts at framework-defaults call sites~~ — **DONE (2026-05-08).** Sixteen `(BasicBeanStore) bs` casts in `RestContext.java` (lines 494, 515, 584, 676, 753, 768, 914, 937, 957, 987, 1008, 1029, 1064, 1110, 1125) and one in `RestOpContext.java` (line 437) dropped. These were vestigial leftovers from before the utility-class `create(...)` factories were widened to `WritableBeanStore` in the cascade-builder work. The cast was no longer r [...] - ~~Phase 3 batch-4: widen field types + getter return types in `RestSession` / `RestOpSession` / `VarResolver` / `VarResolverSession`~~ — **DONE (2026-05-08).** Field types and accessor return types widened from legacy `BasicBeanStore` to v2 `WritableBeanStore`; corresponding `BasicBeanStore.of((BasicBeanStore) X)` calls migrated to `new BasicBeanStore2(X)`: `VarResolver.beanStore` (field) + `VarResolver.createSession(BasicBeanStore)` (public method param) + `VarResolverSession.beanStor [...] +- ~~Phase 3 batch-5: flip framework-default ctors + `init()` template methods to `BeanStore`; widen `BeanBuilder<T>` to `BeanStore`; unlock `RestContext.java:1199`~~ — **DONE (2026-05-08).** Constructor signatures and `init(...)` template method parameters of all framework defaults (`CallLogger`, `DebugEnablement`, `BasicCallLogger`, `BasicDebugEnablement`, `BasicTestCallLogger`, `BasicTestCaptureCallLogger`, `BasicDisabledCallLogger`, `BasicStaticFiles`, `BasicSwaggerProvider`) flipped [...] ### Deeper blocker discovered (2026-05-08, batch 4)
