Utilisation de fonctions externes query-declared avec XQuery
En tant qu'alternative à la liaison de méthodes Java™ à des fonctions dans une requête utilisant l'API, les fonctions externes Java peuvent être déclarées directement dans une requête. Des classes Java liées doivent exister sur le chemin d'accès aux classes lors de l'exécution de la requête, il s'agit de la seule configuration supplémentaire requise.
Procédure
declare option xltxe:java-extension "prefix = className";
prefix:methodName(Params*)
Exemple
Appel des méthodes statiques
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")
// Create the factory
XFactory factory = XFactory.newInstance();
// Create an XQuery executable for the query
XQueryExecutable executable = factory.prepareXQuery(xquerySource);
// Create a result object to store the transformation result
Result result = new StreamResult(System.out);
// Execute the XSLT executable
XSequenceCursor xsc = executable.execute();
// Output the result
xsc.exportSequence(res);
La requête exemple fournie supposse que la classe org.company.Calculator contient une méthode statique sqrt() qui utilise un paramètre. La classe org.standards.Formatter contient une méthode statique format() qui utilise deux paramètres. Lors de la préparation, les classes ne sont pas requises sur le chemin d'accès aux classes mais elles le sont lors de l'exécution de la requête.
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;
}
}
Appel des méthodes d'instance
prefix:new(Params*)
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)
// Create the factory
XFactory factory = XFactory.newInstance();
// Create an XQuery executable for the query
XQueryExecutable executable = factory.prepareXQuery(xquerySource);
// Create a result object to store the transformation result
Result result = new StreamResult(System.out);
// Execute the XSLT executable
XSequenceCursor xsc = executable.execute();
// Output the result
xsc.exportSequence(res);
La requête exemple suppose que la classe org.automobile.Car contient un constructeur qui utilise un argument de type int. De plus la classe org.automobile.Car contient également une méthode d'instance getDoors() qui n'utilise aucun argument. La syntaxe d'appel des méthodes d'instance à partir des fonctions externes query-declared requiert que l'objet d'instance créé soit transmis en tant que premier argument.
package org.automobile;
public class Car {
private int doors;
public Car (int doors) {
this.doors = doors;
}
public int getDoors() {
return doors;
}
}
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)
package org.automobile;
public class Sedan extends Car {
public Sedan (int doors) {
super(doors);
}
}