From abfe427e720258a0cae1942a640dfab0e801d664 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Wed, 23 Sep 2015 23:22:46 +0000 Subject: [PATCH] - a few findbugs/sonar fixes - removed obsolete openxml4j signature classes git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1704964 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/ddf/EscherBSERecord.java | 19 ++- .../org/apache/poi/ddf/EscherBitmapBlip.java | 7 +- .../org/apache/poi/ddf/EscherBlipRecord.java | 6 +- .../poi/ddf/EscherClientAnchorRecord.java | 9 +- .../poifs/filesystem/DocumentInputStream.java | 24 ++- .../opc/internal/ZipContentTypeManager.java | 3 +- .../signature/DigitalCertificatePart.java | 69 --------- .../signature/DigitalSignatureOriginPart.java | 28 ---- .../signature/PackageDigitalSignature.java | 63 -------- .../PackageDigitalSignatureManager.java | 22 --- .../apache/poi/hslf/record/Comment2000.java | 1 + .../poi/hslf/record/CurrentUserAtom.java | 11 +- .../org/apache/poi/hslf/record/ExEmbed.java | 1 + .../poi/hslf/record/RecordContainer.java | 137 ++++++++---------- .../apache/poi/hslf/record/TextRulerAtom.java | 2 + .../poi/hslf/usermodel/HSLFFreeformShape.java | 3 + .../apache/poi/hslf/usermodel/HSLFSheet.java | 2 +- .../poi/hslf/usermodel/HSLFSimpleShape.java | 5 +- .../apache/poi/hslf/usermodel/HSLFSlide.java | 2 + .../poi/hslf/usermodel/HSLFSlideShow.java | 2 +- .../usermodel/HSLFSlideShowEncrypted.java | 11 +- .../poi/hslf/usermodel/HSLFSlideShowImpl.java | 26 +++- .../poi/hslf/usermodel/HSLFTextParagraph.java | 55 +++++-- 23 files changed, 204 insertions(+), 304 deletions(-) delete mode 100644 src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalCertificatePart.java delete mode 100644 src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalSignatureOriginPart.java delete mode 100644 src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignature.java delete mode 100644 src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignatureManager.java diff --git a/src/java/org/apache/poi/ddf/EscherBSERecord.java b/src/java/org/apache/poi/ddf/EscherBSERecord.java index 556dcdd7e..496feb6fc 100644 --- a/src/java/org/apache/poi/ddf/EscherBSERecord.java +++ b/src/java/org/apache/poi/ddf/EscherBSERecord.java @@ -61,7 +61,8 @@ public final class EscherBSERecord extends EscherRecord { int pos = offset + 8; field_1_blipTypeWin32 = data[pos]; field_2_blipTypeMacOS = data[pos + 1]; - System.arraycopy( data, pos + 2, field_3_uid = new byte[16], 0, 16 ); + field_3_uid = new byte[16]; + System.arraycopy( data, pos + 2, field_3_uid, 0, 16 ); field_4_tag = LittleEndian.getShort( data, pos + 18 ); field_5_size = LittleEndian.getInt( data, pos + 20 ); field_6_ref = LittleEndian.getInt( data, pos + 24 ); @@ -90,12 +91,12 @@ public final class EscherBSERecord extends EscherRecord { public int serialize(int offset, byte[] data, EscherSerializationListener listener) { listener.beforeRecordSerialize( offset, getRecordId(), this ); - if (_remainingData == null) + if (_remainingData == null) { _remainingData = new byte[0]; + } LittleEndian.putShort( data, offset, getOptions() ); LittleEndian.putShort( data, offset + 2, getRecordId() ); - if (_remainingData == null) _remainingData = new byte[0]; int blipSize = field_12_blipRecord == null ? 0 : field_12_blipRecord.getRecordSize(); int remainingBytes = _remainingData.length + 36 + blipSize; LittleEndian.putInt( data, offset + 4, remainingBytes ); @@ -117,8 +118,6 @@ public final class EscherBSERecord extends EscherRecord { { bytesWritten = field_12_blipRecord.serialize( offset + 44, data, new NullEscherSerializationListener() ); } - if (_remainingData == null) - _remainingData = new byte[0]; System.arraycopy( _remainingData, 0, data, offset + 44 + bytesWritten, _remainingData.length ); int pos = offset + 8 + 36 + _remainingData.length + bytesWritten; @@ -184,7 +183,9 @@ public final class EscherBSERecord extends EscherRecord { * 16 byte MD4 checksum. */ public void setUid(byte[] uid) { - field_3_uid = uid; + if (uid != null && uid.length == 16) { + System.arraycopy(uid, 0, field_3_uid, 0, field_3_uid.length); + }; } /** @@ -306,7 +307,11 @@ public final class EscherBSERecord extends EscherRecord { * Any remaining data in this record. */ public void setRemainingData(byte[] remainingData) { - _remainingData = remainingData; + if (remainingData == null) { + _remainingData = null; + } else { + _remainingData = remainingData.clone(); + } } public String toString() { diff --git a/src/java/org/apache/poi/ddf/EscherBitmapBlip.java b/src/java/org/apache/poi/ddf/EscherBitmapBlip.java index 096e0c4a8..e6855d198 100644 --- a/src/java/org/apache/poi/ddf/EscherBitmapBlip.java +++ b/src/java/org/apache/poi/ddf/EscherBitmapBlip.java @@ -74,9 +74,10 @@ public class EscherBitmapBlip extends EscherBlipRecord { return field_1_UID; } - public void setUID( byte[] field_1_UID ) - { - this.field_1_UID = field_1_UID; + public void setUID( byte[] field_1_UID ) { + if (field_1_UID != null && field_1_UID.length == 16) { + System.arraycopy(field_1_UID, 0, this.field_1_UID , 0, 16); + } } public byte getMarker() diff --git a/src/java/org/apache/poi/ddf/EscherBlipRecord.java b/src/java/org/apache/poi/ddf/EscherBlipRecord.java index b6bb8a46b..43c0661ef 100644 --- a/src/java/org/apache/poi/ddf/EscherBlipRecord.java +++ b/src/java/org/apache/poi/ddf/EscherBlipRecord.java @@ -70,7 +70,11 @@ public class EscherBlipRecord extends EscherRecord { // TODO - instantiable supe } public void setPictureData(byte[] pictureData) { - field_pictureData = pictureData; + if (pictureData == null) { + field_pictureData = null; + } else { + field_pictureData = pictureData.clone(); + } } public String toString() { diff --git a/src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java b/src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java index 665a091d7..4185d6397 100644 --- a/src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java +++ b/src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java @@ -333,8 +333,11 @@ public class EscherClientAnchorRecord /** * Any remaining data in the record */ - public void setRemainingData( byte[] remainingData ) - { - this.remainingData = remainingData; + public void setRemainingData( byte[] remainingData ) { + if (remainingData == null) { + this.remainingData = null; + } else { + this.remainingData = remainingData.clone(); + } } } diff --git a/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java b/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java index 82959c7ff..672a4aa11 100644 --- a/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java +++ b/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java @@ -85,14 +85,17 @@ public class DocumentInputStream extends InputStream implements LittleEndianInpu delegate = new NDocumentInputStream(document); } + @Override public int available() { return delegate.available(); } + @Override public void close() { delegate.close(); } + @Override public void mark(int ignoredReadlimit) { delegate.mark(ignoredReadlimit); } @@ -102,18 +105,22 @@ public class DocumentInputStream extends InputStream implements LittleEndianInpu * * @return true always */ + @Override public boolean markSupported() { return true; } + @Override public int read() throws IOException { return delegate.read(); } + @Override public int read(byte[] b) throws IOException { return read(b, 0, b.length); } + @Override public int read(byte[] b, int off, int len) throws IOException { return delegate.read(b, off, len); } @@ -123,46 +130,57 @@ public class DocumentInputStream extends InputStream implements LittleEndianInpu * last called on this input stream. If mark() has not been called this * method repositions the stream to its beginning. */ + @Override public void reset() { delegate.reset(); } + @Override public long skip(long n) throws IOException { return delegate.skip(n); } + @Override public byte readByte() { return delegate.readByte(); } + @Override public double readDouble() { return delegate.readDouble(); } + @Override public short readShort() { return (short) readUShort(); } - public void readFully(byte[] buf) { - readFully(buf, 0, buf.length); - } + @Override + public void readFully(byte[] buf) { + readFully(buf, 0, buf.length); + } + @Override public void readFully(byte[] buf, int off, int len) { delegate.readFully(buf, off, len); } + @Override public long readLong() { return delegate.readLong(); } + @Override public int readInt() { return delegate.readInt(); } + @Override public int readUShort() { return delegate.readUShort(); } + @Override public int readUByte() { return delegate.readUByte(); } diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ZipContentTypeManager.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ZipContentTypeManager.java index 1b9e7fe2c..1e00d9308 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ZipContentTypeManager.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ZipContentTypeManager.java @@ -54,7 +54,8 @@ public class ZipContentTypeManager extends ContentTypeManager { super(in, pkg); } - @Override + @SuppressWarnings("resource") + @Override public boolean saveImpl(Document content, OutputStream out) { ZipOutputStream zos = null; if (out instanceof ZipOutputStream) diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalCertificatePart.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalCertificatePart.java deleted file mode 100644 index fffa768fb..000000000 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalCertificatePart.java +++ /dev/null @@ -1,69 +0,0 @@ -/* ==================================================================== - 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.opc.internal.signature; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.poi.openxml4j.exceptions.OpenXML4JException; -import org.apache.poi.openxml4j.opc.PackagePart; -import org.apache.poi.openxml4j.opc.internal.ContentType; - -/** - * Digital certificate part. - * - * @author Julien Chable - * @version 0.1 - */ -public final class DigitalCertificatePart extends PackagePart { - - public DigitalCertificatePart() throws InvalidFormatException{ - super(null, null, new ContentType("")); - // TODO: Review constructor - } - - @Override - public void close() { - } - - @Override - public void flush() { - } - - @Override - protected InputStream getInputStreamImpl() throws IOException { - return null; - } - - @Override - protected OutputStream getOutputStreamImpl() { - return null; - } - - @Override - public boolean load(InputStream ios) throws InvalidFormatException { - return false; - } - - @Override - public boolean save(OutputStream zos) throws OpenXML4JException { - return false; - } -} diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalSignatureOriginPart.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalSignatureOriginPart.java deleted file mode 100644 index b6c1a8ac8..000000000 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/signature/DigitalSignatureOriginPart.java +++ /dev/null @@ -1,28 +0,0 @@ -/* ==================================================================== - 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.opc.internal.signature; - -/** - * Represents a digital signature origin part. - * - * @author Julien Chable - * @version 0.1 - */ -public final class DigitalSignatureOriginPart { - -} diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignature.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignature.java deleted file mode 100644 index ee9bb6475..000000000 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignature.java +++ /dev/null @@ -1,63 +0,0 @@ -/* ==================================================================== - 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.opc.signature; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.poi.openxml4j.exceptions.OpenXML4JException; -import org.apache.poi.openxml4j.opc.PackagePart; -import org.apache.poi.openxml4j.opc.internal.ContentType; - -public final class PackageDigitalSignature extends PackagePart { - - public PackageDigitalSignature() throws InvalidFormatException { - super(null, null, new ContentType("")); - // TODO: Review constructor - } - - @Override - public void close() { - } - - @Override - public void flush() { - } - - @Override - protected InputStream getInputStreamImpl() throws IOException { - return null; - } - - @Override - protected OutputStream getOutputStreamImpl() { - return null; - } - - @Override - public boolean load(InputStream ios) throws InvalidFormatException { - return false; - } - - @Override - public boolean save(OutputStream zos) throws OpenXML4JException { - return false; - } -} diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignatureManager.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignatureManager.java deleted file mode 100644 index 64007f6f0..000000000 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/signature/PackageDigitalSignatureManager.java +++ /dev/null @@ -1,22 +0,0 @@ -/* ==================================================================== - 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.opc.signature; - -public final class PackageDigitalSignatureManager { - -} diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/Comment2000.java b/src/scratchpad/src/org/apache/poi/hslf/record/Comment2000.java index 2714bad29..b64134b0d 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/Comment2000.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/Comment2000.java @@ -124,6 +124,7 @@ public final class Comment2000 extends RecordContainer { case 0: authorRecord = cs; break; case 1: commentRecord = cs; break; case 2: authorInitialsRecord = cs; break; + default: break; } } else if (r instanceof Comment2000Atom){ commentAtom = (Comment2000Atom)r; diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/CurrentUserAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/CurrentUserAtom.java index e34103a8c..71820076e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/CurrentUserAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/CurrentUserAtom.java @@ -133,10 +133,17 @@ public class CurrentUserAtom } // Grab the contents - _contents = new byte[docProps.getSize()]; + int len = docProps.getSize(); + _contents = new byte[len]; InputStream in = dir.createDocumentInputStream("Current User"); - in.read(_contents); + int readLen = in.read(_contents); + in.close(); + if (len != readLen) { + throw new IOException("Current User input stream ended prematurely - expected "+len+" bytes - received "+readLen+" bytes"); + } + + // See how long it is. If it's under 28 bytes long, we can't // read it if(_contents.length < 28) { diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/ExEmbed.java b/src/scratchpad/src/org/apache/poi/hslf/record/ExEmbed.java index 09e95abe4..7580450cd 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/ExEmbed.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/ExEmbed.java @@ -113,6 +113,7 @@ public class ExEmbed extends RecordContainer { case 0x1: menuName = cs; break; case 0x2: progId = cs; break; case 0x3: clipboardName = cs; break; + default: break; } } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java b/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java index 91a590afe..a25ca605c 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java @@ -36,7 +36,6 @@ import java.util.ArrayList; public abstract class RecordContainer extends Record { protected Record[] _children; - private Boolean changingChildRecordsLock = Boolean.TRUE; /** * Return any children @@ -58,14 +57,12 @@ public abstract class RecordContainer extends Record * Finds the location of the given child record */ private int findChildLocation(Record child) { - // Synchronized as we don't want things changing - // as we're doing our search - synchronized(changingChildRecordsLock) { - for(int i=0; i<_children.length; i++) { - if(_children[i].equals(child)) { - return i; - } + int i=0; + for(Record r : _children) { + if (r.equals(child)) { + return i; } + i++; } return -1; } @@ -75,14 +72,12 @@ public abstract class RecordContainer extends Record * @param newChild The child record to add */ private void appendChild(Record newChild) { - synchronized(changingChildRecordsLock) { - // Copy over, and pop the child in at the end - Record[] nc = new Record[(_children.length + 1)]; - System.arraycopy(_children, 0, nc, 0, _children.length); - // Switch the arrays - nc[_children.length] = newChild; - _children = nc; - } + // Copy over, and pop the child in at the end + Record[] nc = new Record[(_children.length + 1)]; + System.arraycopy(_children, 0, nc, 0, _children.length); + // Switch the arrays + nc[_children.length] = newChild; + _children = nc; } /** @@ -92,18 +87,15 @@ public abstract class RecordContainer extends Record * @param position */ private void addChildAt(Record newChild, int position) { - synchronized(changingChildRecordsLock) { - // Firstly, have the child added in at the end - appendChild(newChild); + // Firstly, have the child added in at the end + appendChild(newChild); - // Now, have them moved to the right place - moveChildRecords( (_children.length-1), position, 1 ); - } + // Now, have them moved to the right place + moveChildRecords( (_children.length-1), position, 1 ); } /** - * Moves number child records from oldLoc - * to newLoc. Caller must have the changingChildRecordsLock + * Moves {@code number} child records from {@code oldLoc} to {@code newLoc}. * @param oldLoc the current location of the records to move * @param newLoc the new location for the records * @param number the number of records to move @@ -162,9 +154,7 @@ public abstract class RecordContainer extends Record * Add a new child record onto a record's list of children. */ public void appendChildRecord(Record newChild) { - synchronized(changingChildRecordsLock) { - appendChild(newChild); - } + appendChild(newChild); } /** @@ -173,16 +163,14 @@ public abstract class RecordContainer extends Record * @param after */ public void addChildAfter(Record newChild, Record after) { - synchronized(changingChildRecordsLock) { - // Decide where we're going to put it - int loc = findChildLocation(after); - if(loc == -1) { - throw new IllegalArgumentException("Asked to add a new child after another record, but that record wasn't one of our children!"); - } - - // Add one place after the supplied record - addChildAt(newChild, loc+1); + // Decide where we're going to put it + int loc = findChildLocation(after); + if(loc == -1) { + throw new IllegalArgumentException("Asked to add a new child after another record, but that record wasn't one of our children!"); } + + // Add one place after the supplied record + addChildAt(newChild, loc+1); } /** @@ -191,16 +179,14 @@ public abstract class RecordContainer extends Record * @param before */ public void addChildBefore(Record newChild, Record before) { - synchronized(changingChildRecordsLock) { - // Decide where we're going to put it - int loc = findChildLocation(before); - if(loc == -1) { - throw new IllegalArgumentException("Asked to add a new child before another record, but that record wasn't one of our children!"); - } - - // Add at the place of the supplied record - addChildAt(newChild, loc); + // Decide where we're going to put it + int loc = findChildLocation(before); + if(loc == -1) { + throw new IllegalArgumentException("Asked to add a new child before another record, but that record wasn't one of our children!"); } + + // Add at the place of the supplied record + addChildAt(newChild, loc); } /** @@ -216,22 +202,20 @@ public abstract class RecordContainer extends Record public void moveChildrenBefore(Record firstChild, int number, Record before) { if(number < 1) { return; } - synchronized(changingChildRecordsLock) { - // Decide where we're going to put them - int newLoc = findChildLocation(before); - if(newLoc == -1) { - throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!"); - } - - // Figure out where they are now - int oldLoc = findChildLocation(firstChild); - if(oldLoc == -1) { - throw new IllegalArgumentException("Asked to move a record that wasn't a child!"); - } - - // Actually move - moveChildRecords(oldLoc, newLoc, number); + // Decide where we're going to put them + int newLoc = findChildLocation(before); + if(newLoc == -1) { + throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!"); } + + // Figure out where they are now + int oldLoc = findChildLocation(firstChild); + if(oldLoc == -1) { + throw new IllegalArgumentException("Asked to move a record that wasn't a child!"); + } + + // Actually move + moveChildRecords(oldLoc, newLoc, number); } /** @@ -239,25 +223,22 @@ public abstract class RecordContainer extends Record */ public void moveChildrenAfter(Record firstChild, int number, Record after) { if(number < 1) { return; } - - synchronized(changingChildRecordsLock) { - // Decide where we're going to put them - int newLoc = findChildLocation(after); - if(newLoc == -1) { - throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!"); - } - // We actually want after this though - newLoc++; - - // Figure out where they are now - int oldLoc = findChildLocation(firstChild); - if(oldLoc == -1) { - throw new IllegalArgumentException("Asked to move a record that wasn't a child!"); - } - - // Actually move - moveChildRecords(oldLoc, newLoc, number); + // Decide where we're going to put them + int newLoc = findChildLocation(after); + if(newLoc == -1) { + throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!"); } + // We actually want after this though + newLoc++; + + // Figure out where they are now + int oldLoc = findChildLocation(firstChild); + if(oldLoc == -1) { + throw new IllegalArgumentException("Asked to move a record that wasn't a child!"); + } + + // Actually move + moveChildRecords(oldLoc, newLoc, number); } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextRulerAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextRulerAtom.java index 84f03b472..f81061dc0 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/TextRulerAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/TextRulerAtom.java @@ -149,6 +149,8 @@ public final class TextRulerAtom extends RecordAtom { val = LittleEndian.getShort(_data, pos); pos += 2; textOffsets[bits[i]-8] = val; break; + default: + break; } } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java index dbfc6ec1f..0c21c7e8b 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java @@ -133,6 +133,9 @@ public final class HSLFFreeformShape extends HSLFAutoShape implements FreeformSh isClosed = true; numPoints++; break; + default: + logger.log(POILogger.WARN, "Ignoring invalid segment type "+type); + break; } it.next(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java index 419ded3a1..139840c54 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java @@ -319,7 +319,7 @@ public abstract class HSLFSheet implements HSLFShapeContainer, Sheet(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java index 99aa8c645..6f0e9e4c4 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java @@ -38,7 +38,6 @@ import org.apache.poi.hslf.record.UserEditAtom; import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey; import org.apache.poi.poifs.crypt.Decryptor; import org.apache.poi.poifs.crypt.EncryptionInfo; -import org.apache.poi.poifs.crypt.Encryptor; import org.apache.poi.poifs.crypt.cryptoapi.CryptoAPIDecryptor; import org.apache.poi.poifs.crypt.cryptoapi.CryptoAPIEncryptor; import org.apache.poi.util.BitField; @@ -95,8 +94,8 @@ public class HSLFSlideShowEncrypted { } assert(r instanceof DocumentEncryptionAtom); this.dea = (DocumentEncryptionAtom)r; + decryptInit(); - CryptoAPIDecryptor dec = (CryptoAPIDecryptor)dea.getEncryptionInfo().getDecryptor(); String pass = Biff8EncryptionKey.getCurrentUserPassword(); if(!dec.verifyPassword(pass != null ? pass : Decryptor.DEFAULT_PASSWORD)) { throw new EncryptedPowerPointFileException("PowerPoint file is encrypted. The correct password needs to be set via Biff8EncryptionKey.setCurrentUserPassword()"); @@ -342,10 +341,11 @@ public class HSLFSlideShowEncrypted { // create password record if (dea == null) { dea = new DocumentEncryptionAtom(); + enc = null; } + encryptInit(); EncryptionInfo ei = dea.getEncryptionInfo(); byte salt[] = ei.getVerifier().getSalt(); - Encryptor enc = ei.getEncryptor(); if (salt == null) { enc.confirmPassword(password); } else { @@ -396,11 +396,12 @@ public class HSLFSlideShowEncrypted { recordMap.put(pdr.getLastOnDiskOffset(), r); } + + assert(uea != null && pph != null && uea.getPersistPointersOffset() == pph.getLastOnDiskOffset()); + recordMap.put(pph.getLastOnDiskOffset(), pph); recordMap.put(uea.getLastOnDiskOffset(), uea); - assert(uea != null && pph != null && uea.getPersistPointersOffset() == pph.getLastOnDiskOffset()); - if (duplicatedCount == 0 && obsoleteOffsets.isEmpty()) { return records; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java index 80781ee14..d45b7cb99 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java @@ -221,8 +221,15 @@ public final class HSLFSlideShowImpl extends POIDocument { (DocumentEntry)directory.getEntry("PowerPoint Document"); // Grab the document stream - _docstream = new byte[docProps.getSize()]; - directory.createDocumentInputStream("PowerPoint Document").read(_docstream); + int len = docProps.getSize(); + _docstream = new byte[len]; + InputStream is = directory.createDocumentInputStream("PowerPoint Document"); + int readLen = is.read(_docstream); + is.close(); + + if (len != readLen) { + throw new IOException("Document input stream ended prematurely - expected "+len+" bytes - received "+readLen+" bytes"); + } } /** @@ -374,11 +381,16 @@ public final class HSLFSlideShowImpl extends POIDocument { HSLFSlideShowEncrypted decryptData = new HSLFSlideShowEncrypted(getDocumentEncryptionAtom()); DocumentEntry entry = (DocumentEntry)directory.getEntry("Pictures"); - byte[] pictstream = new byte[entry.getSize()]; + int len = entry.getSize(); + byte[] pictstream = new byte[len]; DocumentInputStream is = directory.createDocumentInputStream(entry); - is.read(pictstream); + int readLen = is.read(pictstream); is.close(); + if (len != readLen) { + throw new IOException("Picture stream ended prematurely - expected "+len+" bytes - received "+readLen+" bytes"); + } + int pos = 0; // An empty picture record (length 0) will take up 8 bytes @@ -507,7 +519,9 @@ public final class HSLFSlideShowImpl extends POIDocument { } cos.close(); - assert(usr != null && ptr != null); + if (usr == null || ptr == null) { + throw new HSLFException("UserEditAtom or PersistPtr can't be determined."); + } Map persistIds = new HashMap(); for (Map.Entry entry : ptr.getSlideLocationsLookup().entrySet()) { @@ -540,7 +554,7 @@ public final class HSLFSlideShowImpl extends POIDocument { // Update and write out the Current User atom int oldLastUserEditAtomPos = (int)currentUser.getCurrentEditOffset(); Integer newLastUserEditAtomPos = oldToNewPositions.get(oldLastUserEditAtomPos); - if(usr == null || newLastUserEditAtomPos == null || usr.getLastOnDiskOffset() != newLastUserEditAtomPos) { + if(newLastUserEditAtomPos == null || usr.getLastOnDiskOffset() != newLastUserEditAtomPos) { throw new HSLFException("Couldn't find the new location of the last UserEditAtom that used to be at " + oldLastUserEditAtomPos); } currentUser.setCurrentEditOffset(usr.getLastOnDiskOffset()); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java index 64308e808..39fe74c2a 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java @@ -21,18 +21,49 @@ import static org.apache.poi.hslf.record.RecordTypes.OutlineTextRefAtom; import java.awt.Color; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; import org.apache.poi.hslf.model.PPFont; -import org.apache.poi.hslf.model.textproperties.*; +import org.apache.poi.hslf.model.textproperties.BitMaskTextProp; +import org.apache.poi.hslf.model.textproperties.FontAlignmentProp; +import org.apache.poi.hslf.model.textproperties.IndentProp; +import org.apache.poi.hslf.model.textproperties.ParagraphFlagsTextProp; +import org.apache.poi.hslf.model.textproperties.TextAlignmentProp; +import org.apache.poi.hslf.model.textproperties.TextPFException9; +import org.apache.poi.hslf.model.textproperties.TextProp; +import org.apache.poi.hslf.model.textproperties.TextPropCollection; import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType; -import org.apache.poi.hslf.record.*; +import org.apache.poi.hslf.record.ColorSchemeAtom; +import org.apache.poi.hslf.record.EscherTextboxWrapper; +import org.apache.poi.hslf.record.FontCollection; +import org.apache.poi.hslf.record.MasterTextPropAtom; +import org.apache.poi.hslf.record.OutlineTextRefAtom; +import org.apache.poi.hslf.record.PPDrawing; +import org.apache.poi.hslf.record.Record; +import org.apache.poi.hslf.record.RecordContainer; +import org.apache.poi.hslf.record.RecordTypes; +import org.apache.poi.hslf.record.SlideListWithText; +import org.apache.poi.hslf.record.SlidePersistAtom; +import org.apache.poi.hslf.record.StyleTextProp9Atom; +import org.apache.poi.hslf.record.StyleTextPropAtom; +import org.apache.poi.hslf.record.TextBytesAtom; +import org.apache.poi.hslf.record.TextCharsAtom; +import org.apache.poi.hslf.record.TextHeaderAtom; +import org.apache.poi.hslf.record.TextRulerAtom; +import org.apache.poi.hslf.record.TextSpecInfoAtom; import org.apache.poi.sl.draw.DrawPaint; import org.apache.poi.sl.usermodel.AutoNumberingScheme; import org.apache.poi.sl.usermodel.PaintStyle; import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; import org.apache.poi.sl.usermodel.TextParagraph; -import org.apache.poi.util.*; +import org.apache.poi.util.LocaleUtil; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; +import org.apache.poi.util.StringUtil; +import org.apache.poi.util.Units; /** * This class represents a run of text in a powerpoint document. That @@ -906,12 +937,16 @@ public final class HSLFTextParagraph implements TextParagraph runIter = htp.getTextRuns().iterator(); - HSLFTextRun htr = runIter.next(); - htr.setText(""); - assert (htr != null); - while (runIter.hasNext()) { - runIter.next(); - runIter.remove(); + if (runIter.hasNext()) { + HSLFTextRun htr = runIter.next(); + htr.setText(""); + while (runIter.hasNext()) { + runIter.next(); + runIter.remove(); + } + } else { + HSLFTextRun trun = new HSLFTextRun(htp); + htp.addTextRun(trun); } return appendText(paragraphs, text, false);