1 /****************************************************************
2  * Licensed to the Apache Software Foundation (ASF) under one   *
3  * or more contributor license agreements.  See the NOTICE file *
4  * distributed with this work for additional information        *
5  * regarding copyright ownership.  The ASF licenses this file   *
6  * to you under the Apache License, Version 2.0 (the            *
7  * "License"); you may not use this file except in compliance   *
8  * with the License.  You may obtain a copy of the License at   *
9  *                                                              *
10  *   http://www.apache.org/licenses/LICENSE-2.0                 *
11  *                                                              *
12  * Unless required by applicable law or agreed to in writing,   *
13  * software distributed under the License is distributed on an  *
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
15  * KIND, either express or implied.  See the License for the    *
16  * specific language governing permissions and limitations      *
17  * under the License.                                           *
18  ****************************************************************/
19 
20 package org.apache.james.mime4j;
21 
22 import java.io.InputStream;
23 import java.io.IOException;
24 
25 /**
26  * InputStream that shields its underlying input stream from
27  * being closed.
28  *
29  *
30  * @version $Id: CloseShieldInputStream.java,v 1.2 2004/10/02 12:41:10 ntherning Exp $
31  */
32 public class CloseShieldInputStream extends InputStream {
33 
34     /**
35      * Underlying InputStream
36      */
37     private InputStream is;
38 
CloseShieldInputStream(InputStream is)39     public CloseShieldInputStream(InputStream is) {
40         this.is = is;
41     }
42 
getUnderlyingStream()43     public InputStream getUnderlyingStream() {
44         return is;
45     }
46 
47     /**
48      * @see java.io.InputStream#read()
49      */
read()50     public int read() throws IOException {
51         checkIfClosed();
52         return is.read();
53     }
54 
55     /**
56      * @see java.io.InputStream#available()
57      */
available()58     public int available() throws IOException {
59         checkIfClosed();
60         return is.available();
61     }
62 
63 
64     /**
65      * Set the underlying InputStream to null
66      */
close()67     public void close() throws IOException {
68         is = null;
69     }
70 
71     /**
72      * @see java.io.FilterInputStream#reset()
73      */
reset()74     public synchronized void reset() throws IOException {
75         checkIfClosed();
76         is.reset();
77     }
78 
79     /**
80      * @see java.io.FilterInputStream#markSupported()
81      */
markSupported()82     public boolean markSupported() {
83         if (is == null)
84             return false;
85         return is.markSupported();
86     }
87 
88     /**
89      * @see java.io.FilterInputStream#mark(int)
90      */
mark(int readlimit)91     public synchronized void mark(int readlimit) {
92         if (is != null)
93             is.mark(readlimit);
94     }
95 
96     /**
97      * @see java.io.FilterInputStream#skip(long)
98      */
skip(long n)99     public long skip(long n) throws IOException {
100         checkIfClosed();
101         return is.skip(n);
102     }
103 
104     /**
105      * @see java.io.FilterInputStream#read(byte[])
106      */
read(byte b[])107     public int read(byte b[]) throws IOException {
108         checkIfClosed();
109         return is.read(b);
110     }
111 
112     /**
113      * @see java.io.FilterInputStream#read(byte[], int, int)
114      */
read(byte b[], int off, int len)115     public int read(byte b[], int off, int len) throws IOException {
116         checkIfClosed();
117         return is.read(b, off, len);
118     }
119 
120     /**
121      * Check if the underlying InputStream is null. If so throw an Exception
122      *
123      * @throws IOException if the underlying InputStream is null
124      */
checkIfClosed()125     private void checkIfClosed() throws IOException {
126         if (is == null)
127             throw new IOException("Stream is closed");
128     }
129 }
130