]> source.dussan.org Git - poi.git/commitdiff
Fix bug #56800 - Provide a helpful exception, XLSBUnsupportedException, if XSSFWorkbo...
authorNick Burch <nick@apache.org>
Fri, 1 Aug 2014 14:33:17 +0000 (14:33 +0000)
committerNick Burch <nick@apache.org>
Fri, 1 Aug 2014 14:33:17 +0000 (14:33 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1615118 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/OldFileFormatException.java
src/java/org/apache/poi/UnsupportedFileFormatException.java [new file with mode: 0644]
src/ooxml/java/org/apache/poi/xssf/XLSBUnsupportedException.java [new file with mode: 0644]
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
test-data/spreadsheet/Simple.xlsb [new file with mode: 0644]

index abcdc97103b254b900ba9fc8e1f296fb9f271cc9..3c01f5459eb42109ca653dcf6102a4c2a66dcf26 100644 (file)
@@ -20,8 +20,10 @@ package org.apache.poi;
  * Base class of all the exceptions that POI throws in the event
  * that it's given a file that's older than currently supported.
  */
-public abstract class OldFileFormatException extends IllegalArgumentException {
-       public OldFileFormatException(String s) {
+public abstract class OldFileFormatException extends UnsupportedFileFormatException {
+    private static final long serialVersionUID = 7849681804154571175L;
+
+    public OldFileFormatException(String s) {
                super(s);
        }
 }
\ No newline at end of file
diff --git a/src/java/org/apache/poi/UnsupportedFileFormatException.java b/src/java/org/apache/poi/UnsupportedFileFormatException.java
new file mode 100644 (file)
index 0000000..a8caebb
--- /dev/null
@@ -0,0 +1,29 @@
+/* ====================================================================
+   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;
+
+/**
+ * Base class of all the exceptions that POI throws in the event
+ * that it's given a file that isn't supported
+ */
+public abstract class UnsupportedFileFormatException extends IllegalArgumentException {
+    private static final long serialVersionUID = -8281969197282030046L;
+
+    public UnsupportedFileFormatException(String s) {
+               super(s);
+       }
+}
\ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/xssf/XLSBUnsupportedException.java b/src/ooxml/java/org/apache/poi/xssf/XLSBUnsupportedException.java
new file mode 100644 (file)
index 0000000..6326027
--- /dev/null
@@ -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.xssf;
+
+import org.apache.poi.UnsupportedFileFormatException;
+
+/**
+ * We don't support .xlsb files, sorry
+ */
+public class XLSBUnsupportedException extends UnsupportedFileFormatException {
+    private static final long serialVersionUID = 7849681804154571175L;
+    public static final String MESSAGE = ".XLSB Binary Workbooks are not supported"; 
+
+    public XLSBUnsupportedException() {
+               super(MESSAGE);
+       }
+}
\ No newline at end of file
index 213f739fea8c8085afc1f1dd0327eb352028302c..27caf13e5a4d5c697f60789d9056ea94fc4cadcf 100644 (file)
@@ -81,7 +81,6 @@ public final class XSSFRelation extends POIXMLRelation {
         "/xl/workbook.xml",
         null
     );
-
     public static final XSSFRelation MACRO_ADDIN_WORKBOOK = new XSSFRelation(
         "application/vnd.ms-excel.addin.macroEnabled.main+xml",
         PackageRelationshipTypes.CORE_DOCUMENT,
@@ -89,6 +88,13 @@ public final class XSSFRelation extends POIXMLRelation {
         null
     );
 
+    public static final XSSFRelation XLSB_BINARY_WORKBOOK = new XSSFRelation(
+            "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
+            PackageRelationshipTypes.CORE_DOCUMENT,
+            "/xl/workbook.bin",
+            null
+        );
+
     public static final XSSFRelation WORKSHEET = new XSSFRelation(
         "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
         "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",
index a502028e9421aeb9b941e649ed6ddc2b78f4a217..60e1ea415ebd696e5615baa0a9bf3d44bf911764 100644 (file)
@@ -63,6 +63,7 @@ import org.apache.poi.util.Internal;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 import org.apache.poi.util.PackageHelper;
+import org.apache.poi.xssf.XLSBUnsupportedException;
 import org.apache.poi.xssf.model.CalculationChain;
 import org.apache.poi.xssf.model.ExternalLinksTable;
 import org.apache.poi.xssf.model.MapInfo;
@@ -228,8 +229,10 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
      */
     public XSSFWorkbook(OPCPackage pkg) throws IOException {
         super(pkg);
-
-        //build a tree of POIXMLDocumentParts, this workbook being the root
+        
+        beforeDocumentRead();
+        
+        // Build a tree of POIXMLDocumentParts, this workbook being the root
         load(XSSFFactory.getInstance());
     }
 
@@ -250,7 +253,9 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
     public XSSFWorkbook(InputStream is) throws IOException {
         super(PackageHelper.open(is));
 
-        //build a tree of POIXMLDocumentParts, this workbook being the root
+        beforeDocumentRead();
+        
+        // Build a tree of POIXMLDocumentParts, this workbook being the root
         load(XSSFFactory.getInstance());
     }
 
@@ -286,6 +291,17 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
     public XSSFWorkbook(String path) throws IOException {
         this(openPackage(path));
     }
+    
+    protected void beforeDocumentRead() {
+        // Ensure it isn't a XLSB file, which we don't support
+        if (getCorePart().getContentType().equals(XSSFRelation.XLSB_BINARY_WORKBOOK.getContentType())) {
+            throw new XLSBUnsupportedException();
+        }
+
+        // Create arrays for parts attached to the workbook itself
+        pivotTables = new ArrayList<XSSFPivotTable>();
+        pivotCaches = new ArrayList<CTPivotCache>();
+    }
 
     @Override
     @SuppressWarnings("deprecation") //  getXYZArray() array accessors are deprecated
@@ -1869,12 +1885,6 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
 
     @Beta
     public List<XSSFPivotTable> getPivotTables() {
-        // Lazy create the list. It gets populated with existing ones on sheet setup
-        if (pivotTables == null) {
-            pivotTables = new ArrayList<XSSFPivotTable>();
-            pivotCaches = new ArrayList<CTPivotCache>();
-        }
-
         return pivotTables;
     }
 
index f33b3459160ec576958713c570e4d27d889f7b97..dd5e0505e993b378ae3ae7b96e8419175b46cb88 100644 (file)
@@ -74,6 +74,7 @@ import org.apache.poi.ss.util.AreaReference;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.util.TempFile;
+import org.apache.poi.xssf.XLSBUnsupportedException;
 import org.apache.poi.xssf.XSSFITestDataProvider;
 import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.apache.poi.xssf.model.CalculationChain;
@@ -1844,6 +1845,41 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
         cRef = sheet.getRow(4).getCell(1);
         assertEquals("A4", cRef.getCellFormula());
     }
+    
+    /**
+     * .xlsb files are not supported, but we should generate a helpful
+     *  error message if given one
+     */
+    @Test
+    public void bug56800_xlsb() throws Exception {
+        // Can be opened at the OPC level
+        OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("Simple.xlsb");
+        
+        // XSSF Workbook gives helpful error
+        try {
+            new XSSFWorkbook(pkg);
+            fail(".xlsb files not supported");
+        } catch (XLSBUnsupportedException e) {
+            // Good, detected and warned
+        }
+        
+        // Workbook Factory gives helpful error on package
+        try {
+            WorkbookFactory.create(pkg);
+            fail(".xlsb files not supported");
+        } catch (XLSBUnsupportedException e) {
+            // Good, detected and warned
+        }
+        
+        // Workbook Factory gives helpful error on file
+        File xlsbFile = HSSFTestDataSamples.getSampleFile("Simple.xlsb");
+        try {
+            WorkbookFactory.create(xlsbFile);
+            fail(".xlsb files not supported");
+        } catch (XLSBUnsupportedException e) {
+            // Good, detected and warned
+        }
+    }
 
     private void checkValue(XSSFWorkbook excel, String expect) {
         XSSFFormulaEvaluator evaluator = new XSSFFormulaEvaluator(excel);
diff --git a/test-data/spreadsheet/Simple.xlsb b/test-data/spreadsheet/Simple.xlsb
new file mode 100644 (file)
index 0000000..78fdf26
Binary files /dev/null and b/test-data/spreadsheet/Simple.xlsb differ