You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ce...@apache.org on 2015/03/01 20:56:56 UTC
svn commit: r1663153 - in /poi/trunk/src/ooxml: java/org/apache/poi/
java/org/apache/poi/openxml4j/opc/ java/org/apache/poi/xssf/usermodel/
testcases/org/apache/poi/xssf/usermodel/
Author: centic
Date: Sun Mar 1 19:56:56 2015
New Revision: 1663153
URL: http://svn.apache.org/r1663153
Log:
Bug 57165: Avoid PartAlreadyExistsException when removing/cloning sheets
Modified:
poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java
poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
Modified: poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java?rev=1663153&r1=1663152&r2=1663153&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java Sun Mar 1 19:56:56 2015
@@ -349,11 +349,27 @@ public class POIXMLDocumentPart {
* @param descriptor the part descriptor
* @param factory the factory that will create an instance of the requested relation
* @return the created child POIXMLDocumentPart
+ * @throws PartAlreadyExistsException
+ * If rule M1.12 is not verified : Packages shall not contain
+ * equivalent part names and package implementers shall neither
+ * create nor recognize packages with equivalent part names.
*/
public final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory){
return createRelationship(descriptor, factory, -1, false);
}
+ /**
+ * Create a new child POIXMLDocumentPart
+ *
+ * @param descriptor the part descriptor
+ * @param factory the factory that will create an instance of the requested relation
+ * @param idx part number
+ * @return the created child POIXMLDocumentPart
+ * @throws PartAlreadyExistsException
+ * If rule M1.12 is not verified : Packages shall not contain
+ * equivalent part names and package implementers shall neither
+ * create nor recognize packages with equivalent part names.
+ */
public final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx){
return createRelationship(descriptor, factory, idx, false);
}
@@ -366,6 +382,10 @@ public class POIXMLDocumentPart {
* @param idx part number
* @param noRelation if true, then no relationship is added.
* @return the created child POIXMLDocumentPart
+ * @throws PartAlreadyExistsException
+ * If rule M1.12 is not verified : Packages shall not contain
+ * equivalent part names and package implementers shall neither
+ * create nor recognize packages with equivalent part names.
*/
protected final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx, boolean noRelation){
try {
Modified: poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java?rev=1663153&r1=1663152&r2=1663153&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java Sun Mar 1 19:56:56 2015
@@ -739,7 +739,7 @@ public abstract class OPCPackage impleme
* @param contentType
* Part content type.
* @return The newly created part.
- * @throws InvalidFormatException
+ * @throws PartAlreadyExistsException
* If rule M1.12 is not verified : Packages shall not contain
* equivalent part names and package implementers shall neither
* create nor recognize packages with equivalent part names.
@@ -762,7 +762,7 @@ public abstract class OPCPackage impleme
* Specify if the existing relationship part, if any, logically
* associated to the newly created part will be loaded.
* @return The newly created part.
- * @throws InvalidFormatException
+ * @throws PartAlreadyExistsException
* If rule M1.12 is not verified : Packages shall not contain
* equivalent part names and package implementers shall neither
* create nor recognize packages with equivalent part names.
Modified: poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java?rev=1663153&r1=1663152&r2=1663153&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java Sun Mar 1 19:56:56 2015
@@ -228,8 +228,13 @@ public abstract class PackagePart implem
* Relationship unique id.
* @return The newly created and added relationship
*
+ * @throws InvalidOperationException
+ * If a writing operation is done on a read only package or
+ * invalid nested relations are created.
* @throws InvalidFormatException
* If the URI point to a relationship part URI.
+ * @throws IllegalArgumentException if targetPartName, targetMode
+ * or relationshipType are passed as null
* @see org.apache.poi.openxml4j.opc.RelationshipSource#addRelationship(org.apache.poi.openxml4j.opc.PackagePartName,
* org.apache.poi.openxml4j.opc.TargetMode, java.lang.String, java.lang.String)
*/
Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java?rev=1663153&r1=1663152&r2=1663153&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java Sun Mar 1 19:56:56 2015
@@ -751,8 +751,26 @@ public class XSSFWorkbook extends POIXML
CTSheet sheet = addSheet(sheetname);
int sheetNumber = 1;
- for(XSSFSheet sh : sheets) {
- sheetNumber = (int)Math.max(sh.sheet.getSheetId() + 1, sheetNumber);
+ outerloop:
+ while(true) {
+ for(XSSFSheet sh : sheets) {
+ sheetNumber = (int)Math.max(sh.sheet.getSheetId() + 1, sheetNumber);
+ }
+
+ // Bug 57165: We also need to check that the resulting file name is not already taken
+ // this can happen when moving/cloning sheets
+ String sheetName = XSSFRelation.WORKSHEET.getFileName(sheetNumber);
+ for(POIXMLDocumentPart relation : getRelations()) {
+ if(relation.getPackagePart() != null &&
+ sheetName.equals(relation.getPackagePart().getPartName().getName())) {
+ // name is taken => try next one
+ sheetNumber++;
+ continue outerloop;
+ }
+ }
+
+ // no duplicate found => use this one
+ break;
}
XSSFSheet wrapper = (XSSFSheet)createRelationship(XSSFRelation.WORKSHEET, XSSFFactory.getInstance(), sheetNumber);
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java?rev=1663153&r1=1663152&r2=1663153&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java Sun Mar 1 19:56:56 2015
@@ -17,8 +17,6 @@
package org.apache.poi.xssf.usermodel;
-import static org.junit.Assert.assertEquals;
-
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Calendar;
@@ -184,38 +182,6 @@ public final class TestUnfixedBugs exten
}
}
-
- @Test
- public void test57165() throws IOException {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx");
- try {
- removeAllSheetsBut(3, wb);
- wb.cloneSheet(0); // Throws exception here
- wb.setSheetName(1, "New Sheet");
- //saveWorkbook(wb, fileName);
-
- XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
- try {
-
- } finally {
- wbBack.close();
- }
- } finally {
- wb.close();
- }
- }
-
- private static void removeAllSheetsBut(int sheetIndex, Workbook wb)
- {
- int sheetNb = wb.getNumberOfSheets();
- // Move this sheet at the first position
- wb.setSheetOrder(wb.getSheetName(sheetIndex), 0);
- for (int sn = sheetNb - 1; sn > 0; sn--)
- {
- wb.removeSheetAt(sn);
- }
- }
-
// When this is fixed, the test case should go to BaseTestXCell with
// adjustments to use _testDataProvider to also verify this for XSSF
public void testBug57294() throws IOException {
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java?rev=1663153&r1=1663152&r2=1663153&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java Sun Mar 1 19:56:56 2015
@@ -2134,4 +2134,36 @@ public final class TestXSSFBugs extends
assertEquals("~CIRCULAR~REF~", FormulaError.forInt(value.getErrorValue()).getString());
assertEquals("CIRCULAR_REF", FormulaError.forInt(value.getErrorValue()).toString());
}
+
+
+ @Test
+ public void test57165() throws IOException {
+ XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx");
+ try {
+ removeAllSheetsBut(3, wb);
+ wb.cloneSheet(0); // Throws exception here
+ wb.setSheetName(1, "New Sheet");
+ //saveWorkbook(wb, fileName);
+
+ XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
+ try {
+
+ } finally {
+ wbBack.close();
+ }
+ } finally {
+ wb.close();
+ }
+ }
+
+ private static void removeAllSheetsBut(int sheetIndex, Workbook wb)
+ {
+ int sheetNb = wb.getNumberOfSheets();
+ // Move this sheet at the first position
+ wb.setSheetOrder(wb.getSheetName(sheetIndex), 0);
+ for (int sn = sheetNb - 1; sn > 0; sn--)
+ {
+ wb.removeSheetAt(sn);
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org