Vue d’ensemble
OGNL (Object-Graph Navigation Language) est l’un des moteurs de script disponibles dans Fess. Il est fourni par le plugin fess-script-ognl et son identifiant est ognl.
Un script OGNL est une expression unique qui produit une valeur, comme title + " - " + siteName ou content.length() > 0. Il n’y a ni instruction, ni structure de contrôle, ni return. Utilisez-le pour des expressions courtes, par exemple pour le mappage de champs, le boost de documents et le mappage de chemins. Pour un script qui nécessite des instructions ou des boucles, utilisez Guide de script JavaScript ou Guide de script Groovy.
Important
Le plugin ne fait pas partie de la distribution. Installez-le depuis la page Système > Plugin de l’interface d’administration, ou avec bin/fess-setup install plugin fess-script-ognl. Pour une installation manuelle, placez le fichier JAR (par exemple fess-script-ognl-15.9.0.jar) dans app/WEB-INF/plugin/ et redémarrez Fess.
Sélectionner OGNL
OGNL n’est utilisé que là où son type de script est sélectionné explicitement.
| Où | Comment sélectionner OGNL |
|---|---|
| Magasin de données | Ajoutez script_type=ognl aux paramètres de la configuration du magasin de données |
| Exploration Web et de fichiers | Ajoutez |
| Règle de boost de documents | Définissez le type de script de la règle sur |
| Mappage de chemins | Commencez le remplacement par |
| Tâche planifiée | Définissez le type de script de la tâche sur |
Écrire des expressions
Dans les scripts de magasin de données et de champ, écrivez un champ=expression par ligne. Chaque paramètre est disponible à la fois sous la forme name et #name.
OGNL n’est pas un sous-ensemble de Groovy. Tenez compte des points suivants lors du portage d’un script :
Il n’y a ni
return, ni instruction, niif/for. Utilisez l’opérateur ternairecond ? a : b.L’opérateur Elvis
?:et l’opérateur de navigation sûre?.ne sont pas pris en charge. Écriveza != null ? a.b : null."x${id}"n’est pas une erreur et n’est pas interpolé. L’expression vaut la chaîne littéralex${id}, et le champ est donc indexé avec un texte erroné. Concaténez plutôt avec+.
Paramètres
Le moteur lit les clés suivantes dans system.properties ou dans la propriété système JVM -Dfess.system.<clé>. Si une clé figure aux deux endroits, system.properties l’emporte. system.properties est app/WEB-INF/conf/system.properties dans le paquet ZIP et /etc/fess/system.properties dans les paquets RPM et DEB.
Important
Les clés ne sont lues qu’une seule fois, lorsque le moteur est initialisé au démarrage. Après toute modification, redémarrez Fess ; le processus en cours ne la prend pas en compte.
| Clé | Valeur par défaut | Description |
|---|---|---|
script.ognl.mode | compat |
|
script.ognl.allowed.classes | Voir ci-dessous | Liste d’autorisation de classes, séparées par des virgules. Utilisée uniquement en mode |
script.ognl.denied.packages | Voir ci-dessous | Liste de refus de classes déclarantes, séparées par des virgules. Utilisée uniquement en mode |
script.ognl.cache.size | 1000 | Nombre maximal d’expressions analysées conservées en cache. Le minimum est 1 |
script.ognl.expression.max.length | 4000 | Nombre maximal de caractères d’une expression. Une expression plus longue n’est pas évaluée et échoue. Le minimum est |
script.ognl.max.log.length | 200 | Nombre maximal de caractères d’une expression écrits dans un message de journal. Le minimum est |
Une valeur qui n’est pas un entier est ignorée avec un avertissement et la valeur par défaut est utilisée. Une valeur inférieure au minimum est relevée au minimum, avec un avertissement.
Les modes compat et strict
compat (par défaut) | strict | |
|---|---|---|
| Conteneur DI | Disponible sous le nom container | Non disponible (container vaut null) |
| Classes | @n.importe.Classe@methode(...) atteint n’importe quelle classe | Seules les classes de script.ognl.allowed.classes sont accessibles |
| Membres | Aucune restriction | Les membres déclarés par une classe de |
compat conserve le comportement des configurations existantes. En mode strict, une expression comme @java.lang.System@getProperty("user.name") ou new java.io.File("/etc/hosts") est refusée. Une expression refusée ne vaut pas null : un avertissement est consigné dans le journal et l’évaluation échoue avec une erreur.
Au démarrage, le moteur consigne le mode effectif au niveau INFO (ognl script engine: mode=strict, ...). Vérifiez cette ligne pour confirmer que strict a bien pris effet.
Liste d’autorisation
script.ognl.allowed.classes compare soit un nom de classe complet de façon exacte, soit un nom de paquet ou de classe suivi de .. Par exemple, java.time autorise java.time.LocalDate et toutes les classes de ce paquet. La valeur par défaut est :
java.lang.Math, java.lang.String, java.lang.Boolean, java.lang.Integer, java.lang.Long, java.lang.Float, java.lang.Double, java.lang.Number, java.util.Date, java.util.Arrays, java.util.List, java.util.Map, java.util.Set, java.util.Collections, java.math.BigDecimal, java.time, org.codelibs.core.lang.StringUtil, org.codelibs.fess.util.DocumentUtil, org.codelibs.fess.taglib.FessFunctions
Le nom d’une classe imbriquée contient $ (par exemple java.util.Map$Entry) et n’est pas autorisé par le nom de la classe englobante. Ajoutez son nom avec $ à la liste si vous en avez besoin.
Liste de refus
script.ognl.denied.packages refuse un membre lorsque le nom de la classe qui le déclare commence par l’une des entrées. La valeur par défaut est :
java.io, java.nio, java.net, java.lang.reflect, java.lang.invoke, java.lang.System, java.lang.Class, java.lang.Runtime, java.lang.ProcessBuilder, java.lang.Process, java.lang.Thread, java.lang.ClassLoader, javax.script, jdk., sun., org.lastaflute.di
Note
Une valeur que vous définissez remplace la liste par défaut ; elle ne s’y ajoute pas. Pour ajouter une classe à la liste d’autorisation, écrivez les entrées par défaut ainsi que la nouvelle entrée.
Avertissement
Le mode strict limite les classes et les membres qu’une expression peut atteindre. Il n’isole pas l’expression des objets qui lui sont transmis. Si un helper ou une entité de Fess est passé en paramètre, ses méthodes publiques peuvent être appelées depuis l’expression dans les deux modes.