S2Utilでトラバース

指定パッケージ配下をトラバースするのって自力でちゃんとやろうとすると面倒だと思っていましたが、S2Utilを使うと簡単にできました。便利です。

以下は、指定されたパッケージ配下でActionクラスを継承するクラスを拾う例です。

package webframework;

import org.seasar.util.beans.factory.BeanDescFactory;
import org.seasar.util.io.ClassHandler;
import org.seasar.util.io.TraversalUtil;
import org.seasar.util.io.Traverser;
import org.seasar.util.lang.ClassUtil;
import org.seasar.util.lang.StringUtil;

public class ActionTraverser {

    private static final String ACTION_SUFFIX = "Action";

    public static void execute(final ActionConfig actionConfig,
            final String actionRoot) {

        final int actionRootLength = actionRoot.length();

        for (Traverser traverser : TraversalUtil.getTraversers(actionRoot)) {
            traverser.forEach(new ClassHandler() {

                @Override
                public void processClass(String packageName,
                        String shortClassName) {

                    Class<?> clazz = ClassUtil.forName(packageName + "."
                            + shortClassName);

                    if (ClassUtil.isAssignableFrom(Action.class, clazz)) {
                        String path = packageName.substring(actionRootLength)
                                .replace('.', '/')
                                + "/"
                                + StringUtil.decapitalize(shortClassName
                                        .replaceFirst(ACTION_SUFFIX + "$", ""));

                        actionConfig.addAction(path,
                                BeanDescFactory.getBeanDesc(clazz));
                    }
                }
            });
        }
    }
}

以上