You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by vy...@apache.org on 2023/01/09 08:14:40 UTC

[logging-log4j-tools] branch master updated (ab862e9 -> 72f8559)

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

vy pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j-tools.git


    from ab862e9  Bump actions/checkout from 3.2.0 to 3.3.0 (#11)
     new ec06e21  Nullability and cosmetic changes
     new d088427  Set `revision` back to 0.1.0-SNAPSHOT
     new 72f8559  Add `RELEASING.adoc`

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 RELEASING.adoc                                     | 59 ++++++++++++++++++++++
 .../logging/log4j/changelog/ChangelogEntry.java    | 21 ++++----
 .../logging/log4j/changelog/ChangelogFiles.java    |  7 ++-
 .../logging/log4j/changelog/ChangelogRelease.java  | 20 +-------
 .../changelog/exporter/ChangelogExporter.java      | 42 +++++++--------
 .../log4j/changelog/exporter/FreeMarkerUtils.java  |  9 ++--
 .../log4j/changelog/importer/MavenChanges.java     | 40 +++++++++------
 .../changelog/importer/MavenChangesImporter.java   | 18 +++----
 .../changelog/releaser/ChangelogReleaser.java      | 39 +++++++-------
 .../log4j/changelog/util/AsciiDocUtils.java        | 40 ---------------
 .../logging/log4j/changelog/util/FileUtils.java    | 45 +++++++++--------
 .../log4j/changelog/util/PropertyUtils.java        |  3 ++
 .../logging/log4j/changelog/util/StringUtils.java  |  7 ++-
 .../logging/log4j/changelog/util/XmlReader.java    |  4 +-
 .../logging/log4j/changelog/util/XmlWriter.java    | 14 ++---
 pom.xml                                            |  2 +-
 16 files changed, 199 insertions(+), 171 deletions(-)
 create mode 100644 RELEASING.adoc
 delete mode 100644 log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/AsciiDocUtils.java


[logging-log4j-tools] 02/03: Set `revision` back to 0.1.0-SNAPSHOT

Posted by vy...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

vy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j-tools.git

commit d088427fc130755b693ec8729f00f1249701556f
Author: Volkan Yazıcı <vo...@yazi.ci>
AuthorDate: Sun Jan 8 20:13:03 2023 +0100

    Set `revision` back to 0.1.0-SNAPSHOT
---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 400c3af..c7c76fa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,7 +54,7 @@
   <properties>
 
     <!-- project version -->
-    <revision>0.1.0</revision>
+    <revision>0.1.0-SNAPSHOT</revision>
 
     <!-- `minimalJavaBuildVersion` is employed by `org.apache:apache`, which is the parent of `org.apache.logging:logging-parent`, which is the parent of us.
          `minimalJavaBuildVersion` is used for enforcing the compiler version.


[logging-log4j-tools] 03/03: Add `RELEASING.adoc`

Posted by vy...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

vy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j-tools.git

commit 72f85597f2aafb374c01c0ac38d0757e0f7f0379
Author: Volkan Yazıcı <vo...@yazi.ci>
AuthorDate: Mon Jan 9 09:15:27 2023 +0100

    Add `RELEASING.adoc`
---
 RELEASING.adoc | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 59 insertions(+)

diff --git a/RELEASING.adoc b/RELEASING.adoc
new file mode 100644
index 0000000..065744e
--- /dev/null
+++ b/RELEASING.adoc
@@ -0,0 +1,59 @@
+////
+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
+
+    https://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.
+////
+
+= Release process
+
+[WARNING]
+====
+In the code examples below, assuming the version to be released is `7.8.0`.
+====
+
+== Stage the release artifacts
+
+. Checkout the release branch: `git checkout -B release/7.8.0 origin/master`
+. Perform and commit following changes:
+.. Set the `revision` property to `7.8.0` in xref:pom.xml[`pom.xml`]
+.. Update the version and date in xref:CHANGELOG.adoc[`CHANGELOG.adoc`]
+. Make sure that `./mvnw clean verify` succeeds – if not, commit necessary fixes
+. Push the `release/7.8.0` branch
+. Make sure the associated https://github.com/apache/logging-log4j-tools/actions[GitHub Actions workflow] succeeds:
+.. **Signed artifacts** are uploaded to the _Staging Repositories_ in https://repository.apache.org/[repository.apache.org]
+.. **Signed sources** are uploaded as GitHub Actions workflow artifacts
+
++
+If not, commit necessary fixes, push, and repeat.
+. _Close_ the repository in https://repository.apache.org/[repository.apache.org]
+. Commit _the signed sources_ (e.g., `apache-log4j-tools-7.8.0-src.zip` and `apache-log4j-tools-7.8.0-src.zip.asc`) to https://dist.apache.org/repos/dist/dev/logging/log4j[dist.apache.org/repos/dist/**dev**/logging/log4j] Subversion repository
+
+== Vote the release
+
+Collect release votes via email to `dev@logging.apache.org`
+
+== Publish the release
+
+. _Release_ the repository in https://repository.apache.org/[repository.apache.org]
+. In https://dist.apache.org/repos/dist/release/logging/log4j[dist.apache.org/repos/dist] Subversion repository,
+.. move the signed sources from `*dev*/logging/log4j` directory to `*release*/logging/log4j`
+.. delete files from an earlier release
+.. commit changes
+. Merge `release/7.8.0` changes to `master`
+. Set the revision property to the next development version (e.g., `7.9.0-SNAPSHOT`) in xref:pom.xml[`pom.xml`]
+. Update xref:CHANGELOG.adoc[`CHANGELOG.adoc`] accordingly
+. Push the `master` branch
+. Once the artifacts are visible in https://central.sonatype.dev/[central.sonatype.dev], https://github.com/apache/logging-log4j-tools/releases/new[create a new release in GitHub]
+.. Use the `v7.8.0` tag created by the GitHub Actions workflow
+.. Copy necessary changes from xref:CHANGELOG.adoc[`CHANGELOG.adoc`] (formatting needs to be converted to Markdown!)


[logging-log4j-tools] 01/03: Nullability and cosmetic changes

Posted by vy...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

vy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j-tools.git

commit ec06e2147b15f620e8d5465f9f4eeae0e7020e76
Author: Volkan Yazıcı <vo...@yazi.ci>
AuthorDate: Sat Jan 7 21:57:12 2023 +0100

    Nullability and cosmetic changes
---
 .../logging/log4j/changelog/ChangelogEntry.java    | 21 +++++-----
 .../logging/log4j/changelog/ChangelogFiles.java    |  7 ++--
 .../logging/log4j/changelog/ChangelogRelease.java  | 20 +---------
 .../changelog/exporter/ChangelogExporter.java      | 42 ++++++++++----------
 .../log4j/changelog/exporter/FreeMarkerUtils.java  |  9 +++--
 .../log4j/changelog/importer/MavenChanges.java     | 40 +++++++++++--------
 .../changelog/importer/MavenChangesImporter.java   | 18 ++++-----
 .../changelog/releaser/ChangelogReleaser.java      | 39 ++++++++++---------
 .../log4j/changelog/util/AsciiDocUtils.java        | 40 -------------------
 .../logging/log4j/changelog/util/FileUtils.java    | 45 ++++++++++++----------
 .../log4j/changelog/util/PropertyUtils.java        |  3 ++
 .../logging/log4j/changelog/util/StringUtils.java  |  7 +++-
 .../logging/log4j/changelog/util/XmlReader.java    |  4 +-
 .../logging/log4j/changelog/util/XmlWriter.java    | 14 ++++---
 14 files changed, 139 insertions(+), 170 deletions(-)

diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/ChangelogEntry.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/ChangelogEntry.java
index df2d7a8..6d2b239 100644
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/ChangelogEntry.java
+++ b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/ChangelogEntry.java
@@ -25,6 +25,7 @@ import org.apache.logging.log4j.changelog.util.StringUtils;
 import org.apache.logging.log4j.changelog.util.XmlReader;
 import org.apache.logging.log4j.changelog.util.XmlWriter;
 
+import edu.umd.cs.findbugs.annotations.Nullable;
 import org.w3c.dom.Element;
 
 public final class ChangelogEntry {
@@ -115,12 +116,12 @@ public final class ChangelogEntry {
     public void writeToXmlFile(final Path path) {
         XmlWriter.toFile(path, document -> {
 
-            // Create the `entry` root element.
+            // Create the `entry` root element
             final Element entryElement = document.createElement("entry");
             entryElement.setAttribute("type", type.toXmlAttribute());
             document.appendChild(entryElement);
 
-            // Create the `issue` elements.
+            // Create the `issue` elements
             issues.forEach(issue -> {
                 final Element issueElement = document.createElement("issue");
                 issueElement.setAttribute("id", issue.id);
@@ -128,7 +129,7 @@ public final class ChangelogEntry {
                 entryElement.appendChild(issueElement);
             });
 
-            // Create the `author` elements.
+            // Create the `author` elements
             authors.forEach(author -> {
                 final Element authorElement = document.createElement("author");
                 if (author.id != null) {
@@ -139,7 +140,7 @@ public final class ChangelogEntry {
                 entryElement.appendChild(authorElement);
             });
 
-            // Create the `description` element.
+            // Create the `description` element
             final Element descriptionElement = document.createElement("description");
             if (description.format != null) {
                 descriptionElement.setAttribute("format", description.format);
@@ -152,7 +153,7 @@ public final class ChangelogEntry {
 
     public static ChangelogEntry readFromXmlFile(final Path path) {
 
-        // Read the `entry` root element.
+        // Read the `entry` root element
         final Element entryElement = XmlReader.readXmlFileRootElement(path, "entry");
         final String typeAttribute = XmlReader.requireAttribute(entryElement, "type");
         final Type type;
@@ -162,7 +163,7 @@ public final class ChangelogEntry {
             throw XmlReader.failureAtXmlNode(error, entryElement, "`type` attribute read failure");
         }
 
-        // Read the `issue` elements.
+        // Read the `issue` elements
         final List<Issue> issues = XmlReader
                 .findChildElementsMatchingName(entryElement, "issue")
                 .map(issueElement -> {
@@ -172,13 +173,15 @@ public final class ChangelogEntry {
                 })
                 .collect(Collectors.toList());
 
-        // Read the `author` elements.
+        // Read the `author` elements
         final List<Author> authors = XmlReader
                 .findChildElementsMatchingName(entryElement, "author")
                 .map(authorElement -> {
+                    @Nullable
                     final String authorId = authorElement.hasAttribute("id")
                             ? authorElement.getAttribute("id")
                             : null;
+                    @Nullable
                     final String authorName = authorElement.hasAttribute("name")
                             ? authorElement.getAttribute("name")
                             : null;
@@ -193,13 +196,13 @@ public final class ChangelogEntry {
             throw XmlReader.failureAtXmlNode(entryElement, "no `author` elements found");
         }
 
-        // Read the `description` element.
+        // Read the `description` element
         final Element descriptionElement = XmlReader.requireChildElementMatchingName(entryElement, "description");
         final String descriptionFormat = XmlReader.requireAttribute(descriptionElement, "format");
         final String descriptionText = StringUtils.trimNullable(descriptionElement.getTextContent());
         final Description description = new Description(descriptionFormat, descriptionText);
 
-        // Create the instance.
+        // Create the instance
         return new ChangelogEntry(type, issues, authors, description);
 
     }
diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/ChangelogFiles.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/ChangelogFiles.java
index 80bb697..df35b37 100644
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/ChangelogFiles.java
+++ b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/ChangelogFiles.java
@@ -35,11 +35,10 @@ public final class ChangelogFiles {
     }
 
     public static Set<Integer> unreleasedDirectoryVersionMajors(final Path changelogDirectory) {
-        return FileUtils
-                .findAdjacentFiles(changelogDirectory, false)
+        return FileUtils.findAdjacentFiles(changelogDirectory, false, paths -> paths
                 .flatMap(path -> {
 
-                    // Only select directories matching with the `^\.(\d+)\.x\.x$` pattern.
+                    // Only select directories matching with the `^\.(\d+)\.x\.x$` pattern
                     final Pattern versionPattern = Pattern.compile("^\\.(\\d+)\\.x\\.x$");
                     final Matcher versionMatcher = versionPattern.matcher(path.getFileName().toString());
                     if (!versionMatcher.matches()) {
@@ -50,7 +49,7 @@ public final class ChangelogFiles {
                     return Stream.of(versionMajor);
 
                 })
-                .collect(Collectors.toSet());
+                .collect(Collectors.toSet()));
     }
 
     public static Path indexTemplateFile(final Path changelogDirectory) {
diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/ChangelogRelease.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/ChangelogRelease.java
index 73df71a..2369ba7 100644
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/ChangelogRelease.java
+++ b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/ChangelogRelease.java
@@ -18,7 +18,6 @@ package org.apache.logging.log4j.changelog;
 
 import java.nio.file.Path;
 
-import org.apache.logging.log4j.changelog.util.StringUtils;
 import org.apache.logging.log4j.changelog.util.XmlReader;
 import org.apache.logging.log4j.changelog.util.XmlWriter;
 
@@ -45,25 +44,10 @@ public final class ChangelogRelease {
     }
 
     public static ChangelogRelease readFromXmlFile(final Path path) {
-
-        // Read the XML file.
         final Element releaseElement = XmlReader.readXmlFileRootElement(path, "release");
-
-        // Read the `version` attribute.
-        final String version = StringUtils.trimNullable(releaseElement.getAttribute("version"));
-        if (version == null) {
-            throw new IllegalArgumentException("blank or missing attribute: `version`");
-        }
-
-        // Read the `date` attribute.
-        final String date = StringUtils.trimNullable(releaseElement.getAttribute("date"));
-        if (date == null) {
-            throw new IllegalArgumentException("blank or missing attribute: `date`");
-        }
-
-        // Create the instance.
+        final String version = XmlReader.requireAttribute(releaseElement, "version");
+        final String date = XmlReader.requireAttribute(releaseElement, "date");
         return new ChangelogRelease(version, date);
-
     }
 
 }
diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/exporter/ChangelogExporter.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/exporter/ChangelogExporter.java
index 2b04029..1ea18de 100644
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/exporter/ChangelogExporter.java
+++ b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/exporter/ChangelogExporter.java
@@ -34,22 +34,25 @@ public final class ChangelogExporter {
 
     public static void main(final String[] mainArgs) {
 
-        // Read arguments.
+        // Read arguments
         final ChangelogExporterArgs args = ChangelogExporterArgs.fromSystemProperties();
 
-        // Find release directories.
+        // Find release directories
         final List<Path> releaseDirectories = FileUtils
-                .findAdjacentFiles(args.changelogDirectory, true)
-                .filter(file -> file.toFile().isDirectory())
-                .sorted(Comparator.comparing(releaseDirectory -> {
-                    final Path releaseXmlFile = ChangelogFiles.releaseXmlFile(releaseDirectory);
-                    final ChangelogRelease changelogRelease = ChangelogRelease.readFromXmlFile(releaseXmlFile);
-                    return changelogRelease.date;
-                }))
-                .collect(Collectors.toList());
+                .findAdjacentFiles(
+                        args.changelogDirectory, true,
+                        paths -> paths
+                                .filter(file -> file.toFile().isDirectory())
+                                .sorted(Comparator.comparing(releaseDirectory -> {
+                                    final Path releaseXmlFile = ChangelogFiles.releaseXmlFile(releaseDirectory);
+                                    final ChangelogRelease changelogRelease =
+                                            ChangelogRelease.readFromXmlFile(releaseXmlFile);
+                                    return changelogRelease.date;
+                                }))
+                                .collect(Collectors.toList()));
         final int releaseDirectoryCount = releaseDirectories.size();
 
-        // Read the release information files.
+        // Read the release information files
         final List<ChangelogRelease> changelogReleases = releaseDirectories
                 .stream()
                 .map(releaseDirectory -> {
@@ -58,10 +61,10 @@ public final class ChangelogExporter {
                 })
                 .collect(Collectors.toList());
 
-        // Export releases.
+        // Export releases
         if (releaseDirectoryCount > 0) {
 
-            // Export each release directory.
+            // Export each release directory
             for (int releaseIndex = 0; releaseIndex < releaseDirectories.size(); releaseIndex++) {
                 final Path releaseDirectory = releaseDirectories.get(releaseIndex);
                 final ChangelogRelease changelogRelease = changelogReleases.get(releaseIndex);
@@ -79,7 +82,7 @@ public final class ChangelogExporter {
                 }
             }
 
-            // Report the operation.
+            // Report the operation
             if (releaseDirectoryCount == 1) {
                 System.out.format("exported a single release directory: `%s`%n", releaseDirectories.get(0));
             } else {
@@ -91,7 +94,7 @@ public final class ChangelogExporter {
 
         }
 
-        // Export unreleased.
+        // Export unreleased
         ChangelogFiles
                 .unreleasedDirectoryVersionMajors(args.changelogDirectory)
                 .stream()
@@ -111,7 +114,7 @@ public final class ChangelogExporter {
                     changelogReleases.add(upcomingRelease);
                 });
 
-        // Export the release index.
+        // Export the release index
         final Path changelogIndexTemplateFile = ChangelogFiles.indexTemplateFile(args.changelogDirectory);
         exportIndex(args.outputDirectory, changelogReleases, changelogIndexTemplateFile);
 
@@ -133,8 +136,7 @@ public final class ChangelogExporter {
 
     private static Map<ChangelogEntry.Type, List<ChangelogEntry>> readChangelogEntriesByType(
             final Path releaseDirectory) {
-        return FileUtils
-                .findAdjacentFiles(releaseDirectory, true)
+        return FileUtils.findAdjacentFiles(releaseDirectory, true, stream -> stream
                 // Sorting is needed to generate the same output between different runs
                 .sorted()
                 .map(ChangelogEntry::readFromXmlFile)
@@ -142,7 +144,7 @@ public final class ChangelogExporter {
                         changelogEntry -> changelogEntry.type,
                         // A sorted map is needed to generate the same output between different runs
                         TreeMap::new,
-                        Collectors.toList()));
+                        Collectors.toList())));
     }
 
     private static void exportRelease(
@@ -187,7 +189,7 @@ public final class ChangelogExporter {
     }
 
     private static String releaseChangelogFileName(final ChangelogRelease changelogRelease) {
-        // Using only the version (that is, avoiding the date) in the filename so that one can determine the link to the changelog of a particular release with only version information.
+        // Using only the version (that is, avoiding the date) in the filename so that one can determine the link to the changelog of a particular release with only version information
         return String.format("%s.adoc", changelogRelease.version);
     }
 
diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/exporter/FreeMarkerUtils.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/exporter/FreeMarkerUtils.java
index 8feed61..9deafcd 100644
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/exporter/FreeMarkerUtils.java
+++ b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/exporter/FreeMarkerUtils.java
@@ -38,17 +38,18 @@ final class FreeMarkerUtils {
 
     @SuppressFBWarnings("DMI_HARDCODED_ABSOLUTE_FILENAME")
     private static Configuration createConfiguration() {
-        Configuration configuration = new Configuration(Configuration.VERSION_2_3_29);
+        final Configuration configuration = new Configuration(Configuration.VERSION_2_3_29);
         configuration.setDefaultEncoding(CharsetUtils.CHARSET_NAME);
         configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
         try {
             configuration.setTemplateLoader(new FileTemplateLoader(new File("/")));
-        } catch (IOException error) {
+        } catch (final IOException error) {
             throw new UncheckedIOException(error);
         }
-        DefaultObjectWrapperBuilder objectWrapperBuilder = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_27);
+        final DefaultObjectWrapperBuilder objectWrapperBuilder =
+                new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_27);
         objectWrapperBuilder.setExposeFields(true);
-        DefaultObjectWrapper objectWrapper = objectWrapperBuilder.build();
+        final DefaultObjectWrapper objectWrapper = objectWrapperBuilder.build();
         configuration.setObjectWrapper(objectWrapper);
         configuration.setLogTemplateExceptions(false);
         configuration.setWrapUncheckedExceptions(true);
diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/importer/MavenChanges.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/importer/MavenChanges.java
index 4a2d579..1633186 100644
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/importer/MavenChanges.java
+++ b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/importer/MavenChanges.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.apache.logging.log4j.changelog.util.XmlReader;
 
+import edu.umd.cs.findbugs.annotations.Nullable;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
@@ -42,13 +43,13 @@ final class MavenChanges {
 
     static MavenChanges readFromFile(final Path file) {
 
-        // Read the root element.
+        // Read the root element
         final Element documentElement = readXmlFileRootElement(file, "document");
 
-        // Read the `body` element.
+        // Read the `body` element
         final Element bodyElement = XmlReader.requireChildElementMatchingName(documentElement, "body");
 
-        // Read releases.
+        // Read releases
         final List<Release> releases = new ArrayList<>();
         final NodeList releaseNodes = bodyElement.getChildNodes();
         final int releaseNodeCount = releaseNodes.getLength();
@@ -61,7 +62,7 @@ final class MavenChanges {
             }
         }
 
-        // Create the instance.
+        // Create the instance
         return new MavenChanges(releases);
 
     }
@@ -82,20 +83,20 @@ final class MavenChanges {
 
         private static Release fromElement(final Element element) {
 
-            // Read `version`.
+            // Read `version`
             final String version = trimNullable(element.getAttribute("version"));
             if (isBlank(version)) {
                 throw XmlReader.failureAtXmlNode(element, "blank attribute: `version`");
             }
 
-            // Read `date`.
+            // Read `date`
             final String date = trimNullable(element.getAttribute("date"));
             final String datePattern = "^(TBD|[0-9]{4}-[0-9]{2}-[0-9]{2})$";
             if (!date.matches(datePattern)) {
                 throw XmlReader.failureAtXmlNode(element, "`date` doesn't match with the `%s` pattern: `%s`", datePattern, date);
             }
 
-            // Read actions.
+            // Read actions
             final List<Action> actions = new ArrayList<>();
             final NodeList actionNodes = element.getChildNodes();
             final int actionNodeCount = actionNodes.getLength();
@@ -108,7 +109,7 @@ final class MavenChanges {
                 }
             }
 
-            // Create the instance.
+            // Create the instance
             return new Release(version, date, actions);
 
         }
@@ -122,12 +123,14 @@ final class MavenChanges {
 
     static final class Action {
 
+        @Nullable
         final String issue;
 
         final Type type;
 
         final String dev;
 
+        @Nullable
         final String dueTo;
 
         final String description;
@@ -135,10 +138,10 @@ final class MavenChanges {
         enum Type {ADD, FIX, UPDATE, REMOVE}
 
         private Action(
-                final String issue,
+                @Nullable final String issue,
                 final Type type,
                 final String dev,
-                final String dueTo,
+                @Nullable final String dueTo,
                 final String description) {
             this.issue = issue;
             this.type = type;
@@ -149,7 +152,8 @@ final class MavenChanges {
 
         private static Action fromElement(final Element element) {
 
-            // Read `issue`.
+            // Read `issue`
+            @Nullable
             String issue = trimNullable(element.getAttribute("issue"));
             final String issuePattern = "^LOG4J2-[0-9]+$";
             if (isBlank(issue)) {
@@ -158,7 +162,8 @@ final class MavenChanges {
                 throw XmlReader.failureAtXmlNode(element, "`issue` doesn't match with the `%s` pattern: `%s`", issuePattern, issue);
             }
 
-            // Read `type`.
+            // Read `type`
+            @Nullable
             final String typeString = trimNullable(element.getAttribute("type"));
             final Type type;
             if (isBlank(typeString)) {
@@ -171,25 +176,28 @@ final class MavenChanges {
                 }
             }
 
-            // Read `dev`.
+            // Read `dev`
+            @Nullable
             final String dev = trimNullable(element.getAttribute("dev"));
             if (isBlank(dev)) {
                 throw XmlReader.failureAtXmlNode(element, "blank attribute: `dev`");
             }
 
-            // Read `dueTo`.
+            // Read `dueTo`
+            @Nullable
             String dueTo = trimNullable(element.getAttribute("due-to"));
             if (isBlank(dueTo)) {
                 dueTo = null;
             }
 
-            // Read `description`.
+            // Read `description`
+            @Nullable
             final String description = trimNullable(element.getTextContent());
             if (isBlank(description)) {
                 throw XmlReader.failureAtXmlNode(element, "blank `description`");
             }
 
-            // Create the instance.
+            // Create the instance
             return new Action(issue, type, dev, dueTo, description);
 
         }
diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/importer/MavenChangesImporter.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/importer/MavenChangesImporter.java
index a66d973..318f0c9 100644
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/importer/MavenChangesImporter.java
+++ b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/importer/MavenChangesImporter.java
@@ -52,15 +52,15 @@ public final class MavenChangesImporter {
 
     private static void writeReleased(final Path changelogDirectory, final MavenChanges.Release release) {
 
-        // Determine the directory for this particular release.
+        // Determine the directory for this particular release
         final Path releaseDirectory = ChangelogFiles.releaseDirectory(changelogDirectory, release.version);
 
-        // Write release information.
+        // Write release information
         final Path releaseFile = ChangelogFiles.releaseXmlFile(releaseDirectory);
         final ChangelogRelease changelogRelease = new ChangelogRelease(release.version, release.date);
         changelogRelease.writeToXmlFile(releaseFile);
 
-        // Write release actions.
+        // Write release actions
         release.actions.forEach(action -> writeAction(releaseDirectory, action));
 
     }
@@ -92,10 +92,10 @@ public final class MavenChangesImporter {
 
     private static ChangelogEntry changelogEntry(final MavenChanges.Action action) {
 
-        // Create the `type`.
+        // Create the `type`
         final ChangelogEntry.Type type = changelogType(action.type);
 
-        // Create the `issue`s.
+        // Create the `issue`s
         final List<ChangelogEntry.Issue> issues = new ArrayList<>(1);
         if (action.issue != null) {
             final String issueLink = String.format("https://issues.apache.org/jira/browse/%s", action.issue);
@@ -103,7 +103,7 @@ public final class MavenChangesImporter {
             issues.add(issue);
         }
 
-        // Create the `author`s.
+        // Create the `author`s
         final List<ChangelogEntry.Author> authors = new ArrayList<>(2);
         for (final String authorId : action.dev.split("\\s*,\\s*")) {
             if (!isBlank(authorId)) {
@@ -114,16 +114,16 @@ public final class MavenChangesImporter {
             authors.add(new ChangelogEntry.Author(null, action.dueTo));
         }
 
-        // Create the `description`.
+        // Create the `description`
         final ChangelogEntry.Description description = new ChangelogEntry.Description("asciidoc", action.description);
 
-        // Create the instance.
+        // Create the instance
         return new ChangelogEntry(type, issues, authors, description);
 
     }
 
     /**
-     * Maps `maven-changes-plugin` action types to their `Keep a Changelog` equivalents.
+     * Maps {@code maven-changes-plugin} action types to their {@code Keep a Changelog} equivalents.
      */
     private static ChangelogEntry.Type changelogType(final MavenChanges.Action.Type type) {
         if (MavenChanges.Action.Type.ADD.equals(type)) {
diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/releaser/ChangelogReleaser.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/releaser/ChangelogReleaser.java
index 199ba79..55b4fca 100644
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/releaser/ChangelogReleaser.java
+++ b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/releaser/ChangelogReleaser.java
@@ -35,23 +35,23 @@ public final class ChangelogReleaser {
 
     public static void main(final String[] mainArgs) throws Exception {
 
-        // Read arguments.
+        // Read arguments
         final ChangelogReleaserArgs args = ChangelogReleaserArgs.fromSystemProperties();
 
-        // Read the release date and version.
+        // Read the release date and version
         final String releaseDate = ISO_DATE.format(LocalDate.now());
         final int releaseVersionMajor = VersionUtils.versionMajor(args.releaseVersion);
         System.out.format("using `%s` for the release date%n", releaseDate);
 
-        // Populate the changelog entry files in the release directory.
+        // Populate the changelog entry files in the release directory
         final Path unreleasedDirectory = ChangelogFiles.unreleasedDirectory(args.changelogDirectory, releaseVersionMajor);
         final Path releaseDirectory = ChangelogFiles.releaseDirectory(args.changelogDirectory, args.releaseVersion);
         populateChangelogEntryFiles(unreleasedDirectory, releaseDirectory);
 
-        // Write the release information.
+        // Write the release information
         populateReleaseXmlFiles(releaseDate, args.releaseVersion, releaseDirectory);
 
-        // Write the release changelog template.
+        // Write the release changelog template
         populateReleaseChangelogTemplateFile(unreleasedDirectory, releaseDirectory);
 
     }
@@ -74,20 +74,21 @@ public final class ChangelogReleaser {
     }
 
     private static void moveUnreleasedChangelogEntryFiles(final Path unreleasedDirectory, final Path releaseDirectory) {
-        FileUtils
-                .findAdjacentFiles(unreleasedDirectory, true)
-                .forEach(unreleasedChangelogEntryFile -> {
-                    final String fileName = unreleasedChangelogEntryFile.getFileName().toString();
-                    final Path releasedChangelogEntryFile = releaseDirectory.resolve(fileName);
-                    System.out.format(
-                            "moving changelog entry file `%s` to `%s`%n",
-                            unreleasedChangelogEntryFile, releasedChangelogEntryFile);
-                    try {
-                        Files.move(unreleasedChangelogEntryFile, releasedChangelogEntryFile);
-                    } catch (final IOException error) {
-                        throw new UncheckedIOException(error);
-                    }
-                });
+        FileUtils.findAdjacentFiles(unreleasedDirectory, true, paths -> {
+            paths.forEach(unreleasedChangelogEntryFile -> {
+                final String fileName = unreleasedChangelogEntryFile.getFileName().toString();
+                final Path releasedChangelogEntryFile = releaseDirectory.resolve(fileName);
+                System.out.format(
+                        "moving changelog entry file `%s` to `%s`%n",
+                        unreleasedChangelogEntryFile, releasedChangelogEntryFile);
+                try {
+                    Files.move(unreleasedChangelogEntryFile, releasedChangelogEntryFile);
+                } catch (final IOException error) {
+                    throw new UncheckedIOException(error);
+                }
+            });
+            return 1;
+        });
     }
 
     private static void moveUnreleasedDirectory(
diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/AsciiDocUtils.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/AsciiDocUtils.java
deleted file mode 100644
index a6a85f0..0000000
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/AsciiDocUtils.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.logging.log4j.changelog.util;
-
-public final class AsciiDocUtils {
-
-    public static final String LICENSE_COMMENT_BLOCK = "////\n" +
-            "    Licensed to the Apache Software Foundation (ASF) under one or more\n" +
-            "    contributor license agreements.  See the NOTICE file distributed with\n" +
-            "    this work for additional information regarding copyright ownership.\n" +
-            "    The ASF licenses this file to You under the Apache License, Version 2.0\n" +
-            "    (the \"License\"); you may not use this file except in compliance with\n" +
-            "    the License.  You may obtain a copy of the License at\n" +
-            "\n" +
-            "         https://www.apache.org/licenses/LICENSE-2.0\n" +
-            "\n" +
-            "    Unless required by applicable law or agreed to in writing, software\n" +
-            "    distributed under the License is distributed on an \"AS IS\" BASIS,\n" +
-            "    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" +
-            "    See the License for the specific language governing permissions and\n" +
-            "    limitations under the License.\n" +
-            "////\n";
-
-    private AsciiDocUtils() {}
-
-}
diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/FileUtils.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/FileUtils.java
index c5200b4..72a8e5a 100644
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/FileUtils.java
+++ b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/FileUtils.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.function.Function;
 import java.util.stream.Stream;
 
 public final class FileUtils {
@@ -33,27 +34,29 @@ public final class FileUtils {
      * </p>
      */
     @SuppressWarnings("RedundantIfStatement")
-    public static Stream<Path> findAdjacentFiles(final Path directory, final boolean dotFilesSkipped) {
-        try {
-            return Files
-                    .walk(directory, 1)
-                    .filter(path -> {
-
-                        // Skip the directory itself.
-                        if (path.equals(directory)) {
-                            return false;
-                        }
-
-                        // Skip hidden files.
-                        boolean hiddenFile = dotFilesSkipped && path.getFileName().toString().startsWith(".");
-                        if (hiddenFile) {
-                            return false;
-                        }
-
-                        // Accept the rest.
-                        return true;
-
-                    });
+    public static <V> V findAdjacentFiles(
+            final Path directory,
+            final boolean dotFilesSkipped,
+            final Function<Stream<Path>, V> consumer) {
+        try (final Stream<Path> paths = Files.walk(directory, 1)) {
+            final Stream<Path> filteredPaths = paths.filter(path -> {
+
+                // Skip the directory itself
+                if (path.equals(directory)) {
+                    return false;
+                }
+
+                // Skip hidden files
+                boolean hiddenFile = dotFilesSkipped && path.getFileName().toString().startsWith(".");
+                if (hiddenFile) {
+                    return false;
+                }
+
+                // Accept the rest
+                return true;
+
+            });
+            return consumer.apply(filteredPaths);
         } catch (final IOException error) {
             final String message = String.format("failed walking directory: `%s`", directory);
             throw new UncheckedIOException(message, error);
diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/PropertyUtils.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/PropertyUtils.java
index c732736..b50db01 100644
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/PropertyUtils.java
+++ b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/PropertyUtils.java
@@ -20,6 +20,8 @@ import java.nio.file.InvalidPathException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 
+import edu.umd.cs.findbugs.annotations.Nullable;
+
 import static org.apache.logging.log4j.changelog.util.StringUtils.isBlank;
 
 public final class PropertyUtils {
@@ -47,6 +49,7 @@ public final class PropertyUtils {
     }
 
     public static String requireNonBlankStringProperty(final String key) {
+        @Nullable
         final String value = System.getProperty(key);
         if (isBlank(value)) {
             final String message = String.format("blank system property: `%s`", key);
diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/StringUtils.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/StringUtils.java
index 886389d..1a084c2 100644
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/StringUtils.java
+++ b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/StringUtils.java
@@ -16,15 +16,18 @@
  */
 package org.apache.logging.log4j.changelog.util;
 
+import edu.umd.cs.findbugs.annotations.Nullable;
+
 public final class StringUtils {
 
     private StringUtils() {}
 
-    public static String trimNullable(final String input) {
+    @Nullable
+    public static String trimNullable(@Nullable final String input) {
         return input != null ? input.trim() : null;
     }
 
-    public static boolean isBlank(final String input) {
+    public static boolean isBlank(@Nullable final String input) {
         return input == null || input.matches("\\s*");
     }
 
diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/XmlReader.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/XmlReader.java
index a5eb9a8..7b3d405 100644
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/XmlReader.java
+++ b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/XmlReader.java
@@ -16,8 +16,8 @@
  */
 package org.apache.logging.log4j.changelog.util;
 
-import java.io.FileInputStream;
 import java.io.InputStream;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -43,7 +43,7 @@ public final class XmlReader {
     private XmlReader() {}
 
     public static Element readXmlFileRootElement(final Path path, final String rootElementName) {
-        try (final InputStream inputStream = new FileInputStream(path.toFile())) {
+        try (final InputStream inputStream = Files.newInputStream(path)) {
             final Document document = readXml(inputStream);
             final Element rootElement = document.getDocumentElement();
             if (!rootElementName.equals(rootElement.getNodeName())) {
diff --git a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/XmlWriter.java b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/XmlWriter.java
index 0bedf94..7577ed5 100644
--- a/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/XmlWriter.java
+++ b/log4j-changelog/src/main/java/org/apache/logging/log4j/changelog/util/XmlWriter.java
@@ -30,6 +30,7 @@ import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
+import edu.umd.cs.findbugs.annotations.Nullable;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.w3c.dom.Comment;
 import org.w3c.dom.Document;
@@ -42,7 +43,8 @@ public final class XmlWriter {
         try {
             final String xml = toString(documentConsumer);
             final byte[] xmlBytes = xml.getBytes(CharsetUtils.CHARSET);
-            Path filepathParent = filepath.getParent();
+            @Nullable
+            final Path filepathParent = filepath.getParent();
             if (filepathParent != null) {
                 Files.createDirectories(filepathParent);
             }
@@ -56,11 +58,11 @@ public final class XmlWriter {
     public static String toString(final Consumer<Document> documentConsumer) {
         try {
 
-            // Create the document.
+            // Create the document
             final DocumentBuilderFactory documentBuilderFactory = XmlUtils.createDocumentBuilderFactory();
             final DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
 
-            // Append the license comment.
+            // Append the license comment
             final Document document = documentBuilder.newDocument();
             document.setXmlStandalone(true);
             final Comment licenseComment = document.createComment("\n" +
@@ -81,10 +83,10 @@ public final class XmlWriter {
                     "\n");
             document.appendChild(licenseComment);
 
-            // Execute request changes.
+            // Execute request changes
             documentConsumer.accept(document);
 
-            // Serialize the document.
+            // Serialize the document
             return serializeXmlDocument(document);
 
         } catch (final Exception error) {
@@ -102,7 +104,7 @@ public final class XmlWriter {
         transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
         transformer.transform(source, result);
         return result.getWriter().toString()
-                // Life is too short to solve DOM transformer issues decently.
+                // Life is too short to solve DOM transformer issues decently
                 .replace("?><!--", "?>\n<!--")
                 .replace("--><", "-->\n<");
     }