You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ch...@apache.org on 2017/04/10 14:49:44 UTC
activemq git commit: AMQ-6651: Add new implementations of the
writeUTF8 and readUTF8 methods that are based on Apache Harmony code. This
also avoid some code duplication that was occurring.
Repository: activemq
Updated Branches:
refs/heads/master 58046194d -> 172c29091
AMQ-6651: Add new implementations of the writeUTF8 and readUTF8 methods that are based on Apache Harmony code. This also avoid some code duplication that was occurring.
Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/172c2909
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/172c2909
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/172c2909
Branch: refs/heads/master
Commit: 172c29091e340515341daee0f10e1334db905721
Parents: 5804619
Author: Hiram Chirino <hi...@hiramchirino.com>
Authored: Thu Apr 6 11:55:08 2017 -0400
Committer: Hiram Chirino <hi...@hiramchirino.com>
Committed: Mon Apr 10 10:49:17 2017 -0400
----------------------------------------------------------------------
.../activemq/util/DataByteArrayInputStream.java | 62 +------
.../util/DataByteArrayOutputStream.java | 45 +----
.../activemq/util/MarshallingSupport.java | 175 +++++++++----------
.../disk/util/DataByteArrayInputStream.java | 36 +---
.../disk/util/DataByteArrayOutputStream.java | 38 +---
5 files changed, 110 insertions(+), 246 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq/blob/172c2909/activemq-client/src/main/java/org/apache/activemq/util/DataByteArrayInputStream.java
----------------------------------------------------------------------
diff --git a/activemq-client/src/main/java/org/apache/activemq/util/DataByteArrayInputStream.java b/activemq-client/src/main/java/org/apache/activemq/util/DataByteArrayInputStream.java
index 0a13aa0..2fe92a1 100644
--- a/activemq-client/src/main/java/org/apache/activemq/util/DataByteArrayInputStream.java
+++ b/activemq-client/src/main/java/org/apache/activemq/util/DataByteArrayInputStream.java
@@ -259,62 +259,12 @@ public final class DataByteArrayInputStream extends InputStream implements DataI
public String readUTF() throws IOException {
int length = readUnsignedShort();
- char[] characters = new char[length];
- int c;
- int c2;
- int c3;
- int count = 0;
- int total = pos + length;
- while (pos < total) {
- c = (int)buf[pos] & 0xff;
- if (c > 127) {
- break;
- }
- pos++;
- characters[count++] = (char)c;
- }
- while (pos < total) {
- c = (int)buf[pos] & 0xff;
- switch (c >> 4) {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- pos++;
- characters[count++] = (char)c;
- break;
- case 12:
- case 13:
- pos += 2;
- if (pos > total) {
- throw new UTFDataFormatException("bad string");
- }
- c2 = (int)buf[pos - 1];
- if ((c2 & 0xC0) != 0x80) {
- throw new UTFDataFormatException("bad string");
- }
- characters[count++] = (char)(((c & 0x1F) << 6) | (c2 & 0x3F));
- break;
- case 14:
- pos += 3;
- if (pos > total) {
- throw new UTFDataFormatException("bad string");
- }
- c2 = (int)buf[pos - 2];
- c3 = (int)buf[pos - 1];
- if (((c2 & 0xC0) != 0x80) || ((c3 & 0xC0) != 0x80)) {
- throw new UTFDataFormatException("bad string");
- }
- characters[count++] = (char)(((c & 0x0F) << 12) | ((c2 & 0x3F) << 6) | ((c3 & 0x3F) << 0));
- break;
- default:
- throw new UTFDataFormatException("bad string");
- }
+ if (pos + length > buf.length) {
+ throw new UTFDataFormatException("bad string");
}
- return new String(characters, 0, count);
+ char chararr[] = new char[length];
+ String result = MarshallingSupport.convertUTF8WithBuf(buf, chararr, pos, length);
+ pos += length;
+ return result;
}
}
http://git-wip-us.apache.org/repos/asf/activemq/blob/172c2909/activemq-client/src/main/java/org/apache/activemq/util/DataByteArrayOutputStream.java
----------------------------------------------------------------------
diff --git a/activemq-client/src/main/java/org/apache/activemq/util/DataByteArrayOutputStream.java b/activemq-client/src/main/java/org/apache/activemq/util/DataByteArrayOutputStream.java
index e1035fc..692fb94 100644
--- a/activemq-client/src/main/java/org/apache/activemq/util/DataByteArrayOutputStream.java
+++ b/activemq-client/src/main/java/org/apache/activemq/util/DataByteArrayOutputStream.java
@@ -202,46 +202,17 @@ public final class DataByteArrayOutputStream extends OutputStream implements Dat
}
}
- public void writeUTF(String str) throws IOException {
- int strlen = str.length();
- int encodedsize = 0;
- int c;
- for (int i = 0; i < strlen; i++) {
- c = str.charAt(i);
- if ((c >= 0x0001) && (c <= 0x007F)) {
- encodedsize++;
- } else if (c > 0x07FF) {
- encodedsize += 3;
- } else {
- encodedsize += 2;
- }
- }
+ public void writeUTF(String text) throws IOException {
+ long encodedsize = MarshallingSupport.countUTFBytes(text);
if (encodedsize > 65535) {
throw new UTFDataFormatException("encoded string too long: " + encodedsize + " bytes");
}
- ensureEnoughBuffer(pos + encodedsize + 2);
- writeShort(encodedsize);
- int i = 0;
- for (i = 0; i < strlen; i++) {
- c = str.charAt(i);
- if (!((c >= 0x0001) && (c <= 0x007F))) {
- break;
- }
- buf[pos++] = (byte)c;
- }
- for (; i < strlen; i++) {
- c = str.charAt(i);
- if ((c >= 0x0001) && (c <= 0x007F)) {
- buf[pos++] = (byte)c;
- } else if (c > 0x07FF) {
- buf[pos++] = (byte)(0xE0 | ((c >> 12) & 0x0F));
- buf[pos++] = (byte)(0x80 | ((c >> 6) & 0x3F));
- buf[pos++] = (byte)(0x80 | ((c >> 0) & 0x3F));
- } else {
- buf[pos++] = (byte)(0xC0 | ((c >> 6) & 0x1F));
- buf[pos++] = (byte)(0x80 | ((c >> 0) & 0x3F));
- }
- }
+ ensureEnoughBuffer((int)(pos + encodedsize + 2));
+ writeShort((int)encodedsize);
+
+ byte[] buffer = new byte[(int)encodedsize];
+ MarshallingSupport.writeUTFBytesToBuffer(text, (int) encodedsize, buf, pos);
+ pos += encodedsize;
}
private void ensureEnoughBuffer(int newcount) {
http://git-wip-us.apache.org/repos/asf/activemq/blob/172c2909/activemq-client/src/main/java/org/apache/activemq/util/MarshallingSupport.java
----------------------------------------------------------------------
diff --git a/activemq-client/src/main/java/org/apache/activemq/util/MarshallingSupport.java b/activemq-client/src/main/java/org/apache/activemq/util/MarshallingSupport.java
index 90ecb44..f290731 100644
--- a/activemq-client/src/main/java/org/apache/activemq/util/MarshallingSupport.java
+++ b/activemq-client/src/main/java/org/apache/activemq/util/MarshallingSupport.java
@@ -296,115 +296,100 @@ public final class MarshallingSupport {
public static void writeUTF8(DataOutput dataOut, String text) throws IOException {
if (text != null) {
- int strlen = text.length();
- int utflen = 0;
- char[] charr = new char[strlen];
- int c = 0;
- int count = 0;
-
- text.getChars(0, strlen, charr, 0);
-
- for (int i = 0; i < strlen; i++) {
- c = charr[i];
- if ((c >= 0x0001) && (c <= 0x007F)) {
- utflen++;
- } else if (c > 0x07FF) {
- utflen += 3;
- } else {
- utflen += 2;
- }
- }
- // TODO diff: Sun code - removed
- byte[] bytearr = new byte[utflen + 4]; // TODO diff: Sun code
- bytearr[count++] = (byte)((utflen >>> 24) & 0xFF); // TODO diff:
- // Sun code
- bytearr[count++] = (byte)((utflen >>> 16) & 0xFF); // TODO diff:
- // Sun code
- bytearr[count++] = (byte)((utflen >>> 8) & 0xFF);
- bytearr[count++] = (byte)((utflen >>> 0) & 0xFF);
- for (int i = 0; i < strlen; i++) {
- c = charr[i];
- if ((c >= 0x0001) && (c <= 0x007F)) {
- bytearr[count++] = (byte)c;
- } else if (c > 0x07FF) {
- bytearr[count++] = (byte)(0xE0 | ((c >> 12) & 0x0F));
- bytearr[count++] = (byte)(0x80 | ((c >> 6) & 0x3F));
- bytearr[count++] = (byte)(0x80 | ((c >> 0) & 0x3F));
- } else {
- bytearr[count++] = (byte)(0xC0 | ((c >> 6) & 0x1F));
- bytearr[count++] = (byte)(0x80 | ((c >> 0) & 0x3F));
- }
- }
- dataOut.write(bytearr);
+ long utfCount = countUTFBytes(text);
+ dataOut.writeInt((int)utfCount);
+ byte[] buffer = new byte[(int)utfCount];
+ int len = writeUTFBytesToBuffer(text, (int) utfCount, buffer, 0);
+ dataOut.write(buffer, 0, len);
+
+ assert utfCount==len;
} else {
dataOut.writeInt(-1);
}
}
+ /**
+ * From: http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/DataOutputStream.java
+ */
+ public static long countUTFBytes(String str) {
+ int utfCount = 0, length = str.length();
+ for (int i = 0; i < length; i++) {
+ int charValue = str.charAt(i);
+ if (charValue > 0 && charValue <= 127) {
+ utfCount++;
+ } else if (charValue <= 2047) {
+ utfCount += 2;
+ } else {
+ utfCount += 3;
+ }
+ }
+ return utfCount;
+ }
+
+ /**
+ * From: http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/DataOutputStream.java
+ */
+ public static int writeUTFBytesToBuffer(String str, long count,
+ byte[] buffer, int offset) throws IOException {
+ int length = str.length();
+ for (int i = 0; i < length; i++) {
+ int charValue = str.charAt(i);
+ if (charValue > 0 && charValue <= 127) {
+ buffer[offset++] = (byte) charValue;
+ } else if (charValue <= 2047) {
+ buffer[offset++] = (byte) (0xc0 | (0x1f & (charValue >> 6)));
+ buffer[offset++] = (byte) (0x80 | (0x3f & charValue));
+ } else {
+ buffer[offset++] = (byte) (0xe0 | (0x0f & (charValue >> 12)));
+ buffer[offset++] = (byte) (0x80 | (0x3f & (charValue >> 6)));
+ buffer[offset++] = (byte) (0x80 | (0x3f & charValue));
+ }
+ }
+ return offset;
+ }
+
public static String readUTF8(DataInput dataIn) throws IOException {
- int utflen = dataIn.readInt(); // TODO diff: Sun code
+ int utflen = dataIn.readInt();
if (utflen > -1) {
- StringBuffer str = new StringBuffer(utflen);
byte bytearr[] = new byte[utflen];
- int c;
- int char2;
- int char3;
- int count = 0;
-
+ char chararr[] = new char[utflen];
dataIn.readFully(bytearr, 0, utflen);
+ return convertUTF8WithBuf(bytearr, chararr, 0, utflen);
+ } else {
+ return null;
+ }
+ }
- while (count < utflen) {
- c = bytearr[count] & 0xff;
- switch (c >> 4) {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- /* 0xxxxxxx */
- count++;
- str.append((char)c);
- break;
- case 12:
- case 13:
- /* 110x xxxx 10xx xxxx */
- count += 2;
- if (count > utflen) {
- throw new UTFDataFormatException();
- }
- char2 = bytearr[count - 1];
- if ((char2 & 0xC0) != 0x80) {
- throw new UTFDataFormatException();
- }
- str.append((char)(((c & 0x1F) << 6) | (char2 & 0x3F)));
- break;
- case 14:
- /* 1110 xxxx 10xx xxxx 10xx xxxx */
- count += 3;
- if (count > utflen) {
- throw new UTFDataFormatException();
- }
- char2 = bytearr[count - 2]; // TODO diff: Sun code
- char3 = bytearr[count - 1]; // TODO diff: Sun code
- if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80)) {
- throw new UTFDataFormatException();
- }
- str.append((char)(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0)));
- break;
- default:
- /* 10xx xxxx, 1111 xxxx */
+ /**
+ * From: http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/org/apache/harmony/luni/util/Util.java
+ */
+ public static String convertUTF8WithBuf(byte[] buf, char[] out, int offset,
+ int utfSize) throws UTFDataFormatException {
+ int count = 0, s = 0, a;
+ while (count < utfSize) {
+ if ((out[s] = (char) buf[offset + count++]) < '\u0080')
+ s++;
+ else if (((a = out[s]) & 0xe0) == 0xc0) {
+ if (count >= utfSize)
+ throw new UTFDataFormatException();
+ int b = buf[offset + count++];
+ if ((b & 0xC0) != 0x80)
+ throw new UTFDataFormatException();
+ out[s++] = (char) (((a & 0x1F) << 6) | (b & 0x3F));
+ } else if ((a & 0xf0) == 0xe0) {
+ if (count + 1 >= utfSize)
+ throw new UTFDataFormatException();
+ int b = buf[offset + count++];
+ int c = buf[offset + count++];
+ if (((b & 0xC0) != 0x80) || ((c & 0xC0) != 0x80))
throw new UTFDataFormatException();
- }
+ out[s++] = (char) (((a & 0x0F) << 12) | ((b & 0x3F) << 6) | (c & 0x3F));
+ } else {
+ throw new UTFDataFormatException();
}
- // The number of chars produced may be less than utflen
- return new String(str);
- } else {
- return null;
}
+ return new String(out, 0, s);
}
public static String propertiesToString(Properties props) throws IOException {
http://git-wip-us.apache.org/repos/asf/activemq/blob/172c2909/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/DataByteArrayInputStream.java
----------------------------------------------------------------------
diff --git a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/DataByteArrayInputStream.java b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/DataByteArrayInputStream.java
index 455a020..33ddd89 100644
--- a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/DataByteArrayInputStream.java
+++ b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/DataByteArrayInputStream.java
@@ -22,6 +22,7 @@ import java.io.InputStream;
import java.io.UTFDataFormatException;
import org.apache.activemq.util.ByteSequence;
+import org.apache.activemq.util.MarshallingSupport;
/**
* Optimized ByteArrayInputStream that can be used more than once
@@ -286,36 +287,13 @@ public final class DataByteArrayInputStream extends InputStream implements DataI
@Override
public String readUTF() throws IOException {
int length = readUnsignedShort();
- int endPos = pos + length;
- int count = 0, a;
- char[] characters = new char[length];
- while (pos < endPos) {
- if ((characters[count] = (char) buf[pos++]) < '\u0080')
- count++;
- else if (((a = characters[count]) & 0xE0) == 0xC0) {
- if (pos >= endPos) {
- throw new UTFDataFormatException("bad string");
- }
- int b = buf[pos++];
- if ((b & 0xC0) != 0x80) {
- throw new UTFDataFormatException("bad string");
- }
- characters[count++] = (char) (((a & 0x1F) << 6) | (b & 0x3F));
- } else if ((a & 0xf0) == 0xe0) {
- if (pos + 1 >= endPos) {
- throw new UTFDataFormatException("bad string");
- }
- int b = buf[pos++];
- int c = buf[pos++];
- if (((b & 0xC0) != 0x80) || ((c & 0xC0) != 0x80)) {
- throw new UTFDataFormatException("bad string");
- }
- characters[count++] = (char) (((a & 0x0F) << 12) | ((b & 0x3F) << 6) | (c & 0x3F));
- } else {
- throw new UTFDataFormatException("bad string");
- }
+ if (pos + length > buf.length) {
+ throw new UTFDataFormatException("bad string");
}
- return new String(characters, 0, count);
+ char chararr[] = new char[length];
+ String result = MarshallingSupport.convertUTF8WithBuf(buf, chararr, pos, length);
+ pos += length;
+ return result;
}
public int getPos() {
http://git-wip-us.apache.org/repos/asf/activemq/blob/172c2909/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/DataByteArrayOutputStream.java
----------------------------------------------------------------------
diff --git a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/DataByteArrayOutputStream.java b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/DataByteArrayOutputStream.java
index d29b70f..5a3fba4 100644
--- a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/DataByteArrayOutputStream.java
+++ b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/DataByteArrayOutputStream.java
@@ -23,6 +23,7 @@ import java.io.UTFDataFormatException;
import org.apache.activemq.store.kahadb.disk.page.PageFile;
import org.apache.activemq.util.ByteSequence;
+import org.apache.activemq.util.MarshallingSupport;
/**
* Optimized ByteArrayOutputStream
@@ -228,38 +229,17 @@ public class DataByteArrayOutputStream extends OutputStream implements DataOutpu
}
@Override
- public void writeUTF(String str) throws IOException {
- int strlen = str.length();
- int encodedsize = 0;
- int c;
- for (int i = 0; i < strlen; i++) {
- c = str.charAt(i);
- if ((c >= 0x0001) && (c <= 0x007F)) {
- encodedsize++;
- } else if (c > 0x07FF) {
- encodedsize += 3;
- } else {
- encodedsize += 2;
- }
- }
+ public void writeUTF(String text) throws IOException {
+ long encodedsize = MarshallingSupport.countUTFBytes(text);
if (encodedsize > 65535) {
throw new UTFDataFormatException("encoded string too long: " + encodedsize + " bytes");
}
- ensureEnoughBuffer(pos + encodedsize + 2);
- writeShort(encodedsize);
- for (int i = 0; i < strlen; i++) {
- int charValue = str.charAt(i);
- if (charValue > 0 && charValue <= 127) {
- buf[pos++] = (byte) charValue;
- } else if (charValue <= 2047) {
- buf[pos++] = (byte) (0xc0 | (0x1f & (charValue >> 6)));
- buf[pos++] = (byte) (0x80 | (0x3f & charValue));
- } else {
- buf[pos++] = (byte) (0xe0 | (0x0f & (charValue >> 12)));
- buf[pos++] = (byte) (0x80 | (0x3f & (charValue >> 6)));
- buf[pos++] = (byte) (0x80 | (0x3f & charValue));
- }
- }
+ ensureEnoughBuffer((int)(pos + encodedsize + 2));
+ writeShort((int)encodedsize);
+
+ byte[] buffer = new byte[(int)encodedsize];
+ MarshallingSupport.writeUTFBytesToBuffer(text, (int) encodedsize, buf, pos);
+ pos += encodedsize;
onWrite();
}