You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by cu...@apache.org on 2014/03/14 20:31:21 UTC

svn commit: r1577670 - in /avro/trunk: ./ lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/ lang/java/compiler/src/test/java/org/apache/avro/compiler/ lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/

Author: cutting
Date: Fri Mar 14 19:31:20 2014
New Revision: 1577670

URL: http://svn.apache.org/r1577670
Log:
AVRO-1471. Java: Permit writing generated code in different character encodings.  Contributed by Eugene Mustaphin.

Modified:
    avro/trunk/CHANGES.txt
    avro/trunk/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java
    avro/trunk/lang/java/compiler/src/test/java/org/apache/avro/compiler/TestSpecificCompiler.java
    avro/trunk/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/SchemaMojo.java

Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=1577670&r1=1577669&r2=1577670&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Fri Mar 14 19:31:20 2014
@@ -8,6 +8,9 @@ Trunk (not yet released)
 
     AVRO-974. Add a Perl implementation of Avro. (Yann Kerhervé & John Karp)
 
+    AVRO-1471. Java: Permit writing generated code in different
+    character encodings. (Eugene Mustaphin via cutting)
+
   OPTIMIZATIONS
 
     AVRO-1455. Deep copy does not need to create new instances for primitives.

Modified: avro/trunk/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java?rev=1577670&r1=1577669&r2=1577670&view=diff
==============================================================================
--- avro/trunk/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java (original)
+++ avro/trunk/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java Fri Mar 14 19:31:20 2014
@@ -18,6 +18,9 @@
 package org.apache.avro.compiler.specific;
 
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.StringWriter;
@@ -65,6 +68,7 @@ public class SpecificCompiler {
   private String templateDir;
   private FieldVisibility fieldVisibility = FieldVisibility.PUBLIC_DEPRECATED;
   private boolean createSetters = true;
+  private String outputCharacterEncoding;
 
   /* List of Java reserved words from
    * http://java.sun.com/docs/books/jls/third_edition/html/lexical.html. */
@@ -208,6 +212,7 @@ public class SpecificCompiler {
   static class OutputFile {
     String path;
     String contents;
+    String outputCharacterEncoding;
 
     /**
      * Writes output to path destination directory when it is newer than src,
@@ -218,7 +223,12 @@ public class SpecificCompiler {
       if (src != null && f.exists() && f.lastModified() >= src.lastModified())
         return f;                                 // already up to date: ignore
       f.getParentFile().mkdirs();
-      FileWriter fw = new FileWriter(f);
+      Writer fw;
+      if (outputCharacterEncoding != null) {
+        fw = new OutputStreamWriter(new FileOutputStream(f), outputCharacterEncoding);
+      } else {
+        fw = new FileWriter(f);
+      }
       try {
         fw.write(FILE_HEADER);
         fw.write(contents);
@@ -345,6 +355,7 @@ public class SpecificCompiler {
     String mangledName = mangle(protocol.getName());
     outputFile.path = makePath(mangledName, protocol.getNamespace());
     outputFile.contents = out;
+    outputFile.outputCharacterEncoding = outputCharacterEncoding;
     return outputFile;
   }
 
@@ -384,6 +395,7 @@ public class SpecificCompiler {
     String name = mangle(schema.getName());
     outputFile.path = makePath(name, schema.getNamespace());
     outputFile.contents = output;
+    outputFile.outputCharacterEncoding = outputCharacterEncoding;
     return outputFile;
   }
 
@@ -788,5 +800,11 @@ public class SpecificCompiler {
     }
   }
 
+  /** Sets character encoding for generated java file
+  * @param outputCharacterEncoding Character encoding for output files (defaults to system encoding)
+  */
+  public void setOutputCharacterEncoding(String outputCharacterEncoding) {
+    this.outputCharacterEncoding = outputCharacterEncoding;
+  }
 }
 

Modified: avro/trunk/lang/java/compiler/src/test/java/org/apache/avro/compiler/TestSpecificCompiler.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/compiler/src/test/java/org/apache/avro/compiler/TestSpecificCompiler.java?rev=1577670&r1=1577669&r2=1577670&view=diff
==============================================================================
--- avro/trunk/lang/java/compiler/src/test/java/org/apache/avro/compiler/TestSpecificCompiler.java (original)
+++ avro/trunk/lang/java/compiler/src/test/java/org/apache/avro/compiler/TestSpecificCompiler.java Fri Mar 14 19:31:20 2014
@@ -20,12 +20,17 @@ package org.apache.avro.compiler;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.equalTo;
 
 import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileReader;
 import java.io.IOException;
 import java.net.URISyntaxException;
+import java.nio.charset.Charset;
 
 import org.apache.avro.AvroTestUtil;
 import org.apache.avro.Schema;
@@ -172,4 +177,26 @@ public class TestSpecificCompiler {
         line.startsWith("public void setValue("));
     }
   }
+
+  @Test
+  public void testSettingOutputCharacterEncoding() throws Exception {
+    SpecificCompiler compiler = createCompiler();
+    // Generated file in default encoding
+    compiler.compileToDestination(this.src, this.outputDir);
+    byte[] fileInDefaultEncoding = new byte[(int) this.outputFile.length()];
+    new FileInputStream(this.outputFile).read(fileInDefaultEncoding);
+    this.outputFile.delete();
+    // Generate file in another encoding (make sure it has different number of bytes per character)
+    String differentEncoding = Charset.defaultCharset().equals(Charset.forName("UTF-16")) ? "UTF-32" : "UTF-16";
+    compiler.setOutputCharacterEncoding(differentEncoding);
+    compiler.compileToDestination(this.src, this.outputDir);
+    byte[] fileInDifferentEncoding = new byte[(int) this.outputFile.length()];
+    new FileInputStream(this.outputFile).read(fileInDifferentEncoding);
+    // Compare as bytes
+    assertThat("Generated file should contain different bytes after setting non-default encoding",
+      fileInDefaultEncoding, not(equalTo(fileInDifferentEncoding)));
+    // Compare as strings
+    assertThat("Generated files should contain the same characters in the proper encodings",
+      new String(fileInDefaultEncoding), equalTo(new String(fileInDifferentEncoding, differentEncoding)));
+  }
 }

Modified: avro/trunk/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/SchemaMojo.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/SchemaMojo.java?rev=1577670&r1=1577669&r2=1577670&view=diff
==============================================================================
--- avro/trunk/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/SchemaMojo.java (original)
+++ avro/trunk/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/SchemaMojo.java Fri Mar 14 19:31:20 2014
@@ -78,6 +78,7 @@ public class SchemaMojo extends Abstract
     compiler.setStringType(StringType.valueOf(stringType));
     compiler.setFieldVisibility(getFieldVisibility());
     compiler.setCreateSetters(createSetters);
+    compiler.setOutputCharacterEncoding(project.getProperties().getProperty("project.build.sourceEncoding"));
     compiler.compileToDestination(src, outputDirectory);
   }