/*!
@header FTGraphImpl
@abstract Module of FT
@availability OS X, GNUstep
@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
23.02.05 ola initial version
27.03.06 ola added a database used to manage general information
belonging to a graph, like e.g. the ID's of all
objects of a graph.
06.06.06 ola keyToGraphInfo now is an instance of FTPersistentSet
23.08.06 ola license changed
-------------------------------------------------------------------------
*/
#if !defined(__FTGraphImpl_H)
#define __FTGraphImpl_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
@class FTServerImpl;
@class FTGraphManagerImpl;
@class FTNodeImpl;
/*!
* @class FTGraphImpl
* @abstract Instances of this class represent graphs
*/
@interface FTGraphImpl : FTObject {
@private
FTServerImpl *server;
FTGraphManagerImpl *graphManager;
id graphId;
FTDefaultObjectToIdMapper *objectToIdMapper;
/**
*/
NSLock *globalLock;
/**
* Very simply cache mechanism at present
*/
ECCache *idToNodeCache;
/**
* Maps id's to record numbers
*/
BDBDatabase *idToRecnoDB;
/**
* Maps record number --> node data
*/
BDBDatabase *nodeDB;
/**
* Contains "general" information related to this graph
*/
id keyToGraphInfo;
/**
* indicates wether all databases are mounted or not
*/
BOOL databasesMounted;
/**
* The graph database name refers to the name of a directory
* where this graph instances store the data
* This item must be persistent!
*/
NSString *graphDatabaseName;
/**
* This field refers to the directory where the graph stores
* all its data. It is based on the server's base directory and the
* name of the graph database {@link #graphDatabaseName}
* It is transient and has to be reconstructed for each allocation of
* this class.
*/
NSString *graphDatabaseDirectory;
}
/*!
* @method init
* @abstract May not be called directly.
* @result self
*/
- init;
/*!
* @method initForServer
* @abstract initializes the receiver
* @param theServer reference to the underlying server
* @param anId id of this graph
* @result self
*/
- initForServer: (FTServerImpl *) theServer
graphManager: (FTGraphManagerImpl *) theGraphManager withId: (id ) anId;
/*!
* @method initWithCoder
* @abstract Initializes a newly allocated instance from data in decoder
*/
- initWithCoder: (NSCoder *) coder;
/*!
* @method initAfterDecodeForServer
* @abstract this method may directly be called after deserialization of
* this object
* @param theServer reference to underlying server
* @param theGraphManager graph manager to use
* @result self
*/
- initAfterDecodeForServer: (FTServerImpl *) theServer
graphManager: (FTGraphManagerImpl *) theGraphManager;
- (void) dealloc;
/*!
* @method databasesMounted
* @result YES if all databases are mounted.
*/
- (BOOL) databasesMounted;
/*!
* @method createDatabaseGraphDirectory
* @abstract Creates the (sub) directory for a new graph
* @result name of created directory excluding the base directory path
*/
- (NSString *) createDatabaseGraphDirectory;
/*!
* @method createNodeWithId
* @abstract create a node of a certain node id
*/
- (id ) createNodeWithId: (id ) aNodeId;
/*!
* @emthod graphDatabaseDirectory
* @result directory where the graph stores its databases
*/
- (NSString *) graphDatabaseDirectory;
/*!
* @method encodeWithCoder
* @abstract Encodes the receiver using encoder
*/
- (void) encodeWithCoder: (NSCoder *) coder;
/*!
* @method close
* @abstract Call this method if you do not need this instance any more
* @discussion After this method release may also be called
*/
- (void) close;
/*!
* @method graphId
* @result the identifier of this graph
*/
- (id ) graphId;
/*!
* @method idToRecnoDBConfig
* @result database configuration for the database "idToNode"
*/
- (BDBDatabaseConfig *) idToRecnoDBConfig;
/*!
* @method insertNodeToDatabase
* @discussion the caller has to make sure that the node is not already to
* be found in the database.
* @abstract inserts a node to the database
* @param node to insert
* @result self
*/
- insertNodeToDatabase: (FTNodeImpl *) node;
/*!
* @method internalStateChanged
* @abstract Updates the persistent state of the given node
* @param nodeToUpdate node to update in the database
* @result self
*/
- internalStateChanged: (FTNodeImpl *) nodeToUpdate;
/*!
* @method mountDatabases
* @abstract Opens all databases
* @result self
* @throws ECIllegalStateException if databases are already mounted
*/
- mountDatabases;
/*!
* @method nameOfkeyToGraphInfoDatabase
* @result name of the database used to store generic
* information related to a graph, such as the identifiers of
* all nodes
*/
- (NSString *) nameOfkeyToGraphInfoDatabase;
/*!
* @method nameOfNodesDatabase
* @abstract Name of database mapping a record number to a node's data
* @resulf name of node database
*/
- (NSString *) nameOfNodesDatabase;
/*!
* @method nameOfIdToRecnoDatabase
* @discussion {@link #graphDatabaseDirectory} must be set before
* @result return the fully qualified name of the database idToNode
*/
- (NSString *) nameOfIdToRecnoDatabase;
/*!
* @method nameOfObjectToIdMapperDatabase
* @discussion {@link #graphDatabaseDirectory} must be set before
* @result return the fully qualified name of the database objectToIdMapper
*/
- (NSString *) nameOfObjectToIdMapperDatabase;
/*!
* @method nodeAtRecordNumber
* @abstract fetch the node at the specified record number
* @param recno record number related to database nodeDB
* @result fetched node or nil if not existent
*/
- (FTNodeImpl *) nodeAtRecordNumber: (BDBDatabaseRecordNumber *) recno;
/*!
* @method nodeDBConfig
* @result database configuration for the node database
*/
- (BDBDatabaseConfig *) nodeDBConfig;
/*!
* @method nodeIterator
* @result iterator over all nodes of the graph
*/
- (id ) nodeIterator;
/*!
* @method nodeWithId
* @result return the node corresponding to the given identifier
*/
- (id ) nodeWithId: (id ) aNodeId;
/*!
* @method performAction
* @abstract Called by the transaction controll in order to run the
* transaction
* @result return information about the success of this operation
*/
- (BOOL) performAction;
/*!
* @method objectToIdMapper
* @result mapper for this graph
*/
- (id ) objectToIdMapper;
/*!
* @method recordNumberOfNode
* @result returns the record number of a given node.
* @throws FTInternalDatamanagementException
*/
- recordNumberOfNode: (FTNodeImpl *) node;
/*!
* @method recordNumberOfNodeId
* @result returns the record number of a given node id.
* @throws FTInternalDatamanagementException
*/
- recordNumberOfNodeId: (id ) nodeId;
/*!
* @method remove
* @result YES if successful, NO otherwise
* @abstract Removes the complete graph. Does not check wether the
* graph (or one of its elements) is still in use. (TODO)
*/
- (BOOL) remove;
/*!
* @method removeNode
* @abstract removes the specified node from the graph
* @discussion A node can only be removed if it contains no incoming and no
* outgoing links
* @param nodeToRemove node to remove
* @result self
* @throws ECIllegalStateException if the node contains incoming/outgoing
* references
*/
- removeNode: (id ) nodeToRemove;
/*!
* @method removeNodeFromIdToRecnoDB
* @abstract removed the specified node from the database idToRecnoDB and
* returns the record number (value) of the deleted entry.
* @param node to remove. The node will only be removed from the database, not
* from memory.
* @result the value (record number) of the entry being deleted ir nil
* if entry could not be found
* @throws FTInternalDatamanagementException
*/
- removeNodeFromIdToRecnoDB: (FTNodeImpl *) node;
/*!
* @method removeNodeWithRecordNumber
* @param recordNumber specifies the entry to delete. the record number can
* be determined for a given node via method recordNumberOfNode.
* @result YES if the node has successfully been removed
* @throws ECIllegalArgumentException
* @throws FTInternalDatamanagementException
*/
- (BOOL) removeNodeWithRecordNumber: (id) recordNumber;
/*!
* @method removeNodeFromDatabase
* @abstract removes the specified node from the database
* @discussion Removes the node from both BDB databases: idToRecnoDB and
* nodeDB
* @param node to remove
* @result self
* @throws FTInternalDatamanagementException
* @throws ECIllegalArgumentException
*/
- removeNodeFromDatabase: (FTNodeImpl *) node;
/*!
* @method serviceWithId
* @abstract Fetch a service for the specified id
* @param aServiceId id of the service
* @result the specified service or nil if not existent
*/
- (id ) serviceWithId: (NSString *) aServiceId;
/*!
* @method serviceWithId
* @abstract Fetch a service for the specified id and node
* @param aServiceId id of the service
* @param aNode particular node for which the service has to been offered
* @result the specified service or nil if not existent
*/
- (id ) serviceWithId: (NSString *) aServiceId
forNode: (FTNodeImpl *) aNode;
/*!
* @method setupDatabases
* @abstract Initializes the graph database
* @discussion Has to be called when creating a graph. It creates the
* underlying directory and files
* @result self
* @throws ECIllegalStateException if the database has already been created
* before
* @throws ECAlreadyExistsException if the directory, which has to be created
* for the new graph database, already exists.
* @throws FTDatabaseCreationFailedException if the directory for the graph
* database cannot be created.
*/
- setupDatabases;
/*!
* @method updateNode
* @abstract removes the existing node data from the database(s) and adds the
* current data of the given node to the database(s)
* @param node node to update
* @result self
*/
- updateNode: (FTNodeImpl *) node;
/*!
* @method unmountDatabases
* @abstract closes all databases used for this graph
* @result self
*/
- unmountDatabases;
@end
#endif