You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ki...@apache.org on 2017/01/04 01:06:30 UTC
svn commit: r1777252 - in /poi/trunk/src:
examples/src/org/apache/poi/xssf/usermodel/examples/
integrationtest/org/apache/poi/stress/ java/org/apache/poi/hssf/usermodel/
java/org/apache/poi/poifs/crypt/ java/org/apache/poi/poifs/crypt/cryptoapi/
ooxml/...
Author: kiwiwings
Date: Wed Jan 4 01:06:30 2017
New Revision: 1777252
URL: http://svn.apache.org/viewvc?rev=1777252&view=rev
Log:
SonarQube fixes
Modified:
poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java
poi/trunk/src/integrationtest/org/apache/poi/stress/HSSFFileHandler.java
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java
poi/trunk/src/java/org/apache/poi/poifs/crypt/ChunkedCipherInputStream.java
poi/trunk/src/java/org/apache/poi/poifs/crypt/cryptoapi/CryptoAPIDecryptor.java
poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java
poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/util/ZipSecureFile.java
poi/trunk/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java
poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/CHPFormattedDiskPage.java
poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/PlexOfCps.java
poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java
Modified: poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java?rev=1777252&r1=1777251&r2=1777252&view=diff
==============================================================================
--- poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java (original)
+++ poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java Wed Jan 4 01:06:30 2017
@@ -16,14 +16,14 @@
==================================================================== */
package org.apache.poi.xssf.usermodel.examples;
+import java.io.Closeable;
import java.io.InputStream;
-import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hwpf.HWPFDocument;
-import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackagePart;
-import org.apache.poi.xslf.usermodel.XSLFSlideShow;
+import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
@@ -35,37 +35,32 @@ public class EmbeddedObjects {
XSSFWorkbook workbook = new XSSFWorkbook(args[0]);
for (PackagePart pPart : workbook.getAllEmbedds()) {
String contentType = pPart.getContentType();
+ InputStream is = pPart.getInputStream();
+ Closeable document;
if (contentType.equals("application/vnd.ms-excel")) {
// Excel Workbook - either binary or OpenXML
- HSSFWorkbook embeddedWorkbook = new HSSFWorkbook(pPart.getInputStream());
- embeddedWorkbook.close();
+ document = new HSSFWorkbook(is);
} else if (contentType.equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) {
// Excel Workbook - OpenXML file format
- XSSFWorkbook embeddedWorkbook = new XSSFWorkbook(pPart.getInputStream());
- embeddedWorkbook.close();
+ document = new XSSFWorkbook(is);
} else if (contentType.equals("application/msword")) {
// Word Document - binary (OLE2CDF) file format
- HWPFDocument document = new HWPFDocument(pPart.getInputStream());
- document.close();
+ document = new HWPFDocument(is);
} else if (contentType.equals("application/vnd.openxmlformats-officedocument.wordprocessingml.document")) {
// Word Document - OpenXML file format
- XWPFDocument document = new XWPFDocument(pPart.getInputStream());
- document.close();
+ document = new XWPFDocument(is);
} else if (contentType.equals("application/vnd.ms-powerpoint")) {
// PowerPoint Document - binary file format
- HSLFSlideShowImpl slideShow = new HSLFSlideShowImpl(pPart.getInputStream());
- slideShow.close();
+ document = new HSLFSlideShow(is);
} else if (contentType.equals("application/vnd.openxmlformats-officedocument.presentationml.presentation")) {
// PowerPoint Document - OpenXML file format
- OPCPackage docPackage = OPCPackage.open(pPart.getInputStream());
- XSLFSlideShow slideShow = new XSLFSlideShow(docPackage);
- slideShow.close();
+ document = new XMLSlideShow(is);
} else {
// Any other type of embedded object.
- System.out.println("Unknown Embedded Document: " + contentType);
- InputStream inputStream = pPart.getInputStream();
- inputStream.close();
+ document = is;
}
+ document.close();
+ is.close();
}
workbook.close();
}
Modified: poi/trunk/src/integrationtest/org/apache/poi/stress/HSSFFileHandler.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/integrationtest/org/apache/poi/stress/HSSFFileHandler.java?rev=1777252&r1=1777251&r2=1777252&view=diff
==============================================================================
--- poi/trunk/src/integrationtest/org/apache/poi/stress/HSSFFileHandler.java (original)
+++ poi/trunk/src/integrationtest/org/apache/poi/stress/HSSFFileHandler.java Wed Jan 4 01:06:30 2017
@@ -37,6 +37,9 @@ public class HSSFFileHandler extends Spr
handleWorkbook(wb);
// TODO: some documents fail currently...
+ // Note - as of Bugzilla 48036 (svn r828244, r828247) POI is capable of evaluating
+ // IntesectionPtg. However it is still not capable of parsing it.
+ // So FormulaEvalTestData.xls now contains a few formulas that produce errors here.
//HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(wb);
//evaluator.evaluateAll();
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java?rev=1777252&r1=1777251&r2=1777252&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java Wed Jan 4 01:06:30 2017
@@ -17,7 +17,6 @@
package org.apache.poi.hssf.usermodel;
-import org.apache.poi.hssf.model.HSSFFormulaParser;
import org.apache.poi.hssf.model.InternalWorkbook;
import org.apache.poi.hssf.record.NameRecord;
import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
@@ -26,10 +25,8 @@ import org.apache.poi.ss.formula.Evaluat
import org.apache.poi.ss.formula.EvaluationName;
import org.apache.poi.ss.formula.EvaluationSheet;
import org.apache.poi.ss.formula.EvaluationWorkbook;
-import org.apache.poi.ss.formula.FormulaParseException;
import org.apache.poi.ss.formula.FormulaParsingWorkbook;
import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
-import org.apache.poi.ss.formula.FormulaType;
import org.apache.poi.ss.formula.SheetIdentifier;
import org.apache.poi.ss.formula.SheetRangeIdentifier;
import org.apache.poi.ss.formula.ptg.Area3DPtg;
@@ -42,15 +39,12 @@ import org.apache.poi.ss.usermodel.Table
import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Internal;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
/**
* Internal POI use only
*/
@Internal
public final class HSSFEvaluationWorkbook implements FormulaRenderingWorkbook, EvaluationWorkbook, FormulaParsingWorkbook {
- private static POILogger logger = POILogFactory.getLogger(HSSFEvaluationWorkbook.class);
private final HSSFWorkbook _uBook;
private final InternalWorkbook _iBook;
@@ -115,6 +109,7 @@ public final class HSSFEvaluationWorkboo
* @param sheetIndex the 0-based index of the sheet this formula belongs to.
* The sheet index is required to resolve sheet-level names. <code>-1</code> means workbook-global names
*/
+ @Override
public EvaluationName getName(String name, int sheetIndex) {
for(int i=0; i < _iBook.getNumNames(); i++) {
NameRecord nr = _iBook.getNameRecord(i);
@@ -226,22 +221,12 @@ public final class HSSFEvaluationWorkboo
}
@Override
- @SuppressWarnings("unused")
public Ptg[] getFormulaTokens(EvaluationCell evalCell) {
HSSFCell cell = ((HSSFEvaluationCell)evalCell).getHSSFCell();
- if (false) {
- // re-parsing the formula text also works, but is a waste of time
- // It is useful from time to time to run all unit tests with this code
- // to make sure that all formulas POI can evaluate can also be parsed.
- try {
- return HSSFFormulaParser.parse(cell.getCellFormula(), _uBook, FormulaType.CELL, _uBook.getSheetIndex(cell.getSheet()));
- } catch (FormulaParseException e) {
- // Note - as of Bugzilla 48036 (svn r828244, r828247) POI is capable of evaluating
- // IntesectionPtg. However it is still not capable of parsing it.
- // So FormulaEvalTestData.xls now contains a few formulas that produce errors here.
- logger.log( POILogger.ERROR, e.getMessage());
- }
- }
+ // re-parsing the formula text also works, but is a waste of time
+ // return HSSFFormulaParser.parse(cell.getCellFormula(), _uBook, FormulaType.CELL, _uBook.getSheetIndex(cell.getSheet()));
+ // It is useful within the tests to make sure that all formulas POI can evaluate can also be parsed.
+ // see HSSFFileHandler.handleFile instead
FormulaRecordAggregate fra = (FormulaRecordAggregate) cell.getCellValueRecord();
return fra.getFormulaTokens();
}
@@ -259,21 +244,27 @@ public final class HSSFEvaluationWorkboo
_nameRecord = nameRecord;
_index = index;
}
+ @Override
public Ptg[] getNameDefinition() {
return _nameRecord.getNameDefinition();
}
+ @Override
public String getNameText() {
return _nameRecord.getNameText();
}
+ @Override
public boolean hasFormula() {
return _nameRecord.hasFormula();
}
+ @Override
public boolean isFunctionName() {
return _nameRecord.isFunctionName();
}
+ @Override
public boolean isRange() {
return _nameRecord.hasFormula(); // TODO - is this right?
}
+ @Override
public NamePtg createPtg() {
return new NamePtg(_index);
}
Modified: poi/trunk/src/java/org/apache/poi/poifs/crypt/ChunkedCipherInputStream.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/crypt/ChunkedCipherInputStream.java?rev=1777252&r1=1777251&r2=1777252&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/crypt/ChunkedCipherInputStream.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/crypt/ChunkedCipherInputStream.java Wed Jan 4 01:06:30 2017
@@ -180,7 +180,10 @@ public abstract class ChunkedCipherInput
initCipherForBlock(cipher, index);
if (lastIndex != index) {
- super.skip((index - lastIndex) << chunkBits);
+ long skipN = (index - lastIndex) << chunkBits;
+ if (super.skip(skipN) < skipN) {
+ throw new EOFException("buffer underrun");
+ };
}
lastIndex = index + 1;
Modified: poi/trunk/src/java/org/apache/poi/poifs/crypt/cryptoapi/CryptoAPIDecryptor.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/crypt/cryptoapi/CryptoAPIDecryptor.java?rev=1777252&r1=1777251&r2=1777252&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/crypt/cryptoapi/CryptoAPIDecryptor.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/crypt/cryptoapi/CryptoAPIDecryptor.java Wed Jan 4 01:06:30 2017
@@ -18,6 +18,7 @@
package org.apache.poi.poifs.crypt.cryptoapi;
import java.io.ByteArrayOutputStream;
+import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
@@ -168,37 +169,42 @@ public class CryptoAPIDecryptor extends
dis.close();
CryptoAPIDocumentInputStream sbis = new CryptoAPIDocumentInputStream(this, bos.toByteArray());
LittleEndianInputStream leis = new LittleEndianInputStream(sbis);
- int streamDescriptorArrayOffset = (int) leis.readUInt();
- /* int streamDescriptorArraySize = (int) */ leis.readUInt();
- sbis.skip(streamDescriptorArrayOffset - 8L);
- sbis.setBlock(0);
- int encryptedStreamDescriptorCount = (int) leis.readUInt();
- StreamDescriptorEntry entries[] = new StreamDescriptorEntry[encryptedStreamDescriptorCount];
- for (int i = 0; i < encryptedStreamDescriptorCount; i++) {
- StreamDescriptorEntry entry = new StreamDescriptorEntry();
- entries[i] = entry;
- entry.streamOffset = (int) leis.readUInt();
- entry.streamSize = (int) leis.readUInt();
- entry.block = leis.readUShort();
- int nameSize = leis.readUByte();
- entry.flags = leis.readUByte();
- // boolean isStream = StreamDescriptorEntry.flagStream.isSet(entry.flags);
- entry.reserved2 = leis.readInt();
- entry.streamName = StringUtil.readUnicodeLE(leis, nameSize);
- leis.readShort();
- assert(entry.streamName.length() == nameSize);
- }
-
- for (StreamDescriptorEntry entry : entries) {
- sbis.seek(entry.streamOffset);
- sbis.setBlock(entry.block);
- InputStream is = new BoundedInputStream(sbis, entry.streamSize);
- fsOut.createDocument(is, entry.streamName);
- is.close();
+ try {
+ int streamDescriptorArrayOffset = (int) leis.readUInt();
+ /* int streamDescriptorArraySize = (int) */ leis.readUInt();
+ long skipN = streamDescriptorArrayOffset - 8L;
+ if (sbis.skip(skipN) < skipN) {
+ throw new EOFException("buffer underrun");
+ }
+ sbis.setBlock(0);
+ int encryptedStreamDescriptorCount = (int) leis.readUInt();
+ StreamDescriptorEntry entries[] = new StreamDescriptorEntry[encryptedStreamDescriptorCount];
+ for (int i = 0; i < encryptedStreamDescriptorCount; i++) {
+ StreamDescriptorEntry entry = new StreamDescriptorEntry();
+ entries[i] = entry;
+ entry.streamOffset = (int) leis.readUInt();
+ entry.streamSize = (int) leis.readUInt();
+ entry.block = leis.readUShort();
+ int nameSize = leis.readUByte();
+ entry.flags = leis.readUByte();
+ // boolean isStream = StreamDescriptorEntry.flagStream.isSet(entry.flags);
+ entry.reserved2 = leis.readInt();
+ entry.streamName = StringUtil.readUnicodeLE(leis, nameSize);
+ leis.readShort();
+ assert(entry.streamName.length() == nameSize);
+ }
+
+ for (StreamDescriptorEntry entry : entries) {
+ sbis.seek(entry.streamOffset);
+ sbis.setBlock(entry.block);
+ InputStream is = new BoundedInputStream(sbis, entry.streamSize);
+ fsOut.createDocument(is, entry.streamName);
+ is.close();
+ }
+ } finally {
+ IOUtils.closeQuietly(leis);
+ IOUtils.closeQuietly(sbis);
}
-
- leis.close();
- sbis.close();
sbis = null;
return fsOut;
}
Modified: poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java?rev=1777252&r1=1777251&r2=1777252&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java Wed Jan 4 01:06:30 2017
@@ -45,6 +45,7 @@ import org.apache.poi.openxml4j.util.Zip
import org.apache.poi.openxml4j.util.ZipFileZipEntrySource;
import org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource;
import org.apache.poi.openxml4j.util.ZipSecureFile.ThresholdInputStream;
+import org.apache.poi.util.IOUtils;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
import org.apache.poi.util.TempFile;
@@ -56,7 +57,7 @@ public final class ZipPackage extends OP
private static final String MIMETYPE = "mimetype";
private static final String SETTINGS_XML = "settings.xml";
- private static final POILogger logger = POILogFactory.getLogger(ZipPackage.class);
+ private static final POILogger LOG = POILogFactory.getLogger(ZipPackage.class);
/**
* Zip archive, as either a file on disk,
@@ -74,7 +75,7 @@ public final class ZipPackage extends OP
try {
this.contentTypeManager = new ZipContentTypeManager(null, this);
} catch (InvalidFormatException e) {
- logger.log(POILogger.WARN,"Could not parse ZipPackage", e);
+ LOG.log(POILogger.WARN,"Could not parse ZipPackage", e);
}
}
@@ -98,11 +99,7 @@ public final class ZipPackage extends OP
try {
this.zipArchive = new ZipInputStreamZipEntrySource(zis);
} catch (final IOException e) {
- try {
- zis.close();
- } catch (final IOException e2) {
- throw new IOException("Failed to close zip input stream while cleaning up. " + e.getMessage(), e2);
- }
+ IOUtils.closeQuietly(zis);
throw new IOException("Failed to read zip entry source", e);
}
}
@@ -141,7 +138,7 @@ public final class ZipPackage extends OP
if (access == PackageAccess.WRITE) {
throw new InvalidOperationException("Can't open the specified file: '" + file + "'", e);
}
- logger.log(POILogger.ERROR, "Error in zip file "+file+" - falling back to stream processing (i.e. ignoring zip central directory)");
+ LOG.log(POILogger.ERROR, "Error in zip file "+file+" - falling back to stream processing (i.e. ignoring zip central directory)");
ze = openZipEntrySourceStream(file);
}
this.zipArchive = ze;
@@ -163,13 +160,13 @@ public final class ZipPackage extends OP
// read from the file input stream
return openZipEntrySourceStream(fis);
} catch (final Exception e) {
- try {
- // abort: close the file input stream
- fis.close();
- } catch (final IOException e2) {
- throw new InvalidOperationException("Could not close the specified file input stream from file: '" + file + "'", e2);
+ // abort: close the file input stream
+ IOUtils.closeQuietly(fis);
+ if (e instanceof InvalidOperationException) {
+ throw (InvalidOperationException)e;
+ } else {
+ throw new InvalidOperationException("Failed to read the file input stream from file: '" + file + "'", e);
}
- throw new InvalidOperationException("Failed to read the file input stream from file: '" + file + "'", e);
}
}
@@ -189,13 +186,13 @@ public final class ZipPackage extends OP
// read from the zip input stream
return openZipEntrySourceStream(zis);
} catch (final Exception e) {
- try {
- // abort: close the zip input stream
- zis.close();
- } catch (final IOException e2) {
- throw new InvalidOperationException("Failed to read the zip entry source stream and could not close the zip input stream", e2);
+ // abort: close the zip input stream
+ IOUtils.closeQuietly(zis);
+ if (e instanceof InvalidOperationException) {
+ throw (InvalidOperationException)e;
+ } else {
+ throw new InvalidOperationException("Failed to read the zip entry source stream", e);
}
- throw new InvalidOperationException("Failed to read the zip entry source stream", e);
}
}
@@ -293,7 +290,7 @@ public final class ZipPackage extends OP
// Fallback exception
throw new InvalidFormatException(
- "Package should contain a content type part [M1.13]");
+ "Package should contain a content type part [M1.13]");
}
// Now create all the relationships
@@ -304,7 +301,9 @@ public final class ZipPackage extends OP
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
PackagePartName partName = buildPartName(entry);
- if(partName == null) continue;
+ if(partName == null) {
+ continue;
+ }
// Only proceed for Relationships at this stage
String contentType = contentTypeManager.getContentType(partName);
@@ -323,7 +322,9 @@ public final class ZipPackage extends OP
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
PackagePartName partName = buildPartName(entry);
- if(partName == null) continue;
+ if(partName == null) {
+ continue;
+ }
String contentType = contentTypeManager.getContentType(partName);
if (contentType != null && contentType.equals(ContentTypes.RELATIONSHIPS_PART)) {
@@ -338,9 +339,8 @@ public final class ZipPackage extends OP
}
} else {
throw new InvalidFormatException(
- "The part "
- + partName.getURI().getPath()
- + " does not have any content type ! Rule: Package require content types when retrieving a part from a package. [M.1.14]");
+ "The part " + partName.getURI().getPath()
+ + " does not have any content type ! Rule: Package require content types when retrieving a part from a package. [M.1.14]");
}
}
@@ -363,7 +363,7 @@ public final class ZipPackage extends OP
.getOPCNameFromZipItemName(entry.getName()));
} catch (Exception e) {
// We assume we can continue, even in degraded mode ...
- logger.log(POILogger.WARN,"Entry "
+ LOG.log(POILogger.WARN,"Entry "
+ entry.getName()
+ " is not valid, so this part won't be add to the package.", e);
return null;
@@ -383,17 +383,18 @@ public final class ZipPackage extends OP
@Override
protected PackagePart createPartImpl(PackagePartName partName,
String contentType, boolean loadRelationships) {
- if (contentType == null)
+ if (contentType == null) {
throw new IllegalArgumentException("contentType");
+ }
- if (partName == null)
+ if (partName == null) {
throw new IllegalArgumentException("partName");
+ }
try {
- return new MemoryPackagePart(this, partName, contentType,
- loadRelationships);
+ return new MemoryPackagePart(this, partName, contentType, loadRelationships);
} catch (InvalidFormatException e) {
- logger.log(POILogger.WARN, e);
+ LOG.log(POILogger.WARN, e);
return null;
}
}
@@ -406,8 +407,9 @@ public final class ZipPackage extends OP
*/
@Override
protected void removePartImpl(PackagePartName partName) {
- if (partName == null)
+ if (partName == null) {
throw new IllegalArgumentException("partUri");
+ }
}
/**
@@ -428,43 +430,39 @@ public final class ZipPackage extends OP
// Flush the package
flush();
+ if (this.originalPackagePath == null || "".equals(this.originalPackagePath)) {
+ return;
+ }
+
// Save the content
- if (this.originalPackagePath != null
- && !"".equals(this.originalPackagePath)) {
- File targetFile = new File(this.originalPackagePath);
- if (targetFile.exists()) {
- // Case of a package previously open
-
- File tempFile = TempFile.createTempFile(
- generateTempFileName(FileHelper
- .getDirectory(targetFile)), ".tmp");
-
- // Save the final package to a temporary file
- try {
- save(tempFile);
- } finally {
- try {
- // Close the current zip file, so we can
- // overwrite it on all platforms
- this.zipArchive.close();
- // Copy the new file over the old one
- FileHelper.copyFile(tempFile, targetFile);
- } finally {
- // Either the save operation succeed or not, we delete the
- // temporary file
- if (!tempFile.delete()) {
- logger
- .log(POILogger.WARN,"The temporary file: '"
- + targetFile.getAbsolutePath()
- + "' cannot be deleted ! Make sure that no other application use it.");
- }
- }
+ File targetFile = new File(this.originalPackagePath);
+ if (!targetFile.exists()) {
+ throw new InvalidOperationException(
+ "Can't close a package not previously open with the open() method !");
+ }
+
+ // Case of a package previously open
+ String tempFileName = generateTempFileName(FileHelper.getDirectory(targetFile));
+ File tempFile = TempFile.createTempFile(tempFileName, ".tmp");
+
+ // Save the final package to a temporary file
+ try {
+ save(tempFile);
+ } finally {
+ // Close the current zip file, so we can overwrite it on all platforms
+ IOUtils.closeQuietly(this.zipArchive);
+ try {
+ // Copy the new file over the old one
+ FileHelper.copyFile(tempFile, targetFile);
+ } finally {
+ // Either the save operation succeed or not, we delete the temporary file
+ if (!tempFile.delete()) {
+ LOG.log(POILogger.WARN, "The temporary file: '"
+ + targetFile.getAbsolutePath()
+ + "' cannot be deleted ! Make sure that no other application use it.");
}
- } else {
- throw new InvalidOperationException(
- "Can't close a package not previously open with the open() method !");
}
- }
+ }
}
/**
@@ -488,8 +486,9 @@ public final class ZipPackage extends OP
@Override
protected void revertImpl() {
try {
- if (this.zipArchive != null)
- this.zipArchive.close();
+ if (this.zipArchive != null) {
+ this.zipArchive.close();
+ }
} catch (IOException e) {
// Do nothing, user dont have to know
}
@@ -526,16 +525,17 @@ public final class ZipPackage extends OP
final ZipOutputStream zos;
try {
- if (!(outputStream instanceof ZipOutputStream))
- zos = new ZipOutputStream(outputStream);
- else
- zos = (ZipOutputStream) outputStream;
+ if (!(outputStream instanceof ZipOutputStream)) {
+ zos = new ZipOutputStream(outputStream);
+ } else {
+ zos = (ZipOutputStream) outputStream;
+ }
// If the core properties part does not exist in the part list,
// we save it as well
if (this.getPartsByRelationshipType(PackageRelationshipTypes.CORE_PROPERTIES).size() == 0 &&
this.getPartsByRelationshipType(PackageRelationshipTypes.CORE_PROPERTIES_ECMA376).size() == 0 ) {
- logger.log(POILogger.DEBUG,"Save core properties part");
+ LOG.log(POILogger.DEBUG,"Save core properties part");
// Ensure that core properties are added if missing
getPackageProperties();
@@ -555,42 +555,36 @@ public final class ZipPackage extends OP
}
// Save package relationships part.
- logger.log(POILogger.DEBUG,"Save package relationships");
+ LOG.log(POILogger.DEBUG,"Save package relationships");
ZipPartMarshaller.marshallRelationshipPart(this.getRelationships(),
PackagingURIHelper.PACKAGE_RELATIONSHIPS_ROOT_PART_NAME,
zos);
// Save content type part.
- logger.log(POILogger.DEBUG,"Save content types part");
+ LOG.log(POILogger.DEBUG,"Save content types part");
this.contentTypeManager.save(zos);
// Save parts.
for (PackagePart part : getParts()) {
// If the part is a relationship part, we don't save it, it's
// the source part that will do the job.
- if (part.isRelationshipPart())
- continue;
+ if (part.isRelationshipPart()) {
+ continue;
+ }
+
+ final PackagePartName ppn = part.getPartName();
+ LOG.log(POILogger.DEBUG,"Save part '" + ZipHelper.getZipItemNameFromOPCName(ppn.getName()) + "'");
+ PartMarshaller marshaller = partMarshallers.get(part._contentType);
+ String errMsg = "The part " + ppn.getURI() + " failed to be saved in the stream with marshaller ";
- logger.log(POILogger.DEBUG,"Save part '"
- + ZipHelper.getZipItemNameFromOPCName(part
- .getPartName().getName()) + "'");
- PartMarshaller marshaller = partMarshallers
- .get(part._contentType);
if (marshaller != null) {
if (!marshaller.marshall(part, zos)) {
- throw new OpenXML4JException(
- "The part "
- + part.getPartName().getURI()
- + " fail to be saved in the stream with marshaller "
- + marshaller);
+ throw new OpenXML4JException(errMsg + marshaller);
}
} else {
- if (!defaultPartMarshaller.marshall(part, zos))
- throw new OpenXML4JException(
- "The part "
- + part.getPartName().getURI()
- + " fail to be saved in the stream with marshaller "
- + defaultPartMarshaller);
+ if (!defaultPartMarshaller.marshall(part, zos)) {
+ throw new OpenXML4JException(errMsg + defaultPartMarshaller);
+ }
}
}
zos.close();
@@ -599,8 +593,8 @@ public final class ZipPackage extends OP
throw e;
} catch (Exception e) {
throw new OpenXML4JRuntimeException(
- "Fail to save: an error occurs while saving the package : "
- + e.getMessage(), e);
+ "Fail to save: an error occurs while saving the package : "
+ + e.getMessage(), e);
}
}
Modified: poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/util/ZipSecureFile.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/util/ZipSecureFile.java?rev=1777252&r1=1777251&r2=1777252&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/util/ZipSecureFile.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/util/ZipSecureFile.java Wed Jan 4 01:06:30 2017
@@ -45,7 +45,7 @@ import org.apache.poi.util.SuppressForbi
* and {@link #setMinInflateRatio(double)}.
*/
public class ZipSecureFile extends ZipFile {
- private final static POILogger logger = POILogFactory.getLogger(ZipSecureFile.class);
+ private static final POILogger LOG = POILogFactory.getLogger(ZipSecureFile.class);
private static double MIN_INFLATE_RATIO = 0.01d;
private static long MAX_ENTRY_SIZE = 0xFFFFFFFFL;
@@ -169,9 +169,9 @@ public class ZipSecureFile extends ZipFi
public static ThresholdInputStream addThreshold(final InputStream zipIS) throws IOException {
ThresholdInputStream newInner;
if (zipIS instanceof InflaterInputStream) {
- newInner = AccessController.doPrivileged(new PrivilegedAction<ThresholdInputStream>() {
+ newInner = AccessController.doPrivileged(new PrivilegedAction<ThresholdInputStream>() { // NOSONAR
@SuppressForbidden("TODO: Fix this to not use reflection (it will break in Java 9)! " +
- "Better would be to wrap *before* instead of tyring to insert wrapper afterwards.")
+ "Better would be to wrap *before* instead of trying to insert wrapper afterwards.")
public ThresholdInputStream run() {
try {
Field f = FilterInputStream.class.getDeclaredField("in");
@@ -181,7 +181,7 @@ public class ZipSecureFile extends ZipFi
f.set(zipIS, newInner);
return newInner;
} catch (Exception ex) {
- logger.log(POILogger.WARN, "SecurityManager doesn't allow manipulation via reflection for zipbomb detection - continue with original input stream", ex);
+ LOG.log(POILogger.WARN, "SecurityManager doesn't allow manipulation via reflection for zipbomb detection - continue with original input stream", ex);
}
return null;
}
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java?rev=1777252&r1=1777251&r2=1777252&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java Wed Jan 4 01:06:30 2017
@@ -144,7 +144,7 @@ public final class TestPOIXMLDocument {
// FIXME: A better exception class (IOException?) and message should be raised
// indicating that the document could not be written because the output stream is closed.
// see {@link org.apache.poi.openxml4j.opc.ZipPackage#saveImpl(java.io.OutputStream)}
- if (e.getMessage().matches("Fail to save: an error occurs while saving the package : The part .+ fail to be saved in the stream with marshaller .+")) {
+ if (e.getMessage().matches("Fail to save: an error occurs while saving the package : The part .+ failed to be saved in the stream with marshaller .+")) {
// expected
} else {
throw e;
@@ -330,6 +330,7 @@ public final class TestPOIXMLDocument {
thread.setContextClassLoader(cl.getParent());
XMLSlideShow ppt = new XMLSlideShow(is);
ppt.getSlides().get(0).getShapes();
+ ppt.close();
} finally {
thread.setContextClassLoader(cl);
is.close();
@@ -347,6 +348,7 @@ public final class TestPOIXMLDocument {
POIXMLTypeLoader.setClassLoader(cl);
XMLSlideShow ppt = new XMLSlideShow(is);
ppt.getSlides().get(0).getShapes();
+ ppt.close();
} finally {
thread.setContextClassLoader(cl);
POIXMLTypeLoader.setClassLoader(null);
Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/CHPFormattedDiskPage.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/CHPFormattedDiskPage.java?rev=1777252&r1=1777251&r2=1777252&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/CHPFormattedDiskPage.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/CHPFormattedDiskPage.java Wed Jan 4 01:06:30 2017
@@ -24,6 +24,7 @@ import java.util.List;
import org.apache.poi.hwpf.sprm.SprmBuffer;
import org.apache.poi.util.Internal;
import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.RecordFormatException;
/**
* Represents a CHP fkp. The style properties for paragraph and character runs
@@ -62,6 +63,7 @@ public final class CHPFormattedDiskPage
* {@link #CHPFormattedDiskPage(byte[], int, CharIndexTranslator)}
* instead
*/
+ @Deprecated
public CHPFormattedDiskPage( byte[] documentStream, int offset, int fcMin,
TextPieceTable tpt )
{
@@ -122,6 +124,7 @@ public final class CHPFormattedDiskPage
* @param index The index of the chpx to get.
* @return a chpx grpprl.
*/
+ @Override
protected byte[] getGrpprl(int index)
{
int chpxOffset = 2 * LittleEndian.getUByte(_fkp, _offset + (((_crun + 1) * 4) + index));
@@ -169,8 +172,7 @@ public final class CHPFormattedDiskPage
// the grpprl size byte and the grpprl.
totalSize += ( FC_SIZE + 2 + grpprlLength );
// if size is uneven we will have to add one so the first grpprl
- // falls
- // on a word boundary
+ // falls on a word boundary
if ( totalSize > 511 + ( index % 2 ) )
{
totalSize -= ( FC_SIZE + 2 + grpprlLength );
@@ -184,6 +186,10 @@ public final class CHPFormattedDiskPage
}
}
+ if (index == 0) {
+ throw new RecordFormatException("empty grpprl entry.");
+ }
+
// see if we couldn't fit some
if ( index != size )
{
@@ -197,15 +203,13 @@ public final class CHPFormattedDiskPage
offsetOffset = ( FC_SIZE * index ) + FC_SIZE;
// grpprlOffset = offsetOffset + index + (grpprlOffset % 2);
- CHPX chpx = null;
- for ( int x = 0; x < index; x++ )
- {
- chpx = _chpxList.get( x );
- byte[] grpprl = chpx.getGrpprl();
-
- LittleEndian.putInt( buf, fcOffset,
- translator.getByteIndex( chpx.getStart() ) );
+ int chpxEnd = 0;
+ for ( CHPX chpx : _chpxList.subList(0, index)) {
+ int chpxStart = translator.getByteIndex( chpx.getStart() );
+ chpxEnd = translator.getByteIndex( chpx.getEnd() );
+ LittleEndian.putInt( buf, fcOffset, chpxStart );
+ byte[] grpprl = chpx.getGrpprl();
grpprlOffset -= ( 1 + grpprl.length );
grpprlOffset -= ( grpprlOffset % 2 );
buf[offsetOffset] = (byte) ( grpprlOffset / 2 );
@@ -216,8 +220,7 @@ public final class CHPFormattedDiskPage
fcOffset += FC_SIZE;
}
// put the last chpx's end in
- LittleEndian.putInt( buf, fcOffset,
- translator.getByteIndex( chpx.getEnd() ) );
+ LittleEndian.putInt( buf, fcOffset, chpxEnd );
return buf;
}
Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/PlexOfCps.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/PlexOfCps.java?rev=1777252&r1=1777251&r2=1777252&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/PlexOfCps.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/model/PlexOfCps.java Wed Jan 4 01:06:30 2017
@@ -30,12 +30,9 @@ import org.apache.poi.util.LittleEndian;
* front that relate to an array of arbitrary data structures in the back.
* <p>
* See page 184 of official documentation for details
- *
- * @author Ryan Ackley
*/
public final class PlexOfCps {
private int _iMac;
- private int _offset;
private int _cbStruct;
private List<GenericPropertyNode> _props;
@@ -104,20 +101,19 @@ public final class PlexOfCps {
byte[] buf = new byte[bufSize];
- GenericPropertyNode node = null;
+ int nodeEnd = 0;
for (int x = 0; x < size; x++) {
- node = _props.get(x);
-
+ GenericPropertyNode node = _props.get(x);
+ nodeEnd = node.getEnd();
+
// put the starting offset of the property into the plcf.
- LittleEndian.putInt(buf, (LittleEndian.INT_SIZE * x),
- node.getStart());
+ LittleEndian.putInt(buf, (LittleEndian.INT_SIZE * x), node.getStart());
// put the struct into the plcf
- System.arraycopy(node.getBytes(), 0, buf, cpBufSize
- + (x * _cbStruct), _cbStruct);
+ System.arraycopy(node.getBytes(), 0, buf, cpBufSize + (x * _cbStruct), _cbStruct);
}
// put the ending offset of the last property into the plcf.
- LittleEndian.putInt(buf, LittleEndian.INT_SIZE * size, node.getEnd());
+ LittleEndian.putInt(buf, LittleEndian.INT_SIZE * size, nodeEnd);
return buf;
}
Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java?rev=1777252&r1=1777251&r2=1777252&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java Wed Jan 4 01:06:30 2017
@@ -108,13 +108,12 @@ public final class Picture
* DataStream
*/
public Picture( int dataBlockStartOfsset, byte[] _dataStream, boolean fillBytes ) { // NOSONAR
- _picfAndOfficeArtData = new PICFAndOfficeArtData( _dataStream,
- dataBlockStartOfsset );
+ _picfAndOfficeArtData = new PICFAndOfficeArtData( _dataStream, dataBlockStartOfsset );
_picf = _picfAndOfficeArtData.getPicf();
this.dataBlockStartOfsset = dataBlockStartOfsset;
- if ( _picfAndOfficeArtData != null && _picfAndOfficeArtData.getBlipRecords() != null) {
+ if ( _picfAndOfficeArtData.getBlipRecords() != null) {
_blipRecords = _picfAndOfficeArtData.getBlipRecords();
} else {
_blipRecords = Collections.emptyList();
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org