Skip to content

Commit

Permalink
[bug-63774] adding lots of custom properties can cause performance is…
Browse files Browse the repository at this point in the history
…sues due to way Pid is calculated

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1867597 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
pjfanning committed Sep 26, 2019
1 parent 3d3c846 commit 97c21e3
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,19 +34,19 @@ public static void main(String[]args) throws IOException {

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");
Expand Down
16 changes: 15 additions & 1 deletion src/ooxml/java/org/apache/poi/ooxml/POIXMLProperties.java
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,8 @@ public static class CustomProperties {
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;
}
Expand Down Expand Up @@ -651,11 +653,23 @@ public void addProperty(String name, boolean value){
* @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;
}

/**
Expand Down
12 changes: 12 additions & 0 deletions src/ooxml/testcases/org/apache/poi/ooxml/TestPOIXMLProperties.java
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,18 @@ private static String zeroPad(long i) {
}
}

@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 {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ public void testNormalUnicodeProperties() throws Exception {
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");
Expand Down

0 comments on commit 97c21e3

Please sign in to comment.