/******************************************************************************
@header FTServer
@abstract Base class for all FT classes
@copyright 2004, 2005, 2006 Free Software Foundation, Inc.
This library 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 2.1 of the License, or (at your option) any later version.
This library 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 library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-------------------------------------------------------------------------
Modification history
30.01.2005 ola initial version
23.08.2006 ola license changed
-------------------------------------------------------------------------
******************************************************************************/
#if !defined(__FTSERVERIMPL_H)
#define __FTSERVERIMPL_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*!
* @typedef ft_server_state_t
* @abstract possible internal states of the server
* @field FT_SERVER_STATE_UNKNOWN may never be the case
* @field FT_SERVER_STATE_STARTED server started but no database has been
* mounted and therefore no data accessing objects can be requested
* @field FT_SERVER_STATE_MOUNTED databases have been mounted and data
* accessing objects can be retrieved
*/
typedef enum {
FT_SERVER_STATE_UNKNOWN = 0,
FT_SERVER_STATE_STARTED,
FT_SERVER_STATE_MOUNTED
} ft_server_state_t;
/*!
* @typedef __ft_req_operation_t
* @abstract gives information for @link{#checkServerstate} about the action
* to perform next
* @field __FT_REQ_UNKNOWN
* @field __FT_REQ_DATA_ACCESS request for accessing data e.g. through a
* data accessing object like e.g. session manager
*/
typedef enum {
__FT_REQ_UNKNOWN = 0,
__FT_REQ_MOUNT_DATABASES = 2,
__FT_REQ_UNMOUNT_DATABASES = 4,
__FT_REQ_DATA_ACCESS = 8
} __ft_req_operation_t;
/*!
* @method FTServerImpl
* @abstract Server implementation of the server interface
*/
@interface FTServerImpl : FTObject {
@private
/**
* The notificationCenter is used to inform instances about important
* server actions, like e.g. a shutdown action
*/
NSNotificationCenter *notificationCenter;
BDBDatabase *graphIdToGraphDB;
BDBDatabase *nodeidToProviderManagerDB;
BDBDatabase *defaultDictionaryProviderDB;
FTSessionManagerImpl *sessionManager;
FTDefaultObjectToIdMapper *defaultObjectToIdMapper;
FTGraphManagerImpl *graphManager;
FTGenericDictionaryProviderImpl *defaultDictionaryProvider;
FTSystemDictionary *systemDictionary;
FTTransactionManagerImpl *transactionManager;
FTConfig *config;
/**
* Service management
*/
id serviceManager;
ft_server_state_t server_state;
}
/**
* @method initialize
* @abstract setups diverse mutexs and the like
*/
+ initialize;
/*!
* @method initWithBaseDir
* @abstract startup the server with the given basis directory
* @param theBaseDir basis directory to use
*/
- initWithConfig: (FTConfig *) theConfig;
- (void) dealloc;
/*!
* @method addOberver
* @abstract adds a listener which listenes to notifications of this server
* instance
* @param anObserver instance to notificate
* @param aSelector selector to use
* @result self
*/
- addOberver: (id) anObserver selector: (SEL) aSelector;
/*!
* µethod baseDataDir
* @result return the base data dir where all database data has to be stored
*/
- (NSString *) baseDataDir;
/*!
* @method checkServerState
* @abstract checks the internal state of the server with respect to the
* specified operation.
* @discussion Throws an @{link ECIllegalStateException} if the specified
* operation is not valid wrt. the current state of the server
* @param reqOperation information about the operation to perform next
* @result if this operation returns (self) then the operation is valid
* wrt. to the current state
*/
- checkServerState: (__ft_req_operation_t) reqOperation;
/*!
* @method config
* @result the configuration for this server
* @abstract This configuration is hand-off by the FTBootstrap instance and
* read from a ftconfig.xml file.
*/
- (FTConfig *) config;
/*!
* @method constructDatabaseFilename
* @abstract Internal method used to construct the filename for the given
* database name
* @discussionion This construction is based on the base data directory
* @param databaseName name of database
* @result constructed filename
* @throws ECIllegalArgumentException if an illegal database name is specified
* @throws ECIncompleteInitializationException is base data dir is not specified
*/
- (NSString *) constructDatabaseFilename: (NSString *) databaseName;
/*!
* @method createUserDatabase
* @abstract create a database with the given configuration
* @discussionion Especially this method ensures that the database does not
* exist before.
* @throws ECIncompleteInitializationException if base data dir is not given or
* if the name of the user database is not given in the info.plist file.
* @throws ECIllegalStateException if a database file already exists.
*/
- (BDBDatabase *) createDatabaseWithName: (NSString *) databaseName
withConfig: (BDBDatabaseConfig *) aConfig;
/*!
* @method dbConfigForDefaultDictionaryProvider
* @abstract create the database configuration instance for the
* "defaultDictionaryProvider" database
*/
- (BDBDatabaseConfig *) dbConfigForDefaultDictionaryProvider;
/*!
* @method dbConfigForGraphIdToGraphDatabase
* @abstract create the database configuration instance for the
* "graphIdToGraphDatabase" database
*/
- (BDBDatabaseConfig *) dbConfigForGraphIdToGraphDatabase;
/*!
* @method dbConfigForGraphIdToGraphDatabase
* @abstract create the database configuration instance for the
* "NodeIdToProviderManager" database
*/
- (BDBDatabaseConfig *) dbConfigForNodeIdToProviderManager;
/*!
* @method defaultDictionaryProvider
* @result return the default dictionary provider
*/
- (id ) defaultDictionaryProvider;
/*!
* @method defaultObjectToIdMapper
* @result return the default object to id mapper used e.g. to retrieve
* graphs based on their id's
*/
- (id ) defaultObjectToIdMapper;
/*!
* @method graphManager
* @result return the graph manager
*/
- (FTGraphManagerImpl *) graphManager;
/*!
* @method databasesMounted
* @result YES if all databases are mounted
*/
- (BOOL) databasesMounted;
/*!
* @method mountDatabases
* @abstract used to open all necessary database connections
* @discussionion in contrast to {@link #setupDatabases} this method does not
* create any database
* @throws ECIllegalStateException if the server is not in the state
* FT_SERVER_STATE_STARTED
*/
- mountDatabases;
/*!
* @method mountDatabasesByAdminSession
* @abstract This call is initiaited by an administration session is used
* to set up the databases
* @discussion This method calls {@link #setupDatabases} and reconnects the
* given session to the session manager
* @param adminSession calling admin session
* @result self
*/
- mountDatabasesByAdminSession: (id ) adminSession;
/*!
* @method nameOfDefaultDictionaryProviderDatabase
* @result name of dataase used to map keys to values
*/
- (NSString *) nameOfDefaultDictionaryProviderDatabase;
/*!
* @method nameOfDefaultObjectToIdMapperDatabase
* @result name of dataase mapping objects to identifiers. Do not release
* this object.
*/
- (NSString *) nameOfDefaultObjectToIdMapperDatabase;
/*!
* @method nameOfGraphIdToGraphDatabase
* @result name of database mapping graph id's to graph instances. Do not release
* this object.
*/
- (NSString *) nameOfGraphIdToGraphDatabase;
/*!
* @method nameOfNodeIdToProviderManagerDatabase
* @result name of database mapping node id -> provider manager. Do not release
* this object.
*/
- (NSString *) nameOfNodeIdToProviderManagerDatabase;
/*!
* @method openDatabaseWithName
* @abstract tries to open the specified database
* @throws ECIncompleteInitializationException if base data dir is not given or
* if the name of the user database is not given in the info.plist file.
* @throws ECIllegalStateException if the database file does not exists.
*/
- (BDBDatabase *) openDatabaseWithName: (NSString *) databaseName
withConfig: (BDBDatabaseConfig *) aConfig;
/*!
* @method serviceManager
* @abstract used to access the service manager
* @result service manager
*/
- (id ) serviceManager;
/*!
* @method setupDatabases
* @abstract Internal method to create all databases. baseDataDir must be set
* @link baseDataDir
* @result self
*/
- setupDatabases;
/*!
* @method sessionManager
* @result reference to the session manager
*/
- (id ) sessionManager;
/*!
* @method shutdown
* @abstract kills all sessions except for the calling one and closes
* all databases
* @discussion Calls {@link #unmount} to close all databases and to release all
* data accessing objects.
* After this call the server does not allow any I/O operations
* @result self
*/
- shutdown;
/*!
* @method systemDictionary
* @result return the global, system-wide dictionary.
* @discussion this dictionary is used to manage global settings and the like.
*/
- (FTSystemDictionary *) systemDictionary;
/*!
* @method transactionManager
* @result global transaction manager
*/
- (id ) transactionManager;
/*!
* @method unmount
* @abstract closes all databases releases all data accessing objects.
* @result self
*/
- unmount;
@end
/*!
* @typedef ft_server_action_hint_t
* @abstract Defines values which give a hint about the next server action
* to be performed.
* @discussion This typedef is used in conjunction with server
* notifications via {@link FTServerNotification}.
* @field FT_SERVER_ACTION_UNKNOWN may not occur within notifications.
* @field FT_SERVER_ACTION_SHUTDOWN server will shutdown after this notification
*/
typedef enum {
FT_SERVER_ACTION_UNKNOWN = 0,
FT_SERVER_ACTION_SHUTDOWN
} ft_server_action_hint_t;
/*!
* @class FTServerNotification
* @abstract instances of this class are sent as notifications in order for the
* server to notify listeners about actions
*/
@interface FTServerNotification : FTObject {
@private
ft_server_action_hint_t serverActionHint;
}
/*!
* @method sendShutdownNotificationTo
* @dicussion Send a shutdown notification to the given center.
*/
+ (void) sendShutdownNotificationTo: (NSNotificationCenter *) center;
/*!
* @method notificationName
* @result name of notification
*/
+ (NSString *) notificationName;
/*!
* @method initWithServerActionHint
* @abstract initializes the receiver.
* @param actionHint server's action to be performed next and for which
* this notification is being sent.
* @result self
*/
- initWithServerActionHint: (ft_server_action_hint_t) actionHint;
/*!
* @method serverActionHint
* @result return information about the server's next action
*/
- (ft_server_action_hint_t) serverActionHint;
@end
#endif