You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ch...@apache.org on 2009/10/15 17:19:32 UTC

svn commit: r825513 - in /activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util: TreeMap.java buffer/Buffer.java list/LinkedNodeList.java marshaller/FixedBufferMarshaller.java marshaller/VariableBufferMarshaller.java

Author: chirino
Date: Thu Oct 15 15:19:30 2009
New Revision: 825513

URL: http://svn.apache.org/viewvc?rev=825513&view=rev
Log:
Some small util enhancements

Added:
    activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/marshaller/FixedBufferMarshaller.java
    activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/marshaller/VariableBufferMarshaller.java
Modified:
    activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/TreeMap.java
    activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/buffer/Buffer.java
    activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/list/LinkedNodeList.java

Modified: activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/TreeMap.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/TreeMap.java?rev=825513&r1=825512&r2=825513&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/TreeMap.java (original)
+++ activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/TreeMap.java Thu Oct 15 15:19:30 2009
@@ -16,6 +16,7 @@
  */
 package org.apache.activemq.util;
 
+import java.io.Serializable;
 import java.util.AbstractCollection;
 import java.util.AbstractSet;
 import java.util.Collection;
@@ -28,13 +29,18 @@
 /**
  * A TreeMap that is lighter weight than the Sun implementation with
  * implementations for upper/lower/floor/ceiling accessors.
+ *
+ * @author <a href="http://hiramchirino.com">Hiram Chirino</a>
  */
-public class TreeMap<K, V> {
+public class TreeMap<K, V> implements Serializable {
+
+    private static final long serialVersionUID = 6107175734705142096L;
+    
     private static final boolean RED = false;
     private static final boolean BLACK = true;
 
     private int count;
-    private TreeMapNode<K, V> root;
+    private TreeEntry<K, V> root;
     private final Comparator<? super K> comparator;
 
     public TreeMap() {
@@ -63,48 +69,24 @@
      * @return The first key in the map.
      */
     public K firstKey() {
-        TreeMapNode<K, V> first = firstNode();
+        TreeEntry<K, V> first = firstEntry();
         if (first != null) {
             return first.key;
         }
         return null;
     }
 
-    private TreeMapNode<K, V> firstNode() {
-        if (root == null) {
-            return null;
-        }
-        TreeMapNode<K, V> leftMost = root;
-        while (leftMost.left != null) {
-            leftMost = leftMost.left;
-        }
-
-        return leftMost;
-    }
-
     /**
      * @return The last key in the map.
      */
     public K lastKey() {
-        TreeMapNode<K, V> last = lastNode();
+        TreeEntry<K, V> last = lastEntry();
         if (last != null) {
             return last.key;
         }
         return null;
     }
 
-    private TreeMapNode<K, V> lastNode() {
-        if (root == null) {
-            return null;
-        }
-        TreeMapNode<K, V> rightMost = root;
-        while (rightMost.right != null) {
-            rightMost = rightMost.left;
-        }
-
-        return rightMost;
-    }
-
     /**
      * Clears all elements in this map.
      */
@@ -122,7 +104,7 @@
      * @see java.util.Map#containsKey(java.lang.Object)
      */
     public boolean containsKey(K key) {
-        return findInternal(key, root) != null;
+        return getEntry(key, root) != null;
     }
 
     /*
@@ -159,9 +141,9 @@
             public boolean contains(Object o) {
                 try {
                     Map.Entry<K, V> entry = (Map.Entry<K, V>) o;
-                    TreeMapNode<K, V> ours = findInternal(entry.getKey(), root);
+                    TreeEntry<K, V> ours = getEntry(entry.getKey(), root);
                     if (ours != null) {
-                        return ours.val == null ? entry.getValue() == null : ours.val.equals(entry.getValue());
+                        return ours.value == null ? entry.getValue() == null : ours.value.equals(entry.getValue());
                     } else {
                         return false;
                     }
@@ -173,7 +155,7 @@
             @SuppressWarnings("unchecked")
             @Override
             public boolean remove(Object o) {
-                return TreeMap.this.removeNode((TreeMapNode<K, V>) o) != null;
+                return TreeMap.this.removeEntry((TreeEntry<K, V>) o) != null;
             }
 
             @Override
@@ -194,14 +176,18 @@
      * @see java.util.Map#get(java.lang.Object)
      */
     public V get(K key) {
-        TreeMapNode<K, V> node = findInternal(key, root);
+        TreeEntry<K, V> node = getEntry(key, root);
         if (node != null) {
-            return node.val;
+            return node.value;
         }
         return null;
     }
 
-    private final TreeMapNode<K, V> findInternal(K key, TreeMapNode<K, V> r) {
+    public final TreeEntry<K, V> getEntry(K key) {
+        return getEntry(key, root);
+    }
+    
+    private final TreeEntry<K, V> getEntry(K key, TreeEntry<K, V> r) {
         while (r != null) {
             int c = compare(key, r.key);
             if (c == 0) {
@@ -221,8 +207,8 @@
      * 
      * @return The lowest key in the map
      */
-    public Entry<K, V> firstEntry() {
-        TreeMapNode<K, V> r = root;
+    public TreeEntry<K, V> firstEntry() {
+        TreeEntry<K, V> r = root;
         while (r != null) {
             if (r.left == null) {
                 break;
@@ -239,8 +225,8 @@
      * 
      * @return The entry associated with the greates key in the map.
      */
-    public Entry<K, V> lastEntry() {
-        TreeMapNode<K, V> r = root;
+    public TreeEntry<K, V> lastEntry() {
+        TreeEntry<K, V> r = root;
         while (r != null) {
             if (r.right == null) {
                 break;
@@ -259,9 +245,9 @@
      *            the key.
      * @return
      */
-    public Entry<K, V> lowerEntry(K key) {
-        TreeMapNode<K, V> n = root;
-        TreeMapNode<K, V> l = null;
+    public TreeEntry<K, V> lowerEntry(K key) {
+        TreeEntry<K, V> n = root;
+        TreeEntry<K, V> l = null;
         while (n != null) {
             int c = compare(key, n.key);
             if (c <= 0) {
@@ -291,9 +277,9 @@
      * @return a key-value mapping associated with the greatest key less than or
      *         equal to the given key, or null if there is no such key.
      */
-    public Entry<K, V> floorEntry(K key) {
-        TreeMapNode<K, V> n = root;
-        TreeMapNode<K, V> l = null;
+    public TreeEntry<K, V> floorEntry(K key) {
+        TreeEntry<K, V> n = root;
+        TreeEntry<K, V> l = null;
         while (n != null) {
             int c = compare(key, n.key);
             if (c == 0) {
@@ -327,9 +313,9 @@
      * @return a key-value mapping associated with the lowest key strictly
      *         greater than the given key
      */
-    public Entry<K, V> upperEntry(K key) {
-        TreeMapNode<K, V> n = root;
-        TreeMapNode<K, V> h = null;
+    public TreeEntry<K, V> upperEntry(K key) {
+        TreeEntry<K, V> n = root;
+        TreeEntry<K, V> h = null;
         while (n != null) {
             int c = compare(key, n.key);
             if (c >= 0) {
@@ -357,9 +343,9 @@
      * @param key
      * @return
      */
-    public Entry<K, V> ceilingEntry(K key) {
-        TreeMapNode<K, V> n = root;
-        TreeMapNode<K, V> h = null;
+    public TreeEntry<K, V> ceilingEntry(K key) {
+        TreeEntry<K, V> n = root;
+        TreeEntry<K, V> h = null;
         while (n != null) {
             int c = compare(key, n.key);
             if (c == 0) {
@@ -384,18 +370,18 @@
         return h;
     }
 
-    protected final TreeMapNode<K, V> findNext(TreeMapNode<K, V> n) {
+    static private final <K,V> TreeEntry<K, V> next(TreeEntry<K, V> n) {
         if (n == null)
             return null;
         else if (n.right != null) {
-            TreeMapNode<K, V> p = n.right;
+            TreeEntry<K, V> p = n.right;
             while (p.left != null) {
                 p = p.left;
             }
             return p;
         } else {
-            TreeMapNode<K, V> p = n.parent;
-            TreeMapNode<K, V> ch = n;
+            TreeEntry<K, V> p = n.parent;
+            TreeEntry<K, V> ch = n;
             while (p != null && ch == p.right) {
                 ch = p;
                 p = p.parent;
@@ -403,6 +389,26 @@
             return p;
         }
     }
+    
+    static private final <K,V> TreeEntry<K, V> previous(TreeEntry<K, V> n) {
+        if (n == null)
+            return null;
+        else if (n.left != null) {
+            TreeEntry<K, V> p = n.left;
+            while (p.right != null) {
+                p = p.right;
+            }
+            return p;
+        } else {
+            TreeEntry<K, V> p = n.parent;
+            TreeEntry<K, V> ch = n;
+            while (p != null && ch == p.left) {
+                ch = p;
+                p = p.parent;
+            }
+            return p;
+        }
+    }
 
     /*
      * (non-Javadoc)
@@ -462,7 +468,7 @@
      * @see java.util.Map#remove(java.lang.Object)
      */
     public V remove(K key) {
-        return removeNode(findInternal(key, root));
+        return removeEntry(getEntry(key, root));
     }
 
     /*
@@ -474,25 +480,25 @@
 
         if (root == null) {
             // map is empty
-            root = new TreeMapNode<K, V>(key, value, null, this);
+            root = new TreeEntry<K, V>(key, value, null, this);
             count++;
             return null;
         }
-        TreeMapNode<K, V> n = root;
+        TreeEntry<K, V> n = root;
 
         // add new mapping
         while (true) {
             int c = compare(key, n.key);
 
             if (c == 0) {
-                V old = n.val;
-                n.val = value;
+                V old = n.value;
+                n.value = value;
                 return old;
             } else if (c < 0) {
                 if (n.left != null) {
                     n = n.left;
                 } else {
-                    n.left = new TreeMapNode<K, V>(key, value, n, this);
+                    n.left = new TreeEntry<K, V>(key, value, n, this);
                     count++;
                     doRedBlackInsert(n.left);
                     return null;
@@ -501,7 +507,7 @@
                 if (n.right != null) {
                     n = n.right;
                 } else {
-                    n.right = new TreeMapNode<K, V>(key, value, n, this);
+                    n.right = new TreeEntry<K, V>(key, value, n, this);
                     count++;
                     doRedBlackInsert(n.right);
                     return null;
@@ -517,13 +523,13 @@
      * @param n
      *            the newly inserted node
      */
-    private void doRedBlackInsert(final TreeMapNode<K, V> n) {
-        TreeMapNode<K, V> currentNode = n;
+    private void doRedBlackInsert(final TreeEntry<K, V> n) {
+        TreeEntry<K, V> currentNode = n;
         color(currentNode, RED);
 
         while (currentNode != null && currentNode != root && isRed(currentNode.parent)) {
             if (isLeftChild(parent(currentNode))) {
-                TreeMapNode<K, V> y = getRight(getGrandParent(currentNode));
+                TreeEntry<K, V> y = getRight(getGrandParent(currentNode));
 
                 if (isRed(y)) {
                     color(parent(currentNode), BLACK);
@@ -548,7 +554,7 @@
             } else {
 
                 // just like clause above, except swap left for right
-                TreeMapNode<K, V> y = getLeft(getGrandParent(currentNode));
+                TreeEntry<K, V> y = getLeft(getGrandParent(currentNode));
 
                 if (isRed(y)) {
                     color(parent(currentNode), BLACK);
@@ -577,8 +583,8 @@
     }
 
     //Based on Apache common's TreeBidiMap
-    private void rotateLeft(TreeMapNode<K, V> n) {
-        TreeMapNode<K, V> r = n.right;
+    private void rotateLeft(TreeEntry<K, V> n) {
+        TreeEntry<K, V> r = n.right;
         n.right = r.left;
         if (r.left != null) {
             r.left.parent = n;
@@ -597,8 +603,8 @@
     }
 
     //Based on Apache common's TreeBidiMap    
-    private void rotateRight(TreeMapNode<K, V> n) {
-        TreeMapNode<K, V> l = n.left;
+    private void rotateRight(TreeEntry<K, V> n) {
+        TreeEntry<K, V> l = n.left;
         n.left = l.right;
         if (l.right != null) {
             l.right.parent = n;
@@ -621,7 +627,7 @@
      * @param n
      *            the node to be deleted
      */
-    private final V removeNode(TreeMapNode<K, V> n) {
+    public final V removeEntry(TreeEntry<K, V> n) {
         if (n == null) {
             return null;
         }
@@ -630,20 +636,20 @@
             throw new IllegalStateException("Node not in list");
         }
 
-        V old = n.val;
+        V old = n.value;
 
         count--;
 
         //if deleted node has both left and children, swap with
         // the next greater node
         if (n.left != null && n.right != null) {
-            TreeMapNode<K, V> next = findNext(n);
+            TreeEntry<K, V> next = next(n);
             n.key = next.key;
-            n.val = next.val;
+            n.value = next.value;
             n = next;
         }
 
-        TreeMapNode<K, V> replacement = n.left != null ? n.left : n.right;
+        TreeEntry<K, V> replacement = n.left != null ? n.left : n.right;
 
         if (replacement != null) {
             replacement.parent = n.parent;
@@ -696,12 +702,12 @@
      * @param replacementNode
      *            the node being replaced
      */
-    private void doRedBlackDeleteFixup(final TreeMapNode<K, V> replacementNode) {
-        TreeMapNode<K, V> currentNode = replacementNode;
+    private void doRedBlackDeleteFixup(final TreeEntry<K, V> replacementNode) {
+        TreeEntry<K, V> currentNode = replacementNode;
 
         while (currentNode != root && isBlack(currentNode)) {
             if (isLeftChild(currentNode)) {
-                TreeMapNode<K, V> siblingNode = getRight(parent(currentNode));
+                TreeEntry<K, V> siblingNode = getRight(parent(currentNode));
 
                 if (isRed(siblingNode)) {
                     color(siblingNode, BLACK);
@@ -732,7 +738,7 @@
                     currentNode = root;
                 }
             } else {
-                TreeMapNode<K, V> siblingNode = getLeft(parent(currentNode));
+                TreeEntry<K, V> siblingNode = getLeft(parent(currentNode));
 
                 if (isRed(siblingNode)) {
                     color(siblingNode, BLACK);
@@ -798,16 +804,16 @@
         };
     }
 
-    private static <K, V> TreeMapNode<K, V> parent(TreeMapNode<K, V> n) {
+    private static <K, V> TreeEntry<K, V> parent(TreeEntry<K, V> n) {
         return (n == null ? null : n.parent);
     }
 
-    private static <K, V> void color(TreeMapNode<K, V> n, boolean c) {
+    private static <K, V> void color(TreeEntry<K, V> n, boolean c) {
         if (n != null)
             n.color = c;
     }
 
-    private static <K, V> boolean getColor(TreeMapNode<K, V> n) {
+    private static <K, V> boolean getColor(TreeEntry<K, V> n) {
         return (n == null ? BLACK : n.color);
     }
 
@@ -817,7 +823,7 @@
      * @param node
      *            the node (may be null) in question
      */
-    private static <K, V> TreeMapNode<K, V> getLeft(TreeMapNode<K, V> n) {
+    private static <K, V> TreeEntry<K, V> getLeft(TreeEntry<K, V> n) {
         return (n == null) ? null : n.left;
     }
 
@@ -827,7 +833,7 @@
      * @param node
      *            the node (may be null) in question
      */
-    private static <K, V> TreeMapNode<K, V> getRight(TreeMapNode<K, V> n) {
+    private static <K, V> TreeEntry<K, V> getRight(TreeEntry<K, V> n) {
         return (n == null) ? null : n.right;
     }
 
@@ -838,7 +844,7 @@
      * @param node
      *            the node (may be null) in question
      */
-    private static <K, V> boolean isRed(TreeMapNode<K, V> n) {
+    private static <K, V> boolean isRed(TreeEntry<K, V> n) {
         return n == null ? false : n.color == RED;
     }
 
@@ -849,7 +855,7 @@
      * @param node
      *            the node (may be null) in question
      */
-    private static <K, V> boolean isBlack(final TreeMapNode<K, V> n) {
+    private static <K, V> boolean isBlack(final TreeEntry<K, V> n) {
         return n == null ? true : n.color == BLACK;
     }
 
@@ -863,7 +869,7 @@
      * @param node
      *            the node (may be null) in question
      */
-    private static <K, V> boolean isLeftChild(final TreeMapNode<K, V> node) {
+    private static <K, V> boolean isLeftChild(final TreeEntry<K, V> node) {
 
         return node == null ? true : (node.parent == null ? false : (node == node.parent.left));
     }
@@ -880,7 +886,7 @@
      * @param index
      *            the KEY or VALUE int
      */
-    private static <K, V> boolean isRightChild(final TreeMapNode<K, V> node) {
+    private static <K, V> boolean isRightChild(final TreeEntry<K, V> node) {
         return node == null ? true : (node.parent == null ? false : (node == node.parent.right));
 
     }
@@ -892,24 +898,27 @@
      * @param node
      *            the node (may be null) in question
      */
-    private static <K, V> TreeMapNode<K, V> getGrandParent(final TreeMapNode<K, V> node) {
+    private static <K, V> TreeEntry<K, V> getGrandParent(final TreeEntry<K, V> node) {
         return parent(parent(node));
     }
 
-    public static class TreeMapNode<K, V> implements Map.Entry<K, V> {
+    public static class TreeEntry<K, V> implements Map.Entry<K, V>, Serializable {
+
+        private static final long serialVersionUID = 8490652911043012737L;
+        
         TreeMap<K, V> map;
-        V val;
+        V value;
         K key;
         boolean color = BLACK;
 
-        TreeMapNode<K, V> parent;
-        TreeMapNode<K, V> left;
-        TreeMapNode<K, V> right;
+        TreeEntry<K, V> parent;
+        TreeEntry<K, V> left;
+        TreeEntry<K, V> right;
 
-        TreeMapNode(K key, V val, TreeMapNode<K, V> parent, TreeMap<K, V> map) {
+        TreeEntry(K key, V val, TreeEntry<K, V> parent, TreeMap<K, V> map) {
             this.key = key;
             this.parent = parent;
-            this.val = val;
+            this.value = val;
             this.map = map;
         }
 
@@ -928,7 +937,7 @@
          * @see java.util.Map.Entry#getValue()
          */
         public V getValue() {
-            return val;
+            return value;
         }
 
         /*
@@ -937,8 +946,8 @@
          * @see java.util.Map.Entry#setValue(java.lang.Object)
          */
         public V setValue(V val) {
-            V old = this.val;
-            this.val = val;
+            V old = this.value;
+            this.value = val;
             return old;
         }
 
@@ -948,14 +957,27 @@
                 return false;
             Map.Entry e = (Map.Entry) o;
 
-            return (key == null ? e.getKey() == null : key.equals(e.getKey())) && (val == null ? e.getValue() == null : val.equals(e.getValue()));
+            return (key == null ? e.getKey() == null : key.equals(e.getKey())) && (value == null ? e.getValue() == null : value.equals(e.getValue()));
         }
 
         public int hashCode() {
             int keyHash = (key == null ? 0 : key.hashCode());
-            int valueHash = (val == null ? 0 : val.hashCode());
+            int valueHash = (value == null ? 0 : value.hashCode());
             return keyHash ^ valueHash;
         }
+        
+        public TreeEntry<K, V> next() {
+            return TreeMap.next(this);
+        }
+        
+        public TreeEntry<K, V> previous() {
+            return TreeMap.previous(this);
+        }
+        
+        @Override
+        public String toString() {
+            return "{ key: " +key+", value: "+value+" }";
+        }
     }
 
     private class ValueIterator extends AbstractEntryIterator<V> {
@@ -970,7 +992,7 @@
             if (last == null) {
                 return null;
             } else {
-                return last.val;
+                return last.value;
             }
         }
     }
@@ -1011,8 +1033,8 @@
 
     private abstract class AbstractEntryIterator<T> implements Iterator<T> {
 
-        TreeMapNode<K, V> last = null;
-        TreeMapNode<K, V> next = firstNode();
+        TreeEntry<K, V> last = null;
+        TreeEntry<K, V> next = firstEntry();
 
         /*
          * (non-Javadoc)
@@ -1028,9 +1050,9 @@
          * 
          * @see java.util.Iterator#next()
          */
-        protected TreeMapNode<K, V> getNext() {
+        protected TreeEntry<K, V> getNext() {
             last = next;
-            next = findNext(next);
+            next = TreeMap.next(next);
             return last;
         }
 
@@ -1040,7 +1062,7 @@
          * @see java.util.Iterator#remove()
          */
         public void remove() {
-            TreeMap.this.removeNode(last);
+            TreeMap.this.removeEntry(last);
             last = null;
         }
 

Modified: activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/buffer/Buffer.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/buffer/Buffer.java?rev=825513&r1=825512&r2=825513&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/buffer/Buffer.java (original)
+++ activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/buffer/Buffer.java Thu Oct 15 15:19:30 2009
@@ -21,8 +21,9 @@
 
 import java.util.List;
 
-
-
+/**
+ * @author <a href="http://hiramchirino.com">Hiram Chirino</a>
+ */
 public class Buffer implements Comparable<Buffer> {
 
     public byte[] data;
@@ -80,6 +81,12 @@
     public final int getOffset() {
         return offset;
     }
+    
+    public Buffer deepCopy() {
+        byte t[] = new byte[length];
+        System.arraycopy(data, offset, t, 0, length);
+        return new Buffer(t);
+    }
 
     public Buffer compact() {
         if (length != data.length) {

Modified: activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/list/LinkedNodeList.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/list/LinkedNodeList.java?rev=825513&r1=825512&r2=825513&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/list/LinkedNodeList.java (original)
+++ activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/list/LinkedNodeList.java Thu Oct 15 15:19:30 2009
@@ -21,7 +21,7 @@
 /**
  * Provides a list of LinkedNode objects. 
  * 
- * @author chirino
+ * @author <a href="http://hiramchirino.com">Hiram Chirino</a>
  */
 public class LinkedNodeList<T extends LinkedNode<T>> {
 
@@ -151,4 +151,20 @@
     	}
     	return rc;
     }
+
+    /**
+     * Copies the nodes of the LinkedNodeList to an ArrayList in reverse order.
+     * @return
+     */
+    public ArrayList<T> toArrayListReversed() {
+        ArrayList<T> rc = new ArrayList<T>(size);
+        if( head != null ) {
+            T cur = getTail();;
+            while( cur!=null ) {
+                rc.add(cur);
+                cur = cur.getPrevious();
+            }
+        }
+        return rc;
+    }
 }

Added: activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/marshaller/FixedBufferMarshaller.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/marshaller/FixedBufferMarshaller.java?rev=825513&view=auto
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/marshaller/FixedBufferMarshaller.java (added)
+++ activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/marshaller/FixedBufferMarshaller.java Thu Oct 15 15:19:30 2009
@@ -0,0 +1,63 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.util.marshaller;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.activemq.util.buffer.Buffer;
+
+/**
+ * Implementation of a Marshaller for Buffer objects
+ * 
+ * @author <a href="http://hiramchirino.com">Hiram Chirino</a>
+ */
+public class FixedBufferMarshaller implements Marshaller<Buffer> {
+    
+    private final int size;
+
+    public FixedBufferMarshaller(int size) {
+        this.size = size;
+        
+    }
+
+    public void writePayload(Buffer value, DataOutput dataOut) throws IOException {
+        dataOut.writeInt(value.length);
+        dataOut.write(value.data, value.offset, value.length);
+    }
+
+    public Buffer readPayload(DataInput dataIn) throws IOException {
+        int size = dataIn.readInt();
+        byte[] data = new byte[size];
+        dataIn.readFully(data);
+        return new Buffer(data);
+    }
+
+    public int getFixedSize() {
+        return size;
+    }
+
+    public Buffer deepCopy(Buffer source) {
+        return source.deepCopy();
+    }
+
+    public boolean isDeepCopySupported() {
+        return true;
+    }
+    
+}

Added: activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/marshaller/VariableBufferMarshaller.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/marshaller/VariableBufferMarshaller.java?rev=825513&view=auto
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/marshaller/VariableBufferMarshaller.java (added)
+++ activemq/sandbox/activemq-flow/activemq-util/src/main/java/org/apache/activemq/util/marshaller/VariableBufferMarshaller.java Thu Oct 15 15:19:30 2009
@@ -0,0 +1,52 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.util.marshaller;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.activemq.util.buffer.Buffer;
+
+/**
+ * Implementation of a Marshaller for Buffer objects
+ * 
+ * @author <a href="http://hiramchirino.com">Hiram Chirino</a>
+ */
+public class VariableBufferMarshaller extends VariableMarshaller<Buffer> {
+
+    public void writePayload(Buffer value, DataOutput dataOut) throws IOException {
+        dataOut.writeInt(value.length);
+        dataOut.write(value.data, value.offset, value.length);
+    }
+
+    public Buffer readPayload(DataInput dataIn) throws IOException {
+        int size = dataIn.readInt();
+        byte[] data = new byte[size];
+        dataIn.readFully(data);
+        return new Buffer(data);
+    }
+    
+    public Buffer deepCopy(Buffer source) {
+        return source.deepCopy();
+    }
+
+    public boolean isDeepCopySupported() {
+        return true;
+    }
+    
+}