Package org.jwebsocket.factory

Source Code of org.jwebsocket.factory.JWebSocketFactory

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.jwebsocket.factory;

import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.jwebsocket.api.WebSocketEngine;
import org.jwebsocket.api.WebSocketFilter;
import org.jwebsocket.api.WebSocketInitializer;
import org.jwebsocket.api.WebSocketPlugIn;
import org.jwebsocket.api.WebSocketServer;
import org.jwebsocket.instance.JWebSocketInstance;
import org.jwebsocket.kit.CloseReason;
import org.jwebsocket.kit.WebSocketException;
import org.jwebsocket.logging.Logging;

/**
* Factory to initialize and start the jWebSocket components
* @author aschulze
* @version $Id:$
*/
public class JWebSocketFactory {

  // don't instantiate logger here! first read args!
  private static Logger mLog = null;
  private static WebSocketEngine mEngine = null;
  private static List<WebSocketServer> mServers = null;

  public static void start() {

    JWebSocketInstance.setStatus(JWebSocketInstance.STARTING);

    JWebSocketLoader loader = new JWebSocketLoader();
    try {
      WebSocketInitializer lInitializer = loader.initialize();
      if (lInitializer == null) {
        // System.err.println("ERROR:jWebSocket Server sub system could not be initialized.");
        JWebSocketInstance.setStatus(JWebSocketInstance.SHUTTING_DOWN);
        return;
      }
      lInitializer.initializeLogging();

      mLog = Logging.getLogger(JWebSocketFactory.class);
      if (mLog.isDebugEnabled()) {
        mLog.debug("Starting jWebSocket Server Sub System...");
      }
      mEngine = lInitializer.initializeEngine();
      if (mEngine == null) {
        // the loader already logs an error!
        JWebSocketInstance.setStatus(JWebSocketInstance.SHUTTING_DOWN);
        return;
      }

      // initialize and start the server
      if (mLog.isDebugEnabled()) {
        mLog.debug("Initializing servers...");
      }
      mServers = lInitializer.initializeServers();

      Map<String, List<WebSocketPlugIn>> lPluginMap = lInitializer.initializePlugins();
      if (mLog.isDebugEnabled()) {
        mLog.debug("Initializing plugins...");
      }
      for (WebSocketServer lServer : mServers) {
        lServer.addEngine(mEngine);
        List<WebSocketPlugIn> lPlugIns = lPluginMap.get(lServer.getId());
        for (WebSocketPlugIn lPlugIn : lPlugIns) {
          lServer.getPlugInChain().addPlugIn(lPlugIn);
        }
      }
      if (mLog.isInfoEnabled()) {
        mLog.info("Plugins initialized.");
      }

      Map<String, List<WebSocketFilter>> lFilterMap = lInitializer.initializeFilters();
      if (mLog.isDebugEnabled()) {
        mLog.debug("Initializing filters...");
      }
      for (WebSocketServer lServer : mServers) {
        lServer.addEngine(mEngine);
        List<WebSocketFilter> lFilters = lFilterMap.get(lServer.getId());
        for (WebSocketFilter lFilter : lFilters) {
          lServer.getFilterChain().addFilter(lFilter);
        }
      }
      if (mLog.isInfoEnabled()) {
        mLog.info("Filters initialized.");
      }

      boolean lEngineStarted = false;

      // first start the engine
      if (mLog.isDebugEnabled()) {
        mLog.debug("Starting engine '" + mEngine.getId() + "'...");
      }

      try {
        mEngine.startEngine();
        lEngineStarted = true;
      } catch (Exception ex) {
        mLog.error("Starting engine '" + mEngine.getId() + "' failed ("
            + ex.getClass().getSimpleName() + ": "
            + ex.getMessage() + ").");
      }

      // do not start any servers if engine could not be started
      if (lEngineStarted) {
        // now start the servers
        if (mLog.isDebugEnabled()) {
          mLog.debug("Starting servers...");
        }
        for (WebSocketServer lServer : mServers) {
          try {
            lServer.startServer();
          } catch (Exception ex) {
            mLog.error("Starting server '" + lServer.getId() + "' failed ("
                + ex.getClass().getSimpleName() + ": "
                + ex.getMessage() + ").");
          }
        }

        if (mLog.isInfoEnabled()) {
          mLog.info("jWebSocket server startup complete");
        }

        // if everything went fine...
        JWebSocketInstance.setStatus(JWebSocketInstance.STARTED);
      } else {

        // if engine couldn't be started due to whatever reasons...
        JWebSocketInstance.setStatus(JWebSocketInstance.SHUTTING_DOWN);
      }


    } catch (WebSocketException ex) {
      if (mLog != null) {
        if (mLog.isDebugEnabled()) {
          mLog.debug("Exception during startup", ex);
        }
      } else {
        System.out.println(ex.getClass().getSimpleName()
            + " during jWebSocket Server startup: "
            + ex.getMessage());
      }
      if (mLog != null && mLog.isInfoEnabled()) {
        mLog.info("jWebSocketServer failed to start.");
      }

      JWebSocketInstance.setStatus(JWebSocketInstance.SHUTTING_DOWN);
    }

  }

  public static void stop() {

    JWebSocketInstance.setStatus(JWebSocketInstance.STOPPING);

    if (mLog != null && mLog.isDebugEnabled()) {
      mLog.debug("Stopping jWebSocket Sub System...");
    }

    // String lEngineId = "?";
    // stop engine if previously started successfully
    if (mEngine != null) {
      // now stop the servers
      if (mLog != null && mLog.isDebugEnabled()) {
        mLog.debug("Stopping engine...");
      }
      try {
        mEngine.stopEngine(CloseReason.SHUTDOWN);
        if (mLog != null && mLog.isInfoEnabled()) {
          mLog.info("jWebSocket engine '" + mEngine.getId() + "' stopped");
        }
      } catch (WebSocketException ex) {
        if (mLog != null) {
          mLog.error("Stopping engine: " + ex.getMessage());
        }
      }
    }

    if (mServers != null) {
      // now stop the servers
      if (mLog != null && mLog.isDebugEnabled()) {
        mLog.debug("Stopping servers...");
      }
      for (WebSocketServer lServer : mServers) {
        try {
          lServer.stopServer();
          if (mLog != null && mLog.isInfoEnabled()) {
            mLog.info("jWebSocket server '" + lServer.getId() + "' stopped");
          }
        } catch (WebSocketException ex) {
          if (mLog != null) {
            mLog.error("Stopping server: " + ex.getMessage());
          }
        }
      }
    }

    if (mLog != null && mLog.isInfoEnabled()) {
      mLog.info("jWebSocket Server Sub System stopped.");
    }
    Logging.exitLogs();

    JWebSocketInstance.setStatus(JWebSocketInstance.STOPPED);
  }

  public static WebSocketEngine getEngine() {
    return mEngine;
  }

  public static List<WebSocketServer> getServers() {
    return mServers;
  }

  /**
   * Returns the server identified by it's id or <tt>null</tt> if no server
   * with that id could be found in the factory.
   * @param aId id of the server to be returned.
   * @return WebSocketServer with the given id or <tt>null</tt> if not found.
   */
  public static WebSocketServer getServer(String aId) {
    if (aId != null && mServers != null) {
      for (WebSocketServer lServer : mServers) {
        if (lServer != null && aId.equals(lServer.getId())) {
          return lServer;
        }
      }
    }
    return null;
  }
}
TOP

Related Classes of org.jwebsocket.factory.JWebSocketFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.