You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mb...@apache.org on 2012/03/15 23:14:40 UTC

svn commit: r1301242 - in /commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile: EntitySupport.java PadJustifyFieldSupport.java util/ConcatenatedInputStream.java util/RepeatingInputStream.java

Author: mbenson
Date: Thu Mar 15 22:14:40 2012
New Revision: 1301242

URL: http://svn.apache.org/viewvc?rev=1301242&view=rev
Log:
update APIs for RepeatingInputStream and ConcatenatedInputStream for varargs; simplify things using lang3 Validata; some final variables

Modified:
    commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/EntitySupport.java
    commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/PadJustifyFieldSupport.java
    commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/util/ConcatenatedInputStream.java
    commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/util/RepeatingInputStream.java

Modified: commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/EntitySupport.java
URL: http://svn.apache.org/viewvc/commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/EntitySupport.java?rev=1301242&r1=1301241&r2=1301242&view=diff
==============================================================================
--- commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/EntitySupport.java (original)
+++ commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/EntitySupport.java Thu Mar 15 22:14:40 2012
@@ -33,7 +33,7 @@ public abstract class EntitySupport impl
      * {@inheritDoc}
      */
     public void fill(byte b) throws IOException {
-        readFrom(RepeatingInputStream.getInstance(b));
+        readFrom(RepeatingInputStream.of(b));
     }
 
     /**
@@ -49,13 +49,14 @@ public abstract class EntitySupport impl
 
     /**
      * {@inheritDoc}
+     * Naive implementation which can and should be overridden by subclasses.
      */
     public byte[] getValue(int offset, int length) {
         if (offset + length > length()) {
             throw new IndexOutOfBoundsException();
         }
-        byte[] value = getValue();
-        byte[] result = new byte[length];
+        final byte[] value = getValue();
+        final byte[] result = new byte[length];
         System.arraycopy(value, offset, result, 0, length);
         return result;
     }
@@ -67,7 +68,7 @@ public abstract class EntitySupport impl
         if (offset + length > b.length) {
             throw new IndexOutOfBoundsException();
         }
-        byte[] subset = new byte[length];
+        final byte[] subset = new byte[length];
         System.arraycopy(b, offset, subset, 0, length);
         setValue(subset);
     }

Modified: commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/PadJustifyFieldSupport.java
URL: http://svn.apache.org/viewvc/commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/PadJustifyFieldSupport.java?rev=1301242&r1=1301241&r2=1301242&view=diff
==============================================================================
--- commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/PadJustifyFieldSupport.java (original)
+++ commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/PadJustifyFieldSupport.java Thu Mar 15 22:14:40 2012
@@ -18,7 +18,6 @@ package org.apache.commons.flatfile;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
-import java.util.ArrayList;
 
 import org.apache.commons.flatfile.util.ConcatenatedInputStream;
 import org.apache.commons.flatfile.util.RepeatingInputStream;
@@ -32,6 +31,11 @@ public abstract class PadJustifyFieldSup
     private static final long serialVersionUID = -4953059253157670418L;
 
     /**
+     * Default pad.
+     */
+    public static final byte DEFAULT_PAD = 0x20;
+
+    /**
      * Justify enumerated type.
      */
     public enum Justify implements FieldOption {
@@ -41,10 +45,11 @@ public abstract class PadJustifyFieldSup
              * {@inheritDoc}
              */
             protected InputStream getInputStream(byte[] src, PadJustifyFieldSupport dest) {
-                InputStream is = new ByteArrayInputStream(src);
-                int dlen = dest.getPadJustifyLength();
-                return dlen <= src.length ? is : new ConcatenatedInputStream(is,
-                        RepeatingInputStream.getInstance(dest.getPad(), dlen - src.length));
+                final InputStream is = new ByteArrayInputStream(src);
+                final int dlen = dest.getPadJustifyLength();
+                return dlen <= src.length ? is : new ConcatenatedInputStream(
+                    is, RepeatingInputStream.withLimit(dlen - src.length,
+                        dest.getPad()));
             }
         },
 
@@ -54,13 +59,15 @@ public abstract class PadJustifyFieldSup
              * {@inheritDoc}
              */
             protected InputStream getInputStream(byte[] src, PadJustifyFieldSupport dest) {
-                int dlen = dest.getPadJustifyLength();
+                final int dlen = dest.getPadJustifyLength();
                 if (dlen < src.length) {
-                    return new ByteArrayInputStream(src, src.length - dlen, dlen);
+                    return new ByteArrayInputStream(src, src.length - dlen,
+                        dlen);
                 }
-                InputStream is = new ByteArrayInputStream(src);
-                return dlen == src.length ? is : new ConcatenatedInputStream(RepeatingInputStream
-                        .getInstance(dest.getPad(), dlen - src.length), is);
+                final InputStream is = new ByteArrayInputStream(src);
+                return dlen == src.length ? is : new ConcatenatedInputStream(
+                    RepeatingInputStream.withLimit(dlen - src.length,
+                        dest.getPad()), is);
             }
         },
 
@@ -70,23 +77,23 @@ public abstract class PadJustifyFieldSup
              * {@inheritDoc}
              */
             protected InputStream getInputStream(byte[] src, PadJustifyFieldSupport dest) {
-                int dlen = dest.getPadJustifyLength();
+                final int dlen = dest.getPadJustifyLength();
                 // it would be odd and therefore hopefully rare to center a
                 // field that allowed overflow,
                 // but we'll provide for it:
                 if (dlen < src.length) {
-                    return new ByteArrayInputStream(src, (src.length - dlen) / 2, dlen);
+                    return new ByteArrayInputStream(src,
+                        (src.length - dlen) / 2, dlen);
                 }
-                InputStream is = new ByteArrayInputStream(src);
+                final InputStream is = new ByteArrayInputStream(src);
                 if (dlen == src.length) {
                     return is;
                 }
-                ArrayList<InputStream> l = new ArrayList<InputStream>(3);
-                byte pad = dest.getPad();
-                l.add(RepeatingInputStream.getInstance(pad, (dlen - src.length) / 2));
-                l.add(is);
-                l.add(RepeatingInputStream.getInstance(pad));
-                return new ConcatenatedInputStream(l);
+                final byte pad = dest.getPad();
+                return new ConcatenatedInputStream(
+                    RepeatingInputStream
+                        .withLimit((dlen - src.length) / 2, pad),
+                    is, RepeatingInputStream.of(pad));
             }
         };
 
@@ -99,7 +106,7 @@ public abstract class PadJustifyFieldSup
         protected abstract InputStream getInputStream(byte[] src, PadJustifyFieldSupport dest);
     }
 
-    private byte pad = 0x20;
+    private byte pad = DEFAULT_PAD;
     private Justify justify;
 
     /**

Modified: commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/util/ConcatenatedInputStream.java
URL: http://svn.apache.org/viewvc/commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/util/ConcatenatedInputStream.java?rev=1301242&r1=1301241&r2=1301242&view=diff
==============================================================================
--- commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/util/ConcatenatedInputStream.java (original)
+++ commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/util/ConcatenatedInputStream.java Thu Mar 15 22:14:40 2012
@@ -18,9 +18,10 @@ package org.apache.commons.flatfile.util
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Arrays;
 import java.util.Iterator;
 
-import org.apache.commons.collections.IteratorUtils;
+import org.apache.commons.lang3.Validate;
 
 /**
  * Unified InputStream representation of multiple concatenated InputStreams.
@@ -30,14 +31,13 @@ public class ConcatenatedInputStream ext
     /** EOF */
     public static final int EOF = -1;
 
-    private static final String NO_NULL = "null arguments are unacceptable";
     private static final InputStream AT_EOF = new InputStream() {
         public int read() throws IOException {
             return EOF;
         }
     };
 
-    private Iterator<InputStream> iter;
+    private final Iterator<InputStream> iter;
     private InputStream current;
 
     /**
@@ -45,26 +45,16 @@ public class ConcatenatedInputStream ext
      * @param src InputStreams
      */
     public ConcatenatedInputStream(Iterable<InputStream> src) {
-        if (src == null) {
-            throw new IllegalArgumentException(NO_NULL);
-        }
-        iter = src.iterator();
+        this.iter = Validate.notNull(src).iterator();
         next();
     }
 
     /**
-     * Convenience constructor.
-     * @param is0 first InputStream
-     * @param is1 next InputStream
+     * Create a new ConcatenatedInputStream.
+     * @param src InputStreams
      */
-    @SuppressWarnings("unchecked")
-    public ConcatenatedInputStream(InputStream is0, InputStream is1) {
-        if (is0 == null || is1 == null) {
-            throw new IllegalArgumentException(NO_NULL);
-        }
-        // shortcuts:
-        current = is0;
-        iter = IteratorUtils.singletonIterator(is1);
+    public ConcatenatedInputStream(InputStream... src) {
+        this(Arrays.asList(Validate.notNull(src)));
     }
 
     /**

Modified: commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/util/RepeatingInputStream.java
URL: http://svn.apache.org/viewvc/commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/util/RepeatingInputStream.java?rev=1301242&r1=1301241&r2=1301242&view=diff
==============================================================================
--- commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/util/RepeatingInputStream.java (original)
+++ commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/util/RepeatingInputStream.java Thu Mar 15 22:14:40 2012
@@ -18,24 +18,32 @@ package org.apache.commons.flatfile.util
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.HashMap;
+
+import org.apache.commons.lang3.Validate;
 
 /**
- * Provides factory methods to return InputStreams that return a repeating ordered
- * sequence of bytes, optionally limiting output to some maximum total size.
- * @version $Revision$ $Date$
+ * Provides factory methods to return InputStreams that return a repeating
+ * ordered sequence of bytes, optionally limiting output to some maximum total
+ * size.
+ * 
+ * @version $Revision$ $Date: 2009-03-24 16:09:19 -0500 (Tue, 24 Mar
+ *          2009) $
  */
 public abstract class RepeatingInputStream {
+    private RepeatingInputStream() {
+    }
 
     /**
      * An InputStream that repeats a single byte forever.
      */
     private static class RepeatOneByte extends InputStream {
-        private byte b;
+        private final byte b;
 
         /**
          * Create a new RepeatOneByte instance.
-         * @param b byte to repeat
+         * 
+         * @param b
+         *            byte to repeat
          */
         private RepeatOneByte(byte b) {
             this.b = b;
@@ -53,12 +61,14 @@ public abstract class RepeatingInputStre
      * An InputStream that repeats a byte[] forever.
      */
     private static class RepeatArray extends InputStream {
-        private byte[] b;
+        private final byte[] b;
         private int pos;
 
         /**
          * Create a new RepeatArray instance.
-         * @param b byte[] to repeat
+         * 
+         * @param b
+         *            byte[] to repeat
          */
         private RepeatArray(byte[] b) {
             this.b = b;
@@ -84,14 +94,17 @@ public abstract class RepeatingInputStre
     private static class LimitedOutput extends InputStream {
         private static final int EOF = -1;
 
-        private InputStream source;
-        private int bytesToReturn;
+        private final InputStream source;
+        private final int bytesToReturn;
         private int bytesReturned;
 
         /**
          * Create a new LimitedOutput instance.
-         * @param source wrapped InputStream
-         * @param bytesToReturn int max
+         * 
+         * @param source
+         *            wrapped InputStream
+         * @param bytesToReturn
+         *            int max
          */
         private LimitedOutput(InputStream source, int bytesToReturn) {
             this.source = source;
@@ -114,55 +127,49 @@ public abstract class RepeatingInputStre
     }
 
     /**
-     * Holds cached instances of single-byte RepeatingInputStreams.
-     */
-    // go ahead and init b/c we know we'll want a single-byte instance:
-    private static HashMap<Byte, InputStream> INSTANCE_MAP = new HashMap<Byte, InputStream>();
-
-    /**
-     * Get an InputStream that will return the specified byte forever.
-     * @param b byte to repeat
-     * @return InputStream
+     * Holds cached instances of single-byte RepeatingInputStreams, with enough
+     * space for every unique byte value.
      */
-    public static synchronized InputStream getInstance(byte b) {
-        Byte bigByte = new Byte(b);
-        InputStream result = INSTANCE_MAP.get(bigByte);
-        if (result == null) {
-            result = new RepeatOneByte(b);
-            INSTANCE_MAP.put(bigByte, result);
-        }
-        return result;
-    }
+    private static InputStream[] REPEAT_BYTE = new InputStream[(int) Math.pow(
+        2, Byte.SIZE)];
 
     /**
      * Get an InputStream that will return the specified byte[] forever.
-     * @param b byte[] to repeat
+     * 
+     * @param b
+     *            byte[] to repeat
      * @return InputStream
+     * @throws NullPointerException
+     *             if {@code b} is {@code null}
      */
-    public static InputStream getInstance(byte[] b) {
-        return b.length == 1 ? getInstance(b[0]) : new RepeatArray(b);
-    }
-
-    /**
-     * Get an InputStream that will return a single byte a limited number of times.
-     * @param b byte to repeat
-     * @param bytesToReturn int
-     * @return InputStream
-     */
-    public static synchronized InputStream getInstance(byte b, int bytesToReturn) {
-        return new LimitedOutput(getInstance(b), bytesToReturn);
+    public static InputStream of(byte... b) {
+        Validate.notNull(b);
+        if (b.length == 1) {
+            final int index = 0 | b[0];
+            InputStream result = REPEAT_BYTE[index];
+            if (result == null) {
+                result = new RepeatOneByte(b[0]);
+                REPEAT_BYTE[index] = result;
+            }
+            return result;
+        }
+        return new RepeatArray(b);
     }
 
     /**
-     * Get an InputStream that will return the specified byte sequence
-     * until a total of <code>bytesToReturn</code> bytes have been returned.
-     * @param b byte[] to repeat
-     * @param bytesToReturn int
+     * Get an InputStream that will return the specified byte sequence until a
+     * total of {@code limit} bytes have been returned.
+     * 
+     * @param limit
+     *            int
+     * @param b
+     *            byte[] to repeat
      * @return InputStream
+     * @throws NullPointerException
+     *             if {@code b} is {@code null}
      */
-    public static synchronized InputStream getInstance(byte[] b,
-            int bytesToReturn) {
-        return new LimitedOutput(getInstance(b), bytesToReturn);
+    public static synchronized InputStream withLimit(int limit, byte... b) {
+        return new LimitedOutput(of(b), limit);
     }
 
 }