All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.wings.comet.TomcatCometWingServlet Maven / Gradle / Ivy

The newest version!
package org.wings.comet;

import org.apache.catalina.comet.CometEvent;
import org.apache.catalina.comet.CometProcessor;
import org.wings.session.*;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class TomcatCometWingServlet
        extends CometWingServlet implements CometProcessor {

    private void beginEvent(CometEvent cometEvent) throws IOException, ServletException {
        HttpServletRequest request = cometEvent.getHttpServletRequest();
        HttpServletResponse response = cometEvent.getHttpServletResponse();

        log.debug("BEGIN: " + request.getSession());

        final Session session = getSession(request);
        if (session == null) {
            this.service(request, response);
            cometEvent.close();
            return;
        }

        final Comet comet = session.getComet();
        final Pushable pushable = comet.getPushable();
        final CometConnectionManager connectionManager = comet.getConnectionManager();

        final String pathInfo = request.getPathInfo();

        if (pathInfo != null && pathInfo.startsWith(HANGING_PATH)) {
            if (connectionManager.addHangingGet()) {
            	log.debug("---addHangingGet: " + request.getSession() + '\n');
                synchronized (pushable) {
                    cometEvent.setTimeout((int)comet.getLongPollingTimeout());
                    pushable.setPushInfo(response);
                }
            } else {
            	log.debug("---switchToPeriodicPolling: " + request.getSession() + '\n');
                pushable.setPeriodicPolling(response);
                cometEvent.close();
            }
        } else {
            final String param = request.getParameter(PERIODIC_POLLING_PARAM);
            if (param != null) {
            	log.debug("---polling: " + request.getSession() + '\n');
                if (connectionManager.canAddHangingGet()) {
                	log.debug("---switchToHangingGet: " + request.getSession() + '\n');
                    synchronized (pushable) {
                        if (!pushable.isSwitchActive()) {
                            pushable.setSwitchActive(true);
                            pushable.switchToHanging();
                        }
                    }
                }
            }
            this.service(request, response);
            cometEvent.close();
        }
    }

    private void handleError(CometEvent cometEvent) throws IOException, ServletException {
        HttpServletRequest request = cometEvent.getHttpServletRequest();

        log.error("ERROR: " + request.getSession() + '\n');

        if(cometEvent.getEventSubType() == null) {
            cometEvent.close();
            return;
        }

        switch(cometEvent.getEventSubType()) {
            case TIMEOUT:
                log.debug("---Timeout: " + request.getSession() + '\n');

                final Pushable pushable = getPushable(request);
                if (pushable != null) {
                    synchronized (pushable) {
                        pushable.reset();
                        pushable.reconnect();
                    }
                }
            break;
            case CLIENT_DISCONNECT:
                log.debug("---Client_Disconnect: " + request.getSession() + '\n');
            break;
            case IOEXCEPTION:
                log.debug("---IOException: " + request.getSession() + '\n');
            break;
        }

        cometEvent.close();
    }

    private void endEvent(CometEvent cometEvent) throws IOException, ServletException {
        HttpServletRequest request = cometEvent.getHttpServletRequest();

        log.debug("END: " + request.getSession() + '\n');
        final Pushable pushable = getPushable(request);

        if(cometEvent.getEventSubType() == null) {
            if (pushable != null)
                pushable.reset();
            cometEvent.close();
            return;
        }

        switch(cometEvent.getEventSubType()) {
            case WEBAPP_RELOAD:
                log.debug("---Webapp_Reload: " + request.getSession() + '\n');
                break;
            case SESSION_END:
                log.debug("---Session_End: " + request.getSession() + '\n');
                break;
            case SERVER_SHUTDOWN:
                log.debug("---Server_Shutdown: " + request.getSession() + '\n');
                break;
        }

        if (pushable != null)
            pushable.reset();

        cometEvent.close();
    }

    @Override
    public void event(CometEvent cometEvent) throws IOException, ServletException {
        //cometEvent.setTimeout(TIMEOUT);
        if(cometEvent == null || cometEvent.getEventType() == null)
            return;
        
        switch(cometEvent.getEventType()) {
            case BEGIN:
                beginEvent(cometEvent);
            break;
            case ERROR:
                handleError(cometEvent);
            break;
            case END:
                endEvent(cometEvent);
            break;
            default:
                break;
        }
    }

    private Pushable getPushable(HttpServletRequest request) throws ServletException {
        Session session = getSession(request);
        if (session == null)
          return null;
        Comet comet = session.getComet();
        if (comet == null)
          return null;
        return comet.getPushable();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy