Custom XPath : Do it *again* yourself ! – SOA-Suite 11g – Part2 – Composants

La création de méthodes XPath a été abordée dans un précédent article. Cependant, il peut être utile d’avoir accès à ces méthodes en dehors d’une transformation.
Cet article complète donc le précédent en s’intéressant à la mise en place de fonctions qui pourront être utilisées dans les différents composants SOA, tel que les Mediator, les processus BPEL… ces opérations seront alors accessibles dans les « Expression Builders ».

Les opérations présentées dans cet article sont parfois proches de celles de l’article précédent.Il y sera donc régulièrement fait référence.

Implémentation de la fonction XPath

Création du projet JDeveloper :

  • Créer une application « Generic Application »
  • Créer un projet « Generic Project » et ajoutez dans son « Technology Scope » (Project properties…) la technologie Java

Implémentation de la classe Java

Pour implémenter une fonction utilisable dans les composants, contrairement au mapper, il est nécessaire d’implémenter l’interface oracle.fabric.common.xml.xpath.IXPathFunction.
Cette interface présente une unique méthode call qui sera appelé lors de l’utilisation de la fonction dans les composants.
public Object call(IXPathContext iXPathContext,List list) throws XPathFunctionException

package custom.xpath.easyteam;
import java.util.List;
import oracle.fabric.common.xml.xpath.IXPathContext;
import oracle.fabric.common.xml.xpath.IXPathFunction;
import oracle.fabric.common.xml.xpath.XPathFunctionException;
public class XPathComponentEasyteam implements IXPathFunction {
    public XPathComponentEasyteam() {
        super();
    }
    public Object call(IXPathContext iXPathContext, List list) throws XPathFunctionException {
        String input = (String)list.get(0);
        return makeItEasier(input);
    }
    public static String makeItEasier(String input) {
        return "easy" + input;
    }
}

Préparation du fichier de configuration

Contrairement au mapper, il existe plusieurs fichiers de configuration utilisables pour les composants.
Chaque composant a son propre fichier. Si l’on souhaite qu’une fonction ne soit utilisable que dans des processus BPEL, on ne la définira que dans le fichier concernant ce composant.
Au contraire, si l’on souhaite que la fonction soit accessible par tous les composants, on la placera dans un autre fichier.
Voici la liste des fichiers possibles :

  • ext-bpel-xpath-functions-config.xm : BPEL
  • ext-mediator-xpath-functions-config.xml : Mediator
  • ext-wf-xpath-functions-config.xml : Human Workflow
  • ext-soa-xpath-functions-config.xml : défini pour tous les composants.

Voici le contenu que nous plaçons dans le fichier ext-soa-xpath-functions-config.xml :

<?xml version="1.0" encoding="UTF-8"?>
<soa-xpath-functions version="11.1.1"
                     xmlns="http://xmlns.oracle.com/soa/config/xpath"
                     xmlns:easy="http://www.oracle.com/XSL/Transform/java/custom.xpath.easyteam">
    <function name="easy:makeItEasierComp">
        <className>custom.xpath.easyteam.XPathComponentEasyteam</className>
        <return type="string"/>
        <params>
            <param name="input" type="string"/>
        </params>
        <desc/>
        <detail>
            <![CDATA[Cette fonction concatène "easy" au début de son input.]]>
        </detail>
    </function>
</soa-xpath-functions>

A noter qu’il est existe différents types pour les paramètres d’entrée et de retour (voir article précédent).

Packaging

Il est nécessaire de faire un JAR afin de pouvoir rendre la fonction accessible à JDeveloper et/ou le serveur SOA.
Ce packaging peut se faire via les « Deployment Profiles » de JDeveloper. L’essentiel est qu’il contienne le code compilé, ainsi que les fichiers de configuration dans le dossier META-INF.

[

Arborescence du JAR à obtenir

Mise en place dans JDeveloper et le serveur

Pour permettre l’utilisation de cette fonction fraichement développée, il va falloir la mettre à disposition de JDeveloper, puis du serveur SOA.

Enregistrer sous JDeveloper

La procédure d’enregistrement est la même que dans le précédent article. Si le packaging se fait dans le même JAR, il suffit de redémarrer JDeveloper. Sinon vous pouvez vous reporter au précédent article pour obtenir la procédure complète.
Au redémarrage, vous pourrez observer lorsque vous êtes dans la construction d’une expression d’un composant que votre fonction apparait dans  « User Defined Functions Extensions ».

[]

Enregistrer sous le serveur SOA

Pour permettre l’utilisation au runtime sur le serveur, il est également nécessaire de mettre en place le jar sur le serveur. Cette étape est la même que présentée lors de l’article précédent. Si vous utilisez le même JAR, il suffit de le mettre à jour et redémarrer le serveur. Sinon reportez-vous aux opérations du précédent article pour le détail.
Il suffit alors de déployer le composite et de le tester via l’EM pour observer que la fonction a bien été prise en compte.

[]

Conclusion

A présent la création de fonctions XPath pour la SOA-Suite n’ont presque plus de secrets pour vous, et vous pourrez aisément vous adapter aux problèmes que vous pourriez rencontrer.
Si vous souhaitez allez plus loin, vous pouvez vous rendre à la documentation officielle, ou vous reportez à ces articles qui m’ont beaucoup aidé à comprendre la manière de créer des fonctions custom :