[jboss-cvs] JBoss Messaging SVN: r4665 - in trunk: tests/src/org/jboss/messaging/tests/unit/util and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Jul 8 03:37:44 EDT 2008
Author: trustin
Date: 2008-07-08 03:37:43 -0400 (Tue, 08 Jul 2008)
New Revision: 4665
Added:
trunk/src/main/org/jboss/messaging/util/ExpandingMessagingBuffer.java
trunk/tests/src/org/jboss/messaging/tests/unit/util/ExpandingMessagingBufferTest.java
Log:
* Added ExpandingMessagingBuffer to integrate with Netty
Added: trunk/src/main/org/jboss/messaging/util/ExpandingMessagingBuffer.java
===================================================================
--- trunk/src/main/org/jboss/messaging/util/ExpandingMessagingBuffer.java (rev 0)
+++ trunk/src/main/org/jboss/messaging/util/ExpandingMessagingBuffer.java 2008-07-08 07:37:43 UTC (rev 4665)
@@ -0,0 +1,380 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Copyright 2005-2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.messaging.util;
+
+import static org.jboss.messaging.util.DataConstants.*;
+
+import java.nio.ByteBuffer;
+
+
+/**
+ * A {@link MessagingBuffer} which increases its capacity and length by itself
+ * when there's not enough space for a {@code put} operation.
+ *
+ * @author <a href="mailto:tlee at redhat.com">Trustin Lee</a>
+ * @version $Rev$, $Date$
+ */
+public class ExpandingMessagingBuffer implements MessagingBuffer
+{
+ private ByteBuffer buf;
+
+ public ExpandingMessagingBuffer(ByteBuffer buf) {
+ this.buf = buf;
+ }
+
+ public ExpandingMessagingBuffer(int size) {
+ this(ByteBuffer.allocate(size));
+ }
+
+ public byte[] array()
+ {
+ if(buf.hasArray() && buf.arrayOffset() == 0 && buf.capacity() == buf.array().length)
+ {
+ return buf.array();
+ }
+ else
+ {
+ byte[] b = new byte[remaining()];
+ getBytes(b);
+ return b;
+ }
+ }
+
+ public int capacity()
+ {
+ return buf.capacity();
+ }
+
+ public MessagingBuffer createNewBuffer(int len)
+ {
+ return new ExpandingMessagingBuffer(len);
+ }
+
+ public void flip()
+ {
+ buf.flip();
+ }
+
+ public boolean getBoolean()
+ {
+ return getByte() != 0;
+ }
+
+ public byte getByte()
+ {
+ return buf.get();
+ }
+
+ public void getBytes(byte[] bytes)
+ {
+ buf.get(bytes);
+ }
+
+ public void getBytes(byte[] bytes, int offset, int length)
+ {
+ buf.get(bytes, offset, length);
+ }
+
+ public char getChar()
+ {
+ return buf.getChar();
+ }
+
+ public double getDouble()
+ {
+ return buf.getDouble();
+ }
+
+ public float getFloat()
+ {
+ return buf.getFloat();
+ }
+
+ public int getInt()
+ {
+ return buf.getInt();
+ }
+
+ public long getLong()
+ {
+ return buf.getLong();
+ }
+
+ public SimpleString getNullableSimpleString()
+ {
+ if (getByte() == NULL)
+ {
+ return null;
+ }
+ else
+ {
+ return getSimpleString();
+ }
+ }
+
+ public String getNullableString()
+ {
+ if (getByte() == NULL)
+ {
+ return null;
+ }
+ else
+ {
+ return getString();
+ }
+ }
+
+ public short getShort()
+ {
+ return buf.getShort();
+ }
+
+ public SimpleString getSimpleString()
+ {
+ int len = getInt();
+ byte[] data = new byte[len];
+ getBytes(data);
+ return new SimpleString(data);
+ }
+
+ public String getString()
+ {
+ int len = getInt();
+ char[] chars = new char[len];
+ for (int i = 0; i < len; i++)
+ {
+ chars[i] = getChar();
+ }
+ return new String(chars);
+ }
+
+ public String getUTF() throws Exception
+ {
+ int length = getUnsignedShort();
+ byte[] data = new byte[length];
+ getBytes(data);
+ return new String(data, "UTF-8");
+ }
+
+ public short getUnsignedByte()
+ {
+ return (short) (getByte() & 0xFF);
+ }
+
+ public int getUnsignedShort()
+ {
+ return getShort() & 0xFFFF;
+ }
+
+ public int limit()
+ {
+ return buf.limit();
+ }
+
+ public void limit(int limit)
+ {
+ buf.limit(limit);
+ }
+
+ public void position(int position)
+ {
+ buf.position(position);
+ }
+
+ public int position()
+ {
+ return buf.position();
+ }
+
+ public void putBoolean(boolean val)
+ {
+ putByte((byte) (val ? -1 : 0));
+ }
+
+ public void putByte(byte val)
+ {
+ ensureRemaining(1).put(val);
+ }
+
+ public void putBytes(byte[] bytes)
+ {
+ ensureRemaining(bytes.length).put(bytes);
+ }
+
+ public void putBytes(byte[] bytes, int offset, int length)
+ {
+ ensureRemaining(length).put(bytes, offset, length);
+ }
+
+ public void putChar(char val)
+ {
+ ensureRemaining(2).putChar(val);
+ }
+
+ public void putDouble(double val)
+ {
+ ensureRemaining(8).putDouble(val);
+ }
+
+ public void putFloat(float val)
+ {
+ ensureRemaining(4).putFloat(val);
+ }
+
+ public void putInt(int val)
+ {
+ ensureRemaining(4).putInt(val);
+ }
+
+ public void putInt(int pos, int val)
+ {
+ buf.putInt(pos, val);
+ }
+
+ public void putLong(long val)
+ {
+ ensureRemaining(8).putLong(val);
+ }
+
+ public void putNullableSimpleString(SimpleString val)
+ {
+ if (val == null)
+ {
+ ensureRemaining(1).put(NULL);
+ }
+ else
+ {
+ ensureRemaining(5 + (val.length() << 1));
+ buf.put(NOT_NULL);
+ byte[] data = val.getData();
+ ensureRemaining(data.length + 4);
+ buf.putInt(data.length);
+ buf.put(data);
+ }
+ }
+
+ public void putNullableString(String val)
+ {
+ if (val == null)
+ {
+ ensureRemaining(1).put(NULL);
+ }
+ else
+ {
+ ensureRemaining(5 + (val.length() << 1));
+ buf.put(NOT_NULL);
+ buf.putInt(val.length());
+ for (int i = 0; i < val.length(); i++)
+ {
+ buf.putChar(val.charAt(i));
+ }
+ }
+ }
+
+ public void putShort(short val)
+ {
+ ensureRemaining(2).putShort(val);
+ }
+
+ public void putSimpleString(SimpleString val)
+ {
+ byte[] data = val.getData();
+ ensureRemaining(4 + data.length);
+ buf.putInt(data.length);
+ buf.put(data);
+ }
+
+ public void putString(String val)
+ {
+ ensureRemaining(4 + (val.length() << 1));
+ buf.putInt(val.length());
+ for (int i = 0; i < val.length(); i++)
+ {
+ buf.putChar(val.charAt(i));
+ }
+ }
+
+ public void putUTF(String utf) throws Exception
+ {
+ byte[] data = utf.getBytes("UTF-8");
+ if (data.length > 65535) {
+ throw new IllegalArgumentException("String is too long: " + data.length);
+ }
+ ensureRemaining(2 + data.length);
+ buf.putShort((short) data.length);
+ buf.put(data);
+ }
+
+ public int remaining()
+ {
+ return buf.remaining();
+ }
+
+ public void rewind()
+ {
+ buf.rewind();
+ }
+
+ public MessagingBuffer slice()
+ {
+ return new ExpandingMessagingBuffer(buf.slice());
+ }
+
+ private ByteBuffer ensureRemaining(int minRemaining)
+ {
+ int remaining = remaining();
+ if (remaining >= minRemaining)
+ {
+ return buf;
+ }
+
+ int capacity = capacity();
+ int limit = limit();
+ if (capacity - limit >= minRemaining - remaining) {
+ buf.limit(limit + minRemaining - remaining);
+ return buf;
+ }
+
+ int position = position();
+ int minCapacityDifference = minRemaining - remaining;
+ int oldCapacity = capacity();
+ int newCapacity = oldCapacity;
+ for (;;)
+ {
+ newCapacity <<= 1;
+ if (newCapacity - oldCapacity >= minCapacityDifference)
+ {
+ break;
+ }
+ }
+
+ ByteBuffer newBuf = ByteBuffer.allocate(newCapacity);
+ buf.clear();
+ newBuf.put(buf);
+ newBuf.limit(position + minRemaining);
+ newBuf.position(position);
+ buf = newBuf;
+
+ return newBuf;
+ }
+}
Property changes on: trunk/src/main/org/jboss/messaging/util/ExpandingMessagingBuffer.java
___________________________________________________________________
Name: svn:keywords
+ Rev Date
Name: svn:eol-style
+ native
Added: trunk/tests/src/org/jboss/messaging/tests/unit/util/ExpandingMessagingBufferTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/unit/util/ExpandingMessagingBufferTest.java (rev 0)
+++ trunk/tests/src/org/jboss/messaging/tests/unit/util/ExpandingMessagingBufferTest.java 2008-07-08 07:37:43 UTC (rev 4665)
@@ -0,0 +1,62 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005-2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.messaging.tests.unit.util;
+
+import org.jboss.messaging.util.ExpandingMessagingBuffer;
+import org.jboss.messaging.util.MessagingBuffer;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ */
+public class ExpandingMessagingBufferTest extends MessagingBufferTestBase
+{
+
+ // Constants -----------------------------------------------------
+
+ // Attributes ----------------------------------------------------
+
+ // Static --------------------------------------------------------
+
+ // Constructors --------------------------------------------------
+
+ // Public --------------------------------------------------------
+
+ // MessagingBufferTestBase overrides -----------------------------
+
+ @Override
+ protected MessagingBuffer createBuffer()
+ {
+ return new ExpandingMessagingBuffer(512);
+ }
+
+ // Package protected ---------------------------------------------
+
+ // Protected -----------------------------------------------------
+
+ // Private -------------------------------------------------------
+
+ // Inner classes -------------------------------------------------
+}
Property changes on: trunk/tests/src/org/jboss/messaging/tests/unit/util/ExpandingMessagingBufferTest.java
___________________________________________________________________
Name: svn:keywords
+ Rev Date
Name: svn:eol-style
+ native
More information about the jboss-cvs-commits
mailing list