SAStruts+freemarkerでEnumを使ってみる

SAStrutsfreemarkerを使っているときに、
Enumをテンプレート内で使えたらいいなと思っていたけれど
そのままでは手軽に使うことができなかった


デフォルトでは、以下のようにMapのフィールドに設定することで、
パッケージ名指定で使うことができる


*Action.java

public Map map = new Hashtable();

//省略

map.put("enums", BeansWrapper.getDefaultInstance().getEnumModels());

以下のようにFreeMarker上で使うことができる

*.ftl

${map.enums["java.app.enumeration.TestEnum"].OK}

自分で作ったEnumクラスを使う場合、パッケージ名指定は不便だったりするので
以下のクラスを作ってみた

public class EnumViewUtil {

	protected EnumViewUtil() {
	}

    public static Map<String, Object> toMap(Class clazz)
    {
        Object obj[] = clazz.getEnumConstants();
        if(obj == null)
            return null;
        Map<String, Object> map = new LinkedHashMap<String, Object>();
        for(int i = 0; i < obj.length; i++)
        {
            Enum value = (Enum)obj[i];
            map.put(value.name(), value);
        }

        return map;
    }
}

使う場合は以下のようにする

*Action.java

public Map<String, Object> testEnum= EnumViewUtil.toMap(TestEnum.class);

*.ftl

${testEnum.OK}

ちょっと便利になった。もっといい方法あるのかなぁ


ちなみに、staticフィールドを表示する場合は、以下のクラスで利用できる

public class StaticViewUtil {

	protected StaticViewUtil() {
	}

    public static Map toMap(Class clazz)
    {
    	Map map = new LinkedHashMap();
        if(!Modifier.isPublic(clazz.getModifiers()))
        	return null;

        Field fields[] = clazz.getFields();
        for(int i = 0; i < fields.length; i++)
        {
            Field field = fields[i];
            int mod = field.getModifiers();
            if(!Modifier.isPublic(mod) || !Modifier.isStatic(mod))
                continue;

            try {
			map.put(field.getName(), field.get(clazz));
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
        }

	return map;
    }
}

使い方はEnumの時と一緒でOK
ちなみに、Mapに変換するためのソースは、FreeMarker内のソースをほとんどそのままコピペしました