Descripción general
OGNL (Object-Graph Navigation Language) es uno de los motores de script disponibles en Fess. Lo proporciona el plugin fess-script-ognl y su identificador es ognl.
Un script OGNL es una única expresión que produce un valor, como title + " - " + siteName o content.length() > 0. No tiene sentencias, estructuras de control ni return. Úselo para expresiones cortas, por ejemplo en el mapeo de campos, el refuerzo (boost) de documentos y el mapeo de rutas. Para un script que necesite sentencias o bucles, use Guía de scripting JavaScript o Guía de scripting Groovy.
Importante
El plugin no forma parte de la distribución. Instálelo desde la página Sistema > Plugin de la pantalla de administración o con bin/fess-setup install plugin fess-script-ognl. Para instalarlo manualmente, coloque el archivo JAR (por ejemplo, fess-script-ognl-15.9.0.jar) en app/WEB-INF/plugin/ y reinicie Fess.
Selección de OGNL
OGNL solo se usa donde su tipo de script se selecciona de forma explícita.
| Dónde | Cómo seleccionar OGNL |
|---|---|
| Data store | Añada script_type=ognl a los parámetros de la configuración del data store |
| Rastreo web y de archivos | Añada |
| Regla de refuerzo de documentos | Establezca el tipo de script de la regla en |
| Mapeo de rutas | Comience el reemplazo con |
| Trabajo programado | Establezca el tipo de script del trabajo en |
Cómo escribir expresiones
En los scripts de data store y de campo, escriba un campo=expresión por línea. Cada parámetro está disponible tanto como name como #name.
OGNL no es un subconjunto de Groovy. Tenga en cuenta lo siguiente al portar un script:
No hay
return, ni sentencias, niif/for. Use el operador ternariocond ? a : b.El operador Elvis
?:y el operador de navegación segura?.no son compatibles. Escribaa != null ? a.b : null."x${id}"no es un error y no se interpola. Se evalúa como la cadena literalx${id}, por lo que el campo se indexa con un texto incorrecto. Concatene con+en su lugar.
Configuración
El motor lee las siguientes claves de system.properties o de la propiedad de sistema de la JVM -Dfess.system.<clave>. Si una clave está en ambos sitios, prevalece system.properties. system.properties es app/WEB-INF/conf/system.properties en el paquete ZIP y /etc/fess/system.properties en los paquetes RPM y DEB.
Importante
Las claves se leen solo una vez, cuando el motor se inicializa al arrancar. Tras cambiar cualquiera de ellas, reinicie Fess; el proceso en ejecución no recoge el cambio.
| Clave | Valor predeterminado | Descripción |
|---|---|---|
script.ognl.mode | compat |
|
script.ognl.allowed.classes | Véase más abajo | Lista de clases permitidas, separadas por comas. Solo se usa en modo strict |
script.ognl.denied.packages | Véase más abajo | Lista de clases declarantes denegadas, separadas por comas. Solo se usa en modo strict |
script.ognl.cache.size | 1000 | Número máximo de expresiones analizadas que se guardan en caché. El mínimo es 1 |
script.ognl.expression.max.length | 4000 | Número máximo de caracteres de una expresión. Una expresión más larga no se evalúa y falla. El mínimo es |
script.ognl.max.log.length | 200 | Número máximo de caracteres de una expresión que se escriben en un mensaje de registro. El mínimo es |
Un valor que no es un entero se ignora con una advertencia y se usa el valor predeterminado. Un valor inferior al mínimo se eleva al mínimo, también con una advertencia.
Los modos compat y strict
compat (predeterminado) | strict | |
|---|---|---|
| Contenedor DI | Disponible como container | No disponible (container se evalúa como null) |
| Clases | @cualquier.Clase@metodo(...) alcanza cualquier clase | Solo se pueden alcanzar las clases de script.ognl.allowed.classes |
| Miembros | Sin restricción | No se pueden llamar los miembros declarados por una clase de |
compat mantiene el comportamiento de las configuraciones existentes. En modo strict, una expresión como @java.lang.System@getProperty("user.name") o new java.io.File("/etc/hosts") se rechaza. Una expresión rechazada no se evalúa como null: se escribe una advertencia en el registro y la evaluación falla con un error.
Al arrancar, el motor registra el modo vigente en el nivel INFO (ognl script engine: mode=strict, ...). Compruebe esta línea para confirmar que strict ha surtido efecto.
Lista de permitidos
script.ognl.allowed.classes compara un nombre de clase completo de forma exacta, o un nombre de paquete o de clase seguido de .. Por ejemplo, java.time permite java.time.LocalDate y todas las clases de ese paquete. El valor predeterminado es:
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
El nombre de una clase anidada contiene $ (por ejemplo, java.util.Map$Entry) y no queda permitido por el nombre de la clase que la contiene. Añada su nombre con $ a la lista si la necesita.
Lista de denegados
script.ognl.denied.packages deniega un miembro cuando el nombre de la clase que lo declara empieza por alguna de las entradas. El valor predeterminado es:
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
Nota
Un valor que usted establece sustituye a la lista predeterminada; no se añade a ella. Para añadir una clase a la lista de permitidos, escriba las entradas predeterminadas junto con la nueva.
Advertencia
El modo strict limita las clases y los miembros que una expresión puede alcanzar. No aísla la expresión de los objetos que recibe. Si se pasa como parámetro un helper o una entidad de Fess, sus métodos públicos se pueden llamar desde la expresión en ambos modos.