読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり、所属会社の見解ではありません。 GitHub: takahashikzn

OGNLでeval関数の代用品を作った

Struts2 r42utils


OGNLにはeval関数がありません。


ですがどうしてもeval関数を使いたいシチュエーションが発生したので、作りました。


作ったとは言ってもeval関数そのものではなくて、代用品です。
暗黙ラムダ関数として定義してもよかったのですが、面倒だったので…(-_-)



やっていることは単純で、r42utilsのを少し変えただけです。

へ追加した属性であるevalBodyの値がtrueならボディ部分をOGNL式とみなして評価しています。

public class SetLocal
    extends ContextBean {

    // 以上略

/* 追加コード ここから */
    private boolean evalBody;

    /**
     * @param evalBody
     * evalBody
     */
    public void setEvalBody(final boolean evalBody) {
        this.evalBody = evalBody;
    }
/* 追加コード ここまで */

    public boolean end(final Writer writer, final String body) {
        final Object o;

        if (this.value == null) {
            if (StringUtils.isEmpty(body)) {
                o = this.findValue("top");
            } 

/* 追加コード ここから */
            else if (this.evalBody) {
                o = this.findValue(body);
            } 
/* 追加コード ここまで */

            else {
                o = body;
            }
        } else {
            try {
                o = this.findValue(this.value);
            } catch (final RuntimeException e) {
                throw new RuntimeException("value = " + this.value, e);
            }
        }

        // ----
        final LocalVariableScope localVariableScope =
            this.getEnclosingLocalVariableScope();

        localVariableScope.setVar(this.getVar(), o);

        return super.end(writer, "");
    }

    // 以下略

}

上記のコードは、r42utils-0.1.7としてマージ済みです。