package net.bootsfaces.expressions;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.faces.FacesException;
import javax.faces.component.NamingContainer;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
public class FindIdRecursiveExpressionResolver implements AbstractExpressionResolver {
public List<UIComponent> resolve(UIComponent component, List<UIComponent> parentComponents, String currentId,
String originalExpression, String[] parameters) {
List<UIComponent> result = new ArrayList<UIComponent>();
for (UIComponent parent : parentComponents) {
UIComponent searchRoot = parent;
while ((!(searchRoot instanceof UIViewRoot)) && (!(searchRoot instanceof NamingContainer))) {
searchRoot = searchRoot.getParent();
}
List<UIComponent> c = findIdsRecursively(searchRoot, parameters[0]);
if (null != c) {
result.addAll(c);
}
}
if (result.size() > 0) {
return result;
}
throw new FacesException("Invalid search expression - couldn't find id " + currentId + ". Complete search expression: " + originalExpression);
}
public List<UIComponent> findIdsRecursively(UIComponent parent, String id) {
if (null==parent)
return null;
List<UIComponent> result = null;
if (id.equals(parent.getId())) {
result = new ArrayList<UIComponent>();
result.add(parent);
}
Iterator<UIComponent> facetsAndChildren = parent.getFacetsAndChildren();
while (facetsAndChildren.hasNext()) {
UIComponent child = facetsAndChildren.next();
List<UIComponent> childresult = findIdsRecursively(child, id);
if (null != childresult && (!childresult.isEmpty())) {
if (null == result) {
result = new ArrayList<UIComponent>();
}
result.addAll(childresult);
}
}
return result;
}
}