TMLScript bietet neben seinen eigenen JavaScript-Objekten auch direkten Zugriff auf Java-Objekte.
TMLScript basiert auf "Rhino", der komplett in Java implementierten JavaScript-Engine die von der
Mozilla Group verwaltet und weiterentwickelt wird (Weitere Informationen auf der
Rhino Homepage). Daher stehen alle für diese Scripting-Engine verfügbaren Schnittstellen zu Java auch in TMLScript zur Verfügung.
Das Erstellen von simplen Java-Objekten in TMLScript ist nicht nur einfach, es unterscheidet sich auch kaum von der Erstellung normaler JavaScript-Klassen:
<tml:script>
var list = new java.util.HashSet();
list.add("Eintrag1");
list.add("Eintrag2");
list.add("Eintrag3");
this.setvar("set", list);
</tml:script>
Sie können die, in den Java-Standardpackages "java.*" enthaltenen Klassen, simpel und direkt instanzieren und mit ihren Methoden arbeiten. Wie hier demonstriert können diese Objekte sogar in TMLScript-Variablen abgespeichert und später verwendet werden.
Ein wenig aufwendiger ist es Klassen zu erstellen, die nicht zu den Java-Standardpackages gehören, z.B. ihre eigenen benutzerdefinierten Klassen:
<tml:script>
var myBean = Packages.de.innovationgate.beans.MyBean();
myBean.doSomething();
</tml:script>
Für diese Klassen muss das Schlüsselwort "Packages" vor den vollqualifizierten Klassennamen gestellt werden. Darüber hinaus ist die einzige Voraussetzung, dass die Klasse im Klassenpfad des Applikationsservers und der WGA-Applikation bekannt ist.
Auch statische Methoden und Eigenschaften sind wie in Java direkt an der Klasse verfügbar:
<tml:script>
return Packages.de.innovationgate.utils.WGUtils.strReplace("Fischers Fritz fischt frische Fische", "i", "ü", true);
</tml:script>
Methoden von Java-Objekten können in TMLScript normalerweise direkt aufgerufen werden. Werden hier Javascript-Objekte als Parameter verwendet, wie String, Number, Boolean etc., so werden sie für die Methode automatisch in ihre Java-Pendants konvertiert. Umgekehrt werden Java-Objekte die als Rückgabewerte dieser Methoden zurückkommen automatisch zu ihren Javascript-Pendants konvertiert.
Eine Ausnahme sind Datumswerte. Da das Javascript-Datumsobjekt Date nicht automatisch konvertiert wird empfiehlt sich stattdessen die Verwendung von Java-Datumsobjekten vom Typ "java.util.Date" sobald ein Datumswert eine Rolle spielt siehe
Datumswerte in TMLScript.
Es existiert eine Funktion javaObject() um Javascript-Objekte innerhalb von TMLScript in ihre Java-Pendants umzuwandeln. Dies kann notwendig sein wenn sie eine Methode verwenden wollen die sich nur am Java- jedoch nicht am Javascript-Objekt befindet:
<tml:script>
return javaObject(" ein string ").trim();
</tml:script>
Die Methode trim(), die es nur am Java- nicht jedoch am JavaScript-String gibt, kann verwendet werden wenn der String zuvor durch die vordefinierte Methode "javaObject" konvertiert wurde. Diese Methode macht alle Methoden des Java-Strings sichtbar, versteckt aber gleichzeitig auch die Methoden des Javascript-Strings.
Eine spezielle Funktionalität bietet TMScript/Rhino was Methoden mit JavaBean-Signaturen angeht, z.B.
String myObject.getName()
void myObject.setName(String name)
Diese Methoden können sowohl in ihrer vollständigen Version aufgerufen werden, sie können jedoch auch wie Felder behandelt werden, deren Wert ausgelesen bzw. geschrieben wird.
var name = myObject.name; // entspricht var name = myObject.getName()
myObject.name = name; // entspricht myObject.setName(name);
Die WGAPI ist der Kernbestandteil von WGA, der Verbindung zu den Content-Datenbanken aufbaut und sie nach Contents und Designs auswertet. Es handelt sich dabei um eine Objektbibliothek die in der Lage ist, alle für WGA verfügbaren Content-Quellen als Datenbanken auszuwerten. Gewissermassen setzt WGA auf der WGAPI auf und verwendet sie um an Daten zu kommen, während WGA selbst diese Daten im Internet publiziert. Wer Zugriff auf die WGAPI hat, der hat somit direkten Zugriff auf alle Daten und Funktionen der Content-Datenbanken.
TMLScript hat mehrere Schnittstellen zur WGAPI in Form von Methoden, die WGAPI-Objekte zurückgeben. Hier ein Beispiel:
<tml:script>
var db = this.db("ig");
var areaList = db.getAreas().iterator();
var result = "";
while (areaList.hasNext()) {
var area = areaList.next();
result += area.getName() + "<br/>";
}
return result;
</tml:script>
Über dieses Script wird eine Liste der, in der Datenbank mit Schlüssel "ig", enthaltenen Website-Bereiche erstellt. Der Zugriff auf die WGAPI wird hier über die Methode "this.db(dbkey)" hergestellt. Diese gibt ein Objekt vom Typ "WGDatabase" zurück, welches eine in WGA eingebundene Content-DB repräsentiert.
Eine andere Methode zum Zugriff auf die WGAPI ist besser, wenn man im aktuellen TML-Kontext auf die WGAPI zugreifen will:
<tml:script>
var content = this.content();
var contentTitle = content.title;
var structTitle = content.structEntry.title;
var areaName = content.structEntry.area.name;
</tml:script>
Über die Methode "this.content()" erhalten sie das "WGContent"-Objekt, welches in der WGAPI ein Content-Dokument repräsentiert. In diesem Falle ist es nicht ein x-beliebiges Content-Dokument sondern dasjenige, welches sich aktuell im TML-Kontext befindet. Natürlich haben sie auch hier Zugriff auf die Methoden des Content-Objektes, welche in diesem Beispiel alle in Property-Syntax ausgedrückt wurden (da sie JavaBean-Signaturen besitzen):
WGContent.getTitle()
WGContent.getStructEntry() // Ermittelt den Struktureintrag des Content-Dokumentes, und zwar als Objekt vom Typ "WGStructEntry")
WGStructEntry.getTitle()
WGStructEntry.getArea() // Ermittelt den Website-Bereich des Struktureintrages, und zwar als Objekt "WGArea")
WGArea.getName()
Mehr zu den Methoden und Objekten der WGAPI finden sie in der
WGAPI und HDB Javadoc Referenz.