/*
* Copyright (C) 2005-2006 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.filesys.server;
import java.net.InetAddress;
import java.util.Vector;
import org.alfresco.filesys.server.auth.CifsAuthenticator;
import org.alfresco.filesys.server.auth.acl.AccessControlManager;
import org.alfresco.filesys.server.config.ServerConfiguration;
import org.alfresco.filesys.server.core.ShareMapper;
import org.alfresco.filesys.server.core.SharedDevice;
import org.alfresco.filesys.server.core.SharedDeviceList;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Network Server Base Class
*
* Base class for server implementations for different protocols.
*/
public abstract class NetworkServer
{
private static final Log logger = LogFactory.getLog("org.alfresco.filesys");
// Protocol name
private String m_protoName;
// Server version
private String m_version;
// Server configuration
private ServerConfiguration m_config;
// Debug enabled flag and debug flags
private boolean m_debug;
private int m_debugFlags;
// List of addresses that the server is bound to
private InetAddress[] m_ipAddr;
// Server shutdown flag and server active flag
private boolean m_shutdown = false;
private boolean m_active = false;
// Server error exception details
private Exception m_exception;
// Server events listener
private ServerListener m_listener;
// Session listener list
private Vector m_sessListeners;
/**
* Class constructor
*
* @param proto String
* @param config ServerConfiguration
*/
public NetworkServer(String proto, ServerConfiguration config)
{
m_protoName = proto;
m_config = config;
}
/**
* Returns the server configuration.
*
* @return ServerConfiguration
*/
public final ServerConfiguration getConfiguration()
{
return m_config;
}
/**
* Return the authenticator for this server
*
* @return CifsAuthenticator
*/
public final CifsAuthenticator getAuthenticator()
{
return getConfiguration().getAuthenticator();
}
/**
* Determine if an access control manager is configured
*
* @return boolean
*/
public final boolean hasAccessControlManager()
{
return getConfiguration().getAccessControlManager() != null ? true : false;
}
/**
* Return the access control manager
*
* @return AccessControlManager
*/
public final AccessControlManager getAccessControlManager()
{
return getConfiguration().getAccessControlManager();
}
/**
* Return the main server name
*
* @return String
*/
public final String getServerName()
{
return m_config.getServerName();
}
/**
* Return the list of IP addresses that the server is bound to.
*
* @return java.net.InetAddress[]
*/
public final InetAddress[] getServerAddresses()
{
return m_ipAddr;
}
/**
* Return the share mapper
*
* @return ShareMapper
*/
public final ShareMapper getShareMapper()
{
return m_config.getShareMapper();
}
/**
* Return the available shared device list.
*
* @param host String
* @param sess SrvSession
* @return SharedDeviceList
*/
public final SharedDeviceList getShareList(String host, SrvSession sess)
{
return getConfiguration().getShareMapper().getShareList(host, sess, false);
}
/**
* Return the complete shared device list.
*
* @param host String
* @param sess SrvSession
* @return SharedDeviceList
*/
public final SharedDeviceList getFullShareList(String host, SrvSession sess)
{
return getConfiguration().getShareMapper().getShareList(host, sess, true);
}
/**
* Find the shared device with the specified name.
*
* @param host Host name from the UNC path
* @param name Name of the shared device to find.
* @param typ Shared device type
* @param sess Session details
* @param create Create share flag, false indicates lookup only
* @return SharedDevice with the specified name and type, else null.
* @exception Exception
*/
public final SharedDevice findShare(String host, String name, int typ, SrvSession sess, boolean create)
throws Exception
{
// Search for the specified share
SharedDevice dev = getConfiguration().getShareMapper().findShare(host, name, typ, sess, create);
// Return the shared device, or null
return dev;
}
/**
* Determine if the SMB server is active.
*
* @return boolean
*/
public final boolean isActive()
{
return m_active;
}
/**
* Return the server version string, in 'n.n.n' format
*
* @return String
*/
public final String isVersion()
{
return m_version;
}
/**
* Check if there is a stored server exception
*
* @return boolean
*/
public final boolean hasException()
{
return m_exception != null ? true : false;
}
/**
* Return the stored exception
*
* @return Exception
*/
public final Exception getException()
{
return m_exception;
}
/**
* Clear the stored server exception
*/
public final void clearException()
{
m_exception = null;
}
/**
* Return the server protocol name
*
* @return String
*/
public final String getProtocolName()
{
return m_protoName;
}
/**
* Determine if debug output is enabled
*
* @return boolean
*/
public final boolean hasDebug()
{
return m_debug;
}
/**
* Determine if the specified debug flag is enabled
*
* @return boolean
*/
public final boolean hasDebugFlag(int flg)
{
return (m_debugFlags & flg) != 0 ? true : false;
}
/**
* Check if the shutdown flag is set
*
* @return boolean
*/
public final boolean hasShutdown()
{
return m_shutdown;
}
/**
* Set/clear the server active flag
*
* @param active boolean
*/
protected void setActive(boolean active)
{
m_active = active;
}
/**
* Set the stored server exception
*
* @param ex Exception
*/
protected final void setException(Exception ex)
{
m_exception = ex;
}
/**
* Set the addresses that the server is bound to
*
* @param adds InetAddress[]
*/
protected final void setServerAddresses(InetAddress[] addrs)
{
m_ipAddr = addrs;
}
/**
* Set the server version
*
* @param ver String
*/
protected final void setVersion(String ver)
{
m_version = ver;
}
/**
* Enable/disable debug output for the server
*
* @param dbg boolean
*/
protected final void setDebug(boolean dbg)
{
m_debug = dbg;
}
/**
* Set the debug flags
*
* @param flags int
*/
protected final void setDebugFlags(int flags)
{
m_debugFlags = flags;
setDebug(flags == 0 ? false : true);
}
/**
* Set/clear the shutdown flag
*
* @param ena boolean
*/
protected final void setShutdown(boolean ena)
{
m_shutdown = ena;
}
/**
* Add a server listener to this server
*
* @param l ServerListener
*/
public final void addServerListener(ServerListener l)
{
m_listener = l;
}
/**
* Remove the server listener
*
* @param l ServerListener
*/
public final void removeServerListener(ServerListener l)
{
if (m_listener == l)
m_listener = null;
}
/**
* Add a new session listener to the network server.
*
* @param l SessionListener
*/
public final void addSessionListener(SessionListener l)
{
// Check if the session listener list is allocated
if (m_sessListeners == null)
m_sessListeners = new Vector();
m_sessListeners.add(l);
}
/**
* Remove a session listener from the network server.
*
* @param l SessionListener
*/
public final void removeSessionListener(SessionListener l)
{
// Check if the listener list is valid
if (m_sessListeners == null)
return;
m_sessListeners.removeElement(l);
}
/**
* Fire a server event to the registered listener
*
* @param event int
*/
protected final void fireServerEvent(int event)
{
// Check if there is a listener registered with this server
if (m_listener != null)
{
try
{
m_listener.serverStatusEvent(this, event);
}
catch (Exception ex)
{
}
}
}
/**
* Start the network server
*/
public abstract void startServer();
/**
* Shutdown the network server
*
* @param immediate boolean
*/
public abstract void shutdownServer(boolean immediate);
/**
* Trigger a closed session event to all registered session listeners.
*
* @param sess SrvSession
*/
protected final void fireSessionClosedEvent(SrvSession sess)
{
// Check if there are any listeners
if (m_sessListeners == null || m_sessListeners.size() == 0)
return;
// Inform all registered listeners
for (int i = 0; i < m_sessListeners.size(); i++)
{
// Get the current session listener
try
{
SessionListener sessListener = (SessionListener) m_sessListeners.elementAt(i);
sessListener.sessionClosed(sess);
}
catch (Exception ex)
{
logger.error("Session listener error [closed]: ", ex);
}
}
}
/**
* Trigger a new session event to all registered session listeners.
*
* @param sess SrvSession
*/
protected final void fireSessionLoggedOnEvent(SrvSession sess)
{
// Check if there are any listeners
if (m_sessListeners == null || m_sessListeners.size() == 0)
return;
// Inform all registered listeners
for (int i = 0; i < m_sessListeners.size(); i++)
{
// Get the current session listener
try
{
SessionListener sessListener = (SessionListener) m_sessListeners.elementAt(i);
sessListener.sessionLoggedOn(sess);
}
catch (Exception ex)
{
logger.error("Session listener error [logon]: ", ex);
}
}
}
/**
* Trigger a new session event to all registered session listeners.
*
* @param sess SrvSession
*/
protected final void fireSessionOpenEvent(SrvSession sess)
{
// Check if there are any listeners
if (m_sessListeners == null || m_sessListeners.size() == 0)
return;
// Inform all registered listeners
for (int i = 0; i < m_sessListeners.size(); i++)
{
// Get the current session listener
try
{
SessionListener sessListener = (SessionListener) m_sessListeners.elementAt(i);
sessListener.sessionCreated(sess);
}
catch (Exception ex)
{
logger.error("Session listener error [open]: ", ex);
}
}
}
}