/*
* Copyright (C) 2006-2008 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;
import java.net.InetAddress;
import org.alfresco.jlan.debug.Debug;
import org.alfresco.jlan.server.auth.AuthContext;
import org.alfresco.jlan.server.auth.ClientInfo;
import org.alfresco.jlan.server.core.SharedDevice;
import org.alfresco.jlan.server.core.SharedDeviceList;
import org.alfresco.jlan.server.filesys.TransactionalFilesystemInterface;
/**
* Server Session Base Class
*
* <p>
* Base class for server session implementations for different protocols.
*
* @author gkspencer
*/
public abstract class SrvSession {
// Network server this session is associated with
private NetworkServer m_server;
// Session id/slot number
private int m_sessId;
// Unique session id string
private String m_uniqueId;
// Process id
private int m_processId = -1;
// Session/user is logged on/validated
private boolean m_loggedOn;
// Client details
private ThreadLocal<ClientInfo> m_clientInfo;
// Authentication context, used during the initial session setup phase
private AuthContext m_authContext;
// Debug flags for this session, and debug output interface.
private int m_debug;
private String m_dbgPrefix;
// List of dynamic/temporary shares created for this session
private SharedDeviceList m_dynamicShares;
// Session shutdown flag
private boolean m_shutdown;
// Protocol type
private String m_protocol;
// Remote client/host name
private String m_remoteName;
// Transaction object, for filesystems that implement the TransactionalFilesystemInterface
private ThreadLocal<Object> m_tx;
private ThreadLocal<TransactionalFilesystemInterface> m_txInterface;
// Time of last I/O on this session
private long m_lastIO;
/**
* Class constructor
*
* @param sessId int
* @param srv NetworkServer
* @param proto String
* @param remName String
*/
public SrvSession(int sessId, NetworkServer srv, String proto, String remName) {
m_sessId = sessId;
m_server = srv;
setProtocolName(proto);
setRemoteName(remName);
// Allocate the client information thread local
m_clientInfo = new ThreadLocal<ClientInfo>();
}
/**
* Output a string to the debug device
*
* @param str
*/
public final void debugPrint(String str) {
Debug.print(str);
}
/**
* Output a string and a newline to the debug device
*
* @param str String
*/
public final void debugPrintln(String str) {
Debug.print(m_dbgPrefix);
Debug.println(str);
}
/**
* Output an exception stack trace to the debug device
*
* @param ex Exception
*/
public final void debugPrintln(Exception ex) {
Debug.println(ex);
}
/**
* Check if the session has an authentication context
*
* @return boolean
*/
public final boolean hasAuthenticationContext() {
return m_authContext != null ? true : false;
}
/**
* Return the authentication context for this sesion
*
* @return AuthContext
*/
public final AuthContext getAuthenticationContext() {
return m_authContext;
}
/**
* Add a dynamic share to the list of shares created for this session
*
* @param shrDev SharedDevice
*/
public final void addDynamicShare(SharedDevice shrDev) {
// Check if the dynamic share list must be allocated
if ( m_dynamicShares == null)
m_dynamicShares = new SharedDeviceList();
// Add the new share to the list
m_dynamicShares.addShare(shrDev);
}
/**
* Determine if the session has any dynamic shares
*
* @return boolean
*/
public final boolean hasDynamicShares() {
return m_dynamicShares != null ? true : false;
}
/**
* Return the list of dynamic shares created for this session
*
* @return SharedDeviceList
*/
public final SharedDeviceList getDynamicShareList() {
return m_dynamicShares;
}
/**
* Return the process id
*
* @return int
*/
public final int getProcessId() {
return m_processId;
}
/**
* Return the remote client network address
*
* @return InetAddress
*/
public abstract InetAddress getRemoteAddress();
/**
* Return the session id for this session.
*
* @return int
*/
public final int getSessionId() {
return m_sessId;
}
/**
* Return the server this session is associated with
*
* @return NetworkServer
*/
public final NetworkServer getServer() {
return m_server;
}
/**
* Check if the session has valid client information
*
* @return boolean
*/
public final boolean hasClientInformation() {
return m_clientInfo.get() != null ? true : false;
}
/**
* Return the client information
*
* @return ClientInfo
*/
public final ClientInfo getClientInformation() {
return m_clientInfo.get();
}
/**
* Determine if the protocol type has been set
*
* @return boolean
*/
public final boolean hasProtocolName() {
return m_protocol != null ? true : false;
}
/**
* Return the protocol name
*
* @return String
*/
public final String getProtocolName() {
return m_protocol;
}
/**
* Determine if the remote client name has been set
*
* @return boolean
*/
public final boolean hasRemoteName() {
return m_remoteName != null ? true : false;
}
/**
* Return the remote client name
*
* @return String
*/
public final String getRemoteName() {
return m_remoteName;
}
/**
* Determine if the session is logged on/validated
*
* @return boolean
*/
public final boolean isLoggedOn() {
return m_loggedOn;
}
/**
* Determine if the session has been shut down
*
* @return boolean
*/
public final boolean isShutdown() {
return m_shutdown;
}
/**
* Return the unique session id
*
* @return String
*/
public final String getUniqueId() {
return m_uniqueId;
}
/**
* Determine if the specified debug flag is enabled.
*
* @param dbgFlag int
* @return boolean
*/
public final boolean hasDebug(int dbgFlag) {
if ( (m_debug & dbgFlag) != 0)
return true;
return false;
}
/**
* Return the time of the last I/o on this session
*
* @return long
*/
public final long getLastIOTime() {
return m_lastIO;
}
/**
* Set the authentication context, used during the initial session setup phase
*
* @param ctx AuthContext
*/
public final void setAuthenticationContext(AuthContext ctx) {
m_authContext = ctx;
}
/**
* Set the client information
*
* @param client ClientInfo
*/
public final void setClientInformation(ClientInfo client) {
m_clientInfo.set(client);
}
/**
* Set the debug output interface.
*
* @param flgs int
*/
public final void setDebug(int flgs) {
m_debug = flgs;
}
/**
* Set the debug output prefix for this session
*
* @param prefix String
*/
public final void setDebugPrefix(String prefix) {
m_dbgPrefix = prefix;
}
/**
* Set the logged on/validated status for the session
*
* @param loggedOn boolean
*/
public final void setLoggedOn(boolean loggedOn) {
m_loggedOn = loggedOn;
}
/**
* Set the process id
*
* @param id int
*/
public final void setProcessId(int id) {
m_processId = id;
}
/**
* Set the protocol name
*
* @param name String
*/
public final void setProtocolName(String name) {
m_protocol = name;
}
/**
* Set the remote client name
*
* @param name String
*/
public final void setRemoteName(String name) {
m_remoteName = name;
}
/**
* Set the session id for this session.
*
* @param id int
*/
public final void setSessionId(int id) {
m_sessId = id;
}
/**
* Set the unique session id
*
* @param unid String
*/
public final void setUniqueId(String unid) {
m_uniqueId = unid;
}
/**
* Set the time of hte last I/O on this session
*
* @param ioTime long
*/
public final void setLastIOTime(long ioTime) {
m_lastIO = ioTime;
}
/**
* Set the shutdown flag
*
* @param flg boolean
*/
protected final void setShutdown(boolean flg) {
m_shutdown = flg;
}
/**
* Close the network session
*/
public void closeSession() {
// Release any dynamic shares owned by this session
if ( hasDynamicShares()) {
// Close the dynamic shares
getServer().getShareMapper().deleteShares(this);
}
}
/**
* Initialize the thread local transaction objects
*/
public final void initializeTransactionObject() {
if ( m_tx == null)
m_tx = new ThreadLocal<Object>();
if ( m_txInterface == null)
m_txInterface = new ThreadLocal<TransactionalFilesystemInterface>();
}
/**
* Return the transaction context
*
* @return ThreadLocal<Object>
*/
public final ThreadLocal<Object> getTransactionObject() {
return m_tx;
}
/**
* Set the active transaction and transaction interface
*
* @param tx Object
* @param txIface TransactionalFilesystemInterface
*/
public final void setTransaction(Object tx, TransactionalFilesystemInterface txIface) {
m_tx.set( tx);
m_txInterface.set( txIface);
}
/**
* Set the active transaction interface
*
* @param txIface TransactionalFilesystemInterface
*/
public final void setTransaction(TransactionalFilesystemInterface txIface) {
m_txInterface.set( txIface);
}
/**
* Clear the stored transaction
*/
public final void clearTransaction() {
m_tx.set( null);
m_txInterface.set( null);
}
/**
* End a transaction
*/
public final void endTransaction() {
// Check if there is an active transaction
if ( m_txInterface != null && m_txInterface.get() != null && m_tx != null) {
// Use the transaction interface to end the transaction
m_txInterface.get().endTransaction(this, m_tx.get());
}
}
/**
* Check if there is an active transaction
*
* @return boolean
*/
public final boolean hasTransaction() {
if ( m_tx == null)
return false;
return m_tx.get() != null ? true : false;
}
}