de.bsvrz.ars.ars.persistence
Class ContainerFile

java.lang.Object
  extended by de.bsvrz.ars.ars.persistence.ContainerFile

public class ContainerFile
extends Object

Diese Klasse enthaelt die Funktionalitaet zum Erzeugen, Lesen, Schreiben und Loeschen von Container-Dateien. Jeder Task, der mit Container-Dateien arbeitet, enthaelt ein Objekt dieser Klasse. Die Sichtbarkeit von Konstruktor und Methoden ist beschraenkt, da diese Klasse nur durch den PersistenceManager im gleichen Package benutzt wird. Dieser haelt fuer jede anfragende Task ein Objekt dieser Klasse und leitet Anfragen bzgl. Container-Dateien an dieses ContainerFile-Objekt weiter.

Author:
beck et al. projects GmbH, Thomas Schaefer, Alexander Schmidt

Field Summary
private  CacheManager.Cache _cache
           
private  CacheManager _cacheManager
           
private static Debug _debug
           
private  boolean accessed
          Container adressiert.
private  byte[] actualWriteBuf
          Referenz auf den tatsaechlichen, von ContainerFile#serializeData(ResultData,long) verwendeten Puffer, der von writeBuf abweicht, falls dieser zu klein ist).
private  long aspId
          Aktuelle Aspekt-ID.
private  long atgId
          Aktuelle Attributgruppen-ID.
private  ByteArrayOutputStream bos
          Puffer fuer den Serialisierer und zum Lesen eines Datensatzes.
private static int BUFFER_SIZE
          Groesse der Daten-Puffer in Byte.
private  byte[] byte8Buf
          Puffer zum Einlesen von Laengenbytes etc.
private static int COMPRESS_LEN
          Laenge des Compress-Info-Feldes.
static FilenameFilter CONT_FILENAME_FILTER
          Filter zur Erkennung von Containerdateien anhand des Dateinamens.
(package private) static Pattern CONT_FILENAME_PAT
          Regulaerer Ausdruck zur Erkennung von Containerdateinamen.
(package private) static String CONT_FILENAME_PREFIX
          Praefix eines Containerdateinamens.
(package private) static String CONT_FILENAME_SUFFIX
          Dateiendung eines Containerdateinamens.
private  ContainerHdr containerHdr
          Container-Header Parameter als Key/Value-Paare.
private  long containerId
          Aktuelle Container-ID.
private  File contFile
          Aktuelle Container-Datei.
private static int DATAHDR_LEN
          Laenge des Headers eines jeden Datensatzes.
private  ContainerDataIterator dataIter
          Iterator fuer das Durchlaufen angefragter Datensaetze aus einem Container.
private  ArchiveDataKind dataKind
          Aktuelle Datensatzart.
private static int DATALEN_LEN
          Laenge des Laengenbytes vor jedem Datensatz (4 Bytes, Integer).
private static boolean DEBUG_CALLS
           
static boolean DECOMPRESS_QUERY_RESULTS
          Falls wahr, werden Archivanfragen komprimiert beantwortet (ist langsam, weil das Stream-Interface der Kernsoftware langsam ist)
private  boolean deletedHeaderFlag
          Gibt an, ob im aktuellen Container das "deleted"-Flag gesetzt ist
private  boolean deletedSpecialTreatment
          Gibt an, ob ausgelagerte Container beim Nachfordern so behandelt werden, dass ein Iterator normal darüber iterieren kann
private static int HEADER_LENGTH
           
private  boolean headerRead
          Container-Header eingelesen.
(package private)  byte[] indexListSep
          Gibt den Seperator an, der für den Datenindexlistenaufbau beim Löschen eines Containers verwendet wird
private static boolean IS_PERFORMANCE_TEST
          Gibt an, ob gerade ein Performance-Test mit Dummy-Daten (um den Overhead durch Deserialisieren/Serialisieren zu vermeiden) laeuft.
private  int iterBufPos
          Position innerhalb des Puffers im Speicher.
private  int iterBytesRead
          Zahl der beim letzten iterLoadDataChunk() gelesenen Bytes.
private  boolean iterDataRead
          Marker, ob nach jedem iterReadNextData() genau einmal iterGetDataElem() aufgerufen wurde (sonst stimmt die readPos nicht)
private  boolean iterEOC
          Wahr, wenn das Ende eines Containers erreicht ist
private  boolean iterIsHdrIterator
          Wahr, falls der Iterator nur ueber Min- und Maxwert aus dem Container-Header iteriert.
private  ArrayList<Long> iterlistOfDataIdx
          Für gelöschte Container beim Nachfordern:
Liste der Datenindizes im Container
private  int iterlistOfDataIdxPos
          Für gelöschte Container beim Nachfordern:
aktuelle Position in der Liste der Datenindizes
private  int iterNextDataLen
          Laenge des naechsten Datensatzes (wird in iterReadNextData() besetzt)
private  RandomAccessFile iterRaf
          Container-Datei.
private  int iterUncompressedLen
          Unkomprimierte Laenge des Datensatzes (oder 0 falls dieser nicht komprimiert ist).
static int MAX_UNCOMPRESSED
          Datensaetze bis zu dieser Laenge bleiben immer unkomprimiert.
private static byte[] NO_DATA
          Datensatzbytes, falls "keine Daten" signalisiert wurde
private static byte[] NO_RIGHTS
          Datensatzbytes, falls "keine Rechte" signalisiert wurde
private static byte[] NO_SOURCE
          Datensatzbytes, falls "keine Quelle" signalisiert wurde
static int NOT_COMPRESSED
          Wert des Compress-Info-Feldes, wenn DS nicht komprimiert ist
private  long objId
          Aktuelle Objekt-ID.
private static byte[] PERF_TESTDATA
          Dummy-Daten fuer den Performance-Test.
private static byte[] POT_GAP
          Datensatzbytes um eine potentielle Datenluecke zu kennzeichnen
private  byte[] readBuf
          Puffer zum Ein-/Auslesen des Container-Headers und anderer Daten.
private  boolean readOnly
          Container read-only adressiert.
private  Serializer serializer
          Datensatz-Serialisierer.
private  int sv
          Aktuelle Simulationsvariante.
private  int totalWriteDataSize
          Laenge des von ContainerFile#serializeData(ResultData,long) serialisierten Datensatzes.
private static byte[] VERSION_STRING
          4 Byte langes Versionskennzeichen.
private  byte[] writeBuf
          Puffer zum Kopieren von Dateien oder Einlesen von Strings und Zahlen.
 
Constructor Summary
ContainerFile()
          Konstruktor fuer ContainerFile.
 
Method Summary
(package private)  void accessContainer(long objId, long atgId, long aspId, int sv, ArchiveDataKind dataKind, long contId, File containerDir)
          Definiert auf welchem Container die folgenden Methoden-Aufrufe wirksam sein sollen.
(package private)  void accessContainerReadOnly(File contFile)
          Definiert auf welchem Container die folgenden Methoden-Aufrufe wirksam sein sollen.
(package private)  void appendSerializedData()
          Haengt den bereits uebergebenen und serialisierten Datensatz an die aktuelle Container-Datei an.
(package private)  void appendSerializedDataRaf()
          Haengt den bereits mit ContainerFile#preserializeData(ResultData,long) uebergebenen und serialisierten Datensatz an die aktuelle Container-Datei an.
private  void checkContainerAccessed()
          Prueft, ob ein Container zum Lesen im Zugriff ist.
private  void checkContainerAccessedHeaderRead()
          Prueft, ob ein Container zum Lesen im Zugriff ist und dessen Container-Header bereits eingelesen ist.
private  void checkContainerAccessedRW()
          Prueft, ob ein Container zum Lesen und Schreiben im Zugriff ist.
(package private)  void closeContainer(long containerEntries, long minArcTime, long maxArcTime, long minDataTime, long maxDataTime, long minDataIdx, long maxDataIdx, long vorhalteZeit)
          Schliesst die Container-Datei fuer den mit einer der accessContainer()-Methoden spezifizierten Container.
 void closeContainerRecount(long vorhalteZeit)
          Schliesst einen Container, indem jeder Datensatz-Header des Containers gelesen wird, um die Min-/Max-Werte und die Anzahl der Datensaetze zu bestimmen.
private  void closeRandomAccessFile(RandomAccessFile raf)
          Schliesst ein RandomAccessFile und faengt die Exception ab.
static long compareContainerFile(File file1, File file2)
          Vergleicht die ID's von zwei ContainerFiles:
- grösser 0, wenn die ID des ersten ContainerFiles grösser ist, als die Zweite;
- kleiner 0, wenn sie kleiner ist als die Zweite;
- 0, wenn sie gleich sind.
 long compareContainerFile(long fileID2CompareWith)
          Vergleicht die ID's von zwei ContainerFiles
grösser 0, wenn die ID dieses ContainerFiles grösser ist, als die zu Vergleichende
kleiner 0, wenn sie kleiner ist als die zu Vergleichende
0, wenn sie gleich sind
(package private)  int countContainerEntries()
          Zaehlt die Anzahl der Datensaetze in dem mit einer accessContainer()-Methode im Zugriff befindlichen Container durch Iterieren ueber die Datensaetze in der Container-Datei.
(package private)  void createContainer(boolean toSave)
          Erzeugt eine neue Container-Datei fuer den mit accessContainer() spezifizierten Container.
(package private)  byte[] createDataIndexBuffer()
          Erzeugt eine verkürzte Liste von Datenindizes, die im aktuellen Datencontainer archiviert sind und schreibt sie in ein Byte-Array (falls z.B.
private  void createDefaultContainerHeader(boolean toSave)
          Erzeugt Default-Header-Parameter fuer den Anfang einer neuen Container-Datei.
private  void createWriteBuffers()
          Legt alle zum Schreiben benoetigte Puffer an.
(package private)  void deleteContainerData()
          Loescht alle Datensaetze eines Datencontainers, so dass lediglich der Header mit der Verwaltungs-Information in der Datei erhalten bleibt.

Das Header-Flag darf keinesfalls vor dem Loeschen der Daten auf "geloescht" gesetzt werden!

Update 03/05/2006:
Schreibt eine optimierte Liste der Datenindizes (siehe createDataIndexBuffer()) in den Body des Datencontainers, damit Datensaetze aus geloeschten Containern beim Nachfordern ignoriert werden koennen.
(package private)  int embedSerialializedData(long arcTime, long dataTime, long dataIdx, byte[] serData, byte[] dest, Deflater compresser)
          Schreibt das Bytefeld mit allen Datensatz-Headern, so dass es mit appendSerializedData() geschrieben werden kann.
(package private)  boolean existsContainer()
          Liefert Kennzeichen, ob bereits eine Container-Datei fuer den mit #accessContainer(long,long,long,int,ArchiveDataKind,long,String) spezifizierten Container besteht.
private  void flushCache()
           
private  void forgetCache()
           
(package private)  long getAspId()
           
(package private)  long getAtgId()
           
private static byte[] getBuf(byte[] defaultBuffer, int desiredSize)
          Liefert den uebergebenen Puffer falls dessen Groesse ausreichend ist, andernfalls einen neu angelegten.
static String getContainerFileName(long containerId)
          Liefert den Dateinamen des Daten-Containers mit der angegebenen Container-ID.
(package private)  long getContainerId()
           
(package private)  long getContainerSize()
          Ermittelt die Gesamtlaenge des mit accessContainer() im Zugriff befindlichen Containers.
(package private)  File getContFile()
           
(package private)  ArchiveDataKind getContHdrParamAsArchiveDataKind(KeyValParam param)
          Nachdem mit readContainerHeader() der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden.
(package private)  boolean getContHdrParamAsBool(KeyValParam param)
           
(package private)  int getContHdrParamAsInt(KeyValParam param)
           
(package private)  long getContHdrParamAsLong(KeyValParam param)
          Nachdem mit readContainerHeader() der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden.
(package private)  String getContHdrParamAsString(KeyValParam param)
          Nachdem mit readContainerHeader() der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden.
static long getContID(File file)
          Liefert die Container-ID zur angegebenen Container-Datei, indem die im Container-Dateinamen enthaltene Container-ID ausgelesen wird.
static long getContID(String fileName)
          Liefert die Container-ID zum angegebenen Container-Datei-Namen, indem die im Container-Dateinamen enthaltene Container-ID ausgelesen wird.
static int getHeaderLen()
          Ermittelt die Gesamtlaenge des mit accessContainer() im Zugriff befindlichen Containers.
 ArrayList<Long> getListOfIndexesDeleted()
           
(package private)  long getObjId()
           
(package private)  int getSv()
           
static int getTotalDataOverhead()
          Ermittelt den vollstaendigen Overhead fuer einen Datensatz.
(package private)  boolean isContainerClosed()
          Prueft ob der mit einer der accessContainer()-Methoden spezifizierte Container bereits abgeschlossen ist.
static boolean isContainerFile(File f)
          Liefert Kennzeichen, ob die angegebene Datei eine Container-Datei ist.
static boolean isContainerFileName(String name)
          Liefert Kennzeichen, ob der angegebene Dateiname eine moegliche Container-Datei ist.
private static boolean isGap(long start, long end)
          Prüft ob zwischen dem Index start und end eine Lücke ist.
(package private)  void iterClose()
          Schliesst das RandomAccessFile, das zum Iterieren verwendet wurde.
(package private)  ContainerDataIterator iterGetDataIterator()
          Liefert einen Iterator zum Durchlaufen aller Datensaetze des aktuellen Containers.
(package private)  ContainerDataIterator iterGetDataIterator(boolean considerDel)
          Liefert einen Iterator zum Durchlaufen aller Datensaetze des aktuellen Containers.
(package private)  ContainerDataIterator iterGetHeaderIterator()
           
(package private)  byte[] iterGetRawData(Inflater decompresser)
          Liefert den naechsten Datensatz so wie er im Container gespeichert wurde.
private  void iterLoadDataChunk(long stepBack)
          Springt stepBack Bytes in der Datei zurueck und liest Datensaetze aus in den Lese-Puffer bis dieser voll ist oder das Ende der Datei erreicht ist.
private  void iterLoadExtraBuffer(long stepBack, byte[] extraBuffer)
          Laedt den Datensatz in einen Extra-Puffer, weil er zu gross fuer den Standard-Buffer ist.
(package private)  boolean iterReadNextDataHdr()
          Prueft, ob ein weiterer Datensatz zur letzten Abfrage verfuegbar ist.
(package private)  void iterSkipData()
          Ueberspringt den naechsten Datensatz
(package private)  boolean iterStillCompressed()
           
(package private)  void leaveContainer()
          Beendet das Arbeiten mit dem zuvor ueber eine der accessContainer()-Methoden definierten Container.
private static long noModBits(long dataIndex)
           
static void prepareForPerformanceTest(byte[] testDat)
          Wenn diese Methode aufgerufen wird, koennen keine Daten archiviert werden.
(package private)  void readContainerHeader()
          Liest den Header der Container-Datei ein und springt im Eingabestrom an die Stelle hinter dem Header.
(package private)  void readContainerHeader(RandomAccessFile raf)
           
(package private)  void restoreHeader(File srcFile)
          Der Container-Header der Container-Datei, die mit der accessContainer()-Methode spezifiziert worden ist, wird mit dem Container-Header aus der angegebenen Container-Datei ueberschrieben.
(package private)  int serializeData(ResultData rd, long arcTime, Deflater compresser)
          Serialisiert den uebergebenen Datensatz und speichert ihn in actualWriteBuf und totalWriteDataSize.
(package private)  int serializeDataGap(long dataIndex, long dataTime, long archiveTime, Deflater compresser)
          Serialisiert einen Datensatz der eine Datenluecke kennzeichnet und speichert ihn in actualWriteBuf und totalWriteDataSize.
(package private)  int serializeReqData(ArchiveData ad, long arcTime, Deflater compresser)
          Serialisiert den uebergebenen Datensatz und speichert ihn in actualWriteBuf und totalWriteDataSize.
(package private)  void setContHdrParam(KeyValParam param, ArchiveDataKind val)
          Setzt einen Parameters im Container-Header.
(package private)  void setContHdrParam(KeyValParam param, boolean val)
          Setzt einen Parameters im Container-Header.
(package private)  void setContHdrParam(KeyValParam param, long val)
          Setzt einen Parameters im Container-Header.
(package private)  void setContHdrParam(KeyValParam param, String val)
          Setzt einen Parameters im Container-Header.
 void setListOfIndexesDeleted(RandomAccessFile raf)
          Erzeugt eine Liste der Datensatz-Indizes, die im durch raf spezifizierten Container vorkommen (sortiert)
private  void skipContainerHeader(RandomAccessFile raf)
          Springt im uebergebenen Eingabestrom an die Stelle hinter dem Header der Container-Datei.
 String toString()
           
 void writeContainerHeader()
          Schreibt die aktuellen Header-Parameter an den Anfang der Container-Datei.
private  byte[] writeDataModifier(ResultData rd)
          Wenn der Originaldatensatz keine Daten enthaelt, liefert diese Methode die Daten, die stattdessen im Container (zur Markierung) gespeichert werden sollen.
 void writeInitialContainerHeader()
          Schreibt die aktuellen Header-Parameter an den Anfang der Container-Datei.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

_debug

private static final Debug _debug

DEBUG_CALLS

private static final boolean DEBUG_CALLS
See Also:
Constant Field Values

VERSION_STRING

private static final byte[] VERSION_STRING
4 Byte langes Versionskennzeichen.


DATALEN_LEN

private static final int DATALEN_LEN
Laenge des Laengenbytes vor jedem Datensatz (4 Bytes, Integer).

See Also:
Constant Field Values

DATAHDR_LEN

private static final int DATAHDR_LEN
Laenge des Headers eines jeden Datensatzes. Archivzeitstempel (6B), Datenzeitstempel (6B), Datenindex (8B), Pruefsumme (4B).

See Also:
Constant Field Values

COMPRESS_LEN

private static final int COMPRESS_LEN
Laenge des Compress-Info-Feldes. Compress-Info enthaelt 0 bei unkomprimierten Datensatz, sonst dekomprimierte Laenge des komprimierten Datensatzes.

See Also:
Constant Field Values

NOT_COMPRESSED

public static final int NOT_COMPRESSED
Wert des Compress-Info-Feldes, wenn DS nicht komprimiert ist

See Also:
Constant Field Values

DECOMPRESS_QUERY_RESULTS

public static boolean DECOMPRESS_QUERY_RESULTS
Falls wahr, werden Archivanfragen komprimiert beantwortet (ist langsam, weil das Stream-Interface der Kernsoftware langsam ist)


NO_SOURCE

private static final byte[] NO_SOURCE
Datensatzbytes, falls "keine Quelle" signalisiert wurde


NO_DATA

private static final byte[] NO_DATA
Datensatzbytes, falls "keine Daten" signalisiert wurde


NO_RIGHTS

private static final byte[] NO_RIGHTS
Datensatzbytes, falls "keine Rechte" signalisiert wurde


POT_GAP

private static final byte[] POT_GAP
Datensatzbytes um eine potentielle Datenluecke zu kennzeichnen


MAX_UNCOMPRESSED

public static int MAX_UNCOMPRESSED
Datensaetze bis zu dieser Laenge bleiben immer unkomprimiert. Muss mindestens so gross sein wie NO_SOURCE, NO_DATA, POT_GAP lang sind!

Auf Integer.MAX_VALUE setzen, um die Komprimierung zu deaktivieren.


CONT_FILENAME_PREFIX

static final String CONT_FILENAME_PREFIX
Praefix eines Containerdateinamens.

See Also:
Constant Field Values

CONT_FILENAME_SUFFIX

static final String CONT_FILENAME_SUFFIX
Dateiendung eines Containerdateinamens.

See Also:
Constant Field Values

CONT_FILENAME_PAT

static final Pattern CONT_FILENAME_PAT
Regulaerer Ausdruck zur Erkennung von Containerdateinamen.


CONT_FILENAME_FILTER

public static final FilenameFilter CONT_FILENAME_FILTER
Filter zur Erkennung von Containerdateien anhand des Dateinamens.


BUFFER_SIZE

private static final int BUFFER_SIZE
Groesse der Daten-Puffer in Byte. Wenn eine Anfrage 10000 Unteranfragen enthaelt, werden auch 10000 ContainerFile-Objekte angelegt. Drum nicht zu gross waehlen. Bei Bedarf werden groessere Puffer extra angelegt.

See Also:
Constant Field Values

IS_PERFORMANCE_TEST

private static boolean IS_PERFORMANCE_TEST
Gibt an, ob gerade ein Performance-Test mit Dummy-Daten (um den Overhead durch Deserialisieren/Serialisieren zu vermeiden) laeuft.


PERF_TESTDATA

private static byte[] PERF_TESTDATA
Dummy-Daten fuer den Performance-Test.


deletedSpecialTreatment

private boolean deletedSpecialTreatment
Gibt an, ob ausgelagerte Container beim Nachfordern so behandelt werden, dass ein Iterator normal darüber iterieren kann


deletedHeaderFlag

private boolean deletedHeaderFlag
Gibt an, ob im aktuellen Container das "deleted"-Flag gesetzt ist


indexListSep

byte[] indexListSep
Gibt den Seperator an, der für den Datenindexlistenaufbau beim Löschen eines Containers verwendet wird


byte8Buf

private byte[] byte8Buf
Puffer zum Einlesen von Laengenbytes etc.


writeBuf

private byte[] writeBuf
Puffer zum Kopieren von Dateien oder Einlesen von Strings und Zahlen. Wird nur von ArchivTasks benutzt (und damit automatisch angelegt)


actualWriteBuf

private byte[] actualWriteBuf
Referenz auf den tatsaechlichen, von ContainerFile#serializeData(ResultData,long) verwendeten Puffer, der von writeBuf abweicht, falls dieser zu klein ist). Notwendig, da Daten vorserialisiert werden müssen, um deren Länge zu bestimmen.


totalWriteDataSize

private int totalWriteDataSize
Laenge des von ContainerFile#serializeData(ResultData,long) serialisierten Datensatzes.


readBuf

private byte[] readBuf
Puffer zum Ein-/Auslesen des Container-Headers und anderer Daten. Muss ein extra Puffer sein, damit man zwischen dem Vorserialisieren und dem tatsächlichen Schreiben eines Datensatzes z.B. einen neuen Container anlegen kann (dazu muss man einen Header schreiben) ohne das vorserialisierte Datum zu beschaedigen.


dataIter

private ContainerDataIterator dataIter
Iterator fuer das Durchlaufen angefragter Datensaetze aus einem Container.


bos

private ByteArrayOutputStream bos
Puffer fuer den Serialisierer und zum Lesen eines Datensatzes.


serializer

private Serializer serializer
Datensatz-Serialisierer.


containerHdr

private ContainerHdr containerHdr
Container-Header Parameter als Key/Value-Paare. Die Parameter sind in KeyValParam statisch deklariert. Als Key eines Parameters wird KeyValParam.getKey() benutzt.


objId

private long objId
Aktuelle Objekt-ID.


atgId

private long atgId
Aktuelle Attributgruppen-ID.


aspId

private long aspId
Aktuelle Aspekt-ID.


sv

private int sv
Aktuelle Simulationsvariante.


dataKind

private ArchiveDataKind dataKind
Aktuelle Datensatzart.


containerId

private long containerId
Aktuelle Container-ID.


contFile

private File contFile
Aktuelle Container-Datei.


accessed

private boolean accessed
Container adressiert.


readOnly

private boolean readOnly
Container read-only adressiert.


headerRead

private boolean headerRead
Container-Header eingelesen.


iterRaf

private RandomAccessFile iterRaf
Container-Datei. Ist ein RandomAccessFile, da Rueckspruenge noetig sind, wenn der letzte Datensatz nur teilweise in den Puffer eingelesen wurde.


iterIsHdrIterator

private boolean iterIsHdrIterator
Wahr, falls der Iterator nur ueber Min- und Maxwert aus dem Container-Header iteriert.


iterBufPos

private int iterBufPos
Position innerhalb des Puffers im Speicher. Bei iterIsHdrIterator der Zaehler fuer gelieferten Min- und Maxwert.


iterUncompressedLen

private int iterUncompressedLen
Unkomprimierte Laenge des Datensatzes (oder 0 falls dieser nicht komprimiert ist).


iterBytesRead

private int iterBytesRead
Zahl der beim letzten iterLoadDataChunk() gelesenen Bytes.


iterNextDataLen

private int iterNextDataLen
Laenge des naechsten Datensatzes (wird in iterReadNextData() besetzt)


iterDataRead

private boolean iterDataRead
Marker, ob nach jedem iterReadNextData() genau einmal iterGetDataElem() aufgerufen wurde (sonst stimmt die readPos nicht)


iterEOC

private boolean iterEOC
Wahr, wenn das Ende eines Containers erreicht ist


iterlistOfDataIdx

private ArrayList<Long> iterlistOfDataIdx
Für gelöschte Container beim Nachfordern:
Liste der Datenindizes im Container


iterlistOfDataIdxPos

private int iterlistOfDataIdxPos
Für gelöschte Container beim Nachfordern:
aktuelle Position in der Liste der Datenindizes


_cacheManager

private final CacheManager _cacheManager

_cache

private CacheManager.Cache _cache

HEADER_LENGTH

private static int HEADER_LENGTH
Constructor Detail

ContainerFile

ContainerFile()
Konstruktor fuer ContainerFile.

Method Detail

prepareForPerformanceTest

public static void prepareForPerformanceTest(byte[] testDat)
Wenn diese Methode aufgerufen wird, koennen keine Daten archiviert werden. Stattdessen werden Dummy-Daten mit bekannter Laenge archiviert, um die Performance des Speichersystems testen zu koennen.

Parameters:
testDat - Daten, die pro Datensatz in die Container geschrieben werden.

compareContainerFile

public long compareContainerFile(long fileID2CompareWith)
Vergleicht die ID's von zwei ContainerFiles
grösser 0, wenn die ID dieses ContainerFiles grösser ist, als die zu Vergleichende
kleiner 0, wenn sie kleiner ist als die zu Vergleichende
0, wenn sie gleich sind

Parameters:
fileID2CompareWith -
Returns:
das ergebnis

compareContainerFile

public static long compareContainerFile(File file1,
                                        File file2)
                                 throws PersistenceException
Vergleicht die ID's von zwei ContainerFiles:
- grösser 0, wenn die ID des ersten ContainerFiles grösser ist, als die Zweite;
- kleiner 0, wenn sie kleiner ist als die Zweite;
- 0, wenn sie gleich sind.

Parameters:
file1 - das erste File
file2 - das zweite File
Returns:
Throws:
PersistenceException - falls die Dateien keine ContainerFiles sind

toString

public String toString()
Overrides:
toString in class Object

isContainerFile

public static boolean isContainerFile(File f)
Liefert Kennzeichen, ob die angegebene Datei eine Container-Datei ist.

Parameters:
f - Datei
Returns:
Kennzeichen

isContainerFileName

public static boolean isContainerFileName(String name)
Liefert Kennzeichen, ob der angegebene Dateiname eine moegliche Container-Datei ist.

Parameters:
name - Dateiname
Returns:
Kennzeichen

getContID

public static long getContID(File file)
Liefert die Container-ID zur angegebenen Container-Datei, indem die im Container-Dateinamen enthaltene Container-ID ausgelesen wird. Alternativ kann die Container-ID aus den Container-Header-Parametern gelesen werden; siehe dazu #getContainerHeaderParam(KeyValParam).

Parameters:
file - Container-Datei
Returns:
Container-ID

getContID

public static long getContID(String fileName)
Liefert die Container-ID zum angegebenen Container-Datei-Namen, indem die im Container-Dateinamen enthaltene Container-ID ausgelesen wird. Alternativ kann die Container-ID aus den Container-Header-Parametern gelesen werden; siehe dazu #getContainerHeaderParam(KeyValParam).

Parameters:
file - Container-Datei
Returns:
Container-ID

getContainerFileName

public static String getContainerFileName(long containerId)
Liefert den Dateinamen des Daten-Containers mit der angegebenen Container-ID.

Parameters:
containerId - Container-ID
Returns:
Dateiname

accessContainer

void accessContainer(long objId,
                     long atgId,
                     long aspId,
                     int sv,
                     ArchiveDataKind dataKind,
                     long contId,
                     File containerDir)
               throws PersistenceException
Definiert auf welchem Container die folgenden Methoden-Aufrufe wirksam sein sollen. Muss immer aufgerufen werden bevor mit einem Container gearbeitet werden kann. Der Containerdateiname wird aus der Container-ID gebildet. Soll der Zugriff auf diesen Container beendet werden (um z.B. einen anderen Container zu adressieren), muss dazu die Methode leaveContainer() aufgerufen werden.

Parameters:
objId - Objekt-ID (muss >= 0 sein)
atgId - Attributgruppen-ID (muss >= 0 sein)
aspId - Aspekt-ID (muss >= 0 sein)
sv - Simulationsvariante (zwischen 0 und 999)
dataKind - Datensatzart
contId - Container-ID (muss zwischen 0 und 2^40-1 liegen)
containerDir - Pfad des Verzeichnisses, das die Container-Datei enthaelt
Throws:
PersistenceException

accessContainerReadOnly

void accessContainerReadOnly(File contFile)
                       throws PersistenceException
Definiert auf welchem Container die folgenden Methoden-Aufrufe wirksam sein sollen. Es koennen nur lesende Operationen auf die Container-Datei ausgeführt werden. Vorgesehen fuer den Zugriff auf Container, die bereits auf ein Medium vom Typ B ausgelagert sind. Soll der Zugriff auf diesen Container beendet werden (um z.B. einen anderen Container zu adressieren), muss dazu die Methode leaveContainer() aufgerufen werden. Die Containerdatei kann einen beliebigen Namen haben.

Parameters:
contFile - Containerdatei (muss existieren)
Throws:
PersistenceException

flushCache

private final void flushCache()
                       throws PersistenceException
Throws:
PersistenceException

forgetCache

private final void forgetCache()

leaveContainer

void leaveContainer()
              throws PersistenceException
Beendet das Arbeiten mit dem zuvor ueber eine der accessContainer()-Methoden definierten Container. Diese Methode muss aufgerufen werden, wenn danach auf einen anderen Container zugegriffen werden soll. Die Methode prueft nicht, ob ein Container vorher mit #accessContainer(long, long,long,int,ArchiveDataKind,long,String) definiert wurde. D.h., man kann diese Methode mehrfach aufrufen. Dadurch wird die Ausnahmebehandlung erleichtert.

Throws:
PersistenceException

existsContainer

boolean existsContainer()
                  throws PersistenceException
Liefert Kennzeichen, ob bereits eine Container-Datei fuer den mit #accessContainer(long,long,long,int,ArchiveDataKind,long,String) spezifizierten Container besteht.

Returns:
Kennzeichen
Throws:
PersistenceException

createContainer

void createContainer(boolean toSave)
               throws PersistenceException
Erzeugt eine neue Container-Datei fuer den mit accessContainer() spezifizierten Container. Schreibt den Container-Header und befuellt diesen mit den angegebenen Parametern.

Parameters:
toSave - Sichern
Throws:
PersistenceException

closeContainer

void closeContainer(long containerEntries,
                    long minArcTime,
                    long maxArcTime,
                    long minDataTime,
                    long maxDataTime,
                    long minDataIdx,
                    long maxDataIdx,
                    long vorhalteZeit)
              throws PersistenceException
Schliesst die Container-Datei fuer den mit einer der accessContainer()-Methoden spezifizierten Container. Der Container-Header wird entsprechend aktualisiert.

Parameters:
containerEntries - Anzahl Datensaetze im Container
minArcTime - Minimaler Archivzeitstempel im Container
maxArcTime - Maximaler Archivzeitstempel im Container
minDataTime - Minimaler Datenzeitstempel im Container
maxDataTime - Maximaler Datenzeitstempel im Container
minDataIdx - Minimaler Datenindex im Container
maxDataIdx - Maximaler Datenindex im Container
vorhalteZeit - parametrierte Vorhaltezeit in Sekunden
Throws:
PersistenceException

closeContainerRecount

public void closeContainerRecount(long vorhalteZeit)
                           throws PersistenceException
Schliesst einen Container, indem jeder Datensatz-Header des Containers gelesen wird, um die Min-/Max-Werte und die Anzahl der Datensaetze zu bestimmen. Die Information der Indexe reicht nicht aus, weil dort die Anzahl der Datensaetze nicht verfuegbar ist.

Parameters:
vorhalteZeit - parametrierte Vorhaltezeit in Sekunden
Throws:
PersistenceException

isContainerClosed

boolean isContainerClosed()
                    throws PersistenceException
Prueft ob der mit einer der accessContainer()-Methoden spezifizierte Container bereits abgeschlossen ist.

Returns:
Kennzeichen, ob Container abgeschlossen ist
Throws:
PersistenceException

createDefaultContainerHeader

private void createDefaultContainerHeader(boolean toSave)
                                   throws PersistenceException
Erzeugt Default-Header-Parameter fuer den Anfang einer neuen Container-Datei. Bevor mit writeContainerHeader() der Header geschrieben werden kann, muss entweder mit dieser Methode ein neuer Header erzeugt oder mit readContainerHeader() ein Header eingelesen werden.

Parameters:
toSave - Sichern
Throws:
PersistenceException

writeContainerHeader

public void writeContainerHeader()
                          throws PersistenceException
Schreibt die aktuellen Header-Parameter an den Anfang der Container-Datei. Bei einer neuen leeren Datei werden die Parameter an den Anfang der Datei angehangen, bei einer zu aendernden Container-Datei werden die vorhandenen Parameter ueberschrieben. Bevor mit dieser Methode der Header geschrieben werden kann, muss entweder mit #createDefaultContainerHeader(boolean,long) neuer Header erzeugt oder mit {@link #readContainerHeader()} ein Header eingelesen worden sein.

Throws:
PersistenceException

writeInitialContainerHeader

public void writeInitialContainerHeader()
                                 throws PersistenceException
Schreibt die aktuellen Header-Parameter an den Anfang der Container-Datei. Bei einer neuen leeren Datei werden die Parameter an den Anfang der Datei angehangen, bei einer zu aendernden Container-Datei werden die vorhandenen Parameter ueberschrieben. Bevor mit dieser Methode der Header geschrieben werden kann, muss entweder mit #createDefaultContainerHeader(boolean,long) neuer Header erzeugt oder mit {@link #readContainerHeader()} ein Header eingelesen worden sein.

Throws:
PersistenceException

readContainerHeader

void readContainerHeader(RandomAccessFile raf)
                   throws PersistenceException
Throws:
PersistenceException

readContainerHeader

void readContainerHeader()
                   throws PersistenceException
Liest den Header der Container-Datei ein und springt im Eingabestrom an die Stelle hinter dem Header. Die Container-Header Parameter stehen dann als Key/Value-Paare zur Verfuegung und koennen mit #getContainerHeaderParam(KeyValParam) abgefragt werden. Bevor mit writeContainerHeader() der Header geschrieben werden kann, muss entweder mit dieser Methode der Header eingelesen oder mit #createDefaultContainerHeader(boolean,long) ein neuer Header erzeugt werden.

Throws:
PersistenceException

skipContainerHeader

private void skipContainerHeader(RandomAccessFile raf)
                          throws IOException
Springt im uebergebenen Eingabestrom an die Stelle hinter dem Header der Container-Datei. Voraussetzung ist, dass das RandomAccessFile am Anfang der Datei steht.

Parameters:
raf - RandomAccessFile der Container-Datei
Throws:
IOException

getContHdrParamAsString

String getContHdrParamAsString(KeyValParam param)
                         throws PersistenceException
Nachdem mit readContainerHeader() der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. Wirft eine PersistenceException, falls der Parameter nicht gefunden wurde. Liefert den Wert des Parameters unabhaengig von dessen Typ immer als String zurueck.

Parameters:
param - Container-Header-Parameter
Returns:
Parameter-Wert als String
Throws:
PersistenceException

getContHdrParamAsArchiveDataKind

ArchiveDataKind getContHdrParamAsArchiveDataKind(KeyValParam param)
                                           throws PersistenceException
Nachdem mit readContainerHeader() der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. Liefert den Wert des Parameters als Datensatzart zurueck. Wirft eine PersistenceException, falls der Parameter nicht gefunden wurde oder nicht in den Typ ArchiveDataKind umgeformt werden kann.

Parameters:
param - Container-Header-Parameter
Returns:
Datensatzart
Throws:
PersistenceException

getContHdrParamAsLong

long getContHdrParamAsLong(KeyValParam param)
                     throws PersistenceException
Nachdem mit readContainerHeader() der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. Liefert den Wert des Parameters als numerischen Wert vom Typ long zurueck. Wirfte eine PersistenceException, falls der Parameter nicht gefunden wurde oder nicht in den Typ long umgeformt werden kann.

Parameters:
param - Container-Header-Parameter
Returns:
Ganzzahl als long
Throws:
PersistenceException

getContHdrParamAsInt

int getContHdrParamAsInt(KeyValParam param)
                   throws PersistenceException
Throws:
PersistenceException

getContHdrParamAsBool

boolean getContHdrParamAsBool(KeyValParam param)
                        throws PersistenceException
Throws:
PersistenceException

setContHdrParam

void setContHdrParam(KeyValParam param,
                     long val)
               throws PersistenceException
Setzt einen Parameters im Container-Header. Der Header muss vorher entweder gelesen oder mit Default-Werten erzeugt worden sein. Wirft eine PersistenceException, wenn die Aenderung nicht durchgefuehrt werden kann.

Parameters:
param - Container-Header-Parameter
val - Numerischer Wert des Container-Header-Parameters
Throws:
PersistenceException

setContHdrParam

void setContHdrParam(KeyValParam param,
                     boolean val)
               throws PersistenceException
Setzt einen Parameters im Container-Header. Der Header muss vorher entweder gelesen oder mit Default-Werten erzeugt worden sein. Wirft eine PersistenceException, wenn die Aenderung nicht durchgefuehrt werden kann.

Parameters:
param - Container-Header-Parameter
val - Wahrheitswert des Container-Header-Parameters
Throws:
PersistenceException

setContHdrParam

void setContHdrParam(KeyValParam param,
                     String val)
               throws PersistenceException
Setzt einen Parameters im Container-Header. Der Header muss vorher entweder gelesen oder mit Default-Werten erzeugt worden sein. Wirft eine PersistenceException, wenn die Aenderung nicht durchgefuehrt werden kann.

Parameters:
param - Container-Header-Parameter
val - Textwert des Container-Header-Parameters
Throws:
PersistenceException

setContHdrParam

void setContHdrParam(KeyValParam param,
                     ArchiveDataKind val)
               throws PersistenceException
Setzt einen Parameters im Container-Header. Der Header muss vorher entweder gelesen oder mit Default-Werten erzeugt worden sein. Wirft eine PersistenceException, wenn die Aenderung nicht durchgefuehrt werden kann.

Parameters:
param - Container-Header-Parameter
val - Datensatzart des Container-Header-Parameters
Throws:
PersistenceException

restoreHeader

void restoreHeader(File srcFile)
             throws PersistenceException
Der Container-Header der Container-Datei, die mit der accessContainer()-Methode spezifiziert worden ist, wird mit dem Container-Header aus der angegebenen Container-Datei ueberschrieben.

Parameters:
srcFile - Container-Datei
Throws:
PersistenceException

createWriteBuffers

private void createWriteBuffers()
Legt alle zum Schreiben benoetigte Puffer an. Wird nur von Schreib-Methoden aufgerufen. Lesende Tasks beanspruchen so erheblich weniger Speicher.


serializeData

int serializeData(ResultData rd,
                  long arcTime,
                  Deflater compresser)
            throws PersistenceException
Serialisiert den uebergebenen Datensatz und speichert ihn in actualWriteBuf und totalWriteDataSize. Da der ArchivTask vor dem Archivieren wissen muss, ob der Container zu lang wird und abgeschlossen werden muss, ist das Anhaengen eines Datensatzes auf die Methoden ContainerFile#serializeData(ResultData,long) und appendSerializedData() aufgeteilt. Wenn der Datensatz ein Spezialfall ist (keine Quelle, keine Daten, Datenluecke), wird ein speziell codierter Datensatz verwendet.

Parameters:
rd - Zu archivierender Datensatz
arcTime - Archivzeitstempel
Returns:
Laenge des serialisierten Datensatzes
Throws:
PersistenceException

serializeReqData

int serializeReqData(ArchiveData ad,
                     long arcTime,
                     Deflater compresser)
               throws PersistenceException
Serialisiert den uebergebenen Datensatz und speichert ihn in actualWriteBuf und totalWriteDataSize. Da der ArchivRequestedTask vor dem Archivieren wissen muss, ob der Container zu lang wird und abgeschlossen werden muss, ist das Anhaengen eines Datensatzes auf die Methoden ContainerFile#serializeReqData(ArchivetData,long) und appendSerializedData() aufgeteilt. Wenn der Datensatz ein Spezialfall ist (keine Quelle, keine Daten), wird ein speziell codierter Datensatz verwendet.

Diese Methode wird zum serialisieren von nachgeforderten Datensaetzen verwendet.

Parameters:
ad - Zu archivierender Datensatz
arcTime - Archivzeitstempel
Returns:
Laenge des serialisierten Datensatzes
Throws:
PersistenceException

serializeDataGap

int serializeDataGap(long dataIndex,
                     long dataTime,
                     long archiveTime,
                     Deflater compresser)
               throws PersistenceException
Serialisiert einen Datensatz der eine Datenluecke kennzeichnet und speichert ihn in actualWriteBuf und totalWriteDataSize. Da der ArchivTask vor dem Archivieren wissen muss, ob der Container zu lang wird und abgeschlossen werden muss, ist das Anhaengen eines Datensatzes auf die Methoden ContainerFile#serializeData(ResultData,long) und appendSerializedData() aufgeteilt.

Parameters:
dataIndex - Datenindex
dataTime - Datenzeit
archiveTime - Archivzeit
Returns:
Laenge des serialisierten Datensatzes
Throws:
PersistenceException

embedSerialializedData

int embedSerialializedData(long arcTime,
                           long dataTime,
                           long dataIdx,
                           byte[] serData,
                           byte[] dest,
                           Deflater compresser)
                     throws PersistenceException
Schreibt das Bytefeld mit allen Datensatz-Headern, so dass es mit appendSerializedData() geschrieben werden kann. Von aussen wird diese Methode nur fuer Testzwecke verwendet. Normalerweise sind die Methoden ContainerFile#serializeData(ResultData,long) bzw. ContainerFile#serializeReqData(ResultData,long) zu verwenden. Die Daten werden komprimiert abgelegt, wenn sie laenger als MAX_UNCOMPRESSED sind und die Kompression eine Verkuerzung ergeben hat.

Parameters:
aTime - Archivzeit
dTime - Datenzeit
dIdx - Datenindex
serData - zu schreibendes Bytefeld
dest - Ziel
Returns:
Laenge des serialisierten Datensatzes
Throws:
PersistenceException

appendSerializedDataRaf

void appendSerializedDataRaf()
                       throws PersistenceException
Haengt den bereits mit ContainerFile#preserializeData(ResultData,long) uebergebenen und serialisierten Datensatz an die aktuelle Container-Datei an.

Throws:
PersistenceException

appendSerializedData

void appendSerializedData()
                    throws PersistenceException
Haengt den bereits uebergebenen und serialisierten Datensatz an die aktuelle Container-Datei an.

Throws:
PersistenceException

writeDataModifier

private byte[] writeDataModifier(ResultData rd)
                          throws PersistenceException
Wenn der Originaldatensatz keine Daten enthaelt, liefert diese Methode die Daten, die stattdessen im Container (zur Markierung) gespeichert werden sollen. Derartige Daten werden nur vom DAV erzeugt und muessen deswegen immer ONLINE sein.

Parameters:
rd - Datensatz
Returns:
Daten bzw. null, falls ein Fehler vorliegt
Throws:
PersistenceException

countContainerEntries

int countContainerEntries()
                    throws PersistenceException
Zaehlt die Anzahl der Datensaetze in dem mit einer accessContainer()-Methode im Zugriff befindlichen Container durch Iterieren ueber die Datensaetze in der Container-Datei. Diese Methode ist nur notwendig, wenn ein noch nicht abgeschlossener Container wieder befuellt wird, weil dann die Anzahl nicht im Header steht. Im Normalbetrieb wird die Anzahl im DataIdentNode mitgefuehrt.

Returns:
Anzahl Datensaetze im Container
Throws:
PersistenceException

getContainerSize

long getContainerSize()
                throws PersistenceException
Ermittelt die Gesamtlaenge des mit accessContainer() im Zugriff befindlichen Containers.

Returns:
Laenge der Container-Datei
Throws:
PersistenceException

getHeaderLen

public static int getHeaderLen()
Ermittelt die Gesamtlaenge des mit accessContainer() im Zugriff befindlichen Containers.

Returns:
Laenge der Container-Datei
Throws:
PersistenceException

getTotalDataOverhead

public static int getTotalDataOverhead()
Ermittelt den vollstaendigen Overhead fuer einen Datensatz. Inklusive Laengenbyte, Datensatz-Header, Compress-Feld und abschliessendem Separator.

Returns:

deleteContainerData

void deleteContainerData()
                   throws PersistenceException
Loescht alle Datensaetze eines Datencontainers, so dass lediglich der Header mit der Verwaltungs-Information in der Datei erhalten bleibt.

Das Header-Flag darf keinesfalls vor dem Loeschen der Daten auf "geloescht" gesetzt werden!

Update 03/05/2006:
Schreibt eine optimierte Liste der Datenindizes (siehe createDataIndexBuffer()) in den Body des Datencontainers, damit Datensaetze aus geloeschten Containern beim Nachfordern ignoriert werden koennen.

Throws:
PersistenceException

createDataIndexBuffer

byte[] createDataIndexBuffer()
                       throws PersistenceException
Erzeugt eine verkürzte Liste von Datenindizes, die im aktuellen Datencontainer archiviert sind und schreibt sie in ein Byte-Array (falls z.B. 0,4,8,16,24,28,32 die Indizes der Datensätze sind, wird daraus: 0-8,16,24-32)

Returns:
die Liste als Byte-Array
Throws:
PersistenceException

isGap

private static boolean isGap(long start,
                             long end)
Prüft ob zwischen dem Index start und end eine Lücke ist.

Parameters:
start -
end -
Returns:

noModBits

private static long noModBits(long dataIndex)

iterGetDataIterator

ContainerDataIterator iterGetDataIterator(boolean considerDel)
                                    throws PersistenceException
Liefert einen Iterator zum Durchlaufen aller Datensaetze des aktuellen Containers.

Parameters:
atg - Attributgruppe fuer das Deserialisieren der Datensaetze. Kann null sein, falls die Datensaetze nur uebersprungen werden sollen.

Vorsicht: Der ContainerDataIterator verwendet den Lesepuffer der Klasse ContainerFile. Andere Leseoperationen koennen den Lesepuffer ueberschreiben, so dass der ContainerDataIterator nicht mehr funktioniert.

considerDeleted - Gibt an, ob ausgelagerte Container besonders behandelt werden sollen.
Returns:
ContainerDataIterator fuer das Durchlaufen der Datensaetze
Throws:
PersistenceException

iterGetHeaderIterator

ContainerDataIterator iterGetHeaderIterator()
                                      throws PersistenceException
Throws:
PersistenceException

setListOfIndexesDeleted

public void setListOfIndexesDeleted(RandomAccessFile raf)
                             throws IOException
Erzeugt eine Liste der Datensatz-Indizes, die im durch raf spezifizierten Container vorkommen (sortiert)

Parameters:
raf -
Throws:
IOException

getListOfIndexesDeleted

public ArrayList<Long> getListOfIndexesDeleted()

iterGetDataIterator

ContainerDataIterator iterGetDataIterator()
                                    throws PersistenceException
Liefert einen Iterator zum Durchlaufen aller Datensaetze des aktuellen Containers.

Parameters:
atg - Attributgruppe fuer das Deserialisieren der Datensaetze. Kann null sein, falls die Datensaetze nur uebersprungen werden sollen.

Vorsicht: Der ContainerDataIterator verwendet den Lesepuffer der Klasse ContainerFile. Andere Leseoperationen koennen den Lesepuffer ueberschreiben, so dass der ContainerDataIterator nicht mehr funktioniert.

Returns:
ContainerDataIterator fuer das Durchlaufen der Datensaetze
Throws:
PersistenceException

iterReadNextDataHdr

boolean iterReadNextDataHdr()
                      throws PersistenceException
Prueft, ob ein weiterer Datensatz zur letzten Abfrage verfuegbar ist. Wird vom ContainerDataIterator benutzt, um ueber Datensaetze zu iterieren.

Returns:
Kennzeichen
Throws:
PersistenceException

iterLoadDataChunk

private void iterLoadDataChunk(long stepBack)
                        throws PersistenceException
Springt stepBack Bytes in der Datei zurueck und liest Datensaetze aus in den Lese-Puffer bis dieser voll ist oder das Ende der Datei erreicht ist. Der letzte Datensatz wird ggf. dabei nur teilweise gelesen. Dies muss die aufrufende Methode erkennen und bei naechsten Aufruf den Parameter stepBack entsprechend setzen.

Parameters:
stepBack - Zahl der Bytes, um die von der momentanen Position des Dateizeigers zurueckgesprungen wird.
Throws:
PersistenceException

iterLoadExtraBuffer

private void iterLoadExtraBuffer(long stepBack,
                                 byte[] extraBuffer)
                          throws PersistenceException
Laedt den Datensatz in einen Extra-Puffer, weil er zu gross fuer den Standard-Buffer ist.

Parameters:
stepBack - Zahl der Bytes, um die von der momentanen Position des Dateizeigers zurueckgesprungen wird.
extraBuffer - Extra-Puffer
Throws:
PersistenceException

iterSkipData

void iterSkipData()
            throws PersistenceException
Ueberspringt den naechsten Datensatz

Throws:
PersistenceException

iterStillCompressed

boolean iterStillCompressed()
Returns:
Ob der Datensatz auch nach #iterGetRawData() nocj komprimiert ist. Wenn DECOMPRESS_QUERY_RESULTS gesetzt ist, werden aus Performancegruenden die Ergebnisdaten bereits im Archivsystem dekomprimiert (das Stream-Interface der Kernsoftware ist etwas langsam).

iterGetRawData

byte[] iterGetRawData(Inflater decompresser)
                throws PersistenceException
Liefert den naechsten Datensatz so wie er im Container gespeichert wurde.

Throws:
PersistenceException

iterClose

void iterClose()
         throws PersistenceException
Schliesst das RandomAccessFile, das zum Iterieren verwendet wurde.

Throws:
PersistenceException

checkContainerAccessed

private void checkContainerAccessed()
                             throws PersistenceException
Prueft, ob ein Container zum Lesen im Zugriff ist. Wirft eine PersistenceException falls nicht.

Throws:
PersistenceException

checkContainerAccessedRW

private void checkContainerAccessedRW()
                               throws PersistenceException
Prueft, ob ein Container zum Lesen und Schreiben im Zugriff ist. Wirft eine PersistenceException falls nicht.

Throws:
PersistenceException

checkContainerAccessedHeaderRead

private void checkContainerAccessedHeaderRead()
                                       throws PersistenceException
Prueft, ob ein Container zum Lesen im Zugriff ist und dessen Container-Header bereits eingelesen ist. Wirft eine PersistenceException falls nicht.

Throws:
PersistenceException

getBuf

private static byte[] getBuf(byte[] defaultBuffer,
                             int desiredSize)
Liefert den uebergebenen Puffer falls dessen Groesse ausreichend ist, andernfalls einen neu angelegten. Zweck: sowenig Arbeit für die Speicherverwaltung wie moeglich.

Parameters:
defaultBuffer - Vorhandener Puffer
desiredSize - Gewuenschte Puffergroesse
Returns:
Byte-Array-Puffer

closeRandomAccessFile

private void closeRandomAccessFile(RandomAccessFile raf)
                            throws PersistenceException
Schliesst ein RandomAccessFile und faengt die Exception ab. (Nur zur Abkuerzung verwendet).

Parameters:
raf - Zu schliessendes RandomAccessFile
Throws:
PersistenceException

getContainerId

long getContainerId()

getContFile

File getContFile()

getObjId

long getObjId()

getAtgId

long getAtgId()

getAspId

long getAspId()

getSv

int getSv()