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 e8265f72c85 CAMEL-20617: rest dev console
e8265f72c85 is described below
commit e8265f72c850209ab4eabd400a4f65fadefdec43
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Jun 15 10:59:17 2024 +0200
CAMEL-20617: rest dev console
---
.../rest/openapi/RestOpenApiEndpoint.java | 4 +-
.../rest/openapi/RestOpenApiProcessor.java | 61 ++++++++----
.../camel/component/rest/DefaultRestRegistry.java | 17 +++-
.../org/apache/camel/dev-console/rest.json | 15 +++
.../services/org/apache/camel/dev-console/rest | 2 +
.../org/apache/camel/dev-consoles.properties | 2 +-
.../apache/camel/impl/console/RestDevConsole.java | 102 +++++++++++++++++++++
7 files changed, 179 insertions(+), 24 deletions(-)
diff --git
a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiEndpoint.java
b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiEndpoint.java
index cfcaf9a293f..ad68fe5c01d 100644
---
a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiEndpoint.java
+++
b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiEndpoint.java
@@ -210,7 +210,9 @@ public final class RestOpenApiEndpoint extends
DefaultEndpoint {
RestOpenApiProcessor target
= new RestOpenApiProcessor(this, doc, path, apiContextPath,
processor, restOpenapiProcessorStrategy);
CamelContextAware.trySetCamelContext(target, getCamelContext());
- return createConsumerFor(path, target);
+ Consumer consumer = createConsumerFor(path, target);
+ target.setConsumer(consumer);
+ return consumer;
}
protected Consumer createConsumerFor(String basePath, RestOpenApiProcessor
processor) throws Exception {
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 d9873587b2f..6d0735ed33f 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
@@ -33,8 +33,10 @@ import io.swagger.v3.oas.models.parameters.Parameter;
import org.apache.camel.AsyncCallback;
import org.apache.camel.CamelContext;
import org.apache.camel.CamelContextAware;
+import org.apache.camel.Consumer;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
+import org.apache.camel.RouteAware;
import org.apache.camel.StartupStep;
import org.apache.camel.component.platform.http.spi.PlatformHttpConsumerAware;
import org.apache.camel.http.base.HttpHelper;
@@ -69,6 +71,7 @@ public class RestOpenApiProcessor extends
DelegateAsyncProcessor implements Came
private final AtomicBoolean packageScanInit = new AtomicBoolean();
private final Set<Class<?>> scannedClasses = new HashSet<>();
private PlatformHttpConsumerAware platformHttpConsumer;
+ private Consumer consumer;
public RestOpenApiProcessor(RestOpenApiEndpoint endpoint, OpenAPI openAPI,
String basePath, String apiContextPath,
Processor processor,
RestOpenapiProcessorStrategy restOpenapiProcessorStrategy) {
@@ -99,6 +102,14 @@ public class RestOpenApiProcessor extends
DelegateAsyncProcessor implements Came
this.platformHttpConsumer = platformHttpConsumer;
}
+ public Consumer getConsumer() {
+ return consumer;
+ }
+
+ public void setConsumer(Consumer consumer) {
+ this.consumer = consumer;
+ }
+
@Override
public boolean process(Exchange exchange, AsyncCallback callback) {
// use HTTP_URI as this works for all runtimes
@@ -149,8 +160,8 @@ public class RestOpenApiProcessor extends
DelegateAsyncProcessor implements Came
}
@Override
- protected void doBuild() throws Exception {
- super.doBuild();
+ protected void doInit() throws Exception {
+ super.doInit();
CamelContextAware.trySetCamelContext(restOpenapiProcessorStrategy,
getCamelContext());
@@ -160,16 +171,42 @@ public class RestOpenApiProcessor extends
DelegateAsyncProcessor implements Came
for (var o : e.getValue().readOperationsMap().entrySet()) {
String v = o.getKey().name(); // verb
// create per operation binding
- RestBindingAdvice binding = createRestBinding(o.getValue());
+ RestBindingConfiguration bc =
createRestBindingConfiguration(o.getValue());
+
+ String url = basePath + path;
+ if (platformHttpConsumer != null) {
+ url =
platformHttpConsumer.getPlatformHttpConsumer().getEndpoint().getServiceUrl() +
url;
+ }
+
+ String desc = o.getValue().getSummary();
+ if (desc != null && desc.isBlank()) {
+ desc = null;
+ }
+ String routeId = null;
+ if (consumer instanceof RouteAware ra) {
+ routeId = ra.getRoute().getRouteId();
+ }
+ camelContext.getRestRegistry().addRestService(consumer, url,
path, basePath, null, v, bc.getConsumes(),
+ bc.getProduces(), bc.getType(), bc.getOutType(),
routeId, desc);
+
+ RestBindingAdvice binding =
RestBindingAdviceFactory.build(camelContext, bc);
+ RestBindingAdviceFactory.build(camelContext, bc);
+
ServiceHelper.buildService(binding);
paths.add(new RestOpenApiConsumerPath(v, path, o.getValue(),
binding));
}
}
scannedClasses.clear(); // no longer needed
- ServiceHelper.buildService(restOpenapiProcessorStrategy);
+
+
restOpenapiProcessorStrategy.setMissingOperation(endpoint.getMissingOperation());
+
restOpenapiProcessorStrategy.setMockIncludePattern(endpoint.getMockIncludePattern());
+ ServiceHelper.initService(restOpenapiProcessorStrategy);
+
+ // validate openapi contract
+ restOpenapiProcessorStrategy.validateOpenApi(openAPI,
platformHttpConsumer);
}
- private RestBindingAdvice createRestBinding(Operation o) throws Exception {
+ private RestBindingConfiguration createRestBindingConfiguration(Operation
o) throws Exception {
RestConfiguration config = camelContext.getRestConfiguration();
RestConfiguration.RestBindingMode mode = config.getBindingMode();
@@ -301,7 +338,7 @@ public class RestOpenApiProcessor extends
DelegateAsyncProcessor implements Came
}
}
- return RestBindingAdviceFactory.build(camelContext, bc);
+ return bc;
}
private Class<?> loadBindingClass(CamelContext camelContext, String ref) {
@@ -339,18 +376,6 @@ public class RestOpenApiProcessor extends
DelegateAsyncProcessor implements Came
return null;
}
- @Override
- protected void doInit() throws Exception {
- super.doInit();
-
-
restOpenapiProcessorStrategy.setMissingOperation(endpoint.getMissingOperation());
-
restOpenapiProcessorStrategy.setMockIncludePattern(endpoint.getMockIncludePattern());
- ServiceHelper.initService(restOpenapiProcessorStrategy);
-
- // validate openapi contract
- restOpenapiProcessorStrategy.validateOpenApi(openAPI,
platformHttpConsumer);
- }
-
@Override
protected void doStart() throws Exception {
super.doStart();
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 b4071655d07..1109d180500 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
@@ -43,7 +43,7 @@ import org.apache.camel.util.ObjectHelper;
public class DefaultRestRegistry extends ServiceSupport implements
StaticService, RestRegistry, CamelContextAware {
private CamelContext camelContext;
- private final Map<Consumer, RestService> registry = new LinkedHashMap<>();
+ private final Map<Consumer, List<RestService>> registry = new
LinkedHashMap<>();
private transient Producer apiProducer;
@Override
@@ -52,7 +52,8 @@ public class DefaultRestRegistry extends ServiceSupport
implements StaticService
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);
- registry.put(consumer, entry);
+ List<RestService> list = registry.computeIfAbsent(consumer, c -> new
ArrayList<>());
+ list.add(entry);
}
@Override
@@ -62,12 +63,20 @@ public class DefaultRestRegistry extends ServiceSupport
implements StaticService
@Override
public List<RestRegistry.RestService> listAllRestServices() {
- return new ArrayList<>(registry.values());
+ List<RestRegistry.RestService> answer = new ArrayList<>();
+ for (var list : registry.values()) {
+ answer.addAll(list);
+ }
+ return answer;
}
@Override
public int size() {
- return registry.size();
+ int count = 0;
+ for (var list : registry.values()) {
+ count += list.size();
+ }
+ return count;
}
@Override
diff --git
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/rest.json
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/rest.json
new file mode 100644
index 00000000000..552cda4ab75
--- /dev/null
+++
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/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/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/rest
b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/rest
new file mode 100644
index 00000000000..ac2ac639ecc
--- /dev/null
+++
b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/rest
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.impl.console.RestDevConsole
diff --git
a/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-consoles.properties
b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-consoles.properties
index 8462c8e6fdd..a4866c14bd6 100644
---
a/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-consoles.properties
+++
b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-consoles.properties
@@ -1,5 +1,5 @@
# Generated by camel build tools - do NOT edit this file!
-dev-consoles=bean blocked circuit-breaker consumer context debug endpoint
event gc health inflight java-security jvm log memory properties reload route
route-controller route-dump service source startup-recorder thread top trace
transformers type-converters variables
+dev-consoles=bean blocked circuit-breaker consumer context debug endpoint
event gc health inflight java-security jvm log memory properties reload rest
route route-controller route-dump service source startup-recorder thread top
trace transformers type-converters variables
groupId=org.apache.camel
artifactId=camel-console
version=4.7.0-SNAPSHOT
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
new file mode 100644
index 00000000000..eb9ef663600
--- /dev/null
+++
b/core/camel-console/src/main/java/org/apache/camel/impl/console/RestDevConsole.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.impl.console;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.spi.RestRegistry;
+import org.apache.camel.spi.annotations.DevConsole;
+import org.apache.camel.support.console.AbstractDevConsole;
+import org.apache.camel.util.json.JsonObject;
+
+@DevConsole(name = "rest", displayName = "Rest", description = "Rest DSL
Registry information")
+public class RestDevConsole extends AbstractDevConsole {
+
+ public RestDevConsole() {
+ super("camel", "rest", "Rest", "Rest DSL Registry information");
+ }
+
+ @Override
+ protected String doCallText(Map<String, Object> options) {
+ StringBuilder sb = new StringBuilder();
+
+ RestRegistry rr = getCamelContext().getRestRegistry();
+ for (RestRegistry.RestService rs : rr.listAllRestServices()) {
+ if (!sb.isEmpty()) {
+ sb.append("\n");
+ }
+ sb.append(String.format("\n Url: %s", rs.getUrl()));
+ sb.append(String.format("\n Method: %s", rs.getMethod()));
+ sb.append(String.format("\n State: %s", rs.getState()));
+ if (rs.getConsumes() != null) {
+ sb.append(String.format("\n Consumes: %s",
rs.getConsumes()));
+ }
+ if (rs.getProduces() != null) {
+ sb.append(String.format("\n Produces: %s",
rs.getProduces()));
+ }
+ if (rs.getInType() != null) {
+ sb.append(String.format("\n In Type: %s", rs.getInType()));
+ }
+ if (rs.getOutType() != null) {
+ sb.append(String.format("\n Out Type: %s",
rs.getOutType()));
+ }
+ if (rs.getDescription() != null) {
+ sb.append(String.format("\n Description: %s",
rs.getDescription()));
+ }
+ }
+ sb.append("\n");
+
+ return sb.toString();
+ }
+
+ @Override
+ protected Map<String, Object> doCallJson(Map<String, Object> options) {
+ JsonObject root = new JsonObject();
+
+ List<JsonObject> list = new ArrayList<>();
+ root.put("rests", list);
+
+ RestRegistry rr = getCamelContext().getRestRegistry();
+ for (RestRegistry.RestService rs : rr.listAllRestServices()) {
+ JsonObject jo = new JsonObject();
+ jo.put("url", rs.getUrl());
+ jo.put("method", rs.getMethod());
+ jo.put("state", rs.getState());
+ if (rs.getConsumes() != null) {
+ jo.put("consumes", rs.getConsumes());
+ }
+ if (rs.getProduces() != null) {
+ jo.put("produces", rs.getProduces());
+ }
+ if (rs.getInType() != null) {
+ jo.put("inType", rs.getInType());
+ }
+ if (rs.getOutType() != null) {
+ jo.put("outType", rs.getOutType());
+ }
+ if (rs.getDescription() != null) {
+ jo.put("description", rs.getDescription());
+ }
+ list.add(jo);
+ }
+
+ return root;
+ }
+
+}