// ---------------------------------------------------------------------------
// jWebSocket - Copyright (c) 2010 jwebsocket.org
// ---------------------------------------------------------------------------
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published by the
// Free Software Foundation; either version 3 of the License, or (at your
// option) any later version.
// 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.
// You should have received a copy of the GNU Lesser General Public License along
// with this program; if not, see <http://www.gnu.org/licenses/lgpl.html>.
// ---------------------------------------------------------------------------
package org.jwebsocket.factory;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.jwebsocket.api.WebSocketInitializer;
import org.jwebsocket.config.JWebSocketConfig;
import org.jwebsocket.config.xml.JWebSocketConfigHandler;
import org.jwebsocket.kit.WebSocketException;
import org.jwebsocket.security.SecurityFactory;
/**
* An object that does the process of loading configuration, intialization of
* the jWebSocket server system.
*
* @author puran
* @version $Id: JWebSocketLoader.java 345 2010-04-10 20:03:48Z fivefeetfurther$
*/
public final class JWebSocketLoader {
// We cannot use the logging subsystem here because its config needs to be loaded first!
private JWebSocketConfigHandler mConfigHandler = new JWebSocketConfigHandler();
/**
* Initialize the jWebSocket Server system
*
* @return the initializer object
* @throws WebSocketException
* if there's an exception while initialization
*/
public final WebSocketInitializer initialize() throws WebSocketException {
String lConfigPath = JWebSocketConfig.getConfigurationPath();
if (lConfigPath == null) {
throw new WebSocketException(
"Either JWEBSOCKET_HOME variable is not set"
+ " or jWebSocket.xml file does neither exist at %JWEBSOCKET_HOME%/conf"
+ " nor at %CLASSPATH%/conf.");
}
// load the entire settings from the configuration xml file
JWebSocketConfig lConfig = loadConfiguration(lConfigPath);
// initialize security by using config settings
SecurityFactory.initFromConfig(lConfig);
WebSocketInitializer lInitializer = getInitializer(lConfig);
if (lInitializer == null) {
lInitializer = JWebSocketXmlConfigInitializer.getInitializer(lConfig);
}
return lInitializer;
}
/**
* Returns the appropriate {@code WebSocketInitializer} implementation
*
* @param aConfig
* the config object
* @return the {@code WebSocketInitializer} object
*/
private WebSocketInitializer getInitializer(JWebSocketConfig aConfig) {
WebSocketInitializer lInitializer = null;
// if we are in development mode load the initializer class
if ("dev".equals(aConfig.getInstallation())) {
lInitializer = instantiateInitializer(aConfig.getInitializer());
// if we are in production mode use the
// JWebSocketXmlConfigInitializer class
} else if ("prod".equals(aConfig.getInstallation())) {
lInitializer = JWebSocketXmlConfigInitializer.getInitializer(aConfig);
} else {
// ignore
}
return lInitializer;
}
/**
* Instantiate the initializer custom initializer class if there's any
* configured via xml configuration, otherwise return the default {@code
* JWebSocketInitializer} class that initialize all the default engine,
* plugins and servers.
*
* @param aInitializerClass the class name to instantiate
* @return the instantiated initializer object
*/
@SuppressWarnings("unchecked")
private WebSocketInitializer instantiateInitializer(String aInitializerClass) {
WebSocketInitializer lInitializer = null;
try {
Class<WebSocketInitializer> lClass = (Class<WebSocketInitializer>) Class.forName(aInitializerClass);
lInitializer = lClass.newInstance();
} catch (ClassNotFoundException ex) {
// TODO: handle exceptions properly, logging not yet initialized here!
// "Error instantiating initializer:"+initializerClass, ex;
} catch (InstantiationException ex) {
// TODO: handle exceptions properly, logging not yet initialized here!
// "Error instantiating initializer:"+initializerClass, ex);
} catch (IllegalAccessException ex) {
// TODO: handle exceptions properly, logging not yet initialized here!
// "Error instantiating initializer:"+initializerClass, ex);
}
return lInitializer;
}
/**
* Load all the configurations based on jWebSocket.xml file at the given
* <tt>configFilePath</tt> location.
*
* @param aConfigFilePath
* the path to jWebSocket.xml file
* @return the web socket config object with all the configuration
* @throws WebSocketException
* if there's any while loading configuration
*/
private JWebSocketConfig loadConfiguration(final String aConfigFilePath) throws WebSocketException {
JWebSocketConfig lConfig = null;
File lFile = new File(aConfigFilePath);
String lMsg;
try {
FileInputStream lFIS = new FileInputStream(lFile);
XMLInputFactory lFactory = XMLInputFactory.newInstance();
XMLStreamReader lStreamReader = null;
lStreamReader = lFactory.createXMLStreamReader(lFIS);
lConfig = mConfigHandler.processConfig(lStreamReader);
} catch (XMLStreamException ex) {
lMsg = ex.getClass().getSimpleName() + " occurred while creating XML stream (" + aConfigFilePath + ").";
throw new WebSocketException(lMsg);
} catch (FileNotFoundException ex) {
lMsg = "jWebSocket config file not found while creating XML stream (" + aConfigFilePath + ").";
throw new WebSocketException(lMsg);
}
return lConfig;
}
}