| /* ==================================================================== |
| 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.stress; |
| |
| import static org.junit.jupiter.api.Assertions.assertNotNull; |
| import static org.junit.jupiter.api.Assumptions.assumeFalse; |
| |
| import java.io.BufferedInputStream; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.util.zip.ZipException; |
| |
| import org.apache.poi.EncryptedDocumentException; |
| import org.apache.poi.OldFileFormatException; |
| import org.apache.poi.poifs.filesystem.OfficeXmlFileException; |
| |
| /** |
| * This class is used for mass-regression testing via a |
| * separate project, this class provides functionality to |
| * run integration tests on one file and handle some |
| * types of files/exceptions, e.g. old file formats. |
| * |
| */ |
| public class BaseIntegrationTest { |
| private final File rootDir; |
| private final String file; |
| private FileHandler handler; |
| |
| public BaseIntegrationTest(File rootDir, String file, FileHandler handler) { |
| this.rootDir = rootDir; |
| this.file = file; |
| this.handler = handler; |
| } |
| |
| /** |
| * Keep this public so it can be used by the regression-tests |
| */ |
| public void test() throws Exception { |
| assertNotNull( handler, "Unknown file extension for file: " + file ); |
| testOneFile(new File(rootDir, file)); |
| } |
| |
| protected void testOneFile(File inputFile) throws Exception { |
| try { |
| handleFile(inputFile); |
| } catch (OfficeXmlFileException e) { |
| // switch XWPF and HWPF and so forth depending on the error message |
| handleWrongOLE2XMLExtension(inputFile, e); |
| } catch (OldFileFormatException e) { |
| // Not even text extraction is supported for these: handler.handleExtracting(inputFile); |
| assumeFalse( true, "File " + file + " excluded because it is an unsupported old format" ); |
| } catch (EncryptedDocumentException e) { |
| // Do not try to read encrypted files |
| assumeFalse( true, "File " + file + " excluded because it is password-encrypted" ); |
| } catch (ZipException e) { |
| // some files are corrupted |
| if (e.getMessage().equals("unexpected EOF") || e.getMessage().equals("Truncated ZIP file")) { |
| assumeFalse( true, "File " + file + " excluded because the Zip file is incomplete" ); |
| } |
| |
| throw e; |
| } catch (IOException e) { |
| // ignore some other ways of corrupted files |
| String message = e.getMessage(); |
| if(message != null && message.contains("Truncated ZIP file")) { |
| assumeFalse( true, "File " + file + " excluded because the Zip file is incomplete" ); |
| } |
| |
| // sometimes binary format has XML-format-extension... |
| if(message != null && message.contains("rong file format or file extension for OO XML file")) { |
| handleWrongOLE2XMLExtension(inputFile, e); |
| return; |
| } |
| |
| throw e; |
| } catch (IllegalArgumentException e) { |
| // ignore errors for documents with incorrect extension |
| String message = e.getMessage(); |
| if(message != null && (message.equals("The document is really a RTF file") || |
| message.equals("The document is really a PDF file") || |
| message.equals("The document is really a HTML file"))) { |
| assumeFalse( true, "File " + file + " excluded because it is actually a PDF/RTF/HTML file" ); |
| } |
| |
| if(message != null && message.equals("The document is really a OOXML file")) { |
| handleWrongOLE2XMLExtension(inputFile, e); |
| return; |
| } |
| |
| throw e; |
| } |
| |
| try { |
| handler.handleExtracting(inputFile); |
| } catch (EncryptedDocumentException e) { |
| // Do not try to read encrypted files |
| assumeFalse( true, "File " + file + " excluded because it is password-encrypted" ); |
| } |
| } |
| |
| void handleWrongOLE2XMLExtension(File inputFile, Exception e) throws Exception { |
| // we sometimes have wrong extensions, so for some exceptions we try to handle it |
| // with the correct FileHandler instead |
| String message = e.getMessage(); |
| |
| // ignore some file-types that we do not want to handle here |
| assumeFalse( message != null && (message.equals("The document is really a RTF file") || |
| message.equals("The document is really a PDF file") || |
| message.equals("The document is really a HTML file")), "File " + file + " excluded because it is actually a PDF/RTF/HTML file" ); |
| |
| if(message != null && (message.equals("The document is really a XLS file"))) { |
| handler = new HSSFFileHandler(); |
| } else if(message != null && (message.equals("The document is really a PPT file"))) { |
| handler = new HSLFFileHandler(); |
| } else if(message != null && (message.equals("The document is really a DOC file"))) { |
| handler = new HWPFFileHandler(); |
| } else if(message != null && (message.equals("The document is really a VSD file"))) { |
| handler = new HDGFFileHandler(); |
| |
| // use XWPF instead of HWPF and XSSF instead of HSSF as the file seems to have the wrong extension |
| } else if (handler instanceof HWPFFileHandler) { |
| handler = new XWPFFileHandler(); |
| } else if (handler instanceof HSSFFileHandler) { |
| handler = new XSSFFileHandler(); |
| } else if (handler instanceof HSLFFileHandler) { |
| handler = new XSLFFileHandler(); |
| |
| // and the other way around, use HWPF instead of XWPF and so forth |
| } else if(handler instanceof XWPFFileHandler) { |
| handler = new HWPFFileHandler(); |
| } else if(handler instanceof XSSFFileHandler) { |
| handler = new HSSFFileHandler(); |
| } else if(handler instanceof XSLFFileHandler) { |
| handler = new HSLFFileHandler(); |
| } else { |
| // nothing matched => throw the exception to the outside |
| throw e; |
| } |
| |
| // we found a different handler to try processing again |
| handleFile(inputFile); |
| } |
| |
| private void handleFile(File inputFile) throws Exception { |
| try (InputStream newStream = new BufferedInputStream(new FileInputStream(inputFile), 64*1024)) { |
| handler.handleFile(newStream, inputFile.getAbsolutePath()); |
| } |
| } |
| } |