@Override public void resolve(SearchKeywordContext context, UIComponent current, String keyword) { try { Matcher matcher = PATTERN.matcher(keyword); if (matcher.matches()) { WidgetVarVisitCallback visitCallback = new WidgetVarVisitCallback(matcher.group(1)); context.getSearchExpressionContext().getFacesContext().getViewRoot().visitTree( SearchExpressionUtils.createVisitContext( context.getSearchExpressionContext().getFacesContext(), SearchExpressionHint.SKIP_UNRENDERED), visitCallback); context.invokeContextCallback(visitCallback.getComponent()); } else { throw new FacesException("Expression does not match following pattern @widgetVar(var). Expression: \"" + keyword + "\""); } } catch (Exception e) { throw new FacesException("Expression does not match following pattern @widgetVar(var). Expression: \"" + keyword + "\"", e); } } }
/** * <p class="changed_added_2_3">Creates a {@link SearchExpressionContext} instance * for use with the {@link SearchExpressionHandler}. * This method can be used to obtain a SearchExpressionContext instance * without any {@link VisitHint} or {@link SearchExpressionHint}.</p> * * @param context the FacesContext for the current request * @param source the source / base component from which we will start to perform our search. * * @return a {@link SearchExpressionContext} instance * * @since 2.3 */ public static SearchExpressionContext createSearchExpressionContext(FacesContext context, UIComponent source) { return createSearchExpressionContext(context, source, null, null); }
protected boolean isHintSet(SearchExpressionContext searchExpressionContext, SearchExpressionHint hint) { if (searchExpressionContext.getExpressionHints() == null) { return false; } return searchExpressionContext.getExpressionHints().contains(hint); }
FacesContext facesContext = searchExpressionContext.getFacesContext(); SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler(); handler.invokeOnComponent(searchExpressionContext, searchExpressionContext.getSource(), expression, checkCallback); + searchExpressionContext.getSource().getClientId(facesContext) + "\".");
FacesContext facesContext = searchExpressionContext.getFacesContext(); if (target == null && !searchExpressionContext.getExpressionHints().contains( SearchExpressionHint.SKIP_VIRTUAL_COMPONENTS)) && searchExpressionContext.getSource() == previous && (topExpression.indexOf(separatorChar) == -1) )
@Override public void resolve(SearchKeywordContext expressionContext, UIComponent current, String keyword) FacesContext facesContext = expressionContext.getSearchExpressionContext().getFacesContext(); if (expressionContext.getSearchExpressionContext().getExpressionHints() != null && expressionContext.getSearchExpressionContext().getExpressionHints().contains( SearchExpressionHint.SKIP_VIRTUAL_COMPONENTS)) expressionContext.getSearchExpressionContext().getVisitHints()), new VisitCallback()
@Override public void resolve(SearchKeywordContext searchKeywordContext, UIComponent current, String keyword) { FacesContext facesContext = searchKeywordContext.getSearchExpressionContext().getFacesContext(); String id = extractId(keyword); if (isHintSet(searchKeywordContext.getSearchExpressionContext(), SearchExpressionHint.SKIP_VIRTUAL_COMPONENTS)) { // Avoid visit tree because in this case we need real component instances. // This means components inside UIData will not be scanned. findWithId(facesContext, id, current, searchKeywordContext.getCallback()); } else { current.visitTree( VisitContext.createVisitContext(facesContext, null, searchKeywordContext.getSearchExpressionContext().getVisitHints()), new VisitCallback() { @Override public VisitResult visit(VisitContext context, UIComponent target) { if (id.equals(target.getId())) { searchKeywordContext.invokeContextCallback(target); if (isHintSet(searchKeywordContext.getSearchExpressionContext(), SearchExpressionHint.RESOLVE_SINGLE_COMPONENT)) { return VisitResult.COMPLETE; } return VisitResult.ACCEPT; } else { return VisitResult.ACCEPT; } } }); } searchKeywordContext.setKeywordResolved(true); }
public abstract void invokeOnComponent(SearchExpressionContext searchExpressionContext, UIComponent previous, String expression, ContextCallback topCallback);
FacesContext facesContext = searchExpressionContext.getFacesContext(); SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler(); handler.invokeOnComponent(searchExpressionContext, searchExpressionContext.getSource(), expression, checkCallback); + searchExpressionContext.getSource().getClientId(facesContext) + "\".");
@Override public void resolve(SearchKeywordContext searchKeywordContext, UIComponent current, String keyword) { FacesContext facesContext = searchKeywordContext.getSearchExpressionContext().getFacesContext(); String id = extractId(keyword); if (isHintSet(searchKeywordContext.getSearchExpressionContext(), SearchExpressionHint.SKIP_VIRTUAL_COMPONENTS)) { // Avoid visit tree because in this case we need real component instances. // This means components inside UIData will not be scanned. findWithId(facesContext, id, current, searchKeywordContext.getCallback()); } else { current.visitTree( VisitContext.createVisitContext(facesContext, null, searchKeywordContext.getSearchExpressionContext().getVisitHints()), new VisitCallback() { @Override public VisitResult visit(VisitContext context, UIComponent target) { if (id.equals(target.getId())) { searchKeywordContext.invokeContextCallback(target); if (isHintSet(searchKeywordContext.getSearchExpressionContext(), SearchExpressionHint.RESOLVE_SINGLE_COMPONENT)) { return VisitResult.COMPLETE; } return VisitResult.ACCEPT; } else { return VisitResult.ACCEPT; } } }); } searchKeywordContext.setKeywordResolved(true); }
/** * <p class="changed_added_2_3">Resolves multiple {@link UIComponent}s for the given * expression. For each resolved component, the {@link ContextCallback} will be invoked. * * This method is the most essential method in the API. * It implements the algorithm which handles the recursion of the keywords and id's. * </p> * * @param searchExpressionContext the {@link SearchExpressionContext} * @param expression the search expression * @param callback the callback for the resolved component * * @throws FacesException if the expression is not valid. * * @since 2.3 */ public void invokeOnComponent(SearchExpressionContext searchExpressionContext, String expression, ContextCallback callback) { invokeOnComponent(searchExpressionContext, searchExpressionContext.getSource(), expression, callback); }
@Override public void resolveComponent(SearchExpressionContext searchExpressionContext, String expression, ContextCallback callback) { if (expression != null) { expression = expression.trim(); } addHint(searchExpressionContext, SearchExpressionHint.RESOLVE_SINGLE_COMPONENT); FacesContext facesContext = searchExpressionContext.getFacesContext(); SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler(); ResolveComponentCallback internalCallback = new ResolveComponentCallback(callback); handler.invokeOnComponent(searchExpressionContext, expression, internalCallback); if (!internalCallback.isInvoked() && !isHintSet(searchExpressionContext, SearchExpressionHint.IGNORE_NO_RESULT)) { throw new ComponentNotFoundException("Cannot find component for expression \"" + expression + "\" referenced from \"" + searchExpressionContext.getSource().getClientId(facesContext) + "\"."); } }
/** * <p class="changed_added_2_3">This method will be called by an implementation of {@link * SearchKeywordResolver#resolve} with the resolved component for the keyword.</p> * * @param target the resolved {@link UIComponent}. * * @since 2.3 */ public void invokeContextCallback(UIComponent target) { keywordResolved = true; callback.invokeContextCallback(searchExpressionContext.getFacesContext(), target); }
/** * <p class="changed_added_2_3">Creates a {@link SearchExpressionContext} instance * for use with the {@link SearchExpressionHandler}. * This method can be used to obtain a SearchExpressionContext instance * without any {@link VisitHint} or {@link SearchExpressionHint}.</p> * * @param context the FacesContext for the current request * @param source the source / base component from which we will start to perform our search. * * @return a {@link SearchExpressionContext} instance * * @since 2.3 */ public static SearchExpressionContext createSearchExpressionContext(FacesContext context, UIComponent source) { return createSearchExpressionContext(context, source, null, null); }
@Override public void resolve(SearchKeywordContext searchKeywordContext, UIComponent current, String keyword) { FacesContext facesContext = searchKeywordContext.getSearchExpressionContext().getFacesContext(); String id = extractId(keyword); if (isHintSet(searchKeywordContext.getSearchExpressionContext(), SearchExpressionHint.SKIP_VIRTUAL_COMPONENTS)) { // Avoid visit tree because in this case we need real component instances. // This means components inside UIData will not be scanned. findWithId(facesContext, id, current, searchKeywordContext.getCallback()); } else { current.visitTree( VisitContext.createVisitContext(facesContext, null, searchKeywordContext.getSearchExpressionContext().getVisitHints()), new VisitCallback() { @Override public VisitResult visit(VisitContext context, UIComponent target) { if (id.equals(target.getId())) { searchKeywordContext.invokeContextCallback(target); if (isHintSet(searchKeywordContext.getSearchExpressionContext(), SearchExpressionHint.RESOLVE_SINGLE_COMPONENT)) { return VisitResult.COMPLETE; } return VisitResult.ACCEPT; } else { return VisitResult.ACCEPT; } } }); } searchKeywordContext.setKeywordResolved(true); }
/** * <p class="changed_added_2_3">Resolves multiple {@link UIComponent}s for the given * expression. For each resolved component, the {@link ContextCallback} will be invoked. * * This method is the most essential method in the API. * It implements the algorithm which handles the recursion of the keywords and id's. * </p> * * @param searchExpressionContext the {@link SearchExpressionContext} * @param expression the search expression * @param callback the callback for the resolved component * * @throws FacesException if the expression is not valid. * * @since 2.3 */ public void invokeOnComponent(SearchExpressionContext searchExpressionContext, String expression, ContextCallback callback) { invokeOnComponent(searchExpressionContext, searchExpressionContext.getSource(), expression, callback); }
@Override public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword) { if (searchExpressionContext.getExpressionHints() != null && searchExpressionContext.getExpressionHints().contains(SearchExpressionHint.RESOLVE_CLIENT_SIDE)) { return true; } else { return false; } }
@Override public void resolveComponent(SearchExpressionContext searchExpressionContext, String expression, ContextCallback callback) { if (expression != null) { expression = expression.trim(); } addHint(searchExpressionContext, SearchExpressionHint.RESOLVE_SINGLE_COMPONENT); FacesContext facesContext = searchExpressionContext.getFacesContext(); SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler(); ResolveComponentCallback internalCallback = new ResolveComponentCallback(callback); handler.invokeOnComponent(searchExpressionContext, expression, internalCallback); if (!internalCallback.isInvoked() && !isHintSet(searchExpressionContext, SearchExpressionHint.IGNORE_NO_RESULT)) { throw new ComponentNotFoundException("Cannot find component for expression \"" + expression + "\" referenced from \"" + searchExpressionContext.getSource().getClientId(facesContext) + "\"."); } }
/** * <p class="changed_added_2_3">This method will be called by an implementation of {@link * SearchKeywordResolver#resolve} with the resolved component for the keyword.</p> * * @param target the resolved {@link UIComponent}. * * @since 2.3 */ public void invokeContextCallback(UIComponent target) { keywordResolved = true; callback.invokeContextCallback(searchExpressionContext.getFacesContext(), target); }
/** * <p class="changed_added_2_3">Creates a {@link SearchExpressionContext} instance * for use with the {@link SearchExpressionHandler}. * This method can be used to obtain a SearchExpressionContext instance * without any {@link VisitHint} or {@link SearchExpressionHint}.</p> * * @param context the FacesContext for the current request * @param source the source / base component from which we will start to perform our search. * * @return a {@link SearchExpressionContext} instance * * @since 2.3 */ public static SearchExpressionContext createSearchExpressionContext(FacesContext context, UIComponent source) { return createSearchExpressionContext(context, source, null, null); }