diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java index 31eef95eaa..441cfe5c50 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java @@ -84,6 +84,7 @@ abstract class AbstractGenerator implements Generator { boolean generateTableValuedFunctions = false; protected GeneratorStrategyWrapper strategy; + protected String targetEncoding = "UTF-8"; final Language language; AbstractGenerator(Language language) { @@ -448,6 +449,16 @@ abstract class AbstractGenerator implements Generator { return strategy.getTargetPackage(); } + @Override + public String getTargetEncoding() { + return targetEncoding; + } + + @Override + public void setTargetEncoding(String encoding) { + this.targetEncoding = encoding; + } + /** * If file is a directory, recursively empty its children. * If file is a file, delete it. diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java b/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java index 3cbd451ebf..1441ea99ed 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java @@ -409,9 +409,12 @@ public class GenerationTool { g.getTarget().setPackageName("org.jooq.generated"); if (StringUtils.isBlank(g.getTarget().getDirectory())) g.getTarget().setDirectory("target/generated-sources/jooq"); + if (StringUtils.isBlank(g.getTarget().getEncoding())) + g.getTarget().setEncoding("UTF-8"); generator.setTargetPackage(g.getTarget().getPackageName()); generator.setTargetDirectory(g.getTarget().getDirectory()); + generator.setTargetEncoding(g.getTarget().getEncoding()); // [#1394] The element should be optional if (g.getGenerate() == null) diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java b/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java index dfb6c9144e..486e53c172 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java @@ -389,6 +389,16 @@ public interface Generator { */ void setTargetDirectory(String directory); + /** + * The target encoding + */ + String getTargetEncoding(); + + /** + * Initialise the target encoding + */ + void setTargetEncoding(String encoding); + /** * @return Get the target package for the current configuration */ diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/GeneratorWriter.java b/jOOQ-codegen/src/main/java/org/jooq/util/GeneratorWriter.java index 605d957249..53140a5890 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/GeneratorWriter.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/GeneratorWriter.java @@ -80,15 +80,21 @@ public abstract class GeneratorWriter> { private final File file; + private final String encoding; private final StringBuilder sb; private int indentTabs; private String tabString = " "; private boolean newline = true; protected GeneratorWriter(File file) { + this(file, null); + } + + protected GeneratorWriter(File file, String encoding) { file.getParentFile().mkdirs(); this.file = file; + this.encoding = encoding; this.sb = new StringBuilder(); } @@ -259,7 +265,7 @@ public abstract class GeneratorWriter> { old = new RandomAccessFile(file, "r"); byte[] oldBytes = new byte[(int) old.length()]; old.readFully(oldBytes); - oldContent = new String(oldBytes, "UTF-8"); + oldContent = new String(oldBytes, encoding()); } finally { if (old != null) @@ -268,7 +274,7 @@ public abstract class GeneratorWriter> { } if (oldContent == null || !oldContent.equals(newContent)) { - PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); + PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), encoding())); writer.append(newContent); writer.flush(); @@ -283,6 +289,10 @@ public abstract class GeneratorWriter> { } } + protected String encoding() { + return encoding != null ? encoding : "UTF-8"; + } + protected String beforeClose(String string) { return string; } diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java index 46d5729a54..900e89c9d9 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java @@ -5127,7 +5127,7 @@ public class JavaGenerator extends AbstractGenerator { if (scala) file = new File(file.getParentFile(), file.getName().replace(".java", ".scala")); - return new JavaWriter(file, generateFullyQualifiedTypes()); + return new JavaWriter(file, generateFullyQualifiedTypes(), targetEncoding); } // [#4626] Users may need to call this method diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/JavaWriter.java b/jOOQ-codegen/src/main/java/org/jooq/util/JavaWriter.java index 41bbf6e65d..217daed401 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/JavaWriter.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/JavaWriter.java @@ -37,7 +37,11 @@ public class JavaWriter extends GeneratorWriter { private final Pattern PLAIN_GENERIC_TYPE_PATTERN = Pattern.compile("[<\\[]((?:[\\p{L}_$][\\p{L}\\p{N}_$]*\\.)*[\\p{L}_$][\\p{L}\\p{N}_$]*)[>\\]]"); public JavaWriter(File file, String fullyQualifiedTypes) { - super(file); + this(file, fullyQualifiedTypes, null); + } + + public JavaWriter(File file, String fullyQualifiedTypes, String encoding) { + super(file, encoding); this.className = file.getName().replaceAll("\\.(java|scala)$", ""); this.isJava = file.getName().endsWith(".java"); diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.8.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.8.0.xsd index db32070c45..425dd700e4 100644 --- a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.8.0.xsd +++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.8.0.xsd @@ -855,6 +855,9 @@ + + +