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 2010/08/10 19:09:05 UTC

svn commit: r984128 - in /avro/trunk: ./ lang/java/src/java/org/apache/avro/generic/ lang/java/src/java/org/apache/avro/ipc/ lang/java/src/java/org/apache/avro/ipc/trace/ lang/java/src/java/org/apache/avro/mapred/ lang/java/src/java/org/apache/avro/map...

Author: cutting
Date: Tue Aug 10 17:09:04 2010
New Revision: 984128

URL: http://svn.apache.org/viewvc?rev=984128&view=rev
Log:
AVRO-605. Java: Change Utf8 to implement CharSequence.

Added:
    avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericEnumSymbol.java
Modified:
    avro/trunk/CHANGES.txt
    avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericData.java
    avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java
    avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java
    avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericRequestor.java
    avro/trunk/lang/java/src/java/org/apache/avro/ipc/RPCContext.java
    avro/trunk/lang/java/src/java/org/apache/avro/ipc/Requestor.java
    avro/trunk/lang/java/src/java/org/apache/avro/ipc/Responder.java
    avro/trunk/lang/java/src/java/org/apache/avro/ipc/trace/Trace.java
    avro/trunk/lang/java/src/java/org/apache/avro/ipc/trace/TracePlugin.java
    avro/trunk/lang/java/src/java/org/apache/avro/mapred/Pair.java
    avro/trunk/lang/java/src/java/org/apache/avro/mapred/tether/TetherOutputService.java
    avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java
    avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumWriter.java
    avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectResponder.java
    avro/trunk/lang/java/src/java/org/apache/avro/specific/SpecificCompiler.java
    avro/trunk/lang/java/src/java/org/apache/avro/specific/SpecificData.java
    avro/trunk/lang/java/src/java/org/apache/avro/util/Utf8.java
    avro/trunk/lang/java/src/test/java/org/apache/avro/RPCMetaTestPlugin.java
    avro/trunk/lang/java/src/test/java/org/apache/avro/RandomData.java
    avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolGeneric.java
    avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolSpecific.java
    avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java
    avro/trunk/lang/java/src/test/java/org/apache/avro/ipc/TestNettyServer.java
    avro/trunk/lang/java/src/test/java/org/apache/avro/mapred/tether/TetherTask.java
    avro/trunk/lang/java/src/test/java/org/apache/avro/mapred/tether/TetherTaskRunner.java
    avro/trunk/lang/java/src/test/java/org/apache/avro/specific/TestSpecificCompiler.java

Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Tue Aug 10 17:09:04 2010
@@ -11,6 +11,14 @@ Avro 1.4.0 (unreleased)
     methods.  Servers are no longer started in their constructor.
     (hammer & cutting)
 
+    AVRO-605. Java: Change Utf8 to implement CharSequence and change
+    specific, generic & reflect APIs to accept any CharSequence
+    implementation for string schemas, including java.lang.String.
+    This incompatibly changes method signatures of generated protocol
+    interfaces.  It also incompatibly changes the generic
+    representation of enum symbols from java.lang.String to
+    org.apache.avro.generic.GenericEnumSymbol.
+
   NEW FEATURES
 
     AVRO-595. Add Basic Trace Collection and Propagation.

Modified: avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericData.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericData.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericData.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericData.java Tue Aug 10 17:09:04 2010
@@ -27,7 +27,6 @@ import org.apache.avro.AvroTypeException
 import org.apache.avro.Schema;
 import org.apache.avro.Schema.Field;
 import org.apache.avro.Schema.Type;
-import org.apache.avro.util.Utf8;
 import org.apache.avro.io.BinaryData;
 
 /** Utilities for generic Java data. */
@@ -186,6 +185,22 @@ public class GenericData {
     }
   }
 
+  /** Default implementation of {@link GenericEnumSymbol}. */
+  public static class EnumSymbol implements GenericEnumSymbol {
+    private String symbol;
+    public EnumSymbol(String symbol) { this.symbol = symbol; }
+
+    public boolean equals(Object o) {
+      if (o == this) return true;
+      return o instanceof GenericEnumSymbol
+        && symbol.equals(o.toString());
+    }
+
+    public int hashCode() { return symbol.hashCode(); }
+
+    public String toString() { return symbol; }
+  }
+
   /** Returns true if a Java datum matches a schema. */
   public boolean validate(Schema schema, Object datum) {
     switch (schema.getType()) {
@@ -198,7 +213,7 @@ public class GenericData {
       }
       return true;
     case ENUM:
-      return schema.getEnumSymbols().contains(datum);
+      return schema.getEnumSymbols().contains(datum.toString());
     case ARRAY:
       if (!(datum instanceof GenericArray)) return false;
       for (Object element : (GenericArray)datum)
@@ -277,7 +292,7 @@ public class GenericData {
           buffer.append(", ");
       }
       buffer.append("}");
-    } else if (datum instanceof Utf8 || datum instanceof String) {
+    } else if (datum instanceof CharSequence) {
       buffer.append("\"");
       buffer.append(datum);                       // TODO: properly escape!
       buffer.append("\"");
@@ -329,7 +344,7 @@ public class GenericData {
       return Schema.createFixed(null, null, null,
                                 ((GenericFixed)datum).bytes().length);
     }
-    else if (datum instanceof Utf8)       return Schema.create(Type.STRING);
+    else if (datum instanceof CharSequence) return Schema.create(Type.STRING);
     else if (datum instanceof ByteBuffer) return Schema.create(Type.BYTES);
     else if (datum instanceof Integer)    return Schema.create(Type.INT);
     else if (datum instanceof Long)       return Schema.create(Type.LONG);
@@ -396,7 +411,7 @@ public class GenericData {
 
   /** Called by the default implementation of {@link #instanceOf}.*/
   protected boolean isEnum(Object datum) {
-    return datum instanceof String;
+    return datum instanceof GenericEnumSymbol;
   }
   
   /** Called by the default implementation of {@link #instanceOf}.*/
@@ -411,7 +426,7 @@ public class GenericData {
 
   /** Called by the default implementation of {@link #instanceOf}.*/
   protected boolean isString(Object datum) {
-    return datum instanceof Utf8;
+    return datum instanceof CharSequence;
   }
 
   /** Called by the default implementation of {@link #instanceOf}.*/
@@ -476,7 +491,7 @@ public class GenericData {
       }
       return 0;
     case ENUM:
-      return s.getEnumOrdinal((String)o1) - s.getEnumOrdinal((String)o2);
+      return s.getEnumOrdinal(o1.toString()) - s.getEnumOrdinal(o2.toString());
     case ARRAY:
       GenericArray a1 = (GenericArray)o1;
       GenericArray a2 = (GenericArray)o2;

Modified: avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java Tue Aug 10 17:09:04 2010
@@ -135,14 +135,16 @@ public class GenericDatumReader<D> imple
   }
   
   /** Called to read an enum value. May be overridden for alternate enum
-   * representations.  By default, returns the symbol as a String. */
+   * representations.  By default, returns a GenericEnumSymbol. */
   protected Object readEnum(Schema expected, Decoder in) throws IOException {
     return createEnum(expected.getEnumSymbols().get(in.readEnum()), expected);
   }
 
   /** Called to create an enum value. May be overridden for alternate enum
-   * representations.  By default, returns the symbol as a String. */
-  protected Object createEnum(String symbol, Schema schema) { return symbol; }
+   * representations.  By default, returns a GenericEnumSymbol. */
+  protected Object createEnum(String symbol, Schema schema) {
+    return new GenericData.EnumSymbol(symbol);
+  }
 
   /** Called to read an array instance.  May be overridden for alternate array
    * representations.*/
@@ -279,7 +281,7 @@ public class GenericDatumReader<D> imple
    * string representation.  By default, this calls {@link
    * Decoder#readString(Utf8)}.*/
   protected Object readString(Object old, Decoder in) throws IOException {
-    return in.readString((Utf8)old);
+    return in.readString(old instanceof Utf8 ? (Utf8)old : null);
   }
 
   /** Called to create a string from a default value.  Subclasses may override

Modified: avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java Tue Aug 10 17:09:04 2010
@@ -101,7 +101,7 @@ public class GenericDatumWriter<D> imple
    * representations.*/
   protected void writeEnum(Schema schema, Object datum, Encoder out)
     throws IOException {
-    out.writeEnum(schema.getEnumOrdinal((String)datum));
+    out.writeEnum(schema.getEnumOrdinal(datum.toString()));
   }
   
   /** Called to write a array.  May be overridden for alternate array
@@ -173,7 +173,9 @@ public class GenericDatumWriter<D> imple
   /** Called to write a string.  May be overridden for alternate string
    * representations.*/
   protected void writeString(Object datum, Encoder out) throws IOException {
-    out.writeString((Utf8)datum);
+    out.writeString(datum instanceof Utf8
+                    ? (Utf8)datum
+                    : new Utf8(datum.toString()));
   }
 
   /** Called to write a bytes.  May be overridden for alternate bytes

Added: avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericEnumSymbol.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericEnumSymbol.java?rev=984128&view=auto
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericEnumSymbol.java (added)
+++ avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericEnumSymbol.java Tue Aug 10 17:09:04 2010
@@ -0,0 +1,24 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.avro.generic;
+
+/** An enum symbol. */
+public interface GenericEnumSymbol {
+  /** Return the symbol. */
+  String toString();
+}

Modified: avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericRequestor.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericRequestor.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericRequestor.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericRequestor.java Tue Aug 10 17:09:04 2010
@@ -28,7 +28,6 @@ import org.apache.avro.io.Encoder;
 import org.apache.avro.ipc.AvroRemoteException;
 import org.apache.avro.ipc.Requestor;
 import org.apache.avro.ipc.Transceiver;
-import org.apache.avro.util.Utf8;
 
 /** {@link Requestor} implementation for generic Java data. */
 public class GenericRequestor extends Requestor {
@@ -66,7 +65,7 @@ public class GenericRequestor extends Re
   public Exception readError(Schema schema, Decoder in)
     throws IOException {
     Object error = new GenericDatumReader<Object>(schema).read(null,in);
-    if (error instanceof Utf8)
+    if (error instanceof CharSequence)
       return new AvroRuntimeException(error.toString()); // system error
     return new AvroRemoteException(error);
   }

Modified: avro/trunk/lang/java/src/java/org/apache/avro/ipc/RPCContext.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/ipc/RPCContext.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/ipc/RPCContext.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/ipc/RPCContext.java Tue Aug 10 17:09:04 2010
@@ -23,7 +23,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.avro.Protocol.Message;
-import org.apache.avro.util.Utf8;
 
 /**
  * This class represents the context of an RPC call or RPC handshake.
@@ -36,8 +35,8 @@ import org.apache.avro.util.Utf8;
  */
 public class RPCContext {
   
-  protected Map<Utf8,ByteBuffer> requestHandshakeMeta, responseHandshakeMeta;
-  protected Map<Utf8,ByteBuffer> requestCallMeta, responseCallMeta;
+  protected Map<CharSequence,ByteBuffer> requestHandshakeMeta, responseHandshakeMeta;
+  protected Map<CharSequence,ByteBuffer> requestCallMeta, responseCallMeta;
   
   protected Object response;
   protected Exception error;
@@ -51,14 +50,14 @@ public class RPCContext {
    * @return a map representing handshake state from
    * the client to the server
    */
-  public Map<Utf8,ByteBuffer> requestHandshakeMeta() {
+  public Map<CharSequence,ByteBuffer> requestHandshakeMeta() {
     if (requestHandshakeMeta == null) {
-      requestHandshakeMeta = new HashMap<Utf8,ByteBuffer>();
+      requestHandshakeMeta = new HashMap<CharSequence,ByteBuffer>();
     }
     return requestHandshakeMeta;
   }
   
-  void setRequestHandshakeMeta(Map<Utf8,ByteBuffer> newmeta) {
+  void setRequestHandshakeMeta(Map<CharSequence,ByteBuffer> newmeta) {
     requestHandshakeMeta = newmeta;
   }
   
@@ -68,14 +67,14 @@ public class RPCContext {
    * @return a map representing handshake state from
    * the server to the client
    */
-  public Map<Utf8,ByteBuffer> responseHandshakeMeta() {
+  public Map<CharSequence,ByteBuffer> responseHandshakeMeta() {
     if (responseHandshakeMeta == null) {
-      responseHandshakeMeta = new HashMap<Utf8,ByteBuffer>();
+      responseHandshakeMeta = new HashMap<CharSequence,ByteBuffer>();
     }
     return responseHandshakeMeta;
   }
   
-  void setResponseHandshakeMeta(Map<Utf8,ByteBuffer> newmeta) {
+  void setResponseHandshakeMeta(Map<CharSequence,ByteBuffer> newmeta) {
     responseHandshakeMeta = newmeta;
   }
   
@@ -85,14 +84,14 @@ public class RPCContext {
    * @return a map representing per-call state from
    * the client to the server
    */
-  public Map<Utf8,ByteBuffer> requestCallMeta() {
+  public Map<CharSequence,ByteBuffer> requestCallMeta() {
     if (requestCallMeta == null) {
-      requestCallMeta = new HashMap<Utf8,ByteBuffer>();
+      requestCallMeta = new HashMap<CharSequence,ByteBuffer>();
     }
     return requestCallMeta;
   }
   
-  void setRequestCallMeta(Map<Utf8,ByteBuffer> newmeta) {
+  void setRequestCallMeta(Map<CharSequence,ByteBuffer> newmeta) {
     requestCallMeta = newmeta;
   }
   
@@ -102,14 +101,14 @@ public class RPCContext {
    * @return a map representing per-call state from
    * the server to the client
    */
-  public Map<Utf8,ByteBuffer> responseCallMeta() {
+  public Map<CharSequence,ByteBuffer> responseCallMeta() {
     if (responseCallMeta == null) {
-      responseCallMeta = new HashMap<Utf8,ByteBuffer>();
+      responseCallMeta = new HashMap<CharSequence,ByteBuffer>();
     }
     return responseCallMeta;
   }
   
-  void setResponseCallMeta(Map<Utf8,ByteBuffer> newmeta) {
+  void setResponseCallMeta(Map<CharSequence,ByteBuffer> newmeta) {
     responseCallMeta = newmeta;
   }
   

Modified: avro/trunk/lang/java/src/java/org/apache/avro/ipc/Requestor.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/ipc/Requestor.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/ipc/Requestor.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/ipc/Requestor.java Tue Aug 10 17:09:04 2010
@@ -49,10 +49,10 @@ public abstract class Requestor {
 
   private static final Schema META =
     Schema.createMap(Schema.create(Schema.Type.BYTES));
-  private static final GenericDatumReader<Map<Utf8,ByteBuffer>> META_READER =
-    new GenericDatumReader<Map<Utf8,ByteBuffer>>(META);
-  private static final GenericDatumWriter<Map<Utf8,ByteBuffer>> META_WRITER =
-    new GenericDatumWriter<Map<Utf8,ByteBuffer>>(META);
+  private static final GenericDatumReader<Map<CharSequence,ByteBuffer>>
+    META_READER = new GenericDatumReader<Map<CharSequence,ByteBuffer>>(META);
+  private static final GenericDatumWriter<Map<CharSequence,ByteBuffer>>
+    META_WRITER = new GenericDatumWriter<Map<CharSequence,ByteBuffer>>(META);
 
   private Protocol local;
   private Protocol remote;
@@ -218,7 +218,7 @@ public abstract class Requestor {
     
     RPCContext context = new RPCContext();
     if (handshake.meta != null) {
-      context.setResponseHandshakeMeta((Map<Utf8, ByteBuffer>) handshake.meta);
+      context.setResponseHandshakeMeta((Map<CharSequence, ByteBuffer>) handshake.meta);
     }
       
     for (RPCPlugin plugin : rpcMetaPlugins) {

Modified: avro/trunk/lang/java/src/java/org/apache/avro/ipc/Responder.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/ipc/Responder.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/ipc/Responder.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/ipc/Responder.java Tue Aug 10 17:09:04 2010
@@ -50,10 +50,10 @@ public abstract class Responder {
 
   private static final Schema META =
     Schema.createMap(Schema.create(Schema.Type.BYTES));
-  private static final GenericDatumReader<Map<Utf8,ByteBuffer>> META_READER =
-    new GenericDatumReader<Map<Utf8,ByteBuffer>>(META);
-  private static final GenericDatumWriter<Map<Utf8,ByteBuffer>> META_WRITER =
-    new GenericDatumWriter<Map<Utf8,ByteBuffer>>(META);
+  private static final GenericDatumReader<Map<CharSequence,ByteBuffer>>
+    META_READER = new GenericDatumReader<Map<CharSequence,ByteBuffer>>(META);
+  private static final GenericDatumWriter<Map<CharSequence,ByteBuffer>>
+    META_WRITER = new GenericDatumWriter<Map<CharSequence,ByteBuffer>>(META);
 
   private Map<MD5,Protocol> protocols
     = Collections.synchronizedMap(new HashMap<MD5,Protocol>());
@@ -203,7 +203,7 @@ public abstract class Responder {
     }
     
     RPCContext context = new RPCContext();
-    context.setRequestHandshakeMeta((Map<Utf8, ByteBuffer>) request.meta);
+    context.setRequestHandshakeMeta((Map<CharSequence, ByteBuffer>) request.meta);
     
     for (RPCPlugin plugin : rpcMetaPlugins) {
       plugin.serverConnecting(context);

Modified: avro/trunk/lang/java/src/java/org/apache/avro/ipc/trace/Trace.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/ipc/trace/Trace.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/ipc/trace/Trace.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/ipc/trace/Trace.java Tue Aug 10 17:09:04 2010
@@ -59,10 +59,10 @@ public class Trace {  
   }
 
   private class NodeComparator implements Comparator<TraceNode> {
-    @Override
+    @Override @SuppressWarnings("unchecked")
     public int compare(TraceNode tn0, TraceNode tn1) {
       // We sort nodes alphabetically by the message name
-      int result = tn0.span.messageName.compareTo(tn1.span.messageName);
+      int result = ((Comparable)tn0.span.messageName).compareTo((Comparable)tn1.span.messageName);
       
       if (result != 0) {
         return result;

Modified: avro/trunk/lang/java/src/java/org/apache/avro/ipc/trace/TracePlugin.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/ipc/trace/TracePlugin.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/ipc/trace/TracePlugin.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/ipc/trace/TracePlugin.java Tue Aug 10 17:09:04 2010
@@ -208,7 +208,7 @@ public class TracePlugin extends RPCPlug
   
   @Override
   public void serverConnecting(RPCContext context) {
-    Map<Utf8, ByteBuffer> meta = context.requestHandshakeMeta();
+    Map<CharSequence, ByteBuffer> meta = context.requestHandshakeMeta();
     // Are we being asked to propagate a trace?
     if (meta.containsKey(TRACE_ID_KEY) && enabled) {
       if (!(meta.containsKey(SPAN_ID_KEY))) {

Modified: avro/trunk/lang/java/src/java/org/apache/avro/mapred/Pair.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/mapred/Pair.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/mapred/Pair.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/mapred/Pair.java Tue Aug 10 17:09:04 2010
@@ -31,7 +31,6 @@ import org.apache.avro.generic.GenericDa
 import org.apache.avro.generic.GenericContainer;
 import org.apache.avro.generic.IndexedRecord;
 import org.apache.avro.specific.SpecificDatumReader.SchemaConstructable;
-import org.apache.avro.util.Utf8;
 
 /** A key/value pair. */
 public class Pair<K,V>
@@ -168,7 +167,7 @@ public class Pair<K,V>
     this((K)key, key.getSchema(), (V)value, value.getSchema());
   }
   @SuppressWarnings("unchecked")
-  public Pair(GenericContainer key, Utf8 value) {
+  public Pair(GenericContainer key, CharSequence value) {
     this((K)key, key.getSchema(), (V)value, STRING_SCHEMA);
   }
   @SuppressWarnings("unchecked")
@@ -196,35 +195,35 @@ public class Pair<K,V>
     this((K)key, key.getSchema(), (V)value, NULL_SCHEMA);
   }
   @SuppressWarnings("unchecked")
-  public Pair(Utf8 key, GenericContainer value) {
+  public Pair(CharSequence key, GenericContainer value) {
     this((K)key, STRING_SCHEMA, (V)value, value.getSchema());
   }
   @SuppressWarnings("unchecked")
-  public Pair(Utf8 key, Utf8 value) {
+  public Pair(CharSequence key, CharSequence value) {
     this((K)key, STRING_SCHEMA, (V)value, STRING_SCHEMA);
   }
   @SuppressWarnings("unchecked")
-  public Pair(Utf8 key, ByteBuffer value) {
+  public Pair(CharSequence key, ByteBuffer value) {
     this((K)key, STRING_SCHEMA, (V)value, BYTES_SCHEMA);
   }
   @SuppressWarnings("unchecked")
-  public Pair(Utf8 key, Integer value) {
+  public Pair(CharSequence key, Integer value) {
     this((K)key, STRING_SCHEMA, (V)value, INT_SCHEMA);
   }
   @SuppressWarnings("unchecked")
-  public Pair(Utf8 key, Long value) {
+  public Pair(CharSequence key, Long value) {
     this((K)key, STRING_SCHEMA, (V)value, LONG_SCHEMA);
   }
   @SuppressWarnings("unchecked")
-  public Pair(Utf8 key, Float value) {
+  public Pair(CharSequence key, Float value) {
     this((K)key, STRING_SCHEMA, (V)value, FLOAT_SCHEMA);
   }
   @SuppressWarnings("unchecked")
-  public Pair(Utf8 key, Double value) {
+  public Pair(CharSequence key, Double value) {
     this((K)key, STRING_SCHEMA, (V)value, DOUBLE_SCHEMA);
   }
   @SuppressWarnings("unchecked")
-  public Pair(Utf8 key, Void value) {
+  public Pair(CharSequence key, Void value) {
     this((K)key, STRING_SCHEMA, (V)value, NULL_SCHEMA);
   }
   @SuppressWarnings("unchecked")
@@ -232,7 +231,7 @@ public class Pair<K,V>
     this((K)key, BYTES_SCHEMA, (V)value, value.getSchema());
   }
   @SuppressWarnings("unchecked")
-  public Pair(ByteBuffer key, Utf8 value) {
+  public Pair(ByteBuffer key, CharSequence value) {
     this((K)key, BYTES_SCHEMA, (V)value, STRING_SCHEMA);
   }
   @SuppressWarnings("unchecked")
@@ -264,7 +263,7 @@ public class Pair<K,V>
     this((K)key, INT_SCHEMA, (V)value, value.getSchema());
   }
   @SuppressWarnings("unchecked")
-  public Pair(Integer key, Utf8 value) {
+  public Pair(Integer key, CharSequence value) {
     this((K)key, INT_SCHEMA, (V)value, STRING_SCHEMA);
   }
   @SuppressWarnings("unchecked")
@@ -296,7 +295,7 @@ public class Pair<K,V>
     this((K)key, LONG_SCHEMA, (V)value, value.getSchema());
   }
   @SuppressWarnings("unchecked")
-  public Pair(Long key, Utf8 value) {
+  public Pair(Long key, CharSequence value) {
     this((K)key, LONG_SCHEMA, (V)value, STRING_SCHEMA);
   }
   @SuppressWarnings("unchecked")
@@ -328,7 +327,7 @@ public class Pair<K,V>
     this((K)key, FLOAT_SCHEMA, (V)value, value.getSchema());
   }
   @SuppressWarnings("unchecked")
-  public Pair(Float key, Utf8 value) {
+  public Pair(Float key, CharSequence value) {
     this((K)key, FLOAT_SCHEMA, (V)value, STRING_SCHEMA);
   }
   @SuppressWarnings("unchecked")
@@ -360,7 +359,7 @@ public class Pair<K,V>
     this((K)key, DOUBLE_SCHEMA, (V)value, value.getSchema());
   }
   @SuppressWarnings("unchecked")
-  public Pair(Double key, Utf8 value) {
+  public Pair(Double key, CharSequence value) {
     this((K)key, DOUBLE_SCHEMA, (V)value, STRING_SCHEMA);
   }
   @SuppressWarnings("unchecked")
@@ -392,7 +391,7 @@ public class Pair<K,V>
     this((K)key, NULL_SCHEMA, (V)value, value.getSchema());
   }
   @SuppressWarnings("unchecked")
-  public Pair(Void key, Utf8 value) {
+  public Pair(Void key, CharSequence value) {
     this((K)key, NULL_SCHEMA, (V)value, STRING_SCHEMA);
   }
   @SuppressWarnings("unchecked")
@@ -422,7 +421,7 @@ public class Pair<K,V>
 
   // private static final String[][] TABLE = new String[][] {
   //   {"GenericContainer", "{0}.getSchema()"},
-  //   {"Utf8", "STRING_SCHEMA"},
+  //   {"CharSequence", "STRING_SCHEMA"},
   //   {"ByteBuffer", "BYTES_SCHEMA"},
   //   {"Integer", "INT_SCHEMA"},
   //   {"Long", "LONG_SCHEMA"},

Modified: avro/trunk/lang/java/src/java/org/apache/avro/mapred/tether/TetherOutputService.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/mapred/tether/TetherOutputService.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/mapred/tether/TetherOutputService.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/mapred/tether/TetherOutputService.java Tue Aug 10 17:09:04 2010
@@ -24,8 +24,6 @@ import org.apache.hadoop.io.NullWritable
 import org.apache.hadoop.mapred.OutputCollector;
 import org.apache.hadoop.mapred.Reporter;
 
-import org.apache.avro.util.Utf8;
-
 class TetherOutputService implements OutputProtocol {
   private Reporter reporter;
   private OutputCollector<TetherData, NullWritable> collector;
@@ -69,14 +67,14 @@ class TetherOutputService implements Out
     output(datum);
   }
 
-  public void status(Utf8 message) { reporter.setStatus(message.toString());  }
+  public void status(CharSequence message) { reporter.setStatus(message.toString());  }
 
 
-  public void count(Utf8 group, Utf8 name, long amount) {
+  public void count(CharSequence group, CharSequence name, long amount) {
     reporter.getCounter(group.toString(), name.toString()).increment(amount);
   }
 
-  public synchronized void fail(Utf8 message) {
+  public synchronized void fail(CharSequence message) {
     TetherMapRunner.LOG.warn("Failing: "+message);
     error = message.toString();
     notify();

Modified: avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java Tue Aug 10 17:09:04 2010
@@ -84,11 +84,6 @@ public class ReflectData extends Specifi
   }
 
   @Override
-  protected boolean isString(Object datum) {
-    return datum instanceof String;
-  }
-
-  @Override
   protected boolean isBytes(Object datum) {
     if (datum == null) return false;
     Class c = datum.getClass();
@@ -244,7 +239,7 @@ public class ReflectData extends Specifi
         setElement(result, component);
         return result;
       }
-      if (c == String.class)                                 // String
+      if (CharSequence.class.isAssignableFrom(c))            // String
         return Schema.create(Schema.Type.STRING);
       String fullName = c.getName();
       Schema schema = names.get(fullName);

Modified: avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumWriter.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumWriter.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumWriter.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumWriter.java Tue Aug 10 17:09:04 2010
@@ -26,7 +26,6 @@ import org.apache.avro.AvroRuntimeExcept
 import org.apache.avro.Schema;
 import org.apache.avro.specific.SpecificDatumWriter;
 import org.apache.avro.io.Encoder;
-import org.apache.avro.util.Utf8;
 
 /**
  * {@link org.apache.avro.io.DatumWriter DatumWriter} for existing classes
@@ -98,11 +97,6 @@ public class ReflectDatumWriter<T> exten
   }
 
   @Override
-  protected void writeString(Object datum, Encoder out) throws IOException {
-    out.writeString(new Utf8((String)datum));
-  }
-
-  @Override
   protected void writeBytes(Object datum, Encoder out) throws IOException {
     out.writeBytes((byte[])datum);
   }

Modified: avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectResponder.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectResponder.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectResponder.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectResponder.java Tue Aug 10 17:09:04 2010
@@ -26,7 +26,6 @@ import org.apache.avro.io.Encoder;
 import org.apache.avro.io.DatumReader;
 import org.apache.avro.io.DatumWriter;
 import org.apache.avro.specific.SpecificResponder;
-import org.apache.avro.util.Utf8;
 
 /** {@link org.apache.avro.ipc.Responder} for existing interfaces.*/
 public class ReflectResponder extends SpecificResponder {
@@ -51,7 +50,7 @@ public class ReflectResponder extends Sp
   @Override
   public void writeError(Schema schema, Object error,
                          Encoder out) throws IOException {
-    if (error instanceof Utf8)
+    if (error instanceof CharSequence)
       error = error.toString();                   // system error: convert
     super.writeError(schema, error, out);
   }

Modified: avro/trunk/lang/java/src/java/org/apache/avro/specific/SpecificCompiler.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/specific/SpecificCompiler.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/specific/SpecificCompiler.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/specific/SpecificCompiler.java Tue Aug 10 17:09:04 2010
@@ -346,13 +346,13 @@ public class SpecificCompiler {
     case ARRAY:
       return "org.apache.avro.generic.GenericArray<"+type(schema.getElementType())+">";
     case MAP:
-      return "java.util.Map<org.apache.avro.util.Utf8,"+type(schema.getValueType())+">";
+      return "java.util.Map<java.lang.CharSequence,"+type(schema.getValueType())+">";
     case UNION:
       List<Schema> types = schema.getTypes();     // elide unions with null
       if ((types.size() == 2) && types.contains(NULL_SCHEMA))
         return type(types.get(types.get(0).equals(NULL_SCHEMA) ? 1 : 0));
       return "java.lang.Object";
-    case STRING:  return "org.apache.avro.util.Utf8";
+    case STRING:  return "java.lang.CharSequence";
     case BYTES:   return "java.nio.ByteBuffer";
     case INT:     return "java.lang.Integer";
     case LONG:    return "java.lang.Long";

Modified: avro/trunk/lang/java/src/java/org/apache/avro/specific/SpecificData.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/specific/SpecificData.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/specific/SpecificData.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/specific/SpecificData.java Tue Aug 10 17:09:04 2010
@@ -32,7 +32,6 @@ import org.apache.avro.AvroTypeException
 import org.apache.avro.Schema.Type;
 import org.apache.avro.generic.GenericData;
 import org.apache.avro.generic.GenericArray;
-import org.apache.avro.util.Utf8;
 
 /** Utilities for generated Java classes and interfaces. */
 public class SpecificData extends GenericData {
@@ -45,29 +44,8 @@ public class SpecificData extends Generi
   public static SpecificData get() { return INSTANCE; }
 
   @Override
-  protected boolean isRecord(Object datum) {
-    return datum instanceof SpecificRecord;
-  }
-
-  @Override
-  protected Schema getRecordSchema(Object record) {
-    return ((SpecificRecord)record).getSchema();
-  }
-
-  @Override
   protected boolean isEnum(Object datum) {
-    return datum instanceof Enum;
-  }
-
-  @Override
-  public boolean validate(Schema schema, Object datum) {
-    switch (schema.getType()) {
-    case ENUM:
-      return datum instanceof Enum
-        && schema.getEnumSymbols().contains(((Enum)datum).name());
-    default:
-      return super.validate(schema, datum);
-    }
+    return datum instanceof Enum || super.isEnum(datum);
   }
 
   private Map<String,Class> classCache = new ConcurrentHashMap<String,Class>();
@@ -99,7 +77,7 @@ public class SpecificData extends Generi
       if ((types.size() == 2) && types.contains(NULL_SCHEMA))
         return getClass(types.get(types.get(0).equals(NULL_SCHEMA) ? 1 : 0));
       return Object.class;
-    case STRING:  return Utf8.class;
+    case STRING:  return CharSequence.class;
     case BYTES:   return ByteBuffer.class;
     case INT:     return Integer.TYPE;
     case LONG:    return Long.TYPE;
@@ -138,7 +116,8 @@ public class SpecificData extends Generi
   @SuppressWarnings(value="unchecked")
   protected Schema createSchema(java.lang.reflect.Type type,
                                 Map<String,Schema> names) {
-    if (type == Utf8.class)
+    if (type instanceof Class
+        && CharSequence.class.isAssignableFrom((Class)type))
       return Schema.create(Type.STRING);
     else if (type == ByteBuffer.class)
       return Schema.create(Type.BYTES);
@@ -165,8 +144,9 @@ public class SpecificData extends Generi
       } else if (Map.class.isAssignableFrom(raw)) {   // map
         java.lang.reflect.Type key = params[0];
         java.lang.reflect.Type value = params[1];
-        if (!(key == Utf8.class))
-          throw new AvroTypeException("Map key class not Utf8: "+key);
+        if (!(type instanceof Class
+              && CharSequence.class.isAssignableFrom((Class)type)))
+          throw new AvroTypeException("Map key class not CharSequence: "+key);
         return Schema.createMap(createSchema(value, names));
       } else {
         return createSchema(raw, names);

Modified: avro/trunk/lang/java/src/java/org/apache/avro/util/Utf8.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/util/Utf8.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/util/Utf8.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/util/Utf8.java Tue Aug 10 17:09:04 2010
@@ -20,15 +20,16 @@ package org.apache.avro.util;
 import java.io.UnsupportedEncodingException;
 
 import org.apache.avro.io.BinaryData;
-import org.apache.avro.reflect.Stringable;
 
-/** A Utf8 string. */
-@Stringable
-public class Utf8 implements Comparable<Utf8> {
+/** A Utf8 string.  Unlike {@link String}, instances are mutable.  This is more
+ * efficient than {@link String} when reading or writing a sequence of values,
+ * as a single instance may be reused. */
+public class Utf8 implements Comparable<Utf8>, CharSequence {
   private static final byte[] EMPTY = new byte[0];
 
-  byte[] bytes = EMPTY;
-  int length;
+  private byte[] bytes = EMPTY;
+  private int length;
+  private String string;
 
   public Utf8() {}
 
@@ -39,6 +40,7 @@ public class Utf8 implements Comparable<
       throw new RuntimeException(e);
     }
     this.length = bytes.length;
+    this.string = string;
   }
 
   public Utf8(byte[] bytes) {
@@ -46,25 +48,45 @@ public class Utf8 implements Comparable<
     this.length = bytes.length;
   }
 
+  /** Return UTF-8 encoded bytes.
+   * Only valid through {@link #getByteLength()}. */
   public byte[] getBytes() { return bytes; }
+
+  /** Return length in bytes.
+   * @deprecated call {@link #getByteLength()} instead. */
   public int getLength() { return length; }
 
+  /** Return length in bytes. */
+  public int getByteLength() { return length; }
+
+  /** Set length in bytes.  Should called whenever byte content changes, even
+   * if the length does not change, as this also clears the cached String.
+   * @deprecated call {@link #setByteLength(int)} instead. */
   public Utf8 setLength(int newLength) {
+    return setByteLength(newLength);
+  }
+
+  /** Set length in bytes.  Should called whenever byte content changes, even
+   * if the length does not change, as this also clears the cached String. */
+  public Utf8 setByteLength(int newLength) {
     if (this.length < newLength) {
       byte[] newBytes = new byte[newLength];
       System.arraycopy(bytes, 0, newBytes, 0, this.length);
       this.bytes = newBytes;
     }
     this.length = newLength;
+    this.string = null;
     return this;
   }
 
   public String toString() {
-    try {
-      return new String(bytes, 0, length, "UTF-8");
-    } catch (UnsupportedEncodingException e) {
-      throw new RuntimeException(e);
-    }
+    if (this.string == null)
+      try {
+        this.string = new String(bytes, 0, length, "UTF-8");
+      } catch (UnsupportedEncodingException e) {
+        throw new RuntimeException(e);
+      }
+    return this.string;
   }
 
   public boolean equals(Object o) {
@@ -91,4 +113,12 @@ public class Utf8 implements Comparable<
                                    that.bytes, 0, that.length);
   }
 
+  // CharSequence implementation
+  @Override public char charAt(int index) { return toString().charAt(index); }
+  @Override public int length() { return toString().length(); }
+  @Override public CharSequence subSequence(int start, int end) {
+    return toString().subSequence(start, end);
+  }
+
+
 }

Modified: avro/trunk/lang/java/src/test/java/org/apache/avro/RPCMetaTestPlugin.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/java/org/apache/avro/RPCMetaTestPlugin.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/test/java/org/apache/avro/RPCMetaTestPlugin.java (original)
+++ avro/trunk/lang/java/src/test/java/org/apache/avro/RPCMetaTestPlugin.java Tue Aug 10 17:09:04 2010
@@ -36,7 +36,7 @@ import org.apache.avro.util.Utf8;
  */
 public final class RPCMetaTestPlugin extends RPCPlugin {
   
-  protected final Utf8 key;
+  protected final CharSequence key;
   
   public RPCMetaTestPlugin(String keyname) {
     key = new Utf8(keyname);
@@ -73,7 +73,7 @@ public final class RPCMetaTestPlugin ext
   
   @Override
   public void clientFinishConnect(RPCContext context) {
-    Map<Utf8,ByteBuffer> handshakeMeta = context.responseHandshakeMeta();
+    Map<CharSequence,ByteBuffer> handshakeMeta = context.responseHandshakeMeta();
     
     Assert.assertNull(context.getRequestPayload());
     Assert.assertNull(context.getResponsePayload());
@@ -107,7 +107,7 @@ public final class RPCMetaTestPlugin ext
   
   @Override
   public void serverReceiveRequest(RPCContext context) {
-    Map<Utf8,ByteBuffer> meta = context.requestCallMeta();
+    Map<CharSequence,ByteBuffer> meta = context.requestCallMeta();
     
     Assert.assertNotNull(meta);    
     Assert.assertNotNull(context.getMessage());
@@ -175,7 +175,7 @@ public final class RPCMetaTestPlugin ext
     checkRPCMetaMap(context.responseCallMeta());
   }
   
-  protected void checkRPCMetaMap(Map<Utf8,ByteBuffer> rpcMeta) {
+  protected void checkRPCMetaMap(Map<CharSequence,ByteBuffer> rpcMeta) {
     Assert.assertNotNull(rpcMeta);
     Assert.assertTrue("key not present in map", rpcMeta.containsKey(key));
     

Modified: avro/trunk/lang/java/src/test/java/org/apache/avro/RandomData.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/java/org/apache/avro/RandomData.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/test/java/org/apache/avro/RandomData.java (original)
+++ avro/trunk/lang/java/src/test/java/org/apache/avro/RandomData.java Tue Aug 10 17:09:04 2010
@@ -71,7 +71,7 @@ public class RandomData implements Itera
       return record;
     case ENUM:
       List<String> symbols = schema.getEnumSymbols();
-      return symbols.get(random.nextInt(symbols.size()));
+      return new GenericData.EnumSymbol(symbols.get(random.nextInt(symbols.size())));
     case ARRAY:
       int length = (random.nextInt(5)+2)-d;
       GenericArray<Object> array =

Modified: avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolGeneric.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolGeneric.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolGeneric.java (original)
+++ avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolGeneric.java Tue Aug 10 17:09:04 2010
@@ -123,7 +123,7 @@ public class TestProtocolGeneric {
     GenericRecord record =
       new GenericData.Record(PROTOCOL.getType("TestRecord"));
     record.put("name", new Utf8("foo"));
-    record.put("kind", "BAR");
+    record.put("kind", new GenericData.EnumSymbol("BAR"));
     record.put("hash", new GenericData.Fixed
                (new byte[]{0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5}));
     GenericRecord params =

Modified: avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolSpecific.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolSpecific.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolSpecific.java (original)
+++ avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolSpecific.java Tue Aug 10 17:09:04 2010
@@ -56,7 +56,9 @@ public class TestProtocolSpecific {
   private static boolean throwUndeclaredError;
 
   public static class TestImpl implements Simple {
-    public Utf8 hello(Utf8 greeting) { return new Utf8("goodbye"); }
+    public CharSequence hello(CharSequence greeting) {
+      return new Utf8("goodbye");
+    }
     public int add(int arg1, int arg2) { return arg1 + arg2; }
     public TestRecord echo(TestRecord record) { return record; }
     public ByteBuffer echoBytes(ByteBuffer data) { return data; }
@@ -85,7 +87,7 @@ public class TestProtocolSpecific {
 
   @Test
   public void testHello() throws IOException {
-    Utf8 response = proxy.hello(new Utf8("bob"));
+    CharSequence response = proxy.hello(new Utf8("bob"));
     assertEquals(new Utf8("goodbye"), response);
   }
 

Modified: avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java (original)
+++ avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java Tue Aug 10 17:09:04 2010
@@ -182,7 +182,7 @@ public class TestSchema {
 
   @Test
   public void testEnum() throws Exception {
-    check(BASIC_ENUM_SCHEMA, "\"B\"", "B", false);
+    check(BASIC_ENUM_SCHEMA, "\"B\"", new GenericData.EnumSymbol("B"), false);
     checkParseError("{\"type\":\"enum\"}");        // symbols required
     checkParseError("{\"type\":\"enum\",\"symbols\": [\"X\",\"X\"]}");
   }
@@ -242,7 +242,9 @@ public class TestSchema {
     checkJson(union,
               new GenericData.Fixed(new byte[]{(byte)'a'}),
               "{\"Bar\":\"a\"}");
-    checkJson(union, "X", "{\"Baz\":\"X\"}");
+    checkJson(union,
+              new GenericData.EnumSymbol("X"),
+              "{\"Baz\":\"X\"}");
   }
 
   @Test
@@ -518,13 +520,14 @@ public class TestSchema {
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     DatumWriter<Object> writer = new GenericDatumWriter<Object>(actual);
     Encoder encoder = new BinaryEncoder(out);
-    writer.write("Y", encoder);
-    writer.write("X", encoder);
+    writer.write(new GenericData.EnumSymbol("Y"), encoder);
+    writer.write(new GenericData.EnumSymbol("X"), encoder);
     byte[] data = out.toByteArray();
     Decoder decoder = DecoderFactory.defaultFactory().createBinaryDecoder(
         data, null);
     DatumReader<String> in = new GenericDatumReader<String>(actual, expected);
-    assertEquals("Wrong value", "Y", in.read(null, decoder));
+    assertEquals("Wrong value", new GenericData.EnumSymbol("Y"),
+                 in.read(null, decoder));
     try {
       in.read(null, decoder);
       fail("Should have thrown exception.");

Modified: avro/trunk/lang/java/src/test/java/org/apache/avro/ipc/TestNettyServer.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/java/org/apache/avro/ipc/TestNettyServer.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/test/java/org/apache/avro/ipc/TestNettyServer.java (original)
+++ avro/trunk/lang/java/src/test/java/org/apache/avro/ipc/TestNettyServer.java Tue Aug 10 17:09:04 2010
@@ -15,7 +15,7 @@ public class TestNettyServer {
 
   public static class MailImpl implements Mail {
     // in this simple example just return details of the message
-    public Utf8 send(Message message) {
+    public CharSequence send(Message message) {
       return new Utf8("Sent message to [" + message.to.toString() + "] from ["
           + message.from.toString() + "] with body [" + message.body.toString()
           + "]");
@@ -44,7 +44,7 @@ public class TestNettyServer {
     msg.body = new Utf8("I love you!");
 
     try {
-      Utf8 result = proxy.send(msg);
+      CharSequence result = proxy.send(msg);
       System.out.println("Result: " + result);
       Assert.assertEquals(
           "Sent message to [wife] from [husband] with body [I love you!]",

Modified: avro/trunk/lang/java/src/test/java/org/apache/avro/mapred/tether/TetherTask.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/java/org/apache/avro/mapred/tether/TetherTask.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/test/java/org/apache/avro/mapred/tether/TetherTask.java (original)
+++ avro/trunk/lang/java/src/test/java/org/apache/avro/mapred/tether/TetherTask.java Tue Aug 10 17:09:04 2010
@@ -107,7 +107,7 @@ public abstract class TetherTask<IN,MID,
     outputClient.configure(inputPort);
   }
 
-  void configure(TaskType taskType, Utf8 inSchemaText, Utf8 outSchemaText) {
+  void configure(TaskType taskType, CharSequence inSchemaText, CharSequence outSchemaText) {
     this.taskType = taskType;
     try {
       Schema inSchema = Schema.parse(inSchemaText.toString());

Modified: avro/trunk/lang/java/src/test/java/org/apache/avro/mapred/tether/TetherTaskRunner.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/java/org/apache/avro/mapred/tether/TetherTaskRunner.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/test/java/org/apache/avro/mapred/tether/TetherTaskRunner.java (original)
+++ avro/trunk/lang/java/src/test/java/org/apache/avro/mapred/tether/TetherTaskRunner.java Tue Aug 10 17:09:04 2010
@@ -25,7 +25,6 @@ import java.nio.ByteBuffer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.avro.util.Utf8;
 import org.apache.avro.ipc.SocketServer;
 import org.apache.avro.specific.SpecificResponder;
 
@@ -53,8 +52,8 @@ public class TetherTaskRunner implements
   }
 
   @Override public void configure(TaskType taskType,
-                                  Utf8 inSchema,
-                                  Utf8 outSchema) {
+                                  CharSequence inSchema,
+                                  CharSequence outSchema) {
     LOG.info("got configure");
     task.configure(taskType, inSchema, outSchema);
   }

Modified: avro/trunk/lang/java/src/test/java/org/apache/avro/specific/TestSpecificCompiler.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/java/org/apache/avro/specific/TestSpecificCompiler.java?rev=984128&r1=984127&r2=984128&view=diff
==============================================================================
--- avro/trunk/lang/java/src/test/java/org/apache/avro/specific/TestSpecificCompiler.java (original)
+++ avro/trunk/lang/java/src/test/java/org/apache/avro/specific/TestSpecificCompiler.java Tue Aug 10 17:09:04 2010
@@ -103,7 +103,7 @@ public class TestSpecificCompiler {
     assertTrue(errType.contains("public class finally$ extends org.apache.avro.specific.SpecificExceptionBase"));
     assertTrue(errType.contains("public boolean catch$;"));
 
-    assertTrue(protocol.contains("org.apache.avro.util.Utf8 goto$(org.apache.avro.util.Utf8 break$)"));
+    assertTrue(protocol.contains("java.lang.CharSequence goto$(java.lang.CharSequence break$)"));
     assertTrue(protocol.contains("public interface default$"));
     assertTrue(protocol.contains("throws org.apache.avro.ipc.AvroRemoteException, finally$"));
     
@@ -122,7 +122,7 @@ public class TestSpecificCompiler {
     assertEquals(1, c.size());
     String contents = c.iterator().next().contents;
 
-    assertTrue(contents.contains("public org.apache.avro.util.Utf8 package$;"));
+    assertTrue(contents.contains("public java.lang.CharSequence package$;"));
     assertTrue(contents.contains("class volatile$ extends"));
     assertTrue(contents.contains("volatile$ short$;"));