Search in sources :

Example 1 with IKey

use of org.apache.wicket.protocol.ws.api.registry.IKey in project wicket by apache.

the class AbstractWebSocketProcessor method onConnect.

/**
 * A helper that registers the opened connection in the application-level registry.
 *
 * @param connection
 *            the web socket connection to use to communicate with the client
 * @see #onOpen(Object)
 */
protected final void onConnect(final IWebSocketConnection connection) {
    IKey key = getRegistryKey();
    connectionRegistry.setConnection(getApplication(), getSessionId(), key, connection);
    if (connectionFilter != null) {
        ConnectionRejected connectionRejected = connectionFilter.doFilter(servletRequest);
        if (connectionRejected != null) {
            broadcastMessage(new AbortedMessage(getApplication(), getSessionId(), key));
            connectionRegistry.removeConnection(getApplication(), getSessionId(), key);
            connection.close(connectionRejected.getCode(), connectionRejected.getReason());
            return;
        }
    }
    broadcastMessage(new ConnectedMessage(getApplication(), getSessionId(), key));
}
Also used : IKey(org.apache.wicket.protocol.ws.api.registry.IKey) AbortedMessage(org.apache.wicket.protocol.ws.api.message.AbortedMessage) ConnectedMessage(org.apache.wicket.protocol.ws.api.message.ConnectedMessage)

Example 2 with IKey

use of org.apache.wicket.protocol.ws.api.registry.IKey in project wicket by apache.

the class AbstractWebSocketProcessor method broadcastMessage.

/**
 * Exports the Wicket thread locals and broadcasts the received message from the client to all
 * interested components and behaviors in the page with id {@code #pageId}
 * <p>
 *     Note: ConnectedMessage and ClosedMessage messages are notification-only. I.e. whatever the
 *     components/behaviors write in the WebSocketRequestHandler will be ignored because the protocol
 *     doesn't expect response from the user.
 * </p>
 *
 * @param message
 *      the message to broadcast
 */
public final void broadcastMessage(final IWebSocketMessage message) {
    IKey key = getRegistryKey();
    IWebSocketConnection connection = connectionRegistry.getConnection(application, sessionId, key);
    if (connection != null && (connection.isOpen() || message instanceof ClosedMessage)) {
        Application oldApplication = ThreadContext.getApplication();
        Session oldSession = ThreadContext.getSession();
        RequestCycle oldRequestCycle = ThreadContext.getRequestCycle();
        WebResponse webResponse = webSocketSettings.newWebSocketResponse(connection);
        try {
            WebSocketRequestMapper requestMapper = new WebSocketRequestMapper(application.getRootRequestMapper());
            RequestCycle requestCycle = createRequestCycle(requestMapper, webResponse);
            ThreadContext.setRequestCycle(requestCycle);
            ThreadContext.setApplication(application);
            Session session;
            if (oldSession == null || message instanceof IWebSocketPushMessage) {
                ISessionStore sessionStore = application.getSessionStore();
                session = sessionStore.lookup(webRequest);
                ThreadContext.setSession(session);
            } else {
                session = oldSession;
            }
            IPageManager pageManager = session.getPageManager();
            Page page = getPage(pageManager);
            if (page != null) {
                WebSocketRequestHandler requestHandler = webSocketSettings.newWebSocketRequestHandler(page, connection);
                WebSocketPayload payload = createEventPayload(message, requestHandler);
                if (!(message instanceof ConnectedMessage || message instanceof ClosedMessage || message instanceof AbortedMessage)) {
                    requestCycle.scheduleRequestHandlerAfterCurrent(requestHandler);
                }
                IRequestHandler broadcastingHandler = new WebSocketMessageBroadcastHandler(pageId, resourceName, payload);
                requestMapper.setHandler(broadcastingHandler);
                requestCycle.processRequestAndDetach();
            } else {
                LOG.debug("Page with id '{}' has been expired. No message will be broadcast!", pageId);
            }
        } catch (Exception x) {
            LOG.error("An error occurred during processing of a WebSocket message", x);
        } finally {
            try {
                webResponse.close();
            } finally {
                ThreadContext.setApplication(oldApplication);
                ThreadContext.setRequestCycle(oldRequestCycle);
                ThreadContext.setSession(oldSession);
            }
        }
    } else {
        LOG.debug("Either there is no connection({}) or it is closed.", connection);
    }
}
Also used : IPageManager(org.apache.wicket.page.IPageManager) WebResponse(org.apache.wicket.request.http.WebResponse) ISessionStore(org.apache.wicket.session.ISessionStore) IRequestHandler(org.apache.wicket.request.IRequestHandler) RequestCycle(org.apache.wicket.request.cycle.RequestCycle) ClosedMessage(org.apache.wicket.protocol.ws.api.message.ClosedMessage) Page(org.apache.wicket.Page) WebPage(org.apache.wicket.markup.html.WebPage) WebSocketPayload(org.apache.wicket.protocol.ws.api.event.WebSocketPayload) IWebSocketPushMessage(org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage) ConnectedMessage(org.apache.wicket.protocol.ws.api.message.ConnectedMessage) AbortedMessage(org.apache.wicket.protocol.ws.api.message.AbortedMessage) IKey(org.apache.wicket.protocol.ws.api.registry.IKey) Application(org.apache.wicket.Application) WebApplication(org.apache.wicket.protocol.http.WebApplication) HttpSession(javax.servlet.http.HttpSession) Session(org.apache.wicket.Session)

Example 3 with IKey

use of org.apache.wicket.protocol.ws.api.registry.IKey in project wicket by apache.

the class AbstractWebSocketProcessor method onClose.

@Override
public void onClose(int closeCode, String message) {
    IKey key = getRegistryKey();
    broadcastMessage(new ClosedMessage(getApplication(), getSessionId(), key));
    connectionRegistry.removeConnection(getApplication(), getSessionId(), key);
}
Also used : IKey(org.apache.wicket.protocol.ws.api.registry.IKey) ClosedMessage(org.apache.wicket.protocol.ws.api.message.ClosedMessage)

Example 4 with IKey

use of org.apache.wicket.protocol.ws.api.registry.IKey in project wicket by apache.

the class WebSocketPushBroadcaster method broadcast.

/**
 * Processes the given message in the page and session identified by the given Web Socket connection.
 * The message is sent as an event to the Page and components of the session allowing the components
 * to be updated.
 *
 * This method can be invoked from any thread, even a non-wicket thread. By default all processing
 * is done in the caller thread. Use
 * {@link WebSocketSettings#setWebSocketPushMessageExecutor(org.apache.wicket.protocol.ws.concurrent.Executor)}
 * to move processing to background threads.
 *
 * If the given connection is no longer open then the broadcast is silently ignored.
 *
 * @param connection
 *			The Web Socket connection that identifies the page and session
 * @param message
 *			The push message event
 */
public void broadcast(ConnectedMessage connection, IWebSocketPushMessage message) {
    Args.notNull(connection, "connection");
    Args.notNull(message, "message");
    Application application = connection.getApplication();
    String sessionId = connection.getSessionId();
    IKey key = connection.getKey();
    IWebSocketConnection wsConnection = registry.getConnection(application, sessionId, key);
    if (wsConnection == null) {
        return;
    }
    process(application, singletonList(wsConnection), message);
}
Also used : IKey(org.apache.wicket.protocol.ws.api.registry.IKey) Application(org.apache.wicket.Application)

Example 5 with IKey

use of org.apache.wicket.protocol.ws.api.registry.IKey in project wicket by apache.

the class AbstractWebSocketProcessor method onError.

@Override
public void onError(Throwable t) {
    IKey key = getRegistryKey();
    broadcastMessage(new ErrorMessage(getApplication(), getSessionId(), key, t));
}
Also used : IKey(org.apache.wicket.protocol.ws.api.registry.IKey) ErrorMessage(org.apache.wicket.protocol.ws.api.message.ErrorMessage)

Aggregations

IKey (org.apache.wicket.protocol.ws.api.registry.IKey)5 Application (org.apache.wicket.Application)2 AbortedMessage (org.apache.wicket.protocol.ws.api.message.AbortedMessage)2 ClosedMessage (org.apache.wicket.protocol.ws.api.message.ClosedMessage)2 ConnectedMessage (org.apache.wicket.protocol.ws.api.message.ConnectedMessage)2 HttpSession (javax.servlet.http.HttpSession)1 Page (org.apache.wicket.Page)1 Session (org.apache.wicket.Session)1 WebPage (org.apache.wicket.markup.html.WebPage)1 IPageManager (org.apache.wicket.page.IPageManager)1 WebApplication (org.apache.wicket.protocol.http.WebApplication)1 WebSocketPayload (org.apache.wicket.protocol.ws.api.event.WebSocketPayload)1 ErrorMessage (org.apache.wicket.protocol.ws.api.message.ErrorMessage)1 IWebSocketPushMessage (org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage)1 IRequestHandler (org.apache.wicket.request.IRequestHandler)1 RequestCycle (org.apache.wicket.request.cycle.RequestCycle)1 WebResponse (org.apache.wicket.request.http.WebResponse)1 ISessionStore (org.apache.wicket.session.ISessionStore)1