Fork me on GitHub

Verwendung

Mit dem Context wird der Marshaller und der Unmarsaller erzeugt. Der Marshaller überführt ein POJO (Plain old Java Object) in eine Attributgruppe (Data). Der Unmarshaller überführt umgekehrt eine Attributgruppe (Data) in ein POJO.

Es können beliebige POJOs, also Klassenobjekte, als Datum einer Attributgruppen verwendet werden. Die Properties der Klasse werden als Attribut der Attributgruppe interpretiert.

Die Attributtypen werden wie folgt auf Typen der Properties abgebildet:

Abbildung von Java-Typen auf Attributtypen
Attributtyp Java-Typ Anmerkung
Zeichenkette String
Ganzzahl byte 
short 
int 
long 
double 
boolean 
enum
für Wertebereich 8 Bit 
für Wertebereich 16 Bit 
für Wertebereich 32 Bit 
für Wertebereich 64 Bit 
für Festkommazahlen 
für Attributtyp JaNein 
für Aufzählungstypen (Attributtyp hat nur Zustände)
Kommazahl float 
double 
für Wertebereich 32 Bit 
für Wertebereich 64 Bit
Zeitstempel LocalDateTime 
Duration 
Date 
long
für absoluten Zeitstempel 
für relativen Zeitstempel 
für absoluten Zeitstempel 
für relativen Zeitstempel
Objektreferenz SystemObject
Attributliste Object POJO analog zur Attributgruppe
Attributfeld Collection 
Feld

Beispiel für das Marshalling

DataModel model = ...
Context context = new Context(model);

MessQuerschnittAllgemein datum = new MessQuerschnittAllgemein();
datum.setTyp(MessQuerschnittTyp.HauptFahrbahn);
datum.setErsatzMessQuerschnitt(model.getObject("mq.a10.0000"));

Marshaller marshaller = context.createMarshaller();
Data data = marshaller.marshal(datum);

Beispiel für das Unmarshalling

DataModel model = ...
Context context = new Context(model);

AttributeGroup atg = model.getAttributeGroup("atg.messQuerschnittAllgemein");
Data data = model.getObject("mq.a10.0000").getConfigurationData(atg);

Unmarshaller unmarshaller = context.createUnmarshaller();
MessQuerschnittAllgemein datum = unmarshaller.unmarshal(data, MessQuerschnittAllgemein.class);

Datensätze abrufen und senden

Die Schnittstelle Datenverteiler bietet die am häufigsten verwendeten Operationen mit dem Datenverteiler:

  • Sendeanmeldung als Quelle oder Sender für Datensätze
  • Empfangsanmeldung als Senke oder Empfänger für Datensätze
  • Senden von Datensätzen
  • Abruf von Parametern
  • Lesen von Konfigurationsdaten

Der Empfang von Datensätzen erfolgt über die Klasse Datensatz die ein Datum für ein Objekt als POJO wie oben beschrieben kapselt. Die Klasse DatenverteilerImpl stellt eine Standardimplementierung der Schnittstelle bereit.

Anmelden als Empfänger für Datensätze

Datenverteiler dav = ...
Aspect aspekt = dav.getAspekt("asp.messWertErsetzung");
SystemObject umfelddatensensor = dav.getObjekt("ufds.helligkeit");
dav.anmeldenAlsEmpfaenger(this::verarbeiteDatensatz, Collections.singleton(umfelddatensensor), UfdsHelligkeit.class, aspekt, Empfaengeroption.NORMAL);

Mit einer Methode in der selben Klasse:

private void verarbeiteDatensatz(Datensatz<UfdsHelligkeit> datensatz) {
    // ...
}

Anmelden für den Empfang von Parametern und Direktabruf

Datenverteiler dav = ...
SystemObject umfelddatensensor = dav.getObjekt("ufds.helligkeit");
dav.anmeldenAufParameter(d -> System.out.println(d), Collections.singleton(umfelddatensensor), UfdsHelligkeitFuzzy.class);
// ... oder den Parameter direkt abrufen mit ...
Datensatz<UfdsHelligkeitFuzzy> datensatz = dav.getParameter(umfelddatensensor, UfdsHelligkeitFuzzy.class);

Konfigurationsdaten lesen

Datenverteiler dav = ...
SystemObject messquerschnitt = dav.getObjekt("mq.a10.1");
MessQuerschnittAllgemein datum = dav.getKonfiguration(messquerschnitt, MessQuerschnittAllgemein.class);

Datensätze senden

Datenverteiler dav = ...
SystemObject stau = dav.getObjekt("stau.1");
StauVerlauf datum = new StauVerlauf();
datum.setDauer(Duration.ofMinutes(30));
// datum.set...
Aspect aspekt = dav.getAspekt("asp.prognoseNormal");
dav.anmeldenAlsQuelle(Collections.singleton(stau), StauVerlauf.class, aspekt);
dav.sendeDatensatz(Datensatz.of(stau, datum, aspekt));
// ... oder als Collection ...
Set<Datensatz<StauVerlauf>> datensaetze = Collections.singleton(Datensatz.of(stau, datum, aspekt));
dav.sendeDatensaetze(datensaetze);