Actionをとってくるとき

[追記]
s2-framework-2.4.0-beta-3から上のような機能は提供されるみたい。なので下のインタフェースは不要になると思う。




ActionPathNamingRuleというインターフェースを実装しているDefaultActionPathNamingRuleを利用してAction又はActionのインターフェースをとってこようと思います。


中身は下のような感じで。

public class DefaultActionPathNamingRule implements ActionPathNamingRule {

    private S2Container getContainer() {
        return SingletonS2ContainerFactory.getContainer();
    }

    public Class toComponentClass(ModuleConfig config, String path) {
        S2Container container = getContainer();
        
        String componentName = config.getPrefix() + path;
        if (container.hasComponentDef(componentName)) {
            return container.getComponentDef(componentName).getComponentClass();
        }

        componentName = path;
        if (container.hasComponentDef(componentName)) {
            return container.getComponentDef(componentName).getComponentClass();
        }

        componentName = path.substring(1) + "Action";
        if (container.hasComponentDef(componentName)) {
            Class clazz = container.getComponentDef(componentName).getComponentClass();
            if (!clazz.getName().endsWith("Impl")) {
                return clazz;
            }

            Class[] interfaces = clazz.getInterfaces();
            for (int i = 0; i < interfaces.length; i++) {
                if (interfaces[i].getName().endsWith("Action")) {
                    return interfaces[i];
                }
            }
        }
        return null;
    }

    public String toActionPathName(Class actionClass) {
        S2Container container = getContainer();
        
        if (!container.hasComponentDef(actionClass)) {
            return null;
        }
        
        String componentName = container.getComponentDef(actionClass).getComponentName();
        if (componentName == null) {
            return null;
        }
        
        if (componentName.startsWith("/")) {
            return componentName;
        }
        
        String result = componentName.replaceFirst("Action$", "");
        return "/" + result;
    }

}


従来のPOJO Actionの場合は、実装クラスを〜ActionImplと定義していて1つの〜Actionインターフェースを実装していれば、問題なく動くと思います。独自のルールで実装している場合は、独自のActionPathNamingRuleを作って対応するということにしたいと思います。

S2の自動登録のコンポーネント名はパッケージを"_"で区切ることになると思うので、ここで"_"を"/"に変更したりして使うのもありだと思っています。