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