From 7b211912e2a16ebbbe0dc5025eca89c2f838bd9f Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Thu, 22 Sep 2011 10:26:33 +0000 Subject: [PATCH] Add a disabled test for bug #51850, and tweak the OPC package exceptions to make it easier to spot when a part name is already used git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1174045 13f79535-47bb-0310-9956-ffa450edef68 --- .../exceptions/InvalidOperationException.java | 6 +-- .../PartAlreadyExistsException.java | 31 ++++++++++++++ .../apache/poi/openxml4j/opc/OPCPackage.java | 3 +- .../poi/xssf/usermodel/XSSFDrawing.java | 3 +- .../TestOPCCompliancePackageModel.java | 6 +-- .../poi/xssf/usermodel/TestXSSFBugs.java | 39 +++++++++++++++++- test-data/spreadsheet/51850.xlsx | Bin 0 -> 11776 bytes 7 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 src/ooxml/java/org/apache/poi/openxml4j/exceptions/PartAlreadyExistsException.java create mode 100644 test-data/spreadsheet/51850.xlsx diff --git a/src/ooxml/java/org/apache/poi/openxml4j/exceptions/InvalidOperationException.java b/src/ooxml/java/org/apache/poi/openxml4j/exceptions/InvalidOperationException.java index 814edd117..a2538a6d1 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/exceptions/InvalidOperationException.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/exceptions/InvalidOperationException.java @@ -19,13 +19,9 @@ package org.apache.poi.openxml4j.exceptions; /** * Throw when an invalid operation is done. - * - * @author Julien Chable - * @version 1.0 */ @SuppressWarnings("serial") -public final class InvalidOperationException extends OpenXML4JRuntimeException{ - +public class InvalidOperationException extends OpenXML4JRuntimeException{ public InvalidOperationException(String message){ super(message); } diff --git a/src/ooxml/java/org/apache/poi/openxml4j/exceptions/PartAlreadyExistsException.java b/src/ooxml/java/org/apache/poi/openxml4j/exceptions/PartAlreadyExistsException.java new file mode 100644 index 000000000..e469ace56 --- /dev/null +++ b/src/ooxml/java/org/apache/poi/openxml4j/exceptions/PartAlreadyExistsException.java @@ -0,0 +1,31 @@ +/* ==================================================================== + 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.openxml4j.exceptions; + +import org.apache.poi.openxml4j.opc.PackagePart; + +/** + * Throw when trying to create a {@link PackagePart} but one + * already exists with that name. + */ +@SuppressWarnings("serial") +public final class PartAlreadyExistsException extends InvalidOperationException { + public PartAlreadyExistsException(String message){ + super(message); + } +} diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java index 6ec685cb4..541700a13 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java @@ -40,6 +40,7 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.exceptions.InvalidOperationException; import org.apache.poi.openxml4j.exceptions.OpenXML4JException; import org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException; +import org.apache.poi.openxml4j.exceptions.PartAlreadyExistsException; import org.apache.poi.openxml4j.opc.internal.ContentType; import org.apache.poi.openxml4j.opc.internal.ContentTypeManager; import org.apache.poi.openxml4j.opc.internal.PackagePropertiesPart; @@ -716,7 +717,7 @@ public abstract class OPCPackage implements RelationshipSource, Closeable { // Check if the specified part name already exists if (partList.containsKey(partName) && !partList.get(partName).isDeleted()) { - throw new InvalidOperationException( + throw new PartAlreadyExistsException( "A part with the name '" + partName.getName() + "' already exists : Packages shall not contain equivalent part names and package implementers shall neither create nor recognize packages with equivalent part names. [M1.12]"); diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java index 446e0ecea..803fdf014 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java @@ -37,15 +37,14 @@ import org.apache.poi.util.Internal; import org.apache.poi.xssf.model.CommentsTable; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlOptions; -import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTConnector; import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTDrawing; +import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTGraphicalObjectFrame; import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTGroupShape; import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTPicture; import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTShape; import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTTwoCellAnchor; import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.STEditAs; -import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTGraphicalObjectFrame; import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId; /** diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCCompliancePackageModel.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCCompliancePackageModel.java index e3c54f367..a39edd3a6 100644 --- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCCompliancePackageModel.java +++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCCompliancePackageModel.java @@ -17,20 +17,20 @@ package org.apache.poi.openxml4j.opc.compliance; -import java.io.File; import java.io.IOException; import junit.framework.TestCase; +import org.apache.poi.POIDataSamples; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.exceptions.InvalidOperationException; +import org.apache.poi.openxml4j.exceptions.PartAlreadyExistsException; import org.apache.poi.openxml4j.opc.ContentTypes; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePartName; import org.apache.poi.openxml4j.opc.PackageRelationshipTypes; import org.apache.poi.openxml4j.opc.PackagingURIHelper; import org.apache.poi.openxml4j.opc.TargetMode; -import org.apache.poi.POIDataSamples; /** * Test Open Packaging Convention package model compliance. @@ -102,7 +102,7 @@ public class TestOPCCompliancePackageModel extends TestCase { pkg.createPart(name1, ContentTypes.XML); try { pkg.createPart(name2, ContentTypes.XML); - } catch (InvalidOperationException e) { + } catch (PartAlreadyExistsException e) { return; } fail("Packages shall not contain equivalent part names and package implementers shall neither create nor recognize packages with equivalent part names. [M1.12]"); diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index 364e4120d..045e043fc 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -23,7 +23,6 @@ import java.util.List; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.hssf.util.PaneInformation; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackagingURIHelper; @@ -31,7 +30,11 @@ import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellValue; +import org.apache.poi.ss.usermodel.ClientAnchor; +import org.apache.poi.ss.usermodel.Comment; +import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.DataFormatter; +import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.FormulaError; import org.apache.poi.ss.usermodel.FormulaEvaluator; @@ -1169,4 +1172,38 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { assertEquals(rels0.get(0).getPackageRelationship(), rels1.get(0).getPackageRelationship()); } + + /** + * Add comments to Sheet 1, when Sheet 2 already has + * comments (so /xl/comments1.xml is taken) + */ + public void DISABLEDtest51850() { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51850.xlsx"); + XSSFSheet sh1 = wb.getSheetAt(0); + XSSFSheet sh2 = wb.getSheetAt(1); + + // Sheet 2 has comments + assertNotNull(sh2.getCommentsTable(false)); + + // Sheet 1 doesn't (yet) + assertNull(sh1.getCommentsTable(false)); + + // Try to add comments to Sheet 1 + CreationHelper factory = wb.getCreationHelper(); + Drawing drawing = sh1.createDrawingPatriarch(); + + ClientAnchor anchor = factory.createClientAnchor(); + anchor.setCol1(0); + anchor.setCol2(4); + anchor.setRow1(0); + anchor.setRow2(1); + + Comment excelComment = drawing.createCellComment(anchor); + excelComment.setString( + factory.createRichTextString("I like this cell. It's my favourite.")); + excelComment.setAuthor("Bob T. Fish"); + + Cell c = sh1.getRow(0).getCell(4); + c.setCellComment(excelComment); + } } diff --git a/test-data/spreadsheet/51850.xlsx b/test-data/spreadsheet/51850.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c04129afe4fb2aa4d8d6422493751b0200077f7b GIT binary patch literal 11776 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 &e?f($d9DtAXse=LtzayUbkDI@g2^(nHiK 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 QRl@-If&)V*h96J=4|0qx_5c6? literal 0 HcmV?d00001