de.bsvrz.ars.ars.mgmt.datatree
Class DataIdentNode

java.lang.Object
  extended by de.bsvrz.ars.ars.mgmt.datatree.DataIdentNode

public class DataIdentNode
extends java.lang.Object

Repraesentiert einen Knoten fuer eine Daten-Identifikation im Baum DataIdentTree.

Version:
$Revision: 1.2 $ / $Date: 2008/01/22 16:55:58 $ / ($Author: yvonnes $)
Author:
beck et al. projects GmbH, Alexander Schmidt

Field Summary
static int IDXSIZE_ONLINE
           
static int IDXSIZE_REQUESTED
           
static byte INVALID
           
 
Constructor Summary
DataIdentNode()
           
 
Method Summary
 void addIndexEntries(ArchiveDataKind adk, java.lang.String basePath, long dataIdx, long atime, long dtime, long contID, byte[] tempMem)
          Fügt den Indexen den spezifizierten Eintrag hinzu.
 int arSParamGetAnzNachfordern()
          Liefert die Anzahl der Archivsysteme, bei denen nachgefordert werden soll.
 java.lang.String arSParamGetNachfordern(int at)
          Liefert aus der Liste der Archivsysteme, bei denen bei potentiell erkannten Datenluecken nachgefordert werden soll, das Archivsystem mit dem angegebenen nullbasierten Index.
 long arSParamGetQuittieren()
          Liefert den AspektID unter dem quittiert werden soll, -1 falls nicht quittiert werden soll.
 long arSParamGetVorhalten()
          Liefert die Vorhaltezeit in Sekunden.
 boolean arSParamIsArchivieren()
          Liefert Kennzeichen, ob die Daten zu archivieren sind.
 boolean arSParamIsNachfordern()
          Liefert Kennzeichen, ob bei potentiell erkannten Datenluecken bei anderen Archivsystemen nachgefordert werden soll.
 boolean arSParamIsQuittieren()
           
 boolean arSParamIsQuittierenValid()
           
 boolean arSParamIsSichern()
          Liefert Kennzeichen, ob die Daten fuer diese Datenidentifikation zu sichern sind.
 void arSParamMarkQuittierenInvalid(boolean invalid)
          Setzt die AspektID unter dem quittiert werden soll und vermerkt ihn als nicht erfolgreich angemeldet.
 void arsParamSetParams(Data params)
          Setzt einen Zeiger auf den Datensatz mit der Parametrierung fuer diese Datenidentifikation
 void assignContinuedIndexes(int adkIndex, java.lang.String basePath, byte[] tempMem, int lastContNumDS)
          Weist Indexe zur Weiterverwendung des letzten Eintrages zu.
 void assignNewIndexes(int adkIndex)
          Legt fuer die Datensatzart neue Indexe an, falls diese nicht existieren.
 void closeIndexes(ArchiveDataKind adk, java.lang.String basePath, byte[] tempMem)
          Schliesst die Indexe einer Datensatzart und gibt den belegten Speicher frei.
 boolean enterBusyArea()
          Muss immer vor der Benutzung von folgenden Daten eines DataIdentNodes aufgerufen werden: Zugriff auf abgeschlossene Container (lesen und schreiben)
Wenn ein anderer Task sich im Busy-Bereich befindet, blockiert diese Methode.
 boolean enterCriticalArea()
          Muss immer vor der Benutzung von folgenden Daten eines DataIdentNodes aufgerufen werden: Index (lesen und schreiben) Aktueller Container (nur schreiben)
Wenn ein anderer Task sich im kritischen Bereich befindet, blockiert diese Methode bis der kritische Bereich wieder frei ist.
 void exitBusyArea()
          Muss immer nach der Benutzung von Daten eines DataIdentNodes aufgerufen werden, wenn zuvor enterBusyArea() augfgerufen worden ist.
 void exitCriticalArea()
          Muss immer nach der Benutzung von Daten eines DataIdentNodes aufgerufen werden, wenn zuvor enterCriticalArea() augfgerufen worden ist.
 IndexResult getArSTimeContIDs(ArchiveDataKind adk, java.lang.String basePath, byte[] tempMem, long minKey, long maxKey)
           
 int getCurContEntries(ArchiveDataKind adk)
          Liefert die Anzahl der Datensätze im aktuellen Container.
 IndexResult getDataIdxContIDs(ArchiveDataKind adk, java.lang.String basePath, byte[] tempMem, long minKey, long maxKey)
           
 IndexResult getDataTimeContIDs(ArchiveDataKind adk, java.lang.String basePath, byte[] tempMem, long minKey, long maxKey)
           
 float getIndexFillRatio(ArchiveDataKind adk)
           
 long getLastQueryTime()
           
 long getMinVal(TimingType tt, ArchiveDataKind adk, java.lang.String basePath)
          Liefert den kleinsten jemals gespeicherten Wert der angegebenen Datensatzart und TimingType
 long getOpenContID(ArchiveDataKind adk)
          Liefert die ID des aktuell offenen Containers.
 boolean indexesAssigned(ArchiveDataKind adk)
           
 boolean isArSParameterized()
          Liefert Kennzeichen, ob der DataIdentNode ueber die Archivparametrierung/Simulation angelegt wurde oder wegen einer Archivanfrage.
 boolean isFirstDataAfterSubscription(ArchiveDataKind adk)
          Sagt, ob nach einer Anmeldung bereits ein Datum der genannten Datensatzart erhalten wurde.
 boolean isRebuildIndexFileFlagCreated(ArchiveDataKind adk)
          Gibt an, ob seit Systemstart die Datei PersistenceManager#REBUILDINDEX_FILE_FLAG_NAME nach einem Archivvorgang fuer diese DID erzeugt wurde.
 boolean lastDataNoSourceAssigned()
           
 boolean lastDataWasNoSource()
           
 long maxATime(ArchiveDataKind adk)
           
 long maxDIdx(ArchiveDataKind adk)
           
 long maxDTime(ArchiveDataKind adk)
           
 long minATime(ArchiveDataKind adk)
           
 long minDIdx(ArchiveDataKind adk)
           
 long minDTime(ArchiveDataKind adk)
           
 void rebuildIndexFileFlagWasCreated(ArchiveDataKind adk)
          Zur Kennzeichnung, dass die changed-Datei nach einem Archivvorgang fuer diese DID erzeugt wurde.
 void setCurContEntries(int adkIndex, int entries)
          Setzt die Anzahl der Datensaetze im aktuellen Container.
 void setFirstDataAfterSubscription(ArchiveDataKind adk, boolean flag)
          Setzt die Markierung, ob seit der letzten Anmeldung bereits ein Datum der genannten Datensatzart erhalten wurde (#isFirstDataAfterSubscription()
 void setLastOAWasNoSource(boolean lastOADataWasNoSource)
          Setzt die Markierung, ob der letzte waehrend der laufenden Uptime archivierte OA-Datensatz die Kennung "keine Quelle" hatte.
 void setLastQueryTime(long lastQueryTime)
          Setzt den Zeitpunkt der letzten Archivanfrage.
 java.lang.String toString()
           
 void updateIndexEntries(ArchiveDataKind adk, long dataIdx, long atime, long dtime)
          Setzt die Maximumwerte des aktuellen Indexeintrags auf die uebergebenen Werte.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

INVALID

public static final byte INVALID
See Also:
Constant Field Values

IDXSIZE_ONLINE

public static int IDXSIZE_ONLINE

IDXSIZE_REQUESTED

public static int IDXSIZE_REQUESTED
Constructor Detail

DataIdentNode

public DataIdentNode()
Method Detail

lastDataNoSourceAssigned

public boolean lastDataNoSourceAssigned()
Returns:
Wahr, falls der keine-Quelle-Status des letzten waehrend der laufenden Uptime archivierten OA-Datensatzes gesetzt wurde. Falls er nicht gesetzt wurde, muss im Container nachgesehen werden (aufwendig)

lastDataWasNoSource

public boolean lastDataWasNoSource()
Returns:
Wahr, falls der letzte waehrend der laufenden Uptime archivierte online-aktuelle Datensatz die Kennung "keine Quelle" hatte. Dies wird hier vermerkt, damit nicht jedesmal im Container nachgesehen werden muss.

setLastOAWasNoSource

public void setLastOAWasNoSource(boolean lastOADataWasNoSource)
Setzt die Markierung, ob der letzte waehrend der laufenden Uptime archivierte OA-Datensatz die Kennung "keine Quelle" hatte. (In diesem Fall muss kein Datenluecken-Datensatz erzeugt werden.)

Parameters:
lastOADataWasNoSource -

getLastQueryTime

public long getLastQueryTime()
Returns:
Zeitpunkt der letzten Archivanfrage, falls schon mal angefragt, 0 sonst.
See Also:
lastQueryTime

setLastQueryTime

public void setLastQueryTime(long lastQueryTime)
Setzt den Zeitpunkt der letzten Archivanfrage.

Parameters:
lastQueryTime -
See Also:
lastQueryTime

setFirstDataAfterSubscription

public void setFirstDataAfterSubscription(ArchiveDataKind adk,
                                          boolean flag)
Setzt die Markierung, ob seit der letzten Anmeldung bereits ein Datum der genannten Datensatzart erhalten wurde (#isFirstDataAfterSubscription()

Parameters:
adk - Datensatzart (OA oder ON)
flag -

isFirstDataAfterSubscription

public boolean isFirstDataAfterSubscription(ArchiveDataKind adk)
Sagt, ob nach einer Anmeldung bereits ein Datum der genannten Datensatzart erhalten wurde. Wenn dies nicht der Fall ist, darf der Datenindex gleich dem letzten archvierten Datenindex sein.

Parameters:
adk - Datensatzart (OA oder ON)
Returns:
Wahr oder falsch

getIndexFillRatio

public float getIndexFillRatio(ArchiveDataKind adk)

indexesAssigned

public boolean indexesAssigned(ArchiveDataKind adk)

assignNewIndexes

public void assignNewIndexes(int adkIndex)
Legt fuer die Datensatzart neue Indexe an, falls diese nicht existieren. containerEntries der Datensatzart werden auf INVALID, lastDataNoSourceAssigned()() liefert danach false.

Parameters:
adkIndex - Datensatzart (0:OA, 1:ON, 2:NA, 3:NN)

assignContinuedIndexes

public void assignContinuedIndexes(int adkIndex,
                                   java.lang.String basePath,
                                   byte[] tempMem,
                                   int lastContNumDS)
                            throws IndexException
Weist Indexe zur Weiterverwendung des letzten Eintrages zu. Der Aufrufer muss im letzten Container nachzaehlen und containerEntries der Datensatzart auf den entsprechenden Wert setzen.

Parameters:
adkIndex - Datensatzart (0:OA, 1:ON, 2:NA, 3:NN)
basePath - Pfad der Datenidentifikation und Datensatzart
tempMem - temporaerer Speicher (benoetigt zum Einlesen der Indexe)
lastContNumDS - Anzahl der DS im letzten Container
Throws:
IndexException

addIndexEntries

public void addIndexEntries(ArchiveDataKind adk,
                            java.lang.String basePath,
                            long dataIdx,
                            long atime,
                            long dtime,
                            long contID,
                            byte[] tempMem)
                     throws IndexException
Fügt den Indexen den spezifizierten Eintrag hinzu. containerEntries der Datensatzart wird auf 1 gesetzt.

Parameters:
adk - Datensatzart
basePath - Verzeichnis der Datenidentifikation + Datensatzart. Wird benötigt, damit der Datenzeitindex notfalls (bei einem Rücksprung) in der Datenzeitindex-Datei nachsehen kann.
dataIdx - Datenindex
atime - Archivzeit
dtime - Datenzeit
contID - Container-ID
tempMem - Speicherbereich, den der Datenzeitindex notfalls (bei einem Rücksprung) zum Einlesen der Datenzeitindexdatei verwenden kann. Wird als Parameter übergeben werden, um GC/Speicher zu sparen.
Throws:
IndexException

updateIndexEntries

public void updateIndexEntries(ArchiveDataKind adk,
                               long dataIdx,
                               long atime,
                               long dtime)
                        throws IndexException
Setzt die Maximumwerte des aktuellen Indexeintrags auf die uebergebenen Werte. Die Indexe muessen bereits (durch addIndexEntries(ArchiveDataKind, String, long, long, long, long, byte[]) angelegt worden sein; andernfalls ist dies ein schwerer Programmfehler. containerEntries der Datensatzart wird um 1 hochgezaehlt.

Parameters:
adk - Datensatzart
dataIdx - Datenindex
atime - Archivzeit
dtime - Datenzeit
Throws:
IndexException

closeIndexes

public void closeIndexes(ArchiveDataKind adk,
                         java.lang.String basePath,
                         byte[] tempMem)
                  throws IndexException
Schliesst die Indexe einer Datensatzart und gibt den belegten Speicher frei. Dabei wird die Indexdatei upgedated.

Parameters:
adk - Datensatzart
basePath - Pfad der Datenidentifikation und Datensatzart
tempMem - temporaerer Speicher (benoetigt zum Schreiben der Indexdateien)
Throws:
IndexException

getCurContEntries

public int getCurContEntries(ArchiveDataKind adk)
Liefert die Anzahl der Datensätze im aktuellen Container.

Parameters:
adk - Datensatzart (ArchiveDataKind: OA/ON/NA/NN)
Returns:
Anzahl der Datensätze im aktuellen Container.

setCurContEntries

public void setCurContEntries(int adkIndex,
                              int entries)
Setzt die Anzahl der Datensaetze im aktuellen Container. Aufruf ist nur notwendig, wenn ein Container nach Systemstart weiterbenutzt wird.

Parameters:
adkIndex - Datensatzart (0:OA, 1:ON, 2:NA, 3:NN)
entries - Anzahl der Datensaetze

minDTime

public long minDTime(ArchiveDataKind adk)
              throws IndexException
Parameters:
adk - Datensatzart (ArchiveDataKind: OA/ON/NA/NN)
Returns:
Datenzeit-Minimum des aktuellen Containers
Throws:
IndexException

maxDTime

public long maxDTime(ArchiveDataKind adk)
              throws IndexException
Parameters:
adk - Datensatzart (ArchiveDataKind: OA/ON/NA/NN)
Returns:
Datenzeit-Maximum des aktuellen Containers
Throws:
IndexException

minATime

public long minATime(ArchiveDataKind adk)
              throws IndexException
Parameters:
adk - Datensatzart (ArchiveDataKind: OA/ON/NA/NN)
Returns:
Archivzeit-Minimum des aktuellen Containers
Throws:
IndexException

maxATime

public long maxATime(ArchiveDataKind adk)
              throws IndexException
Parameters:
adk - Datensatzart (ArchiveDataKind: OA/ON/NA/NN)
Returns:
Archivzeit-Maximum des aktuellen Containers
Throws:
IndexException

minDIdx

public long minDIdx(ArchiveDataKind adk)
             throws IndexException
Parameters:
adk - Datensatzart (ArchiveDataKind: OA/ON/NA/NN)
Returns:
Datenindex-Minimum des aktuellen Containers
Throws:
IndexException

maxDIdx

public long maxDIdx(ArchiveDataKind adk)
             throws IndexException
Parameters:
adk - Datensatzart (ArchiveDataKind: OA/ON/NA/NN)
Returns:
Datenindex-Maximum des aktuellen Containers
Throws:
IndexException

getDataIdxContIDs

public IndexResult getDataIdxContIDs(ArchiveDataKind adk,
                                     java.lang.String basePath,
                                     byte[] tempMem,
                                     long minKey,
                                     long maxKey)
                              throws IndexException
Parameters:
adk - Datensatzart (ArchiveDataKind: OA/ON/NA/NN)
basePath - Pfad zum Containerverzeichnis
tempMem - Temporaerer Speicher (zum Einlesen der Indexdatei, falls notwendig)
minKey - Untere Grenze des Datenindexbereichs
maxKey - Obere Grenze des Datenindexbereichs
Returns:
Liste von ContainerIDs die Datensätze aus dem gewünschten Bereich enthalten.
Throws:
IndexException

getArSTimeContIDs

public IndexResult getArSTimeContIDs(ArchiveDataKind adk,
                                     java.lang.String basePath,
                                     byte[] tempMem,
                                     long minKey,
                                     long maxKey)
                              throws IndexException
Parameters:
adk - Datensatzart (ArchiveDataKind: OA/ON/NA/NN)
basePath - Pfad zum Containerverzeichnis
tempMem - Temporärer Speicher (zum Einlesen der Indexdatei, falls notwendig)
minKey - Untere Grenze des Archivzeitbereichs
maxKey - Obere Grenze des Archivzeitbereichs
Returns:
Liste von ContainerIDs die Datensätze aus dem gewünschten Bereich enthalten.
Throws:
IndexException

getDataTimeContIDs

public IndexResult getDataTimeContIDs(ArchiveDataKind adk,
                                      java.lang.String basePath,
                                      byte[] tempMem,
                                      long minKey,
                                      long maxKey)
                               throws IndexException
Parameters:
adk - Datensatzart (ArchiveDataKind: OA/ON/NA/NN)
basePath - Pfad zum Containerverzeichnis
tempMem - Temporärer Speicher (zum Einlesen der Indexdatei, falls notwendig)
minKey - Untere Grenze des Datenzeitbereichs
maxKey - Obere Grenze des Datenzeitbereichs
Returns:
Liste von ContainerIDs die Datensätze aus dem gewünschten Bereich enthalten.
Throws:
IndexException

getMinVal

public long getMinVal(TimingType tt,
                      ArchiveDataKind adk,
                      java.lang.String basePath)
               throws IndexException
Liefert den kleinsten jemals gespeicherten Wert der angegebenen Datensatzart und TimingType

Parameters:
tt - Datenzeit, Datenindex oder Archivzeit
adk - Datensatzart (ArchiveDataKind: OA/ON/NA/NN)
basePath - Pfad zum Containerverzeichnis
Returns:
kleinster Wert
Throws:
IndexException

enterCriticalArea

public boolean enterCriticalArea()
Muss immer vor der Benutzung von folgenden Daten eines DataIdentNodes aufgerufen werden:
Wenn ein anderer Task sich im kritischen Bereich befindet, blockiert diese Methode bis der kritische Bereich wieder frei ist. Der Aufrufer muss den Rueckgabewert der Methode auswerten und darf nur bei erfolgreichem Betreten des kritischen Bereichs mit dem DIN arbeiten.

Returns:
Wahr, wenn der Zugang in den kritischen Bereich erlaubt ist, falsch, wenn auf den Task interrupt() aufgerufen worden ist und deshalb das Warten auf den Zugang zum kritischen Bereich unterbrochen worden ist ohne den Zugang zu erhalten.

exitCriticalArea

public void exitCriticalArea()
Muss immer nach der Benutzung von Daten eines DataIdentNodes aufgerufen werden, wenn zuvor enterCriticalArea() augfgerufen worden ist. Eine der wartenden Tasks kann nun den kritischen Bereich betreten. Dieses Verfahren erfordert korrekte Verwendung, da nicht geprüft wird, ob der Aufrufer dieser Methode auch derjenige ist, der im kritischen Bereich ist.


enterBusyArea

public boolean enterBusyArea()
Muss immer vor der Benutzung von folgenden Daten eines DataIdentNodes aufgerufen werden:
Wenn ein anderer Task sich im Busy-Bereich befindet, blockiert diese Methode. Die Blockierung endet spaetestens nach 10 Minuten und die Methode liefert den Rueckgabewert. Der Aufrufer muss den Rueckgabewert auswerten und darf nur bei erfolgreichem Betreten des Busy-Bereichs mit den Daten des DIN arbeiten.

Returns:
Wahr, wenn der Zugang in den Busy-Bereich erlaubt ist, falsch, wenn das Warten auf den Zugang zum kritischen Bereich unterbrochen worden ist ohne den Zugang zu erhalten (durch Aufruf von interrupt() auf den Task oder durch Ablaufen des Timeouts beim Warten).

exitBusyArea

public void exitBusyArea()
Muss immer nach der Benutzung von Daten eines DataIdentNodes aufgerufen werden, wenn zuvor enterBusyArea() augfgerufen worden ist. Eine der wartenden Tasks kann nun den Busy-Bereich betreten. Dieses Verfahren erfordert korrekte Verwendung, da nicht geprüft wird, ob der Aufrufer dieser Methode auch derjenige ist, der im Busy-Bereich ist.


getOpenContID

public long getOpenContID(ArchiveDataKind adk)
                   throws IndexException
Liefert die ID des aktuell offenen Containers. Ein Container ist offen, wenn darin Daten archiviert werden. Wenn kein Container offen ist weil keine Daten vorhanden sind, das ArS mit einem geschlossenen Container gestartet wurde oder ein Container wegen einer Parameteraenderung geschlossen wurde, wird -1 zurueckgeliefert.

Returns:
Container-ID oder -1 falls bisher kein offener Container verwendet wurde.
Throws:
IndexException, - falls die Zustaende der Indexe nicht uebereinstimmen oder die ContainerIDs unterschiedlich sind
IndexException

arsParamSetParams

public void arsParamSetParams(Data params)
Setzt einen Zeiger auf den Datensatz mit der Parametrierung fuer diese Datenidentifikation

Parameters:
params -

arSParamIsArchivieren

public boolean arSParamIsArchivieren()
Liefert Kennzeichen, ob die Daten zu archivieren sind.

Returns:
Kennzeichen

arSParamIsNachfordern

public boolean arSParamIsNachfordern()
Liefert Kennzeichen, ob bei potentiell erkannten Datenluecken bei anderen Archivsystemen nachgefordert werden soll.

Returns:
Kennzeichen

arSParamGetAnzNachfordern

public int arSParamGetAnzNachfordern()
Liefert die Anzahl der Archivsysteme, bei denen nachgefordert werden soll.

Returns:
Anzahl Archivsysteme

arSParamGetNachfordern

public java.lang.String arSParamGetNachfordern(int at)
Liefert aus der Liste der Archivsysteme, bei denen bei potentiell erkannten Datenluecken nachgefordert werden soll, das Archivsystem mit dem angegebenen nullbasierten Index.

Parameters:
at - Index
Returns:
Archivsystem

arSParamIsSichern

public boolean arSParamIsSichern()
Liefert Kennzeichen, ob die Daten fuer diese Datenidentifikation zu sichern sind.

Returns:
Kennzeichen

arSParamGetQuittieren

public long arSParamGetQuittieren()
Liefert den AspektID unter dem quittiert werden soll, -1 falls nicht quittiert werden soll.

Returns:
Quittierungs-AspektID.

arSParamIsQuittieren

public boolean arSParamIsQuittieren()
Returns:
ob Datensaetze dieser Datenidentifikation zu quittieren sind.

arSParamIsQuittierenValid

public boolean arSParamIsQuittierenValid()
Returns:
ob quittiert werden soll und der Quittierungsaspekt erfolgreich angemeldet werden konnte.

arSParamMarkQuittierenInvalid

public void arSParamMarkQuittierenInvalid(boolean invalid)
Setzt die AspektID unter dem quittiert werden soll und vermerkt ihn als nicht erfolgreich angemeldet.

Parameters:
quittieren - Quittierungs-Aspekt.

arSParamGetVorhalten

public long arSParamGetVorhalten()
Liefert die Vorhaltezeit in Sekunden.

Returns:
Vorhaltezeit

isArSParameterized

public boolean isArSParameterized()
Liefert Kennzeichen, ob der DataIdentNode ueber die Archivparametrierung/Simulation angelegt wurde oder wegen einer Archivanfrage.

Returns:
wahr: ueber Archivparametrierung, falsch: wegen Archivanfrage

rebuildIndexFileFlagWasCreated

public void rebuildIndexFileFlagWasCreated(ArchiveDataKind adk)
Zur Kennzeichnung, dass die changed-Datei nach einem Archivvorgang fuer diese DID erzeugt wurde. Vermeidet einen Plattenzugriff, um dies festzustellen.

Parameters:
adk - Datensatzart

isRebuildIndexFileFlagCreated

public boolean isRebuildIndexFileFlagCreated(ArchiveDataKind adk)
Gibt an, ob seit Systemstart die Datei PersistenceManager#REBUILDINDEX_FILE_FLAG_NAME nach einem Archivvorgang fuer diese DID erzeugt wurde. Wenn nicht, muss der ArchivTask die Datei erzeugen und DataIdentNode#rebuildIndexFileFlagWasCreated() aufrufen, um fuer den Wiederanlauf nach einem ausserplanmaessigen Systemstop zu kennzeichnen, welche Datenidentifikation ueberprueft werden muss.

Parameters:
adk - Datensatzart
Returns:
Wahr, wenn seit Systemstart DataIdentNode#rebuildIndexFileFlagWasCreated() aufgerufen wurde, sonst falsch.

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object


Copyright © 2005-2008 beck et al. projects GmbH All Rights Reserved.