Updating WebSocket JettyListenerEventDriver for new Listeners

+ Basing implementation on instances of WebSocketConnectionListener
+ Adding support for:
  * WebSocketListener
  * WebSocketPartialListener
  * WebSocketPingPongListener
  * WebSocketFrameListener
This commit is contained in:
Joakim Erdfelt 2015-05-06 10:23:48 -07:00
parent 8e7f05190d
commit 77e42fb05a
3 changed files with 77 additions and 14 deletions

View File

@ -25,12 +25,19 @@ import java.nio.ByteBuffer;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; 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.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.WebSocketPolicy;
import org.eclipse.jetty.websocket.api.extensions.Frame; 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.CloseInfo;
import org.eclipse.jetty.websocket.common.frames.ReadOnlyDelegatedFrame;
import org.eclipse.jetty.websocket.common.message.SimpleBinaryMessage; import org.eclipse.jetty.websocket.common.message.SimpleBinaryMessage;
import org.eclipse.jetty.websocket.common.message.SimpleTextMessage; import org.eclipse.jetty.websocket.common.message.SimpleTextMessage;
import org.eclipse.jetty.websocket.common.util.Utf8PartialBuilder;
/** /**
* Handler for {@link WebSocketListener} based User WebSocket implementations. * Handler for {@link WebSocketListener} based User WebSocket implementations.
@ -38,10 +45,11 @@ import org.eclipse.jetty.websocket.common.message.SimpleTextMessage;
public class JettyListenerEventDriver extends AbstractEventDriver public class JettyListenerEventDriver extends AbstractEventDriver
{ {
private static final Logger LOG = Log.getLogger(JettyListenerEventDriver.class); private static final Logger LOG = Log.getLogger(JettyListenerEventDriver.class);
private final WebSocketListener listener; private final WebSocketConnectionListener listener;
private Utf8PartialBuilder utf8Partial;
private boolean hasCloseBeenCalled = false; private boolean hasCloseBeenCalled = false;
public JettyListenerEventDriver(WebSocketPolicy policy, WebSocketListener listener) public JettyListenerEventDriver(WebSocketPolicy policy, WebSocketConnectionListener listener)
{ {
super(policy,listener); super(policy,listener);
this.listener = listener; this.listener = listener;
@ -50,18 +58,29 @@ public class JettyListenerEventDriver extends AbstractEventDriver
@Override @Override
public void onBinaryFrame(ByteBuffer buffer, boolean fin) throws IOException 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 @Override
public void onBinaryMessage(byte[] data) public void onBinaryMessage(byte[] data)
{ {
listener.onWebSocketBinary(data,0,data.length); if (listener instanceof WebSocketListener)
{
((WebSocketListener)listener).onWebSocketBinary(data,0,data.length);
}
} }
@Override @Override
@ -96,7 +115,22 @@ public class JettyListenerEventDriver extends AbstractEventDriver
@Override @Override
public void onFrame(Frame frame) 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 @Override
@ -114,18 +148,46 @@ public class JettyListenerEventDriver extends AbstractEventDriver
@Override @Override
public void onTextFrame(ByteBuffer buffer, boolean fin) throws IOException 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 @Override
public void onTextMessage(String message) public void onTextMessage(String message)
{ {
listener.onWebSocketText(message); if (listener instanceof WebSocketListener)
{
((WebSocketListener)listener).onWebSocketText(message);
}
} }
@Override @Override

View File

@ -18,6 +18,7 @@
package org.eclipse.jetty.websocket.common.events; 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.WebSocketListener;
import org.eclipse.jetty.websocket.api.WebSocketPolicy; import org.eclipse.jetty.websocket.api.WebSocketPolicy;
@ -26,7 +27,7 @@ public class JettyListenerImpl implements EventDriverImpl
@Override @Override
public EventDriver create(Object websocket, WebSocketPolicy policy) public EventDriver create(Object websocket, WebSocketPolicy policy)
{ {
WebSocketListener listener = (WebSocketListener)websocket; WebSocketConnectionListener listener = (WebSocketConnectionListener)websocket;
return new JettyListenerEventDriver(policy,listener); return new JettyListenerEventDriver(policy,listener);
} }
@ -39,6 +40,6 @@ public class JettyListenerImpl implements EventDriverImpl
@Override @Override
public boolean supports(Object websocket) public boolean supports(Object websocket)
{ {
return (websocket instanceof WebSocketListener); return (websocket instanceof WebSocketConnectionListener);
} }
} }

View File

@ -165,7 +165,7 @@ public class EventDriverTest
} }
@Test @Test
public void testListener_Text() throws Exception public void testListenerBasic_Text() throws Exception
{ {
ListenerBasicSocket socket = new ListenerBasicSocket(); ListenerBasicSocket socket = new ListenerBasicSocket();
EventDriver driver = wrap(socket); EventDriver driver = wrap(socket);