This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch console in repository https://gitbox.apache.org/repos/asf/camel.git
commit 50434265db24d332c968bcbc668e89f7d8f01281 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Wed Dec 29 11:13:48 2021 +0100 CAMEL-17384: Developer Console SPI --- .../apache/camel/console/DevConsoleRegistry.java | 2 +- .../camel/impl/console/EventConsoleConfigurer.java | 55 ++++++++++++++++++++++ .../org.apache.camel.impl.console.EventConsole | 2 + .../impl/console/DefaultDevConsoleRegistry.java | 3 ++ .../apache/camel/impl/console/EventConsole.java | 25 ++++++++-- .../org/apache/camel/main/BaseMainSupport.java | 39 ++++++++++++++- 6 files changed, 121 insertions(+), 5 deletions(-) diff --git a/core/camel-api/src/main/java/org/apache/camel/console/DevConsoleRegistry.java b/core/camel-api/src/main/java/org/apache/camel/console/DevConsoleRegistry.java index 4a160b9..f3051f5 100644 --- a/core/camel-api/src/main/java/org/apache/camel/console/DevConsoleRegistry.java +++ b/core/camel-api/src/main/java/org/apache/camel/console/DevConsoleRegistry.java @@ -60,7 +60,7 @@ public interface DevConsoleRegistry extends CamelContextAware, StaticService, Id * * @return either {@link DevConsole}, or <tt>null</tt> if none found. */ - Object resolveById(String id); + DevConsole resolveById(String id); /** * Registers a {@link DevConsole}. diff --git a/core/camel-console/src/generated/java/org/apache/camel/impl/console/EventConsoleConfigurer.java b/core/camel-console/src/generated/java/org/apache/camel/impl/console/EventConsoleConfigurer.java new file mode 100644 index 0000000..4390bad --- /dev/null +++ b/core/camel-console/src/generated/java/org/apache/camel/impl/console/EventConsoleConfigurer.java @@ -0,0 +1,55 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.impl.console; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.impl.console.EventConsole; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class EventConsoleConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.impl.console.EventConsole target = (org.apache.camel.impl.console.EventConsole) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "camelcontext": + case "CamelContext": target.setCamelContext(property(camelContext, org.apache.camel.CamelContext.class, value)); return true; + case "capacity": + case "Capacity": target.setCapacity(property(camelContext, int.class, value)); return true; + default: return false; + } + } + + @Override + public Class<?> getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "camelcontext": + case "CamelContext": return org.apache.camel.CamelContext.class; + case "capacity": + case "Capacity": return int.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.impl.console.EventConsole target = (org.apache.camel.impl.console.EventConsole) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "camelcontext": + case "CamelContext": return target.getCamelContext(); + case "capacity": + case "Capacity": return target.getCapacity(); + default: return null; + } + } +} + diff --git a/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.impl.console.EventConsole b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.impl.console.EventConsole new file mode 100644 index 0000000..4d40f2f --- /dev/null +++ b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.impl.console.EventConsole @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.impl.console.EventConsoleConfigurer diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsoleRegistry.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsoleRegistry.java index 6071798..7089201 100644 --- a/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsoleRegistry.java +++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsoleRegistry.java @@ -120,6 +120,9 @@ public class DefaultDevConsoleRegistry extends ServiceSupport implements DevCons if (answer == null) { DevConsoleResolver resolver = camelContext.adapt(ExtendedCamelContext.class).getDevConsoleResolver(); answer = resolver.resolveDevConsole(id); + if (answer != null) { + register(answer); + } } return answer; diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/EventConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/EventConsole.java index bbd2393..68ab032 100644 --- a/core/camel-console/src/main/java/org/apache/camel/impl/console/EventConsole.java +++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/EventConsole.java @@ -21,29 +21,48 @@ import java.util.Map; import java.util.Queue; import org.apache.camel.spi.CamelEvent; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.annotations.DevConsole; import org.apache.camel.support.EventNotifierSupport; @DevConsole("event") +@Configurer(bootstrap = true) public class EventConsole extends AbstractDevConsole { private int capacity = 25; - private final Queue<CamelEvent> events = new ArrayDeque<>(capacity); - private final Queue<CamelEvent.ExchangeEvent> exchangeEvents = new ArrayDeque<>(capacity); + private Queue<CamelEvent> events; + private Queue<CamelEvent.ExchangeEvent> exchangeEvents; private final ConsoleEventNotifier listener = new ConsoleEventNotifier(); public EventConsole() { super("camel", "event"); } + public int getCapacity() { + return capacity; + } + + /** + * Shows last number of events. + */ + public void setCapacity(int capacity) { + this.capacity = capacity; + } + @Override protected void doInit() throws Exception { + this.events = new ArrayDeque<>(capacity); + this.exchangeEvents = new ArrayDeque<>(capacity); + } + + @Override + protected void doStart() throws Exception { getCamelContext().getManagementStrategy().addEventNotifier(listener); } @Override - protected void doShutdown() throws Exception { + protected void doStop() throws Exception { getCamelContext().getManagementStrategy().removeEventNotifier(listener); events.clear(); } diff --git a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java index e98ebd5..7568ccd 100644 --- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java +++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java @@ -41,6 +41,8 @@ import org.apache.camel.ExtendedCamelContext; import org.apache.camel.NoSuchLanguageException; import org.apache.camel.RuntimeCamelException; import org.apache.camel.StartupStep; +import org.apache.camel.console.DevConsole; +import org.apache.camel.console.DevConsoleRegistry; import org.apache.camel.health.HealthCheck; import org.apache.camel.health.HealthCheckConfiguration; import org.apache.camel.health.HealthCheckRegistry; @@ -721,6 +723,7 @@ public abstract class BaseMainSupport extends BaseService { Map<String, Object> lraProperties = new LinkedHashMap<>(); Map<String, Object> routeTemplateProperties = new LinkedHashMap<>(); Map<String, Object> beansProperties = new LinkedHashMap<>(); + Map<String, Object> devConsoleProperties = new LinkedHashMap<>(); Map<String, String> globalOptions = new LinkedHashMap<>(); for (String key : prop.stringPropertyNames()) { if (key.startsWith("camel.context.")) { @@ -777,6 +780,12 @@ public abstract class BaseMainSupport extends BaseService { String option = key.substring(20); validateOptionAndValue(key, option, value); routeTemplateProperties.put(optionKey(option), value); + } else if (key.startsWith("camel.dev-console.")) { + // grab the value + String value = prop.getProperty(key); + String option = key.substring(18); + validateOptionAndValue(key, option, value); + devConsoleProperties.put(optionKey(option), value); } else if (key.startsWith("camel.beans.")) { // grab the value String value = prop.getProperty(key); @@ -786,7 +795,7 @@ public abstract class BaseMainSupport extends BaseService { } else if (key.startsWith("camel.global-options.")) { // grab the value String value = prop.getProperty(key); - String option = key.substring(12); + String option = key.substring(21); validateOptionAndValue(key, option, value); globalOptions.put(optionKey(option), value); } @@ -837,6 +846,12 @@ public abstract class BaseMainSupport extends BaseService { setLraCheckProperties(camelContext, lraProperties, mainConfigurationProperties.isAutoConfigurationFailFast(), autoConfiguredProperties); } + if (!devConsoleProperties.isEmpty()) { + LOG.debug("Auto-configuring Dev Console from loaded properties: {}", devConsoleProperties.size()); + setDevConsoleProperties(camelContext, devConsoleProperties, + mainConfigurationProperties.isAutoConfigurationFailFast(), + autoConfiguredProperties); + } // configure which requires access to the model MainSupportModelConfigurer.configureModelCamelContext(camelContext, mainConfigurationProperties, @@ -1044,6 +1059,28 @@ public abstract class BaseMainSupport extends BaseService { } } + private void setDevConsoleProperties( + CamelContext camelContext, Map<String, Object> properties, + boolean failIfNotSet, Map<String, String> autoConfiguredProperties) + throws Exception { + + // make defensive copy as we mutate the map + Set<String> keys = new LinkedHashSet<>(properties.keySet()); + // set properties per console + for (String key : keys) { + String name = StringHelper.before(key, "."); + DevConsole console = camelContext.getExtension(DevConsoleRegistry.class).resolveById(name); + if (console == null) { + throw new IllegalArgumentException( + "Cannot resolve DevConsole with id: " + name); + } + // configure all the properties on the console at once (to ensure they are configured in right order) + Map<String, Object> config = PropertiesHelper.extractProperties(properties, name + "."); + setPropertiesOnTarget(camelContext, console, config, "camel.dev-console." + name + ".", failIfNotSet, true, + autoConfiguredProperties); + } + } + private void bindBeansToRegistry( CamelContext camelContext, Map<String, Object> properties, String optionPrefix, boolean failIfNotSet, boolean logSummary, boolean ignoreCase,