You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/05/03 05:06:48 UTC

[camel] 01/02: CAMEL-18026: camel-rest - Rest DSL - Output more fine grained http endpoints that are available

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

commit 638aadf20e2ab76deb91a2fc561e0ffdd5104d5e
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon May 2 16:56:21 2022 +0200

    CAMEL-18026: camel-rest - Rest DSL - Output more fine grained http endpoints that are available
---
 .../component/platform/http/HttpEndpointModel.java | 84 ++++++++++++++++++++++
 .../platform/http/PlatformHttpComponent.java       | 22 +++---
 .../platform/http/PlatformHttpEndpoint.java        |  4 +-
 .../component/platform/http/PlatformHttpTest.java  |  6 +-
 .../org/apache/camel/main/VertxHttpServer.java     | 18 +++--
 5 files changed, 115 insertions(+), 19 deletions(-)

diff --git a/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/HttpEndpointModel.java b/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/HttpEndpointModel.java
new file mode 100644
index 00000000000..b89db34c204
--- /dev/null
+++ b/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/HttpEndpointModel.java
@@ -0,0 +1,84 @@
+/*
+ * 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.component.platform.http;
+
+import org.apache.camel.util.StringHelper;
+
+import java.util.Locale;
+import java.util.Objects;
+
+/**
+ * Model of available http endpoints.
+ */
+public class HttpEndpointModel implements Comparable<HttpEndpointModel> {
+
+    private final String uri;
+    private String verbs;
+
+    public HttpEndpointModel(String uri) {
+        this(uri, null);
+    }
+
+    public HttpEndpointModel(String uri, String verbs) {
+        this.uri = uri;
+        addVerb(verbs);
+    }
+
+    public String getUri() {
+        return uri;
+    }
+
+    public String getVerbs() {
+        return verbs;
+    }
+
+    public void addVerb(String verb) {
+        if (verb != null) {
+            if (this.verbs == null) {
+                this.verbs = "";
+            }
+            if (!StringHelper.containsIgnoreCase(this.verbs, verb)) {
+                if (!this.verbs.isEmpty()) {
+                    this.verbs += ",";
+                }
+                this.verbs += verb.toUpperCase(Locale.US);
+            }
+        }
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        HttpEndpointModel that = (HttpEndpointModel) o;
+        return uri.equals(that.uri);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(uri);
+    }
+
+    @Override
+    public int compareTo(HttpEndpointModel o) {
+        return uri.compareTo(o.uri);
+    }
+}
diff --git a/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpComponent.java b/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpComponent.java
index e382d9decad..9dc2775bc90 100644
--- a/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpComponent.java
+++ b/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpComponent.java
@@ -53,7 +53,7 @@ public class PlatformHttpComponent extends DefaultComponent implements RestConsu
     @Metadata(label = "advanced", description = "An HTTP Server engine implementation to serve the requests")
     private volatile PlatformHttpEngine engine;
 
-    private final Set<String> httpEndpoints = new TreeSet<>();
+    private final Set<HttpEndpointModel> httpEndpoints = new TreeSet<>();
 
     private volatile boolean localEngine;
 
@@ -84,7 +84,7 @@ public class PlatformHttpComponent extends DefaultComponent implements RestConsu
         // reuse the createConsumer method we already have. The api need to use GET and match on uri prefix
         Consumer consumer = doCreateConsumer(camelContext, processor, "GET", contextPath, null, null, null, configuration,
                 parameters, true);
-        addHttpEndpoint(contextPath);
+        addHttpEndpoint(contextPath, "GET");
         return consumer;
     }
 
@@ -98,9 +98,9 @@ public class PlatformHttpComponent extends DefaultComponent implements RestConsu
                 = doCreateConsumer(camelContext, processor, verb, basePath, uriTemplate, consumes, produces, configuration,
                         parameters, false);
         if (uriTemplate != null) {
-            addHttpEndpoint(basePath + "/" + uriTemplate);
+            addHttpEndpoint(basePath + "/" + uriTemplate, verb);
         } else {
-            addHttpEndpoint(basePath);
+            addHttpEndpoint(basePath, verb);
         }
         return consumer;
     }
@@ -108,21 +108,27 @@ public class PlatformHttpComponent extends DefaultComponent implements RestConsu
     /**
      * Adds a known http endpoint managed by this component.
      */
-    public void addHttpEndpoint(String uri) {
-        httpEndpoints.add(uri);
+    public void addHttpEndpoint(String uri, String verbs) {
+        HttpEndpointModel model = httpEndpoints.stream().filter(e -> e.getUri().equals(uri)).findFirst().orElse(null);
+        if (model == null) {
+            model = new HttpEndpointModel(uri, verbs);
+            httpEndpoints.add(model);
+        } else {
+            model.addVerb(verbs);
+        }
     }
 
     /**
      * Removes a known http endpoint managed by this component.
      */
     public void removeHttpEndpoint(String uri) {
-        httpEndpoints.remove(uri);
+        httpEndpoints.stream().filter(e -> e.getUri().equals(uri)).findFirst().ifPresent(httpEndpoints::remove);
     }
 
     /**
      * Lists the known http endpoints managed by this component. The endpoints are without host:port/[context-path]
      */
-    public Set<String> getHttpEndpoints() {
+    public Set<HttpEndpointModel> getHttpEndpoints() {
         return Collections.unmodifiableSet(httpEndpoints);
     }
 
diff --git a/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpEndpoint.java b/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpEndpoint.java
index c0615147672..db5ca28e7fe 100644
--- a/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpEndpoint.java
+++ b/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpEndpoint.java
@@ -106,7 +106,7 @@ public class PlatformHttpEndpoint extends DefaultEndpoint implements AsyncEndpoi
             protected void doStart() throws Exception {
                 super.doStart();
                 ServiceHelper.startService(delegatedConsumer);
-                getComponent().addHttpEndpoint(getPath());
+                getComponent().addHttpEndpoint(getPath(), httpMethodRestrict);
             }
 
             @Override
@@ -205,6 +205,6 @@ public class PlatformHttpEndpoint extends DefaultEndpoint implements AsyncEndpoi
     PlatformHttpEngine getOrCreateEngine() {
         return platformHttpEngine != null
                 ? platformHttpEngine
-                : ((PlatformHttpComponent) getComponent()).getOrCreateEngine();
+                : getComponent().getOrCreateEngine();
     }
 }
diff --git a/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/PlatformHttpTest.java b/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/PlatformHttpTest.java
index cf3e9511f36..a7e0ad0f018 100644
--- a/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/PlatformHttpTest.java
+++ b/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/PlatformHttpTest.java
@@ -52,9 +52,9 @@ public class PlatformHttpTest extends AbstractPlatformHttpTest {
 
         PlatformHttpComponent phc = getContext().getComponent("platform-http", PlatformHttpComponent.class);
         assertEquals(2, phc.getHttpEndpoints().size());
-        Iterator<String> it = phc.getHttpEndpoints().iterator();
-        assertEquals("/get", it.next());
-        assertEquals("/post", it.next());
+        Iterator<HttpEndpointModel> it = phc.getHttpEndpoints().iterator();
+        assertEquals("/get", it.next().getUri());
+        assertEquals("/post", it.next().getUri());
     }
 
     @Override
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/VertxHttpServer.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/VertxHttpServer.java
index 7312e52e516..877bf93c816 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/VertxHttpServer.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/VertxHttpServer.java
@@ -35,6 +35,7 @@ import io.vertx.ext.web.RoutingContext;
 import org.apache.camel.CamelContext;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.StartupListener;
+import org.apache.camel.component.platform.http.HttpEndpointModel;
 import org.apache.camel.component.platform.http.PlatformHttpComponent;
 import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpRouter;
 import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpServer;
@@ -100,7 +101,7 @@ public final class VertxHttpServer {
                 public void onCamelContextStarted(CamelContext context, boolean alreadyStarted) throws Exception {
                     camelContext.getManagementStrategy().addEventNotifier(new SimpleEventNotifierSupport() {
 
-                        private Set<String> last;
+                        private Set<HttpEndpointModel> last;
 
                         @Override
                         public boolean isEnabled(CamelEvent event) {
@@ -119,7 +120,7 @@ public final class VertxHttpServer {
                                 }
                             }
 
-                            Set<String> endpoints = phc.getHttpEndpoints();
+                            Set<HttpEndpointModel> endpoints = phc.getHttpEndpoints();
                             if (endpoints.isEmpty()) {
                                 return;
                             }
@@ -127,8 +128,13 @@ public final class VertxHttpServer {
                             // log only if changed
                             if (last == null || last.size() != endpoints.size() || !last.containsAll(endpoints)) {
                                 LOG.info("HTTP endpoints summary");
-                                for (String u : endpoints) {
-                                    LOG.info("    http://0.0.0.0:" + port + u);
+                                for (HttpEndpointModel u : endpoints) {
+                                    String v = u.getVerbs();
+                                    String line = "http://0.0.0.0:" + port + u.getUri();
+                                    if (u.getVerbs() != null) {
+                                        line += " (" + u.getVerbs() + ")";
+                                    }
+                                    LOG.info("    {}", line);
                                 }
                             }
 
@@ -183,7 +189,7 @@ public final class VertxHttpServer {
                 }
             }
         });
-        phc.addHttpEndpoint("/q/dev");
+        phc.addHttpEndpoint("/q/dev", null);
     }
 
     public static void registerHealthCheck(CamelContext camelContext) {
@@ -254,7 +260,7 @@ public final class VertxHttpServer {
         live.handler(handler);
         ready.handler(handler);
 
-        phc.addHttpEndpoint("/q/health");
+        phc.addHttpEndpoint("/q/health", null);
     }
 
     private static void healthCheckStatus(StringBuilder sb, boolean up) {