package com.softwaremill.common.faces.validator; import javax.faces.component.FacesComponent; import javax.faces.component.UIComponent; import javax.faces.component.UIInput; import javax.faces.context.FacesContext; import javax.faces.convert.ConverterException; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; /** * Created by Pawel Stawicki on Dec 15, 2010 12:44:25 AM */ @FacesComponent("MultiValidator") public class MultiValidator extends UIInput { @Override public Object getSubmittedValue() { List<Object> submittedValues = new ArrayList<Object>(); for(UIComponent ch : getAllChildren(this)) { if (ch instanceof UIInput) { submittedValues.add(((UIInput) ch).getSubmittedValue()); } } return submittedValues; } private Collection<UIComponent> getAllChildren(UIComponent component) { List<UIComponent> children = new ArrayList<UIComponent>(); Iterator<UIComponent> it = component.getFacetsAndChildren(); while(it.hasNext()) { UIComponent child = it.next(); children.add(child); children.addAll(getAllChildren(child)); } return children; } @Override public void restoreState(FacesContext context, Object state) { List<Object> childrenState = (List<Object>) state; for(int i = 0; i < childrenState.size(); i++) { getChildren().get(i).restoreState(context, childrenState.get(i)); } } @Override public Object saveState(FacesContext context) { List<Object> childrenState = new ArrayList<Object>(); for(UIComponent child : getChildren()) { childrenState.add(child.saveState(context)); } return childrenState; } @Override public void encodeAll(FacesContext context) throws IOException { for(UIComponent child : getChildren()) { child.encodeAll(context); } } @Override public void encodeBegin(FacesContext context) throws IOException { //Do nothing. Let inner components encode themselves, this component does not render to HTML } @Override public void encodeChildren(FacesContext context) throws IOException { for(UIComponent child : getChildren()) { child.encodeAll(context); } } @Override public void encodeEnd(FacesContext context) throws IOException { //Do nothing. Let inner components encode themselves, this component does not render to HTML } @Override protected Object getConvertedValue(FacesContext context, Object newSubmittedValue) throws ConverterException { return newSubmittedValue; } }