You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rz...@apache.org on 2026/04/27 14:12:31 UTC
(tomee-site-generator) 02/02: Migrate the site generator to Java 21
This is an automated email from the ASF dual-hosted git repository.
rzo1 pushed a commit to branch java21
in repository https://gitbox.apache.org/repos/asf/tomee-site-generator.git
commit 55dd3377fa47b191d08fa0bcbd4292e657429029
Author: Richard Zowalla <rz...@apache.org>
AuthorDate: Mon Apr 27 16:10:10 2026 +0200
Migrate the site generator to Java 21
Bump source/target to release 21 and update the GitHub Actions workflow
to JDK 21 (Temurin). The previous toolchain pinned Java 8 and several
dependencies that no longer run on modern JDKs.
Drop Lombok entirely. The annotation processor pinned at 1.18.12 broke
on JDK 17+, and the surface area used in the project (@Data, @Builder,
@RequiredArgsConstructor, @AllArgsConstructor, @EqualsAndHashCode) is
small enough to replace with hand-written constructors, getters and
setters or with records where the type is immutable. Records are used
for Stats, Javadocs.Content, AbstractDownloadsNG.Results,
Downloads.ArtifactDescription and GitHubContributors.Contributor.
Bump JBake from 2.4.0 to 2.6.7. The 2.4 line still depends on
pegdown/parboiled which calls ClassLoader.findLoadedClass via
reflection, blocked on JDK 17+. JBake 2.6 swaps in flexmark and works
on modern JDKs. ConfigUtil moved to org.jbake.app.configuration and
the Parser/Oven constructors now take a JBakeConfiguration, so JBake.java
and GroupedIndex.java were updated accordingly.
Bump asciidoctorj to 2.4.3 (the version JBake 2.6 was built against),
Groovy to 3.0.21, OrientDB to 3.2.51 and swizzle to 1.3. The JBake POM
moved commons-configuration and orientdb-core to runtime scope, so they
are now declared explicitly because JBake.java and GroupedIndex.java
reference them directly.
OrientDB 3.2.51 transitively pulls GraalVM 21.3.5, which still calls
sun.misc.Unsafe.ensureClassInitialized (removed in JDK 22+). The
GraalJS engine is not needed by JBake, so the graal-sdk, truffle-api,
js, regex, js-scriptengine, profiler and chromeinspector artifacts are
excluded from orientdb-core.
The transitive jffi 1.3.1 (via JRuby/asciidoctorj) only ships
i386/x86_64 native stubs. Pin jffi 1.3.13 (both the jar and the
:native classifier) so the build works on Apple Silicon.
Drop the redundant slf4j-log4j12 binding pulled by jgit.pgm, and rework
LearningLinks.getImports to walk Java files with Files.walk plus a
regex instead of the tomitribe-tio Match/Unique pipeline, which used
tomitribe-util XxHash64 and was tripping the JDK-removed
DirectByteBuffer(long, int, Object) constructor.
---
.github/workflows/main.yml | 8 +-
pom.xml | 118 ++++++++++++---------
.../apache/tomee/website/AbstractDownloadsNG.java | 44 ++++++--
.../java/org/apache/tomee/website/Downloads.java | 47 ++++++--
.../java/org/apache/tomee/website/DownloadsNG.java | 12 +--
.../apache/tomee/website/GitHubContributors.java | 10 +-
.../org/apache/tomee/website/GroupedIndex.java | 19 +++-
src/main/java/org/apache/tomee/website/JBake.java | 18 ++--
.../org/apache/tomee/website/JavadocSource.java | 32 ++++--
.../java/org/apache/tomee/website/Javadocs.java | 7 +-
.../org/apache/tomee/website/LearningLinks.java | 50 ++++++---
src/main/java/org/apache/tomee/website/PDFify.java | 7 +-
.../tomee/website/contributors/Contributor.java | 88 ++++++++++++++-
.../website/contributors/ContributorData.java | 66 ++++++++----
.../apache/tomee/website/contributors/Stats.java | 25 ++---
15 files changed, 381 insertions(+), 170 deletions(-)
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 8e3cd59..db9ff70 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -13,11 +13,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - name: Set up JDK 8
- uses: actions/setup-java@v3
+ - uses: actions/checkout@v4
+ - name: Set up JDK 21
+ uses: actions/setup-java@v4
with:
- java-version: '8'
+ java-version: '21'
distribution: 'temurin'
cache: maven
- name: Build with Maven
diff --git a/pom.xml b/pom.xml
index 221c3bd..7916e07 100755
--- a/pom.xml
+++ b/pom.xml
@@ -28,13 +28,7 @@
<dependency>
<groupId>org.asciidoctor</groupId>
<artifactId>asciidoctorj</artifactId>
- <version>1.5.8.1</version>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>1.18.12</version>
- <scope>provided</scope>
+ <version>2.4.3</version>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
@@ -69,7 +63,7 @@
<dependency>
<groupId>org.jbake</groupId>
<artifactId>jbake-core</artifactId>
- <version>2.4.0</version>
+ <version>2.6.7</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
@@ -77,20 +71,58 @@
</exclusion>
</exclusions>
</dependency>
+ <!-- JBake 2.6 demoted these to runtime scope, but JBake.java / GroupedIndex.java reference them directly -->
+ <dependency>
+ <groupId>commons-configuration</groupId>
+ <artifactId>commons-configuration</artifactId>
+ <version>1.10</version>
+ </dependency>
+ <dependency>
+ <groupId>com.orientechnologies</groupId>
+ <artifactId>orientdb-core</artifactId>
+ <version>3.2.51</version>
+ <exclusions>
+ <!-- GraalVM 21.3.5 calls sun.misc.Unsafe.ensureClassInitialized, removed in JDK 22+.
+ OrientDB only uses it for JS scripting, which JBake does not exercise. -->
+ <exclusion>
+ <groupId>org.graalvm.sdk</groupId>
+ <artifactId>graal-sdk</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.graalvm.truffle</groupId>
+ <artifactId>truffle-api</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.graalvm.js</groupId>
+ <artifactId>js</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.graalvm.js</groupId>
+ <artifactId>js-scriptengine</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.graalvm.regex</groupId>
+ <artifactId>regex</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.graalvm.tools</groupId>
+ <artifactId>profiler</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.graalvm.tools</groupId>
+ <artifactId>chromeinspector</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
- <version>2.3.11</version>
+ <version>3.0.21</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-templates</artifactId>
- <version>2.3.11</version>
- </dependency>
- <dependency>
- <groupId>org.pegdown</groupId>
- <artifactId>pegdown</artifactId>
- <version>1.6.0</version>
+ <version>3.0.21</version>
</dependency>
<dependency>
<groupId>org.tmatesoft.svnkit</groupId>
@@ -106,6 +138,12 @@
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit.pgm</artifactId>
<version>5.1.3.201810200350-r</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
<groupId>args4j</groupId>
@@ -120,7 +158,7 @@
<dependency>
<groupId>org.tomitribe</groupId>
<artifactId>swizzle</artifactId>
- <version>1.1</version>
+ <version>1.3</version>
</dependency>
<!-- required for DownloadsNG.java -->
<dependency>
@@ -129,6 +167,20 @@
<version>1.17</version>
</dependency>
+ <!-- jffi 1.3.1 (transitive via JRuby/asciidoctorj) ships only i386/x86_64 native stubs.
+ 1.3.13 adds arm64-darwin so the build runs on Apple Silicon. -->
+ <dependency>
+ <groupId>com.github.jnr</groupId>
+ <artifactId>jffi</artifactId>
+ <version>1.3.13</version>
+ </dependency>
+ <dependency>
+ <groupId>com.github.jnr</groupId>
+ <artifactId>jffi</artifactId>
+ <version>1.3.13</version>
+ <classifier>native</classifier>
+ </dependency>
+
</dependencies>
<build>
@@ -136,10 +188,9 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
- <version>3.5.1</version>
+ <version>3.13.0</version>
<configuration>
- <source>1.8</source>
- <target>1.8</target>
+ <release>21</release>
</configuration>
</plugin>
<plugin>
@@ -164,37 +215,8 @@
</arguments>
</configuration>
</execution>
- <execution>
- <id>publish</id>
- <phase>pre-site</phase>
- <goals>
- <goal>java</goal>
- </goals>
- <configuration>
- <includeProjectDependencies>true</includeProjectDependencies>
- <mainClass>org.apache.tomee.website.SvnPub</mainClass>
- <arguments>
- <argument>${site.password}</argument>
- <argument>${site.message}</argument>
- </arguments>
- </configuration>
- </execution>
</executions>
</plugin>
</plugins>
</build>
-
- <repositories>
- <repository>
- <id>svnkit</id>
- <name>SVNKit</name>
- <url>https://maven.tmatesoft.com/content/repositories/releases/</url>
- <releases>
- <enabled>true</enabled>
- </releases>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
- </repositories>
</project>
diff --git a/src/main/java/org/apache/tomee/website/AbstractDownloadsNG.java b/src/main/java/org/apache/tomee/website/AbstractDownloadsNG.java
index a96f8c7..980498b 100644
--- a/src/main/java/org/apache/tomee/website/AbstractDownloadsNG.java
+++ b/src/main/java/org/apache/tomee/website/AbstractDownloadsNG.java
@@ -1,7 +1,5 @@
package org.apache.tomee.website;
-import lombok.Data;
-import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.text.WordUtils;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
@@ -36,11 +34,12 @@ import java.util.stream.Collectors;
import static java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME;
import static java.util.Optional.ofNullable;
import static java.util.stream.Collectors.toList;
-import static lombok.AccessLevel.PROTECTED;
-@RequiredArgsConstructor(access = PROTECTED)
public class AbstractDownloadsNG {
+ protected AbstractDownloadsNG() {
+ }
+
private static final long MEGA_RATIO = 1024 * 1024;
protected static final String BASE_URL = "https://downloads.apache.org/tomee/";
protected static final String ARCHIVE_BASE_URL = "https://archive.apache.org/dist/tomee/";
@@ -278,7 +277,6 @@ public class AbstractDownloadsNG {
return t -> seen.add(keyExtractor.apply(t));
}
- @Data
public static class Download {
private final String name;
private final String version;
@@ -291,6 +289,36 @@ public class AbstractDownloadsNG {
private String mirrorUrl;
private String date = "Wed, 05 Aug 2020 16:26:51 GMT";
private long size = 10;
+
+ public Download(final String name, final String version, final String format, final String url,
+ final String sha1, final String sha256, final String sha512, final String asc) {
+ this.name = name;
+ this.version = version;
+ this.format = format;
+ this.url = url;
+ this.sha1 = sha1;
+ this.sha256 = sha256;
+ this.sha512 = sha512;
+ this.asc = asc;
+ }
+
+ public String getName() { return name; }
+ public String getVersion() { return version; }
+ public String getFormat() { return format; }
+ public String getUrl() { return url; }
+ public String getSha1() { return sha1; }
+ public String getSha256() { return sha256; }
+ public String getSha512() { return sha512; }
+ public String getAsc() { return asc; }
+
+ public String getMirrorUrl() { return mirrorUrl; }
+ public void setMirrorUrl(final String mirrorUrl) { this.mirrorUrl = mirrorUrl; }
+
+ public String getDate() { return date; }
+ public void setDate(final String date) { this.date = date; }
+
+ public long getSize() { return size; }
+ public void setSize(final long size) { this.size = size; }
}
private static class QuickDistLinkParser {
@@ -348,11 +376,7 @@ public class AbstractDownloadsNG {
}
}
- @Data
- public static class Results {
- private final String baseUrl;
- private final List<Link> links;
-
+ public record Results(String baseUrl, List<Link> links) {
@Override
public String toString() {
return String.format("Results{ %s: %d links }",
diff --git a/src/main/java/org/apache/tomee/website/Downloads.java b/src/main/java/org/apache/tomee/website/Downloads.java
index 20f940f..fc8c353 100755
--- a/src/main/java/org/apache/tomee/website/Downloads.java
+++ b/src/main/java/org/apache/tomee/website/Downloads.java
@@ -1,8 +1,5 @@
package org.apache.tomee.website;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.text.WordUtils;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
@@ -30,11 +27,12 @@ import static java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME;
import static java.util.Arrays.asList;
import static java.util.Optional.ofNullable;
import static java.util.stream.Collectors.toList;
-import static lombok.AccessLevel.PRIVATE;
// regenerate when needed only, useless to do it for any site update
-@RequiredArgsConstructor(access = PRIVATE)
public class Downloads {
+
+ private Downloads() {
+ }
private static final SAXParserFactory FACTORY = SAXParserFactory.newInstance();
private static final String MVN_BASE = "https://repo.maven.apache.org/maven2/";
private static final long MEGA_RATIO = 1024 * 1024;
@@ -235,13 +233,17 @@ public class Downloads {
}
}
- @AllArgsConstructor
public static class Version {
private final String base;
private final String version;
private final Collection<String> classifiers = new ArrayList<>();
private final Collection<String> extensions = new ArrayList<>();
+ public Version(final String base, final String version) {
+ this.base = base;
+ this.version = version;
+ }
+
private Version extensions(final String... values) {
extensions.addAll(asList(values));
return this;
@@ -253,13 +255,9 @@ public class Downloads {
}
}
- @Data
- public static class ArtifactDescription {
- private final String classifier;
- private final String extension;
+ public record ArtifactDescription(String classifier, String extension) {
}
- @Data
public static class Download {
private final String name;
private final String classifier;
@@ -271,6 +269,33 @@ public class Downloads {
private final String asc;
private String date;
private long size;
+
+ public Download(final String name, final String classifier, final String version, final String format,
+ final String url, final String md5, final String sha1, final String asc) {
+ this.name = name;
+ this.classifier = classifier;
+ this.version = version;
+ this.format = format;
+ this.url = url;
+ this.md5 = md5;
+ this.sha1 = sha1;
+ this.asc = asc;
+ }
+
+ public String getName() { return name; }
+ public String getClassifier() { return classifier; }
+ public String getVersion() { return version; }
+ public String getFormat() { return format; }
+ public String getUrl() { return url; }
+ public String getMd5() { return md5; }
+ public String getSha1() { return sha1; }
+ public String getAsc() { return asc; }
+
+ public String getDate() { return date; }
+ public void setDate(final String date) { this.date = date; }
+
+ public long getSize() { return size; }
+ public void setSize(final long size) { this.size = size; }
}
private static class QuickMvnMetadataParser extends DefaultHandler {
diff --git a/src/main/java/org/apache/tomee/website/DownloadsNG.java b/src/main/java/org/apache/tomee/website/DownloadsNG.java
index 1cbeab8..e037c85 100644
--- a/src/main/java/org/apache/tomee/website/DownloadsNG.java
+++ b/src/main/java/org/apache/tomee/website/DownloadsNG.java
@@ -1,16 +1,10 @@
package org.apache.tomee.website;
-import lombok.RequiredArgsConstructor;
-import org.apache.tika.exception.TikaException;
-import org.xml.sax.SAXException;
-
-import java.io.IOException;
-
-import static lombok.AccessLevel.PUBLIC;
-
-@RequiredArgsConstructor(access = PUBLIC)
public class DownloadsNG extends AbstractDownloadsNG {
+ public DownloadsNG() {
+ }
+
public static void main(final String[] args) throws Exception {
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "512");
diff --git a/src/main/java/org/apache/tomee/website/GitHubContributors.java b/src/main/java/org/apache/tomee/website/GitHubContributors.java
index 075a0e1..f26d53c 100644
--- a/src/main/java/org/apache/tomee/website/GitHubContributors.java
+++ b/src/main/java/org/apache/tomee/website/GitHubContributors.java
@@ -1,6 +1,5 @@
package org.apache.tomee.website;
-import lombok.Data;
import org.json.JSONArray;
import org.json.JSONObject;
import org.tomitribe.util.IO;
@@ -58,14 +57,7 @@ public class GitHubContributors {
return contributorList;
}
- @Data
- public static class Contributor {
- private final String id;
- private final String name;
- private final String avatar;
- private final String url;
- private final long contributions;
-
+ public record Contributor(String id, String name, String avatar, String url, long contributions) {
@Override
public String toString() {
return name + " | " + url + " | " + avatar;
diff --git a/src/main/java/org/apache/tomee/website/GroupedIndex.java b/src/main/java/org/apache/tomee/website/GroupedIndex.java
index 45bdab6..43099a2 100644
--- a/src/main/java/org/apache/tomee/website/GroupedIndex.java
+++ b/src/main/java/org/apache/tomee/website/GroupedIndex.java
@@ -16,9 +16,12 @@
*/
package org.apache.tomee.website;
-import org.apache.commons.configuration.CompositeConfiguration;
+import org.apache.commons.configuration.ConfigurationException;
import org.apache.openejb.loader.IO;
import org.jbake.app.Parser;
+import org.jbake.app.configuration.ConfigUtil;
+import org.jbake.app.configuration.DefaultJBakeConfiguration;
+import org.jbake.app.configuration.JBakeConfiguration;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -249,7 +252,19 @@ public class GroupedIndex {
public Doc parse(final File file) {
- final Parser parser = new Parser(new CompositeConfiguration(), file.getAbsolutePath());
+ // ConfigUtil.loadConfig pulls JBake's bundled default.properties (so destination.folder
+ // and friends are populated). Parser.processFile only reads headers; the destination is
+ // never used, but JBake's DefaultJBakeConfiguration constructor invokes setupPaths()
+ // which NPEs without those defaults.
+ final File parent = file.getParentFile();
+ final JBakeConfiguration config;
+ try {
+ config = new ConfigUtil().loadConfig(parent);
+ ((DefaultJBakeConfiguration) config).setDestinationFolder(parent);
+ } catch (ConfigurationException e) {
+ throw new RuntimeException("Unable to load JBake configuration for " + file, e);
+ }
+ final Parser parser = new Parser(config);
final Map<String, Object> map = parser.processFile(file);
if (map == null) {
diff --git a/src/main/java/org/apache/tomee/website/JBake.java b/src/main/java/org/apache/tomee/website/JBake.java
index ca81a5f..9043196 100755
--- a/src/main/java/org/apache/tomee/website/JBake.java
+++ b/src/main/java/org/apache/tomee/website/JBake.java
@@ -1,8 +1,6 @@
package org.apache.tomee.website;
import com.orientechnologies.orient.core.Orient;
-import lombok.RequiredArgsConstructor;
-import org.apache.commons.configuration.CompositeConfiguration;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.FileFileFilter;
@@ -10,8 +8,9 @@ import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.tomee.embedded.Configuration;
import org.apache.tomee.embedded.Container;
-import org.jbake.app.ConfigUtil;
import org.jbake.app.Oven;
+import org.jbake.app.configuration.JBakeConfiguration;
+import org.jbake.app.configuration.JBakeConfigurationFactory;
import java.io.File;
import java.io.FileFilter;
@@ -30,10 +29,12 @@ import java.util.stream.Stream;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;
-import static lombok.AccessLevel.PRIVATE;
-@RequiredArgsConstructor(access = PRIVATE)
public class JBake {
+
+ private JBake() {
+ }
+
public static void main(final String[] args) throws Exception {
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "64"); // try to have parallelStream better than default
@@ -72,10 +73,9 @@ public class JBake {
try {
orient.startup();
- final Oven oven = new Oven(sources.getJbake(), destination, new CompositeConfiguration() {{
- addConfiguration(ConfigUtil.load(sources.getJbake()));
- }}, true);
- oven.setupPaths();
+ final JBakeConfiguration config = new JBakeConfigurationFactory()
+ .createDefaultJbakeConfiguration(sources.getJbake(), destination, true);
+ final Oven oven = new Oven(config);
System.out.println(" > baking");
oven.bake();
diff --git a/src/main/java/org/apache/tomee/website/JavadocSource.java b/src/main/java/org/apache/tomee/website/JavadocSource.java
index 2045240..a47f1e0 100644
--- a/src/main/java/org/apache/tomee/website/JavadocSource.java
+++ b/src/main/java/org/apache/tomee/website/JavadocSource.java
@@ -16,16 +16,11 @@
*/
package org.apache.tomee.website;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
import java.io.File;
+import java.util.Objects;
-@Data
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class JavadocSource {
- @EqualsAndHashCode.Include
private final String className;
private final File sourceFile;
@@ -35,4 +30,29 @@ public class JavadocSource {
.replaceAll("\\.java$", "")
.replace("/", ".");
}
+
+ public String getClassName() {
+ return className;
+ }
+
+ public File getSourceFile() {
+ return sourceFile;
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) return true;
+ if (!(o instanceof JavadocSource that)) return false;
+ return Objects.equals(className, that.className);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(className);
+ }
+
+ @Override
+ public String toString() {
+ return "JavadocSource(className=" + className + ", sourceFile=" + sourceFile + ")";
+ }
}
diff --git a/src/main/java/org/apache/tomee/website/Javadocs.java b/src/main/java/org/apache/tomee/website/Javadocs.java
index 2040a41..200c0aa 100644
--- a/src/main/java/org/apache/tomee/website/Javadocs.java
+++ b/src/main/java/org/apache/tomee/website/Javadocs.java
@@ -16,7 +16,6 @@
*/
package org.apache.tomee.website;
-import lombok.Data;
import org.apache.openejb.loader.Files;
import org.apache.openejb.loader.IO;
import org.apache.openejb.util.Join;
@@ -170,11 +169,7 @@ public class Javadocs {
return content.modified(content.content.replace("</head>", link + "</head>"));
}
- @Data
- @lombok.AllArgsConstructor
- private static class Content {
- private final File file;
- private final String content;
+ private record Content(File file, String content) {
public Content modified(final String newContent) {
return new Content(file, newContent);
diff --git a/src/main/java/org/apache/tomee/website/LearningLinks.java b/src/main/java/org/apache/tomee/website/LearningLinks.java
index 3a80238..8e69ba3 100644
--- a/src/main/java/org/apache/tomee/website/LearningLinks.java
+++ b/src/main/java/org/apache/tomee/website/LearningLinks.java
@@ -17,21 +17,25 @@
package org.apache.tomee.website;
import org.apache.openejb.loader.IO;
-import org.tomitribe.tio.Dir;
-import org.tomitribe.tio.Match;
-import org.tomitribe.tio.lang.JvmLang;
+import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
+import java.util.Set;
import java.util.function.Function;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -222,22 +226,38 @@ public class LearningLinks {
}
}
+ private static final Pattern IMPORT_PATTERN =
+ Pattern.compile("^\\s*import\\s+(?:static\\s+)?([\\w.$]+)\\s*;");
+
/**
- * Walk over every file in the example directory and look for import statements.
- *
- * Collect each statement and return a unique list of the class names
- * referenced by each import statement.
+ * Walk over every .java file in the example directory and collect a unique list
+ * of class names referenced by `import` statements.
*/
private List<String> getImports(final Example example) {
- final Dir dir = Dir.from(example.getSrcReadme().getParentFile());
+ final Path root = example.getSrcReadme().getParentFile().toPath();
+ final Set<String> imports = new LinkedHashSet<>();
+ try (Stream<Path> files = Files.walk(root)) {
+ files.filter(Files::isRegularFile)
+ .filter(p -> p.toString().endsWith(".java"))
+ .forEach(p -> collectImports(p, imports));
+ } catch (IOException e) {
+ throw new UncheckedIOException("Unable to walk " + root, e);
+ }
+ return new ArrayList<>(imports);
+ }
- // Unfiltered list of imported classes used in this example
- // This list will contain the class names themselves
- return dir.searchFiles()
- .flatMap(JvmLang.imports(dir))
- .map(Match::getMatch)
- .distinct()
- .collect(Collectors.toList());
+ private static void collectImports(final Path file, final Set<String> imports) {
+ try (BufferedReader reader = Files.newBufferedReader(file)) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ final Matcher m = IMPORT_PATTERN.matcher(line);
+ if (m.find()) {
+ imports.add(m.group(1));
+ }
+ }
+ } catch (IOException e) {
+ throw new UncheckedIOException("Unable to read " + file, e);
+ }
}
/**
diff --git a/src/main/java/org/apache/tomee/website/PDFify.java b/src/main/java/org/apache/tomee/website/PDFify.java
index b0a2a41..4a9ee42 100755
--- a/src/main/java/org/apache/tomee/website/PDFify.java
+++ b/src/main/java/org/apache/tomee/website/PDFify.java
@@ -16,7 +16,6 @@
*/
package org.apache.tomee.website;
-import lombok.RequiredArgsConstructor;
import org.asciidoctor.Asciidoctor;
import org.asciidoctor.AttributesBuilder;
@@ -32,11 +31,13 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
-import static lombok.AccessLevel.PRIVATE;
import static org.asciidoctor.OptionsBuilder.options;
-@RequiredArgsConstructor(access = PRIVATE)
public class PDFify {
+
+ private PDFify() {
+ }
+
public static void generatePdf(final File from, final File targetBase) throws IOException {
final Path sourceBase = from.toPath();
final Asciidoctor asciidoctor = Asciidoctor.Factory.create();
diff --git a/src/main/java/org/apache/tomee/website/contributors/Contributor.java b/src/main/java/org/apache/tomee/website/contributors/Contributor.java
index 0ff60aa..c200095 100644
--- a/src/main/java/org/apache/tomee/website/contributors/Contributor.java
+++ b/src/main/java/org/apache/tomee/website/contributors/Contributor.java
@@ -16,15 +16,10 @@
*/
package org.apache.tomee.website.contributors;
-import lombok.Builder;
-import lombok.Data;
-
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
-@Data
-@Builder
public class Contributor {
private String id;
private boolean committer;
@@ -33,6 +28,67 @@ public class Contributor {
private String avatar;
private Stats stats;
+ public Contributor() {
+ }
+
+ public Contributor(final String id, final boolean committer, final String name,
+ final String github, final String avatar, final Stats stats) {
+ this.id = id;
+ this.committer = committer;
+ this.name = name;
+ this.github = github;
+ this.avatar = avatar;
+ this.stats = stats;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ public boolean isCommitter() {
+ return committer;
+ }
+
+ public void setCommitter(final boolean committer) {
+ this.committer = committer;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public String getGithub() {
+ return github;
+ }
+
+ public void setGithub(final String github) {
+ this.github = github;
+ }
+
+ public String getAvatar() {
+ return avatar;
+ }
+
+ public void setAvatar(final String avatar) {
+ this.avatar = avatar;
+ }
+
+ public Stats getStats() {
+ return stats;
+ }
+
+ public void setStats(final Stats stats) {
+ this.stats = stats;
+ }
+
public Contributor add(final Contributor that) {
return new Contributor(id, committer, name, github, avatar, stats.add(that.stats));
}
@@ -57,5 +113,27 @@ public class Contributor {
.orElseThrow(IllegalStateException::new);
}
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public static class Builder {
+ private String id;
+ private boolean committer;
+ private String name;
+ private String github;
+ private String avatar;
+ private Stats stats;
+ public Builder id(final String id) { this.id = id; return this; }
+ public Builder committer(final boolean committer) { this.committer = committer; return this; }
+ public Builder name(final String name) { this.name = name; return this; }
+ public Builder github(final String github) { this.github = github; return this; }
+ public Builder avatar(final String avatar) { this.avatar = avatar; return this; }
+ public Builder stats(final Stats stats) { this.stats = stats; return this; }
+
+ public Contributor build() {
+ return new Contributor(id, committer, name, github, avatar, stats);
+ }
+ }
}
diff --git a/src/main/java/org/apache/tomee/website/contributors/ContributorData.java b/src/main/java/org/apache/tomee/website/contributors/ContributorData.java
index ccea200..dac4857 100644
--- a/src/main/java/org/apache/tomee/website/contributors/ContributorData.java
+++ b/src/main/java/org/apache/tomee/website/contributors/ContributorData.java
@@ -16,20 +16,9 @@
*/
package org.apache.tomee.website.contributors;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
import javax.json.bind.annotation.JsonbProperty;
import java.util.List;
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class ContributorData {
@JsonbProperty("total")
@@ -41,6 +30,18 @@ public class ContributorData {
@JsonbProperty("weeks")
private List<Week> weeks;
+ public ContributorData() {
+ }
+
+ public int getTotal() { return total; }
+ public void setTotal(final int total) { this.total = total; }
+
+ public Author getAuthor() { return author; }
+ public void setAuthor(final Author author) { this.author = author; }
+
+ public List<Week> getWeeks() { return weeks; }
+ public void setWeeks(final List<Week> weeks) { this.weeks = weeks; }
+
public Stats getStats() {
return weeks.stream()
.map(week -> new Stats(week.c, week.a, week.d))
@@ -63,11 +64,6 @@ public class ContributorData {
.build();
}
- @Data
- @NoArgsConstructor
- @AllArgsConstructor
- @Builder
- @EqualsAndHashCode(onlyExplicitlyIncluded = true)
public static class Author {
@JsonbProperty("id")
private int id;
@@ -83,13 +79,26 @@ public class ContributorData {
@JsonbProperty("hovercard_url")
private String hovercardUrl;
+
+ public Author() {
+ }
+
+ public int getId() { return id; }
+ public void setId(final int id) { this.id = id; }
+
+ public String getLogin() { return login; }
+ public void setLogin(final String login) { this.login = login; }
+
+ public String getAvatar() { return avatar; }
+ public void setAvatar(final String avatar) { this.avatar = avatar; }
+
+ public String getPath() { return path; }
+ public void setPath(final String path) { this.path = path; }
+
+ public String getHovercardUrl() { return hovercardUrl; }
+ public void setHovercardUrl(final String hovercardUrl) { this.hovercardUrl = hovercardUrl; }
}
- @Data
- @NoArgsConstructor
- @AllArgsConstructor
- @Builder
- @EqualsAndHashCode(onlyExplicitlyIncluded = true)
public static class Week {
@JsonbProperty("w")
private long w;
@@ -102,5 +111,20 @@ public class ContributorData {
@JsonbProperty("c")
private int c;
+
+ public Week() {
+ }
+
+ public long getW() { return w; }
+ public void setW(final long w) { this.w = w; }
+
+ public int getA() { return a; }
+ public void setA(final int a) { this.a = a; }
+
+ public int getD() { return d; }
+ public void setD(final int d) { this.d = d; }
+
+ public int getC() { return c; }
+ public void setC(final int c) { this.c = c; }
}
}
diff --git a/src/main/java/org/apache/tomee/website/contributors/Stats.java b/src/main/java/org/apache/tomee/website/contributors/Stats.java
index 447c7e0..b4831ef 100644
--- a/src/main/java/org/apache/tomee/website/contributors/Stats.java
+++ b/src/main/java/org/apache/tomee/website/contributors/Stats.java
@@ -16,23 +16,12 @@
*/
package org.apache.tomee.website.contributors;
-import lombok.Data;
-
/**
* We add a contributor's commits, lines added and lines removed together
* across all repos to create an overall score that is used to sort contributors.
*/
-@Data
-@lombok.Builder(builderClassName = "Builder", toBuilder = true)
-public class Stats {
- private final int commits;
- private final int linesAdded;
- private final int linesRemoved;
+public record Stats(int commits, int linesAdded, int linesRemoved) {
- /**
- * Aggregate the stats from one git repo with the same
- * contributors stats on another repo
- */
public Stats add(final Stats that) {
return new Stats(
this.commits + that.commits,
@@ -63,4 +52,16 @@ public class Stats {
return (int) Math.round(average * 1000000);
}
+
+ public int getCommits() {
+ return commits;
+ }
+
+ public int getLinesAdded() {
+ return linesAdded;
+ }
+
+ public int getLinesRemoved() {
+ return linesRemoved;
+ }
}