[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
This commit is contained in:
PJ Fanning 2019-09-26 17:51:45 +00:00
parent 3d3c846558
commit 97c21e31b1
4 changed files with 38 additions and 11 deletions

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");

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;
}
/**

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 {

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");