14ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira/*
24ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Licensed to the Apache Software Foundation (ASF) under one or more
34ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * contributor license agreements.  See the NOTICE file distributed with
44ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * this work for additional information regarding copyright ownership.
54ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * The ASF licenses this file to You under the Apache License, Version 2.0
64ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * (the "License"); you may not use this file except in compliance with
74ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * the License.  You may obtain a copy of the License at
84ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira *
94ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira *      http://www.apache.org/licenses/LICENSE-2.0
104ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira *
114ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Unless required by applicable law or agreed to in writing, software
124ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS,
134ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * See the License for the specific language governing permissions and
154ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * limitations under the License.
164ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */
174ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereirapackage org.apache.commons.io.input;
184ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
194ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.IOException;
204ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.InputStream;
214ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
224ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira/**
234ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Data written to this stream is forwarded to a stream that has been associated
244ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * with this thread.
254ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira *
264ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @author <a href="mailto:peter@apache.org">Peter Donald</a>
274ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @version $Revision: 437567 $ $Date: 2006-08-28 07:39:07 +0100 (Mon, 28 Aug 2006) $
284ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */
294ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereirapublic class DemuxInputStream
304ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    extends InputStream
314ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira{
324ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    private InheritableThreadLocal<InputStream> m_streams = new InheritableThreadLocal<InputStream>();
334ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
344ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
354ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Bind the specified stream to the current thread.
364ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
374ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @param input the stream to bind
384ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @return the InputStream that was previously active
394ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
404ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    public InputStream bindStream( InputStream input )
414ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
424ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        InputStream oldValue = getStream();
434ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        m_streams.set( input );
444ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        return oldValue;
454ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
464ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
474ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
484ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Closes stream associated with current thread.
494ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
504ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @throws IOException if an error occurs
514ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
524ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    @Override
534ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    public void close()
544ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        throws IOException
554ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
564ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        InputStream input = getStream();
574ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        if( null != input )
584ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        {
594ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira            input.close();
604ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        }
614ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
624ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
634ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
644ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Read byte from stream associated with current thread.
654ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
664ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @return the byte read from stream
674ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @throws IOException if an error occurs
684ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
694ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    @Override
704ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    public int read()
714ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        throws IOException
724ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
734ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        InputStream input = getStream();
744ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        if( null != input )
754ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        {
764ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira            return input.read();
774ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        }
784ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        else
794ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        {
804ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira            return -1;
814ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        }
824ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
834ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
844ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
854ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Utility method to retrieve stream bound to current thread (if any).
864ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
874ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @return the input stream
884ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
894ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    private InputStream getStream()
904ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
914ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        return m_streams.get();
924ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
934ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira}
94