From 349b14f8379ee7e81cebe77cb3a9ad932759b473 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Tue, 29 Mar 2016 17:30:55 +0000 Subject: [PATCH] Bug 58915: Add note about memory consumption and update changelog git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1737025 13f79535-47bb-0310-9956-ffa450edef68 --- .classpath | 8 +- OOXMLLite.launch | 13 +++ OOXMLPrettyPrint.launch | 12 +++ rerun.sh | 1 + run.sh | 26 +++++ sonar/run.sh | 7 ++ src/integrationtest/integrationtest.iml | 86 ++++++++++++++++ .../apache/poi/stress/HPSFFileHandler.java | 12 +-- src/integrationtest/run.sh | 26 +++++ src/java/java.iml | 62 ++++++++++++ .../org/apache/poi/poifs/dev/POIFSDump.java | 2 +- .../usermodel/XSSFPivotCacheDefinition.java | 14 ++- .../apache/poi/xssf/usermodel/XSSFSheet.java | 95 ++++++++++++++++-- .../xssf/usermodel/TestXSSFPivotTable.java | 53 +++++++++- .../converter/TestWordToConverterSuite.java | 4 +- .../org/apache/poi/hpsf/TestPropertySet.java | 41 ++++++++ .../poi/hssf/usermodel/TestCellStyle.java | 22 ++++ test-data/document/52372.doc | Bin 0 -> 87040 bytes view.sh | 3 + 19 files changed, 458 insertions(+), 29 deletions(-) create mode 100644 OOXMLLite.launch create mode 100644 OOXMLPrettyPrint.launch create mode 100644 rerun.sh create mode 100644 run.sh create mode 100644 sonar/run.sh create mode 100644 src/integrationtest/integrationtest.iml create mode 100644 src/integrationtest/run.sh create mode 100644 src/java/java.iml create mode 100644 src/testcases/org/apache/poi/hpsf/TestPropertySet.java create mode 100644 test-data/document/52372.doc create mode 100644 view.sh diff --git a/.classpath b/.classpath index 5a7d21738b..ac2f3e8070 100644 --- a/.classpath +++ b/.classpath @@ -18,9 +18,9 @@ - - - + + + @@ -31,5 +31,5 @@ - + diff --git a/OOXMLLite.launch b/OOXMLLite.launch new file mode 100644 index 0000000000..e85d008217 --- /dev/null +++ b/OOXMLLite.launch @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/OOXMLPrettyPrint.launch b/OOXMLPrettyPrint.launch new file mode 100644 index 0000000000..d5420dc18f --- /dev/null +++ b/OOXMLPrettyPrint.launch @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/rerun.sh b/rerun.sh new file mode 100644 index 0000000000..980b91e1d8 --- /dev/null +++ b/rerun.sh @@ -0,0 +1 @@ +ant clean && ant compile-all jar test-all diff --git a/run.sh b/run.sh new file mode 100644 index 0000000000..14befa1cfc --- /dev/null +++ b/run.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +# integration-tests fail: https://bitbucket.org/fakraemer/line-break-measurer-test/src/dc8e619063a4?at=master +#JAVA_HOME=/devtools/jdk1.6.0_45 + +#JAVA_HOME=/devtools/jdk1.7.0_76_x64 +JAVA_HOME=/devtools/jdk1.8.0_66_x64 +export JAVA_HOME + +ANT_HOME=/devtools/apache-ant-1.9.4 +export ANT_HOME + +PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH +export PATH + +FORREST_HOME=/devtools/apache-forrest-0.5.1-bin +export FORREST_HOME + +ANT_OPTS="-Xmx2048m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/workspaces" +export ANT_OPTS + +rm -f build/*-testokfile.txt + +# -Dadditionaljar=lib/xercesImpl-2.6.1.jar +# -Dmain.docs.notRequired=true +nice -n 19 /devtools/apache-ant-1.9.6/bin/ant -Dcoverage.enabled=false $* diff --git a/sonar/run.sh b/sonar/run.sh new file mode 100644 index 0000000000..e8b9631029 --- /dev/null +++ b/sonar/run.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +# -s /x1/jenkins/jenkins-master/catalina-base/temp/settings7837234259678677409.xml +mvn -B -f /workspaces/poi/sonar/pom.xml -Dmaven.repo.local=/workspaces/poi/sonar/repo clean install -U -DskipTests -fae -B && \ +mvn -f /workspaces/poi/sonar/pom.xml -e -B org.codehaus.mojo:sonar-maven-plugin:2.6:sonar -Dsonar.jdbc.driver=com.mysql.jdbc.Driver \ + "-Dsonar.jdbc.url=jdbc:mysql://192.168.0.64:3306/sonar?useUnicode=true&characterEncoding=utf8" \ + -Dsonar.host.url=http://localhost:9090 -Dmaven.repo.local=/workspaces/poi/sonar/repo diff --git a/src/integrationtest/integrationtest.iml b/src/integrationtest/integrationtest.iml new file mode 100644 index 0000000000..0566aa3491 --- /dev/null +++ b/src/integrationtest/integrationtest.iml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java b/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java index 6a84201b45..69039e3c0e 100644 --- a/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java +++ b/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java @@ -39,17 +39,15 @@ public class HPSFFileHandler extends POIFSFileHandler { // a test-case to test this locally without executing the full TestAllFiles @Test public void test() throws Exception { - InputStream stream = new FileInputStream("test-data/hpsf/Test0313rur.adm"); + File file = new File("test-data/document/52372.doc"); + + InputStream stream = new FileInputStream(file); try { handleFile(stream); } finally { stream.close(); } - } - // a test-case to test this locally without executing the full TestAllFiles - @Test - public void testExtractor() throws Exception { - handleExtracting(new File("test-data/hpsf/TestBug44375.xls")); - } + handleExtracting(file); + } } diff --git a/src/integrationtest/run.sh b/src/integrationtest/run.sh new file mode 100644 index 0000000000..2676981f8f --- /dev/null +++ b/src/integrationtest/run.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +# integration-tests fail: https://bitbucket.org/fakraemer/line-break-measurer-test/src/dc8e619063a4?at=master +#JAVA_HOME=/devtools/jdk1.6.0_45 + +#JAVA_HOME=/devtools/jdk1.7.0_76_x64 +JAVA_HOME=/devtools/jdk1.8.0_66_x64 +export JAVA_HOME + +ANT_HOME=/devtools/apache-ant-1.9.4 +export ANT_HOME + +PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH +export PATH + +FORREST_HOME=/devtools/apache-forrest-0.5.1-bin +export FORREST_HOME + +ANT_OPTS="-Xmx1524m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/workspaces" +export ANT_OPTS + +#rm -f build/*-testokfile.txt + +# -Dadditionaljar=lib/xercesImpl-2.6.1.jar +# -Dmain.docs.notRequired=true +nice -n 19 /devtools/apache-ant-1.9.6/bin/ant -Dcoverage.enabled=false $* diff --git a/src/java/java.iml b/src/java/java.iml new file mode 100644 index 0000000000..cf5c2eee31 --- /dev/null +++ b/src/java/java.iml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/java/org/apache/poi/poifs/dev/POIFSDump.java b/src/java/org/apache/poi/poifs/dev/POIFSDump.java index f8c00365ac..1afb7bfefd 100644 --- a/src/java/org/apache/poi/poifs/dev/POIFSDump.java +++ b/src/java/org/apache/poi/poifs/dev/POIFSDump.java @@ -67,7 +67,7 @@ public class POIFSDump { is.close(); DirectoryEntry root = fs.getRoot(); - File file = new File(root.getName()); + File file = new File(new File(args[i]).getName() + "-" + root.getName()); file.mkdir(); dump(root, file); diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheDefinition.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheDefinition.java index c611e13e38..f5c65e92ab 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheDefinition.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheDefinition.java @@ -111,6 +111,17 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{ //Sets the pivotCacheDefinition tag xmlOptions.setSaveSyntheticDocumentElement(new QName(CTPivotCacheDefinition.type.getName(). getNamespaceURI(), "pivotCacheDefinition")); + + // ensure the fields have names + if(ctPivotCacheDefinition.getCacheFields() != null) { + CTCacheFields cFields = ctPivotCacheDefinition.getCacheFields(); + for(CTCacheField cf : cFields.getCacheFieldArray()) { + if(cf.getName() == null || cf.getName().isEmpty()) { + cf.setName("A"); + } + } + } + ctPivotCacheDefinition.save(out, xmlOptions); out.close(); } @@ -144,7 +155,8 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{ cf.setNumFmtId(0); Cell cell = row.getCell(i); cell.setCellType(Cell.CELL_TYPE_STRING); - cf.setName(row.getCell(i).getStringCellValue()); + String stringCellValue = cell.getStringCellValue(); + cf.setName(stringCellValue); cf.addNewSharedItems(); } } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index f0103719c1..d1edf6d0b5 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -2902,15 +2902,16 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { // we need to sort it in a way so the shifting does not mess up the structures, // i.e. when shifting down, start from down and go up, when shifting up, vice-versa SortedMap commentsToShift = new TreeMap(new Comparator() { - public int compare(XSSFComment o1, XSSFComment o2) { - int row1 = o1.getRow(); - int row2 = o2.getRow(); - - if(row1 == row2) { - // ordering is not important when row is equal, but don't return zero to still - // get multiple comments per row into the map - return o1.hashCode() - o2.hashCode(); - } + @Override + public int compare(XSSFComment o1, XSSFComment o2) { + int row1 = o1.getRow(); + int row2 = o2.getRow(); + + if(row1 == row2) { + // ordering is not important when row is equal, but don't return zero to still + // get multiple comments per row into the map + return o1.hashCode() - o2.hashCode(); + } // when shifting down, sort higher row-values first if(n > 0) { @@ -2986,6 +2987,78 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { map.put(r.getRowNum(), r); } _rows = map; + + // bug 57423: also re-order sheetdatamap + CTSheetData sheetData = worksheet.getSheetData(); + SortedMap ctmap = new TreeMap(); + for(CTRow row : sheetData.getRowArray()) { + System.out.println("Having row " + row.getR()); + ctmap.put(row.getR(), row); + } + /*Node domNode = sheetData.getDomNode(); + NodeList childNodes = domNode.getChildNodes(); + System.out.println("Had: " + childNodes.getLength() + ": " + childNodes); + for(int i = 0;i < childNodes.getLength();i++) { + Node item = childNodes.item(i); + System.out.println("Had: " + i + ": " + item); + }*/ + + //CTRow[] ctArray = new CTRow[ctmap.size()]; + /*int rowNum = 0; + int arrayIdx = 0; + for(CTRow row : ctmap.values()) { + if(row.getR() != (rowNum+1)) { + // XMLBeans releases any previous object in the setters, so we need to + // use new objects all the time + CTRow newRow = (CTRow) row.copy(); + + // we have to copy the Cells as well here as they are not included by + // the copy() and would be invalidated otherwise! + + XSSFRow xRow = _rows.get((int)row.getR()-1); + int cellCount = 0; + for (int cellNum = xRow.getFirstCellNum();cellNum < xRow.getLastCellNum();cellNum++) { + XSSFCell xssfCell = xRow.getCell(cellNum); + if(xssfCell == null) { + continue; + } + xssfCell.setCTCell(newRow.getCArray(cellCount)); + + cellCount++; + } + + CTCell[] cArray = new CTCell[cellCount]; + int i = 0; + for (int cellNum = xRow.getFirstCellNum();cellNum < xRow.getLastCellNum();cellNum++) { + XSSFCell xssfCell = xRow.getCell(cellNum); + if(xssfCell != null) { + cArray[i] = (CTCell) xssfCell.getCTCell().copy(); + i++; + + // we have to copy and re-create the XSSFCell here because the + // elements as otherwise setCArray below invalidates all the columns! + // see Bug 56170, XMLBeans seems to always release previous objects + // in the CArray, so we need to provide completely new ones here! + //_cells.put(entry.getKey(), new XSSFCell(this, cArray[i])); + xssfCell.setCTCell(cArray[cellNum]); + } + cellNum++; + } + + newRow.setCArray(cArray); + + sheetData.setRowArray(rowNum, row); + } + rowNum++; + }*/ + //sheetData.setRowArray(ctArray); + + /*CTRow row13 = (CTRow) sheetData.getRowArray(10).copy(); + CTRow row12 = (CTRow) sheetData.getRowArray(11).copy(); + sheetData.setRowArray(10, row12); + sheetData.setRowArray(11, row13);*/ + + //sheetData.getRowList() } private int shiftedRowNum(int startRow, int endRow, int n, int rownum) { @@ -3498,6 +3571,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { safeGetProtectionField().setSheet(false); } + /** * Enable or disable Autofilters locking. * This does not modify sheet protection status. @@ -3725,6 +3799,8 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { return dataValidationHelper; } + @Override + @SuppressWarnings("deprecation") //YK: getXYZArray() array accessors are deprecated in xmlbeans with JDK 1.5 support public List getDataValidations() { List xssfValidations = new ArrayList(); CTDataValidations dataValidations = this.worksheet.getDataValidations(); @@ -4100,6 +4176,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { return tables; } + @Override public int getColumnOutlineLevel(int columnIndex) { CTCol col = columnHelper.getColumn(columnIndex, false); if (col == null) { diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTable.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTable.java index 861984fd57..60d334667e 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTable.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTable.java @@ -24,11 +24,12 @@ import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.AreaReference; import org.apache.poi.ss.util.CellReference; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageField; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageFields; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotFields; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotTableDefinition; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataConsolidateFunction; +import org.apache.poi.xssf.XSSFTestDataSamples; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.*; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.util.List; public class TestXSSFPivotTable extends TestCase { private XSSFPivotTable pivotTable; @@ -268,4 +269,46 @@ public class TestXSSFPivotTable extends TestCase { } fail(); } + + public void test58294() throws Exception { + XSSFWorkbook wb = new XSSFWorkbook ("C:\\temp\\test1.xlsx"); + XSSFSheet sheet = wb.getSheetAt(1); + XSSFSheet sheet0 = wb.getSheetAt(0); + sheet0.setActiveCell("A4"); + XSSFPivotTable pivotTable = sheet0.createPivotTable(new AreaReference("A3:H6"), new CellReference("A4"), sheet); + pivotTable.addRowLabel(1); + pivotTable.addRowLabel(3); + pivotTable.addRowLabel(5); + pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 6, "Sum of days with hauls"); + pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 7, "Sum of days site cutoff"); + //checkPivotTables(wb); + FileOutputStream fileOut = new FileOutputStream("c:\\temp\\test2new.xlsx"); + try { + wb.write(fileOut); + } finally { + fileOut.close(); + } + + XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb); + //checkPivotTables(wbBack); + + wb.close(); + } + + private void checkPivotTables(XSSFWorkbook wb) { + final List pivotTables = wb.getSheetAt(0).getPivotTables(); + assertNotNull(pivotTables); + assertEquals(3, pivotTables.size()); + final XSSFPivotTable pivotTable = pivotTables.get(2); + checkPivotTable(pivotTable); + } + + private void checkPivotTable(XSSFPivotTable pivotTableBack) { + assertNotNull(pivotTableBack.getPivotCacheDefinition()); + assertNotNull(pivotTableBack.getPivotCacheDefinition().getCTPivotCacheDefinition()); + final CTCacheFields cacheFields = pivotTableBack.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields(); + assertNotNull(cacheFields); + assertEquals(8, cacheFields.sizeOfCacheFieldArray()); + assertEquals("A", cacheFields.getCacheFieldList().get(0).getName()); + } } diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/converter/TestWordToConverterSuite.java b/src/scratchpad/testcases/org/apache/poi/hwpf/converter/TestWordToConverterSuite.java index 77a75a1937..6205e50b79 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/converter/TestWordToConverterSuite.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/converter/TestWordToConverterSuite.java @@ -20,6 +20,7 @@ import java.io.File; import java.io.FilenameFilter; import java.io.StringWriter; import java.util.Arrays; +import java.util.Collections; import java.util.List; import javax.xml.transform.OutputKeys; @@ -41,8 +42,7 @@ public class TestWordToConverterSuite /** * YK: a quick hack to exclude failing documents from the suite. */ - private static List failingFiles = Arrays - .asList( "ProblemExtracting.doc" ); + private static List failingFiles = Collections.singletonList("ProblemExtracting.doc"); public static Test suite() { diff --git a/src/testcases/org/apache/poi/hpsf/TestPropertySet.java b/src/testcases/org/apache/poi/hpsf/TestPropertySet.java new file mode 100644 index 0000000000..be8b16d4a6 --- /dev/null +++ b/src/testcases/org/apache/poi/hpsf/TestPropertySet.java @@ -0,0 +1,41 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.hpsf; + +import org.apache.poi.POIDataSamples; +import org.apache.poi.poifs.filesystem.DocumentInputStream; +import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; + +public class TestPropertySet { + @Test + public void test52372() throws IOException, NoPropertySetStreamException, MarkUnsupportedException, UnexpectedPropertySetTypeException { + NPOIFSFileSystem poifs = new NPOIFSFileSystem(POIDataSamples.getDocumentInstance().getFile("52372.doc")); + + DocumentInputStream dis = poifs.createDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME); + PropertySet ps = new PropertySet(dis); + SummaryInformation si = new SummaryInformation(ps); + dis.close(); + + assertNotNull(si); + } +} diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestCellStyle.java b/src/testcases/org/apache/poi/hssf/usermodel/TestCellStyle.java index 8d7fd012a6..151bed3c14 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestCellStyle.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestCellStyle.java @@ -20,6 +20,7 @@ package org.apache.poi.hssf.usermodel; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.util.Calendar; import java.util.Date; @@ -544,4 +545,25 @@ public final class TestCellStyle extends TestCase { wb.close(); } + + + @Test + public void test58607() throws IOException { + HSSFWorkbook wb = new HSSFWorkbook(); + HSSFCellStyle style = wb.createCellStyle(); + + style.setDataFormat(wb.createDataFormat().getFormat("dd/MM/yyyy HH:mm:ss")); + + final Cell cell = wb.createSheet("test").createRow(0).createCell(0); + cell.setCellType(Cell.CELL_TYPE_NUMERIC); + cell.setCellStyle(style); + cell.setCellValue(new Date()); + + OutputStream out = new FileOutputStream("C:\\temp\\58607.xls"); + try { + wb.write(out); + } finally { + out.close(); + } + } } diff --git a/test-data/document/52372.doc b/test-data/document/52372.doc new file mode 100644 index 0000000000000000000000000000000000000000..ddaaf5ee9e07f5752cffa47968e73a1df155edef GIT binary patch literal 87040 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