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

sgoeschl pushed a commit to branch FREEMARKER-161
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git


The following commit(s) were added to refs/heads/FREEMARKER-161 by this push:
     new 3330d45  FREEMARKER-161 [freemarker-generator] Fix broken output 
encoding
3330d45 is described below

commit 3330d456dc7d2d00ec37c5616e004d6526e70bb2
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Thu Jan 7 19:57:27 2021 +0100

    FREEMARKER-161 [freemarker-generator] Fix broken output encoding
---
 .../generator/base/template/TemplateOutput.java         |  15 ++++++++++++---
 .../base/template/TemplateTransformationsBuilder.java   |   2 +-
 .../freemarker/generator/cli/task/FreeMarkerTask.java   |   6 ++++--
 .../src/test/data/encoding/utf16.txt                    | Bin 174 -> 362 bytes
 .../src/test/data/encoding/utf8.txt                     |   2 ++
 5 files changed, 19 insertions(+), 6 deletions(-)

diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateOutput.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateOutput.java
index a73a849..89a8bb5 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateOutput.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateOutput.java
@@ -18,6 +18,7 @@ package org.apache.freemarker.generator.base.template;
 
 import java.io.File;
 import java.io.Writer;
+import java.nio.charset.Charset;
 
 import static java.util.Objects.requireNonNull;
 
@@ -32,23 +33,26 @@ public class TemplateOutput {
 
     private final Writer writer;
     private final File file;
+    private final Charset charset;
 
-    private TemplateOutput(File file) {
+    private TemplateOutput(File file, final Charset charset) {
         this.writer = null;
         this.file = requireNonNull(file);
+        this.charset = requireNonNull(charset);
     }
 
     private TemplateOutput(Writer writer) {
         this.writer = requireNonNull(writer);
         this.file = null;
+        this.charset = null;
     }
 
     public static TemplateOutput fromWriter(Writer writer) {
         return new TemplateOutput(writer);
     }
 
-    public static TemplateOutput fromFile(File file) {
-        return new TemplateOutput(file);
+    public static TemplateOutput fromFile(File file, final Charset charset) {
+        return new TemplateOutput(file, charset);
     }
 
     public Writer getWriter() {
@@ -63,11 +67,16 @@ public class TemplateOutput {
         return file;
     }
 
+    public Charset getCharset() {
+        return charset;
+    }
+
     @Override
     public String toString() {
         return "TemplateOutput{" +
                 "writer=" + writer +
                 ", file=" + file +
+                ", charset=" + charset +
                 '}';
     }
 }
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
index aee4438..0db84bd 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
@@ -231,7 +231,7 @@ public class TemplateTransformationsBuilder {
         if (callerSuppliedWriter != null) {
             return TemplateOutput.fromWriter(callerSuppliedWriter);
         } else if (templateOutputFile != null) {
-            return TemplateOutput.fromFile(templateOutputFile);
+            return TemplateOutput.fromFile(templateOutputFile, outputEncoding);
         } else {
             return TemplateOutput.fromWriter(new BufferedWriter(new 
OutputStreamWriter(System.out, outputEncoding)));
         }
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
index 6858f55..f5f0046 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
@@ -28,8 +28,9 @@ import 
org.apache.freemarker.generator.base.template.TemplateSource;
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileWriter;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.OutputStreamWriter;
 import java.io.Writer;
 import java.util.Arrays;
 import java.util.Collection;
@@ -125,7 +126,8 @@ public class FreeMarkerTask implements Callable<Integer> {
         } else {
             final File file = templateOutput.getFile();
             FileUtils.forceMkdirParent(file);
-            return new BufferedWriter(new FileWriter(file));
+            // We need to explicitly set our output encoding here - see 
https://freemarker.apache.org/docs/pgui_misc_charset.html
+            return new BufferedWriter(new OutputStreamWriter(new 
FileOutputStream(file), templateOutput.getCharset()));
         }
     }
 
diff --git a/freemarker-generator-cli/src/test/data/encoding/utf16.txt 
b/freemarker-generator-cli/src/test/data/encoding/utf16.txt
index 4d8e1f2..6dfd2e5 100755
Binary files a/freemarker-generator-cli/src/test/data/encoding/utf16.txt and 
b/freemarker-generator-cli/src/test/data/encoding/utf16.txt differ
diff --git a/freemarker-generator-cli/src/test/data/encoding/utf8.txt 
b/freemarker-generator-cli/src/test/data/encoding/utf8.txt
index c43eb00..25f1e5c 100755
--- a/freemarker-generator-cli/src/test/data/encoding/utf8.txt
+++ b/freemarker-generator-cli/src/test/data/encoding/utf8.txt
@@ -1,3 +1,5 @@
+UTF-8 encoding
+=============================================================================
 première is first
 première is slightly different
 Кириллица is Cyrillic

Reply via email to