View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 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.nio.ByteBuffer;
23  
24  import org.eclipse.jetty.util.log.Log;
25  import org.eclipse.jetty.util.log.Logger;
26  import org.eclipse.jetty.websocket.api.WebSocketListener;
27  import org.eclipse.jetty.websocket.api.WebSocketPolicy;
28  import org.eclipse.jetty.websocket.api.extensions.Frame;
29  import org.eclipse.jetty.websocket.common.CloseInfo;
30  import org.eclipse.jetty.websocket.common.message.MessageAppender;
31  import org.eclipse.jetty.websocket.common.message.SimpleBinaryMessage;
32  import org.eclipse.jetty.websocket.common.message.SimpleTextMessage;
33  
34  /**
35   * Handler for {@link WebSocketListener} based User WebSocket implementations.
36   */
37  public class ListenerEventDriver extends EventDriver
38  {
39      private static final Logger LOG = Log.getLogger(ListenerEventDriver.class);
40      private final WebSocketListener listener;
41      private MessageAppender activeMessage;
42      private boolean hasCloseBeenCalled = false;
43  
44      public ListenerEventDriver(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          activeMessage.appendMessage(buffer);
59  
60          if (fin)
61          {
62              activeMessage.messageComplete();
63              activeMessage = null;
64          }
65      }
66  
67      @Override
68      public void onBinaryMessage(byte[] data)
69      {
70          listener.onWebSocketBinary(data,0,data.length);
71      }
72  
73      @Override
74      public void onClose(CloseInfo close)
75      {
76          if (hasCloseBeenCalled)
77          {
78              // avoid duplicate close events (possible when using harsh Session.disconnect())
79              return;
80          }
81          hasCloseBeenCalled = true;
82  
83          int statusCode = close.getStatusCode();
84          String reason = close.getReason();
85          listener.onWebSocketClose(statusCode,reason);
86      }
87  
88      @Override
89      public void onConnect()
90      {
91          LOG.debug("onConnect()");
92          listener.onWebSocketConnect(session);
93      }
94  
95      @Override
96      public void onError(Throwable cause)
97      {
98          listener.onWebSocketError(cause);
99      }
100 
101     @Override
102     public void onFrame(Frame frame)
103     {
104         /* ignore, not supported by WebSocketListener */
105     }
106 
107     @Override
108     public void onTextFrame(ByteBuffer buffer, boolean fin) throws IOException
109     {
110         if (activeMessage == null)
111         {
112             activeMessage = new SimpleTextMessage(this);
113         }
114 
115         activeMessage.appendMessage(buffer);
116 
117         if (fin)
118         {
119             activeMessage.messageComplete();
120             activeMessage = null;
121         }
122     }
123 
124     @Override
125     public void onTextMessage(String message)
126     {
127         listener.onWebSocketText(message);
128     }
129 }