Author: rgodfrey
Date: Wed Apr 16 01:30:53 2008
New Revision: 648617

URL: http://svn.apache.org/viewvc?rev=648617&view=rev
Log:
QPID-900 : Re-use byte[] of buffer for backing of AMQShortString

Modified:
    
incubator/qpid/branches/M2.1/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java

Modified: 
incubator/qpid/branches/M2.1/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java
URL: 
http://svn.apache.org/viewvc/incubator/qpid/branches/M2.1/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java?rev=648617&r1=648616&r2=648617&view=diff
==============================================================================
--- 
incubator/qpid/branches/M2.1/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java
 (original)
+++ 
incubator/qpid/branches/M2.1/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java
 Wed Apr 16 01:30:53 2008
@@ -184,11 +184,22 @@
 
     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 @@
         _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 @@
             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);
             }


Reply via email to