You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ki...@apache.org on 2021/05/14 00:37:53 UTC

svn commit: r1889871 [2/17] - in /poi: site/src/documentation/content/xdocs/ site/src/documentation/content/xdocs/components/ trunk/ trunk/maven/ trunk/osgi/ trunk/osgi/src/test/java/org/apache/poi/osgi/ trunk/poi-examples/src/main/java/org/apache/poi/...

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/SignatureLine.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/SignatureLine.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/SignatureLine.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/SignatureLine.java Fri May 14 00:37:50 2021
@@ -32,7 +32,6 @@ import java.awt.geom.AffineTransform;
 import java.awt.geom.Dimension2D;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.text.AttributedCharacterIterator;
 import java.text.AttributedString;
@@ -46,6 +45,7 @@ import com.microsoft.schemas.vml.CTGroup
 import com.microsoft.schemas.vml.CTImageData;
 import com.microsoft.schemas.vml.CTShape;
 import com.microsoft.schemas.vml.STExt;
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.poi.common.usermodel.PictureType;
 import org.apache.poi.hpsf.ClassID;
 import org.apache.poi.ooxml.POIXMLException;
@@ -290,7 +290,7 @@ public abstract class SignatureLine {
                 xsl.setSuggestedsigneremail(suggestedSignerEmail);
             }
             if (setupId == null) {
-                setupId = new ClassID("{"+ UUID.randomUUID().toString()+"}");
+                setupId = new ClassID("{"+ UUID.randomUUID() +"}");
             }
             xsl.setId(setupId.toString());
             xsl.setAllowcomments(STTrueFalse.T);
@@ -344,7 +344,7 @@ public abstract class SignatureLine {
         rnd.drawImage(gfx, new Rectangle2D.Double(0, 0, defaultWidth, defaultHeight));
         gfx.dispose();
 
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream();
         ImageIO.write(bi, "PNG", bos);
         return bos.toByteArray();
     }
@@ -429,7 +429,7 @@ public abstract class SignatureLine {
 
         gfx.dispose();
 
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream();
         ImageIO.write(bi, "PNG", bos);
         return bos.toByteArray();
     }

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/facets/XAdESXLSignatureFacet.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/facets/XAdESXLSignatureFacet.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/facets/XAdESXLSignatureFacet.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/facets/XAdESXLSignatureFacet.java Fri May 14 00:37:50 2021
@@ -28,7 +28,6 @@ import static org.apache.poi.ooxml.POIXM
 import static org.apache.poi.poifs.crypt.dsig.facets.XAdESSignatureFacet.insertXChild;
 
 import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.math.BigInteger;
 import java.security.cert.CRLException;
@@ -47,6 +46,7 @@ import java.util.UUID;
 
 import javax.xml.crypto.MarshalException;
 
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.poi.poifs.crypt.dsig.SignatureConfig;
@@ -104,8 +104,8 @@ public class XAdESXLSignatureFacet imple
 
         SignatureConfig signatureConfig = signatureInfo.getSignatureConfig();
 
-        QualifyingPropertiesDocument qualDoc = null;
-        QualifyingPropertiesType qualProps = null;
+        QualifyingPropertiesDocument qualDoc;
+        QualifyingPropertiesType qualProps;
 
         // check for XAdES-BES
         NodeList qualNl = document.getElementsByTagNameNS(XADES_132_NS, "QualifyingProperties");
@@ -289,7 +289,7 @@ public class XAdESXLSignatureFacet imple
     }
 
     public static byte[] getC14nValue(List<Node> nodeList, String c14nAlgoId) {
-        ByteArrayOutputStream c14nValue = new ByteArrayOutputStream();
+        UnsynchronizedByteArrayOutputStream c14nValue = new UnsynchronizedByteArrayOutputStream();
         try {
             for (Node node : nodeList) {
                 /*

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/services/TSPTimeStampService.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/services/TSPTimeStampService.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/services/TSPTimeStampService.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/services/TSPTimeStampService.java Fri May 14 00:37:50 2021
@@ -24,7 +24,8 @@
 
 package org.apache.poi.poifs.crypt.dsig.services;
 
-import java.io.ByteArrayOutputStream;
+import static org.apache.logging.log4j.util.Unbox.box;
+
 import java.io.IOException;
 import java.io.OutputStream;
 import java.math.BigInteger;
@@ -44,6 +45,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.message.SimpleMessage;
@@ -72,8 +74,6 @@ import org.bouncycastle.tsp.TimeStampReq
 import org.bouncycastle.tsp.TimeStampResponse;
 import org.bouncycastle.tsp.TimeStampToken;
 
-import static org.apache.logging.log4j.util.Unbox.box;
-
 /**
  * A TSP time-stamp service implementation.
  */
@@ -95,7 +95,8 @@ public class TSPTimeStampService impleme
         }
     }
 
-    @SuppressWarnings({"unchecked","squid:S2647"})
+    @Override
+    @SuppressWarnings({"squid:S2647"})
     public byte[] timeStamp(SignatureInfo signatureInfo, byte[] data, RevocationData revocationData) throws Exception {
         SignatureConfig signatureConfig = signatureInfo.getSignatureConfig();
 
@@ -124,7 +125,7 @@ public class TSPTimeStampService impleme
             proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(InetAddress.getByName(host), (port == -1 ? 80 : port)));
         }
 
-        ByteArrayOutputStream bos;
+        UnsynchronizedByteArrayOutputStream bos;
         String contentType;
         HttpURLConnection huc = (HttpURLConnection)new URL(signatureConfig.getTspUrl()).openConnection(proxy);
         try {
@@ -163,7 +164,7 @@ public class TSPTimeStampService impleme
                 throw new RuntimeException("missing Content-Type header");
             }
 
-            bos = new ByteArrayOutputStream();
+            bos = new UnsynchronizedByteArrayOutputStream();
             IOUtils.copy(huc.getInputStream(), bos);
             LOG.atDebug().log(() -> new SimpleMessage("response content: " + HexDump.dump(bos.toByteArray(), 0, 0)));
         } finally {

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/SVGRenderExtension.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/SVGRenderExtension.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/SVGRenderExtension.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/SVGRenderExtension.java Fri May 14 00:37:50 2021
@@ -43,7 +43,6 @@ import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.awt.image.ColorModel;
 import java.awt.image.WritableRaster;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.lang.ref.WeakReference;
 import java.nio.charset.StandardCharsets;
@@ -60,6 +59,7 @@ import org.apache.batik.svggen.SVGGenera
 import org.apache.batik.svggen.SVGGraphics2D;
 import org.apache.batik.svggen.SVGPaintDescriptor;
 import org.apache.batik.svggen.SVGTexturePaint;
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.poi.sl.draw.BitmapImageRenderer;
 import org.apache.poi.sl.draw.DrawTexturePaint;
 import org.apache.poi.sl.draw.Drawable;
@@ -274,12 +274,12 @@ public class SVGRenderExtension extends
             null, SVG_VIEW_BOX_ATTRIBUTE, x+" "+ y+" "+ w+" "+h
         );
 
-        org.apache.poi.sl.usermodel.Shape slShape = fill.getShape();
+        org.apache.poi.sl.usermodel.Shape<?,?> slShape = fill.getShape();
 
         // TODO: the rotation handling is incomplete and the scale handling is missing
         //  see DrawTexturePaint on how to do it for AWT
         if (!fill.isRotatedWithShape() && slShape instanceof SimpleShape) {
-            double rot = ((SimpleShape)slShape).getRotation();
+            double rot = ((SimpleShape<?,?>)slShape).getRotation();
             if (rot != 0) {
                 setAttribute(genCtx, patternDef,
                     null, SVG_PATTERN_TRANSFORM_ATTRIBUTE, "rotate(" + genCtx.doubleString(-rot) + ")");
@@ -311,7 +311,7 @@ public class SVGRenderExtension extends
         }
         if (imgData == null) {
             BufferedImage bi = imgRdr.getImage();
-            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream();
             try {
                 ImageIO.write(bi, "PNG", bos);
             } catch (IOException e) {

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFObjectShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFObjectShape.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFObjectShape.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFObjectShape.java Fri May 14 00:37:50 2021
@@ -19,14 +19,14 @@
 
 package org.apache.poi.xslf.usermodel;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
 
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.poi.hpsf.ClassID;
 import org.apache.poi.ooxml.POIXMLDocumentPart.RelationPart;
 import org.apache.poi.ooxml.POIXMLException;
@@ -68,7 +68,7 @@ public class XSLFObjectShape extends XSL
     private static final QName[] OLE_OBJ = { new QName(PML_NS, "oleObj") };
     private static final QName[] CT_PICTURE = { new QName(PML_NS, "pic") };
 
-    private CTOleObject _oleObject;
+    private final CTOleObject _oleObject;
     private XSLFPictureData _data;
 
     /*package*/ XSLFObjectShape(CTGraphicalObjectFrame shape, XSLFSheet sheet){
@@ -193,56 +193,45 @@ public class XSLFObjectShape extends XSL
         _oleObject.setProgId(md.getProgId());
         _oleObject.setName(md.getObjectName());
 
-        return new XSLFObjectOutputStream(rp.getDocumentPart().getPackagePart(),md);
+        return new ByteArrayOutputStream() {
+            @Override
+            public void close() throws IOException {
+                addUpdatedData(rp.getDocumentPart().getPackagePart(),md,this);
+            }
+        };
     }
 
-    private static class XSLFObjectOutputStream extends ByteArrayOutputStream {
-        final PackagePart objectPart;
-        final ObjectMetaData metaData;
-        private XSLFObjectOutputStream(final PackagePart objectPart, final ObjectMetaData metaData) {
-            super(100000);
-            this.objectPart = objectPart;
-            this.metaData = metaData;
-        }
-
-        public void close() throws IOException {
-            objectPart.clear();
-            try (final OutputStream os = objectPart.getOutputStream()) {
-                final ByteArrayInputStream bis = new ByteArrayInputStream(this.buf, 0, size());
-                final FileMagic fm = FileMagic.valueOf(this.buf);
-
-                if (fm == FileMagic.OLE2) {
-                    try (final POIFSFileSystem poifs = new POIFSFileSystem(bis)) {
-                        poifs.getRoot().setStorageClsid(metaData.getClassID());
-                        poifs.writeFilesystem(os);
-                    }
-                } else if (metaData.getOleEntry() == null) {
-                    // OLE Name hasn't been specified, pass the input through
-                    os.write(this.buf, 0, size());
-                } else {
-                    try (final POIFSFileSystem poifs = new POIFSFileSystem()) {
-                        final ClassID clsId = metaData.getClassID();
-                        if (clsId != null) {
-                            poifs.getRoot().setStorageClsid(clsId);
-                        }
-                        poifs.createDocument(bis, metaData.getOleEntry());
-
-                        Ole10Native.createOleMarkerEntry(poifs);
-
-                        poifs.writeFilesystem(os);
+    private void addUpdatedData(PackagePart objectPart, ObjectMetaData metaData, ByteArrayOutputStream baos) throws IOException {
+        objectPart.clear();
+        try (InputStream bis = FileMagic.prepareToCheckMagic(baos.toInputStream());
+             final OutputStream os = objectPart.getOutputStream()) {
+            final FileMagic fm = FileMagic.valueOf(bis);
+
+            if (fm == FileMagic.OLE2) {
+                try (final POIFSFileSystem poifs = new POIFSFileSystem(bis)) {
+                    poifs.getRoot().setStorageClsid(metaData.getClassID());
+                    poifs.writeFilesystem(os);
+                }
+            } else if (metaData.getOleEntry() == null) {
+                // OLE Name hasn't been specified, pass the input through
+                baos.writeTo(os);
+            } else {
+                try (final POIFSFileSystem poifs = new POIFSFileSystem()) {
+                    final ClassID clsId = metaData.getClassID();
+                    if (clsId != null) {
+                        poifs.getRoot().setStorageClsid(clsId);
                     }
+                    poifs.createDocument(bis, metaData.getOleEntry());
+                    Ole10Native.createOleMarkerEntry(poifs);
+                    poifs.writeFilesystem(os);
                 }
             }
         }
     }
 
-
     /**
-     *
-     *
      * @param shapeId 1-based shapeId
      * @param picRel relationship to the picture data in the ooxml package
-     * @return
      */
     static CTGraphicalObjectFrame prototype(int shapeId, String picRel){
         CTGraphicalObjectFrame frame = CTGraphicalObjectFrame.Factory.newInstance();

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java Fri May 14 00:37:50 2021
@@ -25,8 +25,6 @@ import java.awt.Insets;
 import java.awt.geom.Dimension2D;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
@@ -35,6 +33,7 @@ import javax.imageio.ImageIO;
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.poi.ooxml.util.POIXMLUnits;
@@ -127,6 +126,7 @@ public class XSLFPictureShape extends XS
      * Return the data on the (internal) picture.
      * For an external linked picture, will return null
      */
+    @Override
     public XSLFPictureData getPictureData() {
         if(_data == null){
             String blipId = getBlipId();
@@ -320,16 +320,16 @@ public class XSLFPictureShape extends XS
             : new Rectangle2D.Double(0,0, Units.pixelToPoints((int)dim.getWidth()), Units.pixelToPoints((int)dim.getHeight()));
 
         PictureType pt = (previewType != null) ? previewType : PictureType.PNG;
-        if (pt != PictureType.JPEG || pt != PictureType.GIF || pt != PictureType.PNG) {
+        if (pt != PictureType.JPEG && pt != PictureType.GIF && pt != PictureType.PNG) {
             pt = PictureType.PNG;
         }
 
         BufferedImage thmBI = renderer.getImage(dim);
-        ByteArrayOutputStream bos = new ByteArrayOutputStream(100000);
+        UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream(100000);
         // use extension instead of enum name, because of "jpeg"
         ImageIO.write(thmBI, pt.extension.substring(1), bos);
 
-        XSLFPictureData pngPic = sheet.getSlideShow().addPicture(new ByteArrayInputStream(bos.toByteArray()), pt);
+        XSLFPictureData pngPic = sheet.getSlideShow().addPicture(bos.toInputStream(), pt);
 
         XSLFPictureShape shape = sheet.createPicture(pngPic);
         shape.setAnchor(anc);
@@ -375,7 +375,6 @@ public class XSLFPictureShape extends XS
         if(blip.isSetExtLst()) {
             // TODO: check for SVG copying
             CTOfficeArtExtensionList extLst = blip.getExtLst();
-            //noinspection deprecation
             for(CTOfficeArtExtension ext : extLst.getExtArray()){
                 String xpath = "declare namespace a14='"+ MS_DML_NS +"' $this//a14:imgProps/a14:imgLayer";
                 XmlObject[] obj = ext.selectPath(xpath);

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/util/DummyFormat.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/util/DummyFormat.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/util/DummyFormat.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/util/DummyFormat.java Fri May 14 00:37:50 2021
@@ -18,7 +18,6 @@
 package org.apache.poi.xslf.util;
 
 import java.awt.Graphics2D;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -26,14 +25,16 @@ import java.io.PrintStream;
 import java.io.UnsupportedEncodingException;
 import java.nio.charset.StandardCharsets;
 
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
+
 public class DummyFormat implements OutputFormat {
 
-    private final ByteArrayOutputStream bos;
+    private final UnsynchronizedByteArrayOutputStream bos;
     private final DummyGraphics2d dummy2d;
 
     public DummyFormat() {
         try {
-            bos = new ByteArrayOutputStream();
+            bos = new UnsynchronizedByteArrayOutputStream();
             dummy2d = new DummyGraphics2d(new PrintStream(bos, true, StandardCharsets.UTF_8.name()));
         } catch (UnsupportedEncodingException e) {
             throw new RuntimeException(e);
@@ -41,7 +42,7 @@ public class DummyFormat implements Outp
     }
 
     @Override
-    public Graphics2D addSlide(double width, double height) throws IOException {
+    public Graphics2D addSlide(double width, double height) {
         bos.reset();
         return dummy2d;
     }
@@ -55,7 +56,7 @@ public class DummyFormat implements Outp
     }
 
     @Override
-    public void writeDocument(MFProxy proxy, File outFile) throws IOException {
+    public void writeDocument(MFProxy proxy, File outFile) {
 
     }
 

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/util/PPTX2PNG.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/util/PPTX2PNG.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/util/PPTX2PNG.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/util/PPTX2PNG.java Fri May 14 00:37:50 2021
@@ -121,6 +121,7 @@ public final class PPTX2PNG {
     private PPTX2PNG() {
     }
 
+    @SuppressWarnings("AssignmentToForLoopParameter")
     private boolean parseCommandLine(String[] args) {
         if (args.length == 0) {
             usage(null);
@@ -403,6 +404,7 @@ public final class PPTX2PNG {
         }
         GenericRecord gr = proxy.getRoot();
         try (GenericRecordJsonWriter fw = new GenericRecordJsonWriter(dumpfile) {
+            @Override
             protected boolean printBytes(String name, Object o) {
                 return false;
             }

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFChartSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFChartSheet.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFChartSheet.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFChartSheet.java Fri May 14 00:37:50 2021
@@ -20,13 +20,13 @@ package org.apache.poi.xssf.usermodel;
 import static org.apache.poi.ooxml.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;
 
 import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
 import javax.xml.namespace.QName;
 
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.poi.ooxml.POIXMLException;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.xmlbeans.XmlException;
@@ -95,7 +95,7 @@ public class XSSFChartSheet extends XSSF
     }
 
     private static byte[] blankWorksheet(){
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        UnsynchronizedByteArrayOutputStream out = new UnsynchronizedByteArrayOutputStream();
         try {
             new XSSFSheet().write(out);
         } catch (IOException e){

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFObjectData.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFObjectData.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFObjectData.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFObjectData.java Fri May 14 00:37:50 2021
@@ -17,7 +17,6 @@
 
 package org.apache.poi.xssf.usermodel;
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
@@ -68,9 +67,6 @@ public class XSSFObjectData extends XSSF
     /**
      * Prototype with the default structure of a new auto-shape.
      */
-    /**
-     * Prototype with the default structure of a new auto-shape.
-     */
     protected static CTShape prototype() {
         final String drawNS = "http://schemas.microsoft.com/office/drawing/2010/main";
 
@@ -92,7 +88,7 @@ public class XSSFObjectData extends XSSF
             cur.insertNamespace("a14", drawNS);
             cur.insertAttributeWithValue("spid", "_x0000_s1");
             cur.dispose();
-            
+
             nv.addNewCNvSpPr();
 
             CTShapeProperties sp = shape.addNewSpPr();
@@ -113,16 +109,16 @@ public class XSSFObjectData extends XSSF
         return prototype;
     }
 
-    
-    
-    
+
+
+
     @Override
     public String getOLE2ClassName() {
         return getOleObject().getProgId();
     }
 
     /**
-     * @return the CTOleObject associated with the shape 
+     * @return the CTOleObject associated with the shape
      */
     public CTOleObject getOleObject() {
         if (oleObject == null) {
@@ -134,16 +130,14 @@ public class XSSFObjectData extends XSSF
         }
         return oleObject;
     }
-    
+
     @Override
     public byte[] getObjectData() throws IOException {
-        InputStream is = getObjectPart().getInputStream();
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        IOUtils.copy(is, bos);
-        is.close();
-        return bos.toByteArray();
+        try (InputStream is = getObjectPart().getInputStream()) {
+            return IOUtils.toByteArray(is);
+        }
     }
-    
+
     /**
      * @return the package part of the object data
      */
@@ -184,7 +178,7 @@ public class XSSFObjectData extends XSSF
     public String getFileName() {
         return getObjectPart().getPartName().getName();
     }
-    
+
     protected XSSFSheet getSheet() {
         return (XSSFSheet)getDrawing().getParent();
     }

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java Fri May 14 00:37:50 2021
@@ -21,8 +21,6 @@ import static org.apache.poi.ooxml.POIXM
 import static org.apache.poi.xssf.usermodel.helpers.XSSFPasswordHelper.setPassword;
 import static org.apache.poi.xssf.usermodel.helpers.XSSFPasswordHelper.validatePassword;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -43,6 +41,7 @@ import javax.xml.namespace.QName;
 
 import org.apache.commons.collections4.ListValuedMap;
 import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.poi.hpsf.ClassIDPredefined;
@@ -485,7 +484,7 @@ public class XSSFWorkbook extends POIXML
     protected static OPCPackage newPackage(XSSFWorkbookType workbookType) {
         OPCPackage pkg = null;
         try {
-            pkg = OPCPackage.create(new ByteArrayOutputStream());    // NOSONAR - we do not want to close this here
+            pkg = OPCPackage.create(new UnsynchronizedByteArrayOutputStream());    // NOSONAR - we do not want to close this here
             // Main part
             PackagePartName corePartName = PackagingURIHelper.createPartName(XSSFRelation.WORKBOOK.getDefaultFileName());
             // Create main part relationship
@@ -639,9 +638,9 @@ public class XSSFWorkbook extends POIXML
         }
 
 
-        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+        try (UnsynchronizedByteArrayOutputStream out = new UnsynchronizedByteArrayOutputStream()) {
             srcSheet.write(out);
-            try (ByteArrayInputStream bis = new ByteArrayInputStream(out.toByteArray())) {
+            try (InputStream bis = out.toInputStream()) {
                 clonedSheet.read(bis);
             }
         } catch (IOException e){
@@ -2346,12 +2345,12 @@ public class XSSFWorkbook extends POIXML
 
         Ole10Native ole10 = new Ole10Native(label, fileName, command, oleData);
 
-        try (ByteArrayOutputStream bos = new ByteArrayOutputStream(oleData.length+500)) {
+        try (UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream(oleData.length+500)) {
             ole10.writeOut(bos);
 
             try (POIFSFileSystem poifs = new POIFSFileSystem()) {
                 DirectoryNode root = poifs.getRoot();
-                root.createDocument(Ole10Native.OLE10_NATIVE, new ByteArrayInputStream(bos.toByteArray()));
+                root.createDocument(Ole10Native.OLE10_NATIVE, bos.toInputStream());
                 root.setStorageClsid(ClassIDPredefined.OLE_V1_PACKAGE.getClassID());
 
                 // TODO: generate CombObj stream

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java Fri May 14 00:37:50 2021
@@ -20,7 +20,6 @@ package org.apache.poi.xwpf.usermodel;
 
 import static org.apache.poi.ooxml.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -36,6 +35,7 @@ import java.util.Map;
 
 import javax.xml.namespace.QName;
 
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.poi.ooxml.POIXMLDocument;
@@ -65,19 +65,37 @@ import org.apache.xmlbeans.XmlException;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
 import org.openxmlformats.schemas.officeDocument.x2006.sharedTypes.STOnOff1;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDocument1;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFtnEdn;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtBlock;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyles;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CommentsDocument;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.DocumentDocument;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.EndnotesDocument;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.FootnotesDocument;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.NumberingDocument;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STDocProtect;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHdrFtr;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.StylesDocument;
 
 /**
- * <p>High(ish) level class for working with .docx files.</p>
+ * High(ish) level class for working with .docx files.
  * <p>
- * <p>This class tries to hide some of the complexity
+ * This class tries to hide some of the complexity
  * of the underlying file format, but as it's not a
  * mature and stable API yet, certain parts of the
  * XML structure come through. You'll therefore almost
  * certainly need to refer to the OOXML specifications
  * from
  * http://www.ecma-international.org/publications/standards/Ecma-376.htm
- * at some point in your use.</p>
+ * at some point in your use.
  */
 @SuppressWarnings("unused")
 public class XWPFDocument extends POIXMLDocument implements Document, IBody {
@@ -103,9 +121,9 @@ public class XWPFDocument extends POIXML
     /**
      * Keeps track on all id-values used in this document and included parts, like headers, footers, etc.
      */
-    private IdentifierManager drawingIdManager = new IdentifierManager(0L, 4294967295L);
+    private final IdentifierManager drawingIdManager = new IdentifierManager(0L, 4294967295L);
 
-    private FootnoteEndnoteIdManager footnoteIdManager = new FootnoteEndnoteIdManager(this);
+    private final FootnoteEndnoteIdManager footnoteIdManager = new FootnoteEndnoteIdManager(this);
 
     /**
      * Handles the joy of different headers/footers for different pages
@@ -137,7 +155,7 @@ public class XWPFDocument extends POIXML
     protected static OPCPackage newPackage() {
         OPCPackage pkg = null;
         try {
-            pkg = OPCPackage.create(new ByteArrayOutputStream());    // NOSONAR - we do not want to close this here
+            pkg = OPCPackage.create(new UnsynchronizedByteArrayOutputStream());    // NOSONAR - we do not want to close this here
             // Main part
             PackagePartName corePartName = PackagingURIHelper.createPartName(XWPFRelation.DOCUMENT.getDefaultFileName());
             // Create main part relationship
@@ -306,8 +324,6 @@ public class XWPFDocument extends POIXML
 
     /**
      * returns an Iterator with paragraphs and tables
-     *
-     * @see IBody#getBodyElements()
      */
     @Override
     public List<IBodyElement> getBodyElements() {
@@ -318,17 +334,11 @@ public class XWPFDocument extends POIXML
         return bodyElements.iterator();
     }
 
-    /**
-     * @see IBody#getParagraphs()
-     */
     @Override
     public List<XWPFParagraph> getParagraphs() {
         return Collections.unmodifiableList(paragraphs);
     }
 
-    /**
-     * @see IBody#getTables()
-     */
     @Override
     public List<XWPFTable> getTables() {
         return Collections.unmodifiableList(tables);
@@ -341,9 +351,6 @@ public class XWPFDocument extends POIXML
         return Collections.unmodifiableList(charts);
     }
 
-    /**
-     * @see IBody#getTableArray(int)
-     */
     @Override
     public XWPFTable getTableArray(int pos) {
         if (pos >= 0 && pos < tables.size()) {
@@ -755,8 +762,6 @@ public class XWPFDocument extends POIXML
 
     /**
      * verifies that cursor is on the right position
-     *
-     * @param cursor
      */
     private boolean isCursorInBody(XmlCursor cursor) {
         XmlCursor verify = cursor.newCursor();
@@ -818,9 +823,6 @@ public class XWPFDocument extends POIXML
 
     /**
      * Gets the index of the relation we're trying to create
-     *
-     * @param relation
-     * @return i
      */
     private int getRelationIndex(XWPFRelation relation) {
         int i = 1;
@@ -843,11 +845,11 @@ public class XWPFDocument extends POIXML
         paragraphs.add(p);
         return p;
     }
-    
-    
+
+
     /**
      * Creates an empty comments for the document if one does not already exist
-     * 
+     *
      * @return comments
      */
     public XWPFComments createComments() {
@@ -953,7 +955,6 @@ public class XWPFDocument extends POIXML
     /**
      * remove a BodyElement from bodyElements array list
      *
-     * @param pos
      * @return true if removing was successfully, else return false
      */
     public boolean removeBodyElement(int pos) {
@@ -977,9 +978,6 @@ public class XWPFDocument extends POIXML
 
     /**
      * copies content of a paragraph to a existing paragraph in the list paragraphs at position pos
-     *
-     * @param paragraph
-     * @param pos
      */
     public void setParagraph(XWPFParagraph paragraph, int pos) {
         paragraphs.set(pos, paragraph);
@@ -1012,10 +1010,6 @@ public class XWPFDocument extends POIXML
 
     /**
      * Create an empty table with a number of rows and cols specified
-     *
-     * @param rows
-     * @param cols
-     * @return table
      */
     public XWPFTable createTable(int rows, int cols) {
         XWPFTable table = new XWPFTable(ctDocument.getBody().addNewTbl(), this, rows, cols);
@@ -1045,9 +1039,6 @@ public class XWPFDocument extends POIXML
 
     /**
      * Replace content of table in array tables at position pos with a
-     *
-     * @param pos
-     * @param table
      */
     public void setTable(int pos, XWPFTable table) {
         tables.set(pos, table);
@@ -1289,7 +1280,6 @@ public class XWPFDocument extends POIXML
     /**
      * Validates the existing password
      *
-     * @param password
      * @return true, only if password was set and equals, false otherwise
      */
     public boolean validateProtectionPassword(String password) {
@@ -1324,7 +1314,7 @@ public class XWPFDocument extends POIXML
     /**
      * Check if revision tracking is turned on.
      *
-     * @return <code>true</code> if revision tracking is turned on
+     * @return {@code true} if revision tracking is turned on
      */
     public boolean isTrackRevisions() {
         return settings.isTrackRevisions();
@@ -1333,7 +1323,7 @@ public class XWPFDocument extends POIXML
     /**
      * Enable or disable revision tracking.
      *
-     * @param enable <code>true</code> to turn on revision tracking, <code>false</code> to turn off revision tracking
+     * @param enable {@code true} to turn on revision tracking, {@code false} to turn off revision tracking
      */
     public void setTrackRevisions(boolean enable) {
         settings.setTrackRevisions(enable);
@@ -1394,9 +1384,6 @@ public class XWPFDocument extends POIXML
 
     /**
      * inserts an existing XWPFTable to the arrays bodyElements and tables
-     *
-     * @param pos
-     * @param table
      */
     @Override
     public void insertTable(int pos, XWPFTable table) {
@@ -1506,7 +1493,6 @@ public class XWPFDocument extends POIXML
     /**
      * get the next free ImageNumber
      *
-     * @param format
      * @return the next free ImageNumber
      * @throws InvalidFormatException If the format of the picture is not known.
      */
@@ -1525,7 +1511,6 @@ public class XWPFDocument extends POIXML
     /**
      * returns the PictureData by blipID
      *
-     * @param blipID
      * @return XWPFPictureData of a specificID
      */
     public XWPFPictureData getPictureDataByID(String blipID) {
@@ -1567,9 +1552,7 @@ public class XWPFDocument extends POIXML
     /**
      * get a table by its CTTbl-Object
      *
-     * @param ctTbl
      * @return a table by its CTTbl-Object or null
-     * @see IBody#getTable(CTTbl)
      */
     @Override
     public XWPFTable getTable(CTTbl ctTbl) {
@@ -1591,8 +1574,6 @@ public class XWPFDocument extends POIXML
 
     /**
      * Returns the paragraph that of position pos
-     *
-     * @see IBody#getParagraphArray(int)
      */
     @Override
     public XWPFParagraph getParagraphArray(int pos) {
@@ -1606,8 +1587,6 @@ public class XWPFDocument extends POIXML
      * returns the Part, to which the body belongs, which you need for adding relationship to other parts
      * Actually it is needed of the class XWPFTableCell. Because you have to know to which part the tableCell
      * belongs.
-     *
-     * @see IBody#getPart()
      */
     @Override
     public POIXMLDocumentPart getPart() {
@@ -1618,8 +1597,6 @@ public class XWPFDocument extends POIXML
     /**
      * get the PartType of the body, for example
      * DOCUMENT, HEADER, FOOTER, FOOTNOTE,
-     *
-     * @see IBody#getPartType()
      */
     @Override
     public BodyType getPartType() {
@@ -1628,8 +1605,6 @@ public class XWPFDocument extends POIXML
 
     /**
      * get the TableCell which belongs to the TableCell
-     *
-     * @param cell
      */
     @Override
     public XWPFTableCell getTableCell(CTTc cell) {
@@ -1668,8 +1643,6 @@ public class XWPFDocument extends POIXML
      * no need to read MS-Word file and modify charts
      *
      * @return This method return object of XWPFChart Object with default height and width
-     * @throws InvalidFormatException
-     * @throws IOException
      * @since POI 4.0.0
      */
     public XWPFChart createChart() throws InvalidFormatException, IOException {
@@ -1683,8 +1656,6 @@ public class XWPFDocument extends POIXML
      * @param width  width of chart in document
      * @param height height of chart in document
      * @return This method return object of XWPFChart
-     * @throws InvalidFormatException
-     * @throws IOException
      * @since POI 4.0.0
      */
     public XWPFChart createChart(int width, int height) throws InvalidFormatException, IOException {
@@ -1697,8 +1668,6 @@ public class XWPFDocument extends POIXML
      * @param width in EMU.
      * @param height in EMU.
      * @return the new chart.
-     * @throws InvalidFormatException
-     * @throws IOException
      * @since POI 4.1.2
      */
     public XWPFChart createChart(XWPFRun run, int width, int height) throws InvalidFormatException, IOException {
@@ -1729,8 +1698,7 @@ public class XWPFDocument extends POIXML
     public XWPFFootnote createFootnote() {
         XWPFFootnotes footnotes = this.createFootnotes();
 
-        XWPFFootnote footnote = footnotes.createFootnote();
-        return footnote;
+        return footnotes.createFootnote();
     }
 
     /**
@@ -1757,8 +1725,7 @@ public class XWPFDocument extends POIXML
     public XWPFEndnote createEndnote() {
         XWPFEndnotes endnotes = this.createEndnotes();
 
-        XWPFEndnote endnote = endnotes.createEndnote();
-        return endnote;
+        return endnotes.createEndnote();
 
     }
 

Modified: poi/trunk/poi-ooxml/src/test/java/org/apache/poi/ooxml/TestPOIXMLDocument.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/ooxml/TestPOIXMLDocument.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/test/java/org/apache/poi/ooxml/TestPOIXMLDocument.java (original)
+++ poi/trunk/poi-ooxml/src/test/java/org/apache/poi/ooxml/TestPOIXMLDocument.java Fri May 14 00:37:50 2021
@@ -17,6 +17,7 @@
 
 package org.apache.poi.ooxml;
 
+import static org.apache.commons.io.output.NullOutputStream.NULL_OUTPUT_STREAM;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -25,7 +26,6 @@ import static org.junit.jupiter.api.Asse
 import static org.junit.jupiter.api.Assertions.assertSame;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
@@ -46,7 +46,6 @@ import org.apache.poi.openxml4j.opc.OPCP
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
 import org.apache.poi.util.IOUtils;
-import org.apache.poi.util.NullOutputStream;
 import org.apache.poi.util.TempFile;
 import org.apache.poi.xslf.usermodel.XMLSlideShow;
 import org.apache.poi.xssf.usermodel.XSSFRelation;
@@ -142,7 +141,7 @@ public final class TestPOIXMLDocument {
 
                 // Should not be able to write a document that has been closed
                 doc.close();
-                IOException e2 = assertThrows(IOException.class, () -> doc.write(new NullOutputStream()),
+                IOException e2 = assertThrows(IOException.class, () -> doc.write(NULL_OUTPUT_STREAM),
                     "Should not be able to write a document that has been closed.");
                 assertEquals("Cannot write data, document seems to have been closed already", e2.getMessage());
 
@@ -292,7 +291,7 @@ public final class TestPOIXMLDocument {
             XMLSlideShow ppt = new XMLSlideShow(is)) {
             POIXMLDocumentPart doc = ppt.getSlides().get(12).getRelationById("rId3");
             assertNotNull(doc);
-            assertEquals(POIXMLDocumentPart.class, doc.getClass());
+            assertSame(POIXMLDocumentPart.class, doc.getClass());
         }
     }
 
@@ -334,6 +333,7 @@ public final class TestPOIXMLDocument {
     private static class UncaughtHandler implements UncaughtExceptionHandler {
         Throwable e;
 
+        @Override
         public synchronized void uncaughtException(Thread t, Throwable e) {
             this.e = e;
         }

Modified: poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/OpenXML4JTestDataSamples.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/OpenXML4JTestDataSamples.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/OpenXML4JTestDataSamples.java (original)
+++ poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/OpenXML4JTestDataSamples.java Fri May 14 00:37:50 2021
@@ -25,7 +25,7 @@ import java.io.InputStream;
 import java.io.IOException;
 
 /**
- * Centralises logic for finding/opening sample files for ooxml4j unit tests 
+ * Centralises logic for finding/opening sample files for ooxml4j unit tests
  */
 public final class OpenXML4JTestDataSamples {
     private static final POIDataSamples _samples = POIDataSamples.getOpenXML4JInstance();
@@ -40,19 +40,13 @@ public final class OpenXML4JTestDataSamp
 	public static String getSampleFileName(String sampleFileName) {
 		return getSampleFile(sampleFileName).getAbsolutePath();
 	}
-	
+
 	public static File getSampleFile(String sampleFileName) {
 		return _samples.getFile(sampleFileName);
 	}
-	
-	public static File getOutputFile(String outputFileName) throws IOException {
-        String suffix = outputFileName.substring(outputFileName.lastIndexOf('.'));
-        return TempFile.createTempFile(outputFileName, suffix);
-	}
 
-
-	public static InputStream openComplianceSampleStream(String sampleFileName) {
-        return _samples.openResourceAsStream(sampleFileName);
+	public static File getOutputFile(String outputFileName) throws IOException {
+		int idx = outputFileName.lastIndexOf('.');
+        return TempFile.createTempFile(outputFileName.substring(0,idx), outputFileName.substring(idx));
 	}
-
 }

Modified: poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/TestPackage.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/TestPackage.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/TestPackage.java (original)
+++ poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/TestPackage.java Fri May 14 00:37:50 2021
@@ -33,7 +33,6 @@ import static org.junit.jupiter.api.Asse
 
 import java.io.BufferedInputStream;
 import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -58,6 +57,8 @@ import com.google.common.io.Files;
 import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
 import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
 import org.apache.commons.compress.archivers.zip.ZipFile;
+import org.apache.commons.io.output.CountingOutputStream;
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.poi.EncryptedDocumentException;
@@ -217,7 +218,7 @@ public final class TestPackage {
 	 */
     @Test
 	void createPackageWithCoreDocument() throws IOException, InvalidFormatException, URISyntaxException, SAXException {
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		UnsynchronizedByteArrayOutputStream baos = new UnsynchronizedByteArrayOutputStream();
 		try (OPCPackage pkg = OPCPackage.create(baos)) {
 
 			// Add a core document
@@ -675,7 +676,7 @@ public final class TestPackage {
     @Test
     void zipBombCreateAndHandle()
     throws IOException, EncryptedDocumentException {
-		ByteArrayOutputStream bos = new ByteArrayOutputStream(2500000);
+		UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream(2500000);
 
         try (ZipFile zipFile = ZipHelper.openZipFile(getSampleFile("sample.xlsx"));
 			 ZipArchiveOutputStream append = new ZipArchiveOutputStream(bos)) {
@@ -693,21 +694,19 @@ public final class TestPackage {
 				append.putArchiveEntry(eOut);
 				if (!eOut.isDirectory()) {
 					try (InputStream is = zipFile.getInputStream(eIn)) {
-						if (eOut.getName().equals("[Content_Types].xml")) {
-							ByteArrayOutputStream bos2 = new ByteArrayOutputStream();
-							IOUtils.copy(is, bos2);
-							long size = bos2.size() - "</Types>".length();
-							append.write(bos2.toByteArray(), 0, (int) size);
+						if ("[Content_Types].xml".equals(eOut.getName())) {
+							byte[] suffix = "</Types>".getBytes(StandardCharsets.UTF_8);
+							CountingOutputStream cos = new CountingOutputStream(append);
+							IOUtils.copy(is, cos, eOut.getSize() - suffix.length);
+
                             byte[] spam = new byte[0x7FFF];
 							Arrays.fill(spam, (byte) ' ');
 							// 0x7FFF0000 is the maximum for 32-bit zips, but less still works
-							while (size < 0x7FFF00) {
-								append.write(spam);
-								size += spam.length;
+							while (cos.getByteCount() < 0x7FFF00) {
+								cos.write(spam);
 							}
-							append.write("</Types>".getBytes(StandardCharsets.UTF_8));
-							size += 8;
-							eOut.setSize(size);
+							cos.write(suffix);
+							eOut.setSize(cos.getByteCount());
 						} else {
 							IOUtils.copy(is, append);
 						}
@@ -717,10 +716,7 @@ public final class TestPackage {
 			}
 		}
 
-		IOException ex = assertThrows(
-			IOException.class,
-			() -> WorkbookFactory.create(new ByteArrayInputStream(bos.toByteArray()))
-		);
+		IOException ex = assertThrows(IOException.class, () -> WorkbookFactory.create(bos.toInputStream()));
         assertTrue(ex.getMessage().contains("Zip bomb detected!"));
     }
 

Modified: poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/TestPackageCoreProperties.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/TestPackageCoreProperties.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/TestPackageCoreProperties.java (original)
+++ poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/TestPackageCoreProperties.java Fri May 14 00:37:50 2021
@@ -17,8 +17,17 @@
 
 package org.apache.poi.openxml4j.opc;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
+import static org.apache.poi.openxml4j.OpenXML4JTestDataSamples.getSampleFileName;
+import static org.apache.poi.openxml4j.OpenXML4JTestDataSamples.openSampleStream;
+import static org.apache.poi.openxml4j.opc.PackageRelationshipTypes.CORE_DOCUMENT;
+import static org.apache.poi.openxml4j.opc.PackageRelationshipTypes.CORE_PROPERTIES;
+import static org.apache.poi.openxml4j.opc.PackageRelationshipTypes.EXTENDED_PROPERTIES;
+import static org.apache.poi.openxml4j.opc.TestContentType.isOldXercesActive;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.io.File;
 import java.io.InputStream;
 import java.text.ParsePosition;
@@ -27,6 +36,7 @@ import java.util.Date;
 import java.util.Locale;
 import java.util.Optional;
 
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.poi.POIDataSamples;
 import org.apache.poi.openxml4j.OpenXML4JTestDataSamples;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
@@ -36,9 +46,6 @@ import org.apache.poi.xssf.usermodel.XSS
 import org.junit.jupiter.api.Test;
 import org.openxmlformats.schemas.officeDocument.x2006.customProperties.CTProperty;
 
-import static org.apache.poi.openxml4j.opc.TestContentType.isOldXercesActive;
-import static org.junit.jupiter.api.Assertions.*;
-
 public final class TestPackageCoreProperties {
 	/**
 	 * Test package core properties getters.
@@ -47,7 +54,7 @@ public final class TestPackageCoreProper
 	void testGetProperties() throws Exception {
 		// Open the package
 		@SuppressWarnings("resource")
-        OPCPackage p = OPCPackage.open(OpenXML4JTestDataSamples.openSampleStream("TestPackageCoreProperiesGetters.docx"));
+        OPCPackage p = OPCPackage.open(openSampleStream("TestPackageCoreProperiesGetters.docx"));
 		compareProperties(p);
 		p.revert();
 	}
@@ -57,7 +64,7 @@ public final class TestPackageCoreProper
 	 */
     @Test
     void testSetProperties() throws Exception {
-		String inputPath = OpenXML4JTestDataSamples.getSampleFileName("TestPackageCoreProperiesSetters.docx");
+		String inputPath = getSampleFileName("TestPackageCoreProperiesSetters.docx");
 
 		File outputFile = OpenXML4JTestDataSamples.getOutputFile("TestPackageCoreProperiesSettersOUTPUT.docx");
 
@@ -75,28 +82,28 @@ public final class TestPackageCoreProper
 
         //test various date formats
         props.setCreatedProperty("2007-05-12T08:00:00Z");
-        assertEquals(dateToInsert, props.getCreatedProperty().get());
+        assertEquals(dateToInsert, props.getCreatedProperty().orElse(null));
 
         props.setCreatedProperty("2007-05-12T08:00:00"); //no Z, assume Z
-        assertEquals(dateToInsert, props.getCreatedProperty().get());
+        assertEquals(dateToInsert, props.getCreatedProperty().orElse(null));
 
         props.setCreatedProperty("2007-05-12T08:00:00.123Z");//millis
-        assertEquals(msdf.parse("2007-05-12T08:00:00.123Z"), props.getCreatedProperty().get());
+        assertEquals(msdf.parse("2007-05-12T08:00:00.123Z"), props.getCreatedProperty().orElse(null));
 
         props.setCreatedProperty("2007-05-12T10:00:00+0200");
-        assertEquals(dateToInsert, props.getCreatedProperty().get());
+        assertEquals(dateToInsert, props.getCreatedProperty().orElse(null));
 
         props.setCreatedProperty("2007-05-12T10:00:00+02:00");//colon in tz
-        assertEquals(dateToInsert, props.getCreatedProperty().get());
+        assertEquals(dateToInsert, props.getCreatedProperty().orElse(null));
 
         props.setCreatedProperty("2007-05-12T06:00:00-0200");
-        assertEquals(dateToInsert, props.getCreatedProperty().get());
+        assertEquals(dateToInsert, props.getCreatedProperty().orElse(null));
 
         props.setCreatedProperty("2015-07-27");
-        assertEquals(msdf.parse("2015-07-27T00:00:00.000Z"), props.getCreatedProperty().get());
+        assertEquals(msdf.parse("2015-07-27T00:00:00.000Z"), props.getCreatedProperty().orElse(null));
 
         props.setCreatedProperty("2007-05-12T10:00:00.123+0200");
-        assertEquals(msdf.parse("2007-05-12T08:00:00.123Z"), props.getCreatedProperty().get());
+        assertEquals(msdf.parse("2007-05-12T08:00:00.123Z"), props.getCreatedProperty().orElse(null));
 
         props.setCategoryProperty("MyCategory");
 		props.setContentStatusProperty("MyContentStatus");
@@ -122,7 +129,7 @@ public final class TestPackageCoreProper
         OPCPackage p2 = OPCPackage.open(outputFile.getAbsolutePath(), PackageAccess.READ);
 	    compareProperties(p2);
 	    p2.revert();
-		outputFile.delete();
+		assertTrue(outputFile.delete());
 	}
 
 	private void compareProperties(OPCPackage p) throws InvalidFormatException {
@@ -132,22 +139,22 @@ public final class TestPackageCoreProper
 
 		// Gets the core properties
 		PackageProperties props = p.getPackageProperties();
-		assertEquals("MyCategory", props.getCategoryProperty().get());
-		assertEquals("MyContentStatus", props.getContentStatusProperty().get());
-		assertEquals("MyContentType", props.getContentTypeProperty().get());
-		assertEquals(expectedDate, props.getCreatedProperty().get());
-		assertEquals("MyCreator", props.getCreatorProperty().get());
-		assertEquals("MyDescription", props.getDescriptionProperty().get());
-		assertEquals("MyIdentifier", props.getIdentifierProperty().get());
-		assertEquals("MyKeywords", props.getKeywordsProperty().get());
-		assertEquals("MyLanguage", props.getLanguageProperty().get());
-		assertEquals("Julien Chable", props.getLastModifiedByProperty().get());
-		assertEquals(expectedDate, props.getLastPrintedProperty().get());
-		assertEquals(expectedDate, props.getModifiedProperty().get());
-		assertEquals("2", props.getRevisionProperty().get());
-		assertEquals("MySubject", props.getSubjectProperty().get());
-		assertEquals("MyTitle", props.getTitleProperty().get());
-		assertEquals("2", props.getVersionProperty().get());
+		assertEquals("MyCategory", props.getCategoryProperty().orElse(null));
+		assertEquals("MyContentStatus", props.getContentStatusProperty().orElse(null));
+		assertEquals("MyContentType", props.getContentTypeProperty().orElse(null));
+		assertEquals(expectedDate, props.getCreatedProperty().orElse(null));
+		assertEquals("MyCreator", props.getCreatorProperty().orElse(null));
+		assertEquals("MyDescription", props.getDescriptionProperty().orElse(null));
+		assertEquals("MyIdentifier", props.getIdentifierProperty().orElse(null));
+		assertEquals("MyKeywords", props.getKeywordsProperty().orElse(null));
+		assertEquals("MyLanguage", props.getLanguageProperty().orElse(null));
+		assertEquals("Julien Chable", props.getLastModifiedByProperty().orElse(null));
+		assertEquals(expectedDate, props.getLastPrintedProperty().orElse(null));
+		assertEquals(expectedDate, props.getModifiedProperty().orElse(null));
+		assertEquals("2", props.getRevisionProperty().orElse(null));
+		assertEquals("MySubject", props.getSubjectProperty().orElse(null));
+		assertEquals("MyTitle", props.getTitleProperty().orElse(null));
+		assertEquals("2", props.getVersionProperty().orElse(null));
 	}
 
 	@Test
@@ -157,90 +164,92 @@ public final class TestPackageCoreProper
         String strDate = "2007-05-12T08:00:00Z";
         Date date = df.parse(strDate);
 
-        OPCPackage pkg = new ZipPackage();
-        PackagePropertiesPart props = (PackagePropertiesPart)pkg.getPackageProperties();
+        try (OPCPackage pkg = new ZipPackage()) {
+            PackagePropertiesPart props = (PackagePropertiesPart) pkg.getPackageProperties();
 
-        // created
-        assertEquals("", props.getCreatedPropertyString());
-        assertFalse(props.getCreatedProperty().isPresent());
-        props.setCreatedProperty((String)null);
-        assertEquals("", props.getCreatedPropertyString());
-        assertFalse(props.getCreatedProperty().isPresent());
-        props.setCreatedProperty(Optional.empty());
-        assertEquals("", props.getCreatedPropertyString());
-        assertFalse(props.getCreatedProperty().isPresent());
-        props.setCreatedProperty(Optional.of(date));
-        assertEquals(strDate, props.getCreatedPropertyString());
-        assertEquals(date, props.getCreatedProperty().get());
-        props.setCreatedProperty(strDate);
-        assertEquals(strDate, props.getCreatedPropertyString());
-        assertEquals(date, props.getCreatedProperty().get());
-
-        // lastPrinted
-        assertEquals("", props.getLastPrintedPropertyString());
-        assertFalse(props.getLastPrintedProperty().isPresent());
-        props.setLastPrintedProperty((String)null);
-        assertEquals("", props.getLastPrintedPropertyString());
-        assertFalse(props.getLastPrintedProperty().isPresent());
-        props.setLastPrintedProperty(Optional.empty());
-        assertEquals("", props.getLastPrintedPropertyString());
-        assertFalse(props.getLastPrintedProperty().isPresent());
-        props.setLastPrintedProperty(Optional.of(date));
-        assertEquals(strDate, props.getLastPrintedPropertyString());
-        assertEquals(date, props.getLastPrintedProperty().get());
-        props.setLastPrintedProperty(strDate);
-        assertEquals(strDate, props.getLastPrintedPropertyString());
-        assertEquals(date, props.getLastPrintedProperty().get());
-
-        // modified
-        assertFalse(props.getModifiedProperty().isPresent());
-        props.setModifiedProperty((String)null);
-        assertFalse(props.getModifiedProperty().isPresent());
-        props.setModifiedProperty(Optional.empty());
-        assertFalse(props.getModifiedProperty().isPresent());
-        props.setModifiedProperty(Optional.of(date));
-        assertEquals(strDate, props.getModifiedPropertyString());
-        assertEquals(date, props.getModifiedProperty().get());
-        props.setModifiedProperty(strDate);
-        assertEquals(strDate, props.getModifiedPropertyString());
-        assertEquals(date, props.getModifiedProperty().get());
-
-        // Tidy
-        pkg.close();
+            // created
+            assertEquals("", props.getCreatedPropertyString());
+            assertFalse(props.getCreatedProperty().isPresent());
+            props.setCreatedProperty((String) null);
+            assertEquals("", props.getCreatedPropertyString());
+            assertFalse(props.getCreatedProperty().isPresent());
+            props.setCreatedProperty(Optional.empty());
+            assertEquals("", props.getCreatedPropertyString());
+            assertFalse(props.getCreatedProperty().isPresent());
+            props.setCreatedProperty(Optional.of(date));
+            assertEquals(strDate, props.getCreatedPropertyString());
+            assertEquals(date, props.getCreatedProperty().get());
+            props.setCreatedProperty(strDate);
+            assertEquals(strDate, props.getCreatedPropertyString());
+            assertEquals(date, props.getCreatedProperty().get());
+
+            // lastPrinted
+            assertEquals("", props.getLastPrintedPropertyString());
+            assertFalse(props.getLastPrintedProperty().isPresent());
+            props.setLastPrintedProperty((String) null);
+            assertEquals("", props.getLastPrintedPropertyString());
+            assertFalse(props.getLastPrintedProperty().isPresent());
+            props.setLastPrintedProperty(Optional.empty());
+            assertEquals("", props.getLastPrintedPropertyString());
+            assertFalse(props.getLastPrintedProperty().isPresent());
+            props.setLastPrintedProperty(Optional.of(date));
+            assertEquals(strDate, props.getLastPrintedPropertyString());
+            assertEquals(date, props.getLastPrintedProperty().get());
+            props.setLastPrintedProperty(strDate);
+            assertEquals(strDate, props.getLastPrintedPropertyString());
+            assertEquals(date, props.getLastPrintedProperty().get());
+
+            // modified
+            assertFalse(props.getModifiedProperty().isPresent());
+            props.setModifiedProperty((String) null);
+            assertFalse(props.getModifiedProperty().isPresent());
+            props.setModifiedProperty(Optional.empty());
+            assertFalse(props.getModifiedProperty().isPresent());
+            props.setModifiedProperty(Optional.of(date));
+            assertEquals(strDate, props.getModifiedPropertyString());
+            assertEquals(date, props.getModifiedProperty().get());
+            props.setModifiedProperty(strDate);
+            assertEquals(strDate, props.getModifiedPropertyString());
+            assertEquals(date, props.getModifiedProperty().get());
+        }
     }
 
 	@Test
 	void testGetPropertiesLO() throws Exception {
+        UnsynchronizedByteArrayOutputStream out = new UnsynchronizedByteArrayOutputStream();
         // Open the package
-        OPCPackage pkg1 = OPCPackage.open(OpenXML4JTestDataSamples.openSampleStream("51444.xlsx"));
-        PackageProperties props1 = pkg1.getPackageProperties();
-        assertFalse(props1.getTitleProperty().isPresent());
-        props1.setTitleProperty("Bug 51444 fixed");
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        pkg1.save(out);
-        out.close();
-        pkg1.close();
-
-        OPCPackage pkg2 = OPCPackage.open(new ByteArrayInputStream(out.toByteArray()));
-        PackageProperties props2 = pkg2.getPackageProperties();
-        props2.setTitleProperty("Bug 51444 fixed");
-        pkg2.close();
+        try (OPCPackage pkg1 = OPCPackage.open(openSampleStream("51444.xlsx"))) {
+            PackageProperties props1 = pkg1.getPackageProperties();
+            assertFalse(props1.getTitleProperty().isPresent());
+            props1.setTitleProperty("Bug 51444 fixed");
+            pkg1.save(out);
+        }
+
+        try (OPCPackage pkg2 = OPCPackage.open(out.toInputStream())) {
+            PackageProperties props2 = pkg2.getPackageProperties();
+            props2.setTitleProperty("Bug 51444 fixed");
+        }
     }
 
 	@Test
 	void testEntitiesInCoreProps_56164() throws Exception {
-        try (InputStream is = OpenXML4JTestDataSamples.openSampleStream("CorePropertiesHasEntities.ooxml");
-        OPCPackage p = OPCPackage.open(is)) {
+        try (InputStream is = openSampleStream("CorePropertiesHasEntities.ooxml");
+             OPCPackage p = OPCPackage.open(is)) {
 
             // Should have 3 root relationships
             boolean foundDocRel = false, foundCorePropRel = false, foundExtPropRel = false;
             for (PackageRelationship pr : p.getRelationships()) {
-                if (pr.getRelationshipType().equals(PackageRelationshipTypes.CORE_DOCUMENT))
-                    foundDocRel = true;
-                if (pr.getRelationshipType().equals(PackageRelationshipTypes.CORE_PROPERTIES))
-                    foundCorePropRel = true;
-                if (pr.getRelationshipType().equals(PackageRelationshipTypes.EXTENDED_PROPERTIES))
-                    foundExtPropRel = true;
+                switch (pr.getRelationshipType()) {
+                    case CORE_DOCUMENT:
+                        foundDocRel = true;
+                        break;
+                    case CORE_PROPERTIES:
+                        foundCorePropRel = true;
+                        break;
+                    case EXTENDED_PROPERTIES:
+                        foundExtPropRel = true;
+                        break;
+                }
             }
             assertTrue(foundDocRel, "Core Doc Relationship not found in " + p.getRelationships());
             assertTrue(foundCorePropRel, "Core Props Relationship not found in " + p.getRelationships());
@@ -257,67 +266,68 @@ public final class TestPackageCoreProper
 	@Test
 	void testListOfCustomProperties() throws Exception {
         File inp = POIDataSamples.getSpreadSheetInstance().getFile("ExcelWithAttachments.xlsm");
-        OPCPackage pkg = OPCPackage.open(inp, PackageAccess.READ);
-        XSSFWorkbook wb = new XSSFWorkbook(pkg);
+        try (OPCPackage pkg = OPCPackage.open(inp, PackageAccess.READ);
+             XSSFWorkbook wb = new XSSFWorkbook(pkg)) {
 
-        assertNotNull(wb.getProperties());
-        assertNotNull(wb.getProperties().getCustomProperties());
+            assertNotNull(wb.getProperties());
+            assertNotNull(wb.getProperties().getCustomProperties());
 
-        for (CTProperty prop : wb.getProperties().getCustomProperties().getUnderlyingProperties().getPropertyList()) {
-            assertNotNull(prop);
+            for (CTProperty prop : wb.getProperties().getCustomProperties().getUnderlyingProperties().getPropertyList()) {
+                assertNotNull(prop);
+            }
         }
-
-        wb.close();
-        pkg.close();
     }
 
 	@Test
 	void testAlternateCorePropertyTimezones() throws Exception {
-        InputStream is = OpenXML4JTestDataSamples.openSampleStream("OPCCompliance_CoreProperties_AlternateTimezones.docx");
-        OPCPackage pkg = OPCPackage.open(is);
-        PackagePropertiesPart props = (PackagePropertiesPart)pkg.getPackageProperties();
-        is.close();
-
         // We need predictable dates for testing!
         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
         df.setTimeZone(LocaleUtil.TIMEZONE_UTC);
 
-        // Check text properties first
-        assertEquals("Lorem Ipsum", props.getTitleProperty().get());
-        assertEquals("Apache POI", props.getCreatorProperty().get());
-
-        // Created at has a +3 timezone and milliseconds
-        //   2006-10-13T18:06:00.123+03:00
-        // = 2006-10-13T15:06:00.123+00:00
-        assertEquals("2006-10-13T15:06:00Z", props.getCreatedPropertyString());
-        assertEquals("2006-10-13T15:06:00.123Z", df.format(props.getCreatedProperty().get()));
-
-        // Modified at has a -13 timezone but no milliseconds
-        //   2007-06-20T07:59:00-13:00
-        // = 2007-06-20T20:59:00-13:00
-        assertEquals("2007-06-20T20:59:00Z", props.getModifiedPropertyString());
-        assertEquals("2007-06-20T20:59:00.000Z", df.format(props.getModifiedProperty().get()));
-
-
-        // Ensure we can change them with other timezones and still read back OK
-        props.setCreatedProperty("2007-06-20T20:57:00+13:00");
-        props.setModifiedProperty("2007-06-20T20:59:00.123-13:00");
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        pkg.save(baos);
-        pkg = OPCPackage.open(new ByteArrayInputStream(baos.toByteArray()));
-
-        // Check text properties first - should be unchanged
-        assertEquals("Lorem Ipsum", props.getTitleProperty().get());
-        assertEquals("Apache POI", props.getCreatorProperty().get());
-
-        // Check the updated times
-        //   2007-06-20T20:57:00+13:00
-        // = 2007-06-20T07:57:00Z
-        assertEquals("2007-06-20T07:57:00.000Z", df.format(props.getCreatedProperty().get()));
-
-        //   2007-06-20T20:59:00.123-13:00
-        // = 2007-06-21T09:59:00.123Z
-        assertEquals("2007-06-21T09:59:00.123Z", df.format(props.getModifiedProperty().get()));
+        UnsynchronizedByteArrayOutputStream baos = new UnsynchronizedByteArrayOutputStream();
+        try (InputStream is = openSampleStream("OPCCompliance_CoreProperties_AlternateTimezones.docx");
+            OPCPackage pkg1 = OPCPackage.open(is)) {
+            PackagePropertiesPart props1 = (PackagePropertiesPart) pkg1.getPackageProperties();
+
+            // Check text properties first
+            assertEquals("Lorem Ipsum", props1.getTitleProperty().orElse(null));
+            assertEquals("Apache POI", props1.getCreatorProperty().orElse(null));
+
+            // Created at has a +3 timezone and milliseconds
+            //   2006-10-13T18:06:00.123+03:00
+            // = 2006-10-13T15:06:00.123+00:00
+            assertEquals("2006-10-13T15:06:00Z", props1.getCreatedPropertyString());
+            assertEquals("2006-10-13T15:06:00.123Z", df.format(props1.getCreatedProperty().orElse(null)));
+
+            // Modified at has a -13 timezone but no milliseconds
+            //   2007-06-20T07:59:00-13:00
+            // = 2007-06-20T20:59:00-13:00
+            assertEquals("2007-06-20T20:59:00Z", props1.getModifiedPropertyString());
+            assertEquals("2007-06-20T20:59:00.000Z", df.format(props1.getModifiedProperty().orElse(null)));
+
+
+            // Ensure we can change them with other timezones and still read back OK
+            props1.setCreatedProperty("2007-06-20T20:57:00+13:00");
+            props1.setModifiedProperty("2007-06-20T20:59:00.123-13:00");
+
+            pkg1.save(baos);
+        }
+        try (OPCPackage pkg2 = OPCPackage.open(baos.toInputStream())) {
+            PackagePropertiesPart props2 = (PackagePropertiesPart) pkg2.getPackageProperties();
+
+            // Check text properties first - should be unchanged
+            assertEquals("Lorem Ipsum", props2.getTitleProperty().orElse(null));
+            assertEquals("Apache POI", props2.getCreatorProperty().orElse(null));
+
+            // Check the updated times
+            //   2007-06-20T20:57:00+13:00
+            // = 2007-06-20T07:57:00Z
+            assertEquals("2007-06-20T07:57:00.000Z", df.format(props2.getCreatedProperty().orElse(null)));
+
+            //   2007-06-20T20:59:00.123-13:00
+            // = 2007-06-21T09:59:00.123Z
+            // CoreProperties are stored as xs:dateTime -> no milliseconds are saved!
+            assertEquals("2007-06-21T09:59:00.000Z", df.format(props2.getModifiedProperty().orElse(null)));
+        }
 	}
 }

Modified: poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/TestRelationships.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/TestRelationships.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/TestRelationships.java (original)
+++ poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/TestRelationships.java Fri May 14 00:37:50 2021
@@ -24,12 +24,11 @@ import static org.junit.jupiter.api.Asse
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.net.URI;
 import java.util.regex.Pattern;
 
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.poi.openxml4j.OpenXML4JTestDataSamples;
@@ -198,18 +197,16 @@ class TestRelationships {
 
 
 	    // Write out and re-load
-	    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+	    UnsynchronizedByteArrayOutputStream baos = new UnsynchronizedByteArrayOutputStream();
 	    pkg.save(baos);
 
 	    // use revert to not re-write the input file
         pkg.revert();
 
-        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-	    pkg = OPCPackage.open(bais);
+	    pkg = OPCPackage.open(baos.toInputStream());
 
 	    // Check again
-	    sheet = pkg.getPart(
-	    		PackagingURIHelper.createPartName(SHEET_WITH_COMMENTS));
+	    sheet = pkg.getPart(PackagingURIHelper.createPartName(SHEET_WITH_COMMENTS));
 
 	    assertEquals(6, sheet.getRelationshipsByType(HYPERLINK_REL_TYPE).size());
 
@@ -228,7 +225,7 @@ class TestRelationships {
 
     @Test
     void testCreateRelationsFromScratch() throws Exception {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        UnsynchronizedByteArrayOutputStream baos = new UnsynchronizedByteArrayOutputStream();
         OPCPackage pkg = OPCPackage.create(baos);
 
         PackagePart partA =
@@ -255,8 +252,7 @@ class TestRelationships {
 
         // Save, and re-load
         pkg.close();
-        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-        pkg = OPCPackage.open(bais);
+        pkg = OPCPackage.open(baos.toInputStream());
 
         partA = pkg.getPart(PackagingURIHelper.createPartName("/partA"));
         partB = pkg.getPart(PackagingURIHelper.createPartName("/partB"));
@@ -297,20 +293,17 @@ class TestRelationships {
 
     @Test
     void testTargetWithSpecialChars() throws Exception{
-        OPCPackage pkg;
-
         String filepath = OpenXML4JTestDataSamples.getSampleFileName("50154.xlsx");
-        pkg = OPCPackage.open(filepath);
+        OPCPackage pkg = OPCPackage.open(filepath);
         assert_50154(pkg);
 
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        UnsynchronizedByteArrayOutputStream baos = new UnsynchronizedByteArrayOutputStream();
         pkg.save(baos);
 
         // use revert to not re-write the input file
         pkg.revert();
 
-        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-        pkg = OPCPackage.open(bais);
+        pkg = OPCPackage.open(baos.toInputStream());
 
         assert_50154(pkg);
     }
@@ -359,7 +352,7 @@ class TestRelationships {
 
    @Test
    void testSelfRelations_bug51187() throws Exception {
-    	ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    	UnsynchronizedByteArrayOutputStream baos = new UnsynchronizedByteArrayOutputStream();
         PackageRelationship rel1;
     	try (OPCPackage pkg = OPCPackage.create(baos)) {
 
@@ -374,8 +367,7 @@ class TestRelationships {
             // Save, and re-load
         }
 
-        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-    	try (OPCPackage pkg = OPCPackage.open(bais)) {
+    	try (OPCPackage pkg = OPCPackage.open(baos.toInputStream())) {
             PackagePart partA = pkg.getPart(PackagingURIHelper.createPartName("/partA"));
 
 
@@ -406,11 +398,10 @@ class TestRelationships {
             assertEquals("mailto:nobody@nowhere.uk%C2%A0", targetUri.toASCIIString());
             assertEquals("nobody@nowhere.uk\u00A0", targetUri.getSchemeSpecificPart());
 
-            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            UnsynchronizedByteArrayOutputStream out = new UnsynchronizedByteArrayOutputStream();
             pkg1.save(out);
-            out.close();
 
-            try (OPCPackage pkg2 = OPCPackage.open(new ByteArrayInputStream(out.toByteArray()))) {
+            try (OPCPackage pkg2 = OPCPackage.open(out.toInputStream())) {
                 sheetRels = pkg2.getPartsByName(Pattern.compile("/xl/worksheets/sheet1.xml")).get(0).getRelationships();
                 assertEquals(3, sheetRels.size());
                 rId1 = sheetRels.getRelationshipByID("rId1");

Modified: poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/ZipFileAssert.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/ZipFileAssert.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/ZipFileAssert.java (original)
+++ poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/ZipFileAssert.java Fri May 14 00:37:50 2021
@@ -24,7 +24,6 @@ import static org.junit.jupiter.api.Asse
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.BufferedInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -33,6 +32,7 @@ import java.util.TreeMap;
 
 import org.apache.commons.compress.archivers.ArchiveEntry;
 import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.poi.util.IOUtils;
 import org.junit.jupiter.api.Assertions;
 import org.xmlunit.builder.DiffBuilder;
@@ -52,15 +52,15 @@ public final class ZipFileAssert {
     }
 
     private static void equals(
-            TreeMap<String, ByteArrayOutputStream> file1,
-            TreeMap<String, ByteArrayOutputStream> file2) {
+            TreeMap<String, UnsynchronizedByteArrayOutputStream> file1,
+            TreeMap<String, UnsynchronizedByteArrayOutputStream> file2) {
         Set<String> listFile1 = file1.keySet();
         Assertions.assertEquals(listFile1.size(), file2.keySet().size(), "not the same number of files in zip:");
 
         for (String fileName : listFile1) {
             // extract the contents for both
-            ByteArrayOutputStream contain1 = file1.get(fileName);
-            ByteArrayOutputStream contain2 = file2.get(fileName);
+            UnsynchronizedByteArrayOutputStream contain1 = file1.get(fileName);
+            UnsynchronizedByteArrayOutputStream contain2 = file2.get(fileName);
 
             assertNotNull(contain2, fileName + " not found in 2nd zip");
             // no need to check for contain1. The key come from it
@@ -84,11 +84,11 @@ public final class ZipFileAssert {
         }
     }
 
-    private static TreeMap<String, ByteArrayOutputStream> decompress(
+    private static TreeMap<String, UnsynchronizedByteArrayOutputStream> decompress(
             File filename) throws IOException {
         // store the zip content in memory
         // let s assume it is not Go ;-)
-        TreeMap<String, ByteArrayOutputStream> zipContent = new TreeMap<>();
+        TreeMap<String, UnsynchronizedByteArrayOutputStream> zipContent = new TreeMap<>();
 
         try (
         /* Open file to decompress */
@@ -106,7 +106,7 @@ public final class ZipFileAssert {
             while ((entree = zis.getNextEntry()) != null) {
 
                 /* Create a array for the current entry */
-                ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
+                UnsynchronizedByteArrayOutputStream byteArray = new UnsynchronizedByteArrayOutputStream();
                 IOUtils.copy(zis, byteArray);
                 zipContent.put(entree.getName(), byteArray);
             }

Modified: poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java?rev=1889871&r1=1889870&r2=1889871&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java (original)
+++ poi/trunk/poi-ooxml/src/test/java/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java Fri May 14 00:37:50 2021
@@ -17,7 +17,8 @@
 
 package org.apache.poi.openxml4j.opc.compliance;
 
-import static org.apache.poi.openxml4j.OpenXML4JTestDataSamples.openComplianceSampleStream;
+import static org.apache.poi.openxml4j.OpenXML4JTestDataSamples.getOutputFile;
+import static org.apache.poi.openxml4j.OpenXML4JTestDataSamples.getSampleFile;
 import static org.apache.poi.openxml4j.OpenXML4JTestDataSamples.openSampleStream;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -26,8 +27,6 @@ import static org.junit.jupiter.api.Asse
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -35,7 +34,7 @@ import java.io.InputStream;
 import java.net.URI;
 import java.net.URISyntaxException;
 
-import org.apache.poi.POIDataSamples;
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.openxml4j.exceptions.InvalidOperationException;
 import org.apache.poi.openxml4j.opc.ContentTypes;
@@ -44,7 +43,6 @@ import org.apache.poi.openxml4j.opc.Pack
 import org.apache.poi.openxml4j.opc.PackagingURIHelper;
 import org.apache.poi.openxml4j.opc.TargetMode;
 import org.apache.poi.util.IOUtils;
-import org.apache.poi.util.TempFile;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -81,13 +79,13 @@ public final class TestOPCComplianceCore
 
     @Test
     void testCorePropertiesPart() throws IOException {
-        try (InputStream is = openComplianceSampleStream("OPCCompliance_CoreProperties_OnlyOneCorePropertiesPart.docx")) {
+        try (InputStream is = openSampleStream("OPCCompliance_CoreProperties_OnlyOneCorePropertiesPart.docx")) {
             assertDoesNotThrow(() -> OPCPackage.open(is).close());
         }
     }
 
     private static String extractInvalidFormatMessage(String sampleNameSuffix) throws IOException {
-        try (InputStream is = openComplianceSampleStream("OPCCompliance_CoreProperties_" + sampleNameSuffix)) {
+        try (InputStream is = openSampleStream("OPCCompliance_CoreProperties_" + sampleNameSuffix)) {
             InvalidFormatException e = assertThrows(InvalidFormatException.class,
                 () -> OPCPackage.open(is).revert(), "expected OPC compliance exception was not thrown");
             return e.getMessage();
@@ -137,7 +135,7 @@ public final class TestOPCComplianceCore
      */
     @Test
     void testOnlyOneCorePropertiesPart_AddRelationship() throws IOException, InvalidFormatException {
-        try (InputStream is = openComplianceSampleStream("OPCCompliance_CoreProperties_OnlyOneCorePropertiesPart.docx")) {
+        try (InputStream is = openSampleStream("OPCCompliance_CoreProperties_OnlyOneCorePropertiesPart.docx")) {
             OPCPackage pkg = OPCPackage.open(is);
             URI partUri = createURI("/docProps/core2.xml");
             InvalidOperationException e = assertThrows(InvalidOperationException.class, () ->
@@ -155,7 +153,7 @@ public final class TestOPCComplianceCore
     @Test
     void testOnlyOneCorePropertiesPart_AddPart() throws InvalidFormatException, IOException {
         String sampleFileName = "OPCCompliance_CoreProperties_OnlyOneCorePropertiesPart.docx";
-        try (OPCPackage pkg = OPCPackage.open(POIDataSamples.getOpenXML4JInstance().getFile(sampleFileName).getPath())) {
+        try (OPCPackage pkg = OPCPackage.open(getSampleFile(sampleFileName).getPath())) {
 
             URI partUri = createURI("/docProps/core2.xml");
             InvalidOperationException e = assertThrows(InvalidOperationException.class, () ->
@@ -218,9 +216,9 @@ public final class TestOPCComplianceCore
     @Test
     void testNoCoreProperties_saveNew() throws Exception {
         String sampleFileName = "OPCCompliance_NoCoreProperties.xlsx";
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        UnsynchronizedByteArrayOutputStream baos = new UnsynchronizedByteArrayOutputStream();
 
-        try (OPCPackage pkg = OPCPackage.open(POIDataSamples.getOpenXML4JInstance().getFile(sampleFileName).getPath())) {
+        try (OPCPackage pkg = OPCPackage.open(getSampleFile(sampleFileName).getPath())) {
             // Verify it has empty properties
             assertEquals(0, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size());
             assertNotNull(pkg.getPackageProperties());
@@ -232,7 +230,7 @@ public final class TestOPCComplianceCore
             pkg.revert();
         }
 
-        try (OPCPackage pkg = OPCPackage.open(new ByteArrayInputStream(baos.toByteArray()))) {
+        try (OPCPackage pkg = OPCPackage.open(baos.toInputStream())) {
             // An Empty Properties part has been added in the save/load
             assertEquals(1, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size());
             assertNotNull(pkg.getPackageProperties());
@@ -241,14 +239,14 @@ public final class TestOPCComplianceCore
         }
 
         // Open a new copy of it
-        try (OPCPackage pkg = OPCPackage.open(POIDataSamples.getOpenXML4JInstance().getFile(sampleFileName).getPath())) {
+        try (OPCPackage pkg = OPCPackage.open(getSampleFile(sampleFileName).getPath())) {
             // Save and re-load, without having touched the properties yet
             baos.reset();
             pkg.save(baos);
             pkg.revert();
         }
 
-        try (OPCPackage pkg = OPCPackage.open(new ByteArrayInputStream(baos.toByteArray()))) {
+        try (OPCPackage pkg = OPCPackage.open(baos.toInputStream())) {
             // Check that this too added empty properties without error
             assertEquals(1, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size());
             assertNotNull(pkg.getPackageProperties());
@@ -266,9 +264,9 @@ public final class TestOPCComplianceCore
         String sampleFileName = "OPCCompliance_NoCoreProperties.xlsx";
 
         // Copy this into a temp file, so we can play with it
-        File tmp = TempFile.createTempFile("poi-test", ".opc");
+        File tmp = getOutputFile("poi-test.opc");
         try (FileOutputStream out = new FileOutputStream(tmp);
-            InputStream in = POIDataSamples.getOpenXML4JInstance().openResourceAsStream(sampleFileName)) {
+            InputStream in = openSampleStream(sampleFileName)) {
             IOUtils.copy(in, out);
         }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org