From 3e4e43b28bceed3075e0884d5a7c11843dcaa33a Mon Sep 17 00:00:00 2001
From: PJ Fanning This class copies a POI file system to a new file and compares the copy
* with the original.
* Property set streams are copied logically, i.e. the application
* establishes a {@link org.apache.poi.hpsf.PropertySet} of an original property
* set, creates a {@link org.apache.poi.hpsf.PropertySet} and writes the
* {@link org.apache.poi.hpsf.PropertySet} to the destination POI file
* system. - Streams which are no property set streams are copied bit by
* bit.
* The comparison of the POI file systems is done logically. That means that
* the two disk files containing the POI file systems do not need to be
* exactly identical. However, both POI file systems must contain the same
@@ -67,38 +66,36 @@ import org.apache.poi.util.TempFile;
* with the same attributes, and the sections must contain the same properties.
* Details like the ordering of the properties do not matter. Runs the example program. The application expects one or two
* arguments:
*
* The first argument is the disk file name of the POI filesystem to
* copy.
* The second argument is optional. If it is given, it is the name of
* a disk file the copy of the POI filesystem will be written to. If it is
* not given, the copy will be written to a temporary file which will be
* deleted at the end of the program.
* Compares two {@link DirectoryEntry} instances of a POI file system.
* The directories must contain the same streams with the same names and
* contents. Compares two {@link DocumentEntry} instances of a POI file system.
* Documents that are not property set streams must be bitwise identical.
* Property set streams must be logically equal. This class does all the work. Its method {@link
* #processPOIFSReaderEvent(POIFSReaderEvent)} is called for each file in
@@ -284,9 +270,9 @@ public class CopyCompare
* The constructor of a {@link CopyFile} instance creates the target
* POIFS. It also stores the name of the file the POIFS will be written
* to once it is complete. Writes a {@link PropertySet} to a POI filesystem. Copies the bytes from a {@link DocumentInputStream} to a new
* stream in a POI filesystem.
- *
+ *
*
* @param args Command-line arguments.
- * @exception MarkUnsupportedException if a POI document stream does not
- * support the mark() operation.
- * @exception NoPropertySetStreamException if the application tries to
- * create a property set from a POI document stream that is not a property
- * set stream.
- * @exception IOException if any I/O exception occurs.
- * @exception UnsupportedEncodingException if a character encoding is not
- * supported.
+ * @throws MarkUnsupportedException if a POI document stream does not
+ * support the mark() operation.
+ * @throws NoPropertySetStreamException if the application tries to
+ * create a property set from a POI document stream that is not a property
+ * set stream.
+ * @throws IOException if any I/O exception occurs.
+ * @throws UnsupportedEncodingException if a character encoding is not
+ * supported.
*/
public static void main(final String[] args)
- throws NoPropertySetStreamException, MarkUnsupportedException,
- UnsupportedEncodingException, IOException
- {
+ throws NoPropertySetStreamException, MarkUnsupportedException,
+ UnsupportedEncodingException, IOException {
String originalFileName = null;
String copyFileName = null;
@@ -113,7 +110,7 @@ public class CopyCompare
copyFileName = args[1];
} else {
System.err.println("Usage: " + CopyCompare.class.getName() +
- "originPOIFS [copyPOIFS]");
+ "originPOIFS [copyPOIFS]");
System.exit(1);
}
@@ -132,51 +129,43 @@ public class CopyCompare
/* Read all documents from the original POI file system and compare them
* with the equivalent document from the copy. */
- POIFSFileSystem opfs = null, cpfs = null;
- try {
- opfs = new POIFSFileSystem(new File(originalFileName));
- cpfs = new POIFSFileSystem(new File(copyFileName));
-
+ try (POIFSFileSystem opfs = new POIFSFileSystem(new File(originalFileName));
+ POIFSFileSystem cpfs = new POIFSFileSystem(new File(copyFileName))) {
final DirectoryEntry oRoot = opfs.getRoot();
final DirectoryEntry cRoot = cpfs.getRoot();
final StringBuffer messages = new StringBuffer();
if (equal(oRoot, cRoot, messages)) {
System.out.println("Equal");
} else {
- System.out.println("Not equal: " + messages);
+ System.out.println("Not equal: " + messages);
}
- } finally {
- IOUtils.closeQuietly(cpfs);
- IOUtils.closeQuietly(opfs);
}
}
-
/**
* true
if the directories are equal, else
* false
.
- * @exception MarkUnsupportedException if a POI document stream does not
- * support the mark() operation.
- * @exception NoPropertySetStreamException if the application tries to
- * create a property set from a POI document stream that is not a property
- * set stream.
- * @exception IOException if any I/O exception occurs.
+ * @throws MarkUnsupportedException if a POI document stream does not
+ * support the mark() operation.
+ * @throws NoPropertySetStreamException if the application tries to
+ * create a property set from a POI document stream that is not a property
+ * set stream.
+ * @throws IOException if any I/O exception occurs.
*/
private static boolean equal(final DirectoryEntry d1,
final DirectoryEntry d2,
final StringBuffer msg)
- throws NoPropertySetStreamException, MarkUnsupportedException,
- UnsupportedEncodingException, IOException
- {
+ throws NoPropertySetStreamException, MarkUnsupportedException,
+ UnsupportedEncodingException, IOException {
boolean equal = true;
/* Iterate over d1 and compare each entry with its counterpart in d2. */
for (final Entry e1 : d1) {
@@ -215,30 +204,28 @@ public class CopyCompare
}
-
/**
* true
if the documents are equal, else
* false
.
- * @exception MarkUnsupportedException if a POI document stream does not
- * support the mark() operation.
- * @exception NoPropertySetStreamException if the application tries to
- * create a property set from a POI document stream that is not a property
- * set stream.
- * @exception IOException if any I/O exception occurs.
+ * @throws MarkUnsupportedException if a POI document stream does not
+ * support the mark() operation.
+ * @throws NoPropertySetStreamException if the application tries to
+ * create a property set from a POI document stream that is not a property
+ * set stream.
+ * @throws IOException if any I/O exception occurs.
*/
private static boolean equal(final DocumentEntry d1, final DocumentEntry d2,
final StringBuffer msg)
- throws NoPropertySetStreamException, MarkUnsupportedException,
- UnsupportedEncodingException, IOException
- {
+ throws NoPropertySetStreamException, MarkUnsupportedException,
+ UnsupportedEncodingException, IOException {
try (DocumentInputStream dis1 = new DocumentInputStream(d1); DocumentInputStream dis2 = new DocumentInputStream(d2)) {
if (PropertySet.isPropertySetStream(dis1) &&
PropertySet.isPropertySetStream(dis2)) {
@@ -264,7 +251,6 @@ public class CopyCompare
}
-
/**
*
*
Unfortunately POI does not offer a simple method to interrogate * the POIFS whether a certain child node (file or directory) exists in * a directory. However, since we always start with an empty POIFS which @@ -435,9 +419,9 @@ public class CopyCompare * to the corresponding {@link DirectoryEntry} instances.
* * @param poiFs The POI filesystem the directory hierarchy is created - * in, if needed. - * @param path The document's path. This method creates those directory - * components of this hierarchy which do not yet exist. + * in, if needed. + * @param path The document's path. This method creates those directory + * components of this hierarchy which do not yet exist. * @return The directory entry of the document path's parent. The caller * should use this {@link DirectoryEntry} to create documents in it. */ @@ -464,7 +448,7 @@ public class CopyCompare de = getPath(poiFs, path.getParent()); /* Now create the target directory: */ de = de.createDirectory(path.getComponent - (path.length() - 1)); + (path.length() - 1)); } paths.put(s, de); return de; diff --git a/src/examples/src/org/apache/poi/ss/examples/html/ToHtml.java b/src/examples/src/org/apache/poi/ss/examples/html/ToHtml.java index dfe3fa401..1787982dc 100644 --- a/src/examples/src/org/apache/poi/ss/examples/html/ToHtml.java +++ b/src/examples/src/org/apache/poi/ss/examples/html/ToHtml.java @@ -250,18 +250,14 @@ public class ToHtml { ensureOut(); // First, copy the base css - BufferedReader in = null; - try { - in = new BufferedReader(new InputStreamReader( - getClass().getResourceAsStream("excelStyle.css"))); + try (BufferedReader in = new BufferedReader(new InputStreamReader( + getClass().getResourceAsStream("excelStyle.css")))){ String line; while ((line = in.readLine()) != null) { out.format("%s%n", line); } } catch (IOException e) { throw new IllegalStateException("Reading standard css", e); - } finally { - IOUtils.closeQuietly(in); } // now add css for each used style diff --git a/src/examples/src/org/apache/poi/xssf/eventusermodel/examples/LoadPasswordProtectedXlsxStreaming.java b/src/examples/src/org/apache/poi/xssf/eventusermodel/examples/LoadPasswordProtectedXlsxStreaming.java index f0d3eea1b..f02ec5019 100644 --- a/src/examples/src/org/apache/poi/xssf/eventusermodel/examples/LoadPasswordProtectedXlsxStreaming.java +++ b/src/examples/src/org/apache/poi/xssf/eventusermodel/examples/LoadPasswordProtectedXlsxStreaming.java @@ -26,7 +26,6 @@ import org.apache.poi.crypt.examples.EncryptionUtils; import org.apache.poi.examples.util.TempFileUtils; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.poifs.crypt.temp.AesZipFileZipEntrySource; -import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.eventusermodel.XSSFReader; import org.apache.poi.xssf.eventusermodel.XSSFReader.SheetIterator; @@ -47,38 +46,24 @@ public class LoadPasswordProtectedXlsxStreaming { TempFileUtils.checkTempFiles(); String filename = args[0]; String password = args[1]; - FileInputStream fis = new FileInputStream(filename); - try { - InputStream unencryptedStream = EncryptionUtils.decrypt(fis, password); - try { - printSheetCount(unencryptedStream); - } finally { - IOUtils.closeQuietly(unencryptedStream); - } - } finally { - IOUtils.closeQuietly(fis); + try (FileInputStream fis = new FileInputStream(filename); + InputStream unencryptedStream = EncryptionUtils.decrypt(fis, password)) { + printSheetCount(unencryptedStream); } TempFileUtils.checkTempFiles(); } public static void printSheetCount(final InputStream inputStream) throws Exception { - AesZipFileZipEntrySource source = AesZipFileZipEntrySource.createZipEntrySource(inputStream); - try { - OPCPackage pkg = OPCPackage.open(source); - try { - XSSFReader reader = new XSSFReader(pkg); - SheetIterator iter = (SheetIterator)reader.getSheetsData(); - int count = 0; - while(iter.hasNext()) { - iter.next(); - count++; - } - System.out.println("sheet count: " + count); - } finally { - IOUtils.closeQuietly(pkg); + try (AesZipFileZipEntrySource source = AesZipFileZipEntrySource.createZipEntrySource(inputStream); + OPCPackage pkg = OPCPackage.open(source)) { + XSSFReader reader = new XSSFReader(pkg); + SheetIterator iter = (SheetIterator)reader.getSheetsData(); + int count = 0; + while(iter.hasNext()) { + iter.next(); + count++; } - } finally { - IOUtils.closeQuietly(source); + System.out.println("sheet count: " + count); } } } diff --git a/src/examples/src/org/apache/poi/xssf/streaming/examples/SavePasswordProtectedXlsx.java b/src/examples/src/org/apache/poi/xssf/streaming/examples/SavePasswordProtectedXlsx.java index 79b3293a6..f91141c78 100644 --- a/src/examples/src/org/apache/poi/xssf/streaming/examples/SavePasswordProtectedXlsx.java +++ b/src/examples/src/org/apache/poi/xssf/streaming/examples/SavePasswordProtectedXlsx.java @@ -84,22 +84,16 @@ public class SavePasswordProtectedXlsx { public static void save(final InputStream inputStream, final String filename, final String pwd) throws InvalidFormatException, IOException, GeneralSecurityException { - POIFSFileSystem fs = null; - FileOutputStream fos = null; - OPCPackage opc = null; - try { - fs = new POIFSFileSystem(); + + try (POIFSFileSystem fs = new POIFSFileSystem(); + OPCPackage opc = OPCPackage.open(inputStream); + FileOutputStream fos = new FileOutputStream(filename)) { EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile); Encryptor enc = Encryptor.getInstance(info); enc.confirmPassword(pwd); - opc = OPCPackage.open(inputStream); - fos = new FileOutputStream(filename); opc.save(enc.getDataStream(fs)); fs.writeFilesystem(fos); } finally { - IOUtils.closeQuietly(fos); - IOUtils.closeQuietly(opc); - IOUtils.closeQuietly(fs); IOUtils.closeQuietly(inputStream); } } diff --git a/src/examples/src/org/apache/poi/xssf/usermodel/examples/LoadPasswordProtectedXlsx.java b/src/examples/src/org/apache/poi/xssf/usermodel/examples/LoadPasswordProtectedXlsx.java index da6032f86..6365e7fa6 100644 --- a/src/examples/src/org/apache/poi/xssf/usermodel/examples/LoadPasswordProtectedXlsx.java +++ b/src/examples/src/org/apache/poi/xssf/usermodel/examples/LoadPasswordProtectedXlsx.java @@ -26,7 +26,6 @@ import org.apache.poi.crypt.examples.EncryptionUtils; import org.apache.poi.examples.util.TempFileUtils; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.poifs.crypt.temp.AesZipFileZipEntrySource; -import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; /** @@ -45,36 +44,18 @@ public class LoadPasswordProtectedXlsx { TempFileUtils.checkTempFiles(); String filename = args[0]; String password = args[1]; - FileInputStream fis = new FileInputStream(filename); - try { - InputStream unencryptedStream = EncryptionUtils.decrypt(fis, password); - try { - printSheetCount(unencryptedStream); - } finally { - IOUtils.closeQuietly(unencryptedStream); - } - } finally { - IOUtils.closeQuietly(fis); + try (FileInputStream fis = new FileInputStream(filename); + InputStream unencryptedStream = EncryptionUtils.decrypt(fis, password)) { + printSheetCount(unencryptedStream); } TempFileUtils.checkTempFiles(); } public static void printSheetCount(final InputStream inputStream) throws Exception { - AesZipFileZipEntrySource source = AesZipFileZipEntrySource.createZipEntrySource(inputStream); - try { - OPCPackage pkg = OPCPackage.open(source); - try { - XSSFWorkbook workbook = new XSSFWorkbook(pkg); - try { - System.out.println("sheet count: " + workbook.getNumberOfSheets()); - } finally { - IOUtils.closeQuietly(workbook); - } - } finally { - IOUtils.closeQuietly(pkg); - } - } finally { - IOUtils.closeQuietly(source); + try (AesZipFileZipEntrySource source = AesZipFileZipEntrySource.createZipEntrySource(inputStream); + OPCPackage pkg = OPCPackage.open(source); + XSSFWorkbook workbook = new XSSFWorkbook(pkg)) { + System.out.println("sheet count: " + workbook.getNumberOfSheets()); } } diff --git a/src/examples/src/org/apache/poi/xwpf/usermodel/examples/UpdateEmbeddedDoc.java b/src/examples/src/org/apache/poi/xwpf/usermodel/examples/UpdateEmbeddedDoc.java index ad14d7271..ef57d7999 100644 --- a/src/examples/src/org/apache/poi/xwpf/usermodel/examples/UpdateEmbeddedDoc.java +++ b/src/examples/src/org/apache/poi/xwpf/usermodel/examples/UpdateEmbeddedDoc.java @@ -35,7 +35,6 @@ import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; -import org.apache.poi.util.IOUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; /** @@ -73,17 +72,12 @@ public class UpdateEmbeddedDoc { */ public UpdateEmbeddedDoc(String filename) throws FileNotFoundException, IOException { this.docFile = new File(filename); - FileInputStream fis = null; if (!this.docFile.exists()) { throw new FileNotFoundException("The Word document " + filename + " does not exist."); } - try { - // Open the Word document file and instantiate the XWPFDocument - // class. - fis = new FileInputStream(this.docFile); + try (FileInputStream fis = new FileInputStream(this.docFile)) { + // Open the Word document file and instantiate the XWPFDocument class. this.doc = new XWPFDocument(fis); - } finally { - IOUtils.closeQuietly(fis); } } @@ -113,30 +107,23 @@ public class UpdateEmbeddedDoc { // to the create method of the WorkbookFactory class. Update // the resulting Workbook and then stream that out again // using an OutputStream obtained from the same PackagePart. - InputStream is = pPart.getInputStream(); - Workbook workbook = null; - OutputStream os = null; - try { - workbook = WorkbookFactory.create(is); + try (InputStream is = pPart.getInputStream(); + Workbook workbook = WorkbookFactory.create(is); + OutputStream os = pPart.getOutputStream()) { Sheet sheet = workbook.getSheetAt(SHEET_NUM); Row row = sheet.getRow(ROW_NUM); Cell cell = row.getCell(CELL_NUM); cell.setCellValue(NEW_VALUE); - os = pPart.getOutputStream(); workbook.write(os); - } finally { - IOUtils.closeQuietly(os); - IOUtils.closeQuietly(workbook); - IOUtils.closeQuietly(is); } } } if (!embeddedDocs.isEmpty()) { // Finally, write the newly modified Word document out to file. - FileOutputStream fos = new FileOutputStream(this.docFile); - this.doc.write(fos); - fos.close(); + try (FileOutputStream fos = new FileOutputStream(this.docFile)) { + this.doc.write(fos); + } } } @@ -169,19 +156,14 @@ public class UpdateEmbeddedDoc { for (PackagePart pPart : this.doc.getAllEmbedds()) { String ext = pPart.getPartName().getExtension(); if (BINARY_EXTENSION.equals(ext) || OPENXML_EXTENSION.equals(ext)) { - InputStream is = pPart.getInputStream(); - Workbook workbook = null; - try { - workbook = WorkbookFactory.create(is); + try (InputStream is = pPart.getInputStream(); + Workbook workbook = WorkbookFactory.create(is)) { Sheet sheet = workbook.getSheetAt(SHEET_NUM); Row row = sheet.getRow(ROW_NUM); Cell cell = row.getCell(CELL_NUM); if(cell.getNumericCellValue() != NEW_VALUE) { throw new IllegalStateException("Failed to validate document content."); } - } finally { - IOUtils.closeQuietly(workbook); - IOUtils.closeQuietly(is); } } }