Added author to all java files with class comments.
[utils] / socketproxy / src / main / java / org / wamblee / socketproxy / ForwarderThread.java
1 package org.wamblee.socketproxy;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.io.OutputStream;
6
7 /**
8  * Forwarder thread which handles forwarding of an input stream to
9  * an output stream. 
10  *
11  * @author Erik Brakkee
12  */
13
14 public class ForwarderThread extends Thread {
15
16     private String _prefix;
17
18     private Barrier _barrier;
19
20     private InputStream _is;
21
22     private OutputStream _os;
23
24     /**
25      * Constructs the forwarder thread.
26      * @param aPrefix Prefix to use in the output. 
27      * @param aBarrier Barrier to block on before actually closing the stream. 
28      *        This is done to make sure that connections are only closed in th e
29      *        proxy when the forwarders in both directions are ready to close. 
30      * @param aIs Input stream to read from.
31      * @param aOs Output stream to forward to.
32      */
33     public ForwarderThread( String aPrefix, Barrier aBarrier,
34             InputStream aIs, OutputStream aOs ) {
35         _prefix = aPrefix;
36         _is = aIs;
37         _os = aOs;
38         _barrier = aBarrier;
39     }
40
41     public void run( ) {
42         boolean firstChar = true;
43         try {
44             int c = _is.read( );
45             while ( c > 0 ) {
46                 try {
47                     _os.write( c );
48                     _os.flush( );
49                     if ( firstChar ) {
50                         System.out.print( _prefix );
51                         firstChar = false;
52                     }
53                     System.out.print( (char) c );
54                     if ( c == '\n' ) {
55                         firstChar = true;
56                     }
57                 } catch ( IOException e ) {
58                 }
59
60                 c = _is.read( );
61             }
62         } catch ( IOException e ) {
63         }
64         closeStreams();
65     }
66
67     /**
68      * @param is
69      * @param os
70      */
71     private void closeStreams( ) {
72         _barrier.block( ); // wait until the other forwarder for the other direction
73                            // is also closed.
74         try {
75             _is.close( );
76         } catch ( IOException e1 ) {
77             // Empty.
78         }
79         try {
80             _os.flush( );
81             _os.close( );
82         } catch ( IOException e1 ) {
83             // Empty
84         }
85         System.out.println(_prefix + " closed");
86     }
87
88 }