View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package org.eclipse.jetty.websocket.common.events;
20  
21  import java.io.IOException;
22  import java.io.InputStream;
23  import java.io.Reader;
24  import java.nio.ByteBuffer;
25  
26  import org.eclipse.jetty.util.log.Log;
27  import org.eclipse.jetty.util.log.Logger;
28  import org.eclipse.jetty.websocket.api.WebSocketListener;
29  import org.eclipse.jetty.websocket.api.WebSocketPolicy;
30  import org.eclipse.jetty.websocket.api.extensions.Frame;
31  import org.eclipse.jetty.websocket.common.CloseInfo;
32  import org.eclipse.jetty.websocket.common.message.SimpleBinaryMessage;
33  import org.eclipse.jetty.websocket.common.message.SimpleTextMessage;
34  
35  /**
36   * Handler for {@link WebSocketListener} based User WebSocket implementations.
37   */
38  public class JettyListenerEventDriver extends AbstractEventDriver
39  {
40      private static final Logger LOG = Log.getLogger(JettyListenerEventDriver.class);
41      private final WebSocketListener listener;
42      private boolean hasCloseBeenCalled = false;
43  
44      public JettyListenerEventDriver(WebSocketPolicy policy, WebSocketListener listener)
45      {
46          super(policy,listener);
47          this.listener = listener;
48      }
49  
50      @Override
51      public void onBinaryFrame(ByteBuffer buffer, boolean fin) throws IOException
52      {
53          if (activeMessage == null)
54          {
55              activeMessage = new SimpleBinaryMessage(this);
56          }
57  
58          appendMessage(buffer,fin);
59      }
60  
61      @Override
62      public void onBinaryMessage(byte[] data)
63      {
64          listener.onWebSocketBinary(data,0,data.length);
65      }
66  
67      @Override
68      public void onClose(CloseInfo close)
69      {
70          if (hasCloseBeenCalled)
71          {
72              // avoid duplicate close events (possible when using harsh Session.disconnect())
73              return;
74          }
75          hasCloseBeenCalled = true;
76  
77          int statusCode = close.getStatusCode();
78          String reason = close.getReason();
79          listener.onWebSocketClose(statusCode,reason);
80      }
81  
82      @Override
83      public void onConnect()
84      {
85          if (LOG.isDebugEnabled())
86              LOG.debug("onConnect()");
87          listener.onWebSocketConnect(session);
88      }
89  
90      @Override
91      public void onError(Throwable cause)
92      {
93          listener.onWebSocketError(cause);
94      }
95  
96      @Override
97      public void onFrame(Frame frame)
98      {
99          /* ignore, not supported by WebSocketListener */
100     }
101 
102     @Override
103     public void onInputStream(InputStream stream)
104     {
105         /* not supported in Listener mode (yet) */
106     }
107 
108     @Override
109     public void onReader(Reader reader)
110     {
111         /* not supported in Listener mode (yet) */
112     }
113 
114     @Override
115     public void onTextFrame(ByteBuffer buffer, boolean fin) throws IOException
116     {
117         if (activeMessage == null)
118         {
119             activeMessage = new SimpleTextMessage(this);
120         }
121 
122         appendMessage(buffer,fin);
123     }
124 
125     @Override
126     public void onTextMessage(String message)
127     {
128         listener.onWebSocketText(message);
129     }
130 
131     @Override
132     public String toString()
133     {
134         return String.format("%s[%s]",JettyListenerEventDriver.class.getSimpleName(),listener.getClass().getName());
135     }
136 }