[
https://issues.apache.org/jira/browse/CAMEL-23276?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Work on CAMEL-23276 started by Federico Mariani.
------------------------------------------------
> Allow JBang plugins to customize Run command before CamelContext is built
> -------------------------------------------------------------------------
>
> Key: CAMEL-23276
> URL: https://issues.apache.org/jira/browse/CAMEL-23276
> Project: Camel
> Issue Type: New Feature
> Components: camel-jbang
> Affects Versions: 4.18.1
> Reporter: Federico Mariani
> Assignee: Federico Mariani
> Priority: Minor
>
> Third-party JBang plugins that register beans via
> _ContextServicePlugin.load()_ may need to prepare the environment (system
> properties, config directories) based on the file arguments passed to camel
> run.
> Currently, the only way to do this is by subclassing Run (e.g., camel forage
> run), but since Camel 4.18.1, plugins can auto-discover dependencies via
> PluginExporter, making the subcommand unnecessary for most use cases.
> However, there is no plugin hook that runs after file arguments are parsed
> but before main.run() triggers camelContext.build() →
> ContextServicePlugin.load().
> This gap means plugins cannot:
> - Derive a config directory from file arguments (e.g., camel run test/* → set
> a config dir to test/)
> - Set system properties that influence bean factory configuration at load()
> time
> - React to the --dev flag before the CamelContext is built (related:
> CAMEL-23252)
> *Proposal:* Add a PluginRunCustomizer interface to the Plugin SPI, consulted
> by Run.doCall() after file arguments are resolved but before main.run():
> {code:java}
> public interface PluginRunCustomizer {
> /**
> * Called after the Run command has resolved file arguments and
> configured
> * dependencies, but before KameletMain.run() builds the CamelContext.
> *
> * @param main the KameletMain instance (for adding initial properties)
> * @param files the resolved file arguments passed to the run command
> */
> void beforeRun(KameletMain main, List<String> files);
> }
> {code}
> Plugins would expose this via _Plugin.getRunCustomizer()_ (similar to
> Plugin.getExporter()). The Run command would call all active plugin
> customizers after dependency resolution:
> {code:java}
> // In Run.doCall(), after addDependencies() and before runKameletMain():
> if (!skipPlugins) {
> for (PluginRunCustomizer customizer : pluginRunCustomizers) {
> customizer.beforeRun(main, files);
> }
> }
> {code}
> This would allow Forage to move _ForageRun.resolveConfigDir()_ and
> _doAddInitialProperty()_ logic into the plugin customizer, making camel
> forage run unnecessary, camel run would work identically.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)