]> source.dussan.org Git - poi.git/commitdiff
findbugs fixes - RR_NOT_CHECKED
authorAndreas Beeker <kiwiwings@apache.org>
Mon, 21 Mar 2016 23:29:06 +0000 (23:29 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Mon, 21 Mar 2016 23:29:06 +0000 (23:29 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1736112 13f79535-47bb-0310-9956-ffa450edef68

13 files changed:
src/java/org/apache/poi/poifs/dev/POIFSDump.java
src/java/org/apache/poi/util/IOUtils.java
src/scratchpad/src/org/apache/poi/hdgf/HDGFDiagram.java
src/scratchpad/src/org/apache/poi/hpbf/dev/HPBFDumper.java
src/scratchpad/src/org/apache/poi/hpbf/model/HPBFPart.java
src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowDumper.java
src/scratchpad/src/org/apache/poi/hslf/extractor/QuickButCruddyTextExtractor.java
src/scratchpad/src/org/apache/poi/hwmf/record/HwmfBitmap16.java
src/scratchpad/src/org/apache/poi/hwmf/record/HwmfBitmapDib.java
src/scratchpad/src/org/apache/poi/hwmf/record/HwmfEscape.java
src/scratchpad/src/org/apache/poi/hwmf/record/HwmfPlaceableHeader.java
src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java
src/scratchpad/src/org/apache/poi/hwpf/HWPFDocumentCore.java

index 0dfd4a290ff1449f6f1284eed128ac523c448efd..f8c00365ac7b554c7db61b19a5cf98dffa126ccb 100644 (file)
@@ -33,12 +33,13 @@ import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.poi.poifs.filesystem.NPOIFSStream;
 import org.apache.poi.poifs.property.NPropertyTable;
 import org.apache.poi.poifs.storage.HeaderBlock;
+import org.apache.poi.util.IOUtils;
 
 /**
  * Dump internal structure of a OLE2 file into file system
  */
 public class POIFSDump {
-    public static void main(String[] args) throws Exception {
+    public static void main(String[] args) throws IOException {
         if (args.length == 0) {
             System.err.println("Must specify at least one file to dump");
             System.exit(1);
@@ -84,6 +85,8 @@ public class POIFSDump {
                     dump(fs, startBlock, "mini-stream", file);
                 }
             }
+            
+            fs.close();
         }
     }
     
@@ -93,8 +96,7 @@ public class POIFSDump {
             if(entry instanceof DocumentNode){
                 DocumentNode node = (DocumentNode)entry;
                 DocumentInputStream is = new DocumentInputStream(node);
-                byte[] bytes = new byte[node.getSize()];
-                is.read(bytes);
+                byte[] bytes = IOUtils.toByteArray(is);
                 is.close();
 
                 OutputStream out = new FileOutputStream(new File(parent, node.getName().trim()));
index cee48561d3f3a15918070e8599000a8714123af6..eef58b30c4798091419844e47010e2306af00562 100644 (file)
@@ -69,20 +69,33 @@ public final class IOUtils {
      * Reads all the data from the input stream, and returns the bytes read.
      */
     public static byte[] toByteArray(InputStream stream) throws IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        return toByteArray(stream, Integer.MAX_VALUE);
+    }
+
+    /**
+     * Reads up to {@code length} bytes from the input stream, and returns the bytes read.
+     */
+    public static byte[] toByteArray(InputStream stream, int length) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream(length == Integer.MAX_VALUE ? 4096 : length);
 
         byte[] buffer = new byte[4096];
-        int read = 0;
-        while (read != -1) {
-            read = stream.read(buffer);
-            if (read > 0) {
-                baos.write(buffer, 0, read);
+        int totalBytes = 0, readBytes = 0; 
+        do {
+            readBytes = stream.read(buffer, 0, Math.min(buffer.length, length-totalBytes)); 
+            totalBytes += Math.max(readBytes,0);
+            if (readBytes > 0) {
+                baos.write(buffer, 0, readBytes);
             }
-        }
+        } while (totalBytes < length && readBytes > -1);
 
+        if (length != Integer.MAX_VALUE && totalBytes < length) {
+            throw new IOException("unexpected EOF");
+        }
+        
         return baos.toByteArray();
     }
 
+    
     /**
      * Returns an array (that shouldn't be written to!) of the
      *  ByteBuffer. Will be of the requested length, or possibly
index 405bf69c4bb027603603ea14dffc92fe3e631a1d..687bdb3131dc28532f9f79a1f96572bc0876a918 100644 (file)
@@ -19,6 +19,7 @@ package org.apache.poi.hdgf;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
 
 import org.apache.poi.POIDocument;
@@ -30,9 +31,9 @@ import org.apache.poi.hdgf.streams.Stream;
 import org.apache.poi.hdgf.streams.StringsStream;
 import org.apache.poi.hdgf.streams.TrailerStream;
 import org.apache.poi.poifs.filesystem.DirectoryNode;
-import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.LocaleUtil;
 
@@ -73,12 +74,10 @@ public final class HDGFDiagram extends POIDocument {
        public HDGFDiagram(DirectoryNode dir) throws IOException {
                super(dir);
 
-               DocumentEntry docProps =
-                       (DocumentEntry)dir.getEntry("VisioDocument");
-
                // Grab the document stream
-               _docstream = new byte[docProps.getSize()];
-               dir.createDocumentInputStream("VisioDocument").read(_docstream);
+               InputStream is = dir.createDocumentInputStream("VisioDocument");
+               _docstream = IOUtils.toByteArray(is);
+               is.close();
 
                // Check it's really visio
                String typeString = new String(_docstream, 0, 20, LocaleUtil.CHARSET_1252 );
index 7786950374ffa19b2588633991876aebdeed3b7d..48ad50973f19af063a2dab40cfc7bbc202c9397b 100644 (file)
@@ -24,8 +24,8 @@ import java.io.InputStream;
 import org.apache.poi.ddf.DefaultEscherRecordFactory;
 import org.apache.poi.ddf.EscherRecord;
 import org.apache.poi.poifs.filesystem.DirectoryNode;
-import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
+import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.LocaleUtil;
 import org.apache.poi.util.StringUtil;
@@ -47,12 +47,10 @@ public final class HPBFDumper {
        }
 
        private static byte[] getData(DirectoryNode dir, String name) throws IOException {
-               DocumentEntry docProps =
-                       (DocumentEntry)dir.getEntry(name);
-
                // Grab the document stream
-               byte[] d = new byte[docProps.getSize()];
-               dir.createDocumentInputStream(name).read(d);
+               InputStream is = dir.createDocumentInputStream(name);
+               byte[] d = IOUtils.toByteArray(is);
+               is.close();
 
                // All done
                return d;
index bd727e1b37cfdc058180f2074e6e0f7683398117..4379f4a81f24a3d1a232a69a9cd2a799eb238a71 100644 (file)
@@ -20,9 +20,10 @@ package org.apache.poi.hpbf.model;
 import java.io.ByteArrayInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.InputStream;
 
 import org.apache.poi.poifs.filesystem.DirectoryNode;
-import org.apache.poi.poifs.filesystem.DocumentEntry;
+import org.apache.poi.util.IOUtils;
 
 /**
  * Parent class of all HPBF sub-parts, handling
@@ -39,17 +40,14 @@ public abstract class HPBFPart {
                DirectoryNode dir = getDir(path, baseDir);
                String name = path[path.length-1];
 
-               DocumentEntry docProps;
-               try {
-                       docProps = (DocumentEntry)dir.getEntry(name);
-               } catch (FileNotFoundException e) {
-                       throw new IllegalArgumentException("File invalid - failed to find document entry '"
-                                       + name + "'");
+               if (!dir.hasEntry(name)) {
+            throw new IllegalArgumentException("File invalid - failed to find document entry '" + name + "'");
                }
 
                // Grab the data from the part stream
-               data = new byte[docProps.getSize()];
-               dir.createDocumentInputStream(name).read(data);
+               InputStream is = dir.createDocumentInputStream(name);
+               data = IOUtils.toByteArray(is);
+               is.close();
        }
        private DirectoryNode getDir(String[] path, DirectoryNode baseDir) {
                DirectoryNode dir = baseDir;
index df2d38bdc45b19f072899bf8c26b105757cbf643..0cfaa3fc1e11fc96c484347abd4985bc8ee5233c 100644 (file)
@@ -19,6 +19,7 @@ package org.apache.poi.hslf.dev;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.PrintStream;
 import java.util.Locale;
 
@@ -28,9 +29,9 @@ import org.apache.poi.ddf.EscherRecord;
 import org.apache.poi.ddf.EscherTextboxRecord;
 import org.apache.poi.hslf.record.HSLFEscherRecordFactory;
 import org.apache.poi.hslf.record.RecordTypes;
-import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.poi.util.HexDump;
+import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -94,13 +95,10 @@ public final class SlideShowDumper {
    * @throws IOException if there is a problem while parsing the document.
    */
   public SlideShowDumper(NPOIFSFileSystem filesystem, PrintStream out) throws IOException {
-       // Get the main document stream
-       DocumentEntry docProps =
-               (DocumentEntry)filesystem.getRoot().getEntry("PowerPoint Document");
-
        // Grab the document stream
-       docstream = new byte[docProps.getSize()];
-       filesystem.createDocumentInputStream("PowerPoint Document").read(docstream);
+       InputStream is = filesystem.createDocumentInputStream("PowerPoint Document");
+       docstream = IOUtils.toByteArray(is);
+       is.close();
        this.out = out;
   }
 
index 8396ae1234b00d397c0ca88e3aeb54d00d3425c0..1ecc49a94a3df11d5f78f997122714f53d90320d 100644 (file)
 
 package org.apache.poi.hslf.extractor;
 
-import java.io.*;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.poi.hslf.record.*;
+import org.apache.poi.hslf.record.CString;
+import org.apache.poi.hslf.record.Record;
+import org.apache.poi.hslf.record.RecordTypes;
+import org.apache.poi.hslf.record.TextBytesAtom;
+import org.apache.poi.hslf.record.TextCharsAtom;
 import org.apache.poi.hslf.usermodel.HSLFTextParagraph;
-import org.apache.poi.hslf.usermodel.HSLFTextShape;
-import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
+import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -77,7 +79,8 @@ public final class QuickButCruddyTextExtractor {
         * Creates an extractor from a given file name
         * @param fileName
         */
-       public QuickButCruddyTextExtractor(String fileName) throws IOException {
+       @SuppressWarnings("resource")
+    public QuickButCruddyTextExtractor(String fileName) throws IOException {
                this(new NPOIFSFileSystem(new File(fileName)));
        }
 
@@ -85,6 +88,7 @@ public final class QuickButCruddyTextExtractor {
         * Creates an extractor from a given input stream
         * @param iStream
         */
+    @SuppressWarnings("resource")
        public QuickButCruddyTextExtractor(InputStream iStream) throws IOException {
                this(new NPOIFSFileSystem(iStream));
                is = iStream;
@@ -98,10 +102,9 @@ public final class QuickButCruddyTextExtractor {
                fs = poifs;
 
                // Find the PowerPoint bit, and get out the bytes
-               DocumentEntry docProps =
-                       (DocumentEntry)fs.getRoot().getEntry("PowerPoint Document");
-               pptContents = new byte[docProps.getSize()];
-               fs.createDocumentInputStream("PowerPoint Document").read(pptContents);
+               InputStream pptIs = fs.createDocumentInputStream("PowerPoint Document");
+               pptContents = IOUtils.toByteArray(pptIs);
+               pptIs.close();
        }
 
 
index 2ff0d118a8d7740bf512f04b0020674eb8d729e7..4439b784dd6a5c2a79353ab6ef58d26d8e1f954d 100644 (file)
@@ -20,6 +20,7 @@ package org.apache.poi.hwmf.record;
 import java.awt.image.BufferedImage;\r
 import java.io.IOException;\r
 \r
+import org.apache.poi.util.IOUtils;\r
 import org.apache.poi.util.LittleEndianConsts;\r
 import org.apache.poi.util.LittleEndianInputStream;\r
 \r
@@ -72,9 +73,9 @@ public class HwmfBitmap16 {
             size += 18+LittleEndianConsts.INT_SIZE;\r
         }\r
 \r
-        int bytes = (((width * bitsPixel + 15) >> 4) << 1) * height;\r
-        byte buf[] = new byte[bytes];\r
-        leis.read(buf);\r
+        int length = (((width * bitsPixel + 15) >> 4) << 1) * height;\r
+        @SuppressWarnings("unused")\r
+        byte buf[] = IOUtils.toByteArray(leis, length);\r
         \r
         // TODO: this is not implemented ... please provide a sample, if it\r
         // ever happens to you, to come here ...\r
index ae7f5cb30797fa703d37dd70e792a5d08b92c439..ba935f39f16597e9e357b10a700aee0a865edacf 100644 (file)
@@ -26,12 +26,13 @@ import java.io.InputStream;
 \r
 import javax.imageio.ImageIO;\r
 \r
-import org.apache.poi.hssf.record.RecordFormatException;\r
+import org.apache.poi.util.IOUtils;\r
 import org.apache.poi.util.LittleEndian;\r
 import org.apache.poi.util.LittleEndianConsts;\r
 import org.apache.poi.util.LittleEndianInputStream;\r
 import org.apache.poi.util.POILogFactory;\r
 import org.apache.poi.util.POILogger;\r
+import org.apache.poi.util.RecordFormatException;\r
 \r
 /**\r
  * The DeviceIndependentBitmap Object defines an image in device-independent bitmap (DIB) format.\r
@@ -224,9 +225,8 @@ public class HwmfBitmapDib {
 \r
         int fileSize = (headerImageSize < headerSize) ? recordSize : (int)Math.min(introSize+headerImageSize,recordSize);\r
         \r
-        imageData = new byte[fileSize];\r
         leis.reset();\r
-        leis.read(imageData, 0, fileSize);\r
+        imageData = IOUtils.toByteArray(leis, fileSize);\r
         \r
         assert( headerSize != 0x0C || ((((headerWidth * headerPlanes * headerBitCount.flag + 31) & ~31) / 8) * Math.abs(headerHeight)) == headerImageSize);\r
 \r
index b005abc8c0baac4fe74f1e51d641652f7165890f..c1714674a181c9f3ae34b122127ae6eff3e26db1 100644 (file)
@@ -21,6 +21,7 @@ import java.io.IOException;
 \r
 import org.apache.poi.hwmf.draw.HwmfGraphics;\r
 import org.apache.poi.util.HexDump;\r
+import org.apache.poi.util.IOUtils;\r
 import org.apache.poi.util.LittleEndianConsts;\r
 import org.apache.poi.util.LittleEndianInputStream;\r
 \r
@@ -192,8 +193,8 @@ public class HwmfEscape implements HwmfRecord {
     public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {\r
         escapeFunction = EscapeFunction.valueOf(leis.readUShort());\r
         byteCount = leis.readUShort();\r
-        escapeData = new byte[byteCount];\r
-        leis.read(escapeData);\r
+        escapeData = IOUtils.toByteArray(leis,byteCount);\r
+\r
         return 2*LittleEndianConsts.SHORT_SIZE+byteCount;\r
     }\r
 \r
index 8d65ba002fe90c43090c6b6f3ea7a74c06487f5a..2ca0cea15120fe8e7a7c65a20ebe1e475f4f3491 100644 (file)
@@ -45,7 +45,7 @@ public class HwmfPlaceableHeader {
         int y1 = leis.readShort();\r
         int x2 = leis.readShort();\r
         int y2 = leis.readShort();\r
-        bounds = new Rectangle2D.Double(x1, y1, x2-x1, y2-y1);\r
+        bounds = new Rectangle2D.Double(Math.min(x1,x2), Math.min(y1,y2), Math.abs(x2-x1), Math.abs(y2-y1));\r
         \r
         /*\r
          * Inch (2 bytes):  The number of logical units per inch used to represent the image.\r
index 19f7b841857c1299bb899642997a757e832eac5f..8bc5ba6f7888a75c537617e20f1d68a35f40bf12 100644 (file)
@@ -18,7 +18,6 @@
 package org.apache.poi.hwpf;
 
 import java.io.ByteArrayInputStream;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -69,6 +68,7 @@ import org.apache.poi.poifs.filesystem.Entry;
 import org.apache.poi.poifs.filesystem.EntryUtils;
 import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.Internal;
 
 /**
@@ -230,17 +230,14 @@ public final class HWPFDocument extends HWPFDocumentCore
     }
 
     // Grab the table stream.
-    DocumentEntry tableProps;
-    try {
-        tableProps =
-            (DocumentEntry)directory.getEntry(name);
-    } catch(FileNotFoundException fnfe) {
+    if (!directory.hasEntry(name)) {
         throw new IllegalStateException("Table Stream '" + name + "' wasn't found - Either the document is corrupt, or is Word95 (or earlier)");
     }
 
     // read in the table stream.
-    _tableStream = new byte[tableProps.getSize()];
-    directory.createDocumentInputStream(name).read(_tableStream);
+    InputStream is = directory.createDocumentInputStream(name);
+    _tableStream = IOUtils.toByteArray(is);
+    is.close();
 
     _fib.fillVariableFields(_mainStream, _tableStream);
 
index 74c73d75243fcefd9d5d991c53e1df406517e5a1..12153e6abd2133bc7858d673cf0b13c3921ea923 100644 (file)
@@ -38,6 +38,7 @@ import org.apache.poi.poifs.filesystem.DirectoryEntry;
 import org.apache.poi.poifs.filesystem.DirectoryNode;
 import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.Internal;
 
 
@@ -85,14 +86,13 @@ public abstract class HWPFDocumentCore extends POIDocument
   }
 
   /**
-   * Takens an InputStream, verifies that it's not RTF or PDF, builds a
+   * Takes an InputStream, verifies that it's not RTF or PDF, builds a
    *  POIFSFileSystem from it, and returns that.
    */
   public static POIFSFileSystem verifyAndBuildPOIFS(InputStream istream) throws IOException {
        // Open a PushbackInputStream, so we can peek at the first few bytes
        PushbackInputStream pis = new PushbackInputStream(istream,6);
-       byte[] first6 = new byte[6];
-       pis.read(first6);
+       byte[] first6 = IOUtils.toByteArray(pis, 6);
 
        // Does it start with {\rtf ? If so, it's really RTF
        if(first6[0] == '{' && first6[1] == '\\' && first6[2] == 'r'