public final class JDataSet extends java.lang.Object implements java.io.Serializable, RowContainer
Üblicherweise wird ein DataSet von einem Persistenz-Layer
erzeugt und an den Client übertragen.
Der Client nimmt Änderungen, Ergänzungen an den Daten vor und
schickt die so veränderte Struktur zurück an den Persistenz-Layer.
Dort werden die Informationen gemäß den vorgenommenen Änderungen
in die Datenbank geschrieben, bzw. aus ihr gelöscht.
Die Oberfläche des Client sollte ein Binding an dieses Modell
ermöglichen.
Ein DataSet umfaßt sowohl Informationen über die Datenstruktur (Tabellen, Relationen, Columns) als auch die Daten selbst in Form von Zeilen und der Werte.
Gemäß dieser Datenstruktur nehmen die Tabellen in einem DataSet verschiedene Rollen ein:
Gemäß der definierten DatenStruktur nimmt eine DataRow eine die entsprechende Rolle ein:
Package Diagram

Class Diagram
Hierbei wird der Pfad zu dem gewünschten Objekt über
die Child und Parent Referenzen gebildet, durch einen
Delimiter getrennt.
Beispiel:
adresse.person#funktion@bezeichnung
Es wird die Column "bezeichnung" aus der Tabelle "funktion"
geliefert, wobei "funktion" eine Parent Table von "person" ist
und "person eine Child Table von "adresse".
Ein "." liefert also eine Child Table,
ein "#" eine Parent Table
und "@" am Ende den Feldnamen.
"." und "#" dürfen dabei beliebig häufig vorkommen, "@" naturgemäß nur einmal am Ende, wobei "@" auf weggelassen werden kann, wenn auf eine Table oder Row zugegriffen werden soll.
Die Notation unterscheidet sich, wenn auf die Struktur
des Dataset oder seine Daten zugegriffen wird:
Child Rows können ihrer Natur nach mehrfach vorhanden sein;
um auf sie zuzugreifen muß ggf. ihr Index angegeben werden:
adresse[4].person[15]#funktion@bezeichnung
Die Angaben "[n]" sind 0-relativ. Wird kein Index
angegeben, wird "0" angenommen.
Beim Datentyp Object ist zu beachten, dass dieses dem Datentyp der Column entsprechen muß.
| Modifier and Type | Class and Description |
|---|---|
static class |
JDataSet.ProfileEntry |
| Constructor and Description |
|---|
JDataSet()
Deprecated.
For serialization purpose only.
|
JDataSet(electric.xml.Document doc)
Erzeugt einen DataSet aus einem XML-Document.
|
JDataSet(java.lang.String name)
Erzeugt einen leeren DataSet.
|
| Modifier and Type | Method and Description |
|---|---|
void |
addChildRow(JDataRow row)
Fügt eine Root-Row hinzu.
|
void |
addChildRow(JDataRow row,
int index)
Fügt eine ChildRow an dem entsprechenden Index ein.
|
JDataRow |
addChildRowPath(java.lang.String path)
Fügt eine Zeile am angegebenen Pfad ein.
|
void |
addRootTable(JDataTable tbl)
Fügt dem DataSet eine neue Wurzeltabelle hinzu.
|
JDataRow |
addRow()
Deprecated.
|
void |
addRow(JDataRow row)
Deprecated.
|
JDataRow |
addRow(java.lang.String refname)
Deprecated.
|
void |
commitChanges()
Alle Kennzeichnungen von inserted und modified
werden zurückgesetzt.
|
void |
create(electric.xml.Document doc)
Deprecated.
For serialization purpose only.
|
void |
create(java.lang.String s)
Deprecated.
For serialization purpose only.
|
JDataRow |
createChildRow()
Fügt dem DataSet eine neue leere Zeile hinzu.
|
JDataRow |
createChildRow(java.lang.String refname)
Fügt der angegebenen Root Table dieses Dataset
eine neue leere Zeile hinzu.
|
static JDataSet |
CSV2Dataset(java.lang.String dsName,
java.lang.String csv)
Erzeugt aus einem Dataset-Namen und einem CSV-File
in dem in der ersten Zeile die Feldnamen stehen
und in der zweiten Zeile die Feldtypen
einen Dataset und eine DataTable mit dem angegebenen Namen
und DataRows mit den folgenden Werten.
|
long |
endProfiler()
Mißt die seit dem start vergangene Zeit.
|
JDataSet |
getChanges()
Liefert einen DataSet der nur die DataRows enthält,
die verändert wurden; also inserted, delete, modified.
|
JDataSet |
getChangesPersistent() |
JDataRow |
getChildRow(int index)
Liefert die WurzelZeile aus dem DataSet mit dem angegebenen Index
(0-relativ).
|
JDataRow |
getChildRow(java.lang.String refname,
int index)
Liefert die Child Row zu der angegebenen Tabelle
mit dem angegegeben Index (0-relativ).
|
JDataRow |
getChildRow(java.lang.String refname,
java.lang.String arg)
Findet die ChildRow bei der die angegebene Spalte den angegebenen Wert hat
(im Format name=value)
|
java.util.Iterator<JDataRow> |
getChildRows()
Liefert den Iterator für die Root Rows oder null, wenn keine Rows vorhanden.
|
java.util.Collection<JDataRow> |
getChildRows(DataView view)
Liefert eine unmodifiable Collection von DataRows,
die durch den DataView entsprechend gefiltert und/oder sortiert sind.
|
java.util.Iterator<JDataRow> |
getChildRows(java.lang.String tablename)
Liefert einen Iterator über alle Root Rows zu der angegebenen
Table.
|
JDataSet |
getClone()
Erzeugt einen Clone dieses DataSet ohne Profiling-Informationen
|
java.lang.String |
getDatabaseName() |
JDataColumn |
getDataColumnPath(java.lang.String path)
Liefert die DataColumn mit dem angegebenen Pfad in der Notation
root[x].child1[y].child2[z]#parent1#parent2@column1
|
JDataRow |
getDataRowPath(java.lang.String path)
Liefert die DataRow mit dem angegebenen Pfad.
|
java.util.Iterator<JDataRow> |
getDataRowsPath(java.lang.String path)
Liefert die Child Rows mit dem angegebenen Pfad.
|
java.lang.String |
getDatasetName()
Beim Einsatz eines Persistenz-Layers dient dieser
Name der Identifikation des Dataset-Typs.
|
JDataTable |
getDataTable()
Liefert die Wurzel-Tabelle.
|
JDataTable |
getDataTable(java.lang.String name)
Liefert eine Wurzel-Tabelle aus dem Dataset unter
Angabe ihres Namens.
|
JDataTable |
getDataTablePath(java.lang.String path)
Liefert die DataTable mit dem angegebenen Pfad.
|
java.util.Iterator<JDataTable> |
getDataTables()
Liefert den Iterator auf die Root Tables.
|
JDataValue |
getDataValuePath(java.lang.String path)
Liefert den DataValue mit dem angegebenen Pfad in der Notation
root[x].child1[y].child2[z]#parent1#parent2@column1
|
long |
getOid() |
java.util.ArrayList<JDataSet.ProfileEntry> |
getProfiler()
Liefert die Profiling-Daten
|
JDataRow |
getRow()
Liefert die WurzelZeile aus dem DataSet.
|
JDataRow |
getRow(int index)
Deprecated.
|
int |
getRowCount()
Liefert die Anzahl der Rows der RootTable.
|
int |
getRowCount(java.lang.String tablename)
Liefert die Anzahl der Rows zu der angegebenen Tabelle.
|
java.util.Iterator<JDataRow> |
getRows()
Deprecated.
|
java.util.Iterator<JDataRow> |
getRows(NVPair condition)
Deprecated.
|
java.util.Iterator<JDataRow> |
getRows(java.lang.String refname)
Deprecated.
|
int |
getSize()
Liefert die (ungefähre) Größe des Objects (ObjectOutputStream)
|
java.lang.String |
getUsername() |
java.lang.String |
getValidationError()
Liefert eine Auflistung von Fehlern zurück, die nach der Validierung festgestellt wurden.
|
java.util.Date |
getValueDatePath(java.lang.String path) |
java.util.Date |
getValueDatePath(java.lang.String path,
java.util.Date defaultValue) |
int |
getValueIntPath(java.lang.String path) |
int |
getValueIntPath(java.lang.String path,
int defaultValue) |
long |
getValueLongPath(java.lang.String path) |
long |
getValueLongPath(java.lang.String path,
long defaultValue) |
java.lang.String |
getValuePath(java.lang.String path)
Liefert den Wert des angegebene Feldes;
Notation: root[x].child1[y].child2[z]#parent1#parent2@column1
|
java.lang.String |
getValuePath(java.lang.String path,
java.lang.String defaultValue)
Liefert den Wert des angegebene Feldes oder
wenn diese null, den übergebenen DefaultValue
|
java.lang.String |
getWarning() |
electric.xml.Document |
getXml()
Liefert den DataSet als XML-Document.
|
electric.xml.Document |
getXml(boolean bProfile) |
electric.xml.Document |
getXml(boolean bProfile,
java.lang.String encoding) |
electric.xml.Document |
getXml(java.lang.String encoding) |
boolean |
hasChangeProtocol()
Gibt an, ob eine der Root-Tables des DataSet ein Änderungsprotokoll haben
|
boolean |
hasChanges()
Liefert true, wenn sich irgendeine DataRow des DataSet
geändert hat (inserted, deleted, modified).
|
boolean |
hasChangesPersistent() |
boolean |
isDatasetTableObject(JDataTable tbl)
Es wird geprüft, ob das übergebene DataTable-Object
in irgendeiner Form Bestandteil dieses Dataset ist.
|
boolean |
isEmpty()
Liefert true, wenn der DataSet keine DataRows enthält
(wohl aber beliebige Metadaten)
|
boolean |
isReadonly() |
boolean |
isRootTable(JDataTable tbl)
Prüft, ob die angegebene Tabelle eine Wurzel-Tabelle des
DataSet ist.
|
boolean |
isVerified()
Liefert das Ergebnis von verify().
|
void |
merge(JDataSet ds)
Mischt einen Dataset hinzu; dabei werden die RootTables
und RootRows aus dem angegebenen Dataset übernommen.
|
void |
resetErrorState() |
void |
resetProfiler()
Löscht die bisher aufgelaufenen Profiling-Daten.
|
void |
rollbackChanges()
Macht alle getätigten Änderungen seit dem letzten Commit
wieder rückgängig.
|
void |
rollbackVersion(java.lang.String fieldName)
Setzt den Zähler für das optimistische Locking wieder zurück
(für JournalDirectory)
|
void |
setDatabaseName(java.lang.String databaseName) |
void |
setDatasetName(java.lang.String name)
Der Name des DataSet, wie in DatabaseConfig.xml spezifiziert.
|
void |
setDeleted(boolean b)
Löscht alle vom DataSet gehaltenen Rows.
|
void |
setInserted(boolean b)
Setzt alle vom DataSet gehaltenen Rows auf "inserted".
|
void |
setOid(long oid)
Es kann ein beliebiger Wert gesetzt werden,
der von diesem Framework selbst nie benutzt wird.
|
void |
setReadonly(boolean readonly) |
void |
setUsername(java.lang.String username)
Setzt den Usernamen für diesen Dataset.
|
java.lang.String |
setValuePath(java.lang.String path,
boolean value)
Setzt den Wert des angegebene Feldes;
Notation: root[x].child1[y].child2[z]#parent1#parent2@column1
|
java.lang.String |
setValuePath(java.lang.String path,
java.util.Date value)
Setzt den Wert des angegebene Feldes;
Notation: root[x].child1[y].child2[z]#parent1#parent2@column1
|
java.lang.String |
setValuePath(java.lang.String path,
int value)
Setzt den Wert des angegebene Feldes;
Notation: root[x].child1[y].child2[z]#parent1#parent2@column1
|
java.lang.String |
setValuePath(java.lang.String path,
long value)
Setzt den Wert des angegebene Feldes;
Notation: root[x].child1[y].child2[z]#parent1#parent2@column1
|
java.lang.String |
setValuePath(java.lang.String path,
java.lang.Object value)
Die Konvertierung nach String hängt vom Sql-DatenTyp ab.
|
java.lang.String |
setValuePath(java.lang.String path,
java.lang.String value)
Setzt den Wert des angegebene Feldes;
Notation: root[x].child1[y].child2[z]#parent1#parent2@column1
|
void |
setVerified(boolean verified) |
void |
setWarning(java.lang.String warning)
Es kann ein beliebiger Wert gesetzt werden,
der von diesem Framework selbst nie benutzt wird.
|
java.util.Vector<JDataSet> |
split()
Teilt ein Dataset, welches mehrere RootTables enthält.
|
java.util.Vector<JDataSet> |
splitMulti2Single()
Erzeugt aus einem Dataset mit genau einer DataTable aber vielen DataRows
einen Ergebnisvector von DataSets mit genau einer Row.
|
int |
startProfiler(java.lang.String name)
Startet den Profiler unter Angabe eines eindeutigen Namens.
|
static JDataSet |
toDataset(java.lang.Object o)
Erzeugt aus dem übergebenen Object einen DataSet.
|
void |
toObject(java.lang.Object o)
Weist die Werte aus diesem DataSet dem übergebenen
Object zu, wenn es über entsprechende setter oder public Member verfügt.
|
java.lang.String |
toString()
Liefert der DataSet als getXml().toString()
|
java.lang.String |
toString(java.lang.String encoding) |
boolean |
verify()
Überprüft alle Rows dieses DataSet.
|
public JDataSet()
public JDataSet(java.lang.String name)
Der - (beliebige) Name des DataSetpublic JDataSet(electric.xml.Document doc)
public void create(java.lang.String s)
public void create(electric.xml.Document doc)
public electric.xml.Document getXml()
public electric.xml.Document getXml(java.lang.String encoding)
public electric.xml.Document getXml(boolean bProfile)
public electric.xml.Document getXml(boolean bProfile,
java.lang.String encoding)
bProfile - false liefert keine Profiling-Informationenpublic JDataSet getClone()
public java.lang.String getDatasetName()
public java.util.Vector<JDataSet> split()
ds - public java.util.Vector<JDataSet> splitMulti2Single()
IllegalStateException, wenn der DataSet merh als eine RootTable hat.public void merge(JDataSet ds)
ds - public void addRootTable(JDataTable tbl)
tbl - public JDataTable getDataTable(java.lang.String name)
name - public JDataTable getDataTable()
Wirft eine IllegalStateException, wenn die Zahl der Wurzeltabellen != 1 ist.
getDataTable in interface RowContainerpublic boolean isRootTable(JDataTable tbl)
tbl - public boolean isDatasetTableObject(JDataTable tbl)
tbl - public java.util.Iterator<JDataTable> getDataTables()
public JDataTable getDataTablePath(java.lang.String path)
Notation: root.child1[x].child2[y]#parent1#parent2
path - public JDataRow getDataRowPath(java.lang.String path)
Notation: root[x].child1[y].child2[Spalte=Wert]#parent1#parent2
path - public java.util.Iterator<JDataRow> getDataRowsPath(java.lang.String path)
path - public JDataColumn getDataColumnPath(java.lang.String path)
path - public JDataValue getDataValuePath(java.lang.String path)
path - public java.lang.String getValuePath(java.lang.String path)
path - public java.lang.String getValuePath(java.lang.String path,
java.lang.String defaultValue)
path - dValue - public java.util.Date getValueDatePath(java.lang.String path)
public java.util.Date getValueDatePath(java.lang.String path,
java.util.Date defaultValue)
public int getValueIntPath(java.lang.String path)
public int getValueIntPath(java.lang.String path,
int defaultValue)
public long getValueLongPath(java.lang.String path)
public long getValueLongPath(java.lang.String path,
long defaultValue)
public java.lang.String setValuePath(java.lang.String path,
java.lang.String value)
path - public java.lang.String setValuePath(java.lang.String path,
java.util.Date value)
path - value - Ein Datumpublic java.lang.String setValuePath(java.lang.String path,
java.lang.Object value)
path - value - public java.lang.String setValuePath(java.lang.String path,
long value)
path - public java.lang.String setValuePath(java.lang.String path,
int value)
path - public java.lang.String setValuePath(java.lang.String path,
boolean value)
path - public java.util.Iterator<JDataRow> getRows()
getChildRows()public java.util.Iterator<JDataRow> getChildRows()
getChildRows in interface RowContainerpublic java.util.Iterator<JDataRow> getRows(NVPair condition)
condition - FieldName, FieldValueLiefert einen Iterator über die Root Rows,
bei denen der Wert eines Feldes der angegebenen Bedingung entspricht.public JDataRow getRow()
Wirft eine IllegalStateException, wenn der DataSet leer ist oder mehr als eine WurzelZeile vorhanden.
public JDataRow getRow(int index)
index - getChildRow(int)public JDataRow getChildRow(int index)
index - public JDataRow getChildRow(java.lang.String refname, int index)
Wirft eine IllegalArgumentException, wenn Index out of Range.
getChildRow in interface RowContainerrefname - index - public JDataRow getChildRow(java.lang.String refname, java.lang.String arg)
refname - arg - SpaltenName=SpaltenWertpublic java.util.Iterator<JDataRow> getRows(java.lang.String refname)
refname - getChildRows(String)public java.util.Iterator<JDataRow> getChildRows(java.lang.String tablename)
getChildRows in interface RowContainertablename - public java.util.Collection<JDataRow> getChildRows(DataView view)
RowContainergetChildRows in interface RowContainerpublic void addRow(JDataRow row)
row - addChildRow(de.jdataset.JDataRow)public void addChildRow(JDataRow row)
addChildRow in interface RowContainerrow - public void addChildRow(JDataRow row, int index)
RowContainerWirft eine IllegalArgumentException, wenn der Index außerhalb des definierten Bereichs ist.
addChildRow in interface RowContainerpublic JDataRow addRow(java.lang.String refname)
refname - createChildRow(String)public JDataRow createChildRow(java.lang.String refname)
createChildRow in interface RowContainerrefname - public JDataRow addRow()
createChildRow(java.lang.String)public JDataRow createChildRow()
Achtung!
Diese funktioniert nur, wenn dem DataSet genau eine
Root Table zugeordnet ist.
createChildRow in interface RowContainerpublic JDataRow addChildRowPath(java.lang.String path)
Achtung!
Das geht schief, wenn die übergeordneten Rows
nicht existieren!
path - public int getRowCount(java.lang.String tablename)
tablename - public int getRowCount()
public boolean isEmpty()
public JDataSet getChanges()
Dieser DataSet ist also ein Subset des vorhanden; der Sinn dieser Methode besteht darin, dass nur modifizierte Daten an den Persistenz Layer übertragen werden, und so Bandbreite im Netz gespart wird.
Es werden allerdings auch die Rows mit übertragen, die für die Abbildung der Relationen nötig sind.
Wenn die Daten erfolgreich übertragen wurden, ist anschließend commitChanges aufzurufen.
commitChanges(),
hasChanges()public JDataSet getChangesPersistent()
public boolean hasChanges()
hasChanges in interface RowContainergetChanges(),
commitChanges()public boolean hasChangesPersistent()
public void commitChanges()
Diese Methode wird üblicherweise aufgerufen nachdem die Daten in die Datenbank zurückgeschrieben wurden.
commitChanges in interface RowContainerJDataRow.setDeleted(boolean),
hasChanges(),
getChanges()public void rollbackChanges()
Geänderte Felder werden wieder auf den alten Wert gesetzt, die Markierung von gelöschten Zeilen wird zurückgenommen, eingefügte Zeilen werden wieder gelöscht.
commitChanges()public void setDeleted(boolean b)
public void setInserted(boolean b)
Dabei werden alle PK-Felder auf null gesetzt.
Wird der DataSet anschließend dem PL übergeben, werden diese Daten mit
frischen IDs eingefügt.
Auf diese Art wird quasi ein "saveAs" für diesen DataSet ausgeführt.
b - public final java.lang.String getUsername()
setUsername(java.lang.String)public final void setUsername(java.lang.String username)
Da der Persistenz-Layer keine User-Sessions kennt, muß hier der Username übergeben werden, wenn dieser beim Insert und Update in der Datenbank vermerkt werden soll.
username - public final long getOid()
setOid(long)public final void setOid(long oid)
Der Sinn besteht darin, daß serverseitige Dienste, die JDataSets erstellen, hier "Nachrichten" für den Client übergeben können.
oid - public final java.lang.String getWarning()
setWarning(java.lang.String)public final void setWarning(java.lang.String warning)
Der Sinn besteht darin, daß serverseitige Dienste, die JDataSets erstellen, hier "Nachrichten" für den Client übergeben können.
warning - public void setDatasetName(java.lang.String name)
name - public java.lang.String toString()
toString in class java.lang.ObjectgetXml()public java.lang.String toString(java.lang.String encoding)
public boolean verify()
Das Ergebnis dieser Prüfung wird im DataSet vorgehalten.
isVerified(),
getValidationError(),
JDataValue.verify(boolean)public boolean isVerified()
verify()public void setVerified(boolean verified)
verified - The verified to set.public java.lang.String getValidationError()
public void resetErrorState()
JDataRow.resetErrorState()public int getSize()
public boolean isReadonly()
public void setReadonly(boolean readonly)
readonly - The readonly to set.public java.lang.String getDatabaseName()
public void setDatabaseName(java.lang.String databaseName)
databaseName - The databaseName to set.public void rollbackVersion(java.lang.String fieldName)
public int startProfiler(java.lang.String name)
public long endProfiler()
startProfiler(String)public void resetProfiler()
public java.util.ArrayList<JDataSet.ProfileEntry> getProfiler()
JDataSet.ProfileEntrypublic boolean hasChangeProtocol()
public static JDataSet CSV2Dataset(java.lang.String dsName, java.lang.String csv) throws java.lang.Exception
Die Zeilen sind mit \n getrennt und die Werte mit ";".
TODO: gehört diese Methode nicht in eine DatasetFactory?
dsName - csv - java.lang.Exceptionpublic static JDataSet toDataset(java.lang.Object o)
Es wird eine DataTable mit dem Klassennamen des Objekts angelegt. Dabei werden alle getter (inc is...) oder public Members in Spalten der Tabelle verwandelt.
Es wird eine DataRow mit den Werten dieser Attribute angelegt.
o - toObject(Object)public void toObject(java.lang.Object o)
o - toDataset(Object)