Search in sources :

Example 1 with MessageHandler

use of javax.websocket.MessageHandler in project tomcat by apache.

the class WsSession method removeMessageHandler.

@Override
public void removeMessageHandler(MessageHandler listener) {
    checkState();
    if (listener == null) {
        return;
    }
    MessageHandler wrapped = null;
    if (listener instanceof WrappedMessageHandler) {
        wrapped = ((WrappedMessageHandler) listener).getWrappedHandler();
    }
    if (wrapped == null) {
        wrapped = listener;
    }
    boolean removed = false;
    if (wrapped.equals(textMessageHandler) || listener.equals(textMessageHandler)) {
        textMessageHandler = null;
        removed = true;
    }
    if (wrapped.equals(binaryMessageHandler) || listener.equals(binaryMessageHandler)) {
        binaryMessageHandler = null;
        removed = true;
    }
    if (wrapped.equals(pongMessageHandler) || listener.equals(pongMessageHandler)) {
        pongMessageHandler = null;
        removed = true;
    }
    if (!removed) {
        // becomes a problem
        throw new IllegalStateException(sm.getString("wsSession.removeHandlerFailed", listener));
    }
}
Also used : MessageHandler(javax.websocket.MessageHandler)

Example 2 with MessageHandler

use of javax.websocket.MessageHandler in project tomcat by apache.

the class TestWebSocketFrameClientSSL method testBug56032.

@Test
public void testBug56032() throws Exception {
    Tomcat tomcat = getTomcatInstance();
    // No file system docBase required
    Context ctx = tomcat.addContext("", null);
    ctx.addApplicationListener(TesterFirehoseServer.Config.class.getName());
    Tomcat.addServlet(ctx, "default", new DefaultServlet());
    ctx.addServletMappingDecoded("/", "default");
    TesterSupport.initSsl(tomcat);
    tomcat.start();
    WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer();
    ClientEndpointConfig clientEndpointConfig = ClientEndpointConfig.Builder.create().build();
    clientEndpointConfig.getUserProperties().put(Constants.SSL_TRUSTSTORE_PROPERTY, "test/org/apache/tomcat/util/net/ca.jks");
    Session wsSession = wsContainer.connectToServer(TesterProgrammaticEndpoint.class, clientEndpointConfig, new URI("wss://localhost:" + getPort() + TesterFirehoseServer.Config.PATH));
    // Process incoming messages very slowly
    MessageHandler handler = new SleepingText(5000);
    wsSession.addMessageHandler(handler);
    wsSession.getBasicRemote().sendText("Hello");
    // Wait long enough for the buffers to fill and the send to timeout
    int count = 0;
    int limit = TesterFirehoseServer.WAIT_TIME_MILLIS / 100;
    System.out.println("Waiting for server to report an error");
    while (TesterFirehoseServer.Endpoint.getErrorCount() == 0 && count < limit) {
        Thread.sleep(100);
        count++;
    }
    if (TesterFirehoseServer.Endpoint.getErrorCount() == 0) {
        Assert.fail("No error reported by Endpoint when timeout was expected");
    }
    // Wait up to another 10 seconds for the connection to be closed -
    // should be a lot faster.
    System.out.println("Waiting for connection to be closed");
    count = 0;
    limit = (TesterFirehoseServer.SEND_TIME_OUT_MILLIS * 2) / 100;
    while (TesterFirehoseServer.Endpoint.getOpenConnectionCount() != 0 && count < limit) {
        Thread.sleep(100);
        count++;
    }
    int openConnectionCount = TesterFirehoseServer.Endpoint.getOpenConnectionCount();
    if (openConnectionCount != 0) {
        Assert.fail("There are [" + openConnectionCount + "] connections still open");
    }
    // Close the client session.
    wsSession.close();
}
Also used : Context(org.apache.catalina.Context) Tomcat(org.apache.catalina.startup.Tomcat) WebSocketContainer(javax.websocket.WebSocketContainer) MessageHandler(javax.websocket.MessageHandler) ClientEndpointConfig(javax.websocket.ClientEndpointConfig) DefaultServlet(org.apache.catalina.servlets.DefaultServlet) ClientEndpointConfig(javax.websocket.ClientEndpointConfig) URI(java.net.URI) TesterProgrammaticEndpoint(org.apache.tomcat.websocket.TesterMessageCountClient.TesterProgrammaticEndpoint) Session(javax.websocket.Session) SleepingText(org.apache.tomcat.websocket.TesterMessageCountClient.SleepingText) Test(org.junit.Test)

Example 3 with MessageHandler

use of javax.websocket.MessageHandler in project jetty.project by eclipse.

the class JsrEndpointEventDriver method onTextFrame.

@Override
public void onTextFrame(ByteBuffer buffer, boolean fin) throws IOException {
    if (activeMessage == null) {
        final MessageHandlerWrapper wrapper = jsrsession.getMessageHandlerWrapper(MessageType.TEXT);
        if (wrapper == null) {
            if (LOG.isDebugEnabled()) {
                LOG.debug("No TEXT MessageHandler declared");
            }
            return;
        }
        if (wrapper.wantsPartialMessages()) {
            activeMessage = new TextPartialMessage(wrapper);
        } else if (wrapper.wantsStreams()) {
            final MessageReader stream = new MessageReader(new MessageInputStream());
            activeMessage = stream;
            dispatch(new Runnable() {

                @SuppressWarnings("unchecked")
                @Override
                public void run() {
                    MessageHandler.Whole<Reader> handler = (Whole<Reader>) wrapper.getHandler();
                    handler.onMessage(stream);
                }
            });
        } else {
            activeMessage = new TextWholeMessage(this, wrapper);
        }
    }
    activeMessage.appendFrame(buffer, fin);
    if (fin) {
        activeMessage.messageComplete();
        activeMessage = null;
    }
}
Also used : MessageHandlerWrapper(org.eclipse.jetty.websocket.jsr356.MessageHandlerWrapper) TextWholeMessage(org.eclipse.jetty.websocket.jsr356.messages.TextWholeMessage) TextPartialMessage(org.eclipse.jetty.websocket.jsr356.messages.TextPartialMessage) MessageInputStream(org.eclipse.jetty.websocket.common.message.MessageInputStream) MessageHandler(javax.websocket.MessageHandler) MessageReader(org.eclipse.jetty.websocket.common.message.MessageReader) Reader(java.io.Reader) MessageReader(org.eclipse.jetty.websocket.common.message.MessageReader) Whole(javax.websocket.MessageHandler.Whole)

Example 4 with MessageHandler

use of javax.websocket.MessageHandler in project tomcat by apache.

the class PojoEndpointBase method doOnOpen.

protected final void doOnOpen(Session session, EndpointConfig config) {
    PojoMethodMapping methodMapping = getMethodMapping();
    Object pojo = getPojo();
    Map<String, String> pathParameters = getPathParameters();
    // session
    for (MessageHandler mh : methodMapping.getMessageHandlers(pojo, pathParameters, session, config)) {
        session.addMessageHandler(mh);
    }
    if (methodMapping.getOnOpen() != null) {
        try {
            methodMapping.getOnOpen().invoke(pojo, methodMapping.getOnOpenArgs(pathParameters, session, config));
        } catch (IllegalAccessException e) {
            // Reflection related problems
            log.error(sm.getString("pojoEndpointBase.onOpenFail", pojo.getClass().getName()), e);
            handleOnOpenOrCloseError(session, e);
            return;
        } catch (InvocationTargetException e) {
            Throwable cause = e.getCause();
            handleOnOpenOrCloseError(session, cause);
            return;
        } catch (Throwable t) {
            handleOnOpenOrCloseError(session, t);
            return;
        }
    }
}
Also used : MessageHandler(javax.websocket.MessageHandler) InvocationTargetException(java.lang.reflect.InvocationTargetException)

Example 5 with MessageHandler

use of javax.websocket.MessageHandler in project jetty.project by eclipse.

the class MessageHandlerFactory method register.

public List<MessageHandlerMetadata> register(Class<? extends MessageHandler> handler) {
    List<MessageHandlerMetadata> metadatas = new ArrayList<>();
    boolean partial = false;
    if (MessageHandler.Partial.class.isAssignableFrom(handler)) {
        if (LOG.isDebugEnabled()) {
            LOG.debug("supports Partial: {}", handler);
        }
        partial = true;
        Class<?> onMessageClass = ReflectUtils.findGenericClassFor(handler, MessageHandler.Partial.class);
        if (LOG.isDebugEnabled()) {
            LOG.debug("Partial message class: {}", onMessageClass);
        }
        metadatas.add(new MessageHandlerMetadata(handler, onMessageClass, partial));
    }
    if (MessageHandler.Whole.class.isAssignableFrom(handler)) {
        if (LOG.isDebugEnabled()) {
            LOG.debug("supports Whole: {}", handler.getName());
        }
        partial = false;
        Class<?> onMessageClass = ReflectUtils.findGenericClassFor(handler, MessageHandler.Whole.class);
        if (LOG.isDebugEnabled()) {
            LOG.debug("Whole message class: {}", onMessageClass);
        }
        metadatas.add(new MessageHandlerMetadata(handler, onMessageClass, partial));
    }
    registered.put(handler, metadatas);
    return metadatas;
}
Also used : MessageHandlerMetadata(org.eclipse.jetty.websocket.jsr356.metadata.MessageHandlerMetadata) MessageHandler(javax.websocket.MessageHandler) ArrayList(java.util.ArrayList)

Aggregations

MessageHandler (javax.websocket.MessageHandler)7 Whole (javax.websocket.MessageHandler.Whole)2 MessageInputStream (org.eclipse.jetty.websocket.common.message.MessageInputStream)2 MessageHandlerWrapper (org.eclipse.jetty.websocket.jsr356.MessageHandlerWrapper)2 Test (org.junit.Test)2 InputStream (java.io.InputStream)1 Reader (java.io.Reader)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 URI (java.net.URI)1 ArrayList (java.util.ArrayList)1 ClientEndpointConfig (javax.websocket.ClientEndpointConfig)1 Session (javax.websocket.Session)1 WebSocketContainer (javax.websocket.WebSocketContainer)1 Context (org.apache.catalina.Context)1 DefaultServlet (org.apache.catalina.servlets.DefaultServlet)1 Tomcat (org.apache.catalina.startup.Tomcat)1 SleepingText (org.apache.tomcat.websocket.TesterMessageCountClient.SleepingText)1 TesterProgrammaticEndpoint (org.apache.tomcat.websocket.TesterMessageCountClient.TesterProgrammaticEndpoint)1 MessageReader (org.eclipse.jetty.websocket.common.message.MessageReader)1 ByteArrayWholeHandler (org.eclipse.jetty.websocket.jsr356.handlers.ByteArrayWholeHandler)1