diff options
Diffstat (limited to 'java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java')
-rw-r--r-- | java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java | 56 |
1 files changed, 47 insertions, 9 deletions
diff --git a/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java b/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java index 665cbf7a84..ad2ab2ac0b 100644 --- a/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java +++ b/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java @@ -90,7 +90,7 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt private AMQShortString substring(final int from, final int to) { - return new AMQShortString(_data, from, to); + return new AMQShortString(_data, from+_offset, to+_offset); } @@ -184,11 +184,22 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt private AMQShortString(ByteBuffer data, final int length) { - byte[] dataBytes = new byte[length]; - data.get(dataBytes); - _data = dataBytes; + if(data.isDirect() || data.isReadOnly()) + { + byte[] dataBytes = new byte[length]; + data.get(dataBytes); + _data = dataBytes; + _offset = 0; + } + else + { + + _data = data.array(); + _offset = data.arrayOffset() + data.position(); + data.skip(length); + + } _length = length; - _offset = 0; } @@ -199,6 +210,20 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt _data = data; } + public AMQShortString shrink() + { + if(_data.length != _length) + { + byte[] dataBytes = new byte[_length]; + System.arraycopy(_data,_offset,dataBytes,0,_length); + return new AMQShortString(dataBytes,0,_length); + } + else + { + return this; + } + } + /** * Get the length of the short string @@ -572,7 +597,7 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt ref = _globalInternMap.get(this); if((ref == null) || ((internString = ref.get()) == null)) { - internString = new AMQShortString(getBytes()); + internString = shrink(); ref = new WeakReference(internString); _globalInternMap.put(internString, ref); } @@ -651,7 +676,7 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt public int toIntValue() { - int pos = 0; + int pos = _offset; int val = 0; @@ -660,7 +685,7 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt { pos++; } - while(pos < _length) + while(pos < _length + _offset) { int digit = (int) (_data[pos++] - ZERO); if((digit < 0) || (digit > 9)) @@ -679,7 +704,7 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt public boolean contains(final byte b) { - for(int i = 0; i < _length; i++) + for(int i = _offset; i < _length + _offset; i++) { if(_data[i] == b) { @@ -689,4 +714,17 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt return false; //To change body of created methods use File | Settings | File Templates. } + + public static void main(String args[]) + { + AMQShortString s = new AMQShortString("a.b.c.d.e.f.g.h.i.j.k"); + AMQShortString s2 = s.substring(2, 7); + + AMQShortStringTokenizer t = s2.tokenize((byte) '.'); + while(t.hasMoreTokens()) + { + System.err.println(t.nextToken()); + } + } + } |