概要
OGNL(Object-Graph Navigation Language)は Fess で利用できるスクリプトエンジンの1つです。 fess-script-ognl プラグインとして提供され、識別子は ognl です。
OGNLのスクリプトは、 title + " - " + siteName や content.length() > 0 のような 1つの値式です。文、制御構文、 return はありません。フィールドマッピング、 ドキュメントブースト、パスマッピングなど、短い式で足りる用途に向いています。 文やループが必要なスクリプトには JavaScriptスクリプトガイド または Groovyスクリプトガイド を使用してください。
重要
プラグインは 配布物に同梱されません 。管理画面の「システム > プラグイン」ページ、 または bin/fess-setup install plugin fess-script-ognl でインストールしてください。 手動でインストールする場合は、JARファイル(例: fess-script-ognl-15.9.0.jar )を app/WEB-INF/plugin/ に配置し、 Fess を再起動します。
OGNLの選択
OGNLは、スクリプトタイプとして明示的に選択した場所でのみ使われます。
| 場所 | OGNLの選択方法 |
|---|---|
| データストア | データストア設定のパラメーターに script_type=ognl を追加します |
| Webクロール・ファイルクロール | 設定パラメーターに |
| ブーストルール | ルールのスクリプトタイプを ognl にします(スクリプトタイプはルールごとに持ちます) |
| パスマッピング | 置換文字列を |
| スケジュールジョブ | ジョブのスクリプトタイプを |
式の書き方
データストアとフィールドのスクリプトは、1行に1つの フィールド名=式 を記述します。 各パラメーターは name と #name のどちらでも参照できます。
OGNLはGroovyのサブセットではありません。スクリプトを移植するときは次の点に注意してください。
return、文、if/forはありません。三項演算子cond ? a : bを使用します。エルビス演算子
?:とセーフナビゲーション演算子?.は使えません。a != null ? a.b : nullのように記述します。"x${id}"はエラーにならず、展開もされません。リテラル文字列x${id}として評価されるため、 フィールドには誤ったテキストが索引されます。連結には+を使用してください。
設定
エンジンは次のキーを system.properties 、またはJVMのシステムプロパティ -Dfess.system.<キー> から読み込みます。両方にある場合は system.properties が優先されます。 system.properties は、ZIP版では app/WEB-INF/conf/system.properties 、 RPM版・DEB版では /etc/fess/system.properties です。
重要
キーは、起動時にエンジンが初期化されるときに1度だけ読み込まれます。 値を変更したら Fess を再起動してください。実行中のプロセスには反映されません。
| キー | 既定値 | 説明 |
|---|---|---|
script.ognl.mode | compat |
|
script.ognl.allowed.classes | 後述 | 許可するクラスのカンマ区切りリスト。 strict モードでのみ使われます |
script.ognl.denied.packages | 後述 | 呼び出しを拒否する、宣言クラスのカンマ区切りリスト。 strict モードでのみ使われます |
script.ognl.cache.size | 1000 | 解析済みの式をキャッシュする最大数。最小値は 1 です |
script.ognl.expression.max.length | 4000 | 式の最大文字数。これより長い式は評価されず、失敗します。最小値は 1 です |
script.ognl.max.log.length | 200 | ログメッセージに出力する式の最大文字数。最小値は 3 です |
整数でない値は警告を出して無視され、既定値が使われます。最小値を下回る値は、警告を出して最小値に 引き上げられます。
compatモードとstrictモード
compat (既定) | strict | |
|---|---|---|
| DIコンテナ | container として参照できます | 参照できません( container は null と評価されます) |
| クラス | @任意のクラス@メソッド(...) で任意のクラスに到達できます | script.ognl.allowed.classes に含まれるクラスにのみ到達できます |
| メンバー | 制限なし |
|
compat は既存の設定の動作を維持します。 strict モードでは、 @java.lang.System@getProperty("user.name") や new java.io.File("/etc/hosts") のような式は拒否されます。 拒否された式は null と評価されるのではなく、警告がログに出力され、評価がエラーで失敗します。
エンジンは起動時に、有効なモードを INFO レベルでログに出力します ( ognl script engine: mode=strict, ... )。 strict が有効になったかどうかは、この行で確認してください。
許可リスト
script.ognl.allowed.classes は、完全修飾クラス名との完全一致、またはパッケージ名・クラス名に . を付けた前方一致で判定します。たとえば java.time は java.time.LocalDate を含む、 このパッケージ配下のすべてのクラスを許可します。既定値は次のとおりです。
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
ネストしたクラスの名前には $ が含まれ(例: java.util.Map$Entry )、外側のクラスの名前では 許可されません。必要な場合は、 $ を含む名前をリストに追加してください。
拒否リスト
script.ognl.denied.packages は、メンバーを宣言しているクラスの名前がいずれかのエントリーで 始まる場合に、そのメンバーを拒否します。既定値は次のとおりです。
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
注釈
設定した値は既定のリストに追加されるのではなく、置き換えます。許可リストにクラスを1つ追加する場合は、 既定のエントリーと新しいエントリーを合わせて記述してください。
警告
strict モードが制限するのは、式が到達できるクラスとメンバーです。式に渡されるオブジェクトから 式を隔離するものではありません。 Fess のヘルパーやエンティティがパラメーターとして渡された場合、 どちらのモードでも、そのpublicメソッドを式から呼び出せます。