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 d11383fe81bea68628dbb48c0ada3750ee6ffcb8 Author: James Bognar <[email protected]> AuthorDate: Fri May 8 10:16:37 2026 -0400 refactor(inject): TODO-15 phase-3 batch 2 — javadoc, deprecations, microservice survey, MCP migration Four small follow-on tasks bundled into one commit. Build + tests + jetty-ftest verified green at each step. (d) Javadoc-only refs updated to v2 — Name, Named, RestInit, RestInject now point at `org.apache.juneau.commons.inject.BeanStore` (with `WritableBeanStore` paired in the RestInject injectables table). The user-facing example field type in RestInject was flipped from `BasicBeanStore` to `BeanStore`. Removed the legacy `BasicBeanStore.Builder#overridingParent(...)` link in favor of impl-neutral prose. (f) Phase 0 deprecations — `@Deprecated(since = "9.5.0")` + `@deprecated` Javadoc added to the four legacy injection classes: * `cp.BasicBeanStore` → BeanStore / WritableBeanStore / BasicBeanStore2 * `cp.BeanCreator` → BeanInstantiator * `cp.BeanCreateMethodFinder` → BeanStore.createBeanFromMethod(...) * `cp.ContextBeanCreator` → BeanInstantiator (deferred until v2 grows context-builder hooks; still extended by HttpPart{Parser,Serializer}.Creator) `forRemoval = true` deliberately not set — final removal happens in Phase 4. `org.apache.juneau.BeanBuilder` is intentionally not deprecated (consumer-facing builder superclass; internals widened to v2 in the previous commit). (e) Microservice / config survey — `juneau-microservice-core`, `juneau-microservice-jetty`, and `juneau-config` confirmed clean. Zero references to `BasicBeanStore`, `BeanCreator`, `BeanCreateMethodFinder`, or `ContextBeanCreator` across all 52 source files. No phase-3 migration work needed in those modules. (b) rest-server-mcp migration to v2 BeanStore. Public handler interfaces (`McpToolHandler`, `McpPromptHandler`, `McpResourceHandler`, `McpTypedToolHandler`, `McpTypedPromptHandler`, `McpCursor`) and their associated dispatch surfaces (`Mcp.handle`, `McpDispatcher.dispatch` + 7 internal methods, `McpTypedHandlers` adapters) now take `BeanStore ctx` instead of `BasicBeanStore ctx`. The read-only interface was chosen over `WritableBeanStore` because handlers don't mutate the store. Servlet wrap-and-add patterns in `McpRestServlet` and `McpEndpoint` simplified from `BasicBeanStore.of((BasicBeanStore) restReq.getContext().getBeanStore())` to `new BasicBeanStore2(restReq.getContext().getBeanStore())` — both pre-existing `// TODO: Why do we need a cast?` comments are now obsolete and gone. Six unit-test files updated in lockstep; `BasicBeanStore.create().build()` test ctx instances replaced with `new BasicBeanStore2()`. Added a no-arg `BasicBeanStore2()` constructor (equivalent to `new BasicBeanStore2(null)`) for standalone parent-less stores. This is a breaking change for any external consumer implementing the MCP handler interfaces — `BasicBeanStore ctx` → `BeanStore ctx`. Acceptable under 9.5.0's semi-major release stance. TODO-15 plan updated: microservice survey, MCP migration, and Phase-0 deprecations all marked DONE with detailed records. Co-authored-by: Cursor <[email protected]> --- .../juneau/commons/inject/BasicBeanStore2.java | 11 +++++++++ .../java/org/apache/juneau/annotation/Name.java | 4 ++-- .../java/org/apache/juneau/annotation/Named.java | 6 ++--- .../java/org/apache/juneau/cp/BasicBeanStore.java | 15 ++++++++++++ .../apache/juneau/cp/BeanCreateMethodFinder.java | 8 +++++++ .../java/org/apache/juneau/cp/BeanCreator.java | 9 ++++++++ .../org/apache/juneau/cp/ContextBeanCreator.java | 7 ++++++ .../main/java/org/apache/juneau/rest/mcp/Mcp.java | 4 ++-- .../java/org/apache/juneau/rest/mcp/McpCursor.java | 8 +++---- .../org/apache/juneau/rest/mcp/McpDispatcher.java | 20 ++++++++-------- .../org/apache/juneau/rest/mcp/McpEndpoint.java | 9 ++++---- .../java/org/apache/juneau/rest/mcp/McpPage.java | 2 +- .../apache/juneau/rest/mcp/McpPromptHandler.java | 6 ++--- .../apache/juneau/rest/mcp/McpResourceHandler.java | 6 ++--- .../org/apache/juneau/rest/mcp/McpRestServlet.java | 4 ++-- .../org/apache/juneau/rest/mcp/McpToolHandler.java | 8 +++---- .../apache/juneau/rest/mcp/McpTypedHandlers.java | 5 ++-- .../juneau/rest/mcp/McpTypedPromptHandler.java | 4 ++-- .../juneau/rest/mcp/McpTypedToolHandler.java | 4 ++-- .../apache/juneau/rest/annotation/RestInit.java | 2 +- .../apache/juneau/rest/annotation/RestInject.java | 7 +++--- .../org/apache/juneau/rest/mcp/McpCursor_Test.java | 5 ++-- .../apache/juneau/rest/mcp/McpDispatcher_Test.java | 11 +++++---- .../juneau/rest/mcp/McpHandlerDefaults_Test.java | 9 ++++---- .../juneau/rest/mcp/McpRestServlet_Test.java | 6 ++--- .../juneau/rest/mcp/McpServerConfig_Test.java | 7 +++--- .../juneau/rest/mcp/McpTypedHandlers_Test.java | 27 +++++++++++----------- todo/TODO-15-replace-basicbeanstore-with-v2.md | 18 +++++++-------- 28 files changed, 145 insertions(+), 87 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 6dffc3d6d4..bf9e65edd1 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 @@ -78,6 +78,17 @@ public class BasicBeanStore2 implements WritableBeanStore { private final BeanStore parent; private final BeanStore overridingParent; + /** + * No-arg constructor. Equivalent to {@code new BasicBeanStore2(null)}. + * + * <p> + * Creates a standalone, parent-less bean store. All lookups consult only locally-registered beans and + * default suppliers. + */ + public BasicBeanStore2() { + this(null, null); + } + /** * Constructor. * diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Name.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Name.java index 615ba45575..24136e5ad9 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Name.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Name.java @@ -62,13 +62,13 @@ import java.lang.annotation.*; * * <jc>// @Named - for bean injection</jc> * <jk>public</jk> MyService(<ja>@Named</ja>(<js>"primaryDb"</js>) Database <jv>db</jv>) { - * <jc>// Injects the bean named "primaryDb" from BasicBeanStore</jc> + * <jc>// Injects the bean named "primaryDb" from the BeanStore</jc> * } * </p> * * <h5 class='section'>See Also:</h5><ul> * <li class='ja'>{@link Named} - * <li class='jc'>{@link org.apache.juneau.cp.BasicBeanStore} + * <li class='jc'>{@link org.apache.juneau.commons.inject.BeanStore} * </ul> */ @Documented diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Named.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Named.java index ea66a6b6fe..def1f6d446 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Named.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Named.java @@ -28,7 +28,7 @@ import java.lang.annotation.*; * <h5 class='section'>Example:</h5> * <p class='bjava'> * <jk>public</jk> MyClass(<ja>@Named</ja>(<js>"myBean"</js>) MyBean <jv>bean</jv>) { - * <jc>// Constructor will receive the bean named "myBean" from the BasicBeanStore</jc> + * <jc>// Constructor will receive the bean named "myBean" from the BeanStore</jc> * } * * <ja>@Inject</ja> @@ -49,7 +49,7 @@ import java.lang.annotation.*; * <p class='bjava'> * <jc>// @Named - for bean injection</jc> * <jk>public</jk> MyService(<ja>@Named</ja>(<js>"primaryDb"</js>) Database <jv>db</jv>) { - * <jc>// Injects the bean named "primaryDb" from BasicBeanStore</jc> + * <jc>// Injects the bean named "primaryDb" from the BeanStore</jc> * } * * <jc>// @Name - for parameter naming (when bytecode names unavailable)</jc> @@ -61,7 +61,7 @@ import java.lang.annotation.*; * * <h5 class='section'>See Also:</h5><ul> * <li class='ja'>{@link Name} - * <li class='jc'>{@link org.apache.juneau.cp.BasicBeanStore} + * <li class='jc'>{@link org.apache.juneau.commons.inject.BeanStore} * </ul> */ @Documented 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 48ee0990e1..1c4bca7f5f 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 @@ -97,7 +97,22 @@ import org.apache.juneau.commons.reflect.*; * <li class='note'>Bean stores can be made thread-safe using {@link Builder#threadSafe()}. * </ul> * + * @deprecated Since 9.5.0 — replaced by the v2 injection surface in + * {@link org.apache.juneau.commons.inject}: + * <ul> + * <li>{@link org.apache.juneau.commons.inject.BeanStore BeanStore} — read-only interface (most common consumer surface). + * <li>{@link org.apache.juneau.commons.inject.WritableBeanStore WritableBeanStore} — adds {@code addBean}, {@code addSupplier}, {@code addBeanType}, etc. + * <li>{@link org.apache.juneau.commons.inject.BasicBeanStore2 BasicBeanStore2} — concrete writable implementation (will be renamed to {@code BasicBeanStore} once this legacy class is removed in Phase 4). + * </ul> + * Bean instantiation moves from {@link BeanCreator#of(Class, BasicBeanStore)} to + * {@link org.apache.juneau.commons.inject.BeanInstantiator#of(Class, org.apache.juneau.commons.inject.BeanStore) BeanInstantiator.of(Class, BeanStore)}. + * Method-creator lookups ({@link BeanCreateMethodFinder}) move to + * {@link org.apache.juneau.commons.inject.BeanStore#createBeanFromMethod(Class, Object, String) BeanStore.createBeanFromMethod(...)}. + * <p> + * This class still {@code implements WritableBeanStore} as a transitional bridge so existing legacy callers compile unchanged + * during the migration. {@code forRemoval=true} is intentionally not set yet — final removal happens in Phase 4 of TODO-15. */ +@Deprecated(since = "9.5.0") @SuppressWarnings({ "java:S115" // Constants use UPPER_snakeCase convention }) diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java index e98ce3a2c7..76f05ed085 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java @@ -78,7 +78,15 @@ import org.apache.juneau.commons.reflect.*; * </ul> * * @param <T> The bean type being created. + * + * @deprecated Since 9.5.0 — replaced by + * {@link org.apache.juneau.commons.inject.BeanStore#createBeanFromMethod(Class, Object, String) BeanStore.createBeanFromMethod(beanType, resource, methodName)}. + * The v2 API returns an {@link java.util.Optional Optional} that callers chain with {@code .ifPresent(...)} / {@code .orElseGet(...)} — + * no separate {@code .find(...).thenFind(...).withDefault(...).run()} fluent chain is needed. See TODO-15 phase 3 for the bulk + * migration that already moved 49 internal call sites in {@code RestContext}/{@code RestOpContext} to the v2 surface. + * {@code forRemoval=true} is intentionally not set yet; final deletion happens in Phase 4 of TODO-15. */ +@Deprecated(since = "9.5.0") @SuppressWarnings({ "java:S115" // Constants use UPPER_snakeCase convention }) diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java index 0d17576262..53eb75647f 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java @@ -119,7 +119,16 @@ import org.apache.juneau.commons.reflect.*; * </ul> * * @param <T> The bean type being created. + * + * @deprecated Since 9.5.0 — replaced by + * {@link org.apache.juneau.commons.inject.BeanInstantiator BeanInstantiator}. + * Migrate {@code BeanCreator.of(Type.class, beanStore).type(impl).run()} to + * {@code BeanInstantiator.of(Type.class, beanStore).beanSubType(impl).run()}. + * The v2 instantiator accepts any {@link org.apache.juneau.commons.inject.BeanStore BeanStore} parent + * (legacy or v2) — no downcast required at call sites. + * {@code forRemoval=true} is intentionally not set yet; final deletion happens in Phase 4 of TODO-15. */ +@Deprecated(since = "9.5.0") public class BeanCreator<T> { static class Match<T extends ExecutableInfo> { diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/ContextBeanCreator.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/ContextBeanCreator.java index b88d26b429..ff3f02d2f0 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/ContextBeanCreator.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/ContextBeanCreator.java @@ -33,7 +33,14 @@ import org.apache.juneau.*; * * * @param <T> The bean type. + * + * @deprecated Since 9.5.0 — slated for removal in Phase 4 of TODO-15. The two known consumers + * ({@link org.apache.juneau.httppart.HttpPartParser.Creator HttpPartParser.Creator} and + * {@link org.apache.juneau.httppart.HttpPartSerializer.Creator HttpPartSerializer.Creator}) extend this class. + * They will migrate to {@link org.apache.juneau.commons.inject.BeanInstantiator BeanInstantiator} once the v2 surface + * grows the equivalent context-builder hooks. {@code forRemoval=true} is intentionally not set yet. */ +@Deprecated(since = "9.5.0") public class ContextBeanCreator<T> { /** diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/Mcp.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/Mcp.java index f5414f1f37..e2f258a32e 100644 --- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/Mcp.java +++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/Mcp.java @@ -17,7 +17,7 @@ package org.apache.juneau.rest.mcp; import org.apache.juneau.bean.mcp.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BeanStore; /** * Static façade over {@link McpDispatcher} for embedders that want a single-line dispatch call. @@ -52,7 +52,7 @@ public final class Mcp { * @param ctx Per-request bean store. * @return The response, or {@code null} for notification requests. */ - public static JsonRpcResponse handle(JsonRpcRequest req, McpServerConfig config, BasicBeanStore ctx) { + public static JsonRpcResponse handle(JsonRpcRequest req, McpServerConfig config, BeanStore ctx) { return DISPATCHER.dispatch(req, config, ctx); } } diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpCursor.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpCursor.java index bf56e19b12..c078e3b4df 100644 --- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpCursor.java +++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpCursor.java @@ -18,7 +18,7 @@ package org.apache.juneau.rest.mcp; import java.util.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BeanStore; /** * Pagination strategy for MCP {@code list} dispatchers (tools / prompts / resources). @@ -43,14 +43,14 @@ public interface McpCursor { * @param <T> Element type. * @return A non-{@code null} page. */ - <T> McpPage<T> page(List<T> all, String cursor, BasicBeanStore ctx); + <T> McpPage<T> page(List<T> all, String cursor, BeanStore ctx); /** * Returns everything in a single page; emits no {@code nextCursor}. */ McpCursor SINGLE_PAGE = new McpCursor() { @Override - public <T> McpPage<T> page(List<T> all, String cursor, BasicBeanStore ctx) { + public <T> McpPage<T> page(List<T> all, String cursor, BeanStore ctx) { return new McpPage<>(all == null ? List.of() : all, null); } }; @@ -69,7 +69,7 @@ public interface McpCursor { throw new IllegalArgumentException("pageSize must be positive: " + pageSize); return new McpCursor() { @Override - public <T> McpPage<T> page(List<T> all, String cursor, BasicBeanStore ctx) { + public <T> McpPage<T> page(List<T> all, String cursor, BeanStore ctx) { var src = all == null ? List.<T>of() : all; var offset = parseOffset(cursor); if (offset >= src.size()) diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpDispatcher.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpDispatcher.java index 6744da45db..5fb9816a99 100644 --- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpDispatcher.java +++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpDispatcher.java @@ -21,7 +21,7 @@ import java.util.stream.*; import org.apache.juneau.bean.mcp.*; import org.apache.juneau.collections.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BeanStore; /** * Transport-agnostic JSON-RPC dispatcher for the MCP wire protocol. @@ -30,7 +30,7 @@ import org.apache.juneau.cp.*; * The dispatcher contains <em>zero</em> HTTP plumbing; it accepts a parsed {@link JsonRpcRequest}, * routes by {@code method}, and returns a {@link JsonRpcResponse}. {@link McpRestServlet} is a thin * adapter that wraps this dispatcher in a Juneau REST {@code @RestPost} method, but embedders are - * free to call {@link #dispatch(JsonRpcRequest, McpServerConfig, BasicBeanStore)} directly from + * free to call {@link #dispatch(JsonRpcRequest, McpServerConfig, BeanStore)} directly from * tests or from a non-Juneau servlet. * * <p> @@ -67,7 +67,7 @@ public class McpDispatcher { * @param ctx Per-request bean store (passed through to handlers). Never {@code null}. * @return The response, or {@code null} for notification requests. */ - public JsonRpcResponse dispatch(JsonRpcRequest req, McpServerConfig config, BasicBeanStore ctx) { + public JsonRpcResponse dispatch(JsonRpcRequest req, McpServerConfig config, BeanStore ctx) { if (req == null) return errorResponse(null, CODE_INVALID_REQUEST, "Request envelope is null", null); @@ -94,7 +94,7 @@ public class McpDispatcher { return id == null; } - private Object invoke(String method, Object params, McpServerConfig config, BasicBeanStore ctx) { + private Object invoke(String method, Object params, McpServerConfig config, BeanStore ctx) { switch (method) { case McpMethods.INITIALIZE: return initialize(config); @@ -146,13 +146,13 @@ public class McpDispatcher { // tools // ------------------------------------------------------------------------------------------- - private static ListToolsResult listTools(McpServerConfig config, Object params, BasicBeanStore ctx) { + private static ListToolsResult listTools(McpServerConfig config, Object params, BeanStore ctx) { var descriptors = config.getTools().stream().map(McpToolHandler::descriptor).collect(Collectors.toList()); var page = config.getCursor().page(descriptors, cursorOf(params), ctx); return new ListToolsResult().setTools(page.items()).setNextCursor(page.nextCursor()); } - private static CallToolResult callTool(McpServerConfig config, Object params, BasicBeanStore ctx) { + private static CallToolResult callTool(McpServerConfig config, Object params, BeanStore ctx) { var p = asMap(params); var name = strParam(p, "name"); if (name == null) @@ -169,13 +169,13 @@ public class McpDispatcher { // prompts // ------------------------------------------------------------------------------------------- - private static ListPromptsResult listPrompts(McpServerConfig config, Object params, BasicBeanStore ctx) { + private static ListPromptsResult listPrompts(McpServerConfig config, Object params, BeanStore ctx) { var descriptors = config.getPrompts().stream().map(McpPromptHandler::descriptor).collect(Collectors.toList()); var page = config.getCursor().page(descriptors, cursorOf(params), ctx); return new ListPromptsResult().setPrompts(page.items()).setNextCursor(page.nextCursor()); } - private static GetPromptResult getPrompt(McpServerConfig config, Object params, BasicBeanStore ctx) { + private static GetPromptResult getPrompt(McpServerConfig config, Object params, BeanStore ctx) { var p = asMap(params); var name = strParam(p, "name"); if (name == null) @@ -192,13 +192,13 @@ public class McpDispatcher { // resources // ------------------------------------------------------------------------------------------- - private static ListResourcesResult listResources(McpServerConfig config, Object params, BasicBeanStore ctx) { + private static ListResourcesResult listResources(McpServerConfig config, Object params, BeanStore ctx) { var descriptors = config.getResources().stream().map(McpResourceHandler::descriptor).collect(Collectors.toList()); var page = config.getCursor().page(descriptors, cursorOf(params), ctx); return new ListResourcesResult().setResources(page.items()).setNextCursor(page.nextCursor()); } - private static ReadResourceResult readResource(McpServerConfig config, Object params, BasicBeanStore ctx) { + private static ReadResourceResult readResource(McpServerConfig config, Object params, BeanStore ctx) { var p = asMap(params); var uri = strParam(p, "uri"); if (uri == null) diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpEndpoint.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpEndpoint.java index c3e6767651..5cf9d153f5 100644 --- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpEndpoint.java +++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpEndpoint.java @@ -17,7 +17,8 @@ package org.apache.juneau.rest.mcp; import org.apache.juneau.bean.mcp.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BasicBeanStore2; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.http.annotation.Content; import org.apache.juneau.rest.*; import org.apache.juneau.rest.annotation.*; @@ -28,7 +29,7 @@ import org.apache.juneau.rest.annotation.*; * <p> * Implementing classes provide their {@link McpServerConfig} by implementing {@link #getMcpConfig()}; the * default {@link #handleMcpRequest(JsonRpcRequest, RestRequest)} method dispatches incoming requests through - * {@link Mcp#handle(JsonRpcRequest, McpServerConfig, BasicBeanStore)}. + * {@link Mcp#handle(JsonRpcRequest, McpServerConfig, BeanStore)}. * * <h5 class='section'>Example:</h5> * <pre> @@ -55,7 +56,7 @@ public interface McpEndpoint { * * <p> * Implementations may override this method to customize routing (path / annotations) but must still - * call {@link Mcp#handle(JsonRpcRequest, McpServerConfig, BasicBeanStore)} to dispatch. + * call {@link Mcp#handle(JsonRpcRequest, McpServerConfig, BeanStore)} to dispatch. * * @param req JSON-RPC request envelope. * @param restReq The current REST request. @@ -63,7 +64,7 @@ public interface McpEndpoint { */ @RestPost(path = "/mcp") default JsonRpcResponse handleMcpRequest(@Content JsonRpcRequest req, RestRequest restReq) { - var bs = BasicBeanStore.of((BasicBeanStore) restReq.getContext().getBeanStore()) // TODO - Why do we need a cast? + var bs = new BasicBeanStore2(restReq.getContext().getBeanStore()) .addBean(RestRequest.class, restReq); return Mcp.handle(req, getMcpConfig(), bs); } diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPage.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPage.java index adff62cd59..4138abbf87 100644 --- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPage.java +++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPage.java @@ -19,7 +19,7 @@ package org.apache.juneau.rest.mcp; import java.util.*; /** - * Slice of MCP descriptors returned by {@link McpCursor#page(List, String, org.apache.juneau.cp.BasicBeanStore)}. + * Slice of MCP descriptors returned by {@link McpCursor#page(List, String, org.apache.juneau.commons.inject.BeanStore)}. * * @param <T> Descriptor element type ({@code Tool}, {@code Prompt}, or {@code Resource}). * @param items Items to return on the current page. Never {@code null}. diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPromptHandler.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPromptHandler.java index cdd7af34b8..25f53cc92f 100644 --- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPromptHandler.java +++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPromptHandler.java @@ -19,14 +19,14 @@ package org.apache.juneau.rest.mcp; import java.util.*; import org.apache.juneau.bean.mcp.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BeanStore; /** * Handler for a single MCP prompt. * * <p> * Implementations declare a {@link #descriptor() descriptor} (the {@link Prompt} returned by {@code prompts/list}) - * and a {@link #get(Map, BasicBeanStore) get} body invoked when the matching {@code prompts/get} method runs. + * and a {@link #get(Map, BeanStore) get} body invoked when the matching {@code prompts/get} method runs. */ @FunctionalInterface public interface McpPromptHandler { @@ -51,5 +51,5 @@ public interface McpPromptHandler { * @param ctx Per-request bean store. Never {@code null}. * @return The rendered prompt. Never {@code null}. */ - GetPromptResult get(Map<String, Object> arguments, BasicBeanStore ctx); + GetPromptResult get(Map<String, Object> arguments, BeanStore ctx); } diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpResourceHandler.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpResourceHandler.java index eada0ebfd2..748c224207 100644 --- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpResourceHandler.java +++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpResourceHandler.java @@ -17,14 +17,14 @@ package org.apache.juneau.rest.mcp; import org.apache.juneau.bean.mcp.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BeanStore; /** * Handler for a single MCP resource. * * <p> * Implementations declare a {@link #descriptor() descriptor} (the {@link Resource} returned by {@code resources/list}) - * and a {@link #read(String, BasicBeanStore) read} body invoked when the matching {@code resources/read} method runs. + * and a {@link #read(String, BeanStore) read} body invoked when the matching {@code resources/read} method runs. */ @FunctionalInterface public interface McpResourceHandler { @@ -49,5 +49,5 @@ public interface McpResourceHandler { * @param ctx Per-request bean store. Never {@code null}. * @return The resource contents. Never {@code null}. */ - ReadResourceResult read(String uri, BasicBeanStore ctx); + ReadResourceResult read(String uri, BeanStore ctx); } diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpRestServlet.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpRestServlet.java index 5007a7a42e..ee0ff5415a 100644 --- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpRestServlet.java +++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpRestServlet.java @@ -17,7 +17,7 @@ package org.apache.juneau.rest.mcp; import org.apache.juneau.bean.mcp.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BasicBeanStore2; import org.apache.juneau.http.annotation.Content; import org.apache.juneau.rest.*; import org.apache.juneau.rest.annotation.*; @@ -96,7 +96,7 @@ public abstract class McpRestServlet extends BasicRestServlet { */ @RestPost(path = "/") public JsonRpcResponse handleMcp(@Content JsonRpcRequest req, RestRequest restReq) { - var bs = BasicBeanStore.of((BasicBeanStore) restReq.getContext().getBeanStore()) // TODO - Why do we need a cast? + var bs = new BasicBeanStore2(restReq.getContext().getBeanStore()) .addBean(RestRequest.class, restReq); return Mcp.handle(req, getMcpConfig(), bs); } diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpToolHandler.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpToolHandler.java index a569dfa264..92276d61e7 100644 --- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpToolHandler.java +++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpToolHandler.java @@ -19,17 +19,17 @@ package org.apache.juneau.rest.mcp; import java.util.*; import org.apache.juneau.bean.mcp.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BeanStore; /** * Handler for a single MCP tool. * * <p> * Implementations declare a {@link #descriptor() descriptor} (the {@link Tool} returned by {@code tools/list}) - * and a {@link #call(Map, BasicBeanStore) call} body invoked when the matching {@code tools/call} method runs. + * and a {@link #call(Map, BeanStore) call} body invoked when the matching {@code tools/call} method runs. * * <p> - * The {@link BasicBeanStore} argument is the per-request bean store, allowing handlers to look up additional + * The {@link BeanStore} argument is the per-request bean store, allowing handlers to look up additional * services (or the underlying {@code RestRequest}) without making this interface depend on REST runtime types. */ @FunctionalInterface @@ -55,5 +55,5 @@ public interface McpToolHandler { * @param ctx Per-request bean store. Never {@code null}. * @return The call result. Never {@code null}. */ - CallToolResult call(Map<String, Object> arguments, BasicBeanStore ctx); + CallToolResult call(Map<String, Object> arguments, BeanStore ctx); } diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedHandlers.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedHandlers.java index 18675f9944..9a1320418a 100644 --- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedHandlers.java +++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedHandlers.java @@ -19,6 +19,7 @@ package org.apache.juneau.rest.mcp; import java.util.*; import org.apache.juneau.bean.mcp.*; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.marshaller.*; /** @@ -55,7 +56,7 @@ public final class McpTypedHandlers { } @Override - public CallToolResult call(Map<String, Object> arguments, org.apache.juneau.cp.BasicBeanStore ctx) { + public CallToolResult call(Map<String, Object> arguments, BeanStore ctx) { A bound = bindArguments(arguments, typed.argumentType()); R result = typed.call(bound, ctx); return wrapToolResult(result); @@ -82,7 +83,7 @@ public final class McpTypedHandlers { } @Override - public GetPromptResult get(Map<String, Object> arguments, org.apache.juneau.cp.BasicBeanStore ctx) { + public GetPromptResult get(Map<String, Object> arguments, BeanStore ctx) { A bound = bindArguments(arguments, typed.argumentType()); return typed.get(bound, ctx); } diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedPromptHandler.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedPromptHandler.java index 45a568b274..b800038ffc 100644 --- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedPromptHandler.java +++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedPromptHandler.java @@ -17,7 +17,7 @@ package org.apache.juneau.rest.mcp; import org.apache.juneau.bean.mcp.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BeanStore; /** * Typed variant of {@link McpPromptHandler} where MCP {@code prompts/get} arguments bind into a Juneau bean. @@ -47,5 +47,5 @@ public interface McpTypedPromptHandler<A> { * @param ctx Per-request bean store. * @return The rendered prompt. */ - GetPromptResult get(A arguments, BasicBeanStore ctx); + GetPromptResult get(A arguments, BeanStore ctx); } diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedToolHandler.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedToolHandler.java index 1c14f7adcd..33c0a7b553 100644 --- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedToolHandler.java +++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedToolHandler.java @@ -17,7 +17,7 @@ package org.apache.juneau.rest.mcp; import org.apache.juneau.bean.mcp.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BeanStore; /** * Typed variant of {@link McpToolHandler} where MCP {@code tools/call} arguments bind into a Juneau bean. @@ -58,5 +58,5 @@ public interface McpTypedToolHandler<A, R> { * @param ctx Per-request bean store. * @return The call result. */ - R call(A arguments, BasicBeanStore ctx); + R call(A arguments, BeanStore ctx); } diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInit.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInit.java index edd1618ea7..56dbeea668 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInit.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInit.java @@ -36,7 +36,7 @@ import jakarta.servlet.*; * * <p> * Method parameters are resolved from the - * {@link org.apache.juneau.cp.BasicBeanStore bean store} the same way as any other Juneau-injected + * {@link org.apache.juneau.commons.inject.BeanStore bean store} the same way as any other Juneau-injected * method. {@link jakarta.servlet.ServletConfig}, {@link jakarta.servlet.ServletContext}, the resource instance * itself, and any bean registered via {@link org.apache.juneau.rest.annotation.RestInject @RestInject} or the * configured bean-store hooks are all resolvable. Zero-argument variants are also supported. diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInject.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInject.java index 485ef91f1c..96b1228de4 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInject.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInject.java @@ -126,7 +126,7 @@ import org.apache.juneau.svl.*; * <p class='bcode'> * <jc>// Fields that get set during initialization based on beans found in the bean store.</jc> * <ja>@RestInject</ja> CallLogger <jf>callLogger</jf>; - * <ja>@RestInject</ja> BasicBeanStore <jf>beanStore</jf>; <jc>// Note that BasicBeanStore itself can be accessed this way.</jc> + * <ja>@RestInject</ja> BeanStore <jf>beanStore</jf>; <jc>// Note that the BeanStore itself can be accessed this way.</jc> * </p> * * <h5 class='section'>Notes:</h5><ul> @@ -147,7 +147,8 @@ import org.apache.juneau.svl.*; * </p> * <ol> * <li><b>Overriding-parent bean store</b> — Spring beans (in <c>juneau-rest-server-springboot</c> deployments, - * via <c>SpringBeanStore</c>), or any bean reachable through {@link org.apache.juneau.cp.BasicBeanStore.Builder#overridingParent(org.apache.juneau.cp.BasicBeanStore) overridingParent(...)}.</li> + * via <c>SpringBeanStore</c>), or any bean reachable through the configured overriding-parent + * bean-store chain.</li> * <li><b>{@code @RestInject} method/field on the resource class</b> — registered as a regular bean-store * entry, beating the framework default.</li> * <li><b>Memoizer-backed framework default</b> — built into {@link RestContext} as a default supplier.</li> @@ -169,7 +170,7 @@ import org.apache.juneau.svl.*; * <table class='w800 styled'> * <tr><th>Bean class</td><th>Bean qualifying names</th><th>Scope</th></tr> * <tr><td>{@link BeanContext}<br>{@link org.apache.juneau.BeanContext.Builder}</td><td></td><td>class<br>method</td></tr> - * <tr><td>{@link BasicBeanStore}<br>{@link org.apache.juneau.cp.BasicBeanStore.Builder}</td><td></td><td>class</td></tr> + * <tr><td>{@link org.apache.juneau.commons.inject.BeanStore BeanStore}<br>{@link org.apache.juneau.commons.inject.WritableBeanStore WritableBeanStore}</td><td></td><td>class</td></tr> * <tr><td>{@link CallLogger}</td><td></td><td>class</td></tr> * <tr><td>{@link Config}</td><td></td><td>class</td></tr> * <tr><td>{@link DebugEnablement}</td><td></td><td>class</td></tr> diff --git a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpCursor_Test.java b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpCursor_Test.java index bc710919cc..beb0194bcf 100644 --- a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpCursor_Test.java +++ b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpCursor_Test.java @@ -21,7 +21,8 @@ import static org.junit.jupiter.api.Assertions.*; import java.util.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BasicBeanStore2; +import org.apache.juneau.commons.inject.BeanStore; import org.junit.jupiter.api.*; /** @@ -29,7 +30,7 @@ import org.junit.jupiter.api.*; */ class McpCursor_Test { - private static final BasicBeanStore CTX = BasicBeanStore.create().build(); + private static final BeanStore CTX = new BasicBeanStore2(); @Test void singlePage_returnsAll_withNullCursor() { diff --git a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpDispatcher_Test.java b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpDispatcher_Test.java index 99f6e3b21b..e4be792745 100644 --- a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpDispatcher_Test.java +++ b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpDispatcher_Test.java @@ -23,7 +23,8 @@ import java.util.*; import org.apache.juneau.bean.mcp.*; import org.apache.juneau.collections.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BasicBeanStore2; +import org.apache.juneau.commons.inject.BeanStore; import org.junit.jupiter.api.*; /** @@ -32,7 +33,7 @@ import org.junit.jupiter.api.*; class McpDispatcher_Test { private final McpDispatcher dispatcher = new McpDispatcher(); - private final BasicBeanStore ctx = BasicBeanStore.create().build(); + private final BeanStore ctx = new BasicBeanStore2(); private static McpToolHandler tool(String name, java.util.function.Function<Map<String, Object>, CallToolResult> fn) { return new McpToolHandler() { @@ -42,7 +43,7 @@ class McpDispatcher_Test { } @Override - public CallToolResult call(Map<String, Object> arguments, BasicBeanStore ctx) { + public CallToolResult call(Map<String, Object> arguments, BeanStore ctx) { return fn.apply(arguments); } }; @@ -56,7 +57,7 @@ class McpDispatcher_Test { } @Override - public GetPromptResult get(Map<String, Object> arguments, BasicBeanStore ctx) { + public GetPromptResult get(Map<String, Object> arguments, BeanStore ctx) { return fn.apply(arguments); } }; @@ -70,7 +71,7 @@ class McpDispatcher_Test { } @Override - public ReadResourceResult read(String u, BasicBeanStore ctx) { + public ReadResourceResult read(String u, BeanStore ctx) { return fn.apply(u); } }; diff --git a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpHandlerDefaults_Test.java b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpHandlerDefaults_Test.java index 0d78e6583b..928dcb5fc6 100644 --- a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpHandlerDefaults_Test.java +++ b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpHandlerDefaults_Test.java @@ -20,7 +20,8 @@ import static org.apache.juneau.junit.bct.BctAssertions.*; import static org.junit.jupiter.api.Assertions.*; import org.apache.juneau.bean.mcp.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BasicBeanStore2; +import org.apache.juneau.commons.inject.BeanStore; import org.junit.jupiter.api.*; /** @@ -91,12 +92,12 @@ class McpHandlerDefaults_Test { @Test void cursor_passes_ctx_to_strategy() { - // Verify ctx parameter reaches the cursor (covers the BasicBeanStore parameter passthrough). - var bs = BasicBeanStore.create().build(); + // Verify ctx parameter reaches the cursor (covers the BeanStore parameter passthrough). + var bs = new BasicBeanStore2(); var got = new Object[1]; McpCursor c = new McpCursor() { @Override - public <T> McpPage<T> page(java.util.List<T> all, String cursor, BasicBeanStore ctx) { + public <T> McpPage<T> page(java.util.List<T> all, String cursor, BeanStore ctx) { got[0] = ctx; return new McpPage<>(all, null); } diff --git a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpRestServlet_Test.java b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpRestServlet_Test.java index 025b5702dd..92daf00264 100644 --- a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpRestServlet_Test.java +++ b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpRestServlet_Test.java @@ -23,7 +23,7 @@ import java.util.*; import org.apache.juneau.*; import org.apache.juneau.bean.mcp.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BeanStore; import org.apache.juneau.json.*; import org.apache.juneau.rest.annotation.*; import org.apache.juneau.rest.mock.*; @@ -54,7 +54,7 @@ class McpRestServlet_Test extends TestBase { } @Override - public CallToolResult call(Map<String, Object> arguments, BasicBeanStore ctx) { + public CallToolResult call(Map<String, Object> arguments, BeanStore ctx) { var ctr = new CallToolResult(); ctr.setContent(List.of(new TextContent().setText(String.valueOf(arguments.get("text"))))); return ctr; @@ -121,7 +121,7 @@ class McpRestServlet_Test extends TestBase { public Tool descriptor() { return new Tool().setName("ping"); } @Override - public CallToolResult call(Map<String, Object> arguments, BasicBeanStore ctx) { + public CallToolResult call(Map<String, Object> arguments, BeanStore ctx) { return new CallToolResult().setContent(List.of(new TextContent().setText("pong"))); } }); diff --git a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpServerConfig_Test.java b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpServerConfig_Test.java index 8e6b44f596..c7ba096a80 100644 --- a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpServerConfig_Test.java +++ b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpServerConfig_Test.java @@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.*; import java.util.*; import org.apache.juneau.bean.mcp.*; +import org.apache.juneau.commons.inject.BeanStore; import org.junit.jupiter.api.*; /** @@ -37,7 +38,7 @@ class McpServerConfig_Test { } @Override - public CallToolResult call(Map<String, Object> arguments, org.apache.juneau.cp.BasicBeanStore ctx) { + public CallToolResult call(Map<String, Object> arguments, BeanStore ctx) { return new CallToolResult(); } }; @@ -51,7 +52,7 @@ class McpServerConfig_Test { } @Override - public GetPromptResult get(Map<String, Object> arguments, org.apache.juneau.cp.BasicBeanStore ctx) { + public GetPromptResult get(Map<String, Object> arguments, BeanStore ctx) { return new GetPromptResult(); } }; @@ -65,7 +66,7 @@ class McpServerConfig_Test { } @Override - public ReadResourceResult read(String u, org.apache.juneau.cp.BasicBeanStore ctx) { + public ReadResourceResult read(String u, BeanStore ctx) { return new ReadResourceResult(); } }; diff --git a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpTypedHandlers_Test.java b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpTypedHandlers_Test.java index 7f92dabe68..f11c9826bd 100644 --- a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpTypedHandlers_Test.java +++ b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpTypedHandlers_Test.java @@ -23,7 +23,8 @@ import java.util.*; import org.apache.juneau.bean.mcp.*; import org.apache.juneau.collections.*; -import org.apache.juneau.cp.*; +import org.apache.juneau.commons.inject.BasicBeanStore2; +import org.apache.juneau.commons.inject.BeanStore; import org.junit.jupiter.api.*; /** @@ -48,7 +49,7 @@ class McpTypedHandlers_Test { public EchoResult setText(String text) { this.text = text; return this; } } - private final BasicBeanStore ctx = BasicBeanStore.create().build(); + private final BeanStore ctx = new BasicBeanStore2(); private final McpDispatcher dispatcher = new McpDispatcher(); @Test @@ -65,7 +66,7 @@ class McpTypedHandlers_Test { } @Override - public EchoResult call(EchoArgs args, BasicBeanStore ctx) { + public EchoResult call(EchoArgs args, BeanStore ctx) { return new EchoResult().setText(args.getMessage() + ":" + args.getRepeat()); } }; @@ -98,7 +99,7 @@ class McpTypedHandlers_Test { } @Override - public CallToolResult call(EchoArgs args, BasicBeanStore ctx) { + public CallToolResult call(EchoArgs args, BeanStore ctx) { return ctr; } }; @@ -120,7 +121,7 @@ class McpTypedHandlers_Test { @Override public Class<EchoArgs> argumentType() { return EchoArgs.class; } @Override - public String call(EchoArgs args, BasicBeanStore ctx) { return "hello"; } + public String call(EchoArgs args, BeanStore ctx) { return "hello"; } }; var config = new McpServerConfig().addTool(McpTypedHandlers.adaptTool(typed)); var resp = dispatcher.dispatch(new JsonRpcRequest() @@ -138,7 +139,7 @@ class McpTypedHandlers_Test { @Override public Class<EchoArgs> argumentType() { return EchoArgs.class; } @Override - public EchoResult call(EchoArgs args, BasicBeanStore ctx) { return null; } + public EchoResult call(EchoArgs args, BeanStore ctx) { return null; } }; var config = new McpServerConfig().addTool(McpTypedHandlers.adaptTool(typed)); var resp = dispatcher.dispatch(new JsonRpcRequest() @@ -156,7 +157,7 @@ class McpTypedHandlers_Test { @Override public Class<EchoArgs> argumentType() { return EchoArgs.class; } @Override - public String call(EchoArgs args, BasicBeanStore ctx) { + public String call(EchoArgs args, BeanStore ctx) { return args == null ? "null" : "not-null"; } }; @@ -176,7 +177,7 @@ class McpTypedHandlers_Test { @Override public Class<EchoArgs> argumentType() { return EchoArgs.class; } @Override - public String call(EchoArgs args, BasicBeanStore ctx) { return "ok"; } + public String call(EchoArgs args, BeanStore ctx) { return "ok"; } }; var config = new McpServerConfig().addTool(McpTypedHandlers.adaptTool(typed)); // Bad: 'repeat' should be int, supply a non-numeric value to trigger parser failure. @@ -195,7 +196,7 @@ class McpTypedHandlers_Test { @Override public Class<EchoArgs> argumentType() { return EchoArgs.class; } @Override - public GetPromptResult get(EchoArgs args, BasicBeanStore ctx) { + public GetPromptResult get(EchoArgs args, BeanStore ctx) { return new GetPromptResult().setDescription(args == null ? "null" : "non-null"); } }; @@ -222,7 +223,7 @@ class McpTypedHandlers_Test { @Override public Class<EchoArgs> argumentType() { return EchoArgs.class; } @Override - public String call(EchoArgs args, BasicBeanStore ctx) { + public String call(EchoArgs args, BeanStore ctx) { return args == null ? "null" : "not-null"; } }; @@ -239,7 +240,7 @@ class McpTypedHandlers_Test { @Override public Class<EchoArgs> argumentType() { return EchoArgs.class; } @Override - public GetPromptResult get(EchoArgs args, BasicBeanStore ctx) { + public GetPromptResult get(EchoArgs args, BeanStore ctx) { return new GetPromptResult().setDescription(args == null ? "null" : "non-null"); } }; @@ -256,7 +257,7 @@ class McpTypedHandlers_Test { @Override public Class<EchoArgs> argumentType() { return EchoArgs.class; } @Override - public Unserializable call(EchoArgs args, BasicBeanStore ctx) { return new Unserializable(); } + public Unserializable call(EchoArgs args, BeanStore ctx) { return new Unserializable(); } }; var config = new McpServerConfig().addTool(McpTypedHandlers.adaptTool(typed)); var resp = dispatcher.dispatch(new JsonRpcRequest() @@ -273,7 +274,7 @@ class McpTypedHandlers_Test { @Override public Class<EchoArgs> argumentType() { return EchoArgs.class; } @Override - public GetPromptResult get(EchoArgs args, BasicBeanStore ctx) { + public GetPromptResult get(EchoArgs args, BeanStore ctx) { return new GetPromptResult().setDescription(args == null ? "null" : args.getMessage()); } }; diff --git a/todo/TODO-15-replace-basicbeanstore-with-v2.md b/todo/TODO-15-replace-basicbeanstore-with-v2.md index 0be96c545c..7242b21c70 100644 --- a/todo/TODO-15-replace-basicbeanstore-with-v2.md +++ b/todo/TODO-15-replace-basicbeanstore-with-v2.md @@ -60,13 +60,13 @@ Legacy `cp.BasicBeanStore` was made to `implements WritableBeanStore` as a trans Low-risk, independent of the rest of this plan. Can land in an earlier release than 9.5 if desired. -- [ ] Annotate with `@Deprecated` and Javadoc pointing at `org.apache.juneau.commons.inject`: - - `org.apache.juneau.cp.BasicBeanStore` - - `org.apache.juneau.cp.BeanCreator` - - `org.apache.juneau.cp.BeanBuilder` *(consumer class `org.apache.juneau.BeanBuilder` — re-evaluate)* - - `org.apache.juneau.cp.BeanCreateMethodFinder` - - `org.apache.juneau.cp.ContextBeanCreator` -- [ ] Do **not** use `forRemoval = true` yet — remaining internal consumers still wired to these. Deletion happens in Phase 4. +- [x] **DONE (2026-05-08).** Annotated with `@Deprecated(since = "9.5.0")` and `@deprecated` Javadoc pointing at `org.apache.juneau.commons.inject`: + - `org.apache.juneau.cp.BasicBeanStore` → `BeanStore` / `WritableBeanStore` / `BasicBeanStore2` + - `org.apache.juneau.cp.BeanCreator` → `BeanInstantiator` + - `org.apache.juneau.cp.BeanCreateMethodFinder` → `BeanStore.createBeanFromMethod(...)` + - `org.apache.juneau.cp.ContextBeanCreator` → migrate to `BeanInstantiator` once v2 grows context-builder hooks (still extended by `HttpPartParser.Creator` / `HttpPartSerializer.Creator`) +- [x] **`forRemoval = true` deliberately not set** — remaining internal consumers still wired to these. Deletion happens in Phase 4. +- ~~`org.apache.juneau.BeanBuilder` (consumer class)~~ — **NOT deprecated.** Lives outside `cp` package; it's the user-facing builder superclass. Internals widened to `WritableBeanStore` (v2 interface) on 2026-05-08, so it stays as a permanent public API. --- @@ -126,8 +126,8 @@ Net new v2 surface from this decision: none. The `Builder` class simply goes awa Remaining inventory work: - ~~Confirm the `BeanCreateMethodFinder` callers in `RestContext` (33) and `RestOpContext` (16) are all mechanical once the v2 finder API is settled.~~ — **DONE.** All 49 sites migrated. -- [ ] Check `McpPage.java` / `McpTypedHandlers.java` / `McpEndpoint.java` / `McpRestServlet.java` in `rest-server-mcp` — currently compile against legacy via `(BasicBeanStore)` casts that bridge from `WritableBeanStore`-typed callers. Migrate alongside the cascade or in a follow-up. -- [ ] Enumerate direct callers in `juneau-microservice-*` and `juneau-config` (not yet surveyed). +- [x] **DONE (2026-05-08).** `rest-server-mcp` migrated to v2 `BeanStore`. Public handler interfaces (`McpToolHandler`, `McpPromptHandler`, `McpResourceHandler`, `McpTypedToolHandler`, `McpTypedPromptHandler`, `McpCursor`) now take `BeanStore ctx` instead of `BasicBeanStore ctx` (chosen over `WritableBeanStore` because handlers don't mutate). `Mcp.handle(...)`, `McpDispatcher.dispatch(...)` and 7 internal dispatcher methods, plus internal `McpTypedHandlers.adaptTool`/`adaptPrompt` flippe [...] +- [x] **DONE (2026-05-08).** Enumerate direct callers in `juneau-microservice-*` and `juneau-config`. **Result: zero.** Neither `juneau-microservice-core` (28 source files), `juneau-microservice-jetty`, nor `juneau-core/juneau-config` (24 source files) reference `BasicBeanStore`, `BeanCreator`, `BeanCreateMethodFinder`, or `ContextBeanCreator`. Both modules are already free of legacy injection types — no Phase-3 migration work needed there. - [ ] List any public API surfaces in `juneau-marshall` that still expose `BasicBeanStore` / `BeanCreator` (these are the hard breaking changes). `Name.java` / `Named.java` Javadoc refs are trivial. - ~~**Cascade-builders inventory.**~~ — **DONE (2026-05-08).** 16 of the listed 25 factories flipped (those actually called from `RestContext` / `RestOpContext`): `RestConverterList`, `RestGuardList`, `RestMatcherList`, `RestOpArgList`, `ResponseProcessorList`, `RestOperations`, `RestChildren`, `MethodExecStore`, `ThrownStore`, `FileFinder`, `StaticFiles`, `BasicStaticFiles.create(...)`, `DebugEnablement`, `SwaggerProvider`, `EncoderSet`, `ParserSet`, `SerializerSet`. The remaining ~9 (` [...]
