package net.bootsfaces.expressions; import java.util.ArrayList; import java.util.List; import javax.faces.component.NamingContainer; import javax.faces.component.UIComponent; import javax.faces.component.UIForm; import javax.faces.component.UIViewRoot; import net.bootsfaces.component.commandButton.CommandButton; import net.bootsfaces.component.navCommandLink.NavCommandLink; import net.bootsfaces.component.poll.Poll; public class FormOrThisExpressionResolver implements AbstractExpressionResolver { public List<UIComponent> resolve(UIComponent component, List<UIComponent> parentComponents, String currentId, String originalExpression, String[] parameters) { List<UIComponent> result = new ArrayList<UIComponent>(); boolean isButton = component instanceof CommandButton || component instanceof NavCommandLink; isButton |= component instanceof Poll; if (!isButton) { result.add(component); return result; } UIComponent c = component; while (c != null && c.getClass() != UIViewRoot.class) { if (UIForm.class.isAssignableFrom(c.getClass())) { result.add(c); break; } c = c.getParent(); } if (result.size() > 0) { return result; } c = component; while (c != null && c.getClass() != UIViewRoot.class) { if (NamingContainer.class.isAssignableFrom(c.getClass())) { result.add(c); break; } c = c.getParent(); } if (result.size() > 0) { return result; } else { result.add(component); return result; } } }