[mayaa-user:993] 再起動直後にtemplateSuffixを使っているページでEngineUtil.getSourcePath()が正しく取得できない

Susumu ISHIGAMI [E-MAIL ADDRESS DELETED]
2013年 11月 27日 (水) 22:53:03 JST


石上です

マニアックな報告で恐縮ですが、Mayaaを使用したWebサイトを運用中に
発生した現象を報告させていただきます。

テンプレート処理中に現在処理しているテンプレートファイルのパスを
知りたい箇所があり、以下の様な関数を定義しています。

function get_current_page() {
  return Packages.org.seasar.mayaa.impl.engine.EngineUtil.sourcePath;
}

このようにすれば、現在処理中のテンプレートファイルのパスが
取得できて便利なのですが、templateSuffix使用時に正しく取得できないことが
あり、困っています。

正しくは
template$suffix.html
のようなパスを取得したいのに
template.html
のように、suffixなしの、オリジナルのテンプレート名
(そのテンプレートが実際には存在しなかったとしても)
を取得してしまいます。

EngineUtil.getSourcePath()のソースを確認してみると

    public static String getSourcePath() {
        Specification spec = SpecificationUtil.findSpecification();
        if (spec == null) {
            String path =
CycleUtil.getServiceCycle().getRequestScope().getRequestedPath();
            SourceDescriptor source = SourceUtil.getSourceDescriptor(path);
            return source.getSystemID();
        }
        return spec.getSystemID();
    }

一行目の
Specification spec = SpecificationUtil.findSpecification();
のspecがnullになるケースがあり、ifブロック内で取得されるパスでは、
templateSuffixが考慮されないページ名になっているようです。


SpecificationUtil.findSpecification();
の実装を見ると、
    public static Specification findSpecification() {
        ServiceCycle cycle = CycleUtil.getServiceCycle();
        NodeTreeWalker current = cycle.getOriginalNode();
        // リソースアクセス中にredirectしても対応できるようにする。
        if (current != null) {
            return findSpecification(current);
        }
        return null;
    }

findSpecification(current);
はページのノードが見つかるまで、getParentNodeを繰り返すだけですので、
currentのparentNodeが、
上手くいかない時は、nullになっています。

この現象は、Mayaaが動いているWebサーバーを終了し、
再度起動し、起動処理が行われている中で、templateSuffixを使用している
URLにアクセスすると、比較的高い頻度で発生しています。

上記コメントの
// リソースアクセス中にredirectしても対応できるようにする。
という記述が気になっています。
こちらはどのような状況のことをそうていされていますでしょうか?
今回検証を行ったように「再起動直後アクセスする」という状況も

検証を行った環境は以下の通りです。
Windows 8.1, Tomcat 7.0, JavaSE7
Linux + Tomcat6の環境でも再現を確認しています。

本件、私の方でも調査をし、
もし、Mayaaに改善できるところがあれば報告させていただきます。

また、
EngineUtil.getSourcePath()
を使用する以外に、現在処理中のテンプレートファイルのパス
を、templateSuffixも考慮済みで取得する方法がありましたら
ご教示頂けますと助かります。

よろしくお願い致します。

-- 
Susumu ISHIGAMI
susumu.ishigami @ gmail.com


mayaa-user メーリングリストの案内