#!/usr/bin/env python

# 
# Configuration manager singleton.
#

#######################################################################

import os
import socket
import pwd
import UserDict
import ConfigParser

from dm.common.constants import dmServiceConstants
from dm.common.exceptions.configurationError import ConfigurationError

#######################################################################

# Defaults.

DEFAULT_DM_ROOT_DIR = '/opt/dm'
DEFAULT_DM_INSTALL_DIR = '%s'                     # requires install dir
DEFAULT_DM_CONFIG_FILE = '%s/etc/%s.%s.conf'      # requires install dir/db name/service name
DEFAULT_DM_SERVICE_NAME= 'web-service'

DEFAULT_DM_LOG_FILE = '%s/var/log/%s.%s.log'         # requires install dir/db name/service name
DEFAULT_DM_CONSOLE_LOG_LEVEL = 'CRITICAL'
DEFAULT_DM_FILE_LOG_LEVEL = 'INFO'
#DEFAULT_DM_LOG_RECORD_FORMAT = '%(asctime)s,%(msecs)03d [%(levelname)s] %(module)s:%(lineno)d %(user)s@%(host)s %(name)s (%(process)d): %(message)s'
#DEFAULT_DM_LOG_RECORD_FORMAT = '%(asctime)s,%(msecs)03d %(levelname)s %(module)s:%(lineno)d %(process)d:  %(message)s'
DEFAULT_DM_LOG_RECORD_FORMAT = '%(asctime)s,%(msecs)03d %(levelname)s %(process)d:  %(message)s'
DEFAULT_DM_LOG_DATE_FORMAT = '%Y/%m/%d %H:%M:%S'

DEFAULT_DM_CHERRYPY_LOG_LEVEL = 'ERROR'
DEFAULT_DM_CHERRYPY_LOG_FILE = '%s/var/log/%s.%s.cherrypy.error'     # requires install dir/db name/service name
DEFAULT_DM_CHERRYPY_ACCESS_FILE = '%s/var/log/%s.%s.cherrypy.access' # requires install dir/db name/service name

DEFAULT_DM_SERVICE_PORT = 22236    # 222DM
DEFAULT_DM_SERVICE_HOST = '0.0.0.0'
DEFAULT_DM_SERVICE_PROTOCOL = dmServiceConstants.DM_SERVICE_PROTOCOL_HTTP

DEFAULT_DM_WEB_SERVICE_PROTOCOL = DEFAULT_DM_SERVICE_PROTOCOL 
DEFAULT_DM_DS_WEB_SERVICE_PORT = 22236    # 222DM
DEFAULT_DM_DS_WEB_SERVICE_HOST = '127.0.0.1'
DEFAULT_DM_DAQ_WEB_SERVICE_PORT = 33336    # 333DM
DEFAULT_DM_DAQ_WEB_SERVICE_HOST = '127.0.0.1'
DEFAULT_DM_CAT_WEB_SERVICE_PORT = 44436    # 444DM
DEFAULT_DM_CAT_WEB_SERVICE_HOST = '127.0.0.1'
DEFAULT_DM_PROC_WEB_SERVICE_PORT = 55536    # 555DM
DEFAULT_DM_PROC_WEB_SERVICE_HOST = '127.0.0.1'

DEFAULT_DM_DB = 'postgresql'
DEFAULT_DM_DB_HOST = '127.0.0.1'
DEFAULT_DM_DB_PORT = 11136
DEFAULT_DM_DB_PASSWORD = ''
DEFAULT_DM_DB_NAME = 'dm'
DEFAULT_DM_DB_SCHEMA = DEFAULT_DM_DB_NAME
DEFAULT_DM_DB_USER = DEFAULT_DM_DB_NAME
DEFAULT_DM_DB_PASSWORD_FILE = '%s/etc/%s.db.passwd' # requires install dir/db name

DEFAULT_DM_CONTEXT_ROOT = '/dm'

# Session cache file
DEFAULT_DM_SESSION_CACHE_FILE = None

# Enforce session credentials.
DEFAULT_DM_REQUIRE_SESSION_CREDENTIALS = False

# SSL variables
DEFAULT_DM_SSL_CA_CERT_FILE = None
DEFAULT_DM_SSL_CERT_FILE = None
DEFAULT_DM_SSL_KEY_FILE = None

# Login (user|password) files
DEFAULT_DM_LOGIN_FILE = None
DEFAULT_DM_BSS_LOGIN_FILE = None

# Station name
DEFAULT_DM_STATION_NAME = None

# Allowed experiment types
DEFAULT_DM_ALLOWED_EXPERIMENT_TYPES = None

# Beamline stuff
DEFAULT_DM_BEAMLINE_NAME = None
DEFAULT_DM_BEAMLINE_MANAGERS = None

class ConfigurationManager(UserDict.UserDict):
    """ 
    Singleton class used for keeping system configuration data. The class
    initializes its data using predefined defaults, or from certain 
    environment variables.

    Usage:
        from dm.common.utility import configurationManager
        cm = configurationManager.getInstance()
        cm.setConsoleLogLevel('info')
        level = cm.getConsoleLogLevel()
        cm['myKey'] = 'myValue'
        value = cm.get('myKey')
    """

    # Get singleton instance.
    @classmethod
    def getInstance(cls):
        """ Get configuration manager singleton instance. """
        from dm.common.utility.configurationManager import ConfigurationManager
        try:
            cm = ConfigurationManager()
        except ConfigurationManager, ex:
            cm = ex
        return cm

    # Singleton.
    __instance = None

    def __init__(self):
        if ConfigurationManager.__instance:
            raise ConfigurationManager.__instance
        ConfigurationManager.__instance = self
        UserDict.UserDict.__init__(self)
        self['user'] = pwd.getpwuid(os.getuid())[0]
        self['host'] = socket.gethostname()

        self['defaultRootDir'] = DEFAULT_DM_ROOT_DIR
        self.__setFromEnvVar('rootDir', 'DM_ROOT_DIR')
        self['defaultInstallDir'] = DEFAULT_DM_INSTALL_DIR % self.getRootDir()
        self.__setFromEnvVar('installDir', 'DM_INSTALL_DIR')
        self['defaultServiceName'] = DEFAULT_DM_SERVICE_NAME 
        self.__setFromEnvVar('serviceName', 'DM_SERVICE_NAME')
        self['defaultDbName'] = DEFAULT_DM_DB_NAME 
        self.__setFromEnvVar('dbName', 'DM_DB_NAME')
        self.__resetDynamicDefaults()

        self['defaultConsoleLogLevel'] = DEFAULT_DM_CONSOLE_LOG_LEVEL
        self['defaultFileLogLevel'] = DEFAULT_DM_FILE_LOG_LEVEL
        self['defaultLogRecordFormat'] = DEFAULT_DM_LOG_RECORD_FORMAT
        self['defaultLogDateFormat'] = DEFAULT_DM_LOG_DATE_FORMAT

        self['defaultCherrypyLogLevel'] = DEFAULT_DM_CHERRYPY_LOG_LEVEL

        self['defaultServicePort'] = DEFAULT_DM_SERVICE_PORT
        self['defaultServiceHost'] = DEFAULT_DM_SERVICE_HOST
        self['defaultServiceProtocol'] = DEFAULT_DM_SERVICE_PROTOCOL

        self['defaultWebServiceProtocol'] = DEFAULT_DM_WEB_SERVICE_PROTOCOL
        self['defaultDaqWebServicePort'] = DEFAULT_DM_DAQ_WEB_SERVICE_PORT
        self['defaultDaqWebServiceHost'] = DEFAULT_DM_DAQ_WEB_SERVICE_HOST
        self['defaultDsWebServicePort'] = DEFAULT_DM_DS_WEB_SERVICE_PORT
        self['defaultDsWebServiceHost'] = DEFAULT_DM_DS_WEB_SERVICE_HOST
        self['defaultCatWebServicePort'] = DEFAULT_DM_CAT_WEB_SERVICE_PORT
        self['defaultCatWebServiceHost'] = DEFAULT_DM_CAT_WEB_SERVICE_HOST
        self['defaultProcWebServicePort'] = DEFAULT_DM_PROC_WEB_SERVICE_PORT
        self['defaultProcWebServiceHost'] = DEFAULT_DM_PROC_WEB_SERVICE_HOST

        self['defaultDb'] = DEFAULT_DM_DB
        self['defaultDbHost'] = DEFAULT_DM_DB_HOST
        self['defaultDbPort'] = DEFAULT_DM_DB_PORT
        self['defaultDbPassword'] = DEFAULT_DM_DB_PASSWORD

        self['defaultContextRoot'] = DEFAULT_DM_CONTEXT_ROOT

        self['defaultSessionCacheFile'] = DEFAULT_DM_SESSION_CACHE_FILE
        self['defaultRequireSessionCredentials'] = DEFAULT_DM_REQUIRE_SESSION_CREDENTIALS

        self['defaultSslCaCertFile'] = DEFAULT_DM_SSL_CA_CERT_FILE
        self['defaultSslCertFile'] = DEFAULT_DM_SSL_CERT_FILE
        self['defaultSslKeyFile'] = DEFAULT_DM_SSL_KEY_FILE

        self['defaultLoginFile'] = DEFAULT_DM_LOGIN_FILE
        self['defaultBssLoginFile'] = DEFAULT_DM_BSS_LOGIN_FILE

        self['defaultStationName'] = DEFAULT_DM_STATION_NAME

        self['defaultAllowedExperimentTypes'] = DEFAULT_DM_ALLOWED_EXPERIMENT_TYPES
        self['defaultBeamlineName'] = DEFAULT_DM_BEAMLINE_NAME
        self['defaultBeamlineManagers'] = DEFAULT_DM_BEAMLINE_MANAGERS

        # Settings that might come from environment variables.
        self.__setFromEnvVar('logFile', 'DM_LOG_FILE')
        self.__setFromEnvVar('consoleLogLevel', 'DM_CONSOLE_LOG_LEVEL')
        self.__setFromEnvVar('fileLogLevel', 'DM_FILE_LOG_LEVEL')
        self.__setFromEnvVar('logRecordFormat', 'DM_LOG_RECORD_FORMAT')
        self.__setFromEnvVar('logDateFormat', 'DM_LOG_DATE_FORMAT')

        self.__setFromEnvVar('cherrypyLogLevel', 'DM_CHERRYPY_LOG_LEVEL')
        self.__setFromEnvVar('cherrypyLogFile', 'DM_CHERRYPY_LOG_FILE')
        self.__setFromEnvVar('cherrypyAccessFile', 'DM_CHERRYPY_ACCESS_FILE')

        self.__setFromEnvVar('serviceHost', 'DM_SERVICE_HOST')
        self.__setFromEnvVar('servicePort', 'DM_SERVICE_PORT')
        self.__setFromEnvVar('serviceProtocol', 'DM_SERVICE_PROTOCOL')

        self.__setFromEnvVar('webServiceProtocol', 'DM_WEB_SERVICE_PROTOCOL')
        self.__setFromEnvVar('daqWebServiceHost', 'DM_DAQ_WEB_SERVICE_HOST')
        self.__setFromEnvVar('daqWebServicePort', 'DM_DAQ_WEB_SERVICE_PORT')
        self.__setFromEnvVar('dsWebServiceHost', 'DM_DS_WEB_SERVICE_HOST')
        self.__setFromEnvVar('dsWebServicePort', 'DM_DS_WEB_SERVICE_PORT')
        self.__setFromEnvVar('catWebServiceHost', 'DM_CAT_WEB_SERVICE_HOST')
        self.__setFromEnvVar('catWebServicePort', 'DM_CAT_WEB_SERVICE_PORT')
        self.__setFromEnvVar('procWebServiceHost', 'DM_PROC_WEB_SERVICE_HOST')
        self.__setFromEnvVar('procWebServicePort', 'DM_PROC_WEB_SERVICE_PORT')

        self.__setFromEnvVar('contextRoot', 'DM_CONTEXT_ROOT')

        self.__setFromEnvVar('sessionCacheFile', 'DM_SESSION_CACHE_FILE')

        self.__setFromEnvVar('sslCaCertFile', 'DM_SSL_CA_CERT_FILE')
        self.__setFromEnvVar('sslCertFile', 'DM_SSL_CERT_FILE')
        self.__setFromEnvVar('sslKeyFile', 'DM_SSL_KEY_FILE')

        self.__setFromEnvVar('configFile', 'DM_CONFIG_FILE')
        self.__setFromEnvVar('dbPasswordFile', 'DM_DB_PASSWORD_FILE')
        self.__setFromEnvVar('loginFile', 'DM_LOGIN_FILE')
        self.__setFromEnvVar('bssLoginFile', 'DM_BSS_LOGIN_FILE')

        self.__setFromEnvVar('stationName', 'DM_STATION_NAME')
        self.__setFromEnvVar('allowedExperimentTypes', 'DM_ALLOWED_EXPERIMENT_TYPES')
        self.__setFromEnvVar('beamlineName', 'DM_BEAMLINE_NAME')
        self.__setFromEnvVar('beamlineManagers', 'DM_BEAMLINE_MANAGERS')

        # Settings that might come from file.
        self.__setFromVarFile('dbPassword', self.getDbPasswordFile())

        # Variables we do not keep in a dictionary
        self.configParser = None

    # Reset defaults that depend on install dir and service name
    def __resetDynamicDefaults(self):
        self['defaultConfigFile'] = DEFAULT_DM_CONFIG_FILE % (self.getInstallDir(), self.getDbName(), self.getServiceName())
        self['defaultLogFile'] = DEFAULT_DM_LOG_FILE % (self.getInstallDir(), self.getDbName(), self.getServiceName())
        self['defaultCherrypyAccessFile'] = DEFAULT_DM_CHERRYPY_ACCESS_FILE % (self.getInstallDir(), self.getDbName(), self.getServiceName())
        self['defaultCherrypyLogFile'] = DEFAULT_DM_CHERRYPY_LOG_FILE % (self.getInstallDir(), self.getDbName(), self.getServiceName())
        self['defaultDbUser'] = self.getDbName()
        self['defaultDbSchema'] = self.getDbName()
        self['defaultDbPasswordFile'] = DEFAULT_DM_DB_PASSWORD_FILE % (self.getInstallDir(), self.getDbName())

    # This function will ignore errors if environment variable is not set.
    def __setFromEnvVar(self, key, envVar):
        """ 
        Set value for the specified key from a given environment variable.
        This function ignores errors for env. variables that are not set.
        """
        try:
            self[key] = os.environ[envVar]
        except:
            pass

    # This function will ignore errors if variable file is not present.
    def __setFromVarFile(self, key, varFile):
        """ 
        Set value for the specified key from a given file. The first line  
        in the file is variable value.
        This function ignores errors.
        """
        try:
            v = open(varFile, 'r').readline()
            self[key] = v.lstrip().rstrip()
        except Exception, ex:
            pass

    def __getKeyValue(self, key, default='__dm_default__'):
        """
        Get value for a given key.
        Keys will be of the form 'logFile', and the default keys have
        the form 'defaultLogFile'.
        """
        defaultKey = "default" + key[0].upper() + key[1:]
        defaultValue = self.get(defaultKey, None)
        if default != '__dm_default__':
            defaultValue = default
        return self.get(key, defaultValue)

    def setOptionsFromConfigFile(self, configSection, keyList, configFile=None):
        _configFile = configFile
        if _configFile is None:
           _configFile = self.getConfigFile()
            
        if _configFile is not None and os.path.exists(_configFile):
            configParser = ConfigParser.RawConfigParser()
            configParser.read(_configFile)
            if not configParser.has_section(configSection):
                return
            for key in keyList:
                if configParser.has_option(configSection, key):
                    self[key] = configParser.get(configSection, key)

    def clearConfigParser(self):
        self.configParser = None

    def getConfigParser(self, defaults={}):
        if self.configParser is None:
            configFile = self.getConfigFile()
            if os.path.exists(configFile):
                self.configParser = ConfigParser.ConfigParser(defaults)
                self.configParser.read(configFile)
                self.configParser.defaults = defaults
        return self.configParser

    def setConfigDefaults(self, defaults={}):
        configParser = self.getConfigParser()
        if configParser is not None:
            configParser.defaults = defaults

    def getConfigOption(self, configSection, key, defaultValue=None):
        configParser = self.getConfigParser()
        if self.hasConfigSection(configSection):
            try:
                return configParser.get(configSection, key)
            except ConfigParser.NoOptionError, ex:
                # ok, return default value
                pass
        return defaultValue

    def getConfigSections(self):
        configParser = self.getConfigParser()
        if configParser is not None:
            return configParser.sections()
        return []

    def hasConfigSection(self, name):
        configSections = self.getConfigSections()
        if name in configSections:
            return True
        return False

    def getConfigItems(self, configSection):
        configParser = self.getConfigParser()
        if configParser is not None and configParser.has_section(configSection):
            return configParser.items(configSection)
        return []

    @classmethod
    def getConfigParserFromConfigFile(cls, configFile):
        if not os.path.exists(configFile):
            return None
        configParser = ConfigParser.RawConfigParser()
        configParser.read(configFile)
        return configParser

    @classmethod
    def getOptionFromConfigParser(cls, configParser, configSection, key, defaultValue=None):
        if configParser is not None and configParser.has_section(configSection):
            return configParser.get(configSection, key)
        else:
            return defaultValue

    @classmethod
    def getConfigSectionsFromConfigParser(cls, configParser):
        if configParser is not None:
            return configParser.sections()
        return []

    @classmethod
    def getModuleClassConstructorTuple(cls, value, creatorClass=None):
        """ Extract (module,class,constructor) tuple from the given value. """
        itemList = value.split('(')
        if not itemList:
            return ()
        itemList2 = itemList[0].split('.')
        moduleNameList = itemList2[0:-1]
        className = itemList2[-1]
        moduleName = className[0].lower() + className[1:]

        # If module name list is empty, use convention
        # for determining import module name (use creator class module)
        if not len(moduleNameList) and creatorClass is not None:
            moduleNameList = creatorClass.__module__.split('.')
            moduleNameList[-1] = moduleName

        if len(moduleNameList): 
            moduleName = '.'.join(moduleNameList)
        constructor = '%s(%s' % (className, ''.join(itemList[1:]))
        return (moduleName,className,constructor)

    def getHost(self):
        return self['host']
    
    def getUser(self):
        return self['user']

    def getDefaultRootDir(self):
        return self['defaultRootDir']

    def setRootDir(self, rootDir):
        self['rootDir'] = rootDir

    def getRootDir(self, default='__dm_default__'):
        return self.__getKeyValue('rootDir', default)

    def getDefaultInstallDir(self):
        return self['defaultInstallDir']

    def setInstallDir(self, installDir):
        self['installDir'] = installDir
        self.__resetDynamicDefaults()

    def getInstallDir(self, default='__dm_default__'):
        return self.__getKeyValue('installDir', default)

    def getDefaultServiceName(self):
        return self['defaultServiceName']

    def setServiceName(self, serviceName):
        self['serviceName'] = serviceName
        self.__resetDynamicDefaults()

    def getServiceName(self, default='__dm_default__'):
        return self.__getKeyValue('serviceName', default)

    def getDefaultDbName(self):
        return self['defaultDbName']

    def setDbName(self, dbName):
        self['dbName'] = dbName
        self.__resetDynamicDefaults()

    def getDbName(self, default='__dm_default__'):
        return self.__getKeyValue('dbName', default)

    def getDefaultLogFile(self):
        return self['defaultLogFile']

    def setLogFile(self, logFile):
        self['logFile'] = logFile

    def getLogFile(self, default='__dm_default__'):
        return self.__getKeyValue('logFile', default)

    def hasLogFile(self):
        return self.has_key('logFile')

    def getDefaultConsoleLogLevel(self):
        return self['defaultConsoleLogLevel']

    def setConsoleLogLevel(self, level):
        self['consoleLogLevel'] = level 

    def getConsoleLogLevel(self, default='__dm_default__'):
        return self.__getKeyValue('consoleLogLevel', default)

    def getConsoleLogLevelFromEnvVar(self):
        return os.environ.get('DM_CONSOLE_LOG_LEVEL')

    def hasConsoleLogLevel(self):
        return self.has_key('consoleLogLevel')

    def getDefaultFileLogLevel(self):
        return self['defaultFileLogLevel']

    def setFileLogLevel(self, level):
        self['fileLogLevel'] = level 

    def getFileLogLevel(self, default='__dm_default__'):
        return self.__getKeyValue('fileLogLevel', default)

    def hasFileLogLevel(self):
        return self.has_key('fileLogLevel')

    def getDefaultLogRecordFormat(self):
        return self['defaultLogRecordFormat']

    def setLogRecordFormat(self, format):
        self['logRecordFormat'] = format

    def getLogRecordFormat(self, default='__dm_default__'):
        return self.__getKeyValue('logRecordFormat', default)

    def hasLogRecordFormat(self):
        return self.has_key('logRecordFormat')

    def getDefaultLogDateFormat(self):
        return self['defaultLogDateFormat']

    def setLogDateFormat(self, format):
        self['logDateFormat'] = format

    def getLogDateFormat(self, default='__dm_default__'):
        return self.__getKeyValue('logDateFormat', default)

    def hasLogDateFormat(self):
        return self.has_key('logDateFormat')

    def getDefaultCherrypyLogLevel(self):
        return self['defaultCherrypyLogLevel']

    def setCherrypyLogLevel(self, level):
        self['cherrypyLogLevel'] = level 

    def getCherrypyLogLevel(self, default='__dm_default__'):
        return self.__getKeyValue('cherrypyLogLevel', default)

    def hasCherrypyLogLevel(self):
        return self.has_key('cherrypyLogLevel')

    def getDefaultCherrypyLogCherrypy(self):
        return self['defaultCherrypyLogFile']

    def setCherrypyLogFile(self, cherrypyLogFile):
        self['cherrypyLogFile'] = cherrypyLogFile

    def getCherrypyLogFile(self, default='__dm_default__'):
        return self.__getKeyValue('cherrypyLogFile', default)

    def hasCherrypyLogFile(self):
        return self.has_key('cherrypyLogFile')

    def getDefaultCherrypyAccessFile(self):
        return self['defaultCherrypyAccessFile']

    def setCherrypyAccessFile(self, cherrypyAccessFile):
        self['cherrypyAccessFile'] = cherrypyAccessFile

    def getCherrypyAccessFile(self, default='__dm_default__'):
        return self.__getKeyValue('cherrypyAccessFile', default)

    def hasCherrypyAccessFile(self):
        return self.has_key('cherrypyAccessFile')

    def isDbAvailable(self):
        if os.access(self.getDbPasswordFile(), os.R_OK):
            return True
        return False

    def getDefaultServiceProtocol(self):
        return self['defaultServiceProtocol']

    def setServiceProtocol(self, serviceProtocol):
        self['serviceProtocol'] = serviceProtocol

    def getServiceProtocol(self, default='__dm_default__'):
        return self.__getKeyValue('serviceProtocol', default)

    def hasServiceProtocol(self):
        return self.has_key('serviceProtocol')

    def getDefaultServicePort(self):
        return self['defaultServicePort']

    def setServicePort(self, servicePort):
        self['servicePort'] = servicePort 

    def getServicePort(self, default='__dm_default__'):
        return int(self.__getKeyValue('servicePort', default))

    def hasServicePort(self):
        return self.has_key('servicePort')

    def getDefaultServiceHost(self):
        return self['defaultServiceHost']

    def setServiceHost(self, serviceHost):
        self['serviceHost'] = serviceHost

    def getServiceHost(self, default='__dm_default__'):
        return self.__getKeyValue('serviceHost', default)

    def hasServiceHost(self):
        return self.has_key('serviceHost')

    def getDefaultWebServiceProtocol(self):
        return self['defaultWebServiceProtocol']

    def setWebServiceProtocol(self, webServiceProtocol):
        self['webServiceProtocol'] = webServiceProtocol

    def getWebServiceProtocol(self, default='__dm_default__'):
        return self.__getKeyValue('webServiceProtocol', default)

    def hasWebServiceProtocol(self):
        return self.has_key('webServiceProtocol')

    def getDefaultDaqWebServicePort(self):
        return self['defaultDaqWebServicePort']

    def setDaqWebServicePort(self, daqWebServicePort):
        self['daqWebServicePort'] = daqWebServicePort 

    def getDaqWebServicePort(self, default='__dm_default__'):
        return int(self.__getKeyValue('daqWebServicePort', default))

    def hasDaqWebServicePort(self):
        return self.has_key('daqWebServicePort')

    def getDefaultDaqWebServiceHost(self):
        return self['defaultDaqWebServiceHost']

    def setDaqWebServiceHost(self, daqWebServiceHost):
        self['daqWebServiceHost'] = daqWebServiceHost

    def getDaqWebServiceHost(self, default='__dm_default__'):
        return self.__getKeyValue('daqWebServiceHost', default)

    def hasDaqWebServiceHost(self):
        return self.has_key('daqWebServiceHost')

    def getDefaultDsWebServicePort(self):
        return self['defaultDsWebServicePort']

    def setDsWebServicePort(self, dsWebServicePort):
        self['dsWebServicePort'] = dsWebServicePort 

    def getDsWebServicePort(self, default='__dm_default__'):
        return int(self.__getKeyValue('dsWebServicePort', default))

    def hasDsWebServicePort(self):
        return self.has_key('dsWebServicePort')

    def getDefaultDsWebServiceHost(self):
        return self['defaultDsWebServiceHost']

    def setDsWebServiceHost(self, dsWebServiceHost):
        self['dsWebServiceHost'] = dsWebServiceHost

    def getDsWebServiceHost(self, default='__dm_default__'):
        return self.__getKeyValue('dsWebServiceHost', default)

    def hasDsWebServiceHost(self):
        return self.has_key('dsWebServiceHost')

    def getDefaultCatWebServicePort(self):
        return self['defaultCatWebServicePort']

    def setCatWebServicePort(self, catWebServicePort):
        self['catWebServicePort'] = catWebServicePort 

    def getCatWebServicePort(self, default='__dm_default__'):
        return int(self.__getKeyValue('catWebServicePort', default))

    def hasCatWebServicePort(self):
        return self.has_key('catWebServicePort')

    def getDefaultCatWebServiceHost(self):
        return self['defaultCatWebServiceHost']

    def setCatWebServiceHost(self, catWebServiceHost):
        self['catWebServiceHost'] = catWebServiceHost

    def getCatWebServiceHost(self, default='__dm_default__'):
        return self.__getKeyValue('catWebServiceHost', default)

    def hasCatWebServiceHost(self):
        return self.has_key('catWebServiceHost')

    def getDefaultProcWebServicePort(self):
        return self['defaultProcWebServicePort']

    def setProcWebServicePort(self, procWebServicePort):
        self['procWebServicePort'] = procWebServicePort 

    def getProcWebServicePort(self, default='__dm_default__'):
        return int(self.__getKeyValue('procWebServicePort', default))

    def hasProcWebServicePort(self):
        return self.has_key('procWebServicePort')

    def getDefaultProcWebServiceHost(self):
        return self['defaultProcWebServiceHost']

    def setProcWebServiceHost(self, procWebServiceHost):
        self['procWebServiceHost'] = procWebServiceHost

    def getProcWebServiceHost(self, default='__dm_default__'):
        return self.__getKeyValue('procWebServiceHost', default)

    def hasProcWebServiceHost(self):
        return self.has_key('procWebServiceHost')

    def getDefaultDb(self):
        return self['defaultDb']

    def setDb(self, db):
        self['db'] = db

    def getDb(self, default='__dm_default__'):
        return self.__getKeyValue('db', default) 

    def hasDb(self):
        return self.has_key('db')

    def getDefaultDbHost(self):
        return self['defaultDbHost']

    def setDbHost(self, dbHost):
        self['dbHost'] = dbHost

    def getDbHost(self, default='__dm_default__'):
        return self.__getKeyValue('dbHost', default) 

    def hasDbHost(self):
        return self.has_key('dbHost')

    def getDefaultDbPort(self):
        return self['defaultDbPort']

    def setDbPort(self, dbPort):
        self['dbPort'] = dbPort

    def getDbPort(self, default='__dm_default__'):
        return self.__getKeyValue('dbPort', default) 

    def hasDbPort(self):
        return self.has_key('dbPort')

    def getDefaultDbPassword(self):
        return self['defaultDbPassword']

    def setDbPassword(self, dbPassword):
        self['dbPassword'] = dbPassword

    def getDbPassword(self, default='__dm_default__'):
        return self.__getKeyValue('dbPassword', default) 

    def hasDbPassword(self):
        return self.has_key('dbPassword')

    def getDefaultDbPasswordFile(self):
        return self['defaultDbPasswordFile']

    def getDbPasswordFile(self, default='__dm_default__'):
        return self.__getKeyValue('dbPasswordFile', default) 

    def setDbPasswordFile(self, f):
        self['dbPasswordFile'] = f

    def hasDbPasswordFile(self):
        return self.has_key('dbPasswordFile')

    def getDefaultDbUser(self):
        return self['defaultDbUser']

    def getDbUser(self, default='__dm_default__'):
        return self.__getKeyValue('dbUser', default) 

    def setDbUser(self, dbUser):
        self['dbUser'] = dbUser

    def hasDbUser(self):
        return self.has_key('dbUser')

    def getDbSchema(self, default='__dm_default__'):
        return self.__getKeyValue('dbSchema', default)

    def getDefaultConfigFile(self):
        return self['defaultConfigFile']

    def setConfigFile(self, configFile):
        self['configFile'] = configFile
        # Must reinitialize config parser at this point
        self.configParser = None

    def getConfigFile(self, default='__dm_default__'):
        return self.__getKeyValue('configFile', default)

    def hasConfigFile(self):
        return self.has_key('configFile')

    def getDefaultContextRoot(self):
        return self['defaultContextRoot']

    def setContextRoot(self, contextRoot):
        self['contextRoot'] = contextRoot

    def getContextRoot(self, default='__dm_default__'):
        return self.__getKeyValue('contextRoot', default)

    def hasContextRoot(self):
        return self.has_key('contextRoot')

    def getDefaultSessionCacheFile(self):
        return self['defaultSessionCacheFile']

    def setSessionCacheFile(self, sessionCacheFile):
        self['sessionCacheFile'] = sessionCacheFile

    def getSessionCacheFile(self, default='__dm_default__'):
        return self.__getKeyValue('sessionCacheFile', default)

    def hasSessionCacheFile(self):
        return self.has_key('sessionCacheFile')

    def getDefaultRequireSessionCredentials(self):
        return self['defaultRequireSessionCredentials']

    def setRequireSessionCredentials(self, requireSessionCredentials):
        self['requireSessionCredentials'] = requireSessionCredentials

    def getRequireSessionCredentials(self, default='__dm_default__'):
        return self.__getKeyValue('requireSessionCredentials', default)

    def hasRequireSessionCredentials(self):
        return self.has_key('requireSessionCredentials')

    def getDefaultSslCaCertFile(self):
        return self['defaultSslCaCertFile']

    def setSslCaCertFile(self, sslCaCertFile):
        self['sslCaCertFile'] = sslCaCertFile

    def getSslCaCertFile(self, default='__dm_default__'):
        return self.__getKeyValue('sslCaCertFile', default)

    def hasSslCaCertFile(self):
        return self.has_key('sslCaCertFile')

    def getDefaultSslCertFile(self):
        return self['defaultSslCertFile']

    def setSslCertFile(self, sslCertFile):
        self['sslCertFile'] = sslCertFile

    def getSslCertFile(self, default='__dm_default__'):
        return self.__getKeyValue('sslCertFile', default)

    def hasSslCertFile(self):
        return self.has_key('sslCertFile')

    def getDefaultSslKeyFile(self):
        return self['defaultSslKeyFile']

    def setSslKeyFile(self, sslKeyFile):
        self['sslKeyFile'] = sslKeyFile

    def getSslKeyFile(self, default='__dm_default__'):
        return self.__getKeyValue('sslKeyFile', default)

    def hasSslKeyFile(self):
        return self.has_key('sslKeyFile')

    def getDefaultUsername(self):
        return self['defaultUsername']

    def setUsername(self, username):
        self['username'] = username

    def getUsername(self, default='__dm_default__'):
        return self.__getKeyValue('username', default)

    def hasUsername(self):
        return self.has_key('username')

    def getDefaultPassword(self):
        return self['defaultPassword']

    def setPassword(self, password):
        self['password'] = password

    def getPassword(self, default='__dm_default__'):
        return self.__getKeyValue('password', default)

    def hasPassword(self):
        return self.has_key('password')

    def getDefaultLoginFile(self):
        return self['defaultLoginFile']

    def getLoginFile(self, default='__dm_default__'):
        return self.__getKeyValue('loginFile', default) 

    def setLoginFile(self, f):
        self['loginFile'] = f

    def hasLoginFile(self):
        return self.has_key('loginFile')

    def getDefaultBssLoginFile(self):
        return self['defaultBssLoginFile']

    def getBssLoginFile(self, default='__dm_default__'):
        return self.__getKeyValue('bssLoginFile', default) 

    def setBssLoginFile(self, f):
        self['bssLoginFile'] = f

    def hasBssLoginFile(self):
        return self.has_key('bssLoginFile')

    def getDefaultStationName(self):
        return self['defaultStationName']

    def getStationName(self, default='__dm_default__'):
        return self.__getKeyValue('stationName', default) 

    def setStationName(self, f):
        self['stationName'] = f

    def hasStationName(self):
        return self.has_key('stationName')

    def getDefaultAllowedExperimentTypes(self):
        return self['defaultAllowedExperimentTypes']

    def getAllowedExperimentTypes(self, default='__dm_default__'):
        return self.__getKeyValue('allowedExperimentTypes', default) 

    def setAllowedExperimentTypes(self, f):
        self['allowedExperimentTypes'] = f

    def hasAllowedExperimentTypes(self):
        return self.has_key('allowedExperimentTypes')

    def getDefaultBeamlineName(self):
        return self['defaultBeamlineName']

    def getBeamlineName(self, default='__dm_default__'):
        return self.__getKeyValue('beamlineName', default) 

    def setBeamlineName(self, f):
        self['beamlineName'] = f

    def hasBeamlineName(self):
        return self.has_key('beamlineName')

    def getDefaultBeamlineManagers(self):
        return self['defaultBeamlineManagers']

    def getBeamlineManagers(self, default='__dm_default__'):
        return self.__getKeyValue('beamlineManagers', default) 

    def setBeamlineManagers(self, f):
        self['beamlineManagers'] = f

    def hasBeamlineManagers(self):
        return self.has_key('beamlineManagers')

#######################################################################
# Testing.

if __name__ == '__main__':
    cm = ConfigurationManager.getInstance()
    print cm
    print cm.getUsername()