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

davsclaus pushed a commit to branch camel-3.20.x
in repository https://gitbox.apache.org/repos/asf/camel.git

commit d70d01db8f7cee17413c0d613f40962df4c4974d
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Tue Mar 14 09:31:10 2023 +0100

    CAMEL-19144: camel-catalog - Include information about existing Camel 
releases
---
 catalog/camel-catalog/pom.xml                      |  23 +
 .../camel/catalog/releases/camel-releases.json     | 651 +++++++++++++++++++++
 .../org/apache/camel/catalog/CamelCatalog.java     |   6 +
 .../apache/camel/catalog/DefaultCamelCatalog.java  |  22 +
 .../org/apache/camel/catalog/CamelCatalogTest.java |  14 +
 .../org/apache/camel/tooling/model/JsonMapper.java |  26 +
 .../apache/camel/tooling/model/ReleaseModel.java   |  66 +++
 .../maven/packaging/UpdateCamelReleasesMojo.java   | 161 +++++
 8 files changed, 969 insertions(+)

diff --git a/catalog/camel-catalog/pom.xml b/catalog/camel-catalog/pom.xml
index b738ba53492..0775d52bd87 100644
--- a/catalog/camel-catalog/pom.xml
+++ b/catalog/camel-catalog/pom.xml
@@ -196,4 +196,27 @@
 
     </build>
 
+    <profiles>
+        <profile>
+            <id>update-camel-releases</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.camel</groupId>
+                        <artifactId>camel-package-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <!-- update camel release details from 
camel-website -->
+                                    <goal>update-camel-releases</goal>
+                                </goals>
+                                <phase>generate-resources</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
 </project>
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/releases/camel-releases.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/releases/camel-releases.json
new file mode 100644
index 00000000000..c20f6b3623e
--- /dev/null
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/releases/camel-releases.json
@@ -0,0 +1,651 @@
+[
+    {
+        "version": "2.18.0",
+        "date": "2016-10-05",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.18.1",
+        "date": "2016-11-27",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.18.2",
+        "date": "2017-01-22",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.18.3",
+        "date": "2017-03-08",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.18.4",
+        "date": "2017-03-08",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.18.5",
+        "date": "2017-09-21",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.19.0",
+        "date": "2017-04-30",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.19.1",
+        "date": "2017-06-11",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.19.2",
+        "date": "2017-07-28",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.19.3",
+        "date": "2017-09-10",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.19.4",
+        "date": "2017-11-01",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.19.5",
+        "date": "2018-03-24",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.20.0",
+        "date": "2017-10-07",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.20.1",
+        "date": "2017-11-10",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.20.2",
+        "date": "2018-01-22",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.20.3",
+        "date": "2018-03-25",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.20.4",
+        "date": "2018-07-21",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.21.0",
+        "date": "2018-03-11",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.21.1",
+        "date": "2018-04-29",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.21.2",
+        "date": "2018-07-16",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.21.3",
+        "date": "2018-10-21",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.21.4",
+        "date": "2019-01-06",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.21.5",
+        "date": "2019-02-02",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.22.0",
+        "date": "2018-06-29",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.22.1",
+        "date": "2018-09-02",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.22.2",
+        "date": "2018-11-01",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.22.3",
+        "date": "2019-01-19",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.22.4",
+        "date": "2019-04-07",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.22.5",
+        "date": "2019-06-08",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.23.0",
+        "date": "2018-11-24",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.23.1",
+        "date": "2019-01-12",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.23.2",
+        "date": "2019-04-06",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.23.3",
+        "date": "2019-06-09",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.23.4",
+        "date": "2019-09-22",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.24.0",
+        "date": "2019-05-12",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.24.1",
+        "date": "2019-06-20",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.24.2",
+        "date": "2019-09-13",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.24.3",
+        "date": "2019-12-26",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.25.0",
+        "date": "2020-01-23",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.25.1",
+        "date": "2020-04-16",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.25.2",
+        "date": "2020-07-21",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.25.3",
+        "date": "2020-12-24",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.25.4",
+        "date": "2021-05-28",
+        "eol": "2022-01-01",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "3.0.0",
+        "date": "2019-11-28",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.0.0-RC1",
+        "date": "2019-09-01",
+        "kind": "RC",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.0.0-RC2",
+        "date": "2019-10-06",
+        "kind": "RC",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.0.0-RC3",
+        "date": "2019-10-25",
+        "kind": "RC",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.0.1",
+        "date": "2020-01-16",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.1.0",
+        "date": "2020-02-27",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.10.0",
+        "date": "2021-05-20",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.0",
+        "date": "2021-06-28",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.1",
+        "date": "2021-08-05",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.2",
+        "date": "2021-09-13",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.3",
+        "date": "2021-10-12",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.4",
+        "date": "2021-11-24",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.5",
+        "date": "2021-12-31",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.6",
+        "date": "2022-03-13",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.7",
+        "date": "2022-05-05",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.12.0",
+        "date": "2021-10-04",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.13.0",
+        "date": "2021-11-12",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.0",
+        "date": "2021-12-16",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.1",
+        "date": "2022-01-27",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.2",
+        "date": "2022-03-08",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.3",
+        "date": "2022-05-06",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.4",
+        "date": "2022-06-30",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.5",
+        "date": "2022-08-20",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.6",
+        "date": "2022-11-05",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.7",
+        "date": "2022-12-17",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.15.0",
+        "date": "2022-02-04",
+        "jdk": "11"
+    },
+    {
+        "version": "3.16.0",
+        "date": "2022-03-28",
+        "jdk": "11"
+    },
+    {
+        "version": "3.17.0",
+        "date": "2022-05-19",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.18.0",
+        "date": "2022-07-06",
+        "eol": "2023-07-06",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.18.1",
+        "date": "2022-08-11",
+        "eol": "2023-07-06",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.18.2",
+        "date": "2022-09-08",
+        "eol": "2023-07-06",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.18.3",
+        "date": "2022-10-31",
+        "eol": "2023-07-06",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.18.4",
+        "date": "2022-12-01",
+        "eol": "2023-07-06",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.18.5",
+        "date": "2023-01-25",
+        "eol": "2023-07-06",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.19.0",
+        "date": "2022-10-03",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.2.0",
+        "date": "2020-04-06",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.20.0",
+        "date": "2022-12-21",
+        "eol": "2023-12-21",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.20.1",
+        "date": "2023-01-07",
+        "eol": "2023-12-21",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.20.2",
+        "date": "2023-02-07",
+        "eol": "2023-12-21",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.3.0",
+        "date": "2020-05-15",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.0",
+        "date": "2020-06-18",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.1",
+        "date": "2020-07-12",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.2",
+        "date": "2020-07-19",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.3",
+        "date": "2020-08-15",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.4",
+        "date": "2020-09-28",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.5",
+        "date": "2020-12-23",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.6",
+        "date": "2021-06-21",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.5.0",
+        "date": "2020-09-04",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.6.0",
+        "date": "2020-09-20",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.0",
+        "date": "2020-12-16",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.1",
+        "date": "2021-01-21",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.2",
+        "date": "2021-02-08",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.3",
+        "date": "2021-03-10",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.4",
+        "date": "2021-05-03",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.5",
+        "date": "2021-07-12",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.6",
+        "date": "2021-10-05",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.7",
+        "date": "2021-12-23",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.8.0",
+        "date": "2021-02-13",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.9.0",
+        "date": "2021-03-28",
+        "jdk": "8,11"
+    },
+    {
+        "version": "4.0.0-M1",
+        "date": "2023-02-04",
+        "kind": "RC",
+        "jdk": "17"
+    },
+    {
+        "version": "4.0.0-M2",
+        "date": "2023-03-10",
+        "kind": "RC",
+        "jdk": "17"
+    }
+]
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 6938c48e009..8af2b8d1b2f 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
@@ -30,6 +30,7 @@ import org.apache.camel.tooling.model.EipModel;
 import org.apache.camel.tooling.model.LanguageModel;
 import org.apache.camel.tooling.model.MainModel;
 import org.apache.camel.tooling.model.OtherModel;
+import org.apache.camel.tooling.model.ReleaseModel;
 
 /**
  * Catalog of components, data formats, models (EIPs), languages, and more 
from this Apache Camel release.
@@ -580,4 +581,9 @@ public interface CamelCatalog {
      */
     InputStream loadResource(String kind, String name);
 
+    /**
+     * Load all Camel releases from catalog
+     */
+    List<ReleaseModel> camelReleases();
+
 }
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 775294144f3..03d8f3bbc7d 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
@@ -52,7 +52,10 @@ import org.apache.camel.tooling.model.JsonMapper;
 import org.apache.camel.tooling.model.LanguageModel;
 import org.apache.camel.tooling.model.MainModel;
 import org.apache.camel.tooling.model.OtherModel;
+import org.apache.camel.tooling.model.ReleaseModel;
+import org.apache.camel.util.json.JsonArray;
 import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
 
 /**
  * Default {@link CamelCatalog}.
@@ -501,6 +504,25 @@ public class DefaultCamelCatalog extends 
AbstractCamelCatalog implements CamelCa
         return versionManager.getResourceAsStream(BASE_RESOURCE_DIR + "/" + 
kind + "/" + name);
     }
 
+    @Override
+    public List<ReleaseModel> camelReleases() {
+        return cache("camelReleases", () -> {
+            try {
+                List<ReleaseModel> answer = new ArrayList<>();
+                InputStream is = loadResource("releases", 
"camel-releases.json");
+                String json = CatalogHelper.loadText(is);
+                JsonArray arr = (JsonArray) Jsoner.deserialize(json);
+                for (Object o : arr) {
+                    JsonObject jo = (JsonObject) o;
+                    answer.add(JsonMapper.generateReleaseModel(jo));
+                }
+                return answer;
+            } catch (Exception e) {
+                return Collections.emptyList();
+            }
+        });
+    }
+
     private static boolean matchArtifact(ArtifactModel<?> am, String groupId, 
String artifactId, String version) {
         return groupId.equals(am.getGroupId()) && 
artifactId.equals(am.getArtifactId())
                 && (version == null || version.isBlank() || 
version.equals(am.getVersion()));
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 97f09b0eba5..9c40956b0c5 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
@@ -32,6 +32,7 @@ import org.apache.camel.tooling.model.ComponentModel;
 import org.apache.camel.tooling.model.DataFormatModel;
 import org.apache.camel.tooling.model.LanguageModel;
 import org.apache.camel.tooling.model.OtherModel;
+import org.apache.camel.tooling.model.ReleaseModel;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -1595,4 +1596,17 @@ public class CamelCatalogTest {
         Assertions.assertNull(is);
     }
 
+    @Test
+    public void camelReleases() {
+        List<ReleaseModel> list = catalog.camelReleases();
+        Assertions.assertTrue(list.size() > 100);
+
+        ReleaseModel rel = list.stream().filter(r -> 
r.getVersion().equals("3.20.1")).findFirst().orElse(null);
+        Assertions.assertNotNull(rel);
+        Assertions.assertEquals("3.20.1", rel.getVersion());
+        Assertions.assertEquals("2023-01-07", rel.getDate());
+        Assertions.assertEquals("2023-12-21", rel.getEol());
+        Assertions.assertEquals("lts", rel.getKind());
+    }
+
 }
diff --git 
a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
 
b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
index 0b3db6dbc5e..c52d6775062 100644
--- 
a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
+++ 
b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
@@ -606,6 +606,32 @@ public final class JsonMapper {
         return json;
     }
 
+    public static JsonObject asJsonObject(ReleaseModel model) {
+        JsonObject json = new JsonObject();
+        json.put("version", model.getVersion());
+        json.put("date", model.getDate());
+        if (model.getEol() != null) {
+            json.put("eol", model.getEol());
+        }
+        if (model.getKind() != null) {
+            json.put("kind", model.getKind());
+        }
+        if (model.getJdk() != null) {
+            json.put("jdk", model.getJdk());
+        }
+        return json;
+    }
+
+    public static ReleaseModel generateReleaseModel(JsonObject obj) {
+        ReleaseModel model = new ReleaseModel();
+        model.setVersion(obj.getString("version"));
+        model.setDate(obj.getString("date"));
+        model.setEol(obj.getString("eol"));
+        model.setKind(obj.getString("kind"));
+        model.setJdk(obj.getString("jdk"));
+        return model;
+    }
+
     public static String createJsonSchema(MainModel model) {
         JsonObject wrapper = asJsonObject(model);
         return serialize(wrapper);
diff --git 
a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ReleaseModel.java
 
b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ReleaseModel.java
new file mode 100644
index 00000000000..4b48d03beb1
--- /dev/null
+++ 
b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ReleaseModel.java
@@ -0,0 +1,66 @@
+/*
+ * 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.tooling.model;
+
+public class ReleaseModel {
+
+    protected String version;
+    protected String date;
+    protected String eol;
+    protected String kind;
+    protected String jdk;
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getDate() {
+        return date;
+    }
+
+    public void setDate(String date) {
+        this.date = date;
+    }
+
+    public String getEol() {
+        return eol;
+    }
+
+    public void setEol(String eol) {
+        this.eol = eol;
+    }
+
+    public String getKind() {
+        return kind;
+    }
+
+    public void setKind(String kind) {
+        this.kind = kind;
+    }
+
+    public String getJdk() {
+        return jdk;
+    }
+
+    public void setJdk(String jdk) {
+        this.jdk = jdk;
+    }
+}
diff --git 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateCamelReleasesMojo.java
 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateCamelReleasesMojo.java
new file mode 100644
index 00000000000..2de3f549f07
--- /dev/null
+++ 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateCamelReleasesMojo.java
@@ -0,0 +1,161 @@
+/*
+ * 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.maven.packaging;
+
+import java.io.File;
+import java.io.LineNumberReader;
+import java.io.StringReader;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.file.Path;
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.camel.tooling.model.JsonMapper;
+import org.apache.camel.tooling.model.ReleaseModel;
+import org.apache.camel.util.json.JsonArray;
+import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+
+/**
+ * Unfortunately we do not have a release timestamp for every Camel release 
published to maven. So we need to grab the
+ * dates from camel-website git repository.
+ */
+@Mojo(name = "update-camel-releases", threadSafe = true, defaultPhase = 
LifecyclePhase.PROCESS_CLASSES)
+public class UpdateCamelReleasesMojo extends AbstractGeneratorMojo {
+
+    private static final String GIT_URL = 
"https://api.github.com/repos/apache/camel-website/contents/content/releases/";;
+
+    /**
+     * The output directory for generated file
+     */
+    @Parameter(defaultValue = 
"${project.basedir}/src/generated/resources/org/apache/camel/catalog/releases")
+    protected File outDir;
+
+    @Override
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        if (outDir == null) {
+            outDir = new File(project.getBasedir(), "src/generated/resources");
+        }
+
+        try {
+            getLog().info("Updating Camel release information from 
camel-website");
+            List<String> links = fetchCamelReleaseLinks();
+            List<ReleaseModel> releases = processReleases(links);
+            releases.sort(Comparator.comparing(ReleaseModel::getVersion));
+            getLog().info("Found " + releases.size() + " Camel releases");
+
+            JsonArray arr = new JsonArray();
+            for (ReleaseModel r : releases) {
+                JsonObject jo = JsonMapper.asJsonObject(r);
+                arr.add(jo);
+            }
+            String json = Jsoner.serialize(arr);
+            json = Jsoner.prettyPrint(json, 4);
+
+            Path path = outDir.toPath();
+            updateResource(path, "camel-releases.json", json);
+            addResourceDirectory(path);
+
+        } catch (Exception e) {
+            throw new MojoExecutionException(e);
+        }
+    }
+
+    private List<ReleaseModel> processReleases(List<String> urls) throws 
Exception {
+        List<ReleaseModel> answer = new ArrayList<>();
+
+        HttpClient hc = HttpClient.newHttpClient();
+        for (String url : urls) {
+            HttpResponse<String> res = hc.send(HttpRequest.newBuilder(new 
URI(url)).timeout(Duration.ofSeconds(20)).build(),
+                    HttpResponse.BodyHandlers.ofString());
+
+            if (res.statusCode() == 200) {
+                ReleaseModel model = new ReleaseModel();
+                LineNumberReader lr = new LineNumberReader(new 
StringReader(res.body()));
+                String line = lr.readLine();
+                while (line != null) {
+                    if (line.startsWith("date:")) {
+                        model.setDate(line.substring(5).trim());
+                    } else if (line.startsWith("version:")) {
+                        model.setVersion(line.substring(8).trim());
+                    } else if (line.startsWith("eol:")) {
+                        model.setEol(line.substring(4).trim());
+                    } else if (line.startsWith("kind:")) {
+                        model.setKind(line.substring(5).trim());
+                    } else if (line.startsWith("jdk:")) {
+                        String s = line.substring(4).trim();
+                        if (s.startsWith("[") && s.endsWith("]")) {
+                            s = s.substring(1, s.length() - 1);
+                        }
+                        model.setJdk(s);
+                    }
+                    line = lr.readLine();
+                }
+                if (model.getVersion() != null) {
+                    answer.add(model);
+                }
+            }
+        }
+
+        return answer;
+    }
+
+    private List<String> fetchCamelReleaseLinks() throws Exception {
+        List<String> answer = new ArrayList<>();
+
+        // use JDK http client to call github api
+        HttpClient hc = HttpClient.newHttpClient();
+        HttpResponse<String> res = hc.send(HttpRequest.newBuilder(new 
URI(GIT_URL)).timeout(Duration.ofSeconds(20)).build(),
+                HttpResponse.BodyHandlers.ofString());
+
+        // follow redirect
+        if (res.statusCode() == 302) {
+            String loc = res.headers().firstValue("location").orElse(null);
+            if (loc != null) {
+                res = hc.send(HttpRequest.newBuilder(new 
URI(loc)).timeout(Duration.ofSeconds(20)).build(),
+                        HttpResponse.BodyHandlers.ofString());
+            }
+        }
+
+        if (res.statusCode() == 200) {
+            JsonArray root = (JsonArray) Jsoner.deserialize(res.body());
+            for (Object o : root) {
+                JsonObject jo = (JsonObject) o;
+                String name = jo.getString("name");
+                if (name != null && name.startsWith("release-")) {
+                    String url = jo.getString("download_url");
+                    if (url != null) {
+                        answer.add(url);
+                    }
+                }
+            }
+        }
+
+        return answer;
+    }
+
+}

Reply via email to