Seasar2からコンポーネントを取得・設定するValueStack

XWorkのValueStack経由でSeasar2コンポーネントを取得したり、コンポーネントのプロパティに値を設定する仕組みを考え中。
インターフェースはMapにして、指定された名前のコンポーネントがある場合はそれを返して、無い場合はnullを返すようにする。
こうするとJSFのBacking Beanっぽく使えそうな感じ。
ModelDrivenは嫌いじゃないんだけど、どうもわかりにくいらしいので。

S2ComponentMap

Mapはこんな感じ。containsKeyとgetだけ実装してます。

public class S2ComponentMap implements Map {
    private S2Container container;

    public S2ComponentMap(S2Container container) {
        this.container = container;
    }

    public int size() {
        return 0;
    }

    public void clear() {
    }

    public boolean isEmpty() {
        return false;
    }

    public boolean containsKey(Object key) {
        return container.hasComponentDef(key);
    }

    public boolean containsValue(Object value) {
        return false;
    }

    public Collection values() {
        return null;
    }

    public void putAll(Map arg0) {
    }

    public Set entrySet() {
        return null;
    }

    public Set keySet() {
        return null;
    }

    public Object get(Object key) {
        return container.getComponent(key);
    }

    public Object remove(Object arg0) {
        return null;
    }

    public Object put(Object key, Object value) {
        return null;
    }
}

S2ComponentInterceptor

Interceptorはこんな感じ。
一応控えめにValueStackの一番後ろに入れます。S2ContainerはS2XWork連携してれば、S2の方で入れてくれる。

public class S2ComponentInterceptor extends AroundInterceptor {
    private S2Container container;

    protected void after(ActionInvocation arg0, String arg1) throws Exception {
    }

    protected void before(ActionInvocation arg0) throws Exception {
        Map map = new S2ComponentMap(container);
        ActionContext.getContext().getValueStack().getRoot().add(map);
    }

    public void setContainer(S2Container container) {
        this.container = container;
    }
}