mirror of https://github.com/apache/poi.git
[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:
parent
3d3c846558
commit
97c21e31b1
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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 {
|
||||
|
||||
|
|
|
@ -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…
Reference in New Issue