/* * Copyright (C) 2006-2009 Alfresco Software Limited. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * 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 General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * As a special exception to the terms and conditions of version 2.0 of * the GPL, you may redistribute this Program in connection with Free/Libre * and Open Source Software ("FLOSS") applications as described in Alfresco's * FLOSS exception. You should have recieved a copy of the text describing * the FLOSS exception, and it is also available here: * http://www.alfresco.com/legal/licensing" */ package org.alfresco.jlan.server.config; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Set; import java.util.Vector; import org.alfresco.jlan.server.NetworkServer; import org.alfresco.jlan.server.NetworkServerList; import org.alfresco.jlan.util.Platform; /** * Server Configuration Class * * <p>Provides the configuration parameters for the network file servers (SMB/CIFS, FTP and NFS). * * @author gkspencer */ public class ServerConfiguration implements ServerConfigurationAccessor { // Constants // // Server name private String m_serverName; // Active server list private NetworkServerList m_serverList; // Configuration sections private HashMap<String, ConfigSection> m_configSections; // Configuration change listeners private Vector<ConfigurationListener> m_listeners; // Flag to indicate that the server configuration has been changed private boolean m_updated; /** * Construct a server configuration object * * @param name String */ public ServerConfiguration( String name) { // Allocate the config sections table m_configSections = new HashMap<String, ConfigSection>(); // Allocate the active server list m_serverList = new NetworkServerList(); // Set the server name m_serverName = name; } /** * Add a configuration section * * @param config ConfigSection */ public final void addConfigSection(ConfigSection config) { // Add the config section m_configSections.put( config.getSectionName(), config); // Notify listeners of the new configuration section try { fireConfigurationChange( ConfigId.ConfigSection, config); } catch ( InvalidConfigurationException ex) { } } /** * Check if the specified configuration section name is available * * @param name String * @return boolean */ public final boolean hasConfigSection(String name) { return m_configSections.containsKey( name); } /* (non-Javadoc) * @see org.alfresco.jlan.server.config.ServerConfigurationAccessor#getConfigSection(java.lang.String) */ public final ConfigSection getConfigSection(String name) { return m_configSections.get( name); } /** * Remove a configuration section * * @param name String * @return ConfigSection */ public final ConfigSection removeConfigSection(String name) { return m_configSections.remove( name); } /** * Remove all configuration sections */ public final void removeAllConfigSections() { m_configSections.clear(); } /* (non-Javadoc) * @see org.alfresco.jlan.server.config.ServerConfigurationAccessor#getServerName() */ public final String getServerName() { return m_serverName; } /** * Add a server to the list of active servers * * @param srv NetworkServer */ public final void addServer(NetworkServer srv) { m_serverList.addServer(srv); } /** * Find an active server using the protocol name * * @param proto String * @return NetworkServer */ public final NetworkServer findServer(String proto) { return m_serverList.findServer(proto); } /** * Remove an active server * * @param proto String * @return NetworkServer */ public final NetworkServer removeServer(String proto) { return m_serverList.removeServer(proto); } /** * Return the number of active servers * * @return int */ public final int numberOfServers() { return m_serverList.numberOfServers(); } /* (non-Javadoc) * @see org.alfresco.jlan.server.config.ServerConfigurationAccessor#isServerRunning() */ public final boolean isServerRunning( String proto) { // Check if the server exists NetworkServer srv = findServer( proto); if ( srv != null) return srv.isActive(); return false; } /** * Return the platform type * * @return Platorm.Type */ public final Platform.Type getPlatformType() { return Platform.isPlatformType(); } /** * Return the platform type as a string * * @return String */ public final String getPlatformTypeString() { return Platform.isPlatformType().toString(); } /** * Return the server at the specified index * * @param idx int * @return NetworkServer */ public final NetworkServer getServer(int idx) { return m_serverList.getServer(idx); } /** * Determine if the server configuration has been updated since loaded * * @return boolean */ public final boolean isUpdated() { return m_updated; } /** * Set or clear the updated configuration flag * * @param upd boolean */ protected final void setUpdated(boolean upd) { m_updated = upd; } /** * Set the server name * * @param name String */ public final void setServerName( String name) { m_serverName = name; } /** * Add a configuration change listener * * @param listener ConfigurationListener */ public final void addListener(ConfigurationListener listener) { // Check if the listener list is allocated if ( m_listeners == null) m_listeners = new Vector<ConfigurationListener>(); // Add the configuration change listener m_listeners.addElement(listener); } /** * Remove a configuration change listener * * @param listener ConfigurationListener */ public final void removeListener(ConfigurationListener listener) { // Check if the listener list is valid if ( m_listeners == null) return; // Remove the listener m_listeners.removeElement(listener); } /** * Check if there are any configuration change listeners * * @return boolean */ public final boolean hasConfigurationListeners() { if ( m_listeners == null) return false; return m_listeners.size() > 0 ? true : false; } /** * Notify all registered configuration change listeners of a configuration change * * @param id int * @param newVal Object * @return int * @throws InvalidConfigurationException */ protected final int fireConfigurationChange(int id, Object newVal) throws InvalidConfigurationException { // Set the configuration updated flag setUpdated(true); // Check if there are any listeners registered if ( hasConfigurationListeners() == false) return ConfigurationListener.StsIgnored; // Inform each registered listener of the change int sts = ConfigurationListener.StsIgnored; for ( int i = 0; i < m_listeners.size(); i++) { // Get the current configuration change listener ConfigurationListener cl = m_listeners.elementAt(i); // Inform the listener of the configuration change int clSts = cl.configurationChanged(id, this, newVal); // Keep the highest status if ( clSts > sts) sts = clSts; } // Return the change status return sts; } /** * Load the configuration from the specified location. The location depends on the * implementation of the configuration. * * @param location String * @exception IOException * @exception InvalidConfigurationException */ public void loadConfiguration(String location) throws IOException, InvalidConfigurationException { // Not implemented in the base class throw new IOException("Not implemented"); } /** * Save the configuration to the specified location. The location depends on the * implementation of the configuration. * * @param location String * @exception IOException */ public void saveConfiguration(String location) throws IOException { // Not implemented in the base class throw new IOException("Not implemented"); } /** * Close the configuration */ public void closeConfiguration() { // Close the configuration sections if ( m_configSections != null) { Set<String> keys = m_configSections.keySet(); Iterator<String> keysIter = keys.iterator(); while ( keysIter.hasNext()) { String configName = keysIter.next(); ConfigSection configSection = m_configSections.get(configName); try { // Close the configuration section and remove configSection.closeConfig(); } catch ( Exception ex) { } } // Clear the config sections list m_configSections.clear(); } } }