Construire une extension

Le but d’une extension est de proposer des pages d’interface supplémentairesafin d’effectuer des traitements spécifiques. Par exemple, on peut imaginer une extension qui permet l’importation automatique de données dans un format particulier. Cela peut être également la génération de fichiers dans des formats particuliers sans passer par XSLT.

Toute extension a un nom : les pages de l’extension seront accessibles à partir de /ext/{nom de l'extension}/. L’organisation des pages de l’extension est libre ; la seule contrainte de l’extension est de proposer une implémenation des trois interfaces suivantes qui sont définies dans BdfServer.jar:

Pour qu’une extension soit opérationnelle, il faut que les fichiers correspondant soient placés dans le répertoire WEB-INF de l’application, sous la forme d’un fichier jar dans WEB-INF/lib, soit sous la forme de classes dans WEB-INF/classes.

Pour que BaseDeFiches ait connaissance de l’existence d’une extension, il faut la déclarer. La procédure de déclaration est la suivante :

On voit que le nom d’une extension est déterminée par le nom du fichier présent dans WEB-INF/bdfext, c’est un nom « d’enregistrement » (Registration Name). En changeant le nom du fichier on modifie le nom de l’extension. Une extension doit d’ailleurs être opérationnelle quelque soit le nom d’enregistrement qu’on lui donne. D’ailleurs, l’interface fr.exemole.bdfserver.BdfExtensionFactory n’a qu’une seule méthode :

public BdfExtension newInstance(String registrationName, File parametersDirectory, File dataDirectory);

Cette méthode construit une instance de fr.exemole.bdfserver.BdfExtension en indiquant :

La différence entre le répertoire des fichier sde paramétrage et le répertoire des données de l’extension, c’est que le premier peut être en lecture seule pour l’application Tomcat (ce qui est une sécurité supplémentaire) alors que le second doit être accessible en écriture par l’application Tomcat.

Les deux valeurs des répertoires peuvent être nulles. C’est à l’extension de décider de l’utilisation de ces répertoires.

 

Point important, la classe qui implémente fr.exemole.bdfserver.BdfExtensionFactory doit comporter un constructeur public sans argument (Class.forName({nom de la classe).newInstance() doit fonctionner).

Et, inversement, l’interface fr.exemole.bdfserver.BdfExtension possède une méthode qui renvoie le nom d’enregistrement qui lui a été transmis au moment de son instanciation :

public String getRegistrationName();

La deuxième méthode de l’interface BdfExtension est la suivante :

public BdfRequest getBdfRequest(String extensionPath);

Cette méthode transmet une instance de fr.exemole.bdfserver.request.BdfRequest construit avec le paramètre suivant :

Comportement de BaseDeFiches

Pour mieux comprendre l’organisation d’une extension, voici une description du fonctionnement de BaseDeFiches

Convention de nommage

Même si le nom d’enregistrement d’une extension doit pouvoir être modifié sans altérer le comportement de l’extension afin d’éviter un conflit entre noms, il est préférable de respecter une convention de nommage. Celle-ci pourra s’inspirer de la convention de nommage des paquets Java, convention qu’il est de toute façon nécessaire de suivre si l’on ne veut pas des conflits entre des classes de même nom.

On utilisera ainsi des minuscules et on pourra partir d’un nom de domaine inversé en utilisant des tirets plutôt que des points (par exemple, fr-exemole-compta). Il faut se souvenir que le nom de l’extension est déduite d’un nom de fichier et va servir dans des URLs, il est préférable de bannir espace et caractères accentués (la préconisation des tirets plutôt que des points (contrairement aux paquets Java) vient du fait que le point sert de séparateur de l’extension : fr-exemple-compta.properties est plus lisible que fr.exemole.compta.properties).

Exemple

Par exemple, Exemole a développé pour sa base de comptabilité analytique une extension permettant la récupération automatique des données de la comptabilité générale. Les classes Java sont dans le paquet fr.exemole.bdfext.exemolecompta, la classe implémentant BdfExtension s’appelle ComptaExemoleExtensionFactory

Il y a donc dans le répertoire /WEB-INF/bdfext/ un fichier appelé fr-exemole-compta qui comprend la ligne :

factory=fr.exemole.bdfext.comptaexemole.ComptaExemoleExtensionFactory

Une fois l’extension installée, l’action de l’extension est accessible via l’adresse /ext/fr-exemole-compta/form.html. Le choix du chemin /form.html est le choix fait par l’extension, ce n’est pas une obligation fixée par BaseDeFiches qui se contente de transmettre à l’extension tout ce qui est après /xt/fr-exemole-compta.