Ecriture de fonctions XPath personnalisées

Avant de pouvoir ajouter certains types d'informations de modèle à un rapport (fichier RPTDESIGN), vous devez écrire une fonction XPath personnalisée afin d'extraire ces informations des modèles cible.
Conditions préalables : Pour effectuer cette tâche, vous devez être familiarisé avec le développement de plug-ins dans l'environnement PDE (Plug-in Development Environment) d'Eclipse, ainsi qu'avec l'API UML2.
Pour écrire une fonction XPath personnalisée :
  1. Créez un nouveau projet de plug-in :
    1. Dans la perspective Développement de plug-in, cliquez sur Fichier > Nouveau > Autre, étendez la branche Développement de plug-in, sélectionnez Projet de plug-in et cliquez sur Suivant.
    2. Tapez un ID de plug-in tel que com.ibm.field.birt.xpath_extensions et cliquez sur Suivant puis sur Terminer. Le plug-in est ajouté à la vue Explorateur de packages et les informations le concernant sont affichées dans la vue Editeur de manifeste de plug-in, sur la page Aperçu.
  2. Etendez le point d'extension org.eclipse.jet.xpathFunctions.
    1. Sur la page Aperçu, sélectionnez l'onglet Extensions et cliquez sur Ajouter.
    2. Décochez la case Montrer uniquement les points d'extension des plug-ins requis.
    3. Dans la zone Filtre de point d'extension, tapez le filtre *.jet. Dans la liste des extensions filtrées, faites un double clic sur org.eclipse.jet.xpathFunctions.
    4. Cliquez sur Oui pour confirmer que vous souhaitez ajouter le plug-in à la liste des dépendances de plug-ins.
    5. Cliquez sur l'onglet MANIFEST.MF et ajoutez org.eclipse.uml2.uml à la liste Require_Bundle afin que le plug-in ait une visibilité de l'API UML. Le code de la liste doit ressembler à ceci :
      Require_Bundle: org.eclipse.ui,
        org.eclipse.core.runtime,
        org.eclipse.uml2.uml,
        org.eclipse.jet
    6. Cliquez sur l'onglet plugin.xml et modifiez la définition <function> afin d'y définir votre fonction personnalisée. Par exemple, si vous définissez une fonction nommée SlotValue, ayant deux arguments et implémentée dans la classe com.ibm.field.birt.xpath_extensions.SlotValue, le code ressemblera à ceci :
      <function
           implementation="com.ibm.field.birt.xpath_extensions.SlotValues"
           maxArgs="2"
           minArgs="2"
           name="slotValue">
      </function>
    7. Cliquez sur Fichier > Enregistrer.
  3. Créez un shell de code et liez-le au plug-in :
    1. Dans la vue Explorateur de packages, cliquez avec le bouton droit sur le nouveau projet de plug-in et sélectionnez Nouveau > Classe.
    2. Dans la zone Package, spécifiez le nom du projet de plug-in.
    3. Dans la zone Nom, tapez un nom pour la classe. Utilisez le même nom que celui que vous avez affecté à la fonction. Par exemple, dans le cas de la fonction définie à l'étape 2, le nom de classe est SlotValue.
    4. Pour ajouter une interface, cliquez sur Ajouter.
    5. Dans la boîte de dialogue Nouvelle classe Java, dans la zone Choisissez des interfaces, tapez XPathFunction, puis, dans la liste des entrées concordantes, sélectionnez XPathFunction - org.eclipse.jet.xpath, cliquez sur OK, puis sur Terminer.
  4. Ajoutez du code au fichier Java de la fonction XPath afin de lui faire exécuter la tâche souhaitée, puis enregistrez le fichier.

    Par exemple, si vous voulez que la fonction SlotValue itère sur les noeuds résultant du premier argument (un expression XPath) et que lorsqu'elle trouve une spécification d'instance, elle renvoie la valeur du "slot" spécifié par l'argument slotname en appelant la fonction getStringValue, le code à écrire est le suivant :

    package com.ibm.field.birt.xpath_extensions;
    
    import java.util.Iterator;
    import java.util.List;
    
    import org.eclipse.jet.xpath.NodeSet;
    import org.eclipse.jet.xpath.XPathFunction;
    import org.eclipse.uml2.uml.InstanceSpecification;
    import org.eclipse.uml2.uml.Slot;
    import org.eclipse.uml2.uml.ValueSpecification;
    
    public class SlotValue implements XPathFunction {
    	
    	public String getStringValue(InstanceSpecification ia, String slotname) {
    		List slots = ia.getSlots();
    		for (Iterator iterator = slots.iterator(); iterator.hasNext();) {
    			Slot slot = (Slot) iterator.next();
    			String definingFeatureName = slot.getDefiningFeature().getName();			
    			if (definingFeatureName.equals(slotname)) {
    				List values = slot.getValues();
    				for (Iterator iterator2 = values.iterator(); iterator2
    						.hasNext();) {
    					ValueSpecification value = (ValueSpecification) iterator2.next();
    					return value.stringValue();
    				}
    			}
    		}
    		return null;
    	}
    	
    	public Object evaluate(List args) {
    		Object obj = args.get(0);
    		String slotname = (String) args.get(1);
    		if (obj instanceof NodeSet) {
    			NodeSet ns = (NodeSet) obj;
    			for (Iterator iterator = ns.iterator(); iterator.hasNext();) {
    				Object item = (Object) iterator.next();
    				if (item instanceof InstanceSpecification){
    					InstanceSpecification ispec = (InstanceSpecification) item;
    					if ((slotname != null)&&(slotname.length()>0))
    						return getStringValue(ispec,slotname);
    				}
    			}
    		}
    		return null;
    	}
    }
  5. Créez un nouveau projet de dispositif (feature) pour le plug-in :
    1. Cliquez sur Fichier > Nouveau > Autre, étendez la branche Développement de plug-in, sélectionnez Projet de dispositif et cliquez sur Suivant.
    2. Dans la zone Nom du projet, tapez un nom de projet et cliquez sur Suivant. Il est souvent utile de choisir, pour le dispositif, un nom similaire à celui du plug-in. Ainsi, pour le plug-in com.ibm.field.birt.xpath_extensions, vous pourriez choisir le nom de dispositif com.ibm.field.birt.xpath_extensions.feature.
    3. Cochez la case du plug-in que vous avez créé à l'étape 1 pour l'inclure dans le dispositif, puis cliquez sur Terminer. Le dispositif est ajouté à la vue Explorateur de packages et les informations le concernant sont affichées dans la vue Editeur de manifeste de dispositif, sur la page Aperçu.
    4. Sur la page Aperçu, dans la zone Nom, tapez un nom de dispositif tel que Fonction Extensions XPath.
    5. Sur la page Aperçu, cliquez sur le lien de l'assistant d'exportation.
    6. Sélectionnez Fichier d'archive, spécifiez un emplacement et un nom pour le fichier (par exemple, xpath_extensions.zip) et cliquez sur Terminer.
    Remarque : Vous pouvez utiliser ce plug-in pour plusieurs projets de fonction XPath personnalisée.
  6. Importez le nouveau plug-in dans l'instance d'Eclipse où vous concevez vos rapports :
    1. Extrayez le fichier d'archive dans un répertoire tel que C:/temp/xpath_extensions.
    2. Dans Eclipse, cliquez sur Aide > Mises à jour de logiciels > Rechercher et installer.
    3. Dans l'assistant Installation/Mise à jour, cliquez sur Rechercher les nouveaux dispositifs à installer et cliquez sur Suivant.
    4. Cliquez sur Nouveau site local, sélectionnez le dossier contenant le dispositif et le plug-in, cliquez sur OK, puis sur Terminer.
    5. Dans la fenêtre de résultats de la recherche, sélectionnez votre dispositif et cliquez sur Suivant.
    6. Si vous êtes d'accord avec les termes du contrat de licence, sélectionnez J'accepte les dispositions du contrat de licence, cliquez sur Suivant, puis sur Terminer.
    7. Lorsqu'un message vous invite à redémarrer votre ordinateur, cliquez sur Oui.
Vous pouvez à présent utiliser la nouvelle extension XPath dans vos conceptions de rapport.
Remarque : Les utilisateurs de conceptions de rapport dépendant de fonctions XPath personnalisées devront également importer le nouveau dispositif avant de pouvoir générer des rapports à partir de ces conceptions. La rubrique "Importation de fonctions XPath personnalisées" fournit des informations générales, mais rien ne vous empêche d'accompagner le fichier RPTDESIGN d'une documentation personnalisée expliquant aux utilisateurs où ils peuvent trouver le dispositif et comment l'utiliser.
Tâches associées
Importation de fonctions XPath personnalisées
Référence associée
Conseils de conception de rapports sur les modèles

Vos commentaires