1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.io;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Wraps an existing {@link Reader} and performs some transformation on the
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * input data while it is being read. Transformations can be anything from a
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * simple byte-wise filtering input data to an on-the-fly compression or
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * decompression of the underlying reader. Readers that wrap another reader and
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * provide some additional functionality on top of it usually inherit from this
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class.
27f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see FilterWriter
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class FilterReader extends Reader {
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The target Reader which is being filtered.
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Reader in;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new FilterReader on the Reader {@code in}.
39f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param in
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The non-null Reader to filter reads on.
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected FilterReader(Reader in) {
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(in);
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.in = in;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes this reader. This implementation closes the filtered reader.
50f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while closing this reader.
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void close() throws IOException {
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            in.close();
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets a mark position in this reader. The parameter {@code readlimit}
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * indicates how many bytes can be read before the mark is invalidated.
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sending {@code reset()} will reposition this reader back to the marked
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * position, provided that {@code readlimit} has not been surpassed.
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This implementation sets a mark in the filtered reader.
68f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param readlimit
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bytes that can be read from this reader before
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the mark is invalidated.
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while marking this reader.
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #markSupported()
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #reset()
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void mark(int readlimit) throws IOException {
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            in.mark(readlimit);
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this reader supports {@code mark()} and {@code reset()}.
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This implementation returns whether the filtered reader supports marking.
87f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if {@code mark()} and {@code reset()} are supported
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         by the filtered reader, {@code false} otherwise.
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #mark(int)
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #reset()
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #skip(long)
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean markSupported() {
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return in.markSupported();
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads a single character from the filtered reader and returns it as an
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * integer with the two higher-order bytes set to 0. Returns -1 if the end
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of the filtered reader has been reached.
105f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return The character read or -1 if the end of the filtered reader has
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         been reached.
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading from this reader.
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int read() throws IOException {
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return in.read();
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads at most {@code count} characters from the filtered reader and stores them
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in the byte array {@code buffer} starting at {@code offset}. Returns the
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number of characters actually read or -1 if no characters were read and
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the end of the filtered reader was encountered.
123f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the char array in which to store the characters read.
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the initial position in {@code buffer} to store the characters
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            read from this reader.
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param count
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the maximum number of characters to store in {@code buffer}.
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of characters actually read or -1 if the end of the
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         filtered reader has been reached while reading.
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading from this reader.
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int read(char[] buffer, int offset, int count) throws IOException {
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return in.read(buffer, offset, count);
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this reader is ready to be read without blocking. If
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the result is {@code true}, the next {@code read()} will not block. If
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the result is {@code false}, this reader may or may not block when
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code read()} is sent.
148f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this reader will not block when {@code read()}
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is called, {@code false} if unknown or blocking will occur.
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the reader is closed or some other I/O error occurs.
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean ready() throws IOException {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return in.ready();
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Resets this reader's position to the last marked location. Invocations of
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code read()} and {@code skip()} will occur from this new location. If
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this reader was not marked, the behavior depends on the implementation of
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code reset()} in the Reader subclass that is filtered by this reader.
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The default behavior for Reader is to throw an {@code IOException}.
167f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a problem occurred or the filtered reader does not support
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             {@code mark()} and {@code reset()}.
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #mark(int)
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #markSupported()
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void reset() throws IOException {
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            in.reset();
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
182f9480f317cddcec859025833b748f096247a40aaElliott Hughes     * Skips {@code charCount} characters in this reader. Subsequent calls to {@code read}
183f9480f317cddcec859025833b748f096247a40aaElliott Hughes     * will not return these characters unless {@code reset} is used. The
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * default implementation is to skip characters in the filtered reader.
185f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of characters actually skipped.
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the filtered reader is closed or some other I/O error
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             occurs.
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #mark(int)
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #markSupported()
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #reset()
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
195f9480f317cddcec859025833b748f096247a40aaElliott Hughes    public long skip(long charCount) throws IOException {
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (lock) {
197f9480f317cddcec859025833b748f096247a40aaElliott Hughes            return in.skip(charCount);
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
201