メッセージリソースの変更を即時反映させる

S2ContainerでHOT deployを有効にしていても、ResourceBundleの中身はキャッシュされていて、コンテナを再起動しないとpropertiesファイルに加えた変更が反映されません。

これだと開発時に不便なので、CubbyでHOT deploy中に、messages.propertiesの変更を即時反映してメッセージを取得できるようにしてみました。Java 6限定です。

import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

import org.seasar.cubby.CubbyConstants;
import org.seasar.cubby.action.Action;
import org.seasar.cubby.controller.ThreadContext;
import org.seasar.cubby.controller.impl.DefaultMessagesBehaviour;
import org.seasar.framework.container.hotdeploy.HotdeployUtil;

public abstract class ActionBase extends Action {
    private Map<String, String> messages;

    public Map<String, String> getMsg() {
        if (!HotdeployUtil.isHotdeploy()) {
            return ThreadContext.getMessagesMap();
        }
        if (messages == null) {
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            ResourceBundle.clearCache(loader);
            ResourceBundle bundle = ResourceBundle.getBundle(
                    CubbyConstants.RES_MESSAGES, Locale.getDefault(), loader);
            messages = new DefaultMessagesBehaviour().toMap(bundle);
        }
        return messages;
    }
}

上記のActionBaseをアクションの基底クラスにしておき、テンプレート側では${messages['key']}の代わりに${msg['key']}と記述してメッセージを取得するようにします。