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 4bec2cf199 fix: add BeanMapEntry equals/hashCode; add @BeanIgnore to
SecurityRequirement.setApiKeyAuth to fix GitHub CI failures
4bec2cf199 is described below
commit 4bec2cf199acbea741bdf11a4f2bc4f95aa8eb5e
Author: James Bognar <[email protected]>
AuthorDate: Wed May 13 17:47:23 2026 -0400
fix: add BeanMapEntry equals/hashCode; add @BeanIgnore to
SecurityRequirement.setApiKeyAuth to fix GitHub CI failures
---
.../juneau/bean/openapi3/SecurityRequirement.java | 2 +
.../apache/juneau/commons/bean/BeanMapEntry.java | 33 ++++++
todo/TODO-14-move-svl-to-commons.md | 116 ++++++++++++++-------
todo/TODO.md | 5 +
4 files changed, 116 insertions(+), 40 deletions(-)
diff --git
a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/SecurityRequirement.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/SecurityRequirement.java
index ba561d1134..500d47633a 100644
---
a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/SecurityRequirement.java
+++
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/SecurityRequirement.java
@@ -23,6 +23,7 @@ import static org.apache.juneau.internal.ConverterUtils.*;
import java.util.*;
+import org.apache.juneau.commons.bean.*;
import org.apache.juneau.commons.collections.*;
/**
@@ -155,6 +156,7 @@ public class SecurityRequirement extends OpenApiElement {
* @param schemeName The security scheme name. Must not be
<jk>null</jk>.
* @return This object.
*/
+ @BeanIgnore
public SecurityRequirement setApiKeyAuth(String schemeName) {
return addRequirement(schemeName);
}
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMapEntry.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMapEntry.java
index ac44c2e50e..aae1705361 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMapEntry.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMapEntry.java
@@ -125,6 +125,39 @@ public class BeanMapEntry implements
Map.Entry<String,Object> {
return meta.set(this.beanMap, pName, value);
}
+ /**
+ * Returns <jk>true</jk> if the given object is a {@link Map.Entry}
with equal key and value.
+ *
+ * <p>
+ * This follows the {@link Map.Entry} equality contract: two entries
are equal if both their
+ * keys and values compare equal via {@link Objects#equals}.
+ *
+ * @param obj The object to compare against.
+ * @return <jk>true</jk> if equal.
+ */
+ @Override /* Overridden from Object */
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (!(obj instanceof Map.Entry<?,?> other))
+ return false;
+ return Objects.equals(getKey(), other.getKey()) &&
Objects.equals(getValue(), other.getValue());
+ }
+
+ /**
+ * Returns the hash code for this entry, consistent with the {@link
Map.Entry} contract.
+ *
+ * <p>
+ * The hash code is computed as {@code key.hashCode() ^
value.hashCode()}, matching the
+ * contract that equal entries must have equal hash codes.
+ *
+ * @return The hash code.
+ */
+ @Override /* Overridden from Object */
+ public int hashCode() {
+ return Objects.hashCode(getKey()) ^
Objects.hashCode(getValue());
+ }
+
@Override /* Overridden from Object */
public String toString() {
return this.getKey() + "=" + this.getValue();
diff --git a/todo/TODO-14-move-svl-to-commons.md
b/todo/TODO-14-move-svl-to-commons.md
index ec1133463c..8817bd3121 100644
--- a/todo/TODO-14-move-svl-to-commons.md
+++ b/todo/TODO-14-move-svl-to-commons.md
@@ -7,7 +7,7 @@ Relocate `org.apache.juneau.svl` (Simple Variable Language)
from `juneau-marshal
**Target release:** **9.5.0** — a semi-major release that explicitly permits
simple breaking changes.
**Related:**
-- **Blocked by TODO-15** — `BasicBeanStore` / `BeanCreator` consolidation must
land first so SVL can point at the final class names (no `*2` suffix) on its
first move.
+- ~~Blocked by TODO-15~~ — **dependency satisfied**, see Phase 2 below.
- Enables TODO-7 Phase 4 (decouple `HeaderList` / `PartList` from
marshall-hosted SVL).
---
@@ -18,9 +18,13 @@ Relocate `org.apache.juneau.svl` (Simple Variable Language)
from `juneau-marshal
- `org.apache.juneau.commons.runtime.Args`
- `org.apache.juneau.commons.runtime.ManifestFile`
- Both expose an `Optional<String>`-returning API — callers perform any type
conversion themselves via `Optional.map(...)`.
+- **`Args.get(String key)` returns only the first value** when a flag is
repeated. To preserve `$A{key}` behavior for repeated flags, `ArgsVar` calls
`getAll(key)` and joins with `","` itself. This keeps the new API clean while
preventing a silent semantic change for SVL users.
- **Hard break on the package rename.** No deprecated shim classes left in
`org.apache.juneau.svl.*`; callers update their imports. Acceptable because 9.5
is the designated "simple breaking changes" release.
-- Marshall-side `collections.Args` and `utils.ManifestFile` are **deleted** in
9.5 — callers move to `org.apache.juneau.commons.runtime.Args` /
`ManifestFile`. (No deprecation cycle; 9.5 allows the break.)
-- SVL engine (`VarResolver` / `VarResolverSession`) retargets the commons
bean-store stack **after** TODO-15 renames the `*2` classes to their final
names. TODO-14 never references `BasicBeanStore2` / `BeanInstantiator` directly.
+- **Marshall-side `collections.Args` and `utils.ManifestFile` are deleted** in
9.5 — callers move to `org.apache.juneau.commons.runtime.Args` /
`ManifestFile`. (No deprecation cycle; 9.5 allows the break.)
+- **`Microservice` retypes its public API in 9.5.**
`Microservice.Builder.args(...)`, `Microservice.getArgs()`,
`Microservice.getManifest()`, `Microservice.executeCommand(...)`, and the
`console/*Command` classes all switch to the new `commons.runtime` types. This
is a public API break, called out prominently in the 9.5 release notes — see
Phase 6.
+- **`ResolvingJsonMap` moves to `org.apache.juneau.collections`** (sits next
to `JsonMap`). The `org.apache.juneau.svl` package is fully removed from
`juneau-marshall`.
+- **`ArgsVar` / `ManifestFileVar` gain Supplier-based wiring.** The static
`init(Args)` / `init(ManifestFile)` methods stay (non-breaking; their argument
type changes to the new `commons.runtime` types). A new `Supplier<Args>` /
`Supplier<ManifestFile>` overload lets callers wire per-resolver state without
globally mutating an `AtomicReference`. Deprecation of the static path is
**not** in scope for 9.5.
+- SVL engine (`VarResolver` / `VarResolverSession`) already imports
`org.apache.juneau.commons.inject.*` — no further bean-store retargeting
required.
---
@@ -29,42 +33,52 @@ Relocate `org.apache.juneau.svl` (Simple Variable Language)
from `juneau-marshal
Create lean, `Optional`-returning replacements in `juneau-commons`.
- [ ] Create `org.apache.juneau.commons.runtime` package (add
`package-info.java`).
-- [ ] `Args` with surface:
+
+- [ ] **`Args` surface:**
- `Args.create()` — builder entry point (see `Args.Builder` below).
- - `Args(String line)`, `Args(String[] argv)` — constructors using
**default** grammar.
- - `Optional<String> get(String key)` — returns first value if repeated;
empty if unset or valueless.
+ - `Args(String line)`, `Args(String[] argv)` — constructors using
**default** grammar (delegating to `create().build(...)`); preserve legacy
parsing exactly so the existing `Microservice` and `ArgsVar` consumers don't
change behavior.
+ - `Optional<String> get(String key)` — first value if repeated; empty if
unset or valueless.
- `Optional<String> get(int index)` — **0-based** positional access.
- `List<String> getAll(String key)` — all values for a repeated flag (empty
list if absent).
- - `int size()`, `boolean isEmpty()`, `boolean has(String key)`.
- - `Map<String,List<String>> asMap()` — unmodifiable.
-- [ ] `Args.Builder` for configurable parsing — the grammar hooks that need to
be switchable:
+ - `List<String> positional()` — all positional args in order.
+ - `int argCount()` — number of positional args.
+ - `int optionCount()` — number of distinct named keys.
+ - `boolean isEmpty()` — `argCount() == 0 && optionCount() == 0` (covers both
axes; convenience for the common "any args at all?" check).
+ - `boolean has(String key)`, `boolean has(int index)`.
+ - `Map<String,List<String>> asMap()` — **named keys only**, unmodifiable.
Positional args are exposed via `positional()` to avoid the legacy "numeric
strings as keys" foot-gun.
+ - **No `size()`** — was always ambiguous on the merged map; force callers to
choose `argCount()` or `optionCount()`.
+
+- [ ] **`Args.Builder` — grammar hooks (full version):**
- `allowEquals(boolean)` — recognize `--key=value` / `-Dkey=value` (default
**true**).
- - `allowShortFlags(boolean)` — recognize `-k value` style (default **true**).
+ - `allowShortFlags(boolean)` — recognize `-k value` style (default **true**,
matches legacy).
- `allowLongFlags(boolean)` — recognize `--key value` style (default
**true**).
- `allowSystemPropStyle(boolean)` — recognize `-Dkey=value` (default
**true**).
- - `caseSensitive(boolean)` — key lookups (default **true**).
- - `customPrefix(String... prefixes)` — override the default flag prefixes if
callers need something unusual.
+ - `caseSensitive(boolean)` — key lookups (default **true**, matches legacy).
+ - `customPrefix(String... prefixes)` — override default flag prefixes
(default `{"-", "--"}`); empty array means "no flags, everything is positional."
- Final `build(String line)` / `build(String[] argv)`.
-- [ ] `ManifestFile` with surface:
- - `ManifestFile(Class<?> anchor)`, `ManifestFile(InputStream in)`,
`ManifestFile(Manifest manifest)`.
+ - **Legacy compatibility note:** the no-arg `new Args(...)` constructors
must keep parsing identical to the legacy class. Verify by porting every
`Args_Test.java` case (currently in
`juneau-utest/src/test/java/org/apache/juneau/commons/collections/Args_Test.java`)
into the new package and adapting only the API shape, not the inputs.
+
+- [ ] **`ManifestFile` surface:**
+ - `ManifestFile(Class<?> anchor)`, `ManifestFile(InputStream in)`,
`ManifestFile(Manifest manifest)`, `ManifestFile(File f)`, `ManifestFile(Path
p)`, `ManifestFile(Reader r)` — same constructor menu as today's
`org.apache.juneau.utils.ManifestFile`, just type-changed return.
- `Optional<String> get(String key)` — main attributes.
- `Optional<String> get(String section, String key)` — named sections (new
capability vs. old class).
- `Set<String> sections()` — unmodifiable.
- `Map<String,String> asMap()` — main attributes only, unmodifiable.
- `Map<String,String> asMap(String section)` — unmodifiable.
-- [ ] Unit tests for each, at minimum covering every parsing path exercised by
existing `ArgsVar` / `ManifestFileVar` tests, plus the new `get(section, key)`
and builder options.
-## Phase 2 — Confirm TODO-15 has landed
+- [ ] Unit tests for each, at minimum covering every parsing path exercised by
existing `Args_Test` / `ManifestFile_Test` / `ArgsVar` / `ManifestFileVar`
tests, plus the new `get(section, key)` and builder options.
+
+## Phase 2 — TODO-15 verification (no longer a real block)
-**TODO-14 does not start Phases 3+ until TODO-15 is complete.**
+The original plan made TODO-14 wait for TODO-15. This is now a **one-line
check**:
-- [ ] Verify `org.apache.juneau.commons.inject.BasicBeanStore` / `BeanCreator`
exist with their final names (no `2` suffix).
-- [ ] Verify the legacy `org.apache.juneau.cp.BasicBeanStore` / `BeanCreator`
/ `BeanBuilder` are deleted, or that SVL can safely ignore them.
-- [ ] Any SVL-specific gap in the commons bean-store surface discovered here
gets filed back into TODO-15 rather than patched in this plan.
+- [ ] Confirm `org.apache.juneau.commons.inject.{BasicBeanStore,
BeanInstantiator, BeanStore, WritableBeanStore, Bean}` exist at their final
names. **Already true** (see `FINISHED-15-replace-basicbeanstore-with-v2.md`).
+- [ ] `VarResolver` already imports `org.apache.juneau.commons.inject.*` — no
retargeting needed in Phase 4.
+- [ ] Remaining TODO-15 work (cleanup of `cp.ContextBeanCreator` deprecation
marker, `BeanCreator` references in `BeanFilter` / `Assertion` / `RestClient`)
is **independent** of TODO-14 and not in this plan's path.
## Phase 3 — Tier A: move pure SVL classes
-These files depend only on commons/JDK after Phase 1/2 — package rename only.
+These files depend only on commons/JDK after Phase 1 — package rename only.
- [ ] Move and rename to `org.apache.juneau.commons.svl`:
- `Var`, `SimpleVar`, `StreamedVar`, `DefaultingVar`, `MapVar`,
`MultipartVar`, `MultipartResolvingVar`
@@ -73,23 +87,37 @@ These files depend only on commons/JDK after Phase 1/2 —
package rename only.
- `SystemPropertiesVar`, `EnvVariablesVar`, `SwitchVar`, `IfVar`,
`CoalesceVar`
- `PatternMatchVar`, `PatternReplaceVar`, `PatternExtractVar`
- `UpperCaseVar`, `LowerCaseVar`, `NotEmptyVar`, `LenVar`, `SubstringVar`
+- [ ] Move package-info files (`svl/package-info.java`,
`svl/vars/package-info.java`).
## Phase 4 — Tier B: move the engine
- [ ] Move `VarResolver` / `VarResolverSession` to
`org.apache.juneau.commons.svl`.
-- [ ] Switch bean-store/creator references to
`org.apache.juneau.commons.inject.BasicBeanStore` / `BeanCreator` (final names,
post-TODO-15).
-- [ ] Update `VarResolver.DEFAULT` to register the moved default vars.
+- [ ] No bean-store retargeting needed — `VarResolver` already uses
`org.apache.juneau.commons.inject.*`.
+- [ ] Update `VarResolver.DEFAULT` to register the moved default vars.
**Preserve singleton identity** (same instance across resolves) — the current
`private static final VarResolver DEFAULT = ...` pattern is wire-compatible
after the rename.
## Phase 5 — Tier C: retarget `ArgsVar` / `ManifestFileVar`
-- [ ] Update `ArgsVar` to use `org.apache.juneau.commons.runtime.Args`.
-- [ ] Update `ManifestFileVar` to use
`org.apache.juneau.commons.runtime.ManifestFile`.
-- [ ] Move both vars to `org.apache.juneau.commons.svl.vars`.
-
-## Phase 6 — Marshall-side fixes
-
-- [ ] `ResolvingJsonMap` stays in marshall; update its imports to the new
commons package.
-- [ ] **Delete** `org.apache.juneau.collections.Args` and
`org.apache.juneau.utils.ManifestFile` (hard break, 9.5 semantics). Callers
move to `org.apache.juneau.commons.runtime.Args` / `ManifestFile` as part of
Phase 7.
+- [ ] Move `ArgsVar` and `ManifestFileVar` to
`org.apache.juneau.commons.svl.vars`.
+- [ ] Switch each var's field type from `org.apache.juneau.collections.Args` /
`org.apache.juneau.utils.ManifestFile` to the new
`org.apache.juneau.commons.runtime.Args` / `ManifestFile`.
+- [ ] **`ArgsVar` resolve semantics** — to preserve the legacy `$A{key}`
behavior for repeated flags, the implementation must call `args.getAll(key)`
and join with `","` (since the new `args.get(key)` returns only the first
value).
+- [ ] **`init(...)` methods:** keep the method **name and arity**
(`init(Args)` / `init(ManifestFile)`); the **argument type changes** to the new
`commons.runtime` types — this is the source-incompatible part of the move.
Document in release notes.
+- [ ] **New Supplier overloads** (additive, non-breaking):
+ - `ArgsVar.create(Supplier<Args> supplier)` returning a `Var` instance with
per-instance state instead of the global `AtomicReference`.
+ - `ManifestFileVar.create(Supplier<ManifestFile> supplier)` similarly.
+ - Static `init(...)` paths remain functional; the supplier path is for
callers that want isolated state per resolver. Deprecation of the static path
stays out of scope for 9.5.
+
+## Phase 6 — Marshall-side fixes and `Microservice` migration
+
+- [ ] Move `ResolvingJsonMap` from `org.apache.juneau.svl` to
`org.apache.juneau.collections` (sits next to `JsonMap`). Update its imports to
the new `commons.svl` package for `VarResolverSession`.
+- [ ] Update `juneau-utest/.../svl/ResolvingJsonMapTest.java` to its new test
package alongside the move.
+- [ ] **Delete** `org.apache.juneau.collections.Args` and
`org.apache.juneau.utils.ManifestFile` (hard break, 9.5 semantics).
+- [ ] **Migrate `Microservice` and friends** (public API break — call out
loudly in release notes):
+ - `juneau-microservice-core/.../Microservice.java` — retype `args` field,
`manifest` field, `Builder.args(Args)`, `getArgs()`, `getManifest()`,
`executeCommand(Args, ...)`, plus the `value instanceof ManifestFile` branch in
the bean wiring.
+ - `juneau-microservice-core/.../console/{ConsoleCommand, ConfigCommand,
ExitCommand, RestartCommand, HelpCommand}.java` — update `execute(...)`
signatures and any `Args` / `ManifestFile` use.
+ - `juneau-microservice-core/.../resources/ConfigResource.java`.
+ - `juneau-microservice-jetty/.../JettyMicroservice.java`.
+ - `juneau-utest/.../microservice/Microservice_Builder_Test.java` — update
test setup.
+- [ ] **`RestContext` non-conflict note** —
`juneau-rest-server/.../RestContext.java` line ~1136 contains `new Args(...)`
referring to a `RestContext.Args` **inner class** (constructor-arg bundle),
**not** the marshall `Args`. Phase 7 find/replace must skip this; an explicit
grep for `org.apache.juneau.collections.Args` (not the bare class name) is the
safe filter.
## Phase 7 — Repo-wide rename
@@ -98,9 +126,11 @@ These files depend only on commons/JDK after Phase 1/2 —
package rename only.
- `org.apache.juneau.svl.vars` → `org.apache.juneau.commons.svl.vars`
- `org.apache.juneau.collections.Args` →
`org.apache.juneau.commons.runtime.Args`
- `org.apache.juneau.utils.ManifestFile` →
`org.apache.juneau.commons.runtime.ManifestFile`
-- [ ] Fix callers of the old `JsonMap`-based `Args` / `ManifestFile` API:
adapt to the new `Optional<String>`-returning surface. Expect ~small number of
callsites beyond the two SVL vars.
+ - `org.apache.juneau.svl.ResolvingJsonMap` →
`org.apache.juneau.collections.ResolvingJsonMap`
+- [ ] **Wildcard import audit:** files using `import
org.apache.juneau.collections.*;` or `import org.apache.juneau.utils.*;` may
have been resolving `Args` / `ManifestFile` implicitly through the wildcard.
After the legacy classes are deleted, these files compile-error unless an
explicit `import org.apache.juneau.commons.runtime.{Args,ManifestFile};` is
added. Sweep the wildcard-import set in `juneau-microservice` and
`juneau-rest-server` first; add explicit imports where needed.
+- [ ] Fix callers of the old `JsonMap`-based `Args` / `ManifestFile` API:
adapt to the new `Optional<String>`-returning surface. Affected real consumers
(verified via `new Args(`/`new ManifestFile(` grep): `Microservice`,
`Microservice_Builder_Test`, `ManifestFile_Test`, `Args_Test`, `ArgsVar`.
(`RestContext.Args` is the inner-class noted above — not affected.)
- [ ] Update test utility `juneau-utest/.../XVar.java` imports (otherwise
trivial).
-- [ ] Verify ~150+ touch points across `juneau-marshall`, `juneau-rest-*`,
`juneau-microservice-*`, `juneau-examples-*`, `juneau-utest`.
+- [ ] **Touch-point estimate:** ~150 files have `import
org.apache.juneau.svl…` (verified via `rg -l 'import org\.apache\.juneau\.svl'
-tjava`); the bulk are simple package renames. Plus the small number of `Args`
/ `ManifestFile` consumers above. Plus `juneau-microservice`, `juneau-rest-*`,
`juneau-marshall-*`, `juneau-utest`.
- [ ] Re-run `./scripts/test.py -f` to confirm clean build and green tests.
## Phase 8 — Documentation
@@ -108,8 +138,12 @@ These files depend only on commons/JDK after Phase 1/2 —
package rename only.
- [ ] Update `juneau-docs` (Simple Variable Language topic + any cross-links).
- [ ] Create/update `juneau-docs/pages/release-notes/9.5.0.md` with an entry
describing:
- SVL package move (`org.apache.juneau.svl.*` →
`org.apache.juneau.commons.svl.*`).
- - `Args` / `ManifestFile` relocation and `Optional`-returning API.
+ - `Args` / `ManifestFile` relocation and new `Optional`-returning API;
explicit note about `Args.get(String)` returning only first value (compared to
legacy `getArg(String)` which comma-joined multi-value flags) — and that
`ArgsVar` adapts internally so `$A{key}` behavior is unchanged.
- Removal of the legacy `JsonMap`-based `Args` / `ManifestFile`.
+ - **`Microservice` public API change** — `Microservice.Builder.args(...)`,
`getArgs()`, `getManifest()`, `executeCommand(...)`, and console-command entry
points all retype to `commons.runtime.Args` / `ManifestFile`.
+ - `ResolvingJsonMap` moves from `org.apache.juneau.svl` to
`org.apache.juneau.collections`.
+ - New `Args.Builder` grammar hooks (allowEquals / allowShortFlags /
allowLongFlags / allowSystemPropStyle / caseSensitive / customPrefix).
+ - New `ArgsVar.create(Supplier<Args>)` /
`ManifestFileVar.create(Supplier<ManifestFile>)` overloads for per-resolver
wiring.
- Migration notes for external consumers.
## Phase 9 — Update TODO-7
@@ -119,21 +153,23 @@ Once the SVL engine lives in `juneau-commons`, several
items in TODO-7 either re
- [ ] In `todo/TODO-7-decouple-rest-common-from-marshall.md`:
- [ ] Remove the `VarResolverSession` bullet from Phase 4 (now satisfied —
rest-common can depend on commons-hosted SVL directly).
- [ ] Drop the `VarResolverSession` row from the Phase 5 dependency-surface
table.
- - [ ] If `BeanCreator` in rest-common's `httppart.bean` now points at the
commons-hosted (or `*2`) bean creator, update the corresponding Phase 4 bullet
accordingly — otherwise leave for TODO-15.
+ - [ ] If `BeanCreator` in rest-common's `httppart.bean` now points at the
commons-hosted bean creator, update the corresponding Phase 4 bullet
accordingly — otherwise leave for TODO-15.
- [ ] Run `/todo cleanup 7` to prune any other items obsoleted by this work.
---
## Out of scope
-- Replacing `Args` / `ManifestFile` with an abstract "property source"
hierarchy — keep the migration mechanical.
-- Adding new vars (e.g. `EnvFile`, `DotenvVar`) — do in a follow-up.
+- Replacing `Args` / `ManifestFile` with an abstract "property source"
hierarchy — defer to a follow-up.
+- Adding new vars (e.g. `EnvFile`, `DotenvVar`) — defer to a follow-up.
- Any `BasicBeanStore` / `BeanCreator` consolidation — owned entirely by
TODO-15.
- Deprecation shims in the old `org.apache.juneau.svl.*` package — hard break
per 9.5 policy.
+- Deprecation of `ArgsVar.init(...)` / `ManifestFileVar.init(...)` static
state — Supplier overloads are added alongside, but the static path stays as-is
for 9.5.
## Risk notes
-- **Hard dependency on TODO-15.** If TODO-15 slips, TODO-14 slips too (or we
accept a temporary `*2` reference — but the plan currently assumes final names).
-- `ArgsVar` / `ManifestFileVar` have `static init(...)` methods that are
public API; preserve their signatures even when the underlying types change
package.
+- **`Microservice` is a public extension surface.** Any downstream
microservice subclass will recompile-fail in 9.5 until imports/types are
updated. Highlight loudly in release notes; consider an explicit code-snippet
diff in the migration section.
+- `ArgsVar` / `ManifestFileVar` `init(...)` argument type changes —
source-incompatible for any caller importing the old `Args` / `ManifestFile`.
New Supplier overloads soften this for callers willing to migrate.
- `VarResolver.DEFAULT` is a widely-referenced singleton — preserve identity
semantics (same instance across resolves).
-- External users importing `org.apache.juneau.svl.*` will see compile breaks;
highlight prominently in the 9.5 release notes.
+- External users importing `org.apache.juneau.svl.*` will see compile breaks;
~150 internal files alone need import fixes — external callers will see
proportionally similar churn.
+- `Args.get(String)` returning first-only (vs. legacy comma-join) is a
documented behavior change. `ArgsVar` is shielded; bespoke direct callers of
`args.getArg(String)` are not.
diff --git a/todo/TODO.md b/todo/TODO.md
index c19c17a061..972bf98132 100644
--- a/todo/TODO.md
+++ b/todo/TODO.md
@@ -30,10 +30,15 @@
- [TODO-18] Investigate possible useful features to add to juneau-rest-server.
+- [TODO-19] Deprecate the static `init(...)` / `AtomicReference` state on
`ArgsVar` and `ManifestFileVar` in favor of the per-resolver `Supplier<Args>` /
`Supplier<ManifestFile>` overloads added in TODO-14. Target a post-9.5 release.
Follow-up to TODO-14.
+
- [TODO-20] Rethink how debugging works in RestServlet. Can we come up with a
simpler system?
+- [TODO-22] Add additional SVL vars for common external configuration sources
(e.g. `EnvFileVar` / `DotenvVar` for `.env` files, possibly file-glob and
JSON-pointer vars). Should land after TODO-14 places SVL in `juneau-commons`.
- [TODO-23] New feature support in org.apache.juneau.commons.inject — roadmap
for a simplified inject API (not a Spring replacement). See
`todo/TODO-23-commons-inject-framework-roadmap.md`.
- [TODO-24] JSR-330 alignment (no `jakarta.inject-api` dependency) + selective
Spring-lite features for `commons.inject`. See
`todo/TODO-24-jsr330-and-spring-lite-support.md`.
+- [TODO-27] Design a unified property-source hierarchy for `juneau-commons`
that abstracts over `Args`, `ManifestFile`, environment variables, system
properties, `.env` files, and `Config`. Goal: one `PropertySource` interface
that vars and the bean store can compose, with stacking/precedence rules.
Follow-up to TODO-14 and overlaps with TODO-13.
+