diff options
-rw-r--r-- | java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java | 35 |
1 files changed, 30 insertions, 5 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 0d78aca729..a747aaeda7 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 @@ -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); } |