Author: ddas Date: Mon Aug 31 07:56:39 2009 New Revision: 809491 URL: http://svn.apache.org/viewvc?rev=809491&view=rev Log: HADOOP-6224. Adds methods to read strings safely, makes the Buffer class in DataOutputBuffer public, and introduces public constructors there. These changes are required for MAPREDUCE-318. Contributed by Jothi Padmanabhan and Arun Murthy.
Modified: hadoop/common/trunk/CHANGES.txt hadoop/common/trunk/src/java/org/apache/hadoop/io/DataOutputBuffer.java hadoop/common/trunk/src/java/org/apache/hadoop/io/Text.java Modified: hadoop/common/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/trunk/CHANGES.txt?rev=809491&r1=809490&r2=809491&view=diff ============================================================================== --- hadoop/common/trunk/CHANGES.txt (original) +++ hadoop/common/trunk/CHANGES.txt Mon Aug 31 07:56:39 2009 @@ -507,6 +507,10 @@ HADOOP-6184. Provide an API to dump Configuration in a JSON format. (V.V.Chaitanya Krishna via yhemanth) + + HADOOP-6224. Adds methods to read strings safely, makes the Buffer class + in DataOutputBuffer public, and introduces public constructors there. These changes + are required for MAPREDUCE-318. (Jothi Padmanabhan and Arun Murthy via ddas) OPTIMIZATIONS Modified: hadoop/common/trunk/src/java/org/apache/hadoop/io/DataOutputBuffer.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/io/DataOutputBuffer.java?rev=809491&r1=809490&r2=809491&view=diff ============================================================================== --- hadoop/common/trunk/src/java/org/apache/hadoop/io/DataOutputBuffer.java (original) +++ hadoop/common/trunk/src/java/org/apache/hadoop/io/DataOutputBuffer.java Mon Aug 31 07:56:39 2009 @@ -20,6 +20,8 @@ import java.io.*; +import org.apache.hadoop.io.DataOutputBuffer.Buffer; + /** A reusable {...@link DataOutput} implementation that writes to an in-memory * buffer. * @@ -41,7 +43,7 @@ */ public class DataOutputBuffer extends DataOutputStream { - private static class Buffer extends ByteArrayOutputStream { + public static class Buffer extends ByteArrayOutputStream { public byte[] getData() { return buf; } public int getLength() { return count; } @@ -53,6 +55,10 @@ super(size); } + public Buffer(byte[] buf) { + super.buf = buf; + } + public void write(DataInput in, int len) throws IOException { int newcount = count + len; if (newcount > buf.length) { @@ -76,6 +82,10 @@ this(new Buffer(size)); } + public DataOutputBuffer(byte[] buf) { + this(new Buffer(buf)); + } + private DataOutputBuffer(Buffer buffer) { super(buffer); this.buffer = buffer; Modified: hadoop/common/trunk/src/java/org/apache/hadoop/io/Text.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/io/Text.java?rev=809491&r1=809490&r2=809491&view=diff ============================================================================== --- hadoop/common/trunk/src/java/org/apache/hadoop/io/Text.java (original) +++ hadoop/common/trunk/src/java/org/apache/hadoop/io/Text.java Mon Aug 31 07:56:39 2009 @@ -35,6 +35,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.io.WritableUtils; /** This class stores text using standard UTF8 encoding. It provides methods * to serialize, deserialize, and compare texts at byte level. The type of @@ -403,6 +404,30 @@ in.readFully(bytes, 0, length); return decode(bytes); } + /** + * Read a string, but check it for sanity. The format consists of a vint + * followed by the given number of bytes. + * @param in the stream to read from + * @param maxLength the largest acceptable length of string + * @return the bytes as a string + * @throws IOException if reading from the DataInput fails + * @throws IllegalArgumentException if the string length is negative or + * larger than maxSize. Only the vint is read. + */ + public static String readStringSafely(DataInput in, + int maxLength + ) throws IOException, + IllegalArgumentException { + int length = WritableUtils.readVInt(in); + if (length < 0 || length > maxLength) { + throw new IllegalArgumentException("String size was " + length + + ", which is outside of 0.." + + maxLength); + } + byte [] bytes = new byte[length]; + in.readFully(bytes, 0, length); + return decode(bytes); + } /** Write a UTF8 encoded string to out */