You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by on...@apache.org on 2016/04/10 16:09:02 UTC
svn commit: r1738436 - in /poi/trunk/src:
java/org/apache/poi/poifs/eventfilesystem/
java/org/apache/poi/poifs/filesystem/ java/org/apache/poi/util/
testcases/org/apache/poi/util/
Author: onealj
Date: Sun Apr 10 14:09:02 2016
New Revision: 1738436
URL: http://svn.apache.org/viewvc?rev=1738436&view=rev
Log:
bug 52949: add junit test for RLEDecompressingInputStream
Added:
poi/trunk/src/testcases/org/apache/poi/util/TestRLEDecompressingInputStream.java (with props)
Modified:
poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java
poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReaderEvent.java
poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java
poi/trunk/src/java/org/apache/poi/util/IOUtils.java
poi/trunk/src/java/org/apache/poi/util/RLEDecompressingInputStream.java
Modified: poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java?rev=1738436&r1=1738435&r2=1738436&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java Sun Apr 10 14:09:02 2016
@@ -48,8 +48,8 @@ import org.apache.poi.poifs.storage.Smal
public class POIFSReader
{
- private POIFSReaderRegistry registry;
- private boolean registryClosed;
+ private final POIFSReaderRegistry registry;
+ private boolean registryClosed;
/**
* Create a POIFSReader
Modified: poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReaderEvent.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReaderEvent.java?rev=1738436&r1=1738435&r2=1738436&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReaderEvent.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReaderEvent.java Sun Apr 10 14:09:02 2016
@@ -31,9 +31,9 @@ import org.apache.poi.poifs.filesystem.P
public class POIFSReaderEvent
{
- private DocumentInputStream stream;
- private POIFSDocumentPath path;
- private String documentName;
+ private final DocumentInputStream stream;
+ private final POIFSDocumentPath path;
+ private final String documentName;
/**
* package scoped constructor
Modified: poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java?rev=1738436&r1=1738435&r2=1738436&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java Sun Apr 10 14:09:02 2016
@@ -35,8 +35,8 @@ public class POIFSDocumentPath
{
private static final POILogger log = POILogFactory.getLogger(POIFSDocumentPath.class);
- private String[] components;
- private int hashcode = 0;
+ private final String[] components;
+ private int hashcode = 0; //lazy-compute hashCode
/**
* constructor for the path of a document that is not in the root
@@ -199,13 +199,19 @@ public class POIFSDocumentPath
{
if (hashcode == 0)
{
- for (int j = 0; j < components.length; j++)
- {
- hashcode += components[ j ].hashCode();
- }
+ hashcode = computeHashCode();
}
return hashcode;
}
+
+ private int computeHashCode() {
+ int code = 0;
+ for (int j = 0; j < components.length; j++)
+ {
+ code += components[ j ].hashCode();
+ }
+ return code;
+ }
/**
* @return the number of components
@@ -249,16 +255,32 @@ public class POIFSDocumentPath
{
return null;
}
- POIFSDocumentPath parent = new POIFSDocumentPath(null);
-
- parent.components = new String[ length ];
- System.arraycopy(components, 0, parent.components, 0, length);
+ String[] parentComponents = new String[ length ];
+ System.arraycopy(components, 0, parentComponents, 0, length);
+ POIFSDocumentPath parent = new POIFSDocumentPath(parentComponents);
+
return parent;
}
+
+ /**
+ * <p>Returns the last name in the document path's name sequence.
+ * If the document path's name sequence is empty, then the empty string is returned.</p>
+ *
+ * @since 2016-04-09
+ * @return The last name in the document path's name sequence, or empty string if this is the root path
+ */
+
+ public String getName()
+ {
+ if (components.length == 0) {
+ return "";
+ }
+ return components[components.length - 1];
+ }
/**
* <p>Returns a string representation of the path. Components are
- * separated by the platform-specific file separator.</p>
+ * separated by the platform-specific file separator {@link File#separatorChar}</p>
*
* @return string representation
*
Modified: poi/trunk/src/java/org/apache/poi/util/IOUtils.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/util/IOUtils.java?rev=1738436&r1=1738435&r2=1738436&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/util/IOUtils.java (original)
+++ poi/trunk/src/java/org/apache/poi/util/IOUtils.java Sun Apr 10 14:09:02 2016
@@ -120,13 +120,18 @@ public final class IOUtils {
}
/**
- * Same as the normal <tt>in.read(b, off, len)</tt>, but tries to ensure
- * that the entire len number of bytes is read.
- * <p>
- * If the end of file is reached before any bytes are read, returns -1. If
+ * <p>Same as the normal {@link InputStream#read(byte[], int, int)}, but tries to ensure
+ * that the entire len number of bytes is read.</p>
+ *
+ * <p>If the end of file is reached before any bytes are read, returns <tt>-1</tt>. If
* the end of the file is reached after some bytes are read, returns the
- * number of bytes read. If the end of the file isn't reached before len
- * bytes have been read, will return len bytes.
+ * number of bytes read. If the end of the file isn't reached before <tt>len</tt>
+ * bytes have been read, will return <tt>len</tt> bytes.</p>
+ *
+ * @param in the stream from which the data is read.
+ * @param b the buffer into which the data is read.
+ * @param off the start offset in array <tt>b</tt> at which the data is written.
+ * @param len the maximum number of bytes to read.
*/
public static int readFully(InputStream in, byte[] b, int off, int len) throws IOException {
int total = 0;
Modified: poi/trunk/src/java/org/apache/poi/util/RLEDecompressingInputStream.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/util/RLEDecompressingInputStream.java?rev=1738436&r1=1738435&r2=1738436&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/util/RLEDecompressingInputStream.java (original)
+++ poi/trunk/src/java/org/apache/poi/util/RLEDecompressingInputStream.java Sun Apr 10 14:09:02 2016
@@ -19,6 +19,8 @@ package org.apache.poi.util;
import java.io.IOException;
import java.io.InputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
/**
* Wrapper of InputStream which provides Run Length Encoding (RLE)
@@ -270,4 +272,18 @@ public class RLEDecompressingInputStream
}
return (b0 & 0xFF) | ((b1 & 0xFF) << 8) | ((b2 & 0xFF) << 16) | ((b3 & 0xFF) << 24);
}
+
+ public static final byte[] decompress(byte[] compressed) throws IOException {
+ return decompress(compressed, 0, compressed.length);
+ }
+
+ public static final byte[] decompress(byte[] compressed, int offset, int length) throws IOException {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ InputStream instream = new ByteArrayInputStream(compressed, offset, length);
+ InputStream stream = new RLEDecompressingInputStream(instream);
+ IOUtils.copy(stream, out);
+ stream.close();
+ out.close();
+ return out.toByteArray();
+ }
}
Added: poi/trunk/src/testcases/org/apache/poi/util/TestRLEDecompressingInputStream.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/util/TestRLEDecompressingInputStream.java?rev=1738436&view=auto
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/util/TestRLEDecompressingInputStream.java (added)
+++ poi/trunk/src/testcases/org/apache/poi/util/TestRLEDecompressingInputStream.java Sun Apr 10 14:09:02 2016
@@ -0,0 +1,166 @@
+/* ====================================================================
+ 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.util;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.junit.Test;
+
+public class TestRLEDecompressingInputStream {
+
+ /**
+ * Section 3.2.1 No Compression Example
+ *
+ * The following string illustrates an ASCII text string with a set of characters that cannot be compressed
+ * by the compression algorithm specified in section 2.4.1.
+ *
+ * abcdefghijklmnopqrstuv.
+ *
+ * This example is provided to demonstrate the results of compressing and decompressing the string
+ * using an interoperable implementation of the algorithm specified in section 2.4.1.
+ *
+ * The following hex array represents the compressed byte array of the example string as compressed by
+ * the compression algorithm.
+ *
+ * 01 19 B0 00 61 62 63 64 65 66 67 68 00 69 6A 6B 6C
+ * 6D 6E 6F 70 00 71 72 73 74 75 76 2E
+ *
+ * The following hex array represents the decompressed byte array of the example string as
+ * decompressed by the decompression algorithm.
+ *
+ * 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71
+ * 72 73 74 75 76 2E
+ *
+ */
+ @Test
+ public void noCompressionExample() {
+ final byte[] compressed = {
+ 0x01, 0x19, (byte)0xB0, 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x00, 0x69, 0x6A, 0x6B, 0x6C,
+ 0x6D, 0x6E, 0x6F, 0x70, 0x00, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x2E
+ };
+ final String expected = "abcdefghijklmnopqrstuv.";
+ checkRLEDecompression(expected, compressed);
+ }
+
+ /**
+ * Section 3.2.2 Normal Compression Example
+ *
+ * The following string illustrates an ASCII text string with a typical set of characters that can be
+ * compressed by the compression algorithm.
+ *
+ * #aaabcdefaaaaghijaaaaaklaaamnopqaaaaaaaaaaaarstuvwxyzaaa
+ *
+ * This example is provided to demonstrate the results of compressing and decompressing the example
+ * string using an interoperable implementation of the algorithm specified in section 2.4.1.
+ *
+ * The following hex array represents the compressed byte array of the example string as compressed by
+ * the compression algorithm:
+ *
+ * 01 2F B0 00 23 61 61 61 62 63 64 65 82 66 00 70
+ * 61 67 68 69 6A 01 38 08 61 6B 6C 00 30 6D 6E 6F
+ * 70 06 71 02 70 04 10 72 73 74 75 76 10 77 78 79
+ * 7A 00 3C
+ *
+ * The following hex array represents the decompressed byte array of the example string as
+ * decompressed by the decompression algorithm:
+ *
+ * 23 61 61 61 62 63 64 65 66 61 61 61 61 67 68 69
+ * 6a 61 61 61 61 61 6B 6C 61 61 61 6D 6E 6F 70 71
+ * 61 61 61 61 61 61 61 61 61 61 61 61 72 73 74 75
+ * 76 77 78 79 7A 61 61 61
+ */
+ @Test
+ public void normalCompressionExample() {
+ final byte[] compressed = {
+ 0x01, 0x2F, (byte)0xB0, 0x00, 0x23, 0x61, 0x61, 0x61, 0x62, 0x63, 0x64, 0x65, (byte)0x82, 0x66, 0x00, 0x70,
+ 0x61, 0x67, 0x68, 0x69, 0x6A, 0x01, 0x38, 0x08, 0x61, 0x6B, 0x6C, 0x00, 0x30, 0x6D, 0x6E, 0x6F,
+ 0x70, 0x06, 0x71, 0x02, 0x70, 0x04, 0x10, 0x72, 0x73, 0x74, 0x75, 0x76, 0x10, 0x77, 0x78, 0x79,
+ 0x7A, 0x00, 0x3C
+ };
+ final String expected = "#aaabcdefaaaaghijaaaaaklaaamnopqaaaaaaaaaaaarstuvwxyzaaa";
+ checkRLEDecompression(expected, compressed);
+ }
+
+ /**
+ * Section 3.2.3 Maximum Compression Example
+ *
+ * The following string illustrates an ASCII text string with a typical set of characters that can be
+ * compressed by the compression algorithm.
+ *
+ * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ *
+ * This example is provided to demonstrate the results of compressing and decompressing the example
+ * string using an interoperable implementation of the algorithm specified in section 2.4.1.
+ *
+ * The following hex array represents the compressed byte array of the example string as compressed by
+ * the compression algorithm:
+ *
+ * 01 03 B0 02 61 45 00
+ *
+ * The following hex array represents the decompressed byte array of the example string as
+ * decompressed by the decompression algorithm:
+ *
+ * 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ * 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ * 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ * 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ * 61 61 61 61 61 61 61 61 61
+ */
+ @Test
+ public void maximumCompressionExample() {
+ final byte[] compressed = {
+ 0x01, 0x03, (byte)0xB0, 0x02, 0x61, 0x45, 0x00
+ };
+ final String expected = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+ checkRLEDecompression(expected, compressed);
+ }
+
+ @Test
+ public void decompress() throws IOException {
+ final byte[] compressed = {
+ 0x01, 0x03, (byte)0xB0, 0x02, 0x61, 0x45, 0x00
+ };
+ final byte[] expanded = RLEDecompressingInputStream.decompress(compressed);
+ final byte[] expected = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".getBytes();
+ assertArrayEquals(expected, expanded);
+ }
+
+ private static void checkRLEDecompression(String expected, byte[] runLengthEncodedData) {
+ InputStream compressedStream = new ByteArrayInputStream(runLengthEncodedData);
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ try {
+ InputStream stream = new RLEDecompressingInputStream(compressedStream);
+ try {
+ IOUtils.copy(stream, out);
+ } finally {
+ out.close();
+ stream.close();
+ }
+ } catch (final IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ assertEquals(expected, out.toString());
+ }
+}
Propchange: poi/trunk/src/testcases/org/apache/poi/util/TestRLEDecompressingInputStream.java
------------------------------------------------------------------------------
svn:eol-style = native
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org