]> source.dussan.org Git - poi.git/commitdiff
[bug-63774] adding lots of custom properties can cause performance issues due to...
authorPJ Fanning <fanningpj@apache.org>
Thu, 26 Sep 2019 17:51:45 +0000 (17:51 +0000)
committerPJ Fanning <fanningpj@apache.org>
Thu, 26 Sep 2019 17:51:45 +0000 (17:51 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1867597 13f79535-47bb-0310-9956-ffa450edef68

src/examples/src/org/apache/poi/xssf/usermodel/examples/WorkbookProperties.java
src/ooxml/java/org/apache/poi/ooxml/POIXMLProperties.java
src/ooxml/testcases/org/apache/poi/ooxml/TestPOIXMLProperties.java
src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java

index 3dfd610b31de2f1d52170e69ae774b067d8213dc..4e28e9da3adaa88a6372dd88a425f1bc68d9f7e9 100644 (file)
@@ -34,19 +34,19 @@ public class WorkbookProperties {
 
             POIXMLProperties props = workbook.getProperties();
 
-        /*
-         * Extended properties are a predefined set of metadata properties
-         * that are specifically applicable to Office Open XML documents.
-         * Extended properties consist of 24 simple properties and 3 complex properties stored in the
-         *  part targeted by the relationship of type
-         */
+            /*
+             * Extended properties are a predefined set of metadata properties
+             * that are specifically applicable to Office Open XML documents.
+             * Extended properties consist of 24 simple properties and 3 complex properties stored in the
+             *  part targeted by the relationship of type
+             */
             POIXMLProperties.ExtendedProperties ext = props.getExtendedProperties();
             ext.getUnderlyingProperties().setCompany("Apache Software Foundation");
             ext.getUnderlyingProperties().setTemplate("XSSF");
 
-        /*
-         * Custom properties enable users to define custom metadata properties.
-         */
+            /*
+             * Custom properties enable users to define custom metadata properties.
+             */
 
             POIXMLProperties.CustomProperties cust = props.getCustomProperties();
             cust.addProperty("Author", "John Smith");
index a816e93fda845fda23563d00865ac2daa230fbc8..ca28affdbf14a78363c523996f0bbf451cdc4c8c 100644 (file)
@@ -565,6 +565,8 @@ public class POIXMLProperties {
         public static final String FORMAT_ID = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}";
 
         private org.openxmlformats.schemas.officeDocument.x2006.customProperties.PropertiesDocument props;
+        private Integer lastPid = null;
+
         private CustomProperties(org.openxmlformats.schemas.officeDocument.x2006.customProperties.PropertiesDocument props) {
             this.props = props;
         }
@@ -651,11 +653,23 @@ public class POIXMLProperties {
          * @return next property id starting with 2
          */
         protected int nextPid() {
+            int propid = lastPid == null ? getLastPid() : lastPid;
+            int nextid = propid + 1;
+            this.lastPid = nextid;
+            return nextid;
+        }
+
+        /**
+         * Find the highest Pid in use
+         *
+         * @return the highest Pid in use in the property set; returns 1 if no properties are set
+         */
+        protected int getLastPid() {
             int propid = 1;
             for(CTProperty p : props.getProperties().getPropertyList()) {
                 if(p.getPid() > propid) propid = p.getPid();
             }
-            return propid + 1;
+            return propid;
         }
 
         /**
index d5270fe2c4627455ae0dc481cd0d9e5b0fc74abd..459ba812e435b47432b24e1dacc0ca89a7ab86ed 100644 (file)
@@ -315,6 +315,18 @@ public final class TestPOIXMLProperties {
         }
     }
 
+    @Test
+    public void testAddProperty() throws IOException {
+        try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("documentProperties.docx")) {
+            POIXMLProperties.CustomProperties cps = doc.getProperties().getCustomProperties();
+            assertEquals(1, cps.getLastPid());
+            cps.addProperty("prop1", "abc");
+            assertEquals(2, cps.getLastPid());
+            assertEquals(2, cps.getProperty("prop1").getPid());
+            assertEquals("abc", cps.getProperty("prop1").getLpwstr());
+        }
+    }
+
     @Test
     public void testBug60977() throws IOException {
         
index e510df94f838b087b3eece180c4155f9c140093a..aebe0fd0289b610ee84e479760a24b32e6e04b28 100644 (file)
@@ -86,7 +86,8 @@ public final class TestHPSFPropertiesExtractor {
        public void testCustomProperties() throws Exception {
                try (InputStream is = _samples.openResourceAsStream("TestMickey.doc");
                         POIFSFileSystem fs = new POIFSFileSystem(is);
-                       HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(fs)) {
+                        HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(fs)) {
+
                        // Custom properties are part of the document info stream
                        String dinfText = ext.getDocumentSummaryInformationText();
                        assertContains(dinfText, "Client = sample client");