package net.bootsfaces.expressions;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.el.ValueExpression;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
public class PropertyExpressionResolver implements AbstractExpressionResolver {
public List<UIComponent> resolve(UIComponent component, List<UIComponent> parentComponents, String currentId,
String originalExpression, String[] parameters) {
if (null==parameters || parameters.length!=1) {
throw new FacesException("The @property search expression requires a parameter! " + originalExpression);
}
String propertyName = "#{" + parameters[0] + "}";
List<UIComponent> result = null;
for (UIComponent p:parentComponents) {
List<UIComponent> r = findPropertyRecursively(p, propertyName);
if (result==null) {
result=r;
} else if (r!=null) {
result.addAll(r);
}
}
return result;
}
public List<UIComponent> findPropertyRecursively(UIComponent parent, String propertyName) {
if (null==parent)
return null;
ValueExpression vex = parent.getValueExpression("value");
if (null != vex) {
String expression = vex.getExpressionString();
if (expression != null && expression.equals(propertyName)) {
List<UIComponent> result = new ArrayList<UIComponent>(1);
result.add(parent);
return result;
}
}
Iterator<UIComponent> facetsAndChildren = parent.getFacetsAndChildren();
List<UIComponent> result = null;
while (facetsAndChildren.hasNext()) {
UIComponent child = facetsAndChildren.next();
List<UIComponent> hit = findPropertyRecursively(child, propertyName);
if (null != hit) {
if (null==result) {
result = hit;
} else {
result.addAll(hit);
}
}
}
return result;
}
}