diff options
Diffstat (limited to 'branches/sca-java-1.x/modules/binding-ws-axis2-jms/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/transport/base/streams/ReaderInputStream.java')
-rw-r--r-- | branches/sca-java-1.x/modules/binding-ws-axis2-jms/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/transport/base/streams/ReaderInputStream.java | 229 |
1 files changed, 0 insertions, 229 deletions
diff --git a/branches/sca-java-1.x/modules/binding-ws-axis2-jms/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/transport/base/streams/ReaderInputStream.java b/branches/sca-java-1.x/modules/binding-ws-axis2-jms/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/transport/base/streams/ReaderInputStream.java deleted file mode 100644 index 5047e1a499..0000000000 --- a/branches/sca-java-1.x/modules/binding-ws-axis2-jms/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/transport/base/streams/ReaderInputStream.java +++ /dev/null @@ -1,229 +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.tuscany.sca.binding.ws.axis2.transport.base.streams; - -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.charset.Charset; -import java.nio.charset.CharsetEncoder; -import java.nio.charset.CoderResult; - -/** - * {@link InputStream} implementation that reads a character stream from a {@link Reader} - * and transforms it to a byte stream using a specified charset encoding. The stream - * is transformed using a {@link CharsetEncoder} object, guaranteeing that all charset - * encodings supported by the JRE are handled correctly. In particular for charsets such as - * UTF-16, the implementation ensures that one and only one byte order marker - * is produced. - * <p> - * Since in general it is not possible to predict the number of characters to be read from the - * {@link Reader} to satisfy a read request on the {@link ReaderInputStream}, all reads from - * the {@link Reader} are buffered. There is therefore no well defined correlation - * between the current position of the {@link Reader} and that of the {@link ReaderInputStream}. - * This also implies that in general there is no need to wrap the underlying {@link Reader} - * in a {@link java.io.BufferedReader}. - * <p> - * {@link ReaderInputStream} implements the inverse transformation of {@link java.io.InputStreamReader}; - * in the following example, reading from <tt>in2</tt> would return the same byte - * sequence as reading from <tt>in</tt> (provided that the initial byte sequence is legal - * with respect to the charset encoding): - * <pre> - * InputStream in = ... - * Charset cs = ... - * InputStreamReader reader = new InputStreamReader(in, cs); - * ReaderInputStream in2 = new ReaderInputStream(reader, cs);</pre> - * {@link ReaderInputStream} implements the same transformation as {@link java.io.OutputStreamWriter}, - * except that the control flow is reversed: both classes transform a character stream - * into a byte stream, but {@link java.io.OutputStreamWriter} pushes data to the underlying stream, - * while {@link ReaderInputStream} pulls it from the underlying stream. - * <p> - * Note that while there are use cases where there is no alternative to using - * this class, very often the need to use this class is an indication of a flaw - * in the design of the code. This class is typically used in situations where an existing - * API only accepts an {@link InputStream}, but where the most natural way to produce the data - * is as a character stream, i.e. by providing a {@link Reader} instance. An example of a situation - * where this problem may appear is when implementing the {@link javax.activation.DataSource} - * interface from the Java Activation Framework. - * <p> - * Given the fact that the {@link Reader} class doesn't provide any way to predict whether the next - * read operation will block or not, it is not possible to provide a meaningful - * implementation of the {@link InputStream#available()} method. A call to this method - * will always return 0. Also, this class doesn't support {@link InputStream#mark(int)}. - * <p> - * Instances of {@link ReaderInputStream} are not thread safe. - */ -// NOTE: Remove this class once Commons IO 2.0 is available (see IO-158) -public class ReaderInputStream extends InputStream { - private static final int DEFAULT_BUFFER_SIZE = 1024; - - private final Reader reader; - private final CharsetEncoder encoder; - - /** - * CharBuffer used as input for the decoder. It should be reasonably - * large as we read data from the underlying Reader into this buffer. - */ - private final CharBuffer encoderIn; - - /** - * ByteBuffer used as output for the decoder. This buffer can be small - * as it is only used to transfer data from the decoder to the - * buffer provided by the caller. - */ - private final ByteBuffer encoderOut = ByteBuffer.allocate(128); - - private CoderResult lastCoderResult; - private boolean endOfInput; - - /** - * Construct a new {@link ReaderInputStream}. - * - * @param reader the target {@link Reader} - * @param charset the charset encoding - * @param bufferSize the size of the input buffer in number of characters - */ - public ReaderInputStream(Reader reader, Charset charset, int bufferSize) { - this.reader = reader; - encoder = charset.newEncoder(); - encoderIn = CharBuffer.allocate(bufferSize); - encoderIn.flip(); - } - - /** - * Construct a new {@link ReaderInputStream} with a default input buffer size of - * 1024 characters. - * - * @param reader the target {@link Reader} - * @param charset the charset encoding - */ - public ReaderInputStream(Reader reader, Charset charset) { - this(reader, charset, DEFAULT_BUFFER_SIZE); - } - - /** - * Construct a new {@link ReaderInputStream}. - * - * @param reader the target {@link Reader} - * @param charsetName the name of the charset encoding - * @param bufferSize the size of the input buffer in number of characters - */ - public ReaderInputStream(Reader reader, String charsetName, int bufferSize) { - this(reader, Charset.forName(charsetName), bufferSize); - } - - /** - * Construct a new {@link ReaderInputStream} with a default input buffer size of - * 1024 characters. - * - * @param reader the target {@link Reader} - * @param charsetName the name of the charset encoding - */ - public ReaderInputStream(Reader reader, String charsetName) { - this(reader, charsetName, DEFAULT_BUFFER_SIZE); - } - - /** - * Construct a new {@link ReaderInputStream} that uses the default character encoding - * with a default input buffer size of 1024 characters. - * - * @param reader the target {@link Reader} - */ - public ReaderInputStream(Reader reader) { - this(reader, Charset.defaultCharset()); - } - - /** - * Read the specified number of bytes into an array. - * - * @param b the byte array to read into - * @param off the offset to start reading bytes into - * @param len the number of bytes to read - * @return the number of bytes read or <code>-1</code> - * if the end of the stream has been reached - */ - @Override - public int read(byte[] b, int off, int len) throws IOException { - int read = 0; - while (len > 0) { - if (encoderOut.position() > 0) { - encoderOut.flip(); - int c = Math.min(encoderOut.remaining(), len); - encoderOut.get(b, off, c); - off += c; - len -= c; - read += c; - encoderOut.compact(); - } else { - if (!endOfInput && (lastCoderResult == null || lastCoderResult.isUnderflow())) { - encoderIn.compact(); - int position = encoderIn.position(); - // We don't use Reader#read(CharBuffer) here because it is more efficient - // to write directly to the underlying char array (the default implementation - // copies data to a temporary char array). - int c = reader.read(encoderIn.array(), position, encoderIn.remaining()); - if (c == -1) { - endOfInput = true; - } else { - encoderIn.position(position+c); - } - encoderIn.flip(); - } - lastCoderResult = encoder.encode(encoderIn, encoderOut, endOfInput); - if (endOfInput && encoderOut.position() == 0) { - break; - } - } - } - return read == 0 && endOfInput ? -1 : read; - } - - /** - * Read the specified number of bytes into an array. - * - * @param b the byte array to read into - * @return the number of bytes read or <code>-1</code> - * if the end of the stream has been reached - */ - @Override - public int read(byte[] b) throws IOException { - return read(b, 0, b.length); - } - - /** - * Read a single byte. - * - * @return either the byte read or <code>-1</code> if the end of the stream - * has been reached - */ - @Override - public int read() throws IOException { - byte[] b = new byte[1]; - return read(b) == -1 ? -1 : b[0] & 0xFF; - } - - /** - * Close the stream. This method will cause the underlying {@link Reader} - * to be closed. - */ - @Override - public void close() throws IOException { - reader.close(); - } -} |