S2StrutsのカスタムバリデートでFormFileの拡張子をチェック

FormFileのバリデートを作ろうと思ったんだが、実装クラスでFormFileのオブジェクトを取得するのにハマったんでメモ。

import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.Validator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.upload.FormFile;
import org.apache.struts.validator.Resources;
import org.seasar.struts.interceptors.ProcessPojoFormInterceptor.SerializeBeanValidatorForm;

public class FileSuffixValidator {

  public static boolean validate(Object bean,
            ValidatorAction validatorAction, Field field,
            ActionMessages errors, Validator validator,
            HttpServletRequest request) {
    
    boolean result = false;
    String paramPattern = field.getVarValue("pattern");
    String[] patterns = paramPattern.split(",");
    
    FormFile formFile = null;
// FormFileのオブジェクトがスマートに取れなかったんでこんなんやってます
// なんか他にいい方法があるかわかんないけどひとまず。。。
    if (bean instanceof SerializeBeanValidatorForm) {
      formFile = (FormFile) ((SerializeBeanValidatorForm)bean).getDynaBean().get(field.getProperty());
    }
    
    if (bean instanceof DynaActionForm) {
      formFile = (FormFile) ((DynaActionForm)bean).get(field.getProperty());
    }
    
    if (formFile != null && StringUtils.isNotEmpty(formFile.getFileName())) {
      String fileName = formFile.getFileName();
        for (String pattern : patterns) {
          if (fileName.endsWith("." + pattern)) {
            result = true;
            break;
          }
        }
    } else { 
      result = true;
    }
    if (!result) {
      errors.add(field.getKey(), Resources.getActionMessage(
                    validator, request, validatorAction, field));      
    }
    return result;
  }
}