// --------------------------------------------------------------------------- // 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.config; import static org.jwebsocket.config.JWebSocketCommonConstants.DEFAULT_PROTOCOL; import static org.jwebsocket.config.JWebSocketServerConstants.CATALINA_HOME; import static org.jwebsocket.config.JWebSocketServerConstants.JWEBSOCKET_HOME; import static org.jwebsocket.config.JWebSocketServerConstants.JWEBSOCKET_XML; import static org.jwebsocket.config.JWebSocketServerConstants.DEFAULT_INSTALLATION; import java.io.File; import java.net.URI; import java.net.URL; import org.jwebsocket.config.xml.*; import org.jwebsocket.kit.WebSocketRuntimeException; import java.util.Collections; import java.util.List; import org.apache.log4j.Logger; import org.jwebsocket.logging.Logging; /** * Represents the jWebSocket configuration. This class is immutable and should * not be overridden. * * @author puran * @version $Id: JWebSocketConfig.java 345 2010-04-10 20:03:48Z fivefeetfurther$ */ public final class JWebSocketConfig implements Config { // DON'T SET LOGGER HERE! NEEDS TO BE INITIALIZED FIRST! private static Logger mLog = null; private final String mInstallation; private final String mProtocol; private final String jWebSocketHome; private final String mLibraryFolder; private final String mInitializer; private final List<EngineConfig> mEngines; private final List<ServerConfig> mServers; private final List<UserConfig> mUsers; private final List<PluginConfig> mPlugins; private final List<FilterConfig> mFilters; private final LoggingConfig mLoggingConfig; private final List<RightConfig> mGlobalRights; private final List<RoleConfig> mGlobalRoles; private static JWebSocketConfig mConfig = null; /** * @return the installation */ public String getInstallation() { if (mInstallation == null || mInstallation.length() == 0) { return DEFAULT_INSTALLATION; } return mInstallation; } /** * @return the protocol */ public String getProtocol() { if (mProtocol == null || mProtocol.length() == 0) { return DEFAULT_PROTOCOL; } return mProtocol; } /** * @return the jWebSocketHome */ public String getjWebSocketHome() { return jWebSocketHome; } /** * @return the libraryFolder */ public String getLibraryFolder() { return mLibraryFolder; } /** * @return the initializer */ public String getInitializer() { return mInitializer; } /** * @return the config */ public static JWebSocketConfig getConfig() { return mConfig; } /** * private constructor used by the builder */ private JWebSocketConfig(Builder builder) { if (builder.engines == null || builder.servers == null || builder.users == null || builder.globalRights == null || builder.globalRoles == null || builder.filters == null || builder.loggingConfig == null) { throw new WebSocketRuntimeException( "Configuration is not loaded completely."); } mInstallation = builder.installation; mProtocol = builder.protocol; jWebSocketHome = builder.jWebSocketHome; mLibraryFolder = builder.libraryFolder; mInitializer = builder.initializer; mEngines = builder.engines; mServers = builder.servers; mUsers = builder.users; mPlugins = builder.plugins; mFilters = builder.filters; mLoggingConfig = builder.loggingConfig; mGlobalRights = builder.globalRights; mGlobalRoles = builder.globalRoles; // validate the config validate(); } /** * Config builder class. * * @author puran * @version $Id: JWebSocketConfig.java 596 2010-06-22 17:09:54Z fivefeetfurther $ */ public static class Builder { private String installation; private String protocol; private String jWebSocketHome; private String libraryFolder; private String initializer; private List<EngineConfig> engines; private List<ServerConfig> servers; private List<UserConfig> users; private List<PluginConfig> plugins; private List<FilterConfig> filters; private LoggingConfig loggingConfig; private List<RightConfig> globalRights; private List<RoleConfig> globalRoles; public Builder addInstallation(String theInstallation) { installation = theInstallation; return this; } public Builder addProtocol(String theProtocol) { protocol = theProtocol; return this; } public Builder addJWebSocketHome(String theJWebSocketHome) { jWebSocketHome = theJWebSocketHome; return this; } public Builder addInitializer(String theInitializer) { initializer = theInitializer; return this; } public Builder addLibraryFolder(String theLibraryFolder) { libraryFolder = theLibraryFolder; return this; } public Builder addEngines(List<EngineConfig> theEngines) { engines = theEngines; return this; } public Builder addServers(List<ServerConfig> theServers) { servers = theServers; return this; } public Builder addPlugins(List<PluginConfig> thePlugins) { plugins = thePlugins; return this; } public Builder addFilters(List<FilterConfig> theFilters) { filters = theFilters; return this; } public Builder addLoggingConfig(List<LoggingConfig> theLoggingConfigs) { loggingConfig = theLoggingConfigs.get(0); return this; } public Builder addGlobalRights(List<RightConfig> theRights) { globalRights = theRights; return this; } public Builder addGlobalRoles(List<RoleConfig> theRoles) { globalRoles = theRoles; return this; } public Builder addUsers(List<UserConfig> theUsers) { users = theUsers; return this; } public synchronized JWebSocketConfig buildConfig() { if (mConfig == null) { mConfig = new JWebSocketConfig(this); } return mConfig; } } /** * @return the engines */ public List<EngineConfig> getEngines() { return Collections.unmodifiableList(mEngines); } /** * @return the servers */ public List<ServerConfig> getServers() { return Collections.unmodifiableList(mServers); } /** * @return the users */ public List<UserConfig> getUsers() { return Collections.unmodifiableList(mUsers); } /** * @return the plugins */ public List<PluginConfig> getPlugins() { return Collections.unmodifiableList(mPlugins); } /** * @return the filters */ public List<FilterConfig> getFilters() { return Collections.unmodifiableList(mFilters); } /** * @return the logging config object */ public LoggingConfig getLoggingConfig() { return mLoggingConfig; } /** * @return the globalRights */ public List<RightConfig> getGlobalRights() { return Collections.unmodifiableList(mGlobalRights); } /** * @return the globalRoles */ public List<RoleConfig> getGlobalRoles() { return Collections.unmodifiableList(mGlobalRoles); } /** * {@inheritDoc} */ @Override public void validate() { if ((mEngines == null || mEngines.isEmpty()) || (mServers == null || mServers.isEmpty()) || (mUsers == null || mUsers.isEmpty()) || (mPlugins == null || mPlugins.isEmpty()) || (mFilters == null || mFilters.isEmpty()) || (mLoggingConfig == null) || (mGlobalRights == null || mGlobalRights.isEmpty()) || (mGlobalRoles == null || mGlobalRoles.isEmpty())) { throw new WebSocketRuntimeException( "Missing one of the server configuration, please check your configuration file"); } } private static void checkLogs() { if (mLog == null) { mLog = Logging.getLogger(JWebSocketConfig.class); } } /** * private method that checks the path of the jWebSocket.xml file * * @return the path to jWebSocket.xml */ public static String getConfigurationPath() { String lWebSocketXML = null; String lWebSocketHome = null; String lFileSep = System.getProperty("file.separator"); File lFile; // try to obtain JWEBSOCKET_HOME environment variable lWebSocketHome = System.getenv(JWEBSOCKET_HOME); if (lWebSocketHome != null) { // append trailing slash if needed if (!lWebSocketHome.endsWith(lFileSep)) { lWebSocketHome += lFileSep; } // jWebSocket.xml can be located in %JWEBSOCKET_HOME%/conf lWebSocketXML = lWebSocketHome + "conf" + lFileSep + JWEBSOCKET_XML; lFile = new File(lWebSocketXML); if (lFile.exists()) { return lWebSocketXML; } } // try to obtain CATALINA_HOME environment variable lWebSocketHome = System.getenv(CATALINA_HOME); if (lWebSocketHome != null) { // append trailing slash if needed if (!lWebSocketHome.endsWith(lFileSep)) { lWebSocketHome += lFileSep; } // jWebSocket.xml can be located in %CATALINA_HOME%/conf lWebSocketXML = lWebSocketHome + "conf" + lFileSep + JWEBSOCKET_XML; lFile = new File(lWebSocketXML); if (lFile.exists()) { return lWebSocketXML; } } // finally try to find config file at %CLASSPATH%/conf/ URL lURL = Thread.currentThread().getContextClassLoader().getResource("conf/" + JWEBSOCKET_XML); if (lURL != null) { /* lWebSocketXML = lURL.getFile(); System.out.println("WebSocketXML - Filename: " + lWebSocketXML); lFile = new File(lWebSocketXML); if (lFile.exists()) { return lWebSocketXML; } */ try { URI lFilename = lURL.toURI(); // System.out.println("URI Filename: " + lFilename); lFile = new File(lFilename); if (lFile.exists()) { lWebSocketXML = lFile.getPath(); return lWebSocketXML; } } catch (Exception ex) { //TODO: log exception // System.out.println(ex.getClass().getSimpleName() + ": " + ex.getMessage()); } } return null; } /** * private method that checks the path of the jWebSocket.xml file * * @return the path to jWebSocket.xml */ public static String getLibraryFolderPath(String fileName) { String lWebSocketLib = null; String lWebSocketHome = null; String lFileSep = null; File lFile = null; checkLogs(); // try to load lib from %JWEBSOCKET_HOME%/libs folder lWebSocketHome = System.getenv(JWEBSOCKET_HOME); lFileSep = System.getProperty("file.separator"); if (lWebSocketHome != null) { // append trailing slash if needed if (!lWebSocketHome.endsWith(lFileSep)) { lWebSocketHome += lFileSep; } // jar can to be located in %JWEBSOCKET_HOME%/libs lWebSocketLib = lWebSocketHome + "libs" + lFileSep + fileName; lFile = new File(lWebSocketLib); if (lFile.exists()) { if (mLog.isDebugEnabled()) { mLog.debug("Found lib at " + lWebSocketLib + "..."); } return lWebSocketLib; } else { if (mLog.isDebugEnabled()) { mLog.debug(fileName + " not found at %" + JWEBSOCKET_HOME + "%/libs."); } } } // try to load lib from %CATALINA_HOME%/libs folder lWebSocketHome = System.getenv(CATALINA_HOME); lFileSep = System.getProperty("file.separator"); if (lWebSocketHome != null) { // append trailing slash if needed if (!lWebSocketHome.endsWith(lFileSep)) { lWebSocketHome += lFileSep; } // jars can to be located in %CATALINA_HOME%/lib lWebSocketLib = lWebSocketHome + "lib" + lFileSep + fileName; lFile = new File(lWebSocketLib); if (lFile.exists()) { if (mLog.isDebugEnabled()) { mLog.debug("Found lib at " + lWebSocketLib + "..."); } return lWebSocketLib; } else { if (mLog.isDebugEnabled()) { mLog.debug(fileName + " not found at %" + CATALINA_HOME + "/lib%."); } } } return null; } }