1package org.chromium;
2
3import java.io.BufferedReader;
4import java.io.IOException;
5import java.io.InputStreamReader;
6import java.io.OutputStreamWriter;
7import java.net.Socket;
8import java.net.UnknownHostException;
9import java.util.Set;
10import java.util.concurrent.CopyOnWriteArraySet;
11
12import javax.net.SocketFactory;
13import javax.servlet.ServletException;
14import javax.servlet.http.HttpServletRequest;
15import javax.servlet.http.HttpServletResponse;
16
17import org.eclipse.jetty.websocket.WebSocket;
18import org.eclipse.jetty.websocket.WebSocketServlet;
19
20public class IRCProxyWebSocket extends WebSocketServlet {
21
22  private static final long serialVersionUID = 1L;
23
24  private final Set<ChatWebSocket> members_ =
25      new CopyOnWriteArraySet<ChatWebSocket>();
26
27  protected void doGet(HttpServletRequest request, HttpServletResponse response)
28      throws ServletException ,IOException {
29    getServletContext().getNamedDispatcher("default").forward(request,response);
30  }
31
32  protected WebSocket doWebSocketConnect(HttpServletRequest request,
33                                         String protocol) {
34    return new ChatWebSocket();
35  }
36
37  class ChatWebSocket implements WebSocket, Runnable {
38    Outbound outbound_;
39    Socket socket_ = null;
40    OutputStreamWriter out_;
41    BufferedReader in_;
42    Thread thread_;
43    byte frame_ = 0;
44
45    public void onConnect(Outbound outbound) {
46      outbound_= outbound;
47    }
48
49    public void onMessage(byte frame, byte[] data,int offset, int length) {}
50
51    public void onMessage(byte frame, String data) {
52      try {
53        if (socket_ == null) {
54          try {
55            // We assume the client is going to connect and initiate a
56            // connection with the message "server:port".
57            String tokens[] = data.split(":");
58            socket_ = SocketFactory.getDefault().createSocket(tokens[0],
59                Integer.parseInt(tokens[1]));
60            out_ = new OutputStreamWriter(socket_.getOutputStream());
61            InputStreamReader in = new InputStreamReader(
62                socket_.getInputStream());
63            in_ = new BufferedReader(in);
64
65            members_.add(this);
66            thread_ = new Thread(this);
67            thread_.start();
68
69          } catch (UnknownHostException e) {
70            // TODO Auto-generated catch block
71            e.printStackTrace();
72          } catch (IOException e) {
73            // TODO Auto-generated catch block
74            e.printStackTrace();
75          }
76        } else {
77          System.out.print(">> " + data);
78          out_.write(data);
79          out_.flush();
80        }
81      } catch (IOException e) {
82        // TODO Auto-generated catch block
83        e.printStackTrace();
84      }
85    }
86
87    public void onDisconnect() {
88      try {
89        socket_.close();
90        thread_.stop();
91      } catch (IOException e) {
92        // TODO Auto-generated catch block
93        e.printStackTrace();
94      }
95      members_.remove(this);
96    }
97
98    @Override
99    public void run() {
100      while(true) {
101        try {
102           if (in_.ready()) {
103            String line = in_.readLine();
104            System.out.println("<< " + line);
105            outbound_.sendMessage(frame_, line + "\r\n");
106
107          } else {
108            Thread.sleep(100);
109          }
110        } catch (IOException e) {
111        } catch (InterruptedException e) {
112        }
113      }
114    }
115  }
116}
117