This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new c550a0097e9 CAMEL-20878: camel-jbang - get rest c550a0097e9 is described below commit c550a0097e974e514ac98747d525f36b2c3384a2 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sat Jun 15 16:22:10 2024 +0200 CAMEL-20878: camel-jbang - get rest --- .../apache/camel/catalog/dev-consoles.properties | 1 + .../apache/camel/catalog/dev-consoles/rest.json | 15 ++++++++ .../rest/openapi/RestOpenApiProcessor.java | 2 +- .../camel/component/rest/DefaultRestRegistry.java | 18 ++++++---- .../apache/camel/component/rest/RestEndpoint.java | 2 +- .../camel/component/webhook/MultiRestConsumer.java | 2 +- .../java/org/apache/camel/spi/RestRegistry.java | 35 +++++++++++-------- .../apache/camel/impl/console/RestDevConsole.java | 1 + .../api/management/mbean/CamelOpenMBeanTypes.java | 6 ++-- .../management/mbean/ManagedRestRegistry.java | 5 +-- .../ROOT/pages/camel-4x-upgrade-guide-4_7.adoc | 4 ++- .../camel/cli/connector/LocalCliConnector.java | 7 ++++ .../dsl/jbang/core/commands/CamelJBangMain.java | 1 + .../core/commands/process/ListPlatformHttp.java | 4 +-- .../{ListPlatformHttp.java => ListRest.java} | 40 ++++++++++++++-------- 15 files changed, 96 insertions(+), 47 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles.properties index ef2cac92511..68e2314bd3f 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles.properties +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles.properties @@ -25,6 +25,7 @@ protocol quartz reload resilience4j +rest route route-controller route-dump diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles/rest.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles/rest.json new file mode 100644 index 00000000000..552cda4ab75 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles/rest.json @@ -0,0 +1,15 @@ +{ + "console": { + "kind": "console", + "group": "camel", + "name": "rest", + "title": "Rest", + "description": "Rest DSL Registry information", + "deprecated": false, + "javaType": "org.apache.camel.impl.console.RestDevConsole", + "groupId": "org.apache.camel", + "artifactId": "camel-console", + "version": "4.7.0-SNAPSHOT" + } +} + diff --git a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java index 6d0735ed33f..eee89ee80d5 100644 --- a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java +++ b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java @@ -186,7 +186,7 @@ public class RestOpenApiProcessor extends DelegateAsyncProcessor implements Came if (consumer instanceof RouteAware ra) { routeId = ra.getRoute().getRouteId(); } - camelContext.getRestRegistry().addRestService(consumer, url, path, basePath, null, v, bc.getConsumes(), + camelContext.getRestRegistry().addRestService(consumer, true, url, path, basePath, null, v, bc.getConsumes(), bc.getProduces(), bc.getType(), bc.getOutType(), routeId, desc); RestBindingAdvice binding = RestBindingAdviceFactory.build(camelContext, bc); diff --git a/components/camel-rest/src/main/java/org/apache/camel/component/rest/DefaultRestRegistry.java b/components/camel-rest/src/main/java/org/apache/camel/component/rest/DefaultRestRegistry.java index 1109d180500..a8a1ab4fe02 100644 --- a/components/camel-rest/src/main/java/org/apache/camel/component/rest/DefaultRestRegistry.java +++ b/components/camel-rest/src/main/java/org/apache/camel/component/rest/DefaultRestRegistry.java @@ -48,10 +48,10 @@ public class DefaultRestRegistry extends ServiceSupport implements StaticService @Override public void addRestService( - Consumer consumer, String url, String baseUrl, String basePath, String uriTemplate, String method, + Consumer consumer, boolean contractFirst, String url, String baseUrl, String basePath, String uriTemplate, String method, String consumes, String produces, String inType, String outType, String routeId, String description) { RestServiceEntry entry = new RestServiceEntry( - consumer, url, baseUrl, basePath, uriTemplate, method, consumes, produces, inType, outType, description); + consumer, contractFirst, url, baseUrl, basePath, uriTemplate, method, consumes, produces, inType, outType, description); List<RestService> list = registry.computeIfAbsent(consumer, c -> new ArrayList<>()); list.add(entry); } @@ -167,6 +167,7 @@ public class DefaultRestRegistry extends ServiceSupport implements StaticService private static final class RestServiceEntry implements RestService { private final Consumer consumer; + private final boolean contractFirst; private final String url; private final String baseUrl; private final String basePath; @@ -178,11 +179,11 @@ public class DefaultRestRegistry extends ServiceSupport implements StaticService private final String outType; private final String description; - private RestServiceEntry(Consumer consumer, String url, String baseUrl, String basePath, String uriTemplate, - String method, - String consumes, String produces, String inType, String outType, - String description) { + private RestServiceEntry(Consumer consumer, boolean contractFirst, String url, String baseUrl, String basePath, + String uriTemplate, String method, String consumes, String produces, + String inType, String outType, String description) { this.consumer = consumer; + this.contractFirst = contractFirst; this.url = url; this.baseUrl = baseUrl; this.basePath = basePath; @@ -200,6 +201,11 @@ public class DefaultRestRegistry extends ServiceSupport implements StaticService return consumer; } + @Override + public boolean isContractFirst() { + return contractFirst; + } + @Override public String getUrl() { return url; diff --git a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java index 0ebc90bb388..7c8bf143ff4 100644 --- a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java +++ b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java @@ -594,7 +594,7 @@ public class RestEndpoint extends DefaultEndpoint { // add to rest registry, so we can keep track of them, we will remove from the registry when the consumer is removed // the rest registry will automatically keep track when the consumer is removed, // and un-register the REST service from the registry - getCamelContext().getRestRegistry().addRestService(consumer, url, baseUrl, getPath(), getUriTemplate(), getMethod(), + getCamelContext().getRestRegistry().addRestService(consumer, false, url, baseUrl, getPath(), getUriTemplate(), getMethod(), getConsumes(), getProduces(), getInType(), getOutType(), getRouteId(), getDescription()); return consumer; } else { diff --git a/components/camel-webhook/src/main/java/org/apache/camel/component/webhook/MultiRestConsumer.java b/components/camel-webhook/src/main/java/org/apache/camel/component/webhook/MultiRestConsumer.java index 038bbae702b..17d2e3c1c19 100644 --- a/components/camel-webhook/src/main/java/org/apache/camel/component/webhook/MultiRestConsumer.java +++ b/components/camel-webhook/src/main/java/org/apache/camel/component/webhook/MultiRestConsumer.java @@ -50,7 +50,7 @@ public class MultiRestConsumer extends DefaultConsumer { null, null, null, config, Collections.emptyMap()); configurer.configure(consumer); - context.getRestRegistry().addRestService(consumer, url, url, path, null, method, + context.getRestRegistry().addRestService(consumer, false, url, url, path, null, method, null, null, null, null, null, null); this.delegateConsumers.add(consumer); diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/RestRegistry.java b/core/camel-api/src/main/java/org/apache/camel/spi/RestRegistry.java index 0091871a223..902665e95fc 100644 --- a/core/camel-api/src/main/java/org/apache/camel/spi/RestRegistry.java +++ b/core/camel-api/src/main/java/org/apache/camel/spi/RestRegistry.java @@ -37,6 +37,11 @@ public interface RestRegistry extends StaticService { */ Consumer getConsumer(); + /** + * Is the rest service based on code-first or contract-first + */ + boolean isContractFirst(); + /** * Gets the state of the REST service (started, stopped, etc) */ @@ -101,23 +106,23 @@ public interface RestRegistry extends StaticService { /** * Adds a new REST service to the registry. * - * @param consumer the consumer - * @param url the absolute url of the REST service - * @param baseUrl the base url of the REST service - * @param basePath the base path - * @param uriTemplate the uri template - * @param method the HTTP method - * @param consumes optional details about what media-types the REST service accepts - * @param produces optional details about what media-types the REST service returns - * @param inType optional detail input binding to a FQN class name - * @param outType optional detail output binding to a FQN class name - * @param routeId the id of the route this rest service will be using - * @param description optional description about the service + * @param consumer the consumer + * @param contractFirst is the rest service based on code-first or contract-first + * @param url the absolute url of the REST service + * @param baseUrl the base url of the REST service + * @param basePath the base path + * @param uriTemplate the uri template + * @param method the HTTP method + * @param consumes optional details about what media-types the REST service accepts + * @param produces optional details about what media-types the REST service returns + * @param inType optional detail input binding to a FQN class name + * @param outType optional detail output binding to a FQN class name + * @param routeId the id of the route this rest service will be using + * @param description optional description about the service */ void addRestService( - Consumer consumer, String url, String baseUrl, String basePath, String uriTemplate, String method, String consumes, - String produces, - String inType, String outType, String routeId, String description); + Consumer consumer, boolean contractFirst, String url, String baseUrl, String basePath, String uriTemplate, String method, + String consumes, String produces, String inType, String outType, String routeId, String description); /** * Removes the REST service from the registry diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/RestDevConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/RestDevConsole.java index eb9ef663600..ec9c4636586 100644 --- a/core/camel-console/src/main/java/org/apache/camel/impl/console/RestDevConsole.java +++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/RestDevConsole.java @@ -77,6 +77,7 @@ public class RestDevConsole extends AbstractDevConsole { JsonObject jo = new JsonObject(); jo.put("url", rs.getUrl()); jo.put("method", rs.getMethod()); + jo.put("contractFirst", rs.isContractFirst()); jo.put("state", rs.getState()); if (rs.getConsumes() != null) { jo.put("consumes", rs.getConsumes()); diff --git a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java index abe3a9de8f6..6a9fde81336 100644 --- a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java +++ b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java @@ -60,13 +60,13 @@ public final class CamelOpenMBeanTypes { "rests", "Rest Services", new String[] { "url", "baseUrl", "basePath", "uriTemplate", "method", "consumes", "produces", "inType", "outType", - "state", "description" }, + "kind", "state", "description" }, new String[] { "Url", "Base Url", "Base Path", "Uri Template", "Method", "Consumes", "Produces", "Input Type", - "Output Type", "State", "Description" }, + "Output Type", "Kind", "State", "Description" }, new OpenType[] { SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, - SimpleType.STRING, + SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING }); } diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRestRegistry.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRestRegistry.java index 8654a304a0d..0b843ecba14 100644 --- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRestRegistry.java +++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRestRegistry.java @@ -67,6 +67,7 @@ public class ManagedRestRegistry extends ManagedService implements ManagedRestRe String method = entry.getMethod(); String consumes = entry.getConsumes(); String produces = entry.getProduces(); + String kind = entry.isContractFirst() ? "contract-first" : "code-first"; String state = entry.getState(); String inType = entry.getInType(); String outType = entry.getOutType(); @@ -76,9 +77,9 @@ public class ManagedRestRegistry extends ManagedService implements ManagedRestRe ct, new String[] { "url", "baseUrl", "basePath", "uriTemplate", "method", "consumes", "produces", "inType", - "outType", "state", "description" }, + "outType", "kind", "state", "description" }, new Object[] { - url, baseUrl, basePath, uriTemplate, method, consumes, produces, inType, outType, state, + url, baseUrl, basePath, uriTemplate, method, consumes, produces, inType, outType, kind, state, description }); answer.put(data); } diff --git a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_7.adoc b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_7.adoc index d0adc9c660a..2d611503ef7 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_7.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_7.adoc @@ -11,13 +11,15 @@ from both 4.0 to 4.1 and 4.1 to 4.2. The class `org.apache.camel.impl.engine.ValidatorKey` moved to `org.apache.camel.spi.ValidatorKey`. The class `org.apache.camel.impl.engine.TransformerKey` moved to `org.apache.camel.spi.TransformerKey`. +The `org.apache.camel.spi.RestRegistry` method `addRestService` has added `boolean contractFirst` parameter to define +if the Rest service is _contract-first_ or _code-first_. === camel-core Add default values to `ThrottlingExceptionRoutePolicy` route policy. The `EndpointRegistry` interface has been slightly changed to now directly extends `Map<NormalizedEndpointUri, Endpoint>` -instead of being a parameterized type. This may cause some compilation failures if the code is declaring a variable for the registry. +instead of being a parameterized type. This may cause some compilation failures if the code is declaring a variable for the registry. === camel-health diff --git a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java index 390c66d04d3..f288cc1f174 100644 --- a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java +++ b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java @@ -983,6 +983,13 @@ public class LocalCliConnector extends ServiceSupport implements CliConnector, C root.put("platform-http", json); } } + DevConsole dc19 = dcr.resolveById("rest"); + if (dc19 != null) { + JsonObject json = (JsonObject) dc19.call(DevConsole.MediaType.JSON); + if (json != null && !json.isEmpty()) { + root.put("rests", json); + } + } } // various details JsonObject mem = collectMemory(); diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java index b2a1978b1ef..a6d5d5beafe 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java @@ -98,6 +98,7 @@ public class CamelJBangMain implements Callable<Integer> { .addSubcommand("circuit-breaker", new CommandLine(new ListCircuitBreaker(main))) .addSubcommand("metric", new CommandLine(new ListMetric(main))) .addSubcommand("service", new CommandLine(new ListService(main))) + .addSubcommand("rest", new CommandLine(new ListRest(main))) .addSubcommand("platform-http", new CommandLine(new ListPlatformHttp(main))) .addSubcommand("source", new CommandLine(new CamelSourceAction(main))) .addSubcommand("route-dump", new CommandLine(new CamelRouteDumpAction(main))) diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListPlatformHttp.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListPlatformHttp.java index b4d59e2b818..4f17b8102f2 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListPlatformHttp.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListPlatformHttp.java @@ -103,8 +103,8 @@ public class ListPlatformHttp extends ProcessWatchCommand { new Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, OverflowBehaviour.ELLIPSIS_RIGHT) .with(r -> r.name), new Column().header("URL").dataAlign(HorizontalAlign.LEFT).with(r -> r.url), - new Column().header("VERB").dataAlign(HorizontalAlign.LEFT).with(r -> r.verbs), - new Column().header("CONTENT").dataAlign(HorizontalAlign.LEFT).with(this::getContent)))); + new Column().header("METHOD").dataAlign(HorizontalAlign.LEFT).with(r -> r.verbs), + new Column().header("CONTENT-TYPE").dataAlign(HorizontalAlign.LEFT).with(this::getContent)))); } return 0; diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListPlatformHttp.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListRest.java similarity index 80% copy from dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListPlatformHttp.java copy to dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListRest.java index b4d59e2b818..eca9ea3d2ea 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListPlatformHttp.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListRest.java @@ -19,6 +19,7 @@ package org.apache.camel.dsl.jbang.core.commands.process; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.StringJoiner; import com.github.freva.asciitable.AsciiTable; @@ -34,9 +35,9 @@ import org.apache.camel.util.json.JsonObject; import picocli.CommandLine; import picocli.CommandLine.Command; -@Command(name = "platform-http", - description = "Get embedded HTTP services of Camel integrations", sortOptions = false) -public class ListPlatformHttp extends ProcessWatchCommand { +@Command(name = "rest", + description = "Get REST services of Camel integrations", sortOptions = false) +public class ListRest extends ProcessWatchCommand { @CommandLine.Parameters(description = "Name or pid of running Camel integration", arity = "0..1") String name = "*"; @@ -45,7 +46,11 @@ public class ListPlatformHttp extends ProcessWatchCommand { description = "Sort by pid, name or age", defaultValue = "pid") String sort; - public ListPlatformHttp(CamelJBangMain main) { + @CommandLine.Option(names = { "--verbose" }, + description = "Show more details") + boolean verbose; + + public ListRest(CamelJBangMain main) { super(main); } @@ -73,20 +78,19 @@ public class ListPlatformHttp extends ProcessWatchCommand { row.uptime = extractSince(ph); row.age = TimeUtils.printSince(row.uptime); - JsonObject jo = (JsonObject) root.get("platform-http"); + JsonObject jo = (JsonObject) root.get("rests"); if (jo != null) { - String server = jo.getString("server"); - JsonArray arr = (JsonArray) jo.get("endpoints"); + JsonArray arr = (JsonArray) jo.get("rests"); if (arr != null) { for (int i = 0; i < arr.size(); i++) { row = row.copy(); jo = (JsonObject) arr.get(i); - row.server = server; row.url = jo.getString("url"); - row.path = jo.getString("path"); - row.verbs = jo.getString("verbs"); + row.method = jo.getString("method").toUpperCase(Locale.ROOT); row.consumes = jo.getString("consumes"); row.produces = jo.getString("produces"); + row.description = jo.getString("description"); + row.contractFirst = jo.getBooleanOrDefault("contractFirst", false); rows.add(row); } } @@ -103,13 +107,19 @@ public class ListPlatformHttp extends ProcessWatchCommand { new Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, OverflowBehaviour.ELLIPSIS_RIGHT) .with(r -> r.name), new Column().header("URL").dataAlign(HorizontalAlign.LEFT).with(r -> r.url), - new Column().header("VERB").dataAlign(HorizontalAlign.LEFT).with(r -> r.verbs), - new Column().header("CONTENT").dataAlign(HorizontalAlign.LEFT).with(this::getContent)))); + new Column().header("METHOD").dataAlign(HorizontalAlign.LEFT).with(r -> r.method), + new Column().header("FIRST").visible(verbose).dataAlign(HorizontalAlign.LEFT).with(this::getKind), + new Column().header("DESCRIPTION").visible(verbose).maxWidth(40, OverflowBehaviour.NEWLINE).dataAlign(HorizontalAlign.LEFT).with(r -> r.description), + new Column().header("CONTENT-TYPE").dataAlign(HorizontalAlign.LEFT).with(this::getContent)))); } return 0; } + private String getKind(Row r) { + return r.contractFirst ? "Contract" : "Code"; + } + private String getContent(Row r) { StringJoiner sj = new StringJoiner(" "); if (r.consumes != null || r.produces != null) { @@ -150,12 +160,12 @@ public class ListPlatformHttp extends ProcessWatchCommand { String name; String age; long uptime; - String server; String url; - String path; - String verbs; + String method; String consumes; String produces; + String description; + boolean contractFirst; Row copy() { try {