Author: fanningpj
Date: Sat Feb 19 12:08:48 2022
New Revision: 1898213

URL: http://svn.apache.org/viewvc?rev=1898213&view=rev
Log:
refactor some stream code

Modified:
    
poi/trunk/poi-integration/src/test/java/org/apache/poi/stress/XSSFBFileHandler.java
    
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java
    
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/ooxml/TestPOIXMLProperties.java
    
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/poifs/crypt/dsig/DummyKeystore.java
    
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/extractor/ole2/OLE2ScratchpadExtractorFactory.java
    
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hdgf/streams/CompressedStreamStore.java
    
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/draw/HemfImageRenderer.java
    
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusBrush.java
    
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusImage.java
    
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hmef/attribute/MAPIAttribute.java
    
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hmef/attribute/MAPIRtfAttribute.java
    
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/usermodel/Picture.java
    poi/trunk/poi/src/test/java/org/apache/poi/poifs/storage/RawDataUtil.java
    
poi/trunk/poi/src/test/java/org/apache/poi/ss/util/NumberRenderingSpreadsheetGenerator.java

Modified: 
poi/trunk/poi-integration/src/test/java/org/apache/poi/stress/XSSFBFileHandler.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-integration/src/test/java/org/apache/poi/stress/XSSFBFileHandler.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- 
poi/trunk/poi-integration/src/test/java/org/apache/poi/stress/XSSFBFileHandler.java
 (original)
+++ 
poi/trunk/poi-integration/src/test/java/org/apache/poi/stress/XSSFBFileHandler.java
 Sat Feb 19 12:08:48 2022
@@ -16,12 +16,12 @@
 ==================================================================== */
 package org.apache.poi.stress;
 
-import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.openxml4j.opc.PackageAccess;
 import org.apache.poi.util.IOUtils;
@@ -41,11 +41,11 @@ public class XSSFBFileHandler extends Ab
     public void handleFile(InputStream stream, String path) throws Exception {
         byte[] bytes = IOUtils.toByteArray(stream);
 
-        try (OPCPackage opcPackage = OPCPackage.open(new 
ByteArrayInputStream(bytes))) {
+        try (OPCPackage opcPackage = OPCPackage.open(new 
UnsynchronizedByteArrayInputStream(bytes))) {
             testOne(opcPackage);
         }
 
-        testNotHandledByWorkbookException(OPCPackage.open(new 
ByteArrayInputStream(bytes)));
+        testNotHandledByWorkbookException(OPCPackage.open(new 
UnsynchronizedByteArrayInputStream(bytes)));
     }
 
     private void testNotHandledByWorkbookException(OPCPackage pkg) throws 
IOException {

Modified: 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java
 (original)
+++ 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java
 Sat Feb 19 12:08:48 2022
@@ -17,7 +17,6 @@
 
 package org.apache.poi.xssf.usermodel;
 
-import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.EnumMap;
@@ -29,6 +28,7 @@ import javax.xml.transform.TransformerEx
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
+import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.commons.io.output.StringBuilderWriter;
 import org.apache.poi.ooxml.util.DocumentHelper;
 import org.apache.poi.ss.usermodel.DifferentialStyleProvider;
@@ -407,7 +407,10 @@ public enum XSSFBuiltinTableStyle {
                 // hack because I can't figure out how to get XMLBeans to 
parse a sub-element in a standalone manner
                 // - build a fake styles.xml file with just this built-in
                 StylesTable styles = new StylesTable();
-                styles.readFrom(new ByteArrayInputStream(styleXML(dxfsNode, 
tableStyleNode).getBytes(StandardCharsets.UTF_8)));
+                try (UnsynchronizedByteArrayInputStream bis = new 
UnsynchronizedByteArrayInputStream(
+                        styleXML(dxfsNode, 
tableStyleNode).getBytes(StandardCharsets.UTF_8))) {
+                    styles.readFrom(bis);
+                }
                 styleMap.put(builtIn, new XSSFBuiltinTypeStyleStyle(builtIn, 
styles.getExplicitTableStyle(styleName)));
             }
         } catch (Exception e) {

Modified: 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/ooxml/TestPOIXMLProperties.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/ooxml/TestPOIXMLProperties.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/ooxml/TestPOIXMLProperties.java
 (original)
+++ 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/ooxml/TestPOIXMLProperties.java
 Sat Feb 19 12:08:48 2022
@@ -26,7 +26,6 @@ import static org.junit.jupiter.api.Asse
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.time.ZoneId;
 import java.time.ZoneOffset;
 import java.util.Calendar;
 import java.util.Date;

Modified: 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/poifs/crypt/dsig/DummyKeystore.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/poifs/crypt/dsig/DummyKeystore.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/poifs/crypt/dsig/DummyKeystore.java
 (original)
+++ 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/poifs/crypt/dsig/DummyKeystore.java
 Sat Feb 19 12:08:48 2022
@@ -24,7 +24,6 @@
 package org.apache.poi.poifs.crypt.dsig;
 
 import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -53,6 +52,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.poi.poifs.crypt.CryptoFunctions;
 import org.apache.poi.poifs.storage.RawDataUtil;
 import org.apache.poi.util.LocaleUtil;
@@ -139,7 +139,7 @@ public class DummyKeystore {
     public DummyKeystore(String pfxInput, String storePass) throws 
GeneralSecurityException, IOException {
         CryptoFunctions.registerBouncyCastle();
         keystore = KeyStore.getInstance("PKCS12");
-        try (InputStream fis = new 
ByteArrayInputStream(RawDataUtil.decompress(pfxInput))) {
+        try (InputStream fis = new 
UnsynchronizedByteArrayInputStream(RawDataUtil.decompress(pfxInput))) {
             keystore.load(fis, storePass.toCharArray());
         }
     }

Modified: 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/extractor/ole2/OLE2ScratchpadExtractorFactory.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/extractor/ole2/OLE2ScratchpadExtractorFactory.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/extractor/ole2/OLE2ScratchpadExtractorFactory.java
 (original)
+++ 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/extractor/ole2/OLE2ScratchpadExtractorFactory.java
 Sat Feb 19 12:08:48 2022
@@ -16,7 +16,6 @@
 ==================================================================== */
 package org.apache.poi.extractor.ole2;
 
-import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
@@ -24,6 +23,7 @@ import java.io.InputStream;
 import java.util.List;
 import java.util.stream.StreamSupport;
 
+import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.poi.extractor.ExtractorFactory;
@@ -185,7 +185,7 @@ public class OLE2ScratchpadExtractorFact
             for (AttachmentChunks attachment : msg.getAttachmentFiles()) {
                 if (attachment.getAttachData() != null) {
                     byte[] data = attachment.getAttachData().getValue();
-                    nonPOIFS.add( new ByteArrayInputStream(data) );
+                    nonPOIFS.add( new UnsynchronizedByteArrayInputStream(data) 
);
                 } else if (attachment.getAttachmentDirectory() != null) {
                     
dirs.add(attachment.getAttachmentDirectory().getDirectory());
                 }

Modified: 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hdgf/streams/CompressedStreamStore.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hdgf/streams/CompressedStreamStore.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hdgf/streams/CompressedStreamStore.java
 (original)
+++ 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hdgf/streams/CompressedStreamStore.java
 Sat Feb 19 12:08:48 2022
@@ -17,9 +17,9 @@
 
 package org.apache.poi.hdgf.streams;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 
+import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.poi.hdgf.HDGFLZW;
 import org.apache.poi.util.IOUtils;
 
@@ -92,25 +92,26 @@ public final class CompressedStreamStore
      * Decompresses the given data, returning it as header + contents
      */
     public static byte[][] decompress(byte[] data, int offset, int length) 
throws IOException {
-        ByteArrayInputStream bais = new ByteArrayInputStream(data, offset, 
length);
+        try (UnsynchronizedByteArrayInputStream bais = new 
UnsynchronizedByteArrayInputStream(data, offset, length)) {
+            // Decompress
+            HDGFLZW lzw = new HDGFLZW();
+            byte[] decompressed = lzw.decompress(bais);
+
+            if (decompressed.length < 4) {
+                throw new IllegalArgumentException("Could not read enough data 
to decompress: " + decompressed.length);
+            }
+
+            // Split into header and contents
+            byte[][] ret = new byte[2][];
+            ret[0] = new byte[4];
+            ret[1] = new byte[decompressed.length - 4];
 
-        // Decompress
-        HDGFLZW lzw = new HDGFLZW();
-        byte[] decompressed = lzw.decompress(bais);
+            System.arraycopy(decompressed, 0, ret[0], 0, 4);
+            System.arraycopy(decompressed, 4, ret[1], 0, ret[1].length);
 
-        if (decompressed.length < 4) {
-            throw new IllegalArgumentException("Could not read enough data to 
decompress: " + decompressed.length);
+            // All done
+            return ret;
         }
 
-        // Split into header and contents
-        byte[][] ret = new byte[2][];
-        ret[0] = new byte[4];
-        ret[1] = new byte[decompressed.length - 4];
-
-        System.arraycopy(decompressed, 0, ret[0], 0, 4);
-        System.arraycopy(decompressed, 4, ret[1], 0, ret[1].length);
-
-        // All done
-        return ret;
     }
 }

Modified: 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/draw/HemfImageRenderer.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/draw/HemfImageRenderer.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/draw/HemfImageRenderer.java
 (original)
+++ 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/draw/HemfImageRenderer.java
 Sat Feb 19 12:08:48 2022
@@ -25,11 +25,11 @@ import java.awt.RenderingHints;
 import java.awt.geom.Dimension2D;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.Charset;
 
+import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.poi.common.usermodel.GenericRecord;
 import org.apache.poi.hemf.usermodel.HemfPicture;
 import org.apache.poi.hwmf.draw.HwmfGraphicsState;
@@ -65,7 +65,7 @@ public class HemfImageRenderer implement
         if (!PictureData.PictureType.EMF.contentType.equals(contentType)) {
             throw new IOException("Invalid picture type");
         }
-        image = new HemfPicture(new ByteArrayInputStream(data));
+        image = new HemfPicture(new UnsynchronizedByteArrayInputStream(data));
     }
 
     @Override

Modified: 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusBrush.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusBrush.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusBrush.java
 (original)
+++ 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusBrush.java
 Sat Feb 19 12:08:48 2022
@@ -26,7 +26,6 @@ import java.awt.Color;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.util.AbstractMap;
 import java.util.Arrays;
@@ -40,6 +39,7 @@ import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
+import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.poi.common.usermodel.GenericRecord;
 import org.apache.poi.hemf.draw.HemfDrawProperties;
@@ -391,7 +391,7 @@ public class HemfPlusBrush {
             EmfPlusBrushData brushData = brushType.constructor.get();
             byte[] buf = getRawData(continuedObjectData);
             try {
-                brushData.init(new LittleEndianInputStream(new 
ByteArrayInputStream(buf)), buf.length);
+                brushData.init(new LittleEndianInputStream(new 
UnsynchronizedByteArrayInputStream(buf)), buf.length);
             } catch (IOException e) {
                 throw new RuntimeException(e);
             }

Modified: 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusImage.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusImage.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusImage.java
 (original)
+++ 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusImage.java
 Sat Feb 19 12:08:48 2022
@@ -22,7 +22,6 @@ import static org.apache.poi.hemf.record
 import java.awt.Color;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.LinkedHashMap;
@@ -32,6 +31,7 @@ import java.util.function.Supplier;
 
 import javax.imageio.ImageIO;
 
+import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.poi.hemf.draw.HemfDrawProperties;
 import org.apache.poi.hemf.draw.HemfGraphics;
@@ -419,21 +419,24 @@ public class HemfPlusImage {
                         if (getBitmapType() == EmfPlusBitmapDataType.PIXEL) {
                             return new Rectangle2D.Double(0, 0, bitmapWidth, 
bitmapHeight);
                         } else {
-                            BufferedImage bi = ImageIO.read(new 
ByteArrayInputStream(getRawData(continuedObjectData)));
-                            return new Rectangle2D.Double(bi.getMinX(), 
bi.getMinY(), bi.getWidth(), bi.getHeight());
+                            try(UnsynchronizedByteArrayInputStream is = new 
UnsynchronizedByteArrayInputStream(getRawData(continuedObjectData))) {
+                                BufferedImage bi = ImageIO.read(is);
+                                return new Rectangle2D.Double(bi.getMinX(), 
bi.getMinY(), bi.getWidth(), bi.getHeight());
+                            }
                         }
                     case METAFILE:
-                        ByteArrayInputStream bis = new 
ByteArrayInputStream(getRawData(continuedObjectData));
-                        switch (getMetafileType()) {
-                            case Wmf:
-                            case WmfPlaceable:
-                                HwmfPicture wmf = new HwmfPicture(bis);
-                                return wmf.getBounds();
-                            case Emf:
-                            case EmfPlusDual:
-                            case EmfPlusOnly:
-                                HemfPicture emf = new HemfPicture(bis);
-                                return emf.getBounds();
+                        try(UnsynchronizedByteArrayInputStream bis = new 
UnsynchronizedByteArrayInputStream(getRawData(continuedObjectData))) {
+                            switch (getMetafileType()) {
+                                case Wmf:
+                                case WmfPlaceable:
+                                    HwmfPicture wmf = new HwmfPicture(bis);
+                                    return wmf.getBounds();
+                                case Emf:
+                                case EmfPlusDual:
+                                case EmfPlusOnly:
+                                    HemfPicture emf = new HemfPicture(bis);
+                                    return emf.getBounds();
+                            }
                         }
                         break;
                     default:

Modified: 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hmef/attribute/MAPIAttribute.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hmef/attribute/MAPIAttribute.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hmef/attribute/MAPIAttribute.java
 (original)
+++ 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hmef/attribute/MAPIAttribute.java
 Sat Feb 19 12:08:48 2022
@@ -17,13 +17,13 @@
 
 package org.apache.poi.hmef.attribute;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.poi.hmef.Attachment;
 import org.apache.poi.hmef.HMEFMessage;
 import org.apache.poi.hsmf.datatypes.MAPIProperty;
@@ -115,107 +115,108 @@ public class MAPIAttribute {
                "instead received a " + parent.getProperty() + " one"
          );
       }
-      ByteArrayInputStream inp = new ByteArrayInputStream(parent.getData());
+      try(UnsynchronizedByteArrayInputStream inp = new 
UnsynchronizedByteArrayInputStream(parent.getData())) {
+         // First up, get the number of attributes
+         int count = LittleEndian.readInt(inp);
+         List<MAPIAttribute> attrs = new ArrayList<>();
+
+         // Now, read each one in in turn
+         for(int i=0; i<count; i++) {
+            int typeAndMV = LittleEndian.readUShort(inp);
+            int id = LittleEndian.readUShort(inp);
+
+            // Is it either Multi-Valued or Variable-Length?
+            boolean isMV = false;
+            boolean isVL = false;
+            int typeId = typeAndMV;
+            if( (typeAndMV & Types.MULTIVALUED_FLAG) != 0 ) {
+               isMV = true;
+               typeId -= Types.MULTIVALUED_FLAG;
+            }
+            if(typeId == Types.ASCII_STRING.getId() || typeId == 
Types.UNICODE_STRING.getId() ||
+                    typeId == Types.BINARY.getId() || typeId == 
Types.DIRECTORY.getId()) {
+               isVL = true;
+            }
 
-      // First up, get the number of attributes
-      int count = LittleEndian.readInt(inp);
-      List<MAPIAttribute> attrs = new ArrayList<>();
-
-      // Now, read each one in in turn
-      for(int i=0; i<count; i++) {
-         int typeAndMV = LittleEndian.readUShort(inp);
-         int id = LittleEndian.readUShort(inp);
-
-         // Is it either Multi-Valued or Variable-Length?
-         boolean isMV = false;
-         boolean isVL = false;
-         int typeId = typeAndMV;
-         if( (typeAndMV & Types.MULTIVALUED_FLAG) != 0 ) {
-            isMV = true;
-            typeId -= Types.MULTIVALUED_FLAG;
-         }
-         if(typeId == Types.ASCII_STRING.getId() || typeId == 
Types.UNICODE_STRING.getId() ||
-               typeId == Types.BINARY.getId() || typeId == 
Types.DIRECTORY.getId()) {
-            isVL = true;
-         }
+            // Turn the type ID into a strongly typed thing
+            MAPIType type = Types.getById(typeId);
+            if (type == null) {
+               type = Types.createCustom(typeId);
+            }
 
-         // Turn the type ID into a strongly typed thing
-         MAPIType type = Types.getById(typeId);
-         if (type == null) {
-            type = Types.createCustom(typeId);
-         }
+            // If it's a named property, rather than a standard
+            //  MAPI property, grab the details of it
+            MAPIProperty prop = MAPIProperty.get(id);
+            if(id >= 0x8000 && id <= 0xFFFF) {
+               byte[] guid = new byte[16];
+               if (IOUtils.readFully(inp, guid) < 0) {
+                  throw new IOException("Not enough data to read guid");
+               }
+               int mptype = LittleEndian.readInt(inp);
 
-         // If it's a named property, rather than a standard
-         //  MAPI property, grab the details of it
-         MAPIProperty prop = MAPIProperty.get(id);
-         if(id >= 0x8000 && id <= 0xFFFF) {
-            byte[] guid = new byte[16];
-            if (IOUtils.readFully(inp, guid) < 0) {
-               throw new IOException("Not enough data to read guid");
-            }
-            int mptype = LittleEndian.readInt(inp);
-
-            // Get the name of it
-            String name;
-            if(mptype == 0) {
-               // It's based on a normal one
-               int mpid = LittleEndian.readInt(inp);
-               MAPIProperty base = MAPIProperty.get(mpid);
-               name = base.name;
-            } else {
-               // Custom name was stored
-               int mplen = LittleEndian.readInt(inp);
-               byte[] mpdata = IOUtils.safelyAllocate(mplen, 
MAX_RECORD_LENGTH);
-               if (IOUtils.readFully(inp, mpdata) < 0) {
-                  throw new IOException("Not enough data to read " + mplen + " 
bytes for attribute name");
+               // Get the name of it
+               String name;
+               if(mptype == 0) {
+                  // It's based on a normal one
+                  int mpid = LittleEndian.readInt(inp);
+                  MAPIProperty base = MAPIProperty.get(mpid);
+                  name = base.name;
+               } else {
+                  // Custom name was stored
+                  int mplen = LittleEndian.readInt(inp);
+                  byte[] mpdata = IOUtils.safelyAllocate(mplen, 
MAX_RECORD_LENGTH);
+                  if (IOUtils.readFully(inp, mpdata) < 0) {
+                     throw new IOException("Not enough data to read " + mplen 
+ " bytes for attribute name");
+                  }
+                  name = StringUtil.getFromUnicodeLE(mpdata, 0, (mplen/2)-1);
+                  skipToBoundary(mplen, inp);
                }
-               name = StringUtil.getFromUnicodeLE(mpdata, 0, (mplen/2)-1);
-               skipToBoundary(mplen, inp);
+
+               // Now create
+               prop = MAPIProperty.createCustom(id, type, name);
+            }
+            if(prop == MAPIProperty.UNKNOWN) {
+               prop = MAPIProperty.createCustom(id, type, "(unknown " + 
Integer.toHexString(id) + ")");
             }
 
-            // Now create
-            prop = MAPIProperty.createCustom(id, type, name);
-         }
-         if(prop == MAPIProperty.UNKNOWN) {
-            prop = MAPIProperty.createCustom(id, type, "(unknown " + 
Integer.toHexString(id) + ")");
-         }
+            // Now read in the value(s)
+            int values = 1;
+            if(isMV || isVL) {
+               values = LittleEndian.readInt(inp);
+            }
 
-         // Now read in the value(s)
-         int values = 1;
-         if(isMV || isVL) {
-            values = LittleEndian.readInt(inp);
-         }
+            if (type == Types.NULL && values > 1) {
+               throw new IOException("Placeholder/NULL arrays aren't 
supported.");
+            }
 
-         if (type == Types.NULL && values > 1) {
-            throw new IOException("Placeholder/NULL arrays aren't supported.");
-         }
+            for(int j=0; j<values; j++) {
+               int len = getLength(type, inp);
+               byte[] data = IOUtils.safelyAllocate(len, MAX_RECORD_LENGTH);
+               if (IOUtils.readFully(inp, data) < 0) {
+                  throw new IOException("Not enough data to read " + len + " 
bytes of attribute value");
+               }
+               skipToBoundary(len, inp);
 
-         for(int j=0; j<values; j++) {
-            int len = getLength(type, inp);
-            byte[] data = IOUtils.safelyAllocate(len, MAX_RECORD_LENGTH);
-            if (IOUtils.readFully(inp, data) < 0) {
-               throw new IOException("Not enough data to read " + len + " 
bytes of attribute value");
-            }
-            skipToBoundary(len, inp);
-
-            // Create
-            MAPIAttribute attr;
-            if(type == Types.UNICODE_STRING || type == Types.ASCII_STRING) {
-               attr = new MAPIStringAttribute(prop, typeId, data);
-            } else if(type == Types.APP_TIME || type == Types.TIME) {
-               attr = new MAPIDateAttribute(prop, typeId, data);
-            } else if(id == MAPIProperty.RTF_COMPRESSED.id) {
-               attr = new MAPIRtfAttribute(prop, typeId, data);
-            } else {
-               attr = new MAPIAttribute(prop, typeId, data);
+               // Create
+               MAPIAttribute attr;
+               if(type == Types.UNICODE_STRING || type == Types.ASCII_STRING) {
+                  attr = new MAPIStringAttribute(prop, typeId, data);
+               } else if(type == Types.APP_TIME || type == Types.TIME) {
+                  attr = new MAPIDateAttribute(prop, typeId, data);
+               } else if(id == MAPIProperty.RTF_COMPRESSED.id) {
+                  attr = new MAPIRtfAttribute(prop, typeId, data);
+               } else {
+                  attr = new MAPIAttribute(prop, typeId, data);
+               }
+               attrs.add(attr);
             }
-            attrs.add(attr);
          }
-      }
 
-      // All done
-      return attrs;
+         // All done
+         return attrs;
+      }
    }
+
    private static int getLength(MAPIType type, InputStream inp) throws 
IOException {
       if (type.isFixedLength()) {
          return type.getLength();

Modified: 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hmef/attribute/MAPIRtfAttribute.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hmef/attribute/MAPIRtfAttribute.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hmef/attribute/MAPIRtfAttribute.java
 (original)
+++ 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hmef/attribute/MAPIRtfAttribute.java
 Sat Feb 19 12:08:48 2022
@@ -17,9 +17,10 @@
 
 package org.apache.poi.hmef.attribute;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 
+import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.poi.hmef.Attachment;
 import org.apache.poi.hmef.CompressedRTF;
 import org.apache.poi.hmef.HMEFMessage;
@@ -44,7 +45,11 @@ public final class MAPIRtfAttribute exte
 
       // Decompress it, removing any trailing padding as needed
       CompressedRTF rtf = new CompressedRTF();
-      byte[] tmp = rtf.decompress(new ByteArrayInputStream(data));
+      byte[] tmp;
+      try (InputStream is = new UnsynchronizedByteArrayInputStream(data)) {
+         tmp = rtf.decompress(is);
+      }
+
       if(tmp.length > rtf.getDeCompressedSize()) {
          this.decompressed = IOUtils.safelyClone(tmp, 0, 
rtf.getDeCompressedSize(), MAX_RECORD_LENGTH);
       } else {

Modified: 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/usermodel/Picture.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/usermodel/Picture.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/usermodel/Picture.java
 (original)
+++ 
poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/usermodel/Picture.java
 Sat Feb 19 12:08:48 2022
@@ -17,13 +17,13 @@
 
 package org.apache.poi.hwpf.usermodel;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Collections;
 import java.util.List;
 import java.util.zip.InflaterInputStream;
 
+import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -140,8 +140,8 @@ public final class Picture {
          */
         if ( matchSignature( rawContent, COMPRESSED1, 32 )
                 || matchSignature( rawContent, COMPRESSED2, 32 ) ) {
-            try (ByteArrayInputStream bis = new ByteArrayInputStream( 
rawContent, 33, rawContent.length - 33 );
-                InflaterInputStream in = new InflaterInputStream(bis);
+            try (UnsynchronizedByteArrayInputStream bis = new 
UnsynchronizedByteArrayInputStream( rawContent, 33, rawContent.length - 33 );
+                 InflaterInputStream in = new InflaterInputStream(bis);
                  UnsynchronizedByteArrayOutputStream out = new 
UnsynchronizedByteArrayOutputStream()) {
 
                 IOUtils.copy(in, out);

Modified: 
poi/trunk/poi/src/test/java/org/apache/poi/poifs/storage/RawDataUtil.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/poifs/storage/RawDataUtil.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- poi/trunk/poi/src/test/java/org/apache/poi/poifs/storage/RawDataUtil.java 
(original)
+++ poi/trunk/poi/src/test/java/org/apache/poi/poifs/storage/RawDataUtil.java 
Sat Feb 19 12:08:48 2022
@@ -16,11 +16,11 @@
 ==================================================================== */
 package org.apache.poi.poifs.storage;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.util.Base64;
 import java.util.zip.GZIPInputStream;
 
+import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.poi.util.HexRead;
 import org.apache.poi.util.IOUtils;
@@ -53,7 +53,7 @@ public final class RawDataUtil {
      */
     public static byte[] decompress(String data) throws IOException {
         byte[] base64Bytes = Base64.getDecoder().decode(data);
-        return IOUtils.toByteArray(new GZIPInputStream(new 
ByteArrayInputStream(base64Bytes)));
+        return IOUtils.toByteArray(new GZIPInputStream(new 
UnsynchronizedByteArrayInputStream(base64Bytes)));
     }
 
     /**

Modified: 
poi/trunk/poi/src/test/java/org/apache/poi/ss/util/NumberRenderingSpreadsheetGenerator.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/ss/util/NumberRenderingSpreadsheetGenerator.java?rev=1898213&r1=1898212&r2=1898213&view=diff
==============================================================================
--- 
poi/trunk/poi/src/test/java/org/apache/poi/ss/util/NumberRenderingSpreadsheetGenerator.java
 (original)
+++ 
poi/trunk/poi/src/test/java/org/apache/poi/ss/util/NumberRenderingSpreadsheetGenerator.java
 Sat Feb 19 12:08:48 2022
@@ -17,7 +17,6 @@
 
 package org.apache.poi.ss.util;
 
-import java.io.ByteArrayInputStream;
 import java.io.DataInputStream;
 import java.io.File;
 import java.io.FileOutputStream;
@@ -27,6 +26,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
+import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
@@ -212,14 +212,12 @@ public class NumberRenderingSpreadsheetG
     }
 
     private static String interpretLong(byte[] fileContent, int offset) {
-        InputStream is = new ByteArrayInputStream(fileContent, offset, 8);
-        long l;
-        try {
-            l = new DataInputStream(is).readLong();
+        try (InputStream is = new 
UnsynchronizedByteArrayInputStream(fileContent, offset, 8)) {
+            long l = new DataInputStream(is).readLong();
+            return "0x" + Long.toHexString(l).toUpperCase(Locale.ROOT);
         } catch (IOException e) {
-            throw new RuntimeException(e);
+            throw new IllegalStateException("Problem in interpretLong", e);
         }
-        return "0x" + Long.toHexString(l).toUpperCase(Locale.ROOT);
     }
 
     private static boolean isNaNBytes(byte[] fileContent, int offset) {



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to