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

En utilisant la déclaration d'option XQuery java-extension, vous pouvez lier un préfixe à une classe Java.
declare option xltxe:java-extension "prefix = className";
Remarque : Tout nom de préfixe peut être utilisé pour l'élément java-extension tant qu'il n'est pas lié à l'espace de nom http://www.ibm.com/xmlns/prod/xltxe-j.
Après la liaison d'un préfixe à une classe Java, les méthodes de la classe liée peuvent être appelées en spécifiant le préfixe et le nom de méthode séparés par un point-virgule :
prefix:methodName(Params*)

Exemple

Appel des méthodes statiques

Lors de la préparation d'une source XQuery qui utilise les fonctions externes query-declared, déclarez le préfixe en liaison de classe Java :
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")
Supposons que cette requête est disponible via l'objet source xquerySource, le code suivant prépare la requête :
// Create the factory
XFactory factory = XFactory.newInstance();

// Create an XQuery executable for the query
XQueryExecutable executable = factory.prepareXQuery(xquerySource);
Le code suivant exécute la requête qui sera préparée dans l'exemple :
// 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.

Vous trouverez ci-dessous des exemples d'implémentation des classes org.company.Calculator et 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;
    }
}

Appel des méthodes d'instance

L'appel des méthodes d'instance est légèrement différent de l'appel des méthodes statiques car un objet d'instance est requis. Afin d'obtenir un objet d'instance d'une classe Java dans une requête, vous devez appeler son nouveau constructeur :
prefix:new(Params*)
Vous pouvez ensuite enregistrer le résultat dans une déclaration de variable XQuery, comme cela est présenté dans la requête suivante :
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)
Supposons que cette requête est disponible via l'objet source xquerySource, le code suivant prépare la requête.
// Create the factory
XFactory factory = XFactory.newInstance();

// Create an XQuery executable for the query
XQueryExecutable executable = factory.prepareXQuery(xquerySource);
Le code suivant exécute la requête préparée dans l'exemple :
// 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.

Vous trouverez ci-dessous un exemple d'implémentation de la classe org.automobile.Car :
package org.automobile;

public class Car {
    private int doors;
	
    public Car (int doors) {
        this.doors = doors;
    }
	
    public int getDoors() {
        return doors;
    }
}
L'héritage avec les méthodes d'instance est également pris en charge. Si la classe org.automobile.Car a une sous-classe org.automobile.Sedan, vous pouvez créer une instance de la classe org.automobile.Sedan et l'utiliser pour appeler des méthodes dans org.automobile.Car. Pour cela, vous pouvez par exemple utiliser la requête suivante :
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)
Vous trouverez ci-dessous un exemple d'implémentation pour org.automobile.Sedan :
package org.automobile;

public class Sedan extends Car {
    public Sedan (int doors) {
        super(doors);
    }
}
Restriction : Il ne doit exister qu'une seule méthode pour le mécanisme utilisé pour la résolution des méthodes dans une classe Java. S'il existe plusieurs méthodes ayant le même nom et un nombre d'arguments différents, une erreur est émise.

Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_funcs_query_xquery
Nom du fichier : txml_funcs_query_xquery.html