谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

複数サブミットバリューバリデータ

こちらは、あんまりみんな作ってないかも知れない。
複数フィールドのSubmittedValue段階の値を使うバリデータ。


上のものと比べると、

  • 複数項目の「一番最後の項目」に仕掛けなくてもいい
  • コンバータが通る前の値をバリデートする

な感じになります。
断然、こっちのが便利じゃない?


まぁ、仕掛けた項目が入力されてないと、
バリデートされないのは相変わらずだけどね。

package examples.jsf.validator;

import javax.faces.component.StateHolder;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

import org.seasar.framework.exception.EmptyRuntimeException;
import org.seasar.jsf.util.RenderUtil;
import org.seasar.jsf.util.ValueHolderUtil;

/**
 * @author cero-t
 * 
 */
public abstract class S2MultiSubmittedValueValidator implements Validator,
		StateHolder {

	private String targetId = null;

	private boolean bTransient = false;

	public String getTargetId() {
		return targetId;
	}

	public void setTargetId(String targetId) {
		this.targetId = targetId;
	}

	public boolean isTransient() {
		return bTransient;
	}

	public void setTransient(boolean transientValue) {
		this.bTransient = transientValue;
	}

	public Object saveState(FacesContext context) {
		Object values[] = new Object[1];
		values[0] = targetId;
		return values;
	}

	public void restoreState(FacesContext context, Object state) {
		Object values[] = (Object[]) state;
		targetId = (String) values[0];
	}

	public void validate(FacesContext context, UIComponent component,
			Object value) throws ValidatorException {

		if (value == null) {
			return;
		}
		UIComponent[] targetComponents = getTargetComponents(component);
		Object[] targetValues = new Object[targetComponents.length];

		for (int i = 0; i < targetComponents.length; i++) {
			if (targetComponents[i] instanceof UIInput) {
				UIInput input = (UIInput) targetComponents[i];
				Object submittedValue = input.getSubmittedValue();
				targetValues[i] = RenderUtil.getConvertedValue(context, input,
						submittedValue);
			} else {
				targetValues[i] = ValueHolderUtil.getValue(targetComponents[i]);
			}
		}
		doValidate(context, component, value, targetComponents, targetValues);
	}

	protected UIComponent[] getTargetComponents(UIComponent component) {
		if (targetId == null) {
			throw new EmptyRuntimeException("targetId");
		}
		String[] targetIds = targetId.split(",");
		UIComponent[] targetComponents = new UIComponent[targetIds.length];

		for (int i = 0; i < targetIds.length; i++) {
			targetComponents[i] = component.findComponent(targetIds[i]);
			if (targetComponents[i] == null) {
				throw new EmptyRuntimeException(targetIds[i]);
			}
		}

		return targetComponents;
	}

	protected abstract void doValidate(FacesContext context,
			UIComponent component, Object value, UIComponent[] targetComponent,
			Object targetValues[]) throws ValidatorException;
}