Skip to content

Commit 3c89f0f

Browse files
committed
Better generated source encoding support
The default encoding is now UTF-8, and the encoding can be configured with the `encoding` annotation processing option.
1 parent fbfb2e5 commit 3c89f0f

5 files changed

Lines changed: 36 additions & 8 deletions

File tree

AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/AndroidAnnotationProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ private ModelProcessor.ProcessResult processAnnotations(AnnotationElements valid
229229
private void generateSources(ModelProcessor.ProcessResult processResult) throws IOException {
230230
timeStats.start("Generate Sources");
231231
LOGGER.info("Number of files generated by AndroidAnnotations: {}", processResult.codeModel.countArtifacts());
232-
CodeModelGenerator modelGenerator = new CodeModelGenerator(processingEnv.getFiler(), coreVersion);
232+
CodeModelGenerator modelGenerator = new CodeModelGenerator(processingEnv.getFiler(), coreVersion, androidAnnotationsEnv.getOptionValue(CodeModelGenerator.OPTION_ENCODING));
233233
modelGenerator.generate(processResult);
234234
timeStats.stop("Generate Sources");
235235
}

AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/Options.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.androidannotations.Option;
2626
import org.androidannotations.helper.ModelConstants;
2727
import org.androidannotations.holder.BaseGeneratedClassHolder;
28+
import org.androidannotations.internal.generation.CodeModelGenerator;
2829
import org.androidannotations.internal.helper.AndroidManifestFinder;
2930
import org.androidannotations.internal.rclass.ProjectRClassFinder;
3031
import org.androidannotations.logger.LoggerContext;
@@ -46,6 +47,7 @@ public Options(ProcessingEnvironment processingEnvironment) {
4647
addSupportedOption(LoggerContext.OPTION_LOG_APPENDER_CONSOLE);
4748
addSupportedOption(LoggerContext.OPTION_LOG_APPENDER_FILE);
4849
addSupportedOption(BaseGeneratedClassHolder.OPTION_GENERATE_FINAL_CLASSES);
50+
addSupportedOption(CodeModelGenerator.OPTION_ENCODING);
4951
}
5052

5153
public void addAllSupportedOptions(List<Option> options) {

AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/generation/CodeModelGenerator.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,55 @@
1616
package org.androidannotations.internal.generation;
1717

1818
import java.io.IOException;
19+
import java.nio.charset.Charset;
20+
import java.nio.charset.UnsupportedCharsetException;
1921

2022
import javax.annotation.processing.Filer;
2123

24+
import org.androidannotations.Option;
2225
import org.androidannotations.internal.process.ModelProcessor;
26+
import org.androidannotations.logger.Logger;
27+
import org.androidannotations.logger.LoggerFactory;
2328

2429
import com.helger.jcodemodel.writer.PrologCodeWriter;
2530

2631
public class CodeModelGenerator {
2732

33+
public static final Option OPTION_ENCODING = new Option("encoding", "UTF-8");
34+
35+
private static final Logger LOGGER = LoggerFactory.getLogger(CodeModelGenerator.class);
36+
2837
private final Filer filer;
2938
private final String header;
39+
private final String encoding;
3040

31-
public CodeModelGenerator(Filer filer, String aaVersion) {
41+
public CodeModelGenerator(Filer filer, String aaVersion, String encoding) {
3242
this.filer = filer;
3343
this.header = "DO NOT EDIT THIS FILE.\n"
3444
+ "Generated using AndroidAnnotations " + aaVersion + ".\n\n"
3545
+ "You can create a larger work that contains this file and distribute that work under terms of your choice.\n";
46+
this.encoding = encoding;
3647
}
3748

3849
public void generate(ModelProcessor.ProcessResult processResult) throws IOException {
50+
Charset charset = getCharset();
3951

40-
SourceCodeWriter sourceCodeWriter = new SourceCodeWriter(filer, processResult.originatingElements);
52+
SourceCodeWriter sourceCodeWriter = new SourceCodeWriter(filer, processResult.originatingElements, charset);
4153

4254
PrologCodeWriter prologCodeWriter = new PrologCodeWriter(sourceCodeWriter, header);
4355

44-
processResult.codeModel.build(prologCodeWriter, new ResourceCodeWriter(filer));
56+
processResult.codeModel.build(prologCodeWriter, new ResourceCodeWriter(filer, charset));
57+
}
58+
59+
private Charset getCharset() {
60+
try {
61+
return Charset.forName(encoding);
62+
} catch (UnsupportedCharsetException exception) {
63+
Charset defaultCharset = Charset.defaultCharset();
64+
65+
LOGGER.warn("The requested charset ({}) is not available, falling back to platform default ({}).", encoding, defaultCharset);
66+
67+
return defaultCharset;
68+
}
4569
}
4670
}

AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/generation/ResourceCodeWriter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.io.IOException;
1919
import java.io.OutputStream;
20+
import java.nio.charset.Charset;
2021

2122
import javax.annotation.processing.Filer;
2223
import javax.tools.FileObject;
@@ -29,8 +30,8 @@ public class ResourceCodeWriter extends AbstractCodeWriter {
2930

3031
private final Filer filer;
3132

32-
public ResourceCodeWriter(Filer filer) {
33-
super(null);
33+
public ResourceCodeWriter(Filer filer, Charset charset) {
34+
super(charset);
3435
this.filer = filer;
3536
}
3637

AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/generation/SourceCodeWriter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.io.IOException;
1919
import java.io.OutputStream;
20+
import java.nio.charset.Charset;
2021

2122
import javax.annotation.processing.Filer;
2223
import javax.annotation.processing.FilerException;
@@ -44,8 +45,8 @@ public void write(int arg0) throws IOException {
4445
}
4546
}
4647

47-
public SourceCodeWriter(Filer filer, OriginatingElements originatingElements) {
48-
super(null);
48+
public SourceCodeWriter(Filer filer, OriginatingElements originatingElements, Charset charset) {
49+
super(charset);
4950
this.filer = filer;
5051
this.originatingElements = originatingElements;
5152
}

0 commit comments

Comments
 (0)