[
https://issues.apache.org/jira/browse/CAMEL-24486?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18108168#comment-18108168
]
Claus Ibsen commented on CAMEL-24486:
-------------------------------------
Fixed via https://github.com/apache/camel/pull/25729 (merge commit
d63f6ca9e802072a3d9b1e9dd70fd86fb819080e).
> camel-core - Simple language init block custom functions ($foo ~:= ...) fail
> with "No custom simple function" when CamelContext profile is dev
> ----------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-24486
> URL: https://issues.apache.org/jira/browse/CAMEL-24486
> Project: Camel
> Issue Type: Bug
> Components: camel-core
> Reporter: Claus Ibsen
> Assignee: Claus Ibsen
> Priority: Major
> Fix For: 4.22.1, 4.23.0
>
>
> The Simple language's init-block custom-function syntax ($init{ $foo ~:=
> <expr>; }init$ followed by a call like ${foo(...)}) fails at route-creation
> time with:
> org.apache.camel.language.simple.types.SimpleIllegalSyntaxException: No
> custom simple function with name: foo
> whenever the CamelContext's profile is "dev" (e.g. every `camel run` via
> camel-jbang defaults to `--profile=dev`). It works fine with the
> default/non-dev profile.
> h3. Root cause
> DefaultSimpleFunctionRegistry.getFunction(String) in
> core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultSimpleFunctionRegistry.java
> (around lines 102-116):
> {code:java}
> public Expression getFunction(String name) {
> // in dev mode then always lookup function as it may be updated due to a
> live reload
> boolean dev =
> "dev".equals(camelContext.getCamelContextExtension().getProfile());
> Expression exp = dev ? null : functions.get(name);
> if (exp == null) {
> SimpleFunction sf = lookupFunction(name);
> if (sf != null) {
> removeFunction(name);
> addFunction(sf);
> exp = functions.get(name);
> }
> }
> return exp;
> }
> {code}
> In dev profile, the method intentionally ignores its own functions cache (to
> support hot-reloading of SimpleFunction beans registered in the Camel
> registry) and only re-resolves via lookupFunction(), which searches
> camelContext.getRegistry().findByType(SimpleFunction.class). Custom functions
> defined via the Simple language's $foo ~:= <expr>; init-block
> chain-assignment syntax are stored directly as plain Expression objects in
> the functions map (via addFunction(String, Expression), see
> InitBlockExpression.java) - they are never registered as SimpleFunction
> beans. So in dev mode, the lookup for such functions always misses and
> throws, even though the function was just registered moments earlier in the
> same parse.
> h3. Reproduction
> A minimal YAML route (also reproducible with 'camel run foo.yaml' against a
> plain file):
> {code:yaml}
> - route:
> from:
> uri: timer:yaml
> parameters:
> period: "10000"
> steps:
> - setBody:
> simple: |-
> $init{
> $foo ~:= ${uppercase()};
> }init$
> ${foo('hello')}
> {code}
> Run with 'camel run foo.yaml' (dev profile is the default) -> fails. Running
> the exact same route with a non-dev profile works fine. Also reproduced
> directly in a JUnit/Spock test by setting
> context.getCamelContextExtension().setProfile("dev") before loading the route
> (no camel-jbang / CLI needed).
> h3. Suggested fix
> In DefaultSimpleFunctionRegistry.getFunction(), when in dev mode and
> lookupFunction() (bean-based) finds nothing, fall back to the existing
> functions.get(name) cache entry instead of returning null:
> {code:java}
> if (sf != null) {
> removeFunction(name);
> addFunction(sf);
> exp = functions.get(name);
> } else if (dev) {
> exp = functions.get(name);
> }
> {code}
> This preserves dev-mode hot-reload semantics for SimpleFunction-bean-based
> custom functions while not breaking init-block-defined (~:=) custom functions
> that aren't backed by a registry bean.
> Reported by a community member (Adam Tetz) via Zulip using Camel 4.22.0,
> JBang 0.141.0, Java 25 on macOS. Confirmed still present on main
> (4.23.0-SNAPSHOT).
--
This message was sent by Atlassian Jira
(v8.20.10#820010)