Show TOC Anfang des Inhaltsbereichs

Diese Grafik wird im zugehörigen Text erklärt MapExampleTwoTablesToFlatStructure  Dokument im Navigationsbaum lokalisieren

Problemstellung

In diesem Beispiel gibt es in der Ausgangsstruktur zwei Rekords:

·        Einen Person-Rekord, über den Id und Name einer Person in der Ausgangs-Message übergeben werden.

·        Einen Telephone-Rekord, über den zu einer PersonIdjeweils eine Telefonnummer in der Ausgangs-Message übergeben wird.

Der Name und die Telefonnummer einer Person werden also über getrennte Rekords gespeichert und lassen sich über einen Vergleich der Id des Person-Rekord mit der PersonId im Telephone-Rekord einander zuordnen.

Die Zielstruktur ist flach und speichert in einem Person-Rekord sowohl Id, Name als auch TelephoneNumber. Die Schwierigkeit bei diesem Message-Mapping besteht darin, zu dem Zeitpunkt, zu dem man ein Id-Feld in der Zielstruktur erzeugt, auch Name und Telefonnummer zu dieser Id zu wissen.

Lösung

Diese Grafik wird im zugehörigen Text erklärt

·        Zunächst müssen genauso viele Person-Rekords in der Zielstruktur erzeugt werden wie es Telephone-Rekords gibt. Das Ausgangsfeld Telephone ist daher dem Zielfeld Personzugewiesen.

·        Dem Zielfeld Id weisen Sie das Ausgangsfeld PersonIdzu. Da die Telefonnummer zu dieser Id im gleichen Kontext wie PersonId ist (Ausgangsfeld Number), können Sie es auch durch einfache Zuweisung übernehmen: TelephoneNumber = Number.

·        Schwieriger ist es, den Wert des Zielfeldes Name zu einer Id und einer Telefonnummer herauszubekommen. Sie müssten dazu vor der Ausführung des Message-Mappings bereits wissen, welche Namen zu welcher Id gehören.

Die erweiterte benutzerdefinierte Funktion getNameById merkt sich genau diese Information und gibt zu einer PersonId aus dem Telephone-Rekord den Namen aus dem Person-Rekord zurück:

Diese Grafik wird im zugehörigen Text erklärt

Die Funktion arbeitet folgendermaßen:

...

       1.      Die Funktion erwartet Id und Name im Persons-Kontext, so dass alle Ids und Namen innerhalb dieses Kontexts übergeben werden.

       2.      Die Grundidee ist, alle zusammengehörenden (Id, Name)-Paare in einem Container-Objekt zu speichern, um sie bei späteren Aufrufen wieder auslesen zu können. Dazu greift die Funktion am Anfang auf eine Map nameszu. Gibt es diese Map noch nicht, erzeugt die Funktion eine und speichert alle (Id, Name)-Paare in einer HashMap Diese Map wird an das Container-Objekt übergeben, so dass sie in weiteren Aufrufen der gleichen Funktion zur Verfügung steht.

       3.      Schließlich gibt die Funktion über das ResultList-Objekt den Namen zum Eingabeargument PersonId (a[0]) zurück.

Erweiterte benutzerdefinierte Funktion getNameById

public void getNameById(String[] a, String[] b, String[] c,
                        ResultList result, Container container){

Map map = (Map) container.getParameter("names");
if (map == null){
  map = new HashMap();
  for (int i = 0; i<b.length; i++){ 
  // if the payload is valid to xsd, b and c have equal length
    map.put(b[i], c[i]);
  }
  container.setParameter("names", map);
}

result.addValue((String)map.get(a[0]));

}

 

 

 

 

Ende des Inhaltsbereichs