public class PersistenceManager
extends java.lang.Object
Zentrale Persistenz-Verwaltung für die Archivierung von Daten auf einem Speichermedium vom Typ A (Festplatte) und die entsprechende Meta-Daten-Verwaltung.
Modifier and Type | Class and Description |
---|---|
private class |
PersistenceManager.ConsistencyCheckWorker |
private class |
PersistenceManager.IndexCloserWorker |
Modifier and Type | Field and Description |
---|---|
private boolean |
_preventWriteStartupInfo |
private static java.lang.ThreadLocal<byte[]> |
_tmpMem |
static java.lang.String |
ACTIVITY_FLAG_FILE_NAME
Dateiname des Lock-Files des Archivsystems.
|
private java.lang.String |
archivePath |
private ArchiveManager |
archivMgr |
private static java.util.regex.Pattern |
ASP_DIRNAME_PAT |
private static java.lang.String |
ASP_ID_PREFIX |
private static java.util.regex.Pattern |
ATG_DIRNAME_PAT |
private static java.lang.String |
ATG_ID_PREFIX |
private java.util.Map<Task,java.util.Map<java.lang.Long,ContainerFile>> |
containerFileMap
Jede Task richtet ihre Persistanz-Anfragen an den Persistenz-Manager.
|
static java.lang.String[] |
DATAKIND_SUFFIX
Verzeichnisnamen der Datensatzarten.
|
private static int |
directoryCount
Zaehlt die besuchten Verzeichnisse beim Pruefen des Persistenzverzeichnisses
|
private java.io.File |
isActive
Die Datei zeigt an, ob das Persistenzverzeichnis von einem Archivsystem gerade benutzt wird.
|
private Debug |
logger |
private java.util.concurrent.atomic.AtomicLong |
nextContainerID
Enthaelt die zuletzt verwendete ContainerID
|
private static java.util.regex.Pattern |
NUM_DIR_PAT |
private static java.util.regex.Pattern |
OBJ_DIRNAME_PAT |
private static java.lang.String |
OBJ_ID_PREFIX |
static java.lang.String |
REBUILDINDEX_FILE_FLAG_NAME
Eine Datei dieses Namens wird pro Verzeichnis einer Datenidentifikation/Datensatzart angelegt, wenn ein neuer Datensatz archiviert wurde und der Index moeglicherweise (wg.
|
private static int |
REBUILDINDEX_IDX_SIZE
Zum Wiederaufbau der Indexe werden temporaer Indexe dieser Größe angelegt
|
private StartupProperties |
startupProps |
private static java.util.regex.Pattern |
SV_DIRNAME_PAT |
private static java.lang.String |
SV_PREFIX |
private static java.util.Set<java.lang.String> |
VALID_SUFFIXES |
Constructor and Description |
---|
PersistenceManager(ArchiveManager archMgr,
java.lang.String archPath)
Erzeugt den Persistenz-Manager.
|
Modifier and Type | Method and Description |
---|---|
void |
accessContainer(Task task,
int cfIdx,
long objId,
long atgId,
long aspId,
int sv,
ArchiveDataKind dataKind,
long containerId)
Assoziiert den angegebenen Task mit dem spezifizierten Container, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken.
|
void |
accessContainer(Task task,
int cfIdx,
long objId,
long atgId,
long aspId,
int sv,
ArchiveDataKind dataKind,
java.lang.String pathName,
boolean createDir,
long containerId)
Assoziiert den angegebenen Task mit dem spezifizierten Container, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken.
|
void |
accessContainer(Task task,
long cfIdx,
IdDataIdentification did,
ArchiveDataKind dataKind,
long containerId)
Assoziiert den angegebenen Task mit dem spezifizierten Container, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken.
|
void |
accessContainer(Task task,
long objId,
long atgId,
long aspId,
int sv,
ArchiveDataKind dataKind,
long containerId)
Assoziiert den angegebenen Task mit dem spezifizierten Container, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken.
|
void |
accessContainer(Task task,
long objId,
long atgId,
long aspId,
int sv,
ArchiveDataKind dataKind,
java.lang.String pathName,
boolean createDir,
long containerId)
Assoziiert den angegebenen Task mit dem spezifizierten Container, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken.
|
void |
accessContainer(Task task,
java.lang.String didPath,
long containerId)
Assoziiert den angegebenen Task mit dem spezifizierten Container, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken.
|
void |
accessContainerReadOnly(Task task,
java.io.File contFile)
Assoziiert den angegebenen Task mit der angegebenen Containerdatei, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken.
|
void |
accessContainerReadOnly(Task task,
int cfIdx,
java.io.File contFile)
Assoziiert den angegebenen Task mit der angegebenen Containerdatei, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken.
|
static void |
appendPathName(java.lang.StringBuilder pathName,
java.lang.String basePath,
long objId,
long atgId,
long aspId,
int sv)
Ergänzt das übergebene StringBuilder-Objekt um den Archiv-Pfad für die angegebene Datenidentifikation und den Wurzelpfad des Archivsystems.
|
void |
appendSerializedData(Task task)
Haengt den uebergebenen, serialisierten Archivdatensatz an den mit
accessContainer(Task,long,long,long,int,ArchiveDataKind,long) spezifizierten Container an. |
void |
assignIndexes(DataIdentTree dit,
ArchiveDataSpecification ads,
ArchiveDataKind adk,
Task task,
byte[] tempMem)
Weist, falls nicht bereits geschehen, dem DataIdentNode seine Indexe zu.
|
void |
assignIndexes(DataIdentTree dit,
IdDataIdentification ads,
ArchiveDataKind adk,
Task task,
byte[] tempMem) |
void |
assignIndexes(DataIdentTree dit,
long objID,
long atgID,
long aspID,
int sv,
ArchiveDataKind archiveDataKind,
Task task,
byte[] tempMem)
Weist, falls nicht bereits geschehen, dem DataIdentNode seine Indexe zu.
|
private void |
checkPersDirNode(java.io.File curDir,
DataIdentTree dit,
java.lang.String mode,
java.util.concurrent.ExecutorService threadPool,
java.util.concurrent.atomic.AtomicBoolean allValid,
java.util.concurrent.atomic.AtomicInteger numVisited) |
void |
checkPersistenceDir(java.lang.String mode)
Prueft das Persistenzverzeichnis auf fremde Dateien und Verzeichnisse und falsche Reihenfolgen von ID-Verzeichnissen.
|
void |
closeContainer(Task task,
DataIdentNode din,
ArchiveDataKind adk)
Schliesst die Container-Datei für den mit
accessContainer(Task,long,long,long,int,ArchiveDataKind,long) spezifizierten Container. |
void |
closeContainerRecount(Task task,
DataIdentNode din,
ArchiveDataKind adk)
Schliesst einen Container, indem jeder Datensatz-Header des Containers gelesen wird, um die Min-/Max-Werte und die Anzahl der Datensätze zu bestimmen.
|
boolean |
closeIndex(DataIdentNode din,
IdDataIdentification dataIdentification,
ArchiveDataKind archiveDataKind,
byte[] tmpMem)
Schliesst die Indexe der Datensatzart des DataIndentNode.
|
int |
countContainerEntries(Task task)
Zaehlt die Anzahl der Datensätze in dem mit einer
accessContainer() -Methode im Zugriff befindlichen Container durch Iterieren ueber die Datensätze in der Container-Datei. |
void |
createContainer(Task task,
boolean toSave)
Erzeugt eine neue Container-Datei für den mit
accessContainer(Task,long,long,long,int,ArchiveDataKind,long) spezifizierten Container. |
java.lang.String |
createLockFile()
Das Logfile
isActive anlegen. |
void |
createRebuildIxdFlagFile(java.lang.String didPath)
Legt im Verzeichnis der Datenidentifikation ein
REBUILDINDEX_FILE_FLAG_NAME -Datei an. |
void |
deleteContainerData(Task task)
Loescht alle Datensätze eines Datencontainers, so dass lediglich der Header mit der Verwaltungs-Information in der Datei erhalten bleibt.
|
boolean |
deleteLockFile()
Löscht das LogFile
isActive , falls es von diesem ArS angelegt wurde und es existiert und gibt damit das Persistenzverzeichnis wieder frei |
void |
deleteSimVar(long objId,
long atgId,
long aspId,
int simVar)
Diese Methode loescht das komplette Verzeichnis eines
DataIdentNode mit allen Unterverzeichnissen der Datensatzarten und aller darin befindlichen Datencontainern; damit werden alle archivierten Datensätze einer Simulationsvariante geloescht. |
boolean |
existsContainer(Task task)
Prueft ob bereits eine Container-Datei für den mit
accessContainer(Task,long,long,long,int,ArchiveDataKind,long) spezifizierten Container existiert. |
static long[] |
extractDIdFromPath(java.io.File path)
Extrahiert Objekt-ID, Attributgruppen-ID, Aspekt-ID und SimVar von unten beginnend aus einem Verzeichnispfad, der mindestens die Laenge 4 haben muss.
|
ContainerDataIterator |
getArchiveData(Task task)
Liefert einen Iterator zum Durchlaufen aller Datensätze des aktuellen Containers.
|
ContainerDataIterator |
getArchiveData(Task task,
boolean considerDeleted)
Liefert einen Iterator zum Durchlaufen aller Datensätze des aktuellen Containers.
|
ContainerDataIterator |
getArchiveData(Task task,
long cfIdx)
Liefert einen Iterator zum Durchlaufen aller Datensätze des aktuellen Containers.
|
ContainerDataIterator |
getArchiveData(Task task,
long cfIdx,
boolean considerDeleted)
Liefert einen Iterator zum Durchlaufen aller Datensätze des aktuellen Containers.
|
static ArchiveDataKind |
getArchiveDataKindFromDir(java.io.File dir) |
java.lang.String |
getArchivePath()
Liefert den Wurzelpfad des Persistenzverzeichisses, der beim Systemstart in der Kommandozeile uebergeben wurde.
|
private ContainerFile |
getContainerFile(Task task)
Liefert das ContainerFile-Objekt für die angegebene anfragende Task.
|
private ContainerFile |
getContainerFile(Task task,
long cfIdx)
Liefert das ContainerFile-Objekt mit dem angegebenen Index für die angegebene anfragende Task.
|
ArchiveDataKind |
getContainerHeaderParamAsArchiveDataKind(Task task,
KeyValParam param)
Nachdem mit
readContainerHeader(Task) der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. |
boolean |
getContainerHeaderParamAsBoolean(Task task,
KeyValParam param)
Nachdem mit
readContainerHeader(Task) der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. |
boolean |
getContainerHeaderParamAsBoolean(Task task,
long cfIdx,
KeyValParam param)
Nachdem mit
readContainerHeader(Task) der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. |
int |
getContainerHeaderParamAsInt(Task task,
KeyValParam param)
Nachdem mit
readContainerHeader(Task) der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. |
long |
getContainerHeaderParamAsLong(Task task,
int cfIdx,
KeyValParam param)
Nachdem mit
readContainerHeader(Task) der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. |
long |
getContainerHeaderParamAsLong(Task task,
KeyValParam param)
Nachdem mit
readContainerHeader(Task) der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. |
java.lang.String |
getContainerHeaderParamAsString(Task task,
KeyValParam param)
Nachdem mit
readContainerHeader(Task) der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. |
java.lang.String |
getContainerHeaderParamAsString(Task task,
long cfIdx,
KeyValParam param)
Nachdem mit
readContainerHeader(Task) der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. |
long |
getContainerSize(Task task)
Ermittelt die Gesamtlänge des mit
accessContainer() - im Zugriff befindlichen Containers. |
static java.lang.String |
getContFileName(long containerId)
Liefert den Dateinamen des Daten-Containers mit der angegebenen Container-ID.
|
static long |
getContID(java.io.File file)
Liefert die Container-ID zur angegebenen Container-Datei, indem die im Container-Dateinamen enthaltene Container-ID ausgelesen wird.
|
static long |
getContID(java.lang.String fileName)
Liefert die Container-ID zum Namen der angegebenen Container-Datei, indem die im Container-Dateinamen enthaltene Container-ID ausgelesen wird.
|
private java.io.File |
getCreatePersDir(long objId,
long atgId,
long aspId,
int sv,
ArchiveDataKind archiveDataKind)
Liefert den Archiv-Pfad für die angegebene Datenidentifikation.
|
private java.io.File |
getCreatePersDir(java.lang.String pathName)
Liefert ein File für das angegebene Verzeichnis.
|
ContainerDataIterator |
getHdrData(Task task,
long cfIdx)
Liefert einen Iterator zum Durchlaufen der Min-/Maxwerte des Container-Headers Damit ein Task mehrere Container gleichzeitig parallel offen halten kann, wird der cfIdx zur Unterscheidung der ContainerFile-Objekte benutzt.
|
static java.lang.String |
getIDPart(java.lang.String dirName) |
long |
getLargestContainerID(java.lang.String path)
Liefert von allen Containerdateien im angegebenen Verzeichnis die hoechste Container-ID.
|
long |
getLastContainerID() |
java.lang.String |
getPathName(ArchiveDataSpecification ads,
ArchiveDataKind archiveDataKind)
Liefert den Archiv-Pfad für die angegebene Datenidentifikation und Datensatzart.
|
java.lang.String |
getPathName(IdDataIdentification dataIdentification,
ArchiveDataKind archiveDataKind)
Liefert den Archiv-Pfad für die angegebene Datenidentifikation und Datensatzart.
|
java.lang.String |
getPathName(long objId,
long atgId,
long aspId,
int sv)
Liefert den Archiv-Pfad für die angegebene Datenidentifikation.
|
java.lang.String |
getPathName(long objId,
long atgId,
long aspId,
int sv,
ArchiveDataKind dataKind)
Liefert den Archiv-Pfad für die angegebene Datenidentifikation und Datensatzart.
|
java.lang.String |
getPathName(long objId,
long atgId,
long aspId,
int sv,
int dataKind)
Liefert den Archiv-Pfad für die angegebene Datenidentifikation und Datensatzart.
|
static java.lang.String |
getPathName(java.lang.String basePath,
long objId,
long atgId,
long aspId,
int sv)
Liefert den Archiv-Pfad für die angegebene Datenidentifikation und den Wurzelpfad des Archivsystems.
|
static long[] |
getSortedContainerIDs(java.lang.String path)
Liefert die ContainerIDs von allen Containerdateien im angegebenen Verzeichnis, aufsteigend sortiert.
|
static boolean |
isActivityFlagFile(java.lang.String name) |
boolean |
isContainerClosed(Task task)
Prueft ob der mit
accessContainer(Task,long,long,long,int,ArchiveDataKind,long) spezifizierte Container bereits abgeschlossen ist. |
boolean |
isContainerClosed(Task task,
int cfIdx)
Prueft ob der mit
accessContainer(Task,int,long,long,long,int,ArchiveDataKind,long) spezifizierte Container bereits abgeschlossen ist. |
static boolean |
isContainerFile(java.io.File file)
Liefert Kennzeichen, ob die angegebene Datei eine Container-Datei ist.
|
static boolean |
isIndexFile(java.lang.String name) |
static boolean |
isRebuildIndexFlagFile(java.lang.String name) |
static boolean |
isValidAspIdFolderName(java.lang.String dirName)
Prueft, ob der gegebene Verzeichnisname ein gueltiger Name innerhalb eines Pfades ist, der eine Aspekt-ID repraesentiert.
|
static boolean |
isValidAtgIdFolderName(java.lang.String dirName)
Prueft, ob der gegebene Verzeichnisname ein gueltiger Name innerhalb eines Pfades ist, der eine Attributgruppen-ID repraesentiert.
|
static boolean |
isValidDataKindFolderName(java.lang.String dirName) |
static boolean |
isValidIDFolderName(java.lang.String dirName) |
static boolean |
isValidObjIdFolderName(java.lang.String dirName)
Prueft, ob der gegebene Verzeichnisname ein gueltiger Name innerhalb eines Pfades ist, der eine Objekt-ID repraesentiert.
|
static boolean |
isValidStorageArSFile(java.lang.String name) |
static boolean |
isValidSvFolderName(java.lang.String dirName)
Prueft, ob der gegebene Verzeichnisname ein gueltiger Name für ein Verzeichnis ist, das eine Simulationsvariante repraesentiert.
|
static boolean |
isValidTopLevelArSFile(java.lang.String name) |
void |
leaveContainer(Task task)
Beendet das Arbeiten mit dem zuvor ueber eine der
accessContainer() -Methoden definierten Container. |
void |
leaveContainer(Task task,
long cfIdx)
Beendet das Arbeiten mit dem zuvor ueber eine der
accessContainer() -Methoden definierten Container. |
long |
nextContainerID()
Erhoeht nextContainerID um 1 und gibt den Wert zurueck.
|
void |
prepareShutdown(DataIdentTree dit) |
void |
readContainerHeader(Task task)
Liest den Header der Container-Datei ein und springt im Eingabestrom an die Stelle hinter dem Header.
|
void |
readContainerHeader(Task task,
long cfIdx)
Liest den Header der Container-Datei ein und springt im Eingabestrom an die Stelle hinter dem Header.
|
int[] |
rebuildIndex(Task task,
byte[] tmpBuf,
long objId,
long atgId,
long aspId,
int sv,
ArchiveDataKind archiveDataKind)
Baut Datenindex-, Archivzeit- und Datenzeitindexe der angegebenen Datenidentifikation und Datensatzart neu auf.
|
int[] |
rebuildIndex(Task task,
byte[] tmpBuf,
java.lang.String didPath)
Baut Datenindex-, Archivzeit- und Datenzeitindexe der Datenidentifikation und Datensatzart unter dem angegebenen Verzeichnis neu auf.
|
void |
removeContainerFileObjects(Task task)
Loescht alle für den angegebenen Task angelegten ContainerFile-Objekte und den Index-Map.
|
void |
removeContainerFileObjects(Task task,
int minCFs)
Loescht alle für den angegebenen Task angelegten ContainerFile-Objekte bis auf das angegebene Minimum.
|
private void |
removeRebuildIxdFlagFile(java.lang.String didPath)
Loescht die
REBUILDINDEX_FILE_FLAG_NAME -Datei. |
void |
resetContainerFileMap()
Leert die Hashtabelle für die
ContainerFile -Objekte. |
void |
restoreHeader(Task task,
java.io.File file)
Der Container-Header der Container-Datei, die mit dem Aufruf
accessContainer(Task,long,long,long,int,ArchiveDataKind,long) spezifiziert worden ist, wird mit dem Container-Header aus der angegebenen Container-Datei ueberschrieben. |
int |
serializeData(Task task,
ResultData newData,
long arcTime,
java.util.zip.Deflater compresser)
Serialisiert den uebergebenen Datensatz und speichert ihn in
ContainerFile#actualDataBuf und ContainerFile#actualDataSize . |
int |
serializeDataGap(Task task,
long dataIndex,
long dataTime,
long archiveTime,
java.util.zip.Deflater compresser)
Serialisiert eine Datenluecke anstelle eines Datensatzes.
|
int |
serializeReqData(Task task,
ArchiveData newData,
long arcTime,
java.util.zip.Deflater compresser)
Serialisiert den uebergebenen nachgeforderten Datensatz und speichert ihn in
ContainerFile#actualDataBuf und ContainerFile#actualDataSize . |
void |
setAutoExtendLoeschutz(Task task,
int cfIdx,
long t_ls,
long t_lsMax)
Verlaengert den Loschschutz gemaess TAnfArS 5.1.2.4.2
|
void |
setAutoExtendLoeschutz(Task task,
long t_ls,
long t_lsMax)
Verlaengert den Loschschutz gemaess TAnfArS 5.1.2.4.2
|
void |
setContainerHeaderParam(Task task,
KeyValParam param,
long val)
Nachdem mit
readContainerHeader(Task) der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines numerischen Parameters im Container-Header geaendert werden. |
void |
setContainerHeaderParam(Task task,
KeyValParam param,
java.lang.String val)
Nachdem mit
readContainerHeader(Task) der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Parameters im Container-Header geaendert werden. |
void |
setPersistenceDir(java.lang.String archPath) |
boolean |
startupProcedure()
Versucht, die StartUp-Properties-Datei einzulesen.
|
void |
writeContainerHeader(Task task)
Die mit
setContainerHeaderParam(Task task,KeyValParam param,String val) gesetzten Parameter werden im Container-Header persistiert. |
void |
writeContainerHeader(Task task,
int cfIdx)
Die mit
setContainerHeaderParam(Task task,KeyValParam param,String val) gesetzten Parameter werden im Container-Header persistiert. |
private Debug logger
private static final java.lang.String OBJ_ID_PREFIX
private static final java.lang.String ATG_ID_PREFIX
private static final java.lang.String ASP_ID_PREFIX
private static final java.lang.String SV_PREFIX
public static final java.lang.String[] DATAKIND_SUFFIX
Verzeichnisnamen der Datensatzarten. Die ersten Indexe entsprechen Util.getDataKindIndex(ArchiveDataKind)
.
private static final java.util.Set<java.lang.String> VALID_SUFFIXES
private static final java.util.regex.Pattern OBJ_DIRNAME_PAT
private static final java.util.regex.Pattern ATG_DIRNAME_PAT
private static final java.util.regex.Pattern ASP_DIRNAME_PAT
private static final java.util.regex.Pattern SV_DIRNAME_PAT
private static final java.util.regex.Pattern NUM_DIR_PAT
public static final java.lang.String ACTIVITY_FLAG_FILE_NAME
Dateiname des Lock-Files des Archivsystems. Die Datei wird angelegt, wenn das Archivsystem gestartet wird. Die wird gelöscht, wenn das Archivsystem heruntergefahren wird.
public static java.lang.String REBUILDINDEX_FILE_FLAG_NAME
Eine Datei dieses Namens wird pro Verzeichnis einer Datenidentifikation/Datensatzart angelegt, wenn ein neuer Datensatz archiviert wurde und der Index moeglicherweise (wg. Caching) noch nicht auf die Platte durchgeschrieben wurde. Beim Herunterfahren des Systems werden alle Indexe durchgeschrieben und die Flag-Dateien geloescht. Existiert diese Datei beim Systemstart noch, ist dies ein Hinweis auf eine unkorrekte Beendigung des Archivsystems. Für jede DId, für die die Datei existiert, werden die Indexe neu aufgebaut.
private static int REBUILDINDEX_IDX_SIZE
Zum Wiederaufbau der Indexe werden temporaer Indexe dieser Größe angelegt
private static int directoryCount
Zaehlt die besuchten Verzeichnisse beim Pruefen des Persistenzverzeichnisses
private java.util.concurrent.atomic.AtomicLong nextContainerID
Enthaelt die zuletzt verwendete ContainerID
private ArchiveManager archivMgr
private StartupProperties startupProps
private java.lang.String archivePath
private java.io.File isActive
Die Datei zeigt an, ob das Persistenzverzeichnis von einem Archivsystem gerade benutzt wird.
private java.util.Map<Task,java.util.Map<java.lang.Long,ContainerFile>> containerFileMap
Jede Task richtet ihre Persistanz-Anfragen an den Persistenz-Manager. In dieser Map haelt der Persistenz-Manager pro Task eine weitere Map mit ContainerFile-Objekten. Alle Anfragen bzgl. Container-Dateien leitet der PersistenceManager an ein ContainerFile-Objekt weiter, das in der Map des Tasks enthalten ist. Gibt der Task einen Index an, so wird das ContainerFile-Objekt mit diesem Map-Schluessel benutzt, ansonsten das Objekt mit dem Map-Schluessel 0.
private boolean _preventWriteStartupInfo
private static final java.lang.ThreadLocal<byte[]> _tmpMem
public PersistenceManager(ArchiveManager archMgr, java.lang.String archPath)
Erzeugt den Persistenz-Manager.
archMgr
- Archiv-ManagerarchPath
- Archivierungs-Verzeichnispublic void setPersistenceDir(java.lang.String archPath)
public static boolean isContainerFile(java.io.File file)
Liefert Kennzeichen, ob die angegebene Datei eine Container-Datei ist.
file
- zu pruefende Dateipublic static boolean isIndexFile(java.lang.String name)
name
- Name einer Dateipublic static boolean isRebuildIndexFlagFile(java.lang.String name)
name
- Name einer Dateipublic static boolean isActivityFlagFile(java.lang.String name)
name
- Name einer Dateipublic static boolean isValidStorageArSFile(java.lang.String name)
name
- Name einer Dateipublic static boolean isValidTopLevelArSFile(java.lang.String name)
name
- Name einer Dateipublic static long getContID(java.io.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.
file
- Container-Dateipublic static long getContID(java.lang.String fileName)
Liefert die Container-ID zum Namen der 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.
fileName
- Container-Dateipublic static java.lang.String getContFileName(long containerId)
Liefert den Dateinamen des Daten-Containers mit der angegebenen Container-ID.
containerId
- Container-IDpublic java.lang.String getPathName(long objId, long atgId, long aspId, int sv)
Liefert den Archiv-Pfad für die angegebene Datenidentifikation. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe und pro SimVarwird ein Verzeichnis verwendet.
objId
- Objekt-IDatgId
- Attributgruppen-IDaspId
- Aspekt-IDsv
- Simulationsvariantepublic static java.lang.String getPathName(java.lang.String basePath, long objId, long atgId, long aspId, int sv)
Liefert den Archiv-Pfad für die angegebene Datenidentifikation und den Wurzelpfad des Archivsystems. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe und pro SimVarwird ein Verzeichnis verwendet.
basePath
- Wurzelpfad des ArchivsystemsobjId
- Objekt-IDatgId
- Attributgruppen-IDaspId
- Aspekt-IDsv
- Simulationsvariantepublic static void appendPathName(java.lang.StringBuilder pathName, java.lang.String basePath, long objId, long atgId, long aspId, int sv)
Ergänzt das übergebene StringBuilder-Objekt um den Archiv-Pfad für die angegebene Datenidentifikation und den Wurzelpfad des Archivsystems. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe und pro SimVar wird ein Verzeichnis verwendet.
pathName
- StringBuilder-Objekt, an das der ermittelte Pfad ergänzt werden soll.basePath
- Wurzelpfad des ArchivsystemsobjId
- Objekt-IDatgId
- Attributgruppen-IDaspId
- Aspekt-IDsv
- Simulationsvariantepublic java.lang.String getPathName(long objId, long atgId, long aspId, int sv, ArchiveDataKind dataKind)
Liefert den Archiv-Pfad für die angegebene Datenidentifikation und Datensatzart. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe, pro SimVar und pro Datensatzart wird ein Verzeichnis verwendet.
objId
- Objekt-IDatgId
- Attributgruppen-IDaspId
- Aspekt-IDsv
- SimulationsvariantedataKind
- Datensatzartpublic java.lang.String getPathName(long objId, long atgId, long aspId, int sv, int dataKind)
Liefert den Archiv-Pfad für die angegebene Datenidentifikation und Datensatzart. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe, pro SimVar und pro Datensatzart wird ein Verzeichnis verwendet.
objId
- Objekt-IDatgId
- Attributgruppen-IDaspId
- Aspekt-IDsv
- SimulationsvariantedataKind
- Datensatzart, 0 für OA, 1 für ON, 2 für NA und 3 für NNpublic java.lang.String getPathName(ArchiveDataSpecification ads, ArchiveDataKind archiveDataKind)
Liefert den Archiv-Pfad für die angegebene Datenidentifikation und Datensatzart. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe, pro SimVar und pro Datensatzart wird ein Verzeichnis verwendet.
ads
- Spezifikation des Archivdatensatzes (enthaelt objID, atgID, aspID, sv)archiveDataKind
- Datensatzartpublic java.lang.String getPathName(IdDataIdentification dataIdentification, ArchiveDataKind archiveDataKind)
Liefert den Archiv-Pfad für die angegebene Datenidentifikation und Datensatzart. Der Pfad wird gebildet indem die IDs und die SV in Dreiergruppen zerlegt und mit einem Praefix versehen werden. Pro Dreiergruppe, pro SimVar und pro Datensatzart wird ein Verzeichnis verwendet.
dataIdentification
- objID, atgID, aspID, svarchiveDataKind
- Datensatzartpublic static ArchiveDataKind getArchiveDataKindFromDir(java.io.File dir)
public long getLargestContainerID(java.lang.String path)
Liefert von allen Containerdateien im angegebenen Verzeichnis die hoechste Container-ID.
path
- Zu durchsuchendes Verzeichnispublic static long[] getSortedContainerIDs(java.lang.String path)
Liefert die ContainerIDs von allen Containerdateien im angegebenen Verzeichnis, aufsteigend sortiert.
path
- Zu durchsuchendes Verzeichnispublic void deleteSimVar(long objId, long atgId, long aspId, int simVar) throws PersistenceException
Diese Methode loescht das komplette Verzeichnis eines DataIdentNode
mit allen Unterverzeichnissen der Datensatzarten und aller darin befindlichen Datencontainern; damit werden alle archivierten Datensätze einer Simulationsvariante geloescht. Der DataIdentNode
muss in der Verwaltung aus dem DataIdentTree
geloescht werden. Falls die Simulationsvariante gleich Null ist, oder das Verzeichnis nicht geloescht werden konnte, wird eine PersistenceException
geworfen.
objId
- atgId
- aspId
- simVar
- PersistenceException
public void accessContainer(Task task, java.lang.String didPath, long containerId) throws PersistenceException
Assoziiert den angegebenen Task mit dem spezifizierten Container, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken. Soll der Zugriff auf diesen Container beendet werden (um z.B. einen anderen Container zu adressieren), muss dazu die Methode leaveContainer(Task)
aufgerufen werden. Falls das Verzeichnis der Datenidentifikation nicht existiert, wird es angelegt.
task
- Anfragender TaskdidPath
- Pfad bis zur DatensatzartcontainerId
- Container-IDPersistenceException
public void accessContainer(Task task, long objId, long atgId, long aspId, int sv, ArchiveDataKind dataKind, long containerId) throws PersistenceException
Assoziiert den angegebenen Task mit dem spezifizierten Container, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken. Soll der Zugriff auf diesen Container beendet werden (um z.B. einen anderen Container zu adressieren), muss dazu die Methode leaveContainer(Task)
aufgerufen werden. Falls das Verzeichnis der Datenidentifikation nicht existiert, wird es angelegt.
task
- Anfragender TaskobjId
- Objekt-IDatgId
- Attributgruppen-IDaspId
- Aspekt-IDsv
- SimulationsvariantedataKind
- DatensatzartcontainerId
- Container-IDPersistenceException
public void accessContainer(Task task, long objId, long atgId, long aspId, int sv, ArchiveDataKind dataKind, java.lang.String pathName, boolean createDir, long containerId) throws PersistenceException
Assoziiert den angegebenen Task mit dem spezifizierten Container, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken. Soll der Zugriff auf diesen Container beendet werden (um z.B. einen anderen Container zu adressieren), muss dazu die Methode leaveContainer(Task)
aufgerufen werden. Falls das Verzeichnis der Datenidentifikation nicht existiert, wird es angelegt.
task
- Anfragender TaskobjId
- Objekt-IDatgId
- Attributgruppen-IDaspId
- Aspekt-IDsv
- SimulationsvariantedataKind
- DatensatzartpathName
- Pfadname des Verzeichnisses der ContainerdateicontainerId
- Container-IDPersistenceException
public void accessContainer(Task task, int cfIdx, long objId, long atgId, long aspId, int sv, ArchiveDataKind dataKind, long containerId) throws PersistenceException
Assoziiert den angegebenen Task mit dem spezifizierten Container, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken. Soll der Zugriff auf diesen Container beendet werden (um z.B. einen anderen Container zu adressieren), muss dazu die Methode leaveContainer(Task)
aufgerufen werden. Damit ein Task mehrere Container gleichzeitig parallel offen halten kann, wird der cfIdx zur Unterscheidung der ContainerFile-Objekte benutzt. Falls das Verzeichnis der Datenidentifikation nicht existiert, wird es angelegt.
task
- Anfragender TaskcfIdx
- ContainerFile-IndexobjId
- Objekt-IDatgId
- Attributgruppen-IDaspId
- Aspekt-IDsv
- SimulationsvariantedataKind
- DatensatzartcontainerId
- Container-IDPersistenceException
public void accessContainer(Task task, long cfIdx, IdDataIdentification did, ArchiveDataKind dataKind, long containerId) throws PersistenceException
Assoziiert den angegebenen Task mit dem spezifizierten Container, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken. Soll der Zugriff auf diesen Container beendet werden (um z.B. einen anderen Container zu adressieren), muss dazu die Methode leaveContainer(Task)
aufgerufen werden. Damit ein Task mehrere Container gleichzeitig parallel offen halten kann, wird der cfIdx zur Unterscheidung der ContainerFile-Objekte benutzt. Falls das Verzeichnis der Datenidentifikation nicht existiert, wird es angelegt.
task
- Anfragender TaskcfIdx
- ContainerFile-Indexdid
- DatenidentifikationdataKind
- DatensatzartcontainerId
- Container-IDPersistenceException
public void accessContainer(Task task, int cfIdx, long objId, long atgId, long aspId, int sv, ArchiveDataKind dataKind, java.lang.String pathName, boolean createDir, long containerId) throws PersistenceException
Assoziiert den angegebenen Task mit dem spezifizierten Container, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken. Soll der Zugriff auf diesen Container beendet werden (um z.B. einen anderen Container zu adressieren), muss dazu die Methode leaveContainer(Task)
aufgerufen werden. Damit ein Task mehrere Container gleichzeitig parallel offen halten kann, wird der cfIdx zur Unterscheidung der ContainerFile-Objekte benutzt. Falls das Verzeichnis der Datenidentifikation nicht existiert, wird es angelegt.
task
- Anfragender TaskcfIdx
- ContainerFile-IndexobjId
- Objekt-IDatgId
- Attributgruppen-IDaspId
- Aspekt-IDsv
- SimulationsvariantedataKind
- DatensatzartpathName
- Pfadname des Verzeichnisses der ContainerdateicontainerId
- Container-IDPersistenceException
public void accessContainerReadOnly(Task task, java.io.File contFile) throws PersistenceException
Assoziiert den angegebenen Task mit der angegebenen Containerdatei, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken. Es koennen nur lesende Operationen auf die Container-Datei ausgeführt werden. Vorgesehen für den Zugriff auf Containerdateien, 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(Task)
aufgerufen werden.
task
- Anfragender TaskcontFile
- ContainerdateiPersistenceException
public void accessContainerReadOnly(Task task, int cfIdx, java.io.File contFile) throws PersistenceException
Assoziiert den angegebenen Task mit der angegebenen Containerdatei, so dass alle anschliessend von diesem Task aufgerufenen Methoden auf diesen Container wirken. Es koennen nur lesende Operationen auf die Container-Datei ausgeführt werden. Vorgesehen für den Zugriff auf Containerdateien, 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(Task)
aufgerufen werden. Damit ein Task mehrere Container gleichzeitig parallel offen halten kann, wird der cfIdx zur Unterscheidung der ContainerFile-Objekte benutzt.
task
- Anfragender TaskcfIdx
- ContainerFile-IndexcontFile
- ContainerdateiPersistenceException
public void leaveContainer(Task task) 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.
task
- Anfragender TaskPersistenceException
public void leaveContainer(Task task, long cfIdx) 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. Damit ein Task mehrere Container gleichzeitig parallel offen halten kann, wird der cfIdx zur Unterscheidung der ContainerFile-Objekte benutzt.
task
- Anfragender TaskcfIdx
- ContainerFile-IndexPersistenceException
public boolean existsContainer(Task task) throws PersistenceException
Prueft ob bereits eine Container-Datei für den mit accessContainer(Task,long,long,long,int,ArchiveDataKind,long)
spezifizierten Container existiert.
task
- Anfragende TaskPersistenceException
public void createContainer(Task task, boolean toSave) throws PersistenceException
Erzeugt eine neue Container-Datei für den mit accessContainer(Task,long,long,long,int,ArchiveDataKind,long)
spezifizierten Container. Schreibt den Container-Header und befuellt diesen mit den angegebenen Parametern.
task
- Anfragender TasktoSave
- SichernPersistenceException
public void createRebuildIxdFlagFile(java.lang.String didPath) throws PersistenceException
Legt im Verzeichnis der Datenidentifikation ein REBUILDINDEX_FILE_FLAG_NAME
-Datei an.
didPath
- Pfad der DatenidentifikationPersistenceException
REBUILDINDEX_FILE_FLAG_NAME
private void removeRebuildIxdFlagFile(java.lang.String didPath)
Loescht die REBUILDINDEX_FILE_FLAG_NAME
-Datei.
didPath
- public void closeContainer(Task task, DataIdentNode din, ArchiveDataKind adk) throws PersistenceException, IndexException
Schliesst die Container-Datei für den mit accessContainer(Task,long,long,long,int,ArchiveDataKind,long)
spezifizierten Container. Der Container-Header wird entsprechend aktualisiert. Die Min/Max-Werte und die Anzahl der Datensätze werden dem DataIdentNode und dessen Indexen entnommen.
task
- Anfragender Taskdin
- DataIdentNode des aktuellen Containersadk
- Datensatzart des aktuellen ContainersPersistenceException
IndexException
public void closeContainerRecount(Task task, DataIdentNode din, ArchiveDataKind adk) throws PersistenceException
Schliesst einen Container, indem jeder Datensatz-Header des Containers gelesen wird, um die Min-/Max-Werte und die Anzahl der Datensätze zu bestimmen. Die Information der Indexe reicht nicht aus, weil dort die Anzahl der Datensätze nicht verfuegbar ist.
task
- Anfragender Taskdin
- DataIdentNode des aktuellen Containersadk
- Datensatzart des aktuellen ContainersPersistenceException
public boolean isContainerClosed(Task task) throws PersistenceException
Prueft ob der mit accessContainer(Task,long,long,long,int,ArchiveDataKind,long)
spezifizierte Container bereits abgeschlossen ist.
task
- Anfragender TaskPersistenceException
public boolean isContainerClosed(Task task, int cfIdx) throws PersistenceException
Prueft ob der mit accessContainer(Task,int,long,long,long,int,ArchiveDataKind,long)
spezifizierte Container bereits abgeschlossen ist.
task
- Anfragender TaskPersistenceException
public void removeContainerFileObjects(Task task, int minCFs)
Loescht alle für den angegebenen Task angelegten ContainerFile-Objekte bis auf das angegebene Minimum. Es werden die ContainerFiles mit den groessten ContainerFile-Indexen geloescht. Wenn das Minimum 0 ist, wird der Index-Map ebenfalls geloescht. Diese Methode ist notwendig, damit die ContainerFiles nicht stetig wachsen.
task
- Anfragender TaskminCFs
- Minimale Anzahl ContainerFiles, die nicht geloescht werden.public void removeContainerFileObjects(Task task)
Loescht alle für den angegebenen Task angelegten ContainerFile-Objekte und den Index-Map. Diese Methode ist notwendig, damit die ContainerFiles nicht stetig wachsen.
task
- Anfragender Taskpublic void assignIndexes(DataIdentTree dit, ArchiveDataSpecification ads, ArchiveDataKind adk, Task task, byte[] tempMem) throws DIdNodeNotFoundException, IndexException, PersistenceException
Weist, falls nicht bereits geschehen, dem DataIdentNode seine Indexe zu.
dit
- Baum bestehend aus DataIdentNode
ads
- Spezifikation des Archivdatensatzes (enthaelt objID, atgID, aspID, sv)adk
- Datensatzarttask
- Anfragender TasktempMem
- Temporaerer Speicher zum EInlesen der IndexeDIdNodeNotFoundException
IndexException
PersistenceException
public void assignIndexes(DataIdentTree dit, IdDataIdentification ads, ArchiveDataKind adk, Task task, byte[] tempMem) throws DIdNodeNotFoundException, IndexException, PersistenceException
public void assignIndexes(DataIdentTree dit, long objID, long atgID, long aspID, int sv, ArchiveDataKind archiveDataKind, Task task, byte[] tempMem) throws DIdNodeNotFoundException, IndexException, PersistenceException
Weist, falls nicht bereits geschehen, dem DataIdentNode seine Indexe zu. Prueft dabei, ob der letzte Eintrag eines Index fortgefuehrt werden muss (wenn der letzte Container angebrochen ist und nicht abgeschlossen werden muss). Die Container werden nicht verändert.
Wenn der Index nicht fortgefuehrt wird, werden der enstprechende DataIdentNode.containerEntries
auf -1 gesetzt. Wenn der Index fortgefuehrt wird, wird im letzten Container nachgezaehlt (aufwendig) und DataIdentNode.containerEntries
auf das Ergebnis gesetzt.
dit
- Baum bestehend aus DataIdentNode
objID
- Objekt-IDatgID
- Attributgruppen-IDaspID
- Aspekt-IDsv
- SimulationsvariantearchiveDataKind
- Datensatzarttask
- Anfragender TasktempMem
- Temporaerer Speicher zum Einlesen der IndexeDIdNodeNotFoundException
IndexException
PersistenceException
public void prepareShutdown(DataIdentTree dit) throws java.lang.InterruptedException
java.lang.InterruptedException
public boolean closeIndex(DataIdentNode din, IdDataIdentification dataIdentification, ArchiveDataKind archiveDataKind, byte[] tmpMem) throws IndexException
Schliesst die Indexe der Datensatzart des DataIndentNode.
din
- objID
- atgID
- aspID
- sv
- archiveDataKind
- DatensatzarttmpMem
- temporaerer Speicher, der zum Schliessen des Index benoetigt wirdIndexException
public void readContainerHeader(Task task) 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 getContainerHeaderParamAsString(Task,KeyValParam)
abgefragt werden.
task
- Anfragender TaskPersistenceException
public void readContainerHeader(Task task, long cfIdx) 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 getContainerHeaderParamAsString(Task,KeyValParam)
abgefragt werden.
task
- Anfragender TaskcfIdx
- ContainerFile-IndexPersistenceException
public java.lang.String getContainerHeaderParamAsString(Task task, KeyValParam param) throws PersistenceException
Nachdem mit readContainerHeader(Task)
der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. Wirfte eine PersistenceException
, falls der Parameter nicht gefunden wurde. Liefert den Wert des Parameters unabhaengig von dessen Typ immer als String zurueck.
task
- Anfragende Taskparam
- Container-Header-ParameterPersistenceException
KeyValParam
public java.lang.String getContainerHeaderParamAsString(Task task, long cfIdx, KeyValParam param) throws PersistenceException
Nachdem mit readContainerHeader(Task)
der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Header-Parameters ermittelt werden. Wirfte eine PersistenceException
, falls der Parameter nicht gefunden wurde. Liefert den Wert des Parameters unabhaengig von dessen Typ immer als String zurueck.
task
- Anfragende TaskcfIdx
- ContainerFile-Indexparam
- Container-Header-ParameterPersistenceException
KeyValParam
public ArchiveDataKind getContainerHeaderParamAsArchiveDataKind(Task task, KeyValParam param) throws PersistenceException
Nachdem mit readContainerHeader(Task)
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. Wirfte eine PersistenceException
, falls der Parameter nicht gefunden wurde oder nicht in den Typ ArchiveDataKind
umgeformt werden kann.
task
- Anfragende Taskparam
- Container-Header-ParameterPersistenceException
public boolean getContainerHeaderParamAsBoolean(Task task, KeyValParam param) throws PersistenceException
Nachdem mit readContainerHeader(Task)
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 boolschen Wert zurueck. Wirfte eine PersistenceException
, falls der Parameter nicht gefunden wurde oder nicht in den Typ boolean
umgeformt werden kann.
task
- Anfragende Taskparam
- Container-Header-Parametertrue
oder false
PersistenceException
public boolean getContainerHeaderParamAsBoolean(Task task, long cfIdx, KeyValParam param) throws PersistenceException
Nachdem mit readContainerHeader(Task)
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 boolschen Wert zurueck. Wirfte eine PersistenceException
, falls der Parameter nicht gefunden wurde oder nicht in den Typ boolean
umgeformt werden kann.
task
- Anfragende TaskcfIdx
- ContainerFile-Indexparam
- Container-Header-Parametertrue
oder false
PersistenceException
public long getContainerHeaderParamAsLong(Task task, KeyValParam param) throws PersistenceException
Nachdem mit readContainerHeader(Task)
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.
task
- Anfragende Taskparam
- Container-Header-Parameterlong
PersistenceException
public long getContainerHeaderParamAsLong(Task task, int cfIdx, KeyValParam param) throws PersistenceException
Nachdem mit readContainerHeader(Task)
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.
task
- Anfragende TaskcfIdx
- ContainerFile-Indexparam
- Container-Header-Parameterlong
PersistenceException
public int getContainerHeaderParamAsInt(Task task, KeyValParam param) throws PersistenceException
Nachdem mit readContainerHeader(Task)
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.
task
- Anfragende Taskparam
- Container-Header-Parameterlong
PersistenceException
public void setContainerHeaderParam(Task task, KeyValParam param, java.lang.String val) throws PersistenceException
Nachdem mit readContainerHeader(Task)
der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines Parameters im Container-Header geaendert werden. Wirft eine PersistenceException
, wenn die Aenderung nicht durchgefuehrt werden kann.
task
- Anfragender Taskparam
- Container-Header-Parameterval
- Wert des Container-Header-ParametersPersistenceException
public void setContainerHeaderParam(Task task, KeyValParam param, long val) throws PersistenceException
Nachdem mit readContainerHeader(Task)
der Header einer Container-Datei eingelesen worden ist, kann mit dieser Methode der Wert eines numerischen Parameters im Container-Header geaendert werden. Wirft eine PersistenceException
, wenn die Aenderung nicht durchgefuehrt werden kann.
task
- Anfragender Taskparam
- Container-Header-Parameterval
- Numerischer Wert des Container-Header-ParametersPersistenceException
public void restoreHeader(Task task, java.io.File file) throws PersistenceException
Der Container-Header der Container-Datei, die mit dem Aufruf accessContainer(Task,long,long,long,int,ArchiveDataKind,long)
spezifiziert worden ist, wird mit dem Container-Header aus der angegebenen Container-Datei ueberschrieben.
task
- Anfragender Taskfile
- Container-DateiPersistenceException
public void writeContainerHeader(Task task) throws PersistenceException
Die mit setContainerHeaderParam(Task task,KeyValParam param,String val)
gesetzten Parameter werden im Container-Header persistiert.
task
- Anfragender TaskPersistenceException
public void writeContainerHeader(Task task, int cfIdx) throws PersistenceException
Die mit setContainerHeaderParam(Task task,KeyValParam param,String val)
gesetzten Parameter werden im Container-Header persistiert.
task
- Anfragender TaskPersistenceException
public boolean startupProcedure()
Versucht, die StartUp-Properties-Datei einzulesen. Wenn das nicht gelingt, wird das gesamte Persistenzverzeichnis (RestorePersDirTsk
) durchlaufen und versucht, einen gueltigen Startpunkt wiederherzustellen. Das Persistenzverzeichnis wird in InQueuesMgr.NUM_OF_ARCH_QUEUES_ONLINE
Teile aufgeteilt, die jeweils von einem Thread bearbeitet werden (zwengs Performance). Am Schluss wird die StartUp-Properties-Datei geloescht. Beim Herunterfahren wird in #prepareShutdown(DataIdentTree,byte[])
die Datei neu geschrieben. Daran kann das ArS beim naechsten Start erkennen, ob es ordnungsgemaess heruntergefahren wurde oder ob ein Wiederherstellungslauf erforderlich ist.
public int[] rebuildIndex(Task task, byte[] tmpBuf, java.lang.String didPath) throws PersistenceException, IndexException
Baut Datenindex-, Archivzeit- und Datenzeitindexe der Datenidentifikation und Datensatzart unter dem angegebenen Verzeichnis neu auf. Eventuell vorhandene Indexdateien werden vorher geloescht.
task
- Anfragender TasktmpBuf
- Temporaerer Speicherbereich, der zum Neuaufbau der Indexe verwendet werden kann.didPath
- Vollstaendiger Pfad bis zur DatensatzartPersistenceException
IndexException
rebuildIndex(Task,byte[],long,long,long,int,ArchiveDataKind)
public int[] rebuildIndex(Task task, byte[] tmpBuf, long objId, long atgId, long aspId, int sv, ArchiveDataKind archiveDataKind) throws IndexException, PersistenceException
Baut Datenindex-, Archivzeit- und Datenzeitindexe der angegebenen Datenidentifikation und Datensatzart neu auf. Eventuell vorhandene Indexdateien werden vorher geloescht. Nach Moeglichkeit werden die Min/Max-Werte aus den Container-Headern verwendet. Falls diese nicht vorhanden sind (weil der Container nicht abgeschlossen ist), werden alle Datensatz-Header gelesen. Sollte ein Container eigentlich die Index-Info im Header stehen haben und sie steht dort nicht, wird der Header ergänzt.
task
- Anfragender TasktmpBuf
- Temporaerer Speicherbereich, der zum Neuaufbau der Indexe verwendet werden kann.objId
- Objekt-IDatgId
- Attributgruppen-IDaspId
- Aspekt-IDsv
- SimulationsvariantearchiveDataKind
- DatensatzartPersistenceException
IndexException
PersistenceException
public int serializeData(Task task, ResultData newData, long arcTime, java.util.zip.Deflater compresser) throws PersistenceException
Serialisiert den uebergebenen Datensatz und speichert ihn in ContainerFile#actualDataBuf
und ContainerFile#actualDataSize
. 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#preserializeData()
und ContainerFile#appendPreserializedData()
aufgeteilt.
task
- Anfragender TasknewData
- Zu archivierender DatensatzarcTime
- ArchivzeitstempelPersistenceException
public int serializeDataGap(Task task, long dataIndex, long dataTime, long archiveTime, java.util.zip.Deflater compresser) throws PersistenceException
Serialisiert eine Datenluecke anstelle eines Datensatzes. Ansonsten Funktion indentisch zu #serializeData(Task,ResultData,long)
.
task
- Anfragender TaskdataIndex
- Datenindex der Luecke (= letzter echter Index mit gesetztem Archivbit)dataTime
- DatenzeitarchiveTime
- ArchivzeitPersistenceException
public int serializeReqData(Task task, ArchiveData newData, long arcTime, java.util.zip.Deflater compresser) throws PersistenceException
Serialisiert den uebergebenen nachgeforderten Datensatz und speichert ihn in ContainerFile#actualDataBuf
und ContainerFile#actualDataSize
. Da der ArchivReqTask vor dem Archivieren wissen muss, ob der Container zu lang wird und abgeschlossen werden muss, ist das Anhaengen eines Datensatzes auf die Methoden ContainerFile#preserializeData()
und ContainerFile#appendPreserializedData()
aufgeteilt.
task
- Anfragender TasknewData
- Zu archivierender DatensatzarcTime
- ArchivzeitstempelPersistenceException
public void appendSerializedData(Task task) throws PersistenceException
Haengt den uebergebenen, serialisierten Archivdatensatz an den mit accessContainer(Task,long,long,long,int,ArchiveDataKind,long)
spezifizierten Container an.
task
- Anfragender TaskPersistenceException
public ContainerDataIterator getArchiveData(Task task) throws PersistenceException
Liefert einen Iterator zum Durchlaufen aller Datensätze des aktuellen Containers.
task
- Anfragender TaskPersistenceException
public ContainerDataIterator getArchiveData(Task task, boolean considerDeleted) throws PersistenceException
Liefert einen Iterator zum Durchlaufen aller Datensätze des aktuellen Containers.
task
- Anfragender TaskconsiderDeleted
- gibt an, ob Sonderbehandlung für ausgelagerte Container nötig ist (wichtig beim Nachfordern).PersistenceException
public ContainerDataIterator getArchiveData(Task task, long cfIdx, boolean considerDeleted) throws PersistenceException
Liefert einen Iterator zum Durchlaufen aller Datensätze des aktuellen Containers. (Evtl. mit Sonderbehandlung für ausgelagerte Container)
task
- Anfragender TaskcfIdx
- ContainerFile-IndexconsiderDeleted
- Gibt an, ob Sonderbehandlung ausgelagerter Container nötig ist (wichtig beim Nachfordern).PersistenceException
public ContainerDataIterator getArchiveData(Task task, long cfIdx) throws PersistenceException
Liefert einen Iterator zum Durchlaufen aller Datensätze des aktuellen Containers. Damit ein Task mehrere Container gleichzeitig parallel offen halten kann, wird der cfIdx zur Unterscheidung der ContainerFile-Objekte benutzt.
task
- Anfragender TaskcfIdx
- ContainerFile-IndexPersistenceException
public ContainerDataIterator getHdrData(Task task, long cfIdx) throws PersistenceException
Liefert einen Iterator zum Durchlaufen der Min-/Maxwerte des Container-Headers Damit ein Task mehrere Container gleichzeitig parallel offen halten kann, wird der cfIdx zur Unterscheidung der ContainerFile-Objekte benutzt.
task
- Anfragender TaskcfIdx
- ContainerFile-IndexPersistenceException
public int countContainerEntries(Task task) throws PersistenceException
Zaehlt die Anzahl der Datensätze in dem mit einer accessContainer()
-Methode im Zugriff befindlichen Container durch Iterieren ueber die Datensätze 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.
task
- Anfragender TaskPersistenceException
public long getContainerSize(Task task) throws PersistenceException
Ermittelt die Gesamtlänge des mit accessContainer()
- im Zugriff befindlichen Containers.
PersistenceException
public void deleteContainerData(Task task) throws PersistenceException
Loescht alle Datensätze eines Datencontainers, so dass lediglich der Header mit der Verwaltungs-Information in der Datei erhalten bleibt.
ACHTUNG:
Das Setzen des Header-Flags auf “geloescht” muss NACH dem Loeschen der Daten aus dem Container erfolgen!
task
- Anfragender TaskPersistenceException
public java.lang.String createLockFile()
Das Logfile isActive
anlegen. Wird verwendet, um einem Archivsystem anzuzeigen, ob ein anderes Archivsystem dasselbe Persistenzverzeichnis verwendet
public boolean deleteLockFile()
Löscht das LogFile isActive
, falls es von diesem ArS angelegt wurde und es existiert und gibt damit das Persistenzverzeichnis wieder frei
public void checkPersistenceDir(java.lang.String mode) throws java.lang.InterruptedException
Prueft das Persistenzverzeichnis auf fremde Dateien und Verzeichnisse und falsche Reihenfolgen von ID-Verzeichnissen. Die Ergebnisse werden ueber den Logger protokolliert. Kann durch einen Kommandozeilenparameter beim Systemstart aufgerufen werden.
java.lang.InterruptedException
private void checkPersDirNode(java.io.File curDir, DataIdentTree dit, java.lang.String mode, java.util.concurrent.ExecutorService threadPool, java.util.concurrent.atomic.AtomicBoolean allValid, java.util.concurrent.atomic.AtomicInteger numVisited)
public static long[] extractDIdFromPath(java.io.File path) throws PersistenceException
Extrahiert Objekt-ID, Attributgruppen-ID, Aspekt-ID und SimVar von unten beginnend aus einem Verzeichnispfad, der mindestens die Laenge 4 haben muss. Voraussetzung ist, dass alle Verzeichnisnamen entsprechend den Konventionen des PersistenceManagers gebildet sind. Das unterste Verzeichnis kann entweder die SimVar bezeichnen oder eine Datensatzart sein.
path
- Pfad bis zum Verzeichnis der SimulationsvariantePersistenceException
- wenn der Pfad kein gueltiges Verzeichnis istisValidObjIdFolderName(String)
,
isValidAtgIdFolderName(String)
,
isValidAspIdFolderName(String)
,
isValidSvFolderName(String)
public static boolean isValidObjIdFolderName(java.lang.String dirName)
Prueft, ob der gegebene Verzeichnisname ein gueltiger Name innerhalb eines Pfades ist, der eine Objekt-ID repraesentiert.
dirName
- VerzeichisnameOBJ_DIRNAME_PAT
public static boolean isValidAtgIdFolderName(java.lang.String dirName)
Prueft, ob der gegebene Verzeichnisname ein gueltiger Name innerhalb eines Pfades ist, der eine Attributgruppen-ID repraesentiert.
dirName
- VerzeichisnameATG_DIRNAME_PAT
public static boolean isValidAspIdFolderName(java.lang.String dirName)
Prueft, ob der gegebene Verzeichnisname ein gueltiger Name innerhalb eines Pfades ist, der eine Aspekt-ID repraesentiert.
dirName
- VerzeichisnameASP_DIRNAME_PAT
public static boolean isValidSvFolderName(java.lang.String dirName)
Prueft, ob der gegebene Verzeichnisname ein gueltiger Name für ein Verzeichnis ist, das eine Simulationsvariante repraesentiert.
dirName
- VerzeichisnameSV_DIRNAME_PAT
public static boolean isValidDataKindFolderName(java.lang.String dirName)
public static boolean isValidIDFolderName(java.lang.String dirName)
public static java.lang.String getIDPart(java.lang.String dirName)
private java.io.File getCreatePersDir(long objId, long atgId, long aspId, int sv, ArchiveDataKind archiveDataKind) throws PersistenceException
Liefert den Archiv-Pfad für die angegebene Datenidentifikation. Wenn das Verzeichnis nicht existiert, wird es angelegt (lazy-Verhalten). Die Methode ist synchronized weil sie von mehreren Tasks aufgerufen wird und mkdirs in manchen Konstellationen false liefert.
objId
- Objekt-IDatgId
- Attributgruppen-IDaspId
- Aspekt-IDsv
- SimulationsvariantePersistenceException
private java.io.File getCreatePersDir(java.lang.String pathName) throws PersistenceException
Liefert ein File für das angegebene Verzeichnis. Wenn das Verzeichnis nicht existiert, wird es angelegt (lazy-Verhalten). Die Methode ist synchronized weil sie von mehreren Tasks aufgerufen wird und mkdirs in manchen Konstellationen false liefert.
pathName
- PersistenceException
private ContainerFile getContainerFile(Task task)
Liefert das ContainerFile-Objekt für die angegebene anfragende Task.
task
- Taskprivate ContainerFile getContainerFile(Task task, long cfIdx)
Liefert das ContainerFile-Objekt mit dem angegebenen Index für die angegebene anfragende Task.
task
- Anfragender TaskcfIdx
- ContainerFile-Indexpublic void resetContainerFileMap()
Leert die Hashtabelle für die ContainerFile
-Objekte. Dies ist notwendig, wenn (zu Testzwecken) ein neuer InQueuesMgr
angelegt wird.
public java.lang.String getArchivePath()
Liefert den Wurzelpfad des Persistenzverzeichisses, der beim Systemstart in der Kommandozeile uebergeben wurde.
public long nextContainerID()
Erhoeht nextContainerID um 1 und gibt den Wert zurueck.
public long getLastContainerID()
public void setAutoExtendLoeschutz(Task task, int cfIdx, long t_ls, long t_lsMax) throws PersistenceException
Verlaengert den Loschschutz gemaess TAnfArS 5.1.2.4.2
task
- anfragender Taskt_ls
- Zeitdauer, um die der LS verlaengert wird (aus atg.archivEinstellung)t_lsMax
- maximale Zeitdauer, um die verlaengert werden darf (gemessen ab Vorhaltezeitraum)PersistenceException
public void setAutoExtendLoeschutz(Task task, long t_ls, long t_lsMax) throws PersistenceException
Verlaengert den Loschschutz gemaess TAnfArS 5.1.2.4.2
task
- anfragender Taskt_ls
- Zeitdauer, um die der LS verlaengert wird (aus atg.archivEinstellung)t_lsMax
- maximale Zeitdauer, um die verlaengert werden darf (gemessen ab Vorhaltezeitraum)PersistenceException