You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by ka...@apache.org on 2008/08/22 12:53:41 UTC
svn commit: r688049 - in /db/derby/code/trunk/java:
engine/org/apache/derby/iapi/util/
testing/org/apache/derbyTesting/unitTests/junit/
Author: kahatlen
Date: Fri Aug 22 03:53:40 2008
New Revision: 688049
URL: http://svn.apache.org/viewvc?rev=688049&view=rev
Log:
DERBY-3770: Create a utility class for skipping data in an InputStream
Patch contributed by Junjie Peng <pj...@gmail.com>.
Added:
db/derby/code/trunk/java/engine/org/apache/derby/iapi/util/StreamUtil.java (with props)
db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/StreamUtilTest.java (with props)
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/iapi/util/UTF8Util.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/_Suite.java
Added: db/derby/code/trunk/java/engine/org/apache/derby/iapi/util/StreamUtil.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/util/StreamUtil.java?rev=688049&view=auto
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/util/StreamUtil.java (added)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/util/StreamUtil.java Fri Aug 22 03:53:40 2008
@@ -0,0 +1,118 @@
+/*
+
+ Derby - Class org.apache.derby.iapi.util.StreamUtil
+
+ 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.derby.iapi.util;
+
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Utility methods for handling streams.
+ * It clarifies the using of skipping a stream. See DERBY-3770.
+ */
+public class StreamUtil {
+ private static final int SKIP_BUFFER_SIZE = 1024 * 1024;
+
+ /**
+ * Skips until EOF, returns number of bytes skipped.
+ * @param is
+ * InputStream to be skipped.
+ * @return
+ * number of bytes skipped in fact.
+ * @throws IOException
+ * if IOException occurs. It doesn't contain EOFException.
+ * @throws NullPointerException
+ * if the param 'is' equals null.
+ */
+ public static long skipFully(InputStream is) throws IOException {
+ if(is == null)
+ throw new NullPointerException();
+
+ long bytes = 0;
+ long r = 0;
+ while((r = skipPersistent(is, SKIP_BUFFER_SIZE)) > 0){
+ bytes += r;
+ }
+
+ return bytes;
+ }
+
+ /**
+ * Skips requested number of bytes,
+ * throws EOFException if there is too few bytes in the stream.
+ * @param is
+ * InputStream to be skipped.
+ * @param skippedBytes
+ * number of bytes to skip. if skippedBytes <= zero, do nothing.
+ * @throws EOFException
+ * if EOF meets before requested number of bytes are skipped.
+ * @throws IOException
+ * if IOException occurs. It doesn't contain EOFException.
+ * @throws NullPointerException
+ * if the param 'is' equals null.
+ */
+ public static void skipFully(InputStream is, long skippedBytes)
+ throws IOException {
+ if(is == null)
+ throw new NullPointerException();
+
+ if(skippedBytes <= 0)
+ return;
+
+ long bytes = skipPersistent(is, skippedBytes);
+
+ if(bytes < skippedBytes)
+ throw new EOFException();
+ }
+
+ /**
+ * Tries harder to skip the requested number of bytes.
+ * <p>
+ * Note that even if the method fails to skip the requested number of bytes,
+ * it will not throw an exception. If this happens, the caller can be sure
+ * that end-of-stream has been reached.
+ *
+ * @param in byte stream
+ * @param bytesToSkip the number of bytes to skip
+ * @return The number of bytes skipped.
+ * @throws IOException if reading from the stream fails
+ */
+ static final long skipPersistent(InputStream in, long bytesToSkip)
+ throws IOException {
+ long skipped = 0;
+ while (skipped < bytesToSkip) {
+ long skippedNow = in.skip(bytesToSkip - skipped);
+ if (skippedNow <= 0) {
+ if (in.read() == -1) {
+ // EOF, return what we have and leave it up to caller to
+ // decide what to do about it.
+ break;
+ } else {
+ skippedNow = 1; // Added to count below.
+ }
+ }
+ skipped += skippedNow;
+ }
+ return skipped;
+ }
+}
Propchange: db/derby/code/trunk/java/engine/org/apache/derby/iapi/util/StreamUtil.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/util/UTF8Util.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/util/UTF8Util.java?rev=688049&r1=688048&r2=688049&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/util/UTF8Util.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/util/UTF8Util.java Fri Aug 22 03:53:40 2008
@@ -118,7 +118,7 @@
bytesSkipped++;
} else if ((c & 0x60) == 0x40) { // 7th bit set, 6th bit unset
// Found char of two byte width.
- if (skipPersistent(in, 1L) != 1L) {
+ if (StreamUtil.skipPersistent(in, 1L) != 1L) {
// No second byte present.
throw new UTFDataFormatException(
"Second byte in two byte character missing; byte pos " +
@@ -144,7 +144,7 @@
skipped = 2;
}
} else {
- skipped = (int)skipPersistent(in, 2L);
+ skipped = (int)StreamUtil.skipPersistent(in, 2L);
}
if (skipped != 2) {
// No second or third byte present
@@ -165,37 +165,6 @@
}
/**
- * Tries harder to skip the requested number of bytes.
- * <p>
- * Note that even if the method fails to skip the requested number of bytes,
- * it will not throw an exception. If this happens, the caller can be sure
- * that end-of-stream has been reached.
- *
- * @param in byte stream
- * @param bytesToSkip the number of bytes to skip
- * @return The number of bytes skipped.
- * @throws IOException if reading from the stream fails
- */
- private static final long skipPersistent(InputStream in, long bytesToSkip)
- throws IOException {
- long skipped = 0;
- while (skipped < bytesToSkip) {
- long skippedNow = in.skip(bytesToSkip - skipped);
- if (skippedNow <= 0) {
- if (in.read() == -1) {
- // EOF, return what we have and leave it up to caller to
- // decide what to do about it.
- break;
- } else {
- skippedNow = 1; // Added to count below.
- }
- }
- skipped += skippedNow;
- }
- return skipped;
- }
-
- /**
* Helper class to hold skip counts; one for chars and one for bytes.
*/
// @Immutable
Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/StreamUtilTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/StreamUtilTest.java?rev=688049&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/StreamUtilTest.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/StreamUtilTest.java Fri Aug 22 03:53:40 2008
@@ -0,0 +1,106 @@
+/*
+
+ Derby - Class org.apache.derbyTesting.unitTests.junit.StreamUtilTest
+
+ 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.derbyTesting.unitTests.junit;
+
+import java.io.ByteArrayInputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.derby.iapi.util.StreamUtil;
+import org.apache.derbyTesting.junit.BaseTestCase;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Test case for StreamUtil.
+ */
+public class StreamUtilTest extends BaseTestCase {
+
+ public StreamUtilTest(String name) {
+ super(name);
+ }
+
+ public void testNullStream() throws IOException{
+ try{
+ StreamUtil.skipFully(null);
+ fail("Null InputStream is accepted!");
+ }catch (NullPointerException e) {
+ assertTrue(true);
+ }
+
+ try{
+ StreamUtil.skipFully(null, 0);
+ fail("Null InputStream is accepted!");
+ }catch (NullPointerException e) {
+ assertTrue(true);
+ }
+ }
+
+ public void testSkipUtilEOFWithOddLength() throws IOException{
+ int[] lengths = {0, 1};
+
+ for(int i = 0; i < lengths.length; i++){
+ int length = lengths[i];
+ InputStream is = new ByteArrayInputStream(new byte[length]);
+ assertEquals(length, StreamUtil.skipFully(is));
+ }
+ }
+
+ public void testSkipUtilEOF() throws IOException{
+ int[] lengths = {1024, 1024 * 1024};
+
+ for(int i = 0; i < lengths.length; i++){
+ int length = lengths[i];
+ InputStream is = new ByteArrayInputStream(new byte[length]);
+ assertEquals(length, StreamUtil.skipFully(is));
+ }
+ }
+
+ public void testSkipFully() throws IOException{
+ int length = 1024;
+
+ InputStream is = new ByteArrayInputStream(new byte[length]);
+ StreamUtil.skipFully(is, length);
+ assertEquals(0, StreamUtil.skipFully(is));
+
+ is = new ByteArrayInputStream(new byte[length]);
+ StreamUtil.skipFully(is, length - 1);
+ assertEquals(1, StreamUtil.skipFully(is));
+
+ is = new ByteArrayInputStream(new byte[length]);
+ try {
+ StreamUtil.skipFully(is, length + 1);
+ fail("Should have Meet EOF!");
+ } catch (EOFException e) {
+ assertTrue(true);
+ }
+ assertEquals(0, StreamUtil.skipFully(is));
+ }
+
+ /**
+ * Returns a suite of tests.
+ */
+ public static Test suite() {
+ return new TestSuite(StreamUtilTest.class, "StreamUtil tests");
+ }
+}
Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/StreamUtilTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/_Suite.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/_Suite.java?rev=688049&r1=688048&r2=688049&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/_Suite.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/_Suite.java Fri Aug 22 03:53:40 2008
@@ -24,7 +24,6 @@
import java.sql.SQLException;
import org.apache.derbyTesting.junit.BaseTestCase;
-import org.apache.derbyTesting.junit.SecurityManagerSetup;
import junit.framework.Test;
import junit.framework.TestSuite;
@@ -53,6 +52,7 @@
suite.addTest(UTF8UtilTest.suite());
suite.addTestSuite(CompressedNumberTest.class);
suite.addTest(AssertFailureTest.suite());
+ suite.addTest(StreamUtilTest.suite());
return suite;
}