de.bsvrz.puk.config.configFile.fileaccess
Class ConfigAreaFile

java.lang.Object
  extended by de.bsvrz.puk.config.configFile.fileaccess.ConfigAreaFile
All Implemented Interfaces:
ConfigurationAreaFile

public class ConfigAreaFile
extends Object
implements ConfigurationAreaFile

Diese Klasse stellt eine Konfigurationsbereichsdatei dar und speichert alle Objekte des Bereichs mit Historie.

Author:
Achim Wullenkord (AW), Kappich Systemberatung

Nested Class Summary
private  class ConfigAreaFile.FileIterator
          Diese Klasse stellt einen Iterator zur Verfügung, der alle Objekte eines Konfigurationsbereichs zur Verfügung stellt.
static class ConfigAreaFile.OldBlockInformations
          Diese Klasse speichert die Dateiposition eines Blocks, der Konfigurationsobjekte enthält, die ungültig sind und durch eine Reorganisation verschoben wurden und sich nicht mehr in der Mischobjektmenge befinden.
(package private) static class ConfigAreaFile.OldObject
          Ein Objekt, das als "ungültig" markiert ist enthält den HashCode der Pid und die Id des Objekts.
private  class ConfigAreaFile.OldObjectIdReference
          Diese Klasse stellt ein Objekt dar, das ungültig ist und eine Methode um dieses Objekte anzufordern.
private static class ConfigAreaFile.OldObjectTypeIdInfo
          Diese Klasse speichert alle Inforamtionen, die benötigt werden um ein Objekt, das sich in der Mischmenge befindet aber nicht komplett in den Speicher geladen wurde, eventuell nachzuladen falls es gebraucht wird.
private static class ConfigAreaFile.SortObject
          Diese Klasse wird mehrfach mit unterschiedlichen Aufgaben benutzt.
private static class ConfigAreaFile.SortObjectPid
           
 
Field Summary
private  short _activeVersion
          aktive Version, diese wird durch einen Neustart der Konfiguration gesetzt (durch den Konstruktor)
private  short _activeVersionFile
          aktive Version, die aus der Datei gelesen wurde.
private  Map<Long,SystemObjectInformationInterface> _actualObjects
          Speichert alle (dynamisch und Konf.) aktuellen Objekte, als Schlüssel dient die Id.
private  Map<Long,List<SystemObjectInformationInterface>> _actualObjectsTypeId
          Speichert zu allen TypeId´s die aktuellen Objekte.
private  FileLock _areaFileLock
          Mit diesem Objekt wird ein mehrfacher Zugriff auf diese Datei verhindert.
private  File _configAreaFile
          Wo befindet sich die Datei
private  ConfigurationObjectInfo _configAreaObject
          Stellt das Objekt dar, das den Konfigurationsbereich repräsentiert.
private  String _configurationAreaPid
          Pid des Konfigurationsbereichs
private  Map<Short,Long> _configurationAuthorityVersionActivationTime
          synchronisierte Map, die den Aktivierungszeitpunkt jeder Version speichert.
private  long _configurationDataChanged
          letzter Zeitpunkt, an dem ein konfigurierender Datensatz geändert wurde.
private  long _configurationObjectChanged
          letzter Zeitpunkt, an dem ein Konfigurationsobjekt geändert wurde.
private static Debug _debug
          DebugLogger für Debug-Ausgaben
private  long _dynamicObjectChanged
          letzter Zeitpunkt, an dem ein dynamisches Objekt geändert wurde.
private  ConfigFileManager _fileManager
          Alle Änderungen an einem dynamischen Objekt oder an einem Konfigurationsobjekt, die den Zustand von "gültig" auf "ungültig" setzen oder ein Objekt hinzufügen müssen an dieses Objekt gemeldet werden
private  long[] _globalActivationTimes
          Array mit den globalen Aktivierungszeiten der Versionen dieses Bereichs.
private  long _greatestId
          Speichert die größte Id, die im Konfigurationsbereich vergeben wurde.
private  long _headerEnd
          Speichert, wo der Header endet.
private  long[] _localActivationTimes
          Array mit den lokalen Aktivierungszeiten der Versionen dieses Bereichs.
private  Map<Short,Long> _localVersionActivationTime
          Synchronisierte Map, die zu jeder Version den lokalen Aktivierungszeitpunkt speichert.
private  Set<SystemObjectInformationInterface> _modifiedObjects
          In dieser Menge werden alle dynamischen Objekte und Konfigurationsobjekte gespeichert, die modifiziert wurden und die aus diesem Grund noch in der Datei zu speichern sind.
private  Map<Long,SystemObjectInformationInterface> _newObjects
          Speichert alle Objekte, die in Zukunft aktuell werden, als Schlüssel dient die Id.
private  short _nextActiveVersion
          Speichert die Version, die als nächstes gültig wird.
private  short _nextActiveVersionFile
          nächste aktive Version, die aus der Datei eingelesen wurde.
private  short _nextInvalidBlockVersion
          Speichert die nächste ungültige Version.
private  short _objectVersion
          Mit welcher Version wurden die Objekte geschrieben.
private  Map<Short,ConfigAreaFile.OldBlockInformations> _oldObjectBlocks
          Speichert zu jedem Block, in dem ungültige Objekte gespeichert sind, ein Objekt ab, das die Position des Blocks (relativ zum Headerende) in der Datei enthält und einen Zeitstempel (wann wurde diese Version gültig), der sich auf den Block bezieht.
private  Map<Long,ConfigAreaFile.OldObjectIdReference> _oldObjectsId
          Speichert alle ungültig markierte Objekte, die sich in der Mischmenge befinden.
private  Map<Integer,Set<Long>> _oldObjectsPid
          Speichert zu einer Pid (Key = HashCode Integer), alle Dateipositionen der alten Objekte, die sich in der Mischmenge befinden.
private  Map<Long,List<ConfigAreaFile.OldObjectTypeIdInfo>> _oldObjectsTypeId
          Speichert zu allen TypeId´s die alten Objekte.
private  Object _restructureLock
          Wird angefordert, wenn die Reorganisation der Datei statt findet.
private  int _serializerVersion
          Mit dieser Version werden alle Daten in der Daten serialisiert.
private  long _startIdIndex
          relative Position des Index, der die Id´s verwaltet.
private  long _startMixedSet
          Gibt an, wo (relativ zum Header) die Mischobjektmenge beginnt.
private  long _startOldDynamicObjects
          relative Position des Blocks, der alle ungültigen dynamischen Objekte enthält, die nach einer Reorganisation in diesem Block geschrieben wurden.
private  long _startPidHashCodeIndex
          relative Position des Index, der die hashCodes der Pid´s verwaltet verwaltet.
private  short ACTUAL_OBJECT_VERSION
          Legt die aktuelle Version fest, mit der Objekte codiert werden
 
Constructor Summary
ConfigAreaFile(File configAreaFile, short activeVersion, ConfigFileManager configFileManager, List<VersionInfo> localActivatedVersionTimes)
          Dieser Konstruktor wird benutzt, wenn eine Datei für einen Konfigurationsbereich bereits existiert.
ConfigAreaFile(File configAreaFile, String pid, short activeVersion, int serializerVersion, ConfigFileManager configFileManager)
          Erzeugt eine Datei, die einen Konfigurationsbereich abbildet.
 
Method Summary
private  List<SystemObjectInformationInterface> binarySearch(long value, boolean searchId)
          Diese Methode sucht zu einem Value alle Objekte, die als ungültig markiert sind.
 void close()
          Diese Methode wird aufgerufen, wenn das System heruntergefahren soll.
 ConfigurationObjectInfo createConfigurationObject(long objectID, long typeID, String pid, String name)
          Diese Methode erzeugt ein Konfigurationsobjekt.
 DynamicObjectInfo createDynamicObject(long objectID, long typeID, String pid, short simulationVariant, String name, DynamicObjectType.PersistenceMode persistenceMode)
          Diese Methode erzeugt ein dynamisches Objekt, das sofort gültig ist.
(package private)  void declareObjectAsAGap(long filePosition)
           
private  void declareObjectAsAGap(long filePosition, RandomAccessFile file)
          Setzt die Id eines Objekts auf 0 und erklärt es somit als Lücke.
(package private)  void dontSaveObject(SystemObjectInformationInterface object)
          Diese Methode entfernt ein Objekt aus Menge zu speichernden Objekte
 void flush()
          Diese Methode wird aufgerufen, wenn alle modifizierten Objekte des Konfigurationsbereichs persistent gespeichert werden sollen.
private  long getAbsoluteFilePositionForInvalidObjects(long relativeFilePosition)
          Diese Methode berechnet die absolute Position eines Objekts in der Konfigurationsbereichsdatei.
private  long getActivationTime(int version, long[] activationTimes)
          Bestimmt den Aktivierungszeitpunkt einer vorgegebenen Version.
private  long[] getActivationTimeArray(Map<Short,Long> activationTimeMap)
          Erzeugt ein Array mit den Aktivierungszeiten der Versionen dieses Bereichs.
(package private)  short getActiveVersion()
           
 short getActiveVersion(long startTime, ConfigurationAreaTime kindOfTime)
          Gibt zu einem Zeitpunkt die Version zurück, die aktiv war.
 SystemObjectInformationInterface[] getActualObjects(long typeId)
          Gibt alle aktuellen Objekte zurück, die als TypeId die übergebene TypeId besitzen.
 String getConfigAreaPid()
          Gibt die Pid des Konfigurationsbereichs zurück.
 ConfigurationObjectInfo getConfigurationAreaInfo()
          Methode, die das Objekt, das den Konfigurationsbereich darstellt, zurück gibt.
 SystemObjectInformationInterface[] getCurrentObjects()
          Diese Methode gibt alle dynamischen Objekte und Konfigurationsobjekte zurück, die in der aktuellen Version aktuell sind.
 long getGreatestId()
          Diese Methode gibt die größte vergebene laufende Nummer einer Id des Konfigurationsbereichs zurück.
 Collection getMixedObjectSetObjects()
          Lädt alle "aktuellen" und in "Zukunft aktuellen" Objekte.
 SystemObjectInformationInterface[] getNewObjects()
          Diese Methode gibt alle Konfigurationsobjekte zurück, die in einer zukünftigen Version aktuell werden.
 short getNextActiveVersion()
          Liefert die Version, ab der neu erstellte Konfigurationsobjekte gültig werden.
 SystemObjectInformationInterface[] getObjects(long startTime, long endTime, ConfigurationAreaTime kindOfTime, TimeSpecificationType timeSpecificationType, Collection<Long> typeIds)
          Diese Methode gibt alle dynamischen Objekte und Konfigurationsobjekte zurück, die innerhalb des angegebenen Zeitbereichs gültig waren und deren TypeId gleich einer der übergebenen TypeId´s ist.
 SystemObjectInformationInterface[] getObjects(String pid, long startTime, long endTime, ConfigurationAreaTime kindOfTime)
          Diese Methode gibt Objekte zurück, die in dem angegebenen Zeibereich gültig waren.
 SystemObjectInformationInterface getOldObject(long id)
          Diese Methode gibt ein Objekt zurück, das als ungültig markiert wurde.
private  long getRunningNumber(long wholeNumber)
          Maskiert die ersten 40 Bits einer Id
 int getSerializerVersion()
          Alle Daten, die als Byte-Array gespeichert werden müssen, werden mit einem Serializer Serializer erstellt.
 boolean initialVersionRestructure()
          Diese Methode wird aufgerufen, wenn der Konfigurationsverantwortliche eine neue Version aktiviert.
private  boolean isValueAtTheMiddle(long start, long middle, long end)
          Diese Methode prüft ob folgende Gleichung wahr ist:

start <= middle <= end

 Iterator<SystemObjectInformationInterface> iterator()
          Stellt alle dynamischen Objekte und Konfigurationsobjekte zur Verfügung.
(package private)  SystemObjectInformation loadObjectFromFile(long filePosition)
          Lädt ein Objekt aus einer Datei
private  SystemObjectInformation loadObjectFromFile(long filePosition, ConfigAreaFile.FileIterator fileIterator)
          Lädt ein Objekt aus einer Datei und setzt im Objekt fileIterator die Position, an der das nächste Objekt gefunden werden kann (relative Position bezogen auf den Header).
(package private)  void objectModified(SystemObjectInformationInterface modifiedObject)
          Diese Methode wird von einem Objekt aufgerufen, wenn Informationen des Objekts geändert wurden.
(package private)  boolean objectValid(Object objectInfo, long queryIntervalStart, long queryIntervalEnd, ConfigurationAreaTime kindOfTime, TimeSpecificationType timeSpecificationType)
          Diese Methode prüft, ob ein Objekte im angegebenen Zeitraum gültig war/ist.
(package private)  void printIdIndex()
          Gibt die Indizes am Bildschirm aus, diese Methode ist nur für Debug-Zwecke geeignet.
private  void putActualObject(SystemObjectInformationInterface actualObjekt)
          Fügt das Objekt zu allen Datenstrukturen hinzu, die für den schnellen Zugriff(mit Id) auf aktuelle Objekte benötigt werden
private  void putActualObjectTypeId(SystemObjectInformationInterface actualObject)
          Speichert ein Objekt in der Map, die alle aktuellen Objekte nach deren TypeId verwaltet
private  void putNewObject(SystemObjectInformationInterface newObjekt)
          Fügt das Objekt zu allen Datenstrukturen hinzu, die für den schnellen Zugriff auf "in Zukunft gültige" Objekte benötigt werden
private  void putOldObject(ConfigAreaFile.OldObject oldObject)
          Fügt ein als "ungültig" markiertes Objekt in alle interenen Datenstrukturen hinzu, die für einen schnellen Zugriff auf ungültige Objekte benötigt werden.
private  void putOldObjectTypeId(long typeId, long firstValid, long firstInvalid, boolean configurationObject, ConfigAreaFile.OldObjectIdReference oldObjectIdReference)
          Speichert alle benötigten Ladeinforamtionen zu einem Objekt in der Map, die alle alten Objekte verwaltet.
private  void putUnknownObject(SystemObjectInformationInterface unknownObject)
          Legt ein dynamisches Objekt oder ein Konfigurationsobjekt in die entsprechende Datenstruktur für aktuelle oder in Zukunft gültige Objekte ab.
private  SystemObjectInformation readObjectFromFile(long filePosition, int objectsize, long id, long typeId, long firstInvalid, long firstValid, byte objecttype, RandomAccessFile file)
          Lädt ein dynamischen Objekt oder ein Konfigurationsobjekt aus der Datei des Konfigurationsbereichs.
(package private)  void removeDynamicSimulationObject(DynamicObjectInformation dynamicObjectInfo)
          Entfernt ein dynamisches Objekt aus alle Datenstrukturen(auch ConfigFileManager).
(package private)  void removeNewObject(ConfigurationObjectInfo newObject)
          Diese Methode entfernt ein Objekt, das in zukünftigen Versionen gültig werden soll aus allen Datenstrukturen (auch dem ConfigFileManager), die den schnellen Zugriff auf diese Art von Objekten ermöglichen.
 boolean restructure()
          Diese Methode reorganisiert eine Konfigurationsbereichsdatei.
(package private)  void setDynamicObjectInvalid(DynamicObjectInformation invalidObject)
          Diese Methode wird aufgerufen, wenn ein dynamisches Objekt auf "ungültig" gesetzt wird.
 void setNextActiveVersion(short nextActiveVersion)
          Legt die Version fest mit der Konfigurationsobjekte, die mit ConfigurationAreaFile.createConfigurationObject(long, long, java.lang.String, java.lang.String) erzeugt werden, gültig werden.
private  byte[] unzip(byte[] zippedData)
           
private  long writeConfigurationObjectToFile(ConfigurationObjectInformation configurationObject, RandomAccessFile file, boolean declareGap, boolean setNewFilePosition)
          Speichert ein Objekt ans Ende der übergebenen Datei.
(package private)  void writeDynamicObject(DynamicObjectInformation object)
          Speicher ein dynamisches Objekt in die Datei des Konfigurationsbereichs.
private  long writeDynamicObjectToFile(DynamicObjectInformation dynamicObject, RandomAccessFile file, boolean declareGap, boolean setNewFilePosition)
          Speichert ein Objekt ans Ende der übergebenen Datei.
private  void writeHeader(RandomAccessFile file)
          Schreibt einen Header in die übergebene Datei.
private  void writeSystemObjectWithoutIdAndTypeId(SystemObjectInformationInterface object, Serializer serializer)
          Speichert die Pid, den Namen des SystemObjects und alle konfigurierenden Datensätze .
private  byte[] zip(byte[] data)
          Packt ein Byte-Array mit dem Packer "ZIP" und gibt die Daten gepackt zurück
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

_debug

private static final Debug _debug
DebugLogger für Debug-Ausgaben


_configAreaFile

private final File _configAreaFile
Wo befindet sich die Datei


_activeVersion

private final short _activeVersion
aktive Version, diese wird durch einen Neustart der Konfiguration gesetzt (durch den Konstruktor)


_activeVersionFile

private short _activeVersionFile
aktive Version, die aus der Datei gelesen wurde.


_nextActiveVersion

private short _nextActiveVersion
Speichert die Version, die als nächstes gültig wird. Die Variable wird mit einer Setter gesetzt.


_nextActiveVersionFile

private short _nextActiveVersionFile
nächste aktive Version, die aus der Datei eingelesen wurde.


_serializerVersion

private int _serializerVersion
Mit dieser Version werden alle Daten in der Daten serialisiert.


_headerEnd

private long _headerEnd
Speichert, wo der Header endet. Diese Information wird gebraucht, da alle Angaben zur Position in der Datei relativ zum Ende des Header sind. Addiert man die beiden Werte, so erhält man die abslute Position in der Datei.

Die gespeicherte Position zeigt auf den ersten Wert, der nach dem Header gespeichert ist.


_oldObjectBlocks

private final Map<Short,ConfigAreaFile.OldBlockInformations> _oldObjectBlocks
Speichert zu jedem Block, in dem ungültige Objekte gespeichert sind, ein Objekt ab, das die Position des Blocks (relativ zum Headerende) in der Datei enthält und einen Zeitstempel (wann wurde diese Version gültig), der sich auf den Block bezieht. Als Key dient die Versionsnummer. Sind keine Elemente vorhanden, so wurde noch kein Block angelegt. Wenn die Datei neu erzeugt wird, ist dies der Fall. Der erste Block entsteht nach der ersten Reorganisation, nach dem die aktuelle Version erhöht wurde.

WARNUNG: Beim Zugriff mit .get() muss der Key auf short gecastet werden (.get((short) XXX)) !!!

Diese Informationen werden für die Reorganisation gebraucht, bei einem Neustart wird aus diesen Informationen die Map _configurationAuthorityVersionActivationTime rekonstruiert.

Es sind zwei Maps nötig, da die _oldObjectBlocks-Map speichert wie weit die Reorganisation gekommen ist und die Map _configurationAuthorityVersionActivationTime wird im Konstruktor gesetzt und wird dann die nächste gültige Vesion enthalten und ist dadurch um mindestens eine Version größer als jede Version die _oldObjectBlocks speichert.

Findet kein Versionswechsel statt, sind die Version/Zeitstempel Paare in _oldObjectBlocks und _configurationAuthorityVersionActivationTime identisch.


_configurationAuthorityVersionActivationTime

private final Map<Short,Long> _configurationAuthorityVersionActivationTime
synchronisierte Map, die den Aktivierungszeitpunkt jeder Version speichert. Als Key dient die Version, als value wird der Zeitpunkt zurückgegbeen, an dem das Konfigurationsverantwortliche die Version aktiviert hat. Siehe auch Kommentar _oldObjectBlocks.

WARNUNG: Beim Zugriff mit .get() muss der Key auf short gecastet werden (.get((short) XXX)) !!!


_globalActivationTimes

private long[] _globalActivationTimes
Array mit den globalen Aktivierungszeiten der Versionen dieses Bereichs. Am Index 0 ist die Zeit 0 eingetragen. Die Aktivierungszeit der Version n ist am Index n eingetragen. Bei nicht aktivierten Zwischenversionen wird die Zeit der nächsten Aktivierung eingetragen. Der größte verwendete Index entspricht der größten aktivierten Version.


_nextInvalidBlockVersion

private short _nextInvalidBlockVersion
Speichert die nächste ungültige Version. Es ist die größte Version aus _oldObjectBlocks plus 1. Ist noch kein Block vorhanden, so ist die "nächste" ungültige Version, Version 2 (Version 1 ist die erste mögliche gültige Version)


_startOldDynamicObjects

private long _startOldDynamicObjects
relative Position des Blocks, der alle ungültigen dynamischen Objekte enthält, die nach einer Reorganisation in diesem Block geschrieben wurden.


_startIdIndex

private long _startIdIndex
relative Position des Index, der die Id´s verwaltet.


_startPidHashCodeIndex

private long _startPidHashCodeIndex
relative Position des Index, der die hashCodes der Pid´s verwaltet verwaltet. (-1 bedeutet, dass dieser Wert nicht aus dem Header ausgelesen werden konnte oder beim erzeugen des Headers nicht bekannt war (Datei erzeugen))


_startMixedSet

private long _startMixedSet
Gibt an, wo (relativ zum Header) die Mischobjektmenge beginnt. Dies steht entweder im Header, oder bei einener neuen Datei beginnt dieser Bereich genau hinter dem Header.


_objectVersion

private short _objectVersion
Mit welcher Version wurden die Objekte geschrieben.


ACTUAL_OBJECT_VERSION

private final short ACTUAL_OBJECT_VERSION
Legt die aktuelle Version fest, mit der Objekte codiert werden

See Also:
Constant Field Values

_configurationAreaPid

private String _configurationAreaPid
Pid des Konfigurationsbereichs


_dynamicObjectChanged

private long _dynamicObjectChanged
letzter Zeitpunkt, an dem ein dynamisches Objekt geändert wurde. Der Wert -1 zeigt an, dass dieser Wert noch unbekannt ist.


_configurationObjectChanged

private long _configurationObjectChanged
letzter Zeitpunkt, an dem ein Konfigurationsobjekt geändert wurde. Der Wert -1 zeigt an, dass dieser Wert noch unbekannt ist.


_configurationDataChanged

private long _configurationDataChanged
letzter Zeitpunkt, an dem ein konfigurierender Datensatz geändert wurde. Der Wert -1 zeigt an, dass dieser Wert noch unbekannt ist.


_modifiedObjects

private final Set<SystemObjectInformationInterface> _modifiedObjects
In dieser Menge werden alle dynamischen Objekte und Konfigurationsobjekte gespeichert, die modifiziert wurden und die aus diesem Grund noch in der Datei zu speichern sind. Die Objekte tragen sich selbständig mit objectModified(de.bsvrz.puk.config.configFile.fileaccess.SystemObjectInformationInterface) in die Liste ein.


_actualObjects

private final Map<Long,SystemObjectInformationInterface> _actualObjects
Speichert alle (dynamisch und Konf.) aktuellen Objekte, als Schlüssel dient die Id.

WARNUNG: Beim Zugriff mit .get() muss der Key auf long gecastet werden (.get((long) XXX)) !!!


_newObjects

private final Map<Long,SystemObjectInformationInterface> _newObjects
Speichert alle Objekte, die in Zukunft aktuell werden, als Schlüssel dient die Id.

WARNUNG: Beim Zugriff mit .get() muss der Key auf long gecastet werden (.get((long) XXX)) !!!


_oldObjectsId

private final Map<Long,ConfigAreaFile.OldObjectIdReference> _oldObjectsId
Speichert alle ungültig markierte Objekte, die sich in der Mischmenge befinden. Schlüssel = Id, Value = Objekte mit dem das ungültige Objekt angefordert werden kann.

WARNUNG: Beim Zugriff mit .get() muss der Key auf long gecastet werden (.get((long) XXX)) !!!


_oldObjectsPid

private final Map<Integer,Set<Long>> _oldObjectsPid
Speichert zu einer Pid (Key = HashCode Integer), alle Dateipositionen der alten Objekte, die sich in der Mischmenge befinden. Bei einer Reorganisation werden die Listen der Map um die Objekte bereinigt, die in einen nGa oder in den dyn nGa gespeichert werden.

WARNUNG: Beim Zugriff mit .get() muss der Key auf integer gecastet werden (.get((integer) XXX)) !!!


_fileManager

private final ConfigFileManager _fileManager
Alle Änderungen an einem dynamischen Objekt oder an einem Konfigurationsobjekt, die den Zustand von "gültig" auf "ungültig" setzen oder ein Objekt hinzufügen müssen an dieses Objekt gemeldet werden


_restructureLock

private final Object _restructureLock
Wird angefordert, wenn die Reorganisation der Datei statt findet. Die Sperre wird ebenfalls angefordert, wenn alte Objekte angefordert werden oder ein dynamisches Objekt als ungültig deklariert wird, die sich im Speicher befinden. Dieser Moment ist kritisch, da zu diesem Zeitpunkt eine Reorganisation stattfinden kann und sich damit die Dateipositionen ändern und die Objekte sogar komplett aus dem Speicher gelöscht werden. Neue alte Objekte können aber ohne Probleme abgelegt werden, da sich die Reorgansation merkt, welche Objekte modifiziert wurden.


_configAreaObject

private ConfigurationObjectInfo _configAreaObject
Stellt das Objekt dar, das den Konfigurationsbereich repräsentiert. Das Objekt wird entweder beim laden der Mischmenge über die Pid des Konfigurationsbereichs gefunden oder es wird ein neuer Bereich angelegt. Dann wird das Objekt erst mit createConfigurationObject(long, long, java.lang.String, java.lang.String) erzeugt, auch in diesem Fall wird das Objekt über die Pid identifiziert.


_localVersionActivationTime

private final Map<Short,Long> _localVersionActivationTime
Synchronisierte Map, die zu jeder Version den lokalen Aktivierungszeitpunkt speichert. Als Key dient die Versionsnummer, als value wird der Aktivierungszeitpunkt zurückgegeben.

WARNUNG: Beim Zugriff mit .get() muss der Key auf short gecastet werden (.get((short) XXX)) !!!


_localActivationTimes

private long[] _localActivationTimes
Array mit den lokalen Aktivierungszeiten der Versionen dieses Bereichs. Am Index 0 ist die Zeit 0 eingetragen. Die Aktivierungszeit der Version n ist am Index n eingetragen. Bei nicht aktivierten Zwischenversionen wird die Zeit der nächsten Aktivierung eingetragen. Der größte verwendete Index entspricht der größten aktivierten Version.


_greatestId

private long _greatestId
Speichert die größte Id, die im Konfigurationsbereich vergeben wurde. Der Wert wird beim laden des Konfigurationsbereichs erzeugt, in dem beim laden der Mischmenge die Id der Objekte geprüft wird, zusätzlich muss der letzte Wert des Index (Id) betrachtet werden. Der Index enthält alle Id´s aller Objekte, die sich in den nGa Bereichen bzw. dem dynamischen nGa Bereich befinden.

Der Wert 0 bedeutet, dass noch kein Konfigurationsobjekt oder dynamisches Objekt im Konfigurationsbereich abgelegt wurde.


_actualObjectsTypeId

private final Map<Long,List<SystemObjectInformationInterface>> _actualObjectsTypeId
Speichert zu allen TypeId´s die aktuellen Objekte. Als Schlüssel dient die TypeId, als Value wird eine Liste mit allen Objekten zurückgegeben, die aktuell sind und deren TypeId mit dem Schlüssel übereinstimmt.


_oldObjectsTypeId

private final Map<Long,List<ConfigAreaFile.OldObjectTypeIdInfo>> _oldObjectsTypeId
Speichert zu allen TypeId´s die alten Objekte. Als Schlüssel dient die TypeId, als Value wird eine Liste mit allen Objekten zurückgegeben. Die Objekte beinhalten ob das Objekt dynamisch oder konfigurierend ist und die Version bzw. Zeitpunkt an dem das Objekt gültig geworden ist. Als letztes ein Objekte, mit dem das Objekt wieder rekonstruiert werden kann.


_areaFileLock

private final FileLock _areaFileLock
Mit diesem Objekt wird ein mehrfacher Zugriff auf diese Datei verhindert. Dieser Mechanismus funktioniert nur, wenn alle Klassen, die auf diese Datei zugreifen, ihn auch benutzen.

Constructor Detail

ConfigAreaFile

public ConfigAreaFile(File configAreaFile,
                      short activeVersion,
                      ConfigFileManager configFileManager,
                      List<VersionInfo> localActivatedVersionTimes)
               throws IOException
Dieser Konstruktor wird benutzt, wenn eine Datei für einen Konfigurationsbereich bereits existiert.

Parameters:
configAreaFile - Datei, in der der Konfigurationsberich gespeichert ist
activeVersion - aktive Version mit der der Konfigurationsbereich gestartet wird
configFileManager - Objekt, das alle Konfigurationsbereiche verwaltet
localActivatedVersionTimes - Liste, die zu jeder Version, die lokal aktiviert wurde, den Zeitpunkt enthält, wann die Version aktiviert wurde
Throws:
IOException

ConfigAreaFile

public ConfigAreaFile(File configAreaFile,
                      String pid,
                      short activeVersion,
                      int serializerVersion,
                      ConfigFileManager configFileManager)
               throws IOException
Erzeugt eine Datei, die einen Konfigurationsbereich abbildet. Der Header wird erstellt, usw..

Parameters:
configAreaFile - Datei, in der die Objekte gespeichert werden
pid - Pid des Konfigurationsbereichs
activeVersion - aktuelle Version
serializerVersion - Version, mit der alle Daten in der Datei serialisiert werden müssen. Alle Daten, die
configFileManager -
Throws:
IOException
Method Detail

getActivationTimeArray

private long[] getActivationTimeArray(Map<Short,Long> activationTimeMap)
Erzeugt ein Array mit den Aktivierungszeiten der Versionen dieses Bereichs. Am Index 0 ist die Zeit 0 eingetragen.

Parameters:
activationTimeMap - Map mit der globalen oder lokalen Zuordnung von aktivierten Versionen zum jeweiligen Zeitpunkt
Returns:
Array mit den Aktivierungszeiten der Versionen dieses Bereichs. Am Index 0 ist die Zeit 0 eingetragen. Die Aktivierungszeit der Version n ist am Index n eingetragen. Bei nicht aktivierten Zwischenversionen wird die Zeit der nächsten Aktivierung eingetragen. Der größte verwendete Index entspricht der größten aktivierten Version.

getActivationTime

private long getActivationTime(int version,
                               long[] activationTimes)
Bestimmt den Aktivierungszeitpunkt einer vorgegebenen Version.

Parameters:
version - Version deren Aktivierungszeitpunkt bestimmt werden soll.
activationTimes - Array mit den globalen bzw. lokalen Aktivierungszeitpunkten
Returns:
Aktivierungszeitpunkt

setNextActiveVersion

public void setNextActiveVersion(short nextActiveVersion)
Description copied from interface: ConfigurationAreaFile
Legt die Version fest mit der Konfigurationsobjekte, die mit ConfigurationAreaFile.createConfigurationObject(long, long, java.lang.String, java.lang.String) erzeugt werden, gültig werden.

Specified by:
setNextActiveVersion in interface ConfigurationAreaFile
Parameters:
nextActiveVersion - Version, mit der Konfigurationsobjekte gültig werden. Die erste Version, mit der ein Objekt gültig sein kann, ist die 1. Die Versionen sind positive Ganzzahlen, die fortlaufend nummeriert sind.

getNextActiveVersion

public short getNextActiveVersion()
Description copied from interface: ConfigurationAreaFile
Liefert die Version, ab der neu erstellte Konfigurationsobjekte gültig werden.

Specified by:
getNextActiveVersion in interface ConfigurationAreaFile
Returns:
Liefert eine Version, ab der neu erstellte Konfigurationsobjekte gültig werden.

getConfigurationAreaInfo

public ConfigurationObjectInfo getConfigurationAreaInfo()
Methode, die das Objekt, das den Konfigurationsbereich darstellt, zurück gibt.

Specified by:
getConfigurationAreaInfo in interface ConfigurationAreaFile
Returns:
Objekt oder null, wenn der Bereich gerade erzeugt wurde.

flush

public void flush()
           throws IOException
Description copied from interface: ConfigurationAreaFile
Diese Methode wird aufgerufen, wenn alle modifizierten Objekte des Konfigurationsbereichs persistent gespeichert werden sollen.

Specified by:
flush in interface ConfigurationAreaFile
Throws:
IOException - Fehler beim Zugriff auf die Datei in der der Konfigurationsbereich gespeichert ist

close

public void close()
           throws IOException
Description copied from interface: ConfigurationAreaFile
Diese Methode wird aufgerufen, wenn das System heruntergefahren soll. Es müssen alle Daten gespeichert werden (siehe ConfigurationAreaFile.flush() und ein Zustand hergestellt werden, mit dem das System zu einem späteren Zeitpunkt wieder hochgefahren werden kann.

Specified by:
close in interface ConfigurationAreaFile
Throws:
IOException - Fehler beim Zugriff auf die Datei in der der Konfigurationsbereich gespeichert ist

writeDynamicObject

void writeDynamicObject(DynamicObjectInformation object)
Speicher ein dynamisches Objekt in die Datei des Konfigurationsbereichs. Diese Methode wird benötigt, wenn ein dynamisches Objekt auf "Invalid" gesetzt werden. Für Konfigurationsobjekte ist dies nicht nötig, da diese bis zum beenden der Konfiguration im Speicher bleiben.

Parameters:
object - zu speicherndes Objekts

createDynamicObject

public DynamicObjectInfo createDynamicObject(long objectID,
                                             long typeID,
                                             String pid,
                                             short simulationVariant,
                                             String name,
                                             DynamicObjectType.PersistenceMode persistenceMode)
Description copied from interface: ConfigurationAreaFile
Diese Methode erzeugt ein dynamisches Objekt, das sofort gültig ist.

Specified by:
createDynamicObject in interface ConfigurationAreaFile
Parameters:
objectID - ID des Objekts
typeID - Typ des Objekts, der Typ wird über die ID festgelegt
pid - Pid des Objekts
simulationVariant - Simulationsvariante unter der das dynamische Objekt gültig ist
name - Name des Objekts, null wird als "" interpretiert
persistenceMode - Soll das dynamische Objekte persistent gespeichert werden
Returns:
Objekt, über das auf das dynamische Objekt zugegriffen werden kann
See Also:
ConfigurationAreaFile.getGreatestId()

createConfigurationObject

public ConfigurationObjectInfo createConfigurationObject(long objectID,
                                                         long typeID,
                                                         String pid,
                                                         String name)
Description copied from interface: ConfigurationAreaFile
Diese Methode erzeugt ein Konfigurationsobjekt.

Specified by:
createConfigurationObject in interface ConfigurationAreaFile
Parameters:
objectID - ID des Objekts
typeID - Typ des Objekts, der Typ wird über die ID festgelegt
pid - Pid des Objekts
name - Name des Objekts, null wird als "" interpretiert
Returns:
Objekt, über das auf das Konfigurationsobjekt zugegriffen werden kann
See Also:
ConfigurationAreaFile.getGreatestId()

getRunningNumber

private long getRunningNumber(long wholeNumber)
Maskiert die ersten 40 Bits einer Id

Parameters:
wholeNumber - Id, die maksiert werden soll
Returns:
Id, mit den ersten 40 Bits

getCurrentObjects

public SystemObjectInformationInterface[] getCurrentObjects()
Description copied from interface: ConfigurationAreaFile
Diese Methode gibt alle dynamischen Objekte und Konfigurationsobjekte zurück, die in der aktuellen Version aktuell sind.

Specified by:
getCurrentObjects in interface ConfigurationAreaFile
Returns:
s.o.

getActualObjects

public SystemObjectInformationInterface[] getActualObjects(long typeId)
Description copied from interface: ConfigurationAreaFile
Gibt alle aktuellen Objekte zurück, die als TypeId die übergebene TypeId besitzen.

Specified by:
getActualObjects in interface ConfigurationAreaFile
Parameters:
typeId - TypeId, die ein Objekt besitzen muss, damit es zurückgegeben wird
Returns:
Objekte, deren TypeId gleich der übergebenen TypeId sind. Ist kein Objekt vorhanden, so wird eine leere Liste zurückgegeben.

getObjects

public SystemObjectInformationInterface[] getObjects(long startTime,
                                                     long endTime,
                                                     ConfigurationAreaTime kindOfTime,
                                                     TimeSpecificationType timeSpecificationType,
                                                     Collection<Long> typeIds)
Description copied from interface: ConfigurationAreaFile
Diese Methode gibt alle dynamischen Objekte und Konfigurationsobjekte zurück, die innerhalb des angegebenen Zeitbereichs gültig waren und deren TypeId gleich einer der übergebenen TypeId´s ist. Der Parameter timeSpecificationType bestimmt, wann/wie lange ein Objekt gültig gewesen sein muss um in die Lösung aufgenommen zu werden.

Specified by:
getObjects in interface ConfigurationAreaFile
Parameters:
startTime - Zeitpunkt, ab der ein Objekt gültig sein muss, um zurückgegeben zu werden
endTime - Zeitpunkt, bis zu der Objekte zurückgegeben werden
kindOfTime - Ein Konfigurationsobjekt wird mit der Aktivierung einer Version gültig. Da der Konfigurationsverantwortliche die Version zu einem früheren Zeitpunkt aktiviert haben kann, als die lokale Konfiguration, legt dieser Parameter fest, welcher Zeitpunkt für ein Konfigurationsobjekt benutzt werden soll an dem es als "gültig" markiert wurde.
timeSpecificationType - Gibt die Art und Weise an, wie der Zeitraum zu betrachten ist.
typeIds - Liste von TypeId´s. Damit ein Objekt zurückgegeben wird, muss die TypeId des Objekts mit einer TypeId in der Liste übereinstimmen
Returns:
Objekte, die in dem angegebene Zeitbereich zu einem Zeitpunkt gültig waren und deren TypeId mit einer geforderten TypeId übereinstimmt

isValueAtTheMiddle

private boolean isValueAtTheMiddle(long start,
                                   long middle,
                                   long end)
Diese Methode prüft ob folgende Gleichung wahr ist:

start <= middle <= end

Returns:
true = Die oben angegebene Gleichung ist wahr

getActiveVersion

public short getActiveVersion(long startTime,
                              ConfigurationAreaTime kindOfTime)
Gibt zu einem Zeitpunkt die Version zurück, die aktiv war.

Parameters:
startTime - Zeitpunkt, zu dem die Version aktiv gewesen sein muss
kindOfTime - Soll die Aktivierungszeit des Konfigurationsverantwortlichen oder die lokale Aktivierung zur Berechnung der Version benutzt werden
Returns:
Version, die zu dem angegebenen Zeitpunkt aktiviert war. Der Wert -1 bedeutet, dass es keine aktive Version gibt, die zu dem geforderten Zeitpunkt aktiviert war

getNewObjects

public SystemObjectInformationInterface[] getNewObjects()
Description copied from interface: ConfigurationAreaFile
Diese Methode gibt alle Konfigurationsobjekte zurück, die in einer zukünftigen Version aktuell werden.

Specified by:
getNewObjects in interface ConfigurationAreaFile
Returns:
Konfigurationsobjekte, die zukünftig aktuell werden aber es in der aktuellen Version noch nicht sind.

iterator

public Iterator<SystemObjectInformationInterface> iterator()
Description copied from interface: ConfigurationAreaFile
Stellt alle dynamischen Objekte und Konfigurationsobjekte zur Verfügung.

Specified by:
iterator in interface ConfigurationAreaFile
Returns:
s.o.

writeHeader

private void writeHeader(RandomAccessFile file)
                  throws IOException
Schreibt einen Header in die übergebene Datei. Der FileDescriptor wird auf Position 0 gesetzt und steht am Ende des Schreibvorgangs am Ende des Headers.

Parameters:
file -
Throws:
IOException

getMixedObjectSetObjects

public Collection getMixedObjectSetObjects()
                                    throws IOException,
                                           NoSuchVersionException
Lädt alle "aktuellen" und in "Zukunft aktuellen" Objekte. Objekte die ungültig sind, aber sich noch in der Mischobjektmenge befinden, werden nur Teilweise (ID, Pid-HashCode, Dateiposition) geladen.

Soll der Bereich in einer anderen als der aktuellen Version geladen werden, dann müssen ebenfalls die nGa-Bereiche betrachtet werden.

Returns:
Collecetion, die alle Objekte der Mischmenge enthält (entweder ganz, oder nur als ID-Pid-Dateiposition Kombination) und Objekte aus den entsprechende nGa-Bereichen
Throws:
IOException
NoSuchVersionException

putUnknownObject

private void putUnknownObject(SystemObjectInformationInterface unknownObject)
Legt ein dynamisches Objekt oder ein Konfigurationsobjekt in die entsprechende Datenstruktur für aktuelle oder in Zukunft gültige Objekte ab.

Parameters:
unknownObject - Objekt, das eingetragen werden soll

putOldObject

private void putOldObject(ConfigAreaFile.OldObject oldObject)
Fügt ein als "ungültig" markiertes Objekt in alle interenen Datenstrukturen hinzu, die für einen schnellen Zugriff auf ungültige Objekte benötigt werden.

Alle Objekte, die übergeben werden, sind auch in der Datei enthalten, transiente Objekte können mit dieser Methode nicht abgebildet werden.

Parameters:
oldObject - Objekt, das Id, PidHashCode und die Dateipostion enthält. Das configAreaFileObjekt wird nicht benötigt.

putNewObject

private void putNewObject(SystemObjectInformationInterface newObjekt)
Fügt das Objekt zu allen Datenstrukturen hinzu, die für den schnellen Zugriff auf "in Zukunft gültige" Objekte benötigt werden

Parameters:
newObjekt - Objekt, das in die Datenstruktur aufgenommen werden soll

removeNewObject

void removeNewObject(ConfigurationObjectInfo newObject)
Diese Methode entfernt ein Objekt, das in zukünftigen Versionen gültig werden soll aus allen Datenstrukturen (auch dem ConfigFileManager), die den schnellen Zugriff auf diese Art von Objekten ermöglichen.

Parameters:
newObject - Objekt, das aus allen Datenstrukturen entfernt werden soll.

removeDynamicSimulationObject

void removeDynamicSimulationObject(DynamicObjectInformation dynamicObjectInfo)
Entfernt ein dynamisches Objekt aus alle Datenstrukturen(auch ConfigFileManager). Es wird nicht aus der Datei gelöscht.

Diese Methode darf nur auf Objekte mit einer Simulationsvariante größer 0 angewendet werden.

Parameters:
dynamicObjectInfo - Objekt, das entfernt werden soll

putActualObject

private void putActualObject(SystemObjectInformationInterface actualObjekt)
Fügt das Objekt zu allen Datenstrukturen hinzu, die für den schnellen Zugriff(mit Id) auf aktuelle Objekte benötigt werden

Parameters:
actualObjekt -

getOldObject

public SystemObjectInformationInterface getOldObject(long id)
Description copied from interface: ConfigurationAreaFile
Diese Methode gibt ein Objekt zurück, das als ungültig markiert wurde. Ist in diesem Konfigurationsbereich kein Objekt mit der Id vorhanden, wird null zurückgegeben.

Specified by:
getOldObject in interface ConfigurationAreaFile
Parameters:
id - Id des geforderten Objekts
Returns:
Objekt, das als ungültig markiert wurde oder null

putOldObjectTypeId

private void putOldObjectTypeId(long typeId,
                                long firstValid,
                                long firstInvalid,
                                boolean configurationObject,
                                ConfigAreaFile.OldObjectIdReference oldObjectIdReference)
Speichert alle benötigten Ladeinforamtionen zu einem Objekt in der Map, die alle alten Objekte verwaltet.

Parameters:
typeId - TypeId des Objekt, das nicht vollständig geladen wurde
firstValid - Zeitpunkt oder Version mit der das Objekt gültig wurde
firstInvalid - Zeitpunkt oder Version mit der das Objekt ungültig wurde
configurationObject - true = Es handelt sich um ein Konfigurationsobjekt (firstValid wird als Version interpretiert); false = Es handelt sich um ein dynamisches Objekt (firstValid wird als Zeitpunkt interpertiert)
oldObjectIdReference - Objekt zum anfordert des Objekts (Datei oder Speicher)

putActualObjectTypeId

private void putActualObjectTypeId(SystemObjectInformationInterface actualObject)
Speichert ein Objekt in der Map, die alle aktuellen Objekte nach deren TypeId verwaltet

Parameters:
actualObject - Objekt, das in die Map aufgenommen werden soll

getObjects

public SystemObjectInformationInterface[] getObjects(String pid,
                                                     long startTime,
                                                     long endTime,
                                                     ConfigurationAreaTime kindOfTime)
Description copied from interface: ConfigurationAreaFile
Diese Methode gibt Objekte zurück, die in dem angegebenen Zeibereich gültig waren.

Specified by:
getObjects in interface ConfigurationAreaFile
Parameters:
pid - Pid, über die die Objekte identifiziert werden
startTime - Zeitpunkt, ab dem ein Objekt mit der angegebenen Pid gültig gewesen sein muss um zurückgegeben zu werden. War das Objekt vor dem angegebenen Zeitraum bereits gültig, so wird es ebenfalls zurückgegeben.
endTime - Zeitpunkt, bis zu dem ein Objekt mit der angegebenen Pid gültig gewesen sein muss um zurückgegeben zu werden. Ist das Objekt über diesen Zeitraum hinweg gültig, so wird es ebenfalls zurückgegeben. Der Zeitpunkt darf nicht in der Zukunft liegen, der größt mögliche Zeitpunkt ist die aktuelle Zeit.
kindOfTime - Legt fest, welcher Zeitpunkt bei einer aktivierten Version benutzt wird. Der Zeitpunkt der lokalen Aktivierung einer Version oder aber der Zeitpunkt der Aktivierung durch den Konfigurationsverantwortlichen.
Returns:
Alle Objekte, die über die Pid identifiziert werden und im gewünschten Zeitbereich gültig waren. Sind keine Objekte vorhanden, wird ein leeres Array zurückgegeben (Größe 0).

objectValid

boolean objectValid(Object objectInfo,
                    long queryIntervalStart,
                    long queryIntervalEnd,
                    ConfigurationAreaTime kindOfTime,
                    TimeSpecificationType timeSpecificationType)
Diese Methode prüft, ob ein Objekte im angegebenen Zeitraum gültig war/ist.

Parameters:
objectInfo - Objekt, das geprüft werden soll
queryIntervalStart - Startzeitpunkt ab dem ein Objekte gültig sein muss
queryIntervalEnd - Endzeitpunkt, bis zu dem ein Objekt gültig geworden sein muss
kindOfTime - Zeit des Konfigurationsverantwortlichen oder die lokale Zeit zu der eine Version gültig geworden ist
timeSpecificationType - Gibt an, ab wann ein Objekt als "gültig" deklariert werden darf. Es gibt 2 Fälle: Fall 1) Das Objekt muss im angegebnen Bereich irgendwann gültig gewesen sein (Darf aber auch in dem Bereich ungültig geworden sein). Fall 2) Das Objekt muss im gesamten Zeitbereich gültig gewesen sein, die entspricht TimeSpecificationType.VALID_DURING_PERIOD
Returns:
true = das Objekt war in dem angegebenen Zeitbereich gültig; false = das Objekt war im angegebenen Zeitbereich nicht gültig

getSerializerVersion

public int getSerializerVersion()
Description copied from interface: ConfigurationAreaFile
Alle Daten, die als Byte-Array gespeichert werden müssen, werden mit einem Serializer Serializer erstellt. Die benutzte Version ist in der gesamten Datei identisch. Ein Versionswechsel innerhalb der Datei ohne die Konvertierung aller Daten auf die neue Version ist nicht gestattet.

Specified by:
getSerializerVersion in interface ConfigurationAreaFile
Returns:
Versionsnummer des Serialisierers mit dem alle Byte-Arrays erstellt wurden

loadObjectFromFile

SystemObjectInformation loadObjectFromFile(long filePosition)
                                     throws IOException,
                                            NoSuchVersionException
Lädt ein Objekt aus einer Datei

Parameters:
filePosition - Position in der Datei, an der das Objekt beginnt
Returns:
Objekt, das aus der Datei erzeugt wurde
Throws:
IOException
NoSuchVersionException

loadObjectFromFile

private SystemObjectInformation loadObjectFromFile(long filePosition,
                                                   ConfigAreaFile.FileIterator fileIterator)
                                            throws IOException,
                                                   NoSuchVersionException
Lädt ein Objekt aus einer Datei und setzt im Objekt fileIterator die Position, an der das nächste Objekt gefunden werden kann (relative Position bezogen auf den Header).

Parameters:
filePosition - Position in der Datei, an der das Objekt beginnt
fileIterator - Objekt, an dem die Position des nächsten zu ladenden Objekts gespeichert wird. Wird null übergeben, so wird die Psoition des nächsten Objekts nicht gesetzt. Wird eine -1 gesetzt,so gibt es kein nächstes Objekt mehr
Returns:
Objekt, das aus der Datei erzeugt wurde
Throws:
IOException
NoSuchVersionException

readObjectFromFile

private SystemObjectInformation readObjectFromFile(long filePosition,
                                                   int objectsize,
                                                   long id,
                                                   long typeId,
                                                   long firstInvalid,
                                                   long firstValid,
                                                   byte objecttype,
                                                   RandomAccessFile file)
                                            throws IOException,
                                                   NoSuchVersionException
Lädt ein dynamischen Objekt oder ein Konfigurationsobjekt aus der Datei des Konfigurationsbereichs. Die Datei, die übergeben wird, steht mit ihrem fileDescriptor entweder auf der Simulationsvariante (bei dynamischen Objekten) oder auf den gepackten Daten (bei Konfigurationsobjekten).

Parameters:
filePosition - Position in der Datei, an der das Objekt gespeichert ist
objectsize - Gesamtegröße des Objekts (einschließlich der schon geladenen Daten)
id - Id des Objekts
typeId - Id des Types des Objekts
firstInvalid - Version oder Zeitpunkt, an dem das Objekt ungültig wurde/wird
firstValid - Version oder Zeitpunkt, an dem das Objekt gültig wird/wurde
objecttype - 0 = Konfigurationsobjekt, Valid und Invalid sind als Versionen zu interpretieren; 1 = dynamisches Objekt, Valid und Invalid sind als Zeitpunkte zu interpretieren
file - Datei, aus der das Objekt gelesen werden soll, der fileDescriptor steht bei dynamsichen Objekten auf der Simulationsvariante, bei Konfigurationsobjekten auf den gepackten Daten
Returns:
Dynamisches Objekt oder Konfigurationsobjekt
Throws:
IOException
NoSuchVersionException

writeDynamicObjectToFile

private long writeDynamicObjectToFile(DynamicObjectInformation dynamicObject,
                                      RandomAccessFile file,
                                      boolean declareGap,
                                      boolean setNewFilePosition)
                               throws IOException,
                                      IllegalStateException
Speichert ein Objekt ans Ende der übergebenen Datei.

Die Datei wird nach dem Schreibzugriff nicht geschlossen und die neue Dateiposition wird am Objekt vermerkt.

Parameters:
dynamicObject - Objekt, das gesichert werden soll
file - Datei, in der das Objekt gespeichert werden soll. Das Objekt wird ans Ende der Datei geschrieben
declareGap - true = (Normalfall) Das Objekt wird gespeichert, es existiert aber noch eine ältere Version des Objekts in der Datei und diese wird als Lücke deklariert (ID wird auf 0 gesetzt); false = (Anlegen einer neuen Konfigurationsbereichsdatei oder bei Reorganisation) Das Objekt wird in der Datei gespeichert (es wird keine Lücke erzeugt). Dies ist aber die erste Version des Objekts in der Datei und somit gibt es auch keinen Vorgänger der als Lücke deklariert werden soll
setNewFilePosition - true = (Normalfall) Das Objekt wird in der Datei gespeichert und die neue Position in der Datei wird am Objekt, das sich im Speicher befindet, gespeichert; false = Das Objekt wird in der Datei gespeichert, aber die neue Dateiposition wird nicht am Objekt gespeichert sondern muss nachträglich am Objekt, das sich im Speicher befindet, gesetzt werden. Ein Beispiel wäre die Reorganisation. Das Objekt wird in der neue Datei gespeichert, aber die Dateiposition wird am Objekt im Speicher erst dann gesetzt, wenn die Reorganisation erfolgreich abgeschlossen werden konnte.
Returns:
Position in der Datei, an der das Objekt gespeichert wurde
Throws:
IOException - Fehler beim schreiben in die Datei, Teile des Datensatzes wurden bereits geschrieben
IllegalStateException - Fehler beim sammeln der Daten, die Datei wurde noch nicht verändert

writeConfigurationObjectToFile

private long writeConfigurationObjectToFile(ConfigurationObjectInformation configurationObject,
                                            RandomAccessFile file,
                                            boolean declareGap,
                                            boolean setNewFilePosition)
                                     throws IOException,
                                            IllegalStateException
Speichert ein Objekt ans Ende der übergebenen Datei. Die Datei wird nach dem Schreibzugriff nicht geschlossen. Die Dateiposition wird am Objekt aktualisiert.

Parameters:
configurationObject - Objekt, das gespeichert werden soll
file - Datei, in der das Objekt gespeichert werden soll.
declareGap - true = (Normalfall) Das Objekt wird gespeichert, es existiert aber noch eine ältere Version des Objekts in der Datei und diese wird als Lücke deklariert (ID wird auf 0 gesetzt); false = (Anlegen einer neuen Konfigurationsbereichsdatei oder bei Reorganisation) Das Objekt wird in der Datei gespeichert (es wird keine Lücke erzeugt). Dies ist aber die erste Version des Objekts in der Datei und somit gibt es auch keinen Vorgänger der als Lücke deklariert werden soll
setNewFilePosition - true = (Normalfall) Das Objekt wird in der Datei gespeichert und die neue Position in der Datei wird am Objekt, das sich im Speicher befindet, gespeichert; false = Das Objekt wird in der Datei gespeichert, aber die neue Dateiposition wird nicht am Objekt gespeichert sondern muss nachträglich am Objekt, das sich im Speicher befindet, gesetzt werden. Ein Beispiel wäre die Reorganisation. Das Objekt wird in der neue Datei gespeichert, aber die Dateiposition wird am Objekt im Speicher erst dann gesetzt, wenn die Reorganisation erfolgreich abgeschlossen werden konnte.
Returns:
Position in der Datei, an der das Objekt gespeichert wurde
Throws:
IOException - Fehler beim schreiben in die Datei, Teile des Datensatzes wurden bereits geschrieben
IllegalStateException - Fehler beim sammeln der Daten, die Datei wurde noch nicht verändert

declareObjectAsAGap

private void declareObjectAsAGap(long filePosition,
                                 RandomAccessFile file)
                          throws IOException
Setzt die Id eines Objekts auf 0 und erklärt es somit als Lücke. Es gibt keinen unterschied zwischen dynamischen Objekten und Konfigurationsobjekten

Parameters:
filePosition - Position des Objekts (Länge des Objekts). Der Wert -1 bedeutet, dass dieses Objekt noch nie gespeichert wurde. Es muss also kein altes Objekt als Lücke definiert werden
file - Dateiobjekt, mit dem auf die Platte zugegriffen werden kann
Throws:
IOException

declareObjectAsAGap

void declareObjectAsAGap(long filePosition)

zip

private byte[] zip(byte[] data)
            throws IOException
Packt ein Byte-Array mit dem Packer "ZIP" und gibt die Daten gepackt zurück

Parameters:
data - ungepackte Daten
Returns:
gepackte Daten
Throws:
IOException

unzip

private byte[] unzip(byte[] zippedData)

writeSystemObjectWithoutIdAndTypeId

private void writeSystemObjectWithoutIdAndTypeId(SystemObjectInformationInterface object,
                                                 Serializer serializer)
                                          throws IOException
Speichert die Pid, den Namen des SystemObjects und alle konfigurierenden Datensätze .

Parameters:
object - Objekt, von dem nur gewissen Teile gespeichert werden
serializer - Byte-Strom, in den die Daten eingefügt werden
Throws:
IOException

getActiveVersion

short getActiveVersion()

objectModified

void objectModified(SystemObjectInformationInterface modifiedObject)
Diese Methode wird von einem Objekt aufgerufen, wenn Informationen des Objekts geändert wurden. Das gesamte Objekt wird persistent gespeichert, sobald die Methode ConfigurationFileManager.saveConfigurationAreaFiles() aufgerufen wird. Die Methode kann mehrfach vom selben Objekt aufgerufen werden, es wird nur einmal gespeichert.

Es muss außerdem geprüft werden, ob das Objekt Auswirkungen auf die drei Zeitstempel _dynamicObjectChanged,_configurationDataChanged,_configurationObjectChanged hat (siehe TPuK1-51).

Parameters:
modifiedObject - dynamisches Objekt oder Konfigurationsobjekt, dessen Informationen geändert wurden und das somit persistent in der Datei des Konfigurationsbereichs gespeichert werden muss

dontSaveObject

void dontSaveObject(SystemObjectInformationInterface object)
Diese Methode entfernt ein Objekt aus Menge zu speichernden Objekte

Parameters:
object - Objekt, das nicht gespeichert werden soll

setDynamicObjectInvalid

void setDynamicObjectInvalid(DynamicObjectInformation invalidObject)
Diese Methode wird aufgerufen, wenn ein dynamisches Objekt auf "ungültig" gesetzt wird. Die Methode wird vom Objekt selber aufgerufen und aktualisiert alle Datenstrukturen, die das Objekt als "gültig" führen. Konfigurationsobjekte müssen nicht beachtet werden, da diese erst in der "nächsten" Version ungültig/gültig werden. Dies wird beim einlesen der Datei erkannt und die Datenstrukturen werden sofort richtig angelegt. Die Methode ist blockierend, wenn eine Reorganisation stattfindet.

Parameters:
invalidObject - Objekt, das "ungültig" geworden ist

initialVersionRestructure

public boolean initialVersionRestructure()
Diese Methode wird aufgerufen, wenn der Konfigurationsverantwortliche eine neue Version aktiviert. Der Aufruf bewirkt, dass die Datei falls erforderlich restrukturiert wird. Diese Methode muss druch den Konfigurationsverantwortlichen aufgerufen werden, wenn dieser die aktive Version wechselt.

Specified by:
initialVersionRestructure in interface ConfigurationAreaFile
Returns:
true = Die Reorganisation war erfolgreich oder nicht erforderlich; false = Die Reorganisation war nicht erfolgreich
See Also:
restructure()

getGreatestId

public long getGreatestId()
Description copied from interface: ConfigurationAreaFile
Diese Methode gibt die größte vergebene laufende Nummer einer Id des Konfigurationsbereichs zurück. Die laufende Nummer ist in den ersten 40 Bits der Id kodiert.

Specified by:
getGreatestId in interface ConfigurationAreaFile
Returns:
Die größte vergebene laufende Nummer einer Id des Konfigurationsbereich oder 0 falls die Id noch unbekannt ist. Der Wert 0 wird zum Beispiel dann zurückgegeben, wenn der Konfigurationsbereich neu angelegt wurde und noch keine größte Id bekannt ist

restructure

public boolean restructure()
Description copied from interface: ConfigurationAreaFile
Diese Methode reorganisiert eine Konfigurationsbereichsdatei. Die Mischmenge wird dabei, falls möglich, verkleinert und die als ungültig markierten Objekte werden in die entsprechenden Blöcke kopiert. Kommt es bei der Reorganisation zu einem Fehler, so wird der Zustand vor der Reorganisation wiederhergestellt. Alle Methoden, die einen Dateizugriff benötigen (flush, Objekt auf Invalid setzen, usw.) und während der Reorganisation aufgerufen werden, sind blockierend.

Diese Methode darf nur durch den Konfigrationsverantwortlichen aufgerufen werden.

Specified by:
restructure in interface ConfigurationAreaFile
Returns:
true = Die Restrukturierung der Daten war erfolgreich; false = Die Restrukturierung der Daten hat nicht geklappt, es wird auf der alten Datei weitergearbeitet, es sind keine Daten verloren gegangen

binarySearch

private List<SystemObjectInformationInterface> binarySearch(long value,
                                                            boolean searchId)
                                                     throws NoSuchVersionException,
                                                            IOException
Diese Methode sucht zu einem Value alle Objekte, die als ungültig markiert sind. Der Parameter value wird dabei unterschiedlich interpretiert und zwar in Abhängigkeit vom Parameter searchId. Ist searchId = true, so wird der Parameter value als Id eines Objekts betrachtet. Die Methode sucht dann ein als ungültig markiertes Objekt, dessen Id gleich dem übergebenen Parameter value entspricht. Ist der Parameter searchId = false, so wird der Wert als HashCode einer Pid interpretiert. Da eine Pid nicht bijektiv auf ein Integer abgebildet werden kann, muss die Liste später noch überprüft werden, ob die Objekte auch wirklich mit der Pid übereinstimmen.

Parameters:
value - Id oder Pid, nach der die Objekte gesucht werden sollen
searchId - true = value wird als Id interpretiert; false = value wird als HashCode einer Pid interpretiert (siehe Methodenbeschreibung!)
Returns:
Liste, die die geforderten Objekte enthält. Bei einer Anfrage nach Id, ist nur ein Element in dieser Liste. Es wird null zurückgegeben, falls kein Objekt gefunden werden konnte
Throws:
IllegalStateException - Zu einer Id wurden zwei Elemente gefunden
NoSuchVersionException
IOException

getAbsoluteFilePositionForInvalidObjects

private long getAbsoluteFilePositionForInvalidObjects(long relativeFilePosition)
Diese Methode berechnet die absolute Position eines Objekts in der Konfigurationsbereichsdatei. Das Objekt befindet sich dabei in einem nGa Bereich oder in einem dyn. nGa Bereich.

Parameters:
relativeFilePosition - relative Position des Objekts. Ein negativer Wert (einschliesslich 0) wird als ungültiges Konfigurationsobjekt interpretiert. Ein positiver Wert als ungültiges dynamisches Objekt. Beide Objekte befinden sich in den nGa Bereichen oder im dyn. nGa Bereich.
Returns:
absolute Position, an der das Objekt zu finden ist

getConfigAreaPid

public String getConfigAreaPid()
Gibt die Pid des Konfigurationsbereichs zurück.

Returns:
Pid des Konfigurationsbereichs

printIdIndex

void printIdIndex()
Gibt die Indizes am Bildschirm aus, diese Methode ist nur für Debug-Zwecke geeignet.