]> source.dussan.org Git - poi.git/commitdiff
Merged revisions 638786-638802,638805-638811,638813-638814,638816-639230,639233-63924...
authorNick Burch <nick@apache.org>
Thu, 7 Aug 2008 22:52:07 +0000 (22:52 +0000)
committerNick Burch <nick@apache.org>
Thu, 7 Aug 2008 22:52:07 +0000 (22:52 +0000)
https://svn.apache.org/repos/asf/poi/trunk

........
  r683699 | josh | 2008-08-07 21:23:26 +0100 (Thu, 07 Aug 2008) | 1 line

  JDK 1.4 compatibility.  Some exception clean-up
........
  r683706 | josh | 2008-08-07 21:32:25 +0100 (Thu, 07 Aug 2008) | 1 line

  Fix for bug 45582 - handle extra bytes after the EOFRecord
........

git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@683742 13f79535-47bb-0310-9956-ffa450edef68

25 files changed:
src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/eventusermodel/EventWorkbookBuilder.java
src/java/org/apache/poi/hssf/model/Sheet.java
src/java/org/apache/poi/hssf/model/Workbook.java
src/java/org/apache/poi/hssf/record/EOFRecord.java
src/java/org/apache/poi/hssf/record/ObjRecord.java
src/java/org/apache/poi/hssf/record/RecordInputStream.java
src/java/org/apache/poi/util/ByteField.java
src/java/org/apache/poi/util/LittleEndian.java
src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java
src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java
src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java
src/scratchpad/src/org/apache/poi/hssf/usermodel/HSSFChart.java
src/scratchpad/testcases/org/apache/poi/hslf/extractor/TextExtractor.java
src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java
src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestAddingSlides.java
src/testcases/org/apache/poi/hssf/data/ex45582-22397.xls [new file with mode: 0644]
src/testcases/org/apache/poi/hssf/eventmodel/TestEventRecordFactory.java
src/testcases/org/apache/poi/hssf/model/TestSheet.java
src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java
src/testcases/org/apache/poi/hssf/usermodel/TestSanityChecker.java
src/testcases/org/apache/poi/util/TestLittleEndian.java
src/testcases/org/apache/poi/util/TestLongField.java

index 85e9d58f85d3ee73812d9fb872d752a51d27ec91..bc9a757724e0b7127f4b608de9a2444fe35aa78d 100644 (file)
@@ -54,6 +54,7 @@
            <action dev="POI-DEVELOPERS" type="add">Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx</action>
         </release>
         <release version="3.1.1-alpha1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="add">45582 - Fix for workbook streams with extra bytes trailing the EOFRecord</action>
            <action dev="POI-DEVELOPERS" type="add">45537 - Include headers and footers (of slides and notes) in the extracted text from HSLF</action>
            <action dev="POI-DEVELOPERS" type="fix">45472 - Fixed incorrect default row height in OpenOffice 2.3</action>
            <action dev="POI-DEVELOPERS" type="fix">44692 - HSSFPicture.resize() stretched image when there was a text next to it</action>
index 09f91c20fe294ee99031b3d072625f5f5a852d1e..63926ec04364f6fb0bd18eff5649e1d83a575923 100644 (file)
@@ -51,6 +51,7 @@
            <action dev="POI-DEVELOPERS" type="add">Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx</action>
         </release>
         <release version="3.1.1-alpha1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="add">45582 - Fix for workbook streams with extra bytes trailing the EOFRecord</action>
            <action dev="POI-DEVELOPERS" type="add">45537 - Include headers and footers (of slides and notes) in the extracted text from HSLF</action>
            <action dev="POI-DEVELOPERS" type="fix">45472 - Fixed incorrect default row height in OpenOffice 2.3</action>
            <action dev="POI-DEVELOPERS" type="fix">44692 - HSSFPicture.resize() stretched image when there was a text next to it</action>
index 0ae5f3f2605a1258f34ff1794597211027c6c2ce..3c767dc25a4b8b6f38c51b3a7e3bbcd25be47eb5 100644 (file)
@@ -96,7 +96,7 @@ public class EventWorkbookBuilder {
                }
                
                // Finally we need an EoF record
-               wbRecords.add(new EOFRecord());
+               wbRecords.add(EOFRecord.instance);
                
                return Workbook.createWorkbook(wbRecords);
        }
index a17984b49cbc603d8f8844a319544cbb10262d16..5e8faa092bd14addc7c1616cdf6be21fdbfbd470 100644 (file)
@@ -550,7 +550,7 @@ public final class Sheet implements Model {
         retval.setLoc(records.size() - 1);
         retval.selection = createSelection();
         records.add(retval.selection);
-        records.add(new EOFRecord());
+        records.add(EOFRecord.instance);
 
 
         retval.records = records;
index 36510eb8352e1ff52fbd0d9b2042812f8e5bd9fc..f80c41661d8ad6755fa9ea523e4923417473ce80 100644 (file)
@@ -351,7 +351,7 @@ public class Workbook implements Model
         records.add( retval.sst );
         records.add( retval.createExtendedSST() );
 
-        records.add( retval.createEOF() );
+        records.add(EOFRecord.instance);
         if (log.check( POILogger.DEBUG ))
             log.log( DEBUG, "exit create new workbook from scratch" );
         return retval;
@@ -1857,17 +1857,6 @@ public class Workbook implements Model
         retval.setNumStringsPerBucket(( short ) 0x8);
         return retval;
     }
-
-    /**
-     * creates the EOF record
-     * @see org.apache.poi.hssf.record.EOFRecord
-     * @see org.apache.poi.hssf.record.Record
-     * @return record containing a EOFRecord
-     */
-
-    protected Record createEOF() {
-        return new EOFRecord();
-    }
     
     /**
      * lazy initialization
index 0f6b87ad80b0d8237530f8ba5e2ed4819deec894..d658c6d83dabf08ed0c5eb5b8c4e8a79e1d677ea 100644 (file)
@@ -1,4 +1,3 @@
-
 /* ====================================================================
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
@@ -15,7 +14,6 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 ==================================================================== */
-        
 
 package org.apache.poi.hssf.record;
 
@@ -31,14 +29,14 @@ import org.apache.poi.util.LittleEndian;
  * @author Jason Height (jheight at chariot dot net dot au)
  * @version 2.0-pre
  */
-
-public class EOFRecord
-    extends Record
-{
+public final class EOFRecord extends Record {
     public final static short sid = 0x0A;
+       public static final int ENCODED_SIZE = 4;
 
-    public EOFRecord()
-    {
+       public static final EOFRecord instance = new EOFRecord();
+       
+    private EOFRecord() {
+       // no data fields
     }
 
     /**
@@ -82,7 +80,7 @@ public class EOFRecord
 
     public int getRecordSize()
     {
-        return 4;
+        return ENCODED_SIZE;
     }
 
     public short getSid()
@@ -91,7 +89,6 @@ public class EOFRecord
     }
 
     public Object clone() {
-      EOFRecord rec = new EOFRecord();
-      return rec;
+      return instance;
     }
 }
index 7d29654cd85779f9185d0ed24d6bd22e87367985..0e424eed2f3d5e101cc2b8be940fd255a33bb2b7 100644 (file)
@@ -30,7 +30,7 @@ import org.apache.poi.util.LittleEndian;
  * @author Glen Stampoultzis (glens at apache.org)
  */
 public final class ObjRecord extends Record {
-    public final static short      sid                             = 0x5D;
+    public final static short      sid                             = 0x005D;
     private List subrecords;
 
     //00000000 15 00 12 00 01 00 01 00 11 60 00 00 00 00 00 0D .........`......
@@ -69,18 +69,27 @@ public final class ObjRecord extends Record {
 
     protected void fillFields(RecordInputStream in)
     {
+       // TODO - problems with OBJ sub-records stream
+       // MS spec says first sub-records is always CommonObjectDataSubRecord, and last is 
+       // always EndSubRecord.  OOO spec does not mention ObjRecord(0x005D).
+       // Existing POI test data seems to violate that rule.  Some test data seems to contain
+       // garbage, and a crash is only averted by stopping at what looks like the 'EndSubRecord'
+       
         subrecords = new ArrayList();
         //Check if this can be continued, if so then the
         //following wont work properly
         int subSize = 0;
         byte[] subRecordData = in.readRemainder();
-
+        
         RecordInputStream subRecStream = new RecordInputStream(new ByteArrayInputStream(subRecordData));
         while(subRecStream.hasNextRecord()) {
           subRecStream.nextRecord();
           Record subRecord = SubRecord.createSubRecord(subRecStream);
           subSize += subRecord.getRecordSize();
           subrecords.add(subRecord);
+          if (subRecord instanceof EndSubRecord) {
+                 break;
+          }
         }
 
         /**
index ba900b2a28d336b0c30e0d655fcd24f15c6873da..12c818b183f5ae074114a97b01738da5f3a74748 100755 (executable)
@@ -1,4 +1,3 @@
-
 /* ====================================================================
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
@@ -16,7 +15,6 @@
    limitations under the License.
 ==================================================================== */
 
-
 package org.apache.poi.hssf.record;
 
 import org.apache.poi.util.LittleEndian;
@@ -31,16 +29,15 @@ import java.io.ByteArrayOutputStream;
  *
  * @author Jason Height (jheight @ apache dot org)
  */
-
-public class RecordInputStream extends InputStream
-{
+public class RecordInputStream extends InputStream {
   /** Maximum size of a single record (minus the 4 byte header) without a continue*/
   public final static short MAX_RECORD_DATA_SIZE = 8224;
-
+  private static final int INVALID_SID_VALUE = -1;
+  
   private InputStream in;
   protected short currentSid;
   protected short currentLength = -1;
-  protected short nextSid = -1;
+  protected short nextSid;
 
   protected byte[] data = new byte[MAX_RECORD_DATA_SIZE];
   protected short recordOffset;
@@ -60,7 +57,7 @@ public class RecordInputStream extends InputStream
   }
   
   /** This method will read a byte from the current record*/
-  public int read() throws IOException {
+  public int read() {
     checkRecordPosition();
 
     byte result = data[recordOffset];
@@ -86,7 +83,7 @@ public class RecordInputStream extends InputStream
   }
 
   public boolean hasNextRecord() {
-    return (nextSid != 0);
+    return nextSid != INVALID_SID_VALUE;
   }
   
   /** Moves to the next record in the stream.
@@ -110,7 +107,20 @@ public class RecordInputStream extends InputStream
       in.read(data, 0, currentLength);
 
       //Read the Sid of the next record
-      nextSid = LittleEndian.readShort(in);
+      if (in.available() < EOFRecord.ENCODED_SIZE) {
+          if (in.available() > 0) {
+              // some scrap left over?
+              // ex45582-22397.xls has one extra byte after the last record
+              // Excel reads that file OK
+          }
+          nextSid = INVALID_SID_VALUE;  
+      } else {
+          nextSid = LittleEndian.readShort(in);
+          if (nextSid == INVALID_SID_VALUE) {
+              throw new RecordFormatException("Found sid " + nextSid + " after record with sid 0x"
+                      + Integer.toHexString(currentSid).toUpperCase());
+          }
+      }      
     } catch (IOException ex) {
       throw new RecordFormatException("Error reading bytes", ex);
     }
@@ -179,11 +189,11 @@ public class RecordInputStream extends InputStream
    * Reads an 8 bit, unsigned value
    */
   public short readUByte() {
-         short s = readByte();
-         if(s < 0) {
-                 s += 256;
-         }
-         return s;
+      short s = readByte();
+      if(s < 0) {
+          s += 256;
+      }
+      return s;
   }
 
   /**
@@ -266,9 +276,9 @@ public class RecordInputStream extends InputStream
   }
     
   public String readCompressedUnicode(int length) {
-       if(length == 0) {
-               return "";
-       }
+    if(length == 0) {
+        return "";
+    }
     if ((length < 0) || ((remaining() < length) && !isContinueNext())) {
             throw new IllegalArgumentException("Illegal length " + length);
     }
index 0b9f1e5837c39c4260f961adba5cce9981964036..323fee8d67bd937fd647c96a6487da0f0c245605 100644 (file)
@@ -22,6 +22,7 @@ package org.apache.poi.util;
 import org.apache.poi.util.LittleEndian.BufferUnderrunException;
 
 import java.io.*;
+import java.nio.BufferUnderflowException;
 
 /**
  * representation of a byte (8-bit) field at a fixed location within a
@@ -183,9 +184,12 @@ public class ByteField
     public void readFromStream(final InputStream stream)
         throws IOException, BufferUnderrunException
     {
-        _value =
-            (LittleEndian.readFromStream(stream,
-                                         LittleEndianConsts.BYTE_SIZE))[ 0 ];
+       // TODO - are these ~Field used / necessary
+       int ib = stream.read();
+       if (ib < 0) {
+               throw new BufferUnderflowException();
+       }
+        _value = (byte) ib;
     }
 
     /**
index 2278649cb89cf4e73fd4dcce2c773ed390043a49..6838eb2aa45ccbd689c173414dde920cadd975fd 100644 (file)
@@ -19,7 +19,6 @@ package org.apache.poi.util;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Arrays;
 
 /**
  *  a utility class for handling little-endian numbers, which the 80x86 world is
@@ -29,16 +28,11 @@ import java.util.Arrays;
  *@author     Marc Johnson (mjohnson at apache dot org)
  *@author     Andrew Oliver (acoliver at apache dot org)
  */
+public final class LittleEndian implements LittleEndianConsts {
 
-public class LittleEndian
-         implements LittleEndianConsts {
-
-    // all methods are static, so an accessible constructor makes no
-    // sense
-    /**
-     *  Constructor for the LittleEndian object
-     */
-    private LittleEndian() { }
+    private LittleEndian() {
+       // no instances of this class
+    }
 
 
     /**
@@ -385,12 +379,7 @@ public class LittleEndian
      *@author     Marc Johnson (mjohnson at apache dot org)
      */
 
-    public static class BufferUnderrunException
-             extends IOException {
-
-        /**
-         *  simple constructor
-         */
+    public static final class BufferUnderrunException extends IOException {
 
         BufferUnderrunException() {
             super("buffer underrun");
@@ -408,12 +397,21 @@ public class LittleEndian
      *@exception  BufferUnderrunException  if the stream cannot provide enough
      *      bytes
      */
+    public static short readShort(InputStream stream) throws IOException, BufferUnderrunException {
 
-    public static short readShort(final InputStream stream)
-             throws IOException, BufferUnderrunException {
-        return getShort(readFromStream(stream, SHORT_SIZE));
-    }
+               return (short) readUShort(stream);
+       }
 
+       public static int readUShort(InputStream stream) throws IOException, BufferUnderrunException {
+
+               int ch1 = stream.read();
+               int ch2 = stream.read();
+               if ((ch1 | ch2) < 0) {
+                       throw new BufferUnderrunException();
+               }
+               return ((ch2 << 8) + (ch1 << 0));
+       }
+    
 
     /**
      *  get an int value from an InputStream
@@ -425,10 +423,16 @@ public class LittleEndian
      *@exception  BufferUnderrunException  if the stream cannot provide enough
      *      bytes
      */
-
     public static int readInt(final InputStream stream)
              throws IOException, BufferUnderrunException {
-        return getInt(readFromStream(stream, INT_SIZE));
+               int ch1 = stream.read();
+               int ch2 = stream.read();
+               int ch3 = stream.read();
+               int ch4 = stream.read();
+               if ((ch1 | ch2 | ch3 | ch4) < 0) {
+                       throw new BufferUnderrunException();
+               }
+               return ((ch4 << 24) + (ch3<<16) + (ch2 << 8) + (ch1 << 0));
     }
 
 
@@ -445,46 +449,29 @@ public class LittleEndian
 
     public static long readLong(final InputStream stream)
              throws IOException, BufferUnderrunException {
-        return getLong(readFromStream(stream, LONG_SIZE));
+               int ch1 = stream.read();
+               int ch2 = stream.read();
+               int ch3 = stream.read();
+               int ch4 = stream.read();
+               int ch5 = stream.read();
+               int ch6 = stream.read();
+               int ch7 = stream.read();
+               int ch8 = stream.read();
+               if ((ch1 | ch2 | ch3 | ch4 | ch5 | ch6 | ch7 | ch8) < 0) {
+                       throw new BufferUnderrunException();
+               }
+               
+               return 
+                       ((long)ch8 << 56) +
+            ((long)ch7 << 48) +
+            ((long)ch6 << 40) +
+            ((long)ch5 << 32) +
+            ((long)ch4 << 24) + // cast to long to preserve bit 31 (sign bit for ints)
+                  (ch3 << 16) +
+                  (ch2 <<  8) +
+                  (ch1 <<  0);
     }
 
-    /**
-     *  Read the appropriate number of bytes from the stream and return them to
-     *  the caller. <p>
-     *
-     *  However, for the purposes of the POI project, this risk is deemed
-     *  negligible. It is, however, so noted.
-     *
-     *@param  stream                       the InputStream we're reading from
-     *@param  size                         the number of bytes to read; in
-     *      99.99% of cases, this will be SHORT_SIZE, INT_SIZE, or LONG_SIZE --
-     *      but it doesn't have to be.
-     *@return                              the byte array containing the
-     *      required number of bytes. The array will contain all zero's on end
-     *      of stream
-     *@exception  IOException              will be propagated back to the caller
-     *@exception  BufferUnderrunException  if the stream cannot provide enough
-     *      bytes
-     */
-
-    public static byte[] readFromStream(final InputStream stream,
-            final int size)
-             throws IOException, BufferUnderrunException {
-        byte[] buffer = new byte[size];
-
-        int count = stream.read(buffer);
-
-        if (count == -1) {
-
-            // return a zero-filled buffer
-            Arrays.fill(buffer, (byte) 0);
-        } else if (count != size) {
-            throw new BufferUnderrunException();
-        }
-        return buffer;
-    }
-
-
     /**
      *  Gets the number attribute of the LittleEndian class
      *
index dc967fd5b4a3c46f6583247720f85421e1e206ef..217ab7bc88458e9a186772f28645efd66379c399 100644 (file)
@@ -1,4 +1,3 @@
-
 /* ====================================================================
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
@@ -15,8 +14,6 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 ==================================================================== */
-        
-
 
 package org.apache.poi.hslf;
 
@@ -27,7 +24,12 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
 
 import org.apache.poi.POIDocument;
 import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException;
@@ -36,7 +38,6 @@ import org.apache.poi.hslf.exceptions.HSLFException;
 import org.apache.poi.hslf.record.*;
 import org.apache.poi.hslf.usermodel.ObjectData;
 import org.apache.poi.hslf.usermodel.PictureData;
-import org.apache.poi.hslf.model.Shape;
 import org.apache.poi.poifs.filesystem.DirectoryNode;
 import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.DocumentInputStream;
@@ -51,14 +52,10 @@ import org.apache.poi.util.POILogger;
  *
  * @author Nick Burch
  */
-
-public class HSLFSlideShow extends POIDocument
-{
+public final class HSLFSlideShow extends POIDocument {
     // For logging
     private POILogger logger = POILogFactory.getLogger(this.getClass());
 
-       private InputStream istream;
-
        // Holds metadata on where things are in our document
        private CurrentUserAtom currentUser;
 
@@ -101,11 +98,9 @@ public class HSLFSlideShow extends POIDocument
         * @param inputStream the source of the data
         * @throws IOException if there is a problem while parsing the document.
         */
-       public HSLFSlideShow(InputStream inputStream) throws IOException
-       {
+       public HSLFSlideShow(InputStream inputStream) throws IOException {
                //do Ole stuff
                this(new POIFSFileSystem(inputStream));
-               istream = inputStream;
        }
 
        /**
@@ -160,29 +155,21 @@ public class HSLFSlideShow extends POIDocument
                // Look for Picture Streams:
                readPictures();
        }
-
        /**
         * Constructs a new, empty, Powerpoint document.
         */
-       public HSLFSlideShow() throws IOException 
-       {
-               this(HSLFSlideShow.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt"));
-       }
-
-       /**
-        * Shuts things down. Closes underlying streams etc
-        *
-        * @throws IOException
-        */
-       public void close() throws IOException
-       {
-               if(istream != null) {
-                       istream.close();
+       public static final HSLFSlideShow create() {
+               InputStream is = HSLFSlideShow.class.getResourceAsStream("data/empty.ppt");
+               if (is == null) {
+                       throw new RuntimeException("Missing resource 'empty.ppt'");
+               }
+               try {
+                       return new HSLFSlideShow(is);
+               } catch (IOException e) {
+                       throw new RuntimeException(e);
                }
-               filesystem = null;
        }
 
-
        /**
         * Extracts the main PowerPoint document stream from the 
         *  POI file, ready to be passed 
index 04ba17ffc15b1c2caa8defec03dea0480f746d02..74b20993a08263c3523d13d36c9dfb8be75011b1 100644 (file)
@@ -1,4 +1,3 @@
-
 /* ====================================================================
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    See the License for the specific language governing permissions and
    limitations under the License.
 ==================================================================== */
-        
-
 
 package org.apache.poi.hslf.dev;
 
-import java.util.*;
-import java.io.*;
-
-import org.apache.poi.ddf.*;
-import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.record.*;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 
-import org.apache.poi.util.LittleEndian;
+import org.apache.poi.hslf.HSLFSlideShow;
+import org.apache.poi.hslf.record.Record;
 
 /**
  * This class provides a way to view the contents of a powerpoint file.
@@ -36,9 +30,7 @@ import org.apache.poi.util.LittleEndian;
  *
  * @author Nick Burch
  */
-
-public class SlideShowRecordDumper
-{
+public final class SlideShowRecordDumper {
   private HSLFSlideShow doc;
 
   /**
@@ -57,7 +49,6 @@ public class SlideShowRecordDumper
        SlideShowRecordDumper foo = new SlideShowRecordDumper(filename);
 
        foo.printDump();
-       foo.close();
   }
 
 
@@ -73,19 +64,6 @@ public class SlideShowRecordDumper
        doc = new HSLFSlideShow(fileName);
   }
 
-  /**
-   * Shuts things down. Closes underlying streams etc
-   *
-   * @throws IOException
-   */
-  public void close() throws IOException
-  {
-       if(doc != null) {
-               doc.close();
-       }
-       doc = null;
-  }
-
 
   public void printDump() throws IOException {
        // Prints out the records in the tree
index 865471eefe745f44618c8da0308b3502722476e4..841bd38f9c785b2c16d287fb40e05b703cd482ae 100644 (file)
@@ -1,4 +1,3 @@
-
 /* ====================================================================
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    See the License for the specific language governing permissions and
    limitations under the License.
 ==================================================================== */
-        
-
 
 package org.apache.poi.hslf.extractor;
 
-import java.io.*;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.HashSet;
 
 import org.apache.poi.POIOLE2TextExtractor;
+import org.apache.poi.hslf.HSLFSlideShow;
+import org.apache.poi.hslf.model.Comment;
+import org.apache.poi.hslf.model.HeadersFooters;
+import org.apache.poi.hslf.model.Notes;
+import org.apache.poi.hslf.model.Slide;
+import org.apache.poi.hslf.model.TextRun;
+import org.apache.poi.hslf.usermodel.SlideShow;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.model.*;
-import org.apache.poi.hslf.record.Comment2000;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.usermodel.*;
 
 /**
  * This class can be used to extract text from a PowerPoint file.
@@ -37,9 +38,7 @@ import org.apache.poi.hslf.usermodel.*;
  *
  * @author Nick Burch
  */
-
-public class PowerPointExtractor extends POIOLE2TextExtractor
-{
+public final class PowerPointExtractor extends POIOLE2TextExtractor {
        private HSLFSlideShow _hslfshow;
        private SlideShow _show;
        private Slide[] _slides;
@@ -74,7 +73,6 @@ public class PowerPointExtractor extends POIOLE2TextExtractor
 
        PowerPointExtractor ppe = new PowerPointExtractor(file);
        System.out.println(ppe.getText(true,notes,comments));
-       ppe.close();
   }
 
        /**
@@ -110,16 +108,6 @@ public class PowerPointExtractor extends POIOLE2TextExtractor
                _slides = _show.getSlides();
        }
 
-       /**
-        * Shuts down the underlying streams
-        */
-       public void close() throws IOException {
-               _hslfshow.close();
-               _hslfshow = null;
-               _show = null;
-               _slides = null;
-       }
-
        /**
         * Should a call to getText() return slide text?
         * Default is yes
index f38cc7716d05f40a2cd83ee72a7fa0c67f903d24..1b2b9f5eeb6bab497519c70b78c3a8565c402334 100644 (file)
@@ -1,4 +1,3 @@
-
 /* ====================================================================
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    See the License for the specific language governing permissions and
    limitations under the License.
 ==================================================================== */
-        
-
 
 package org.apache.poi.hslf.usermodel;
 
-import java.util.*;
 import java.awt.Dimension;
-import java.io.*;
-
-import org.apache.poi.ddf.*;
-import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.model.*;
-import org.apache.poi.hslf.model.Notes;
-import org.apache.poi.hslf.model.Slide;
-import org.apache.poi.hslf.record.SlideListWithText.*;
-import org.apache.poi.hslf.record.*;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.List;
+
+import org.apache.poi.ddf.EscherBSERecord;
+import org.apache.poi.ddf.EscherContainerRecord;
+import org.apache.poi.ddf.EscherOptRecord;
+import org.apache.poi.ddf.EscherRecord;
+import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException;
 import org.apache.poi.hslf.exceptions.HSLFException;
+import org.apache.poi.hslf.model.HeadersFooters;
+import org.apache.poi.hslf.model.Notes;
+import org.apache.poi.hslf.model.PPFont;
+import org.apache.poi.hslf.model.Picture;
+import org.apache.poi.hslf.model.Shape;
+import org.apache.poi.hslf.model.Slide;
+import org.apache.poi.hslf.model.SlideMaster;
+import org.apache.poi.hslf.model.TitleMaster;
+import org.apache.poi.hslf.record.Document;
+import org.apache.poi.hslf.record.DocumentAtom;
+import org.apache.poi.hslf.record.FontCollection;
+import org.apache.poi.hslf.record.FontEntityAtom;
+import org.apache.poi.hslf.record.HeadersFootersContainer;
+import org.apache.poi.hslf.record.ParentAwareRecord;
+import org.apache.poi.hslf.record.PersistPtrHolder;
+import org.apache.poi.hslf.record.PositionDependentRecord;
+import org.apache.poi.hslf.record.PositionDependentRecordContainer;
+import org.apache.poi.hslf.record.Record;
+import org.apache.poi.hslf.record.RecordContainer;
+import org.apache.poi.hslf.record.RecordTypes;
+import org.apache.poi.hslf.record.SlideListWithText;
+import org.apache.poi.hslf.record.SlidePersistAtom;
+import org.apache.poi.hslf.record.UserEditAtom;
+import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet;
 import org.apache.poi.util.ArrayUtil;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
@@ -48,9 +76,7 @@ import org.apache.poi.util.POILogger;
  * @author Nick Burch
  * @author Yegor kozlov
  */
-
-public class SlideShow
-{
+public final class SlideShow {
   // What we're based on
   private HSLFSlideShow _hslfSlideShow;
 
@@ -90,8 +116,7 @@ public class SlideShow
    *
    * @param hslfSlideShow the HSLFSlideShow to base on
    */
-  public SlideShow(HSLFSlideShow hslfSlideShow) throws IOException
-  {
+  public SlideShow(HSLFSlideShow hslfSlideShow) {
        // Get useful things from our base slideshow
     _hslfSlideShow = hslfSlideShow;
        _records = _hslfSlideShow.getRecords();
@@ -111,8 +136,8 @@ public class SlideShow
   /**
    * Constructs a new, empty, Powerpoint document.
    */
-  public SlideShow() throws IOException {
-       this(new HSLFSlideShow());
+  public SlideShow() {
+       this(HSLFSlideShow.create());
   }
 
     /**
index ab7cc61ef1cee15383ba56455c4b42b513296d7b..5f5995afb10582985b1a7dfdecc2abcfe0527060 100644 (file)
@@ -153,7 +153,7 @@ public final class HSSFChart {
                records.add( createSeriesIndexRecord(2) );
                records.add( createSeriesIndexRecord(1) );
                records.add( createSeriesIndexRecord(3) );
-               records.add( createEOFRecord() );
+               records.add(EOFRecord.instance);
 
 
 
@@ -259,12 +259,6 @@ public final class HSSFChart {
                        throw new IllegalStateException("No chart title found to change");
                }
        }
-       
-
-       private EOFRecord createEOFRecord()
-       {
-               return new EOFRecord();
-       }
 
        private SeriesIndexRecord createSeriesIndexRecord( int index )
        {
index fe995fe12115c0d80cae4ca10c09646d3a91602a..13bd1df62ba103467244e430da4aa7e4035b8c60 100644 (file)
@@ -229,12 +229,12 @@ public class TextExtractor extends TestCase {
                ppe = new PowerPointExtractor(filename);
 
                String text = ppe.getText();
-               assertFalse("Comments not in by default", text.contains("This is a test comment"));
+               assertFalse("Comments not in by default", contains(text, "This is a test comment"));
                
                ppe.setCommentsByDefault(true);
                
                text = ppe.getText();
-               assertTrue("Unable to find expected word in text\n" + text, text.contains("This is a test comment"));
+               assertTrue("Unable to find expected word in text\n" + text, contains(text, "This is a test comment"));
 
                
                // And another file
@@ -242,12 +242,12 @@ public class TextExtractor extends TestCase {
                ppe = new PowerPointExtractor(filename);
 
                text = ppe.getText();
-               assertFalse("Comments not in by default", text.contains("testdoc"));
+               assertFalse("Comments not in by default", contains(text, "testdoc"));
                
                ppe.setCommentsByDefault(true);
                
                text = ppe.getText();
-               assertTrue("Unable to find expected word in text\n" + text, text.contains("testdoc"));
+               assertTrue("Unable to find expected word in text\n" + text, contains(text, "testdoc"));
     }
     
     /**
@@ -266,13 +266,13 @@ public class TextExtractor extends TestCase {
                ppe = new PowerPointExtractor(hslf);
 
                text = ppe.getText();
-               assertFalse("Unable to find expected word in text\n" + text, text.contains("testdoc"));
-        assertFalse("Unable to find expected word in text\n" + text, text.contains("test phrase"));
+               assertFalse("Unable to find expected word in text\n" + text, contains(text, "testdoc"));
+        assertFalse("Unable to find expected word in text\n" + text, contains(text, "test phrase"));
         
         ppe.setNotesByDefault(true);
                text = ppe.getText();
-               assertTrue("Unable to find expected word in text\n" + text, text.contains("testdoc"));
-        assertTrue("Unable to find expected word in text\n" + text, text.contains("test phrase"));
+               assertTrue("Unable to find expected word in text\n" + text, contains(text, "testdoc"));
+        assertTrue("Unable to find expected word in text\n" + text, contains(text, "test phrase"));
 
         
                // And with a footer, also on notes
@@ -285,12 +285,16 @@ public class TextExtractor extends TestCase {
                ppe = new PowerPointExtractor(filename);
 
                text = ppe.getText();
-               assertFalse("Unable to find expected word in text\n" + text, text.contains("testdoc"));
-        assertFalse("Unable to find expected word in text\n" + text, text.contains("test phrase"));
+               assertFalse("Unable to find expected word in text\n" + text, contains(text, "testdoc"));
+        assertFalse("Unable to find expected word in text\n" + text, contains(text, "test phrase"));
 
         ppe.setNotesByDefault(true);
                text = ppe.getText();
-               assertTrue("Unable to find expected word in text\n" + text, text.contains("testdoc"));
-        assertTrue("Unable to find expected word in text\n" + text, text.contains("test phrase"));
+               assertTrue("Unable to find expected word in text\n" + text, contains(text, "testdoc"));
+        assertTrue("Unable to find expected word in text\n" + text, contains(text, "test phrase"));
     }
+
+       private static boolean contains(String text, String searchString) {
+               return text.indexOf(searchString) >=0;
+       }
 }
index cb177048ba16e3950ad7ab4efa207bfb6e1c67da..ae6f752ab2752fc4b0b0ae5b70ba14e78604bc57 100644 (file)
@@ -1,4 +1,3 @@
-\r
 /* ====================================================================\r
    Licensed to the Apache Software Foundation (ASF) under one or more\r
    contributor license agreements.  See the NOTICE file distributed with\r
    See the License for the specific language governing permissions and\r
    limitations under the License.\r
 ==================================================================== */\r
-        \r
-\r
 \r
 package org.apache.poi.hslf.model;\r
 \r
-import java.io.*;\r
-import java.util.List;\r
-import java.util.ArrayList;\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+\r
+import junit.framework.TestCase;\r
 \r
 import org.apache.poi.hslf.HSLFSlideShow;\r
 import org.apache.poi.hslf.usermodel.ObjectData;\r
 import org.apache.poi.hslf.usermodel.PictureData;\r
 import org.apache.poi.hslf.usermodel.SlideShow;\r
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;\r
 import org.apache.poi.hssf.usermodel.HSSFSheet;\r
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;\r
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;\r
 import org.apache.poi.hwpf.HWPFDocument;\r
-import org.apache.poi.hwpf.usermodel.Range;\r
-import org.apache.poi.hwpf.usermodel.Paragraph;\r
-\r
-import junit.framework.TestCase;\r
 \r
-public class TestOleEmbedding extends TestCase\r
-{\r
+public final class TestOleEmbedding extends TestCase {\r
     /**\r
      * Tests support for OLE objects.\r
      *\r
      * @throws Exception if an error occurs.\r
      */\r
-    public void testOleEmbedding2003() throws Exception\r
-    {\r
+    public void testOleEmbedding2003() throws Exception {\r
         String dirname = System.getProperty("HSLF.testdata.path");\r
         File file = new File(dirname, "ole2-embedding-2003.ppt");\r
         HSLFSlideShow slideShow = new HSLFSlideShow(new FileInputStream(file));\r
-        try\r
-        {\r
-            // Placeholder EMFs for clients that don't support the OLE components.\r
-            PictureData[] pictures = slideShow.getPictures();\r
-            assertEquals("Should be two pictures", 2, pictures.length);\r
-            //assertDigestEquals("Wrong data for picture 1", "8d1fbadf4814f321bb1ccdd056e3c788", pictures[0].getData());\r
-            //assertDigestEquals("Wrong data for picture 2", "987a698e83559cf3d38a0deeba1cc63b", pictures[1].getData());\r
+        // Placeholder EMFs for clients that don't support the OLE components.\r
+        PictureData[] pictures = slideShow.getPictures();\r
+        assertEquals("Should be two pictures", 2, pictures.length);\r
+        //assertDigestEquals("Wrong data for picture 1", "8d1fbadf4814f321bb1ccdd056e3c788", pictures[0].getData());\r
+        //assertDigestEquals("Wrong data for picture 2", "987a698e83559cf3d38a0deeba1cc63b", pictures[1].getData());\r
 \r
-            // Actual embedded objects.\r
-            ObjectData[] objects = slideShow.getEmbeddedObjects();\r
-            assertEquals("Should be two objects", 2, objects.length);\r
-            //assertDigestEquals("Wrong data for objecs 1", "0d1fcc61a83de5c4894dc0c88e9a019d", objects[0].getData());\r
-            //assertDigestEquals("Wrong data for object 2", "b323604b2003a7299c77c2693b641495", objects[1].getData());\r
-        }\r
-        finally\r
-        {\r
-            slideShow.close();\r
-        }\r
+        // Actual embedded objects.\r
+        ObjectData[] objects = slideShow.getEmbeddedObjects();\r
+        assertEquals("Should be two objects", 2, objects.length);\r
+        //assertDigestEquals("Wrong data for objecs 1", "0d1fcc61a83de5c4894dc0c88e9a019d", objects[0].getData());\r
+        //assertDigestEquals("Wrong data for object 2", "b323604b2003a7299c77c2693b641495", objects[1].getData());\r
     }\r
 \r
     public void testOLEShape() throws Exception {\r
index 5e63ea9908c3001b7976b6b346727a94f205fbab..02c6beb53b046f826682ebe1e6f7de0f72a199ac 100644 (file)
@@ -1,4 +1,3 @@
-
 /* ====================================================================
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
@@ -15,8 +14,6 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 ==================================================================== */
-        
-
 
 package org.apache.poi.hslf.usermodel;
 
@@ -36,7 +33,7 @@ import org.apache.poi.hslf.model.*;
  *
  * @author Nick Burch (nick at torchbox dot com)
  */
-public class TestAddingSlides extends TestCase {
+public final class TestAddingSlides extends TestCase {
        // An empty SlideShow
        private HSLFSlideShow hss_empty;
        private SlideShow ss_empty;
@@ -53,7 +50,7 @@ public class TestAddingSlides extends TestCase {
         * Create/open the slideshows
         */
        public void setUp() throws Exception {
-               hss_empty = new HSLFSlideShow();
+               hss_empty = HSLFSlideShow.create();
                ss_empty = new SlideShow(hss_empty);
                
                String dirname = System.getProperty("HSLF.testdata.path");
@@ -82,8 +79,8 @@ public class TestAddingSlides extends TestCase {
         Record[] _records = hss_empty.getRecords();
         for (int i = 0; i < _records.length; i++) {
             Record record = _records[i];
-            if(_records[i].getRecordType() == RecordTypes.UserEditAtom.typeID) {
-                usredit = (UserEditAtom)_records[i];
+            if(record.getRecordType() == RecordTypes.UserEditAtom.typeID) {
+                usredit = (UserEditAtom)record;
             }
        }
        assertNotNull(usredit);
diff --git a/src/testcases/org/apache/poi/hssf/data/ex45582-22397.xls b/src/testcases/org/apache/poi/hssf/data/ex45582-22397.xls
new file mode 100644 (file)
index 0000000..2dc16f5
Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/ex45582-22397.xls differ
index c4a5ec84b3a28d9e98b3b7cb8ebe5afa19fab17c..88f620ca44eab4691587c7eb775c64eaa1995150 100644 (file)
@@ -63,7 +63,7 @@ public final class TestEventRecordFactory extends TestCase {
         bof.setVersion((short)0x06);
         bof.setHistoryBitMask(BOFRecord.HISTORY_MASK);
         
-        EOFRecord eof = new EOFRecord();
+        EOFRecord eof = EOFRecord.instance;
        byte[] bytes = new byte[bof.getRecordSize() + eof.getRecordSize()];
         int offset = 0;
         offset = bof.serialize(offset,bytes);
index 22defb942e9e4fffa111f66529a836b29a133768..40b349a54e870498696f4a1538bbd5df7efc96dd 100644 (file)
@@ -54,7 +54,7 @@ public final class TestSheet extends TestCase {
         List records = new ArrayList();
         records.add( new BOFRecord() );
         records.add( new DimensionsRecord() );
-        records.add( new EOFRecord() );
+        records.add(EOFRecord.instance);
         Sheet sheet = Sheet.createSheet( records, 0, 0 );
 
         int pos = 0;
@@ -396,7 +396,7 @@ public final class TestSheet extends TestCase {
         records.add(new BOFRecord());
         records.add(new UncalcedRecord());
         records.add(new DimensionsRecord());
-        records.add(new EOFRecord());
+        records.add(EOFRecord.instance);
         Sheet sheet = Sheet.createSheet(records, 0, 0);
 
         int estimatedSize = sheet.getSize();
index 37359231f8ec28958481e6881f48f67593262e59..d8b7cde29223c8e388fa2a3ada11421b1b57c521 100644 (file)
@@ -1,19 +1,19 @@
-/*
-* 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.
-*/
+/* ====================================================================
+   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.poi.hssf.usermodel;
 
@@ -29,8 +29,10 @@ import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.hssf.model.Sheet;
 import org.apache.poi.hssf.record.NameRecord;
 import org.apache.poi.hssf.record.Record;
+import org.apache.poi.hssf.record.RecordFormatException;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.formula.Area3DPtg;
+import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.TempFile;
 /**
  *
@@ -512,4 +514,17 @@ public final class TestHSSFWorkbook extends TestCase {
             return 8;
         }
     }
- }
+    
+    /**
+     * The sample file provided with bug 45582 seems to have one extra byte after the EOFRecord
+     */
+    public void testExtraDataAfterEOFRecord() {
+       try {
+               HSSFTestDataSamples.openSampleWorkbook("ex45582-22397.xls");
+       } catch (RecordFormatException e) {
+               if (e.getCause() instanceof LittleEndian.BufferUnderrunException) {
+                       throw new AssertionFailedError("Identified bug 45582");
+               }
+       }
+       }
+}
index d32c1a1b030fea57f9c985109631aee735ea2492..f2144700d94e3391470859b88b60a1d024f72e03 100644 (file)
@@ -1,4 +1,3 @@
-
 /* ====================================================================
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
@@ -15,7 +14,7 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 ==================================================================== */
-        
+
 package org.apache.poi.hssf.usermodel;
 
 import junit.framework.TestCase;
@@ -27,27 +26,20 @@ import java.util.ArrayList;
 import org.apache.poi.hssf.record.*;
 
 /**
+ * A Test case for a test utility class.<br/>
  * Okay, this may seem strange but I need to test my test logic.
  *
  * @author Glen Stampoultzis (glens at apache.org)
  */
-public class TestSanityChecker
-        extends TestCase
-{
-    public TestSanityChecker( String s )
-    {
-        super( s );
-    }
+public final class TestSanityChecker extends TestCase {
 
-    public void testCheckRecordOrder()
-            throws Exception
-    {
+    public void testCheckRecordOrder() {
         final SanityChecker c = new SanityChecker();
         List records = new ArrayList();
         records.add(new BOFRecord());
         records.add(new InterfaceHdrRecord());
         records.add(new BoundSheetRecord());
-        records.add(new EOFRecord());
+        records.add(EOFRecord.instance);
         final SanityChecker.CheckRecord[] check = {
             new SanityChecker.CheckRecord(BOFRecord.class, '1'),
             new SanityChecker.CheckRecord(InterfaceHdrRecord.class, '0'),
@@ -74,7 +66,7 @@ public class TestSanityChecker
                 records.add(new BOFRecord());
                 records.add(new BoundSheetRecord());
                 records.add(new InterfaceHdrRecord());
-                records.add(new EOFRecord());
+                records.add(EOFRecord.instance);
                 c.checkRecordOrder(records, check);
             }
         });
@@ -88,7 +80,7 @@ public class TestSanityChecker
                 records.add(new InterfaceHdrRecord());
                 records.add(new BoundSheetRecord());
                 records.add(new InterfaceHdrRecord());
-                records.add(new EOFRecord());
+                records.add(EOFRecord.instance);
                 c.checkRecordOrder(records, check);
             }
         });
@@ -101,7 +93,7 @@ public class TestSanityChecker
                 records.add(new BOFRecord());
                 records.add(new BoundSheetRecord());
                 records.add(new NameRecord());
-                records.add(new EOFRecord());
+                records.add(EOFRecord.instance);
                 records.add(new NameRecord());
                 c.checkRecordOrder(records, check);
             }
@@ -114,7 +106,7 @@ public class TestSanityChecker
                 List records = new ArrayList();
                 records.add(new InterfaceHdrRecord());
                 records.add(new BoundSheetRecord());
-                records.add(new EOFRecord());
+                records.add(EOFRecord.instance);
                 c.checkRecordOrder(records, check);
             }
         });
@@ -126,7 +118,7 @@ public class TestSanityChecker
                 List records = new ArrayList();
                 records.add(new BOFRecord());
                 records.add(new InterfaceHdrRecord());
-                records.add(new EOFRecord());
+                records.add(EOFRecord.instance);
                 c.checkRecordOrder(records, check);
             }
         });
@@ -139,7 +131,7 @@ public class TestSanityChecker
                 records.add(new InterfaceHdrRecord());
                 records.add(new BoundSheetRecord());
                 records.add(new BOFRecord());
-                records.add(new EOFRecord());
+                records.add(EOFRecord.instance);
                 c.checkRecordOrder(records, check);
             }
         });
@@ -152,7 +144,7 @@ public class TestSanityChecker
                 records.add(new BOFRecord());
                 records.add(new BoundSheetRecord());
                 records.add(new InterfaceHdrRecord());
-                records.add(new EOFRecord());
+                records.add(EOFRecord.instance);
                 c.checkRecordOrder(records, check);
             }
         });
index 4ee659cc9dc4673160ff503cd09c4c88d6cadfee..0ffcd189daceaf7794c70ec8ca82329a2d1d0532 100644 (file)
@@ -1,4 +1,3 @@
-
 /* ====================================================================
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
@@ -15,7 +14,6 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 ==================================================================== */
-        
 
 package org.apache.poi.util;
 
@@ -31,79 +29,54 @@ import java.io.InputStream;
  *
  * @author Marc Johnson
  */
-
-public class TestLittleEndian
-    extends TestCase
-{
-
-    /**
-     * Constructor TestLittleEndian
-     *
-     * @param name
-     */
-    public TestLittleEndian(String name)
-    {
-        super(name);
-    }
+public final class TestLittleEndian extends TestCase {
 
     /**
      * test the getShort() method
      */
-
-    public void testGetShort()
-    {
+    public void testGetShort() {
         byte[] testdata = new byte[ LittleEndian.SHORT_SIZE + 1 ];
 
-        testdata[ 0 ] = 0x01;
-        testdata[ 1 ] = ( byte ) 0xFF;
-        testdata[ 2 ] = 0x02;
-        short expected[] = new short[ 2 ];
+        testdata[0] = 0x01;
+        testdata[1] = (byte) 0xFF;
+        testdata[2] = 0x02;
+        short expected[] = new short[2];
 
-        expected[ 0 ] = ( short ) 0xFF01;
-        expected[ 1 ] = 0x02FF;
-        assertEquals(expected[ 0 ], LittleEndian.getShort(testdata));
-        assertEquals(expected[ 1 ], LittleEndian.getShort(testdata, 1));
+        expected[0] = ( short ) 0xFF01;
+        expected[1] = 0x02FF;
+        assertEquals(expected[0], LittleEndian.getShort(testdata));
+        assertEquals(expected[1], LittleEndian.getShort(testdata, 1));
     }
 
-    public void testGetUShort()
-    {
-        byte[] testdata = new byte[ LittleEndian.SHORT_SIZE + 1 ];
-
-        testdata[ 0 ] = 0x01;
-        testdata[ 1 ] = ( byte ) 0xFF;
-        testdata[ 2 ] = 0x02;
-
-        byte[] testdata2 = new byte[ LittleEndian.SHORT_SIZE + 1 ];
-        
-        testdata2[ 0 ] = 0x0D;
-        testdata2[ 1 ] = ( byte )0x93;
-        testdata2[ 2 ] = ( byte )0xFF;
-
-        int expected[] = new int[ 4 ];
-
-        expected[ 0 ] = 0xFF01;
-        expected[ 1 ] = 0x02FF;
-        expected[ 2 ] = 0x930D;
-        expected[ 3 ] = 0xFF93;
-        assertEquals(expected[ 0 ], LittleEndian.getUShort(testdata));
-        assertEquals(expected[ 1 ], LittleEndian.getUShort(testdata, 1));
-        assertEquals(expected[ 2 ], LittleEndian.getUShort(testdata2));
-        assertEquals(expected[ 3 ], LittleEndian.getUShort(testdata2, 1));
+    public void testGetUShort() {
+        byte[] testdata = {
+            (byte) 0x01,
+            (byte) 0xFF,
+            (byte) 0x02,
+        };
+        byte[] testdata2 = {
+            (byte) 0x0D,
+            (byte) 0x93,
+            (byte) 0xFF,
+        };
+
+        int expected0 = 0xFF01;
+        int expected1 = 0x02FF;
+        int expected2 = 0x930D;
+        int expected3 = 0xFF93;
+        assertEquals(expected0, LittleEndian.getUShort(testdata));
+        assertEquals(expected1, LittleEndian.getUShort(testdata, 1));
+        assertEquals(expected2, LittleEndian.getUShort(testdata2));
+        assertEquals(expected3, LittleEndian.getUShort(testdata2, 1));
 
         byte[] testdata3 = new byte[ LittleEndian.SHORT_SIZE + 1 ];
-        LittleEndian.putShort(testdata3, 0, ( short ) expected[2] );
-        LittleEndian.putShort(testdata3, 1, ( short ) expected[3] );
-        assertEquals(testdata3[ 0 ], 0x0D);
-        assertEquals(testdata3[ 1 ], (byte)0x93);
-        assertEquals(testdata3[ 2 ], (byte)0xFF);
-        assertEquals(expected[ 2 ], LittleEndian.getUShort(testdata3));
-        assertEquals(expected[ 3 ], LittleEndian.getUShort(testdata3, 1));
-        //System.out.println("TD[1][0]: "+LittleEndian.getUShort(testdata)+" expecting 65281");
-        //System.out.println("TD[1][1]: "+LittleEndian.getUShort(testdata, 1)+" expecting 767");
-        //System.out.println("TD[2][0]: "+LittleEndian.getUShort(testdata2)+" expecting 37645");
-        //System.out.println("TD[2][1]: "+LittleEndian.getUShort(testdata2, 1)+" expecting 65427");
-        //System.out.println("TD[3][0]: "+LittleEndian.getUShort(testdata3)+" expecting 37645");
-        //System.out.println("TD[3][1]: "+LittleEndian.getUShort(testdata3, 1)+" expecting 65427");
+        LittleEndian.putUShort(testdata3, 0, expected2);
+        LittleEndian.putUShort(testdata3, 1, expected3);
+        assertEquals(testdata3[0], 0x0D);
+        assertEquals(testdata3[1], (byte)0x93);
+        assertEquals(testdata3[2], (byte)0xFF);
+        assertEquals(expected2, LittleEndian.getUShort(testdata3));
+        assertEquals(expected3, LittleEndian.getUShort(testdata3, 1));
         
     }
 
@@ -123,19 +96,15 @@ public class TestLittleEndian
     /**
      * test the getDouble() method
      */
-
-    public void testGetDouble()
-    {
-        assertEquals(_doubles[ 0 ], LittleEndian.getDouble(_double_array), 0.000001 );
-        assertEquals(_doubles[ 1 ], LittleEndian.getDouble( _double_array, LittleEndian.DOUBLE_SIZE), 0.000001);
+    public void testGetDouble() {
+        assertEquals(_doubles[0], LittleEndian.getDouble(_double_array), 0.000001 );
+        assertEquals(_doubles[1], LittleEndian.getDouble( _double_array, LittleEndian.DOUBLE_SIZE), 0.000001);
         assertTrue(Double.isNaN(LittleEndian.getDouble(_nan_double_array)));
 
         double nan = LittleEndian.getDouble(_nan_double_array);
         byte[] data = new byte[8];
         LittleEndian.putDouble(data, nan);
-        for ( int i = 0; i < data.length; i++ )
-        {
-            byte b = data[i];
+        for ( int i = 0; i < data.length; i++ ) {
             assertEquals(data[i], _nan_double_array[i]);
         }
     }
@@ -143,192 +112,154 @@ public class TestLittleEndian
     /**
      * test the getInt() method
      */
-
-    public void testGetInt()
-    {
-        byte[] testdata = new byte[ LittleEndian.INT_SIZE + 1 ];
-
-        testdata[ 0 ] = 0x01;
-        testdata[ 1 ] = ( byte ) 0xFF;
-        testdata[ 2 ] = ( byte ) 0xFF;
-        testdata[ 3 ] = ( byte ) 0xFF;
-        testdata[ 4 ] = 0x02;
-        int expected[] = new int[ 2 ];
-
-        expected[ 0 ] = 0xFFFFFF01;
-        expected[ 1 ] = 0x02FFFFFF;
-        assertEquals(expected[ 0 ], LittleEndian.getInt(testdata));
-        assertEquals(expected[ 1 ], LittleEndian.getInt(testdata, 1));
+    public void testGetInt() {
+        // reading 4 byte data from a 5 byte buffer
+        byte[] testdata = {
+                (byte) 0x01,
+                (byte) 0xFF,
+                (byte) 0xFF,
+                (byte) 0xFF,
+                (byte) 0x02,
+        };
+
+        assertEquals(0xFFFFFF01, LittleEndian.getInt(testdata));
+        assertEquals(0x02FFFFFF, LittleEndian.getInt(testdata, 1));
     }
 
     /**
      * test the getLong method
      */
-
-    public void testGetLong()
-    {
-        byte[] testdata = new byte[ LittleEndian.LONG_SIZE + 1 ];
-
-        testdata[ 0 ] = 0x01;
-        testdata[ 1 ] = ( byte ) 0xFF;
-        testdata[ 2 ] = ( byte ) 0xFF;
-        testdata[ 3 ] = ( byte ) 0xFF;
-        testdata[ 4 ] = ( byte ) 0xFF;
-        testdata[ 5 ] = ( byte ) 0xFF;
-        testdata[ 6 ] = ( byte ) 0xFF;
-        testdata[ 7 ] = ( byte ) 0xFF;
-        testdata[ 8 ] = 0x02;
-        long expected[] = new long[ 2 ];
-
-        expected[ 0 ] = 0xFFFFFFFFFFFFFF01L;
-        expected[ 1 ] = 0x02FFFFFFFFFFFFFFL;
-        assertEquals(expected[ 0 ], LittleEndian.getLong(testdata));
-        assertEquals(expected[ 1 ], LittleEndian.getLong(testdata, 1));
+    public void testGetLong() {
+
+        // reading 8 byte values from a 9 byte buffer
+        byte[] testdata = {
+            (byte) 0x01,
+            (byte) 0xFF,
+            (byte) 0xFF,
+            (byte) 0xFF,
+            (byte) 0xFF,
+            (byte) 0xFF,
+            (byte) 0xFF,
+            (byte) 0xFF,
+            (byte) 0x02,
+        };
+
+        assertEquals(0xFFFFFFFFFFFFFF01L, LittleEndian.getLong(testdata));
+        assertEquals(0x02FFFFFFFFFFFFFFL, LittleEndian.getLong(testdata, 1));
     }
 
     /**
      * test the PutShort method
      */
-
-    public void testPutShort()
-    {
+    public void testPutShort() {
         byte[] expected = new byte[ LittleEndian.SHORT_SIZE + 1 ];
 
-        expected[ 0 ] = 0x01;
-        expected[ 1 ] = ( byte ) 0xFF;
-        expected[ 2 ] = 0x02;
+        expected[0] = 0x01;
+        expected[1] = (byte) 0xFF;
+        expected[2] = 0x02;
         byte[] received   = new byte[ LittleEndian.SHORT_SIZE + 1 ];
-        short  testdata[] = new short[ 2 ];
-
-        testdata[ 0 ] = ( short ) 0xFF01;
-        testdata[ 1 ] = 0x02FF;
-        LittleEndian.putShort(received, testdata[ 0 ]);
-        assertTrue(ba_equivalent(received, expected, 0,
-                                 LittleEndian.SHORT_SIZE));
-        LittleEndian.putShort(received, 1, testdata[ 1 ]);
-        assertTrue(ba_equivalent(received, expected, 1,
-                                 LittleEndian.SHORT_SIZE));
+        short  testdata[] = new short[2];
+
+        testdata[0] = ( short ) 0xFF01;
+        testdata[1] = 0x02FF;
+        LittleEndian.putShort(received, testdata[0]);
+        assertTrue(compareByteArrays(received, expected, 0, LittleEndian.SHORT_SIZE));
+        LittleEndian.putShort(received, 1, testdata[1]);
+        assertTrue(compareByteArrays(received, expected, 1, LittleEndian.SHORT_SIZE));
     }
 
     /**
      * test the putInt method
      */
-
-    public void testPutInt()
-    {
-        byte[] expected = new byte[ LittleEndian.INT_SIZE + 1 ];
-
-        expected[ 0 ] = 0x01;
-        expected[ 1 ] = ( byte ) 0xFF;
-        expected[ 2 ] = ( byte ) 0xFF;
-        expected[ 3 ] = ( byte ) 0xFF;
-        expected[ 4 ] = 0x02;
-        byte[] received   = new byte[ LittleEndian.INT_SIZE + 1 ];
-        int    testdata[] = new int[ 2 ];
-
-        testdata[ 0 ] = 0xFFFFFF01;
-        testdata[ 1 ] = 0x02FFFFFF;
-        LittleEndian.putInt(received, testdata[ 0 ]);
-        assertTrue(ba_equivalent(received, expected, 0,
-                                 LittleEndian.INT_SIZE));
-        LittleEndian.putInt(received, 1, testdata[ 1 ]);
-        assertTrue(ba_equivalent(received, expected, 1,
-                                 LittleEndian.INT_SIZE));
+    public void testPutInt() {
+        // writing 4 byte data to a 5 byte buffer
+        byte[] expected = {
+                (byte) 0x01,
+                (byte) 0xFF,
+                (byte) 0xFF,
+                (byte) 0xFF,
+                (byte) 0x02,
+        };
+        byte[] received = new byte[ LittleEndian.INT_SIZE + 1 ];
+
+        LittleEndian.putInt(received, 0xFFFFFF01);
+        assertTrue(compareByteArrays(received, expected, 0, LittleEndian.INT_SIZE));
+        LittleEndian.putInt(received, 1, 0x02FFFFFF);
+        assertTrue(compareByteArrays(received, expected, 1, LittleEndian.INT_SIZE));
     }
 
     /**
      * test the putDouble methods
      */
-
-    public void testPutDouble()
-    {
+    public void testPutDouble() {
         byte[] received = new byte[ LittleEndian.DOUBLE_SIZE + 1 ];
 
-        LittleEndian.putDouble(received, _doubles[ 0 ]);
-        assertTrue(ba_equivalent(received, _double_array, 0,
-                                 LittleEndian.DOUBLE_SIZE));
-        LittleEndian.putDouble(received, 1, _doubles[ 1 ]);
+        LittleEndian.putDouble(received, _doubles[0]);
+        assertTrue(compareByteArrays(received, _double_array, 0, LittleEndian.DOUBLE_SIZE));
+        LittleEndian.putDouble(received, 1, _doubles[1]);
         byte[] expected = new byte[ LittleEndian.DOUBLE_SIZE + 1 ];
 
         System.arraycopy(_double_array, LittleEndian.DOUBLE_SIZE, expected,
                          1, LittleEndian.DOUBLE_SIZE);
-        assertTrue(ba_equivalent(received, expected, 1,
-                                 LittleEndian.DOUBLE_SIZE));
+        assertTrue(compareByteArrays(received, expected, 1, LittleEndian.DOUBLE_SIZE));
     }
 
     /**
      * test the putLong method
      */
-
-    public void testPutLong()
-    {
-        byte[] expected = new byte[ LittleEndian.LONG_SIZE + 1 ];
-
-        expected[ 0 ] = 0x01;
-        expected[ 1 ] = ( byte ) 0xFF;
-        expected[ 2 ] = ( byte ) 0xFF;
-        expected[ 3 ] = ( byte ) 0xFF;
-        expected[ 4 ] = ( byte ) 0xFF;
-        expected[ 5 ] = ( byte ) 0xFF;
-        expected[ 6 ] = ( byte ) 0xFF;
-        expected[ 7 ] = ( byte ) 0xFF;
-        expected[ 8 ] = 0x02;
+    public void testPutLong() {
+        // writing 8 byte values to a 9 byte buffer
+        byte[] expected = {
+            (byte) 0x01,
+            (byte) 0xFF,
+            (byte) 0xFF,
+            (byte) 0xFF,
+            (byte) 0xFF,
+            (byte) 0xFF,
+            (byte) 0xFF,
+            (byte) 0xFF,
+            (byte) 0x02,
+        };
         byte[] received   = new byte[ LittleEndian.LONG_SIZE + 1 ];
-        long   testdata[] = new long[ 2 ];
-
-        testdata[ 0 ] = 0xFFFFFFFFFFFFFF01L;
-        testdata[ 1 ] = 0x02FFFFFFFFFFFFFFL;
-        LittleEndian.putLong(received, testdata[ 0 ]);
-        assertTrue(ba_equivalent(received, expected, 0,
-                                 LittleEndian.LONG_SIZE));
-        LittleEndian.putLong(received, 1, testdata[ 1 ]);
-        assertTrue(ba_equivalent(received, expected, 1,
-                                 LittleEndian.LONG_SIZE));
+
+        long testdata0 = 0xFFFFFFFFFFFFFF01L;
+        long testdata1 = 0x02FFFFFFFFFFFFFFL;
+        LittleEndian.putLong(received, testdata0);
+        assertTrue(compareByteArrays(received, expected, 0, LittleEndian.LONG_SIZE));
+        LittleEndian.putLong(received, 1, testdata1);
+        assertTrue(compareByteArrays(received, expected, 1, LittleEndian.LONG_SIZE));
     }
 
-    private static byte[] _good_array =
-    {
-        0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
-        0x02, 0x01, 0x02, 0x01, 0x02
+    private static byte[] _good_array = {
+        0x01, 0x02, 0x01, 0x02, 
+        0x01, 0x02, 0x01, 0x02, 
+        0x01, 0x02, 0x01, 0x02,
+        0x01, 0x02, 0x01, 0x02,
     };
-    private static byte[] _bad_array  =
-    {
+    private static byte[] _bad_array  = {
         0x01
     };
 
     /**
      * test the readShort method
      */
-
-    public void testReadShort()
-        throws IOException
-    {
+    public void testReadShort() throws IOException {
         short       expected_value = 0x0201;
         InputStream stream         = new ByteArrayInputStream(_good_array);
         int         count          = 0;
 
-        while (true)
-        {
+        while (stream.available() > 0) {
             short value = LittleEndian.readShort(stream);
-
-            if (value == 0)
-            {
-                break;
-            }
             assertEquals(value, expected_value);
             count++;
         }
         assertEquals(count,
                      _good_array.length / LittleEndianConsts.SHORT_SIZE);
         stream = new ByteArrayInputStream(_bad_array);
-        try
-        {
+        try {
             LittleEndian.readShort(stream);
             fail("Should have caught BufferUnderrunException");
-        }
-        catch (BufferUnderrunException ignored)
-        {
-
+        } catch (BufferUnderrunException ignored) {
             // as expected
         }
     }
@@ -336,34 +267,22 @@ public class TestLittleEndian
     /**
      * test the readInt method
      */
-
-    public void testReadInt()
-        throws IOException
-    {
+    public void testReadInt() throws IOException {
         int         expected_value = 0x02010201;
         InputStream stream         = new ByteArrayInputStream(_good_array);
         int         count          = 0;
 
-        while (true)
-        {
+        while (stream.available() > 0) {
             int value = LittleEndian.readInt(stream);
-
-            if (value == 0)
-            {
-                break;
-            }
             assertEquals(value, expected_value);
             count++;
         }
         assertEquals(count, _good_array.length / LittleEndianConsts.INT_SIZE);
         stream = new ByteArrayInputStream(_bad_array);
-        try
-        {
+        try {
             LittleEndian.readInt(stream);
             fail("Should have caught BufferUnderrunException");
-        }
-        catch (BufferUnderrunException ignored)
-        {
+        } catch (BufferUnderrunException ignored) {
 
             // as expected
         }
@@ -372,104 +291,60 @@ public class TestLittleEndian
     /**
      * test the readLong method
      */
-
-    public void testReadLong()
-        throws IOException
-    {
+    public void testReadLong() throws IOException {
         long        expected_value = 0x0201020102010201L;
         InputStream stream         = new ByteArrayInputStream(_good_array);
         int         count          = 0;
 
-        while (true)
-        {
+        while (stream.available() > 0) {
             long value = LittleEndian.readLong(stream);
-
-            if (value == 0)
-            {
-                break;
-            }
             assertEquals(value, expected_value);
             count++;
         }
         assertEquals(count,
                      _good_array.length / LittleEndianConsts.LONG_SIZE);
         stream = new ByteArrayInputStream(_bad_array);
-        try
-        {
+        try {
             LittleEndian.readLong(stream);
             fail("Should have caught BufferUnderrunException");
-        }
-        catch (BufferUnderrunException ignored)
-        {
-
+        } catch (BufferUnderrunException ignored) {
             // as expected
         }
     }
 
-    /**
-     * test the readFromStream method
-     */
-
-    public void testReadFromStream()
-        throws IOException
-    {
-        InputStream stream = new ByteArrayInputStream(_good_array);
-        byte[]      value  = LittleEndian.readFromStream(stream,
-                                 _good_array.length);
-
-        assertTrue(ba_equivalent(value, _good_array, 0, _good_array.length));
-        stream = new ByteArrayInputStream(_good_array);
-        try
-        {
-            value = LittleEndian.readFromStream(stream,
-                                                _good_array.length + 1);
-            fail("Should have caught BufferUnderrunException");
-        }
-        catch (BufferUnderrunException ignored)
-        {
-
-            // as expected
-        }
-    }
-
-    public void testUnsignedByteToInt()
-            throws Exception
-    {
+//    public void testReadFromStream() throws IOException {
+//        int actual;
+//        actual = LittleEndian.readUShort(new ByteArrayInputStream(new byte[] { 5, -128, }));
+//        assertEquals(32773, actual);
+//        
+//        actual = LittleEndian.readUShort(new ByteArrayInputStream(new byte[] { 1, 2, 3, 4, }));
+//        assertEquals(513, actual);
+//
+//        try {
+//            LittleEndian.readInt(new ByteArrayInputStream(new byte[] { 1, 2, 3, }));
+//            fail("Should have caught BufferUnderrunException");
+//        } catch (BufferUnderrunException ignored) {
+//            // as expected
+//        }
+//    }
+
+    public void testUnsignedByteToInt() {
         assertEquals(255, LittleEndian.ubyteToInt((byte)255));
     }
 
-    private boolean ba_equivalent(byte [] received, byte [] expected,
-                                  int offset, int size)
-    {
-        boolean result = true;
+    private static boolean compareByteArrays(byte [] received, byte [] expected,
+                                  int offset, int size) {
 
-        for (int j = offset; j < offset + size; j++)
-        {
-            if (received[ j ] != expected[ j ])
-            {
+        for (int j = offset; j < offset + size; j++) {
+            if (received[j] != expected[j]) {
                 System.out.println("difference at index " + j);
-                result = false;
-                break;
+                return false;
             }
         }
-        return result;
+        return true;
     }
 
-    public void testUnsignedShort()
-            throws Exception
-    {
+    public void testUnsignedShort() {
         assertEquals(0xffff, LittleEndian.getUShort(new byte[] { (byte)0xff, (byte)0xff }, 0));
     }
-
-    /**
-     * main method to run the unit tests
-     *
-     * @param ignored_args
-     */
-
-    public static void main(String [] ignored_args)
-    {
-        System.out.println("Testing util.LittleEndian functionality");
-        junit.textui.TestRunner.run(TestLittleEndian.class);
-    }
 }
index 05ba965f9644fe0fcaa519fc613e162fa718ef7b..a37e88ed3b7fd36f5ef12d5b6c0799c15d35b4db 100644 (file)
@@ -1,4 +1,3 @@
-
 /* ====================================================================
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
@@ -15,7 +14,6 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 ==================================================================== */
-        
 
 package org.apache.poi.util;
 
@@ -28,31 +26,13 @@ import java.io.*;
  *
  * @author  Marc Johnson (mjohnson at apache dot org)
  */
-
-public class TestLongField
-    extends TestCase
-{
-
-    /**
-     * Constructor
-     *
-     * @param name
-     */
-
-    public TestLongField(String name)
-    {
-        super(name);
-    }
+public final class TestLongField extends TestCase {
 
     static private final long[] _test_array =
     {
         Long.MIN_VALUE, -1L, 0L, 1L, Long.MAX_VALUE
     };
 
-    /**
-     * Test constructors.
-     */
-
     public void testConstructors()
     {
         try
@@ -121,10 +101,6 @@ public class TestLongField
         }
     }
 
-    /**
-     * Test set() methods
-     */
-
     public void testSet()
     {
         LongField field = new LongField(0);
@@ -163,10 +139,6 @@ public class TestLongField
         }
     }
 
-    /**
-     * Test readFromBytes
-     */
-
     public void testReadFromBytes()
     {
         LongField field = new LongField(1);
@@ -198,12 +170,6 @@ public class TestLongField
         }
     }
 
-    /**
-     * Test readFromStream
-     *
-     * @exception IOException
-     */
-
     public void testReadFromStream()
         throws IOException
     {
@@ -212,8 +178,8 @@ public class TestLongField
 
         for (int j = 0; j < _test_array.length; j++)
         {
-            buffer[ (j * 8) + 0 ] = ( byte ) (_test_array[ j ] % 256);
-            buffer[ (j * 8) + 1 ] = ( byte ) ((_test_array[ j ] >> 8) % 256);
+            buffer[ (j * 8) + 0 ] = ( byte ) ((_test_array[ j ] >>  0) % 256);
+            buffer[ (j * 8) + 1 ] = ( byte ) ((_test_array[ j ] >>  8) % 256);
             buffer[ (j * 8) + 2 ] = ( byte ) ((_test_array[ j ] >> 16) % 256);
             buffer[ (j * 8) + 3 ] = ( byte ) ((_test_array[ j ] >> 24) % 256);
             buffer[ (j * 8) + 4 ] = ( byte ) ((_test_array[ j ] >> 32) % 256);
@@ -230,10 +196,6 @@ public class TestLongField
         }
     }
 
-    /**
-     * test writeToBytes
-     */
-
     public void testWriteToBytes()
     {
         LongField field = new LongField(0);
@@ -256,16 +218,4 @@ public class TestLongField
             assertEquals("testing ", _test_array[ j ], val);
         }
     }
-
-    /**
-     * Main
-     *
-     * @param args
-     */
-
-    public static void main(String [] args)
-    {
-        System.out.println("Testing util.LongField functionality");
-        junit.textui.TestRunner.run(TestLongField.class);
-    }
 }