カスタムバリデーター2 大勘違い

先日書いたExRegExprValidatorの国際化はユーザーに対しての国際化ではなくアプリケーションサーバーの実行環境に対しての国際化になっちゃってた。恥ずかしい〜(笑)。

後で書き直そう…。

書き直した。s2jsfのコンテナに予めrequestオブジェクトが用意されていてそれをsetterで取得。requestからロケール取得で出来た。楽だ。

package examples.jsf.validator;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.faces.application.FacesMessage;
import javax.faces.component.StateHolder;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.servlet.http.HttpServletRequest;

public class ExRegExprValidator implements Validator, StateHolder {

  private static final String BUNDLE_NAME = "Message";

  //properties

  private HttpServletRequest request;

  private String messageId;

  private Object[] messageArgs;

  private String pattern;

  private boolean _transient = false;

  //getter setter

  public void setRequest(HttpServletRequest request) {
    this.request = request;
  }

  public String getMessageId() {
    return messageId;
  }

  public void setMessageId(String messageId) {
    this.messageId = messageId;
  }

  public Object[] getMessageArgs() {
    return messageArgs;
  }

  public void setMessageArgs(Object[] messageArgs) {
    this.messageArgs = messageArgs;
  }

  public String getPattern() {
    return pattern;
  }

  public void setPattern(String pattern) {
    this.pattern = pattern;
  }

  public boolean isTransient() {
    return _transient;
  }

  public void setTransient(boolean newTransientValue) {
    _transient = newTransientValue;
  }

  //method

  public void validate(FacesContext context, UIComponent component,
      Object value) throws ValidatorException {
    if (context == null)
      throw new NullPointerException("FacesContext");
    if (component == null)
      throw new NullPointerException("UIComponent");
    if (value == null)
      return;
    String text = value.toString();
    if (!text.matches(pattern)) {
      throw new ValidatorException(new FacesMessage(getResourceMessage()));
    }
  }

  private String getResourceMessage() {
    //locale from browser.
    Locale locale = request.getLocale();
    if (locale == null) {
      locale = Locale.ENGLISH;
    }
    ResourceBundle bundle = ResourceBundle.getBundle(BUNDLE_NAME, locale);
    String mId = bundle.getString(messageId);
    Object[] mArgs = new Object[messageArgs.length];
    for (int i = 0; i < messageArgs.length; i++) {
      mArgs[i] = bundle.getString(messageArgs[i].toString());
    }
    return MessageFormat.format(mId, mArgs);
  }

  public Object saveState(FacesContext context) {
    Object values[] = new Object[3];
    values[0] = pattern;
    values[1] = messageId;
    values[2] = messageArgs;
    return values;
  }

  public void restoreState(FacesContext context, Object state) {
    Object values[] = (Object[]) state;
    pattern = values[0].toString();
    messageId = values[1].toString();
    messageArgs = (Object[]) values[2];
  }

}