You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2024/03/18 12:37:20 UTC

(camel) branch main updated: CAMEL-20548: include a capability section to advertise which artifact provides a specific feature

This is an automated email from the ASF dual-hosted git repository.

lburgazzoli 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 e924867d1a1 CAMEL-20548: include a capability section to advertise which artifact provides a specific feature
e924867d1a1 is described below

commit e924867d1a153e3d1bf6af7b01cf1f950cf91ff3
Author: Luca Burgazzoli <lb...@gmail.com>
AuthorDate: Thu Mar 14 10:37:25 2024 +0100

    CAMEL-20548: include a capability section to advertise which artifact provides a specific feature
---
 .../org/apache/camel/catalog/CamelCatalog.java     | 12 +++++++++++
 .../apache/camel/catalog/DefaultCamelCatalog.java  | 25 ++++++++++++++++++++++
 .../camel/catalog/DefaultRuntimeProvider.java      | 22 +++++++++++++++++++
 .../org/apache/camel/catalog/RuntimeProvider.java  |  6 ++++++
 .../apache/camel/catalog/capabilities.properties   | 17 +++++++++++++++
 .../org/apache/camel/catalog/CamelCatalogTest.java | 16 ++++++++++++++
 .../org/apache/camel/tooling/model/EntityRef.java  | 13 +++--------
 .../java/org/apache/camel/tooling/model}/Kind.java |  2 +-
 8 files changed, 102 insertions(+), 11 deletions(-)

diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java
index 4d2744e171b..1932fb506a5 100644
--- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java
+++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java
@@ -20,6 +20,7 @@ import java.io.InputStream;
 import java.net.URISyntaxException;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 
 import org.apache.camel.tooling.model.ArtifactModel;
@@ -28,6 +29,8 @@ import org.apache.camel.tooling.model.ComponentModel;
 import org.apache.camel.tooling.model.DataFormatModel;
 import org.apache.camel.tooling.model.DevConsoleModel;
 import org.apache.camel.tooling.model.EipModel;
+import org.apache.camel.tooling.model.EntityRef;
+import org.apache.camel.tooling.model.Kind;
 import org.apache.camel.tooling.model.LanguageModel;
 import org.apache.camel.tooling.model.MainModel;
 import org.apache.camel.tooling.model.OtherModel;
@@ -214,6 +217,11 @@ public interface CamelCatalog {
      */
     List<String> findOtherNames();
 
+    /**
+     * Find all the capability names from the Camel catalog
+     */
+    List<String> findCapabilityNames();
+
     /**
      * @param  kind the kind to look for
      * @return      the list of part names of the given {@link Kind} available in this {@link CamelCatalog}
@@ -640,4 +648,8 @@ public interface CamelCatalog {
      */
     List<ReleaseModel> camelQuarkusReleases();
 
+    /**
+     * Find the entity the given capability maps to.
+     */
+    Optional<EntityRef> findCapabilityRef(String capability);
 }
diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
index aca19fb66e7..0d4e0b1a4a4 100644
--- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
+++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
@@ -40,7 +41,9 @@ import org.apache.camel.tooling.model.ComponentModel;
 import org.apache.camel.tooling.model.DataFormatModel;
 import org.apache.camel.tooling.model.DevConsoleModel;
 import org.apache.camel.tooling.model.EipModel;
+import org.apache.camel.tooling.model.EntityRef;
 import org.apache.camel.tooling.model.JsonMapper;
+import org.apache.camel.tooling.model.Kind;
 import org.apache.camel.tooling.model.LanguageModel;
 import org.apache.camel.tooling.model.MainModel;
 import org.apache.camel.tooling.model.OtherModel;
@@ -303,6 +306,11 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa
         return findNames(filter, this::findOtherNames, this::otherModel);
     }
 
+    @Override
+    public List<String> findCapabilityNames() {
+        return List.copyOf(runtimeProvider.findCapabilities().keySet());
+    }
+
     private List<String> findNames(
             String filter, Supplier<List<String>> findNames, Function<String, ? extends BaseModel<?>> modelLoader) {
         List<String> answer = new ArrayList<>();
@@ -589,6 +597,23 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa
         return camelReleases("camel-quarkus-releases.json");
     }
 
+    @Override
+    public Optional<EntityRef> findCapabilityRef(String capability) {
+        Map<String, String> capabilities = cache("capabilities", runtimeProvider::findCapabilities);
+
+        String ref = capabilities.get(capability);
+        if (ref == null) {
+            return Optional.empty();
+        }
+
+        String[] items = ref.split("/");
+        if (items.length != 2) {
+            return Optional.empty();
+        }
+
+        return Optional.of(new EntityRef(Kind.valueOf(items[0]), items[1]));
+    }
+
     private List<ReleaseModel> camelReleases(String file) {
         return cache(file, () -> {
             try {
diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java
index e2cc049a4da..9abb9e93ff0 100644
--- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java
+++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java
@@ -20,6 +20,9 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.TreeMap;
 
 import org.apache.camel.catalog.impl.CatalogHelper;
 
@@ -37,6 +40,7 @@ public class DefaultRuntimeProvider implements RuntimeProvider {
     private static final String TRANSFORMER_CATALOG = "org/apache/camel/catalog/transformers.properties";
     private static final String CONSOLE_CATALOG = "org/apache/camel/catalog/dev-consoles.properties";
     private static final String OTHER_CATALOG = "org/apache/camel/catalog/others.properties";
+    private static final String CAPABILITIES_CATALOG = "org/apache/camel/catalog/capabilities.properties";
 
     private CamelCatalog camelCatalog;
 
@@ -126,6 +130,10 @@ public class DefaultRuntimeProvider implements RuntimeProvider {
         return OTHER_CATALOG;
     }
 
+    protected String getCapabilitiesCatalog() {
+        return CAPABILITIES_CATALOG;
+    }
+
     @Override
     public List<String> findComponentNames() {
         return find(getComponentsCatalog());
@@ -156,6 +164,20 @@ public class DefaultRuntimeProvider implements RuntimeProvider {
         return find(getOtherCatalog());
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    @Override
+    public Map<String, String> findCapabilities() {
+        final Properties properties = new Properties();
+
+        try (InputStream is = getCamelCatalog().getVersionManager().getResourceAsStream(getCapabilitiesCatalog())) {
+            properties.load(is);
+        } catch (IOException e) {
+            // ignore
+        }
+
+        return new TreeMap<>((Map<String, String>) (Map) properties);
+    }
+
     protected List<String> find(String resourceName) {
         List<String> names = new ArrayList<>();
         try (InputStream is = getCamelCatalog().getVersionManager().getResourceAsStream(resourceName)) {
diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java
index 3731dce8815..ef3841f856c 100644
--- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java
+++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java
@@ -17,6 +17,7 @@
 package org.apache.camel.catalog;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * A pluggable strategy for chosen runtime to run Camel such as default, karaf, spring-boot, etc. This allows third
@@ -110,4 +111,9 @@ public interface RuntimeProvider {
      */
     List<String> findOtherNames();
 
+    /**
+     * Find all the capabilities from the Camel catalog supported by the provider
+     */
+    Map<String, String> findCapabilities();
+
 }
diff --git a/catalog/camel-catalog/src/main/resources/org/apache/camel/catalog/capabilities.properties b/catalog/camel-catalog/src/main/resources/org/apache/camel/catalog/capabilities.properties
new file mode 100644
index 00000000000..bb6876771b0
--- /dev/null
+++ b/catalog/camel-catalog/src/main/resources/org/apache/camel/catalog/capabilities.properties
@@ -0,0 +1,17 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+platform-http=other/platform-http-main
\ No newline at end of file
diff --git a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
index a4c168436a4..997851ebd98 100644
--- a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
+++ b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
@@ -24,12 +24,15 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.camel.tooling.model.ArtifactModel;
 import org.apache.camel.tooling.model.ComponentModel;
 import org.apache.camel.tooling.model.DataFormatModel;
+import org.apache.camel.tooling.model.EntityRef;
+import org.apache.camel.tooling.model.Kind;
 import org.apache.camel.tooling.model.LanguageModel;
 import org.apache.camel.tooling.model.ReleaseModel;
 import org.junit.jupiter.api.Assertions;
@@ -1616,4 +1619,17 @@ public class CamelCatalogTest {
         Assertions.assertEquals("11", rel.getJdk());
     }
 
+    @Test
+    public void capabilities() {
+        List<String> list = catalog.findCapabilityNames();
+        Assertions.assertEquals(1, list.size());
+
+        Optional<EntityRef> ref = catalog.findCapabilityRef("platform-http");
+        Assertions.assertTrue(ref.isPresent());
+        Assertions.assertEquals(Kind.other, ref.get().kind());
+        Assertions.assertEquals("platform-http-main", ref.get().name());
+
+        Optional<EntityRef> ref2 = catalog.findCapabilityRef("not-implemented");
+        Assertions.assertFalse(ref2.isPresent());
+    }
 }
diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/Kind.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EntityRef.java
similarity index 78%
copy from catalog/camel-catalog/src/main/java/org/apache/camel/catalog/Kind.java
copy to tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EntityRef.java
index c1f589d02ea..ff7f5def40d 100644
--- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/Kind.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EntityRef.java
@@ -14,17 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.catalog;
+package org.apache.camel.tooling.model;
 
 /**
- * Kind of a Camel part, such as component, dataformat, language, etc.
+ * Reference a Camel entity.
  */
-public enum Kind {
-    component,
-    dataformat,
-    language,
-    transformer,
-    console,
-    other,
-    eip
+public record EntityRef(Kind kind, String name) {
 }
diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/Kind.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java
similarity index 96%
rename from catalog/camel-catalog/src/main/java/org/apache/camel/catalog/Kind.java
rename to tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java
index c1f589d02ea..371c1060310 100644
--- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/Kind.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.catalog;
+package org.apache.camel.tooling.model;
 
 /**
  * Kind of a Camel part, such as component, dataformat, language, etc.