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; + } + +}