diff options
Diffstat (limited to 'qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java')
-rw-r--r-- | qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java | 83 |
1 files changed, 36 insertions, 47 deletions
diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java index 2b9e2ffaba..39a9beb9e8 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java @@ -37,10 +37,6 @@ import java.lang.ref.WeakReference; */ public final class AMQShortString implements CharSequence, Comparable<AMQShortString> { - /** - * The maximum number of octets in AMQ short string as defined in AMQP specification - */ - public static final int MAX_LENGTH = 255; private static final byte MINUS = (byte)'-'; private static final byte ZERO = (byte) '0'; @@ -122,19 +118,22 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt public AMQShortString(byte[] data) { - if (data == null) - { - throw new NullPointerException("Cannot create AMQShortString with null data[]"); - } - if (data.length > MAX_LENGTH) - { - throw new IllegalArgumentException("Cannot create AMQShortString with number of octets over 255!"); - } + _data = data.clone(); _length = data.length; _offset = 0; } + public AMQShortString(byte[] data, int pos) + { + final int size = data[pos++]; + final byte[] dataCopy = new byte[size]; + System.arraycopy(data,pos,dataCopy,0,size); + _length = size; + _data = dataCopy; + _offset = 0; + } + public AMQShortString(String data) { this((data == null) ? EMPTY_CHAR_ARRAY : data.toCharArray()); @@ -147,12 +146,7 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt { throw new NullPointerException("Cannot create AMQShortString with null char[]"); } - // the current implementation of 0.8/0.9.x short string encoding - // supports only ASCII characters - if (data.length> MAX_LENGTH) - { - throw new IllegalArgumentException("Cannot create AMQShortString with number of octets over 255!"); - } + final int length = data.length; final byte[] stringBytes = new byte[length]; int hash = 0; @@ -171,17 +165,6 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt public AMQShortString(CharSequence charSequence) { - if (charSequence == null) - { - // it should be possible to create short string for null data - charSequence = ""; - } - // the current implementation of 0.8/0.9.x short string encoding - // supports only ASCII characters - if (charSequence.length() > MAX_LENGTH) - { - throw new IllegalArgumentException("Cannot create AMQShortString with number of octets over 255!"); - } final int length = charSequence.length(); final byte[] stringBytes = new byte[length]; int hash = 0; @@ -201,10 +184,6 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt private AMQShortString(ByteBuffer data, final int length) { - if (length > MAX_LENGTH) - { - throw new IllegalArgumentException("Cannot create AMQShortString with number of octets over 255!"); - } if(data.isDirect() || data.isReadOnly()) { byte[] dataBytes = new byte[length]; @@ -226,17 +205,8 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt private AMQShortString(final byte[] data, final int from, final int to) { - if (data == null) - { - throw new NullPointerException("Cannot create AMQShortString with null data[]"); - } - int length = to - from; - if (length > MAX_LENGTH) - { - throw new IllegalArgumentException("Cannot create AMQShortString with number of octets over 255!"); - } _offset = from; - _length = length; + _length = to - from; _data = data; } @@ -275,6 +245,29 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt return new CharSubSequence(start, end); } + public int writeToByteArray(byte[] encoding, int pos) + { + final int size = length(); + encoding[pos++] = (byte) size; + System.arraycopy(_data,_offset,encoding,pos,size); + return pos+size; + } + + public static AMQShortString readFromByteArray(byte[] byteEncodedDestination, int pos) + { + + + final AMQShortString shortString = new AMQShortString(byteEncodedDestination, pos); + if(shortString.length() == 0) + { + return null; + } + else + { + return shortString; + } + } + public static AMQShortString readFromBuffer(ByteBuffer buffer) { final short length = buffer.getUnsigned(); @@ -697,10 +690,6 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt size += term.length(); } - if (size > MAX_LENGTH) - { - throw new IllegalArgumentException("Cannot create AMQShortString with number of octets over 255!"); - } byte[] data = new byte[size]; int pos = 0; final byte[] delimData = delim._data; |