Browse Source

[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
tags/REL_4_1_1
PJ Fanning 4 years ago
parent
commit
97c21e31b1

+ 9
- 9
src/examples/src/org/apache/poi/xssf/usermodel/examples/WorkbookProperties.java View 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");

+ 15
- 1
src/ooxml/java/org/apache/poi/ooxml/POIXMLProperties.java View 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;
}

/**

+ 12
- 0
src/ooxml/testcases/org/apache/poi/ooxml/TestPOIXMLProperties.java View 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 {

+ 2
- 1
src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java View 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");

Loading…
Cancel
Save