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/31 12:22:17 UTC
[logging-log4j-tools] branch master updated: More Windows fixes
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
The following commit(s) were added to refs/heads/master by this push:
new fd84623 More Windows fixes
fd84623 is described below
commit fd8462341106f6f522c7508e183a1c14b638fe7d
Author: Volkan Yazıcı <vo...@yazi.ci>
AuthorDate: Tue Jan 31 13:23:12 2023 +0100
More Windows fixes
---
CHANGELOG.adoc | 2 +
.../changelog/exporter/ChangelogExporter.java | 60 ++++++++++++++--------
.../log4j/changelog/exporter/FreeMarkerUtils.java | 21 ++++----
.../logging/log4j/changelog/util/XmlWriter.java | 45 ++++++++--------
.../logging/log4j/changelog/FileTestUtils.java | 4 +-
5 files changed, 77 insertions(+), 55 deletions(-)
diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc
index 1026fcf..3b10e63 100644
--- a/CHANGELOG.adoc
+++ b/CHANGELOG.adoc
@@ -17,6 +17,8 @@ limitations under the License.
== Unreleased
+* Fixed Windows compatibility (for https://github.com/apache/logging-log4j-tools/issues/19[#19] by Piotr P. Karwasz, Volkan Yazıcı)
+
* Fixed unreleased directory order in `ChangelogExporter` (for https://github.com/apache/logging-log4j-tools/issues/17[#17] by Volkan Yazıcı)
* Removed `security` as a change type from `log4j-changelog` (for https://github.com/apache/logging-log4j-tools/issues/14[#14] by Ralph Goers, Volkan Yazıcı)
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 96ac864..a2341d8 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
@@ -16,6 +16,7 @@
*/
package org.apache.logging.log4j.changelog.exporter;
+import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Files;
@@ -60,13 +61,13 @@ public final class ChangelogExporter {
for (int releaseIndex = 0; releaseIndex < releaseDirectories.size(); releaseIndex++) {
final Path releaseDirectory = releaseDirectories.get(releaseIndex);
final ChangelogRelease changelogRelease = changelogReleases.get(releaseIndex);
- final String releaseChangelogTemplateFile = ChangelogFiles.releaseChangelogTemplateFile(releaseDirectory, args.changelogDirectory);
+ final Path releaseChangelogTemplateFile = ChangelogFiles.releaseChangelogTemplateFile(releaseDirectory);
try {
exportRelease(
args.outputDirectory,
+ args.changelogDirectory,
releaseDirectory,
changelogRelease,
- args.changelogDirectory,
releaseChangelogTemplateFile);
} catch (final Exception error) {
final String message =
@@ -96,25 +97,23 @@ public final class ChangelogExporter {
final Path upcomingReleaseDirectory =
ChangelogFiles.unreleasedDirectory(args.changelogDirectory, upcomingReleaseVersionMajor);
final ChangelogRelease upcomingRelease = upcomingRelease(upcomingReleaseVersionMajor);
- final String upcomingReleaseChangelogTemplateFile =
- ChangelogFiles.releaseChangelogTemplateFile(upcomingReleaseDirectory, args.changelogDirectory);
+ final Path upcomingReleaseChangelogTemplateFile =
+ ChangelogFiles.releaseChangelogTemplateFile(upcomingReleaseDirectory);
System.out.format("exporting upcoming release directory: `%s`%n", upcomingReleaseDirectory);
exportRelease(
args.outputDirectory,
+ args.changelogDirectory,
upcomingReleaseDirectory,
upcomingRelease,
- args.changelogDirectory,
upcomingReleaseChangelogTemplateFile);
changelogReleases.add(upcomingRelease);
});
// Export the release index
- final String changelogIndexTemplateFile = ChangelogFiles.indexTemplateFile(args.changelogDirectory, args.changelogDirectory);
exportIndex(
args.outputDirectory,
- changelogReleases,
args.changelogDirectory,
- changelogIndexTemplateFile);
+ changelogReleases);
}
@@ -139,13 +138,19 @@ public final class ChangelogExporter {
private static void exportRelease(
final Path outputDirectory,
+ final Path changelogDirectory,
final Path releaseDirectory,
final ChangelogRelease changelogRelease,
- final Path templateDirectory,
- final String releaseChangelogTemplateFile) {
- final Map<ChangelogEntry.Type, List<ChangelogEntry>> changelogEntriesByType = readChangelogEntriesByType(releaseDirectory);
+ final Path releaseChangelogTemplateFile) {
+ final Map<ChangelogEntry.Type, List<ChangelogEntry>> changelogEntriesByType =
+ readChangelogEntriesByType(releaseDirectory);
try {
- exportRelease(outputDirectory, changelogRelease, changelogEntriesByType, templateDirectory, releaseChangelogTemplateFile);
+ exportRelease(
+ outputDirectory,
+ changelogDirectory,
+ changelogRelease,
+ changelogEntriesByType,
+ releaseChangelogTemplateFile);
} catch (final IOException error) {
final String message = String.format("failed exporting release from directory `%s`", releaseDirectory);
throw new UncheckedIOException(message, error);
@@ -167,19 +172,20 @@ public final class ChangelogExporter {
private static void exportRelease(
final Path outputDirectory,
+ final Path changelogDirectory,
final ChangelogRelease release,
final Map<ChangelogEntry.Type, List<ChangelogEntry>> entriesByType,
- final Path templateDirectory,
- final String releaseChangelogTemplateFile)
+ final Path releaseChangelogTemplateFile)
throws IOException {
final String releaseChangelogFileName = releaseChangelogFileName(release);
final Path releaseChangelogFile = outputDirectory.resolve(releaseChangelogFileName);
final Map<String, Object> releaseChangelogTemplateData = new LinkedHashMap<>();
releaseChangelogTemplateData.put("release", release);
releaseChangelogTemplateData.put("entriesByType", entriesByType);
+ final String releaseChangelogTemplateName = templateName(changelogDirectory, releaseChangelogTemplateFile);
FreeMarkerUtils.render(
- templateDirectory,
- releaseChangelogTemplateFile,
+ changelogDirectory,
+ releaseChangelogTemplateName,
releaseChangelogTemplateData,
releaseChangelogFile);
}
@@ -191,9 +197,8 @@ public final class ChangelogExporter {
private static void exportIndex(
final Path outputDirectory,
- final List<ChangelogRelease> changelogReleases,
- final Path templateDirectory,
- final String indexTemplateFile) {
+ final Path changelogDirectory,
+ final List<ChangelogRelease> changelogReleases) {
final Object indexTemplateData = Collections.singletonMap(
"releases", IntStream
.range(0, changelogReleases.size())
@@ -208,8 +213,10 @@ public final class ChangelogExporter {
return (Object) changelogReleaseData;
})
.collect(Collectors.toList()));
+ final Path indexTemplateFile = ChangelogFiles.indexTemplateFile(changelogDirectory);
+ final String indexTemplateName = templateName(changelogDirectory, indexTemplateFile);
final Path indexFile = outputDirectory.resolve("index.adoc");
- FreeMarkerUtils.render(templateDirectory, indexTemplateFile, indexTemplateData, indexFile);
+ FreeMarkerUtils.render(changelogDirectory, indexTemplateName, indexTemplateData, indexFile);
}
private static String releaseChangelogFileName(final ChangelogRelease changelogRelease) {
@@ -217,4 +224,17 @@ public final class ChangelogExporter {
return String.format("%s.adoc", changelogRelease.version);
}
+ /**
+ * Creates a FreeMarker template name from the given path, assuming that the provided changelog directory is the template folder.
+ * <p>
+ * {@link freemarker.cache.FileTemplateLoader} works against a template folder, hence the path relativization required.
+ * </p>
+ */
+ private static String templateName(final Path changelogDirectory, final Path path) {
+ final Path relativePath = changelogDirectory.relativize(path);
+ return File.pathSeparatorChar == '/'
+ ? relativePath.toString()
+ : relativePath.toString().replace('\\', '/');
+ }
+
}
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 eaaa637..5ab86d6 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
@@ -27,28 +27,25 @@ import org.apache.logging.log4j.changelog.util.CharsetUtils;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.cache.FileTemplateLoader;
-import freemarker.template.Configuration;
-import freemarker.template.DefaultObjectWrapper;
-import freemarker.template.DefaultObjectWrapperBuilder;
-import freemarker.template.Template;
-import freemarker.template.TemplateExceptionHandler;
+import freemarker.template.*;
final class FreeMarkerUtils {
private FreeMarkerUtils() {}
@SuppressFBWarnings("DMI_HARDCODED_ABSOLUTE_FILENAME")
- private static Configuration createConfiguration(final Path root) {
- final Configuration configuration = new Configuration(Configuration.VERSION_2_3_29);
+ private static Configuration createConfiguration(final Path templateDirectory) {
+ final Version configurationVersion = Configuration.VERSION_2_3_29;
+ final Configuration configuration = new Configuration(configurationVersion);
configuration.setDefaultEncoding(CharsetUtils.CHARSET_NAME);
configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
try {
- configuration.setTemplateLoader(new FileTemplateLoader(root.toFile()));
+ configuration.setTemplateLoader(new FileTemplateLoader(templateDirectory.toFile()));
} catch (final IOException error) {
throw new UncheckedIOException(error);
}
final DefaultObjectWrapperBuilder objectWrapperBuilder =
- new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_27);
+ new DefaultObjectWrapperBuilder(configurationVersion);
objectWrapperBuilder.setExposeFields(true);
final DefaultObjectWrapper objectWrapper = objectWrapperBuilder.build();
configuration.setObjectWrapper(objectWrapper);
@@ -61,12 +58,12 @@ final class FreeMarkerUtils {
@SuppressFBWarnings("TEMPLATE_INJECTION_FREEMARKER")
static void render(
final Path templateDirectory,
- final String templateFile,
+ final String templateName,
final Object templateData,
final Path outputFile) {
try {
final Configuration configuration = createConfiguration(templateDirectory);
- final Template template = configuration.getTemplate(templateFile);
+ final Template template = configuration.getTemplate(templateName);
final Path outputFileParent = outputFile.getParent();
if (outputFileParent != null) {
Files.createDirectories(outputFileParent);
@@ -81,7 +78,7 @@ final class FreeMarkerUtils {
} catch (final Exception error) {
final String message = String.format(
"failed rendering template `%s` to file `%s`",
- templateFile,
+ templateName,
outputFile);
throw new RuntimeException(message, error);
}
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 d3f35b7..0450310 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
@@ -38,6 +38,8 @@ import org.w3c.dom.Element;
public final class XmlWriter {
+ private static final String LS = System.lineSeparator();
+
private XmlWriter() {}
public static void toFile(
@@ -69,22 +71,21 @@ public final class XmlWriter {
// Append the license comment
final Document document = documentBuilder.newDocument();
document.setXmlStandalone(true);
- final Comment licenseComment = document.createComment("\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");
+ final Comment licenseComment = document.createComment(LS +
+ " Licensed to the Apache Software Foundation (ASF) under one or more" + LS +
+ " contributor license agreements. See the NOTICE file distributed with" + LS +
+ " this work for additional information regarding copyright ownership." + LS +
+ " The ASF licenses this file to You under the Apache License, Version 2.0" + LS +
+ " (the \"License\"); you may not use this file except in compliance with" + LS +
+ " the License. You may obtain a copy of the License at" + LS +
+ LS +
+ " https://www.apache.org/licenses/LICENSE-2.0" + LS +
+ LS +
+ " Unless required by applicable law or agreed to in writing, software" + LS +
+ " distributed under the License is distributed on an \"AS IS\" BASIS," + LS +
+ " WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied." + LS +
+ " See the License for the specific language governing permissions and" + LS +
+ " limitations under the License." + LS);
document.appendChild(licenseComment);
// Create the root element
@@ -117,13 +118,13 @@ public final class XmlWriter {
final String xml = result.getWriter().toString();
final String padding = StringUtils.repeat(" ", rootElementName.length() + 2);
return xml
- .replace("?><!--", "?>\n<!--")
- .replace("--><", "-->\n<")
+ .replace("?><!--", "?>" + LS + "<!--")
+ .replace("--><", "-->" + LS + "<")
.replaceFirst(
- '<' + rootElementName + " (.+>\n)",
- ('<' + rootElementName + " xmlns=\"" + XmlUtils.XML_NAMESPACE + "\"\n" +
- padding + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
- padding + "xsi:schemaLocation=\"" + XmlUtils.XML_NAMESPACE + " "+ XmlUtils.XML_SCHEMA_LOCATION + "\"\n" +
+ '<' + rootElementName + " (.+>" + LS + ")",
+ ('<' + rootElementName + " xmlns=\"" + XmlUtils.XML_NAMESPACE + "\"" + LS +
+ padding + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + LS +
+ padding + "xsi:schemaLocation=\"" + XmlUtils.XML_NAMESPACE + " "+ XmlUtils.XML_SCHEMA_LOCATION + "\"" + LS +
padding + "$1"));
}
diff --git a/log4j-changelog/src/test/java/org/apache/logging/log4j/changelog/FileTestUtils.java b/log4j-changelog/src/test/java/org/apache/logging/log4j/changelog/FileTestUtils.java
index d62ea22..d5a9a38 100644
--- a/log4j-changelog/src/test/java/org/apache/logging/log4j/changelog/FileTestUtils.java
+++ b/log4j-changelog/src/test/java/org/apache/logging/log4j/changelog/FileTestUtils.java
@@ -20,7 +20,9 @@ import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.util.*;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;