001    /*
002     * $HeadURL: http://juliusdavies.ca/svn/not-yet-commons-ssl/tags/commons-ssl-0.3.11/src/java/org/apache/commons/ssl/ComboInputStream.java $
003     * $Revision: 121 $
004     * $Date: 2007-11-13 21:26:57 -0800 (Tue, 13 Nov 2007) $
005     *
006     * ====================================================================
007     * Licensed to the Apache Software Foundation (ASF) under one
008     * or more contributor license agreements.  See the NOTICE file
009     * distributed with this work for additional information
010     * regarding copyright ownership.  The ASF licenses this file
011     * to you under the Apache License, Version 2.0 (the
012     * "License"); you may not use this file except in compliance
013     * with the License.  You may obtain a copy of the License at
014     *
015     *   http://www.apache.org/licenses/LICENSE-2.0
016     *
017     * Unless required by applicable law or agreed to in writing,
018     * software distributed under the License is distributed on an
019     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
020     * KIND, either express or implied.  See the License for the
021     * specific language governing permissions and limitations
022     * under the License.
023     * ====================================================================
024     *
025     * This software consists of voluntary contributions made by many
026     * individuals on behalf of the Apache Software Foundation.  For more
027     * information on the Apache Software Foundation, please see
028     * <http://www.apache.org/>.
029     *
030     */
031    
032    package org.apache.commons.ssl;
033    
034    import java.io.IOException;
035    import java.io.InputStream;
036    
037    /**
038     * @author Credit Union Central of British Columbia
039     * @author <a href="http://www.cucbc.com/">www.cucbc.com</a>
040     * @author <a href="mailto:juliusdavies@cucbc.com">juliusdavies@cucbc.com</a>
041     * @since 22-Feb-2007
042     */
043    public class ComboInputStream extends InputStream {
044        private boolean headDone;
045        private InputStream head;
046        private InputStream tail;
047    
048        public ComboInputStream(InputStream head, InputStream tail) {
049            this.head = head != null ? head : tail;
050            this.tail = tail != null ? tail : head;
051        }
052    
053        public int read() throws IOException {
054            int c;
055            if (headDone) {
056                c = tail.read();
057            } else {
058                c = head.read();
059                if (c == -1) {
060                    headDone = true;
061                    c = tail.read();
062                }
063            }
064            return c;
065        }
066    
067        public int available() throws IOException {
068            return tail.available() + head.available();
069        }
070    
071        public void close() throws IOException {
072            try {
073                head.close();
074            }
075            finally {
076                if (head != tail) {
077                    tail.close();
078                }
079            }
080        }
081    
082        public int read(byte b[], int off, int len) throws IOException {
083            int c;
084            if (headDone) {
085                c = tail.read(b, off, len);
086            } else {
087                c = head.read(b, off, len);
088                if (c == -1) {
089                    headDone = true;
090                    c = tail.read(b, off, len);
091                }
092            }
093            return c;
094        }
095    
096    }