From 97c21e31b10a37365cf499dbe1c5345680c872df Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Thu, 26 Sep 2019 17:51:45 +0000 Subject: [PATCH] [bug-63774] adding lots of custom properties can cause performance issues due to way Pid is calculated git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1867597 13f79535-47bb-0310-9956-ffa450edef68 --- .../usermodel/examples/WorkbookProperties.java | 18 +++++++++--------- .../org/apache/poi/ooxml/POIXMLProperties.java | 16 +++++++++++++++- .../apache/poi/ooxml/TestPOIXMLProperties.java | 12 ++++++++++++ .../extractor/TestHPSFPropertiesExtractor.java | 3 ++- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/examples/src/org/apache/poi/xssf/usermodel/examples/WorkbookProperties.java b/src/examples/src/org/apache/poi/xssf/usermodel/examples/WorkbookProperties.java index 3dfd610b31..4e28e9da3a 100644 --- a/src/examples/src/org/apache/poi/xssf/usermodel/examples/WorkbookProperties.java +++ b/src/examples/src/org/apache/poi/xssf/usermodel/examples/WorkbookProperties.java @@ -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"); diff --git a/src/ooxml/java/org/apache/poi/ooxml/POIXMLProperties.java b/src/ooxml/java/org/apache/poi/ooxml/POIXMLProperties.java index a816e93fda..ca28affdbf 100644 --- a/src/ooxml/java/org/apache/poi/ooxml/POIXMLProperties.java +++ b/src/ooxml/java/org/apache/poi/ooxml/POIXMLProperties.java @@ -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; } /** diff --git a/src/ooxml/testcases/org/apache/poi/ooxml/TestPOIXMLProperties.java b/src/ooxml/testcases/org/apache/poi/ooxml/TestPOIXMLProperties.java index d5270fe2c4..459ba812e4 100644 --- a/src/ooxml/testcases/org/apache/poi/ooxml/TestPOIXMLProperties.java +++ b/src/ooxml/testcases/org/apache/poi/ooxml/TestPOIXMLProperties.java @@ -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 { diff --git a/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java b/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java index e510df94f8..aebe0fd028 100644 --- a/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java +++ b/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java @@ -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"); -- 2.39.5