In Abfragen deklarierte externe Funktionen mit XQuery verwenden

Ale Alternative zur Bindung von Java™-Methoden an Funktionen in einer Abfrage über die API können externe Java-Funktionen direkt in einer Abfrage deklariert werden. Die einzige zusätzlich erforderliche Konfiguration ist, dass während der Abfrageausführung gebundene Java-Klassen im Klassenpfad vorhanden sind.

Vorgehensweise

Mit der Deklaration der XQuery-Option "java-extension" können Sie ein Präfix an eine Java-Klasse binden.
declare option xltxe:java-extension "Präfix = Klassenname";
Anmerkung: Es kann jeder beliebige Präfixname für das Element "java-extension" verwendet werden, solange er an den Namespace http://www.ibm.com/xmlns/prod/xltxe-j gebunden ist.
Nachdem Sie ein Präfix an eine Java-Klasse gebunden haben, können Methoden in der gebundenen Klasse aufgerufen werden, indem Sie den Präfix- und den Methodennamen durch einen Doppelpunkt getrennt angeben:
Präfix:Methodenname(Parameter*)

Beispiel

Statische Methoden aufrufen

Wenn Sie eine XQuery-Quelle vorbereiten, die in einer Abfrage deklarierte externe Funktionen verwendet, deklarieren Sie das Präfix für die Java-Klassenbindung:
declare namespace calc="http://com.example/myApp/Calculator";
declare namespace sf="http://com.example/myApp/standardFormat";

declare namespace xltxe="http://www.ibm.com/xmlns/prod/xltxe-j";
declare option xltxe:java-extension "calc = org.company.Calculator";
declare option xltxe:java-extension "sf = org.standards.Formatter";

sf:format(calc:sqrt(64), "ISO-42.7")
Ist diese Abfrage beispielsweise über das xquerySource-Source-Objekt verfügbar, bereitet der folgende Code die Abfrage vor:
// Factory erstellen
XFactory factory = XFactory.newInstance();

// Ausführbares XQuery-Objekt für die Abfrage erstellen
XQueryExecutable executable = factory.prepareXQuery(xquerySource);
Der folgende Code führt die Abfrage aus, die in dem Beispiel vorbereitet wurde:
// Ergebnisobjekt zum Speichern des Umsetzungsergebnisses erstellen
Result result = new StreamResult(System.out);

// Ausführbare XSLT-Datei ausführen
XSequenceCursor xsc = executable.execute();

// Ergebnis ausgeben
xsc.exportSequence(res);

In der bereitgestellten Beispielabfrage wird angenommen, dass die Klasse "org.company.Calculator" eine statische Methode "sqrt()" enthält, die einen Parameter akzeptiert, und dass die Klasse "org.standards.Formatter" eine statische Methode "format()" enthält, die zwei Parameter akzeptiert. Während der Vorbereitung sind die Klassen im Klassenpfad nicht erforderlich. Während der Ausführung der Abfrage müssen die Klassen jedoch vorhanden sein.

Im Folgenden sehen Sie Beispielimplementierungen für die Klassen "org.company.Calculator" und "org.standards.Formatter":
package org.company;

public class Calculator {
    public static int sqrt(int val) {
        return (int)Math.sqrt(val);
    }
package org.standards;

public class Formatter {
    public static String format(int val, String pattern) {
        return "Formatting " + val + " using pattern " + pattern;
    }
}

Instanzdefinitionsmethoden aufrufen

Der Aufruf von Instanzdefinitionsmethoden über eine Klasse weicht geringfügig vom Aufruf statischer Methoden ab, weil ein Instanzobjekt vorausgesetzt wird. Zum Abrufen eines Instanzobjekts über eine Java-Klasse in einer Abfrage müssen Sie den neuen Konstruktor aufrufen:
Präfix:new(Params*)
Anschließend können Sie das Ergebnis, wie mit der folgenden Abfrage gezeigt, in einer XQuery-Variablendeklaration speichern:
declare namespace car="http://com.example/myApp/car";
declare namespace xltxe="http://www.ibm.com/xmlns/prod/xltxe-j";
declare option xltxe:java-extension "car = org.automobile.Car";
declare variable $var := car:new(3);

car:getDoors($var)
Ist diese Abfrage beispielsweise über das xquerySource-Source-Objekt verfügbar, bereitet der folgende Code die Abfrage vor.
// Factory erstellen
XFactory factory = XFactory.newInstance();

// Ausführbares XQuery-Objekt für die Abfrage erstellen
XQueryExecutable executable = factory.prepareXQuery(xquerySource);
Der folgende Code führt die Abfrage aus, die in dem Beispiel vorbereitet wurde:
// Ergebnisobjekt zum Speichern des Umsetzungsergebnisses erstellen
Result result = new StreamResult(System.out);

// Ausführbare XSLT-Datei ausführen
XSequenceCursor xsc = executable.execute();

// Ergebnis ausgeben
xsc.exportSequence(res);

Die Beispielabfrage setzt voraus, dass die Klasse "org.automobile.Car" einen Konstruktor enthält, der ein Argument des Typs "int" akzeptiert. Außerdem enthält die Klasse "org.automobile.Car" eine Instanzdefinitionsmethode "getDoors()", die keine Argumente akzeptiert. Die Syntax für den Aufruf von Instanzdefinitionsmethoden über externe Funktionen, die in einer Abfrage deklariert sind, erfordert, dass das erstellte Instanzobjekt als erstes Argument übergeben wird.

Im Folgenden sehen Sie eine Beispielimplementierung für die Klasse "org.automobile.Car":
package org.automobile;

public class Car {
    private int doors;
	
    public Car (int doors) {
        this.doors = doors;
    }
	
    public int getDoors() {
        return doors;
    }
}
Die Übernahme mit Instanzdefinitionsmethoden wird auch unterstützt. Wenn die Klasse "org.automobile.Car" eine Unterklasse "org.automobile.Sedan" hat, können Sie eine Instanz der Klasse "org.automobile.Sedan" erstellen und diese für den Aufruf von Methoden in "org.automobile.Car" verwenden. Diese wird anhand der folgenden Abfrage veranschaulicht:
declare namespace car="http://com.example/myApp/car";
declare namespace sedan="http://com.example/myApp/sedan";
declare namespace xltxe="http://www.ibm.com/xmlns/prod/xltxe-j";
declare option xltxe:java-extension "car = org.automobile.Car";
declare option xltxe:java-extension "sedan = org.automobile.Sedan";

declare variable $var := sedan:new(5);

car:getDoors($var)
Im Folgenden sehen Sie eine Beispielimplementierung für "org.automobile.Sedan":
package org.automobile;

public class Sedan extends Car {
    public Sedan (int doors) {
        super(doors);
    }
}
Einschränkung: Der für das Auflösen von Methoden in einer Java-Klasse verwendete Mechanismus erfordert, dass nur eine einzige Methode vorhanden ist, deren Name und Stelligkeit übereinstimmt. Wenn mehrere Methoden mit demselben Namen und unterschiedlicher Stelligkeit vorhanden sind, wird ein Fehler ausgelöst.

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_funcs_query_xquery
Dateiname:txml_funcs_query_xquery.html