Skip to content

Commit

Permalink
Updating WebSocket JettyListenerEventDriver for new Listeners
Browse files Browse the repository at this point in the history
+ Basing implementation on instances of WebSocketConnectionListener
+ Adding support for:
  * WebSocketListener
  * WebSocketPartialListener
  * WebSocketPingPongListener
  * WebSocketFrameListener
  • Loading branch information
joakime committed May 6, 2015
1 parent 8e7f051 commit 77e42fb
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,23 +25,31 @@

import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.websocket.api.WebSocketConnectionListener;
import org.eclipse.jetty.websocket.api.WebSocketFrameListener;
import org.eclipse.jetty.websocket.api.WebSocketListener;
import org.eclipse.jetty.websocket.api.WebSocketPartialListener;
import org.eclipse.jetty.websocket.api.WebSocketPingPongListener;
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
import org.eclipse.jetty.websocket.api.extensions.Frame;
import org.eclipse.jetty.websocket.api.extensions.Frame.Type;
import org.eclipse.jetty.websocket.common.CloseInfo;
import org.eclipse.jetty.websocket.common.frames.ReadOnlyDelegatedFrame;
import org.eclipse.jetty.websocket.common.message.SimpleBinaryMessage;
import org.eclipse.jetty.websocket.common.message.SimpleTextMessage;
import org.eclipse.jetty.websocket.common.util.Utf8PartialBuilder;

/**
* Handler for {@link WebSocketListener} based User WebSocket implementations.
*/
public class JettyListenerEventDriver extends AbstractEventDriver
{
private static final Logger LOG = Log.getLogger(JettyListenerEventDriver.class);
private final WebSocketListener listener;
private final WebSocketConnectionListener listener;
private Utf8PartialBuilder utf8Partial;
private boolean hasCloseBeenCalled = false;

public JettyListenerEventDriver(WebSocketPolicy policy, WebSocketListener listener)
public JettyListenerEventDriver(WebSocketPolicy policy, WebSocketConnectionListener listener)
{
super(policy,listener);
this.listener = listener;
Expand All @@ -50,18 +58,29 @@ public JettyListenerEventDriver(WebSocketPolicy policy, WebSocketListener listen
@Override
public void onBinaryFrame(ByteBuffer buffer, boolean fin) throws IOException
{
if (activeMessage == null)
if (listener instanceof WebSocketListener)
{
activeMessage = new SimpleBinaryMessage(this);
if (activeMessage == null)
{
activeMessage = new SimpleBinaryMessage(this);
}

appendMessage(buffer,fin);
}

appendMessage(buffer,fin);
if (listener instanceof WebSocketPartialListener)
{
((WebSocketPartialListener)listener).onWebSocketPartialBinary(buffer.slice().asReadOnlyBuffer(),fin);
}
}

@Override
public void onBinaryMessage(byte[] data)
{
listener.onWebSocketBinary(data,0,data.length);
if (listener instanceof WebSocketListener)
{
((WebSocketListener)listener).onWebSocketBinary(data,0,data.length);
}
}

@Override
Expand Down Expand Up @@ -96,7 +115,22 @@ public void onError(Throwable cause)
@Override
public void onFrame(Frame frame)
{
/* ignore, not supported by WebSocketListener */
if (listener instanceof WebSocketFrameListener)
{
((WebSocketFrameListener)listener).onWebSocketFrame(new ReadOnlyDelegatedFrame(frame));
}

if (listener instanceof WebSocketPingPongListener)
{
if (frame.getType() == Type.PING)
{
((WebSocketPingPongListener)listener).onWebSocketPing(frame.getPayload().asReadOnlyBuffer());
}
else if (frame.getType() == Type.PONG)
{
((WebSocketPingPongListener)listener).onWebSocketPong(frame.getPayload().asReadOnlyBuffer());
}
}
}

@Override
Expand All @@ -114,18 +148,46 @@ public void onReader(Reader reader)
@Override
public void onTextFrame(ByteBuffer buffer, boolean fin) throws IOException
{
if (activeMessage == null)
if (listener instanceof WebSocketListener)
{
activeMessage = new SimpleTextMessage(this);
if (activeMessage == null)
{
activeMessage = new SimpleTextMessage(this);
}

appendMessage(buffer,fin);
}

appendMessage(buffer,fin);
if (listener instanceof WebSocketPartialListener)
{
if (utf8Partial == null)
{
utf8Partial = new Utf8PartialBuilder();
}

String partial = utf8Partial.toPartialString(buffer);

((WebSocketPartialListener)listener).onWebSocketPartialText(partial,fin);

if (fin)
{
partial = null;
}
}
}

/**
* Whole Message event.
*
* @param message the whole message
*/
@Override
public void onTextMessage(String message)
{
listener.onWebSocketText(message);
if (listener instanceof WebSocketListener)
{
((WebSocketListener)listener).onWebSocketText(message);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package org.eclipse.jetty.websocket.common.events;

import org.eclipse.jetty.websocket.api.WebSocketConnectionListener;
import org.eclipse.jetty.websocket.api.WebSocketListener;
import org.eclipse.jetty.websocket.api.WebSocketPolicy;

Expand All @@ -26,7 +27,7 @@ public class JettyListenerImpl implements EventDriverImpl
@Override
public EventDriver create(Object websocket, WebSocketPolicy policy)
{
WebSocketListener listener = (WebSocketListener)websocket;
WebSocketConnectionListener listener = (WebSocketConnectionListener)websocket;
return new JettyListenerEventDriver(policy,listener);
}

Expand All @@ -39,6 +40,6 @@ public String describeRule()
@Override
public boolean supports(Object websocket)
{
return (websocket instanceof WebSocketListener);
return (websocket instanceof WebSocketConnectionListener);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ public void testAnnotated_InputStream() throws IOException, TimeoutException, In
}

@Test
public void testListener_Text() throws Exception
public void testListenerBasic_Text() throws Exception
{
ListenerBasicSocket socket = new ListenerBasicSocket();
EventDriver driver = wrap(socket);
Expand Down

0 comments on commit 77e42fb

Please sign in to comment.