angularBeans.remote.RealTimeEndPoint.java Source code

Java tutorial

Introduction

Here is the source code for angularBeans.remote.RealTimeEndPoint.java

Source

/*
 * AngularBeans, CDI-AngularJS bridge 
 *
 * Copyright (c) 2014, Bessem Hmidi. or third-party contributors as
 * indicated by the @author tags or express copyright attribution
 * statements applied by the authors.
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 */

/**
 @author Bessem Hmidi
 */
package angularBeans.remote;

import java.util.HashSet;
import java.util.logging.Logger;

import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;

import org.projectodd.sockjs.SockJsConnection;
import org.projectodd.sockjs.SockJsServer;
import org.projectodd.sockjs.servlet.SockJsServlet;

import com.google.gson.JsonObject;

import angularBeans.context.NGSessionScopeContext;
import angularBeans.context.SessionMapper;
import angularBeans.events.RealTimeErrorEvent;
import angularBeans.events.RealTimeSessionCloseEvent;
import angularBeans.events.RealTimeSessionReadyEvent;
import angularBeans.realtime.AngularBeansServletContextListener;
import angularBeans.realtime.GlobalConnectionHolder;
import angularBeans.util.CommonUtils;

/**
 * The RealTimeEndPoint servlet is the realtime sockjs protocol endpoint
 * 
 * @author Bessem Hmidi
 *
 */

@SuppressWarnings("serial")
@WebServlet(loadOnStartup = 1, asyncSupported = true, urlPatterns = "/rt-service/*")
public class RealTimeEndPoint extends SockJsServlet {

    @Inject
    @DataReceivedEvent
    private Event<RealTimeDataReceivedEvent> receiveEvents;

    @Inject
    @RealTimeSessionReadyEvent
    private Event<RealTimeDataReceivedEvent> sessionOpenEvent;

    @Inject
    @RealTimeSessionCloseEvent
    private Event<RealTimeDataReceivedEvent> sessionCloseEvent;

    @Inject
    @RealTimeErrorEvent
    private Event<RealTimeDataReceivedEvent> errorEvent;

    @Inject
    GlobalConnectionHolder globalConnectionHolder;

    @Inject
    Logger logger;

    // @OnClose
    // public void onclose(Session session) {
    // sessionCloseEvent.fire(new WSocketEvent(session, null));
    // Logger.getLogger("AngularBeans").info("ws-channel closed");
    // }
    //
    // @OnError
    // public void onError(Session session, Throwable error) {
    // // errorEvent.fire(new WSocketEvent(session,
    // // Util.parse(Util.getJson(error))));
    // error.printStackTrace();
    // }
    //

    // @PostConstruct
    // public void start() {
    // try {
    // super.inito();
    // } catch (ServletException e) {

    // e.printStackTrace();
    // }
    //
    // }

    @Override
    public void init() throws ServletException {
        SockJsServer server = AngularBeansServletContextListener.sockJsServer;
        // Various options can be set on the server, such as:
        // echoServer.options.responseLimit = 4 * 1024;

        // server.options.
        // onConnection is the main entry point for handling SockJS connections
        server.onConnection(new SockJsServer.OnConnectionHandler() {

            @Override
            public void handle(final SockJsConnection connection) {

                // logger.info("session opened");
                // onData gets called when a client sends data to the server
                connection.onData(new SockJsConnection.OnDataHandler() {
                    @Override
                    public void handle(String message) {

                        JsonObject jObj = CommonUtils.parse(message).getAsJsonObject();
                        String UID = null;

                        if (jObj.get("session") == null) {
                            UID = SessionMapper.getHTTPSessionID(connection.id);
                        } else {
                            UID = jObj.get("session").getAsString();
                            SessionMapper.getSessionsMap().put(UID, new HashSet<String>());

                        }
                        SessionMapper.getSessionsMap().get(UID).add(connection.id);

                        RealTimeDataReceivedEvent ev = new RealTimeDataReceivedEvent(connection, jObj);

                        ev.setConnection(connection);
                        ev.setSessionId(UID);
                        NGSessionScopeContext.setCurrentContext(UID);

                        String service = jObj.get("service").getAsString();

                        if (service.equals("ping")) {

                            sessionOpenEvent.fire(ev);
                            logger.info("AngularBeans-client: " + UID);

                        } else {

                            receiveEvents.fire(ev);

                        }

                        // connection.write(message);
                    }
                });

                // onClose gets called when a client disconnects
                connection.onClose(new SockJsConnection.OnCloseHandler() {
                    @Override
                    public void handle() {

                        getServletContext().log("Realtime client disconnected..");
                    }
                });
            }
        });

        server.options.websocket = true;

        setServer(server);

        // Don't forget to call super.init() to wire everything up
        super.init();

    }

}