package net.bootsfaces.expressions; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.faces.FacesException; import javax.faces.component.UIComponent; public class StyleClassExpressionResolver 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 @styleClass search expression requires a parameter! " + originalExpression); } List<UIComponent> result = null; for (UIComponent p:parentComponents) { List<UIComponent> r = findStyleClassRecursively(p, parameters[0]); if (result==null) { result=r; } else if (r!=null) { result.addAll(r); } } return result; } public List<UIComponent> findStyleClassRecursively(UIComponent parent, String styleClass) { if (null==parent) return null; String sc = getStyleClass(parent); if (sc != null && sc.contains(styleClass)) { List<UIComponent> result = new ArrayList<UIComponent>(3); result.add(parent); return result; } Iterator<UIComponent> facetsAndChildren = parent.getFacetsAndChildren(); List<UIComponent> result = null; while (facetsAndChildren.hasNext()) { UIComponent child = facetsAndChildren.next(); List<UIComponent> hit = findStyleClassRecursively(child, styleClass); if (null != hit) { if (null==result) { result = hit; } else { result.addAll(hit); } } } return result; } public String getStyleClass(Object component) { try { Method method = component.getClass().getMethod("getStyleClass"); return (String)method.invoke(component); } catch (NoSuchMethodException e) { // deliberately ignored return null; } catch (SecurityException e) { // deliberately ignored return null; } catch (IllegalAccessException e) { // deliberately ignored return null; } catch (IllegalArgumentException e) { // deliberately ignored return null; } catch (InvocationTargetException e) { // deliberately ignored return null; } } }