[
https://issues.apache.org/jira/browse/CAMEL-24873?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen reassigned CAMEL-24873:
-----------------------------------
Assignee: Claus Ibsen
> camel-jbang - Custom simple functions in Groovy: auto-add camel-groovy,
> honour @BindToRegistry, refresh YAML beans on --dev reload
> ----------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-24873
> URL: https://issues.apache.org/jira/browse/CAMEL-24873
> Project: Camel
> Issue Type: Improvement
> Components: camel-groovy, camel-jbang, camel-yaml-dsl
> Reporter: Claus Ibsen
> Assignee: Claus Ibsen
> Priority: Major
>
> The blog https://camel.apache.org/blog/2026/09/camel-simple-customfunction/
> shows a custom {{SimpleFunction}} written in Java and run with {{camel run
> route.camel.yaml MaskEmailFunction.java}}. For low-code users that are not
> Java developers the natural variants are the same class as a {{.groovy}}
> file, or an inline groovy bean in the YAML file, edited with {{camel run
> --dev}} for a fast feedback loop. Verified on 4.23.0-SNAPSHOT that none of
> these work end to end today:
> # {{camel run route.camel.yaml MaskEmailFunction.groovy}}: the groovy file is
> not compiled at all unless {{--dep=camel-groovy}} is given explicitly
> ({{camel.jbang.groovyFiles}} is set, but the {{DefaultGroovyScriptCompiler}}
> lives in camel-groovy which is not auto-detected from the file).
> # With {{--dep=camel-groovy}} the class compiles, but {{@BindToRegistry}} on
> the groovy class is ignored, so the function stays unknown ({{Unknown
> function: maskEmail}}). Binding it via a YAML {{beans:}} entry with {{type:
> MaskEmailFunction}} fails with {{ClassNotFoundException}} because bean
> pre-parsing runs before the groovy sources are compiled.
> # An inline groovy bean in the YAML file works ({{scriptLanguage: groovy}}
> with {{return [getName: { 'maskEmail' }, apply: { ex, in -> ... }] as
> SimpleFunction}}), but with {{--dev}} an edit of the script reloads the
> routes while the simple function keeps the old behaviour: the bean is not
> re-created on reload ({{BeansDeserializer.bindBean}} does unbind/rebind, and
> {{DefaultSimpleFunctionRegistry.getFunction}} re-looks-up the registry in the
> dev profile, so the intent is there but something in between does not
> refresh).
> Proposed:
> * auto-add camel-groovy when a {{.groovy}} file is passed to {{camel run}}
> (as is done for other file types)
> * honour {{@BindToRegistry}} on classes compiled by the groovy script compiler
> * make the inline groovy bean (and YAML beans in general) refresh on
> {{--dev}} reload so a custom simple function edit is picked up
> * add a sample for a custom simple function written in Groovy to the
> simple-advanced docs (the map coercion idiom is the one part a small local
> model cannot invent)
--
This message was sent by Atlassian Jira
(v8.20.10#820010)