package org.jboss.seam.ui.renderkit; import java.io.IOException; import javax.faces.component.EditableValueHolder; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.event.*; import javax.faces.validator.Validator; import org.jboss.seam.ui.component.UIEqualityValidator; import org.jboss.seam.ui.util.cdk.RendererBase; import org.jboss.seam.ui.validator.EqualityValidator; import org.richfaces.cdk.annotations.JsfRenderer; /** * This class mainly does some validation "hook-in" * * @author Daniel Roth * @author <a href="http://community.jboss.org/people/bleathem">Brian Leathem</a> * */ @ListenerFor(systemEventClass = PostAddToViewEvent.class) @JsfRenderer(type="org.jboss.seam.ui.EqualityValidatorRenderer", family="org.jboss.seam.ui.EqualityValidatorRenderer") public class EqualityValidatorRendererBase extends RendererBase implements ComponentSystemEventListener { @Override protected Class getComponentClass() { return UIEqualityValidator.class; } private void attachValidator(UIComponent component) { UIEqualityValidator ev = (UIEqualityValidator) component; EditableValueHolder evh = null; if (ev != null && ev.getParent() instanceof EditableValueHolder) { evh = (EditableValueHolder) ev.getParent(); } if (evh == null) throw new IllegalArgumentException("validateEquality tag must be nested in an EditableValueHolder (\"input tag\")"); if (!hasEqualityValidator(evh)) { evh.addValidator(new EqualityValidator(ev.getFor(), ev.getMessage(), ev.getMessageId(), ev.getOperator())); evh.setRequired(ev.isRequired()); } } private boolean hasEqualityValidator(EditableValueHolder evh) { for (Validator validator : evh.getValidators()) { if (validator instanceof EqualityValidator) { return true; } } return false; } @Override public boolean getRendersChildren() { return true; } @Override public void processEvent(ComponentSystemEvent event) throws AbortProcessingException { UIComponent component = event.getComponent(); this.attachValidator(component); } }