You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2016/11/25 01:55:54 UTC

svn commit: r1771239 - in /myfaces/core/branches/2.3.x: api/src/main/java/javax/faces/component/search/ impl/src/main/java/org/apache/myfaces/component/search/ impl/src/main/java/org/apache/myfaces/renderkit/html/ impl/src/main/java/org/apache/myfaces/...

Author: lu4242
Date: Fri Nov 25 01:55:53 2016
New Revision: 1771239

URL: http://svn.apache.org/viewvc?rev=1771239&view=rev
Log:
MYFACES-4075 SearchExpression API (working proposal)

Added:
    myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/renderkit/html/behavior/
    myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/renderkit/html/behavior/role.xhtml
      - copied unchanged from r1757774, myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/renderkit/html/role.xhtml
Modified:
    myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHandler.java
    myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHandlerWrapper.java
    myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHint.java
    myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/AllSearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ChildSearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/CompositeComponentParentSearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/CompositeSearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/FormSearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/IdSearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NamingContainerSearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NextSearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NoneSearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ParentSearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/PreviousSearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/RootSearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ThisSearchExpressionResolver.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlAjaxBehaviorRenderer.java
    myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttachedObjectTargetImpl.java
    myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java
    myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/AbstractClientBehaviorTestCase.java
    myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/HtmlOutcomeTargetButtonClientBehaviorRendererTest.java
    myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/component/search/search1.xhtml

Modified: myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHandler.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHandler.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHandler.java (original)
+++ myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHandler.java Fri Nov 25 01:55:53 2016
@@ -62,12 +62,6 @@ public abstract class SearchExpressionHa
     
     public abstract String[] splitExpressions(String expressions);
     
-    public abstract List<UIComponent> findComponentFromExpression(SearchExpressionContext searchExpressionContext, 
-            UIComponent source, String topExpression);
-
-    public abstract List<UIComponent> applyKeyword(SearchExpressionContext searchExpressionContext, UIComponent last, 
-                             String command);
-
     public abstract boolean isPassthroughExpression(SearchExpressionContext searchExpressionContext, String expression);
     
     public abstract boolean isValidExpression(SearchExpressionContext searchExpressionContext, String expression);

Modified: myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHandlerWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHandlerWrapper.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHandlerWrapper.java (original)
+++ myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHandlerWrapper.java Fri Nov 25 01:55:53 2016
@@ -67,4 +67,35 @@ public abstract class SearchExpressionHa
         getWrapped().applyKeyword(searchExpressionContext, last, command, topCallback);
     }
 
+    @Override
+    public boolean isValidExpression(SearchExpressionContext searchExpressionContext, String expression)
+    {
+        return getWrapped().isValidExpression(searchExpressionContext, expression);
+    }
+
+    @Override
+    public boolean isPassthroughExpression(SearchExpressionContext searchExpressionContext, String expression)
+    {
+        return getWrapped().isPassthroughExpression(searchExpressionContext, expression);
+    }
+
+    @Override
+    public String[] splitExpressions(String expressions)
+    {
+        return getWrapped().splitExpressions(expressions);
+    }
+
+    @Override
+    public void resolveComponents(
+            SearchExpressionContext searchExpressionContext, String expressions, ContextCallback callback)
+    {
+        getWrapped().resolveComponents(searchExpressionContext, expressions, callback);
+    }
+
+    @Override
+    public String resolveClientId(SearchExpressionContext searchExpressionContext, String expressions)
+    {
+        return getWrapped().resolveClientId(searchExpressionContext, expressions);
+    }
+
 }

Modified: myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHint.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHint.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHint.java (original)
+++ myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionHint.java Fri Nov 25 01:55:53 2016
@@ -28,11 +28,20 @@ public enum SearchExpressionHint
     IGNORE_NO_RESULT,
 
     PARENT_FALLBACK,
-    
+
+    /**
+     * Indicate the algorithm is extracting client ids from expressions.
+     */
     RESOLVE_CLIENT_ID,
     
+    /**
+     * Indicate that the method is collecting a list of real UIComponent instances.
+     */
     RESOLVE_COMPONENT_LIST,
     
-    RESOLVE_AJAX
+    /**
+     * Indicate that some expressions can be resolved on the client side.
+     */
+    EXECUTE_CLIENT_SIDE
 
 }

Modified: myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/search/SearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -27,7 +27,7 @@ import javax.faces.component.UIComponent
 public abstract class SearchExpressionResolver
 {
     
-    public abstract void resolve(SearchKeywordContext keywordContext, UIComponent last, String keyword);
+    public abstract void resolve(SearchKeywordContext keywordContext, UIComponent last, String command);
     
     /**
      * Check if the keyword can be resolved by the current resolver
@@ -36,7 +36,7 @@ public abstract class SearchExpressionRe
      * @param keyword
      * @return 
      */
-    public abstract boolean matchKeyword(SearchExpressionContext searchExpressionContext, String keyword);
+    public abstract boolean matchKeyword(SearchExpressionContext searchExpressionContext, String command);
     
     /**
      * A passthrough keyword is a keyword that according to the context does not require to be resolved on the server,
@@ -46,7 +46,7 @@ public abstract class SearchExpressionRe
      * @param keyword
      * @return 
      */
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String command)
     {
         return false;
     }
@@ -59,7 +59,7 @@ public abstract class SearchExpressionRe
      * @param keyword
      * @return 
      */
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String command)
     {
         return false;
     }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/AllSearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/AllSearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/AllSearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/AllSearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -47,6 +47,11 @@ public class AllSearchExpressionResolver
         }
     }
     
+    public String getKeyword()
+    {
+        return ALL_KEYWORD;
+    }
+
     @Override
     public boolean matchKeyword(SearchExpressionContext searchExpressionContext, String keyword)
     {
@@ -54,12 +59,12 @@ public class AllSearchExpressionResolver
     }
 
     @Override
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }
     
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return true;
     }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ChildSearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ChildSearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ChildSearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ChildSearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -69,7 +69,7 @@ public class ChildSearchExpressionResolv
                         {
                             count++;
                         }
-                        if (count == childNumber)
+                        if (count == childNumber + 1)
                         {
                             expressionContext.invokeContextCallback(expressionContext.getFacesContext(), 
                                     last.getChildren().get(childNumber));
@@ -99,6 +99,11 @@ public class ChildSearchExpressionResolv
         }
     }
     
+    public String getKeyword()
+    {
+        return CHILD_KEYWORD;
+    }
+
     @Override
     public boolean matchKeyword(SearchExpressionContext searchExpressionContext, String command)
     {
@@ -127,12 +132,12 @@ public class ChildSearchExpressionResolv
     }
 
     @Override
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }
     
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/CompositeComponentParentSearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/CompositeComponentParentSearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/CompositeComponentParentSearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/CompositeComponentParentSearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -48,12 +48,12 @@ public class CompositeComponentParentSea
     }
 
     @Override
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     } 
     
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/CompositeSearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/CompositeSearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/CompositeSearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/CompositeSearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -86,31 +86,35 @@ public class CompositeSearchExpressionRe
     }
 
     @Override
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword)
     {
         int sz = this.size;
         for (int i = 0; i < sz; i++) 
         {
             if (this.resolvers[i].matchKeyword(searchExpressionContext, keyword))
             {
-                return this.resolvers[i].isPassthroughKeyword(searchExpressionContext, keyword);
+                return this.resolvers[i].isPassthrough(searchExpressionContext, keyword);
             }
         }
         return false;
     }
     
     @Override
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String keyword)
     {
         int sz = this.size;
         for (int i = 0; i < sz; i++) 
         {
             if (this.resolvers[i].matchKeyword(searchExpressionContext, keyword))
             {
-                return this.resolvers[i].isLeafKeyword(searchExpressionContext, keyword);
+                return this.resolvers[i].isLeaf(searchExpressionContext, keyword);
             }
         }
         return false;
     }
 
+    public String getKeyword()
+    {
+        return null;
+    }
 }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/FormSearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/FormSearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/FormSearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/FormSearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -66,10 +66,10 @@ public class FormSearchExpressionResolve
     }
 
     @Override
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword)
     {
         if (searchExpressionContext.getExpressionHints() != null &&
-            searchExpressionContext.getExpressionHints().contains(SearchExpressionHint.RESOLVE_AJAX))
+            searchExpressionContext.getExpressionHints().contains(SearchExpressionHint.EXECUTE_CLIENT_SIDE))
         {
             return true;
         }
@@ -80,7 +80,7 @@ public class FormSearchExpressionResolve
     }
     
     @Override
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/IdSearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/IdSearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/IdSearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/IdSearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -133,6 +133,11 @@ public class IdSearchExpressionResolver
         }
     }
     
+    public String getKeyword()
+    {
+        return ID_KEYWORD;
+    }
+    
     @Override
     public boolean matchKeyword(SearchExpressionContext searchExpressionContext, String command)
     {
@@ -161,13 +166,13 @@ public class IdSearchExpressionResolver
     }
 
     @Override
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }
 
     @Override
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NamingContainerSearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NamingContainerSearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NamingContainerSearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NamingContainerSearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -66,13 +66,13 @@ public class NamingContainerSearchExpres
     }
 
     @Override
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }
     
     @Override
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NextSearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NextSearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NextSearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NextSearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -21,6 +21,7 @@ package org.apache.myfaces.component.sea
 
 import java.util.List;
 import javax.faces.component.UIComponent;
+import javax.faces.component.search.Markup;
 import javax.faces.component.search.SearchExpressionContext;
 import javax.faces.component.search.SearchKeywordContext;
 import javax.faces.component.search.SearchExpressionResolver;
@@ -40,14 +41,27 @@ public class NextSearchExpressionResolve
             UIComponent parent = last.getParent();
             if (parent.getChildCount() > 1) 
             {
-                    List<UIComponent> children = parent.getChildren();
-                    int index = children.indexOf(last);
+                List<UIComponent> children = parent.getChildren();
+                int index = children.indexOf(last);
 
-                    if (index < parent.getChildCount() - 1)
+                if (index < parent.getChildCount() - 1)
+                {
+                    int nextIndex = -1;
+                    do
+                    {
+                        index++;
+                        if(!(children.get(index) instanceof Markup))
+                        {
+                            nextIndex = index;
+                        }
+                    } while (nextIndex == -1 && index < parent.getChildCount() - 1);
+                    
+                    if (nextIndex != -1)
                     {
                         expressionContext.invokeContextCallback(expressionContext.getFacesContext(), 
-                                children.get(index + 1));
+                                children.get(nextIndex));
                     }
+                }
             }
             expressionContext.setCommandResolved(true);
         }
@@ -60,13 +74,13 @@ public class NextSearchExpressionResolve
     }
 
     @Override
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }
     
     @Override
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NoneSearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NoneSearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NoneSearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/NoneSearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -47,13 +47,13 @@ public class NoneSearchExpressionResolve
     }
 
     @Override
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }
     
     @Override
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return true;
     }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ParentSearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ParentSearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ParentSearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ParentSearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -40,6 +40,11 @@ public class ParentSearchExpressionResol
         }
     }
     
+    public String getKeyword()
+    {
+        return PARENT_KEYWORD;
+    }
+
     @Override
     public boolean matchKeyword(SearchExpressionContext searchExpressionContext, String keyword)
     {
@@ -47,13 +52,13 @@ public class ParentSearchExpressionResol
     }
 
     @Override
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }
     
     @Override
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/PreviousSearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/PreviousSearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/PreviousSearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/PreviousSearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -21,6 +21,7 @@ package org.apache.myfaces.component.sea
 
 import java.util.List;
 import javax.faces.component.UIComponent;
+import javax.faces.component.search.Markup;
 import javax.faces.component.search.SearchExpressionContext;
 import javax.faces.component.search.SearchKeywordContext;
 import javax.faces.component.search.SearchExpressionResolver;
@@ -46,8 +47,21 @@ public class PreviousSearchExpressionRes
 
                 if (index > 0)
                 {
-                    expressionContext.invokeContextCallback(
-                            expressionContext.getFacesContext(), children.get(index - 1));
+                    int nextIndex = -1;
+                    do
+                    {
+                        index--;
+                        if(!(children.get(index) instanceof Markup))
+                        {
+                            nextIndex = index;
+                        }
+                    } while (nextIndex == -1 && index > 0);
+                    
+                    if (nextIndex != -1)
+                    {
+                        expressionContext.invokeContextCallback(
+                                expressionContext.getFacesContext(), children.get(nextIndex));
+                    }
                 }
             }
             expressionContext.setCommandResolved(true);
@@ -61,13 +75,13 @@ public class PreviousSearchExpressionRes
     }
 
     @Override
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }
     
     @Override
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/RootSearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/RootSearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/RootSearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/RootSearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -41,6 +41,11 @@ public class RootSearchExpressionResolve
         }
     }
 
+    public String getKeyword()
+    {
+        return ROOT_KEYWORD;
+    }
+
     @Override
     public boolean matchKeyword(SearchExpressionContext searchExpressionContext, String keyword)
     {
@@ -48,13 +53,13 @@ public class RootSearchExpressionResolve
     }
 
     @Override
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }
     
     @Override
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/SearchExpressionHandlerImpl.java Fri Nov 25 01:55:53 2016
@@ -414,7 +414,8 @@ public class SearchExpressionHandlerImpl
                     if (parent != null)
                     {
                         target = parent.findComponent(expression);
-                        if (target == null)
+                        if (target == null && !searchExpressionContext.getExpressionHints().contains(
+                                SearchExpressionHint.RESOLVE_COMPONENT_LIST))
                         {
                             contextClientId = parent.getClientId(facesContext);
                             // If no component is found,
@@ -499,7 +500,7 @@ public class SearchExpressionHandlerImpl
 
             // If the keyword is @child, @composite, @form, @namingcontainer, @next, @none, @parent, @previous,
             // @root, @this ,  all commands change the source to be applied the action
-            passthrough = facesContext.getApplication().getSearchExpressionResolver().isPassthroughKeyword(
+            passthrough = facesContext.getApplication().getSearchExpressionResolver().isPassthrough(
                     searchExpressionContext, command);
             
             if (passthrough)
@@ -554,7 +555,7 @@ public class SearchExpressionHandlerImpl
                     searchExpressionContext, command);
             if (remaining != null)
             {
-                if (facesContext.getApplication().getSearchExpressionResolver().isLeafKeyword(
+                if (facesContext.getApplication().getSearchExpressionResolver().isLeaf(
                     searchExpressionContext, command))
                 {
                     isValid = false;
@@ -812,217 +813,4 @@ public class SearchExpressionHandlerImpl
         return tokens.toArray(new String[tokens.size()]);
     }
     
-    public List<UIComponent> findComponentFromExpression(SearchExpressionContext searchExpressionContext, 
-            UIComponent source, String topExpression)
-    {
-        // Command pattern to apply the keyword or command to the base and then invoke the callback
-        FacesContext facesContext = searchExpressionContext.getFacesContext();
-        UIComponent currentBase = source;
-        List<UIComponent> responseList = null;
-
-        searchExpressionContext.getExpressionHints().add(SearchExpressionHint.RESOLVE_COMPONENT_LIST);
-
-        //Step 1: find base        
-        //  Case ':' (root)
-        char separatorChar = facesContext.getNamingContainerSeparatorChar();
-        if (topExpression.charAt(0) == separatorChar)
-        {
-            UIComponent findBase;
-            findBase = SearchComponentUtils.getRootComponent(currentBase);
-            return facesContext.getApplication().getSearchExpressionHandler().findComponentFromExpression(
-                    searchExpressionContext, findBase, topExpression.substring(1));
-        }
-
-        //Step 2: Once you have a base where you can start, apply an expression 
-        if (topExpression.charAt(0) == KEYWORD_PREFIX.charAt(0))
-        {
-            // A keyword means apply a command over the current source using an expression and the result must be
-            // feedback into the algorithm.
-            final UIComponent base = currentBase;
-
-            String command = extractKeyword(topExpression, 1, separatorChar);
-            final String remaining = 
-                    command.length()+1 < topExpression.length() ? 
-                        topExpression.substring(1+command.length()+1) : null;
-            
-            final SearchExpressionHandler currentInstance = 
-                    facesContext.getApplication().getSearchExpressionHandler();
-
-            // If the keyword is @child, @composite, @form, @namingcontainer, @next, @none, @parent, @previous,
-            // @root, @this ,  all commands change the source to be applied the action
-            if (remaining != null)
-            {
-                List<UIComponent> resp = this.applyKeyword(searchExpressionContext, base, command);
-                if (resp != null)
-                {
-                    for (UIComponent target : resp)
-                    {
-                        List<UIComponent> list = currentInstance.findComponentFromExpression(
-                                searchExpressionContext, target, remaining);
-                        if (list != null)
-                        {
-                            if (responseList == null)
-                            {
-                                responseList = list;
-                            }
-                            else
-                            {
-                                responseList.addAll(list);
-                            }
-                        }
-                    }
-                }
-            }
-            else
-            {
-                List<UIComponent> resp = this.applyKeyword(searchExpressionContext, base, command);
-                if (resp != null)
-                {
-                    if (responseList == null)
-                    {
-                        responseList = resp;
-                    }
-                    else
-                    {
-                        responseList.addAll(resp);
-                    }
-                }
-            }
-        }
-        else
-        {
-
-            //Split expression into tokens and apply loop
-            String nextExpression = null;
-            String expression;
-            if (topExpression.indexOf(":@") > 0)
-            {
-                int idx = topExpression.indexOf(":@");
-                nextExpression = topExpression.substring(idx+1);
-                expression = topExpression.substring(0,idx);
-            }
-            else
-            {
-                expression = topExpression;
-            }
-
-            // Use findComponent(...) passing the expression provided
-            UIComponent target = currentBase.findComponent(expression);
-            if (target == null)
-            {
-                // If no component is found ...
-                // First try to find the base component.
-
-                // Extract the base id from the expression string
-                int idx = expression.indexOf(separatorChar);
-                String base = idx > 0 ? expression.substring(0, idx) : expression;
-
-                // From the context component clientId, check if the base is part of the clientId
-                String contextClientId = currentBase.getClientId(facesContext);
-                int startCommon = contextClientId.lastIndexOf(base+facesContext.getNamingContainerSeparatorChar());
-                if (startCommon >= 0 
-                    && (startCommon == 0 || contextClientId.charAt(startCommon-1) == separatorChar )
-                    && (startCommon+base.length() <= contextClientId.length()-1 || 
-                        contextClientId.charAt(startCommon+base.length()+1) == separatorChar )) 
-                {
-                    // If there is a match, try to find a the first parent component whose id is equals to
-                    // the base id
-                    UIComponent parent = currentBase;
-                    while (parent != null )
-                    {
-                        if (base.equals(parent.getId()) && parent instanceof NamingContainer)
-                        {
-                            break;
-                        }
-                        else
-                        {
-                            parent = parent.getParent();
-                        }
-                    }
-
-                    // if a base component is found ...
-                    if (parent != null)
-                    {
-                        target = parent.findComponent(expression);
-                        /*
-                        if (target == null)
-                        {
-                            contextClientId = parent.getClientId(facesContext);
-                            // If no component is found,
-                            String targetClientId = contextClientId.substring(0, startCommon+base.length()) + 
-                                    expression.substring(base.length());
-
-                            final SearchExpressionHandler currentHandler = 
-                                    facesContext.getApplication().getSearchExpressionHandler();
-
-                            if (nextExpression != null)
-                            {
-                                final String childExpression = nextExpression;
-
-                                parent.invokeOnComponent(facesContext, targetClientId, new ContextCallback(){
-                                    public void invokeContextCallback(FacesContext context, UIComponent target)
-                                    {
-                                        currentHandler.invokeOnComponentFromExpression(
-                                                searchExpressionContext, target, childExpression, topCallback);
-                                    }
-                                });
-                            }
-                            else
-                            {
-                                parent.invokeOnComponent(facesContext, targetClientId, topCallback);
-                            }
-                            return;
-                        }*/
-                    }
-                }
-            }
-            if (target != null)
-            {
-                currentBase = target;
-            }
-            if (currentBase != null)
-            {
-                if (responseList == null)
-                {
-                    responseList = new ArrayList<UIComponent>();
-                }
-                responseList.add(currentBase);
-            }
-        }
-        return responseList;
-    }
-
-    public List<UIComponent> applyKeyword(SearchExpressionContext searchExpressionContext, UIComponent last, 
-                             String command)
-    {
-        Set<SearchExpressionHint> hints = searchExpressionContext.getExpressionHints();
-        CollectComponentCallback callback = new CollectComponentCallback();
-        searchExpressionContext.getFacesContext().getApplication().getSearchExpressionHandler().applyKeyword(
-                searchExpressionContext, last, command, callback);
-        return callback.getList();
-    }
-    
-    private static class CollectComponentCallback implements ContextCallback
-    {
-        private List<UIComponent> list = null;
-
-        @Override
-        public void invokeContextCallback(FacesContext context, UIComponent target)
-        {
-            if (getList() == null)
-            {
-                list = new ArrayList<UIComponent>(2);
-            }
-            getList().add(target);
-        }
-
-        /**
-         * @return the list
-         */
-        public List<UIComponent> getList()
-        {
-            return list;
-        }
-        
-    }
 }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ThisSearchExpressionResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ThisSearchExpressionResolver.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ThisSearchExpressionResolver.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/component/search/ThisSearchExpressionResolver.java Fri Nov 25 01:55:53 2016
@@ -47,13 +47,13 @@ public class ThisSearchExpressionResolve
     }
 
     @Override
-    public boolean isPassthroughKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isPassthrough(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }
 
     @Override
-    public boolean isLeafKeyword(SearchExpressionContext searchExpressionContext, String keyword)
+    public boolean isLeaf(SearchExpressionContext searchExpressionContext, String keyword)
     {
         return false;
     }

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlAjaxBehaviorRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlAjaxBehaviorRenderer.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlAjaxBehaviorRenderer.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlAjaxBehaviorRenderer.java Fri Nov 25 01:55:53 2016
@@ -21,8 +21,10 @@ package org.apache.myfaces.renderkit.htm
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.RandomAccess;
+import java.util.Set;
 
 import javax.faces.FacesException;
 import javax.faces.component.ActionSource;
@@ -31,6 +33,8 @@ import javax.faces.component.UIComponent
 import javax.faces.component.behavior.AjaxBehavior;
 import javax.faces.component.behavior.ClientBehavior;
 import javax.faces.component.behavior.ClientBehaviorContext;
+import javax.faces.component.search.SearchExpressionContext;
+import javax.faces.component.search.SearchExpressionHint;
 import javax.faces.context.FacesContext;
 import javax.faces.event.AjaxBehaviorEvent;
 import javax.faces.event.PhaseId;
@@ -462,6 +466,7 @@ public class HtmlAjaxBehaviorRenderer ex
         strVal = strVal.trim();
         if (!EMPTY.equals(strVal))
         {
+            /*
             if (!strVal.startsWith(IDENTIFYER_MARKER))
             {
                 String componentId = getComponentId(context, strVal);
@@ -470,7 +475,16 @@ public class HtmlAjaxBehaviorRenderer ex
             else
             {
                 retVal.append(strVal);
-            }
+            }*/
+            Set<SearchExpressionHint> expressionHints = new HashSet<SearchExpressionHint>();
+            expressionHints.add(SearchExpressionHint.RESOLVE_CLIENT_ID);
+            expressionHints.add(SearchExpressionHint.EXECUTE_CLIENT_SIDE);
+            SearchExpressionContext searchExpressionContext = 
+                    SearchExpressionContext.createSearchExpressionContext(context.getFacesContext(), 
+                            context.getComponent(), expressionHints, null);
+            String clientId = context.getFacesContext().getApplication().getSearchExpressionHandler().resolveClientId(
+                    searchExpressionContext, strVal);
+            retVal.append(clientId);
             if (cnt < size)
             {
                 retVal.append(BLANK);

Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttachedObjectTargetImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttachedObjectTargetImpl.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttachedObjectTargetImpl.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/AttachedObjectTargetImpl.java Fri Nov 25 01:55:53 2016
@@ -21,14 +21,16 @@ package org.apache.myfaces.view.facelets
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
-
+import java.util.Set;
 import javax.el.ValueExpression;
+import javax.faces.component.ContextCallback;
 import javax.faces.component.UIComponent;
 import javax.faces.component.search.SearchExpressionContext;
+import javax.faces.component.search.SearchExpressionHint;
 import javax.faces.context.FacesContext;
 import javax.faces.view.AttachedObjectTarget;
-
 import org.apache.myfaces.shared.util.StringUtils;
 import org.apache.myfaces.view.facelets.tag.jsf.ComponentSupport;
 
@@ -68,39 +70,19 @@ public class AttachedObjectTargetImpl im
         
         if (targetsArray.length > 0)
         {
-            List<UIComponent> targetsList = new ArrayList<UIComponent>(targetsArray.length);
-            //final char separatorChar = facesContext.getNamingContainerSeparatorChar();
             UIComponent facetBase = topLevelComponent.getFacet(UIComponent.COMPOSITE_FACET_NAME);
+            
+            CollectComponentListCallback callback = new CollectComponentListCallback(targetsArray.length);
             for (String target : targetsArray)
             {
-                //int separator = target.indexOf(separatorChar);
-                //UIComponent innerComponent = null;
-                List<UIComponent> resultList;
-                //if (separator == -1)
-                //{
-                    //innerComponent = ComponentSupport.findComponentChildOrFacetFrom(
-                    //        facetBase, target, null);
-                    resultList = facesContext.getApplication().getSearchExpressionHandler().
-                            findComponentFromExpression(SearchExpressionContext.createSearchExpressionContext(
-                                    facesContext, facetBase), facetBase, target);
-                //}
-                //else
-                //{
-                    //innerComponent = ComponentSupport.findComponentChildOrFacetFrom(
-                    //        facetBase, target.substring(0,separator), target);
-                //    resultList = facesContext.getApplication().getSearchExpressionHandler().
-                //            findComponentFromExpression(SearchExpressionContext.createSearchExpressionContext(
-                //                    facesContext, facetBase), facetBase, target.substring(0,separator));
-                //}
-                
-                //if (innerComponent != null)
-                if (resultList != null)
-                {
-                    targetsList.addAll(resultList);
-                    //targetsList.add(innerComponent);
-                }
+                Set<SearchExpressionHint> expressionHints = new HashSet<SearchExpressionHint>(2);
+                expressionHints.add(SearchExpressionHint.RESOLVE_COMPONENT_LIST);
+                SearchExpressionContext searchContext = SearchExpressionContext.createSearchExpressionContext(
+                                    facesContext, facetBase, expressionHints, null);
+                facesContext.getApplication().getSearchExpressionHandler()
+                        .resolveComponents(searchContext, target, callback);
             }
-            return targetsList;
+            return callback.getList();
         }
         else
         {
@@ -143,4 +125,28 @@ public class AttachedObjectTargetImpl im
     {
         _targets = ve;
     }
+    
+    private static class CollectComponentListCallback implements ContextCallback
+    {
+        private List<UIComponent> list = null;
+
+        public CollectComponentListCallback(int size)
+        {
+            list = new ArrayList<UIComponent>(size);
+        }
+
+        @Override
+        public void invokeContextCallback(FacesContext context, UIComponent target)
+        {
+            getList().add(target);
+        }
+
+        /**
+         * @return the list
+         */
+        public List<UIComponent> getList()
+        {
+            return list;
+        }
+    }
 }

Modified: myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java Fri Nov 25 01:55:53 2016
@@ -304,7 +304,7 @@ public class SearchExpressionImplTest ex
         Assert.assertFalse(handler.isPassthroughExpression(searchContext, "!whoNows"));
         
         Set<SearchExpressionHint> expressionHints = new HashSet<SearchExpressionHint>();
-        expressionHints.add(SearchExpressionHint.RESOLVE_AJAX);
+        expressionHints.add(SearchExpressionHint.EXECUTE_CLIENT_SIDE);
         SearchExpressionContext searchContextWithAjaxResolve = 
                 SearchExpressionContext.createSearchExpressionContext(facesContext, null, expressionHints, null);
         

Modified: myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/AbstractClientBehaviorTestCase.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/AbstractClientBehaviorTestCase.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/AbstractClientBehaviorTestCase.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/AbstractClientBehaviorTestCase.java Fri Nov 25 01:55:53 2016
@@ -18,6 +18,7 @@
  */
 package org.apache.myfaces.renderkit.html.behavior;
 
+import javax.faces.FactoryFinder;
 import javax.faces.component.UIComponent;
 import javax.faces.component.UIViewRoot;
 import javax.faces.component.behavior.AjaxBehavior;
@@ -26,9 +27,8 @@ import javax.faces.context.ResponseWrite
 
 import org.apache.myfaces.shared.renderkit.html.HtmlResponseWriterImpl;
 import org.apache.myfaces.shared.util.FastWriter;
-import org.apache.myfaces.test.base.junit4.AbstractJsfTestCase;
 import org.apache.myfaces.test.config.ConfigParser;
-import org.apache.myfaces.test.mock.MockFacesContext22;
+import org.apache.myfaces.view.facelets.FaceletTestCase;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -36,7 +36,7 @@ import org.junit.Test;
  * @author Leonardo Uribe (latest modification by $Author$)
  * @version $Revision$ $Date$
  */
-public abstract class AbstractClientBehaviorTestCase extends AbstractJsfTestCase
+public abstract class AbstractClientBehaviorTestCase extends FaceletTestCase
 {
     protected ResponseWriter writer;
     protected FastWriter outputWriter; 
@@ -47,6 +47,21 @@ public abstract class AbstractClientBeha
     protected abstract HtmlRenderedClientEventAttr[] getClientBehaviorHtmlRenderedAttributes();
     
     protected abstract UIComponent createComponentToTest();
+    
+    @Override
+    protected void setFactories() throws Exception
+    {
+        super.setFactories();
+        
+        FactoryFinder.setFactory(FactoryFinder.VIEW_DECLARATION_LANGUAGE_FACTORY,
+                "org.apache.myfaces.view.facelets.mock.MockViewDeclarationLanguageFactory");
+        FactoryFinder.setFactory(FactoryFinder.FACELET_CACHE_FACTORY,
+                "org.apache.myfaces.view.facelets.impl.FaceletCacheFactoryImpl");
+        FactoryFinder.setFactory(FactoryFinder.SEARCH_EXPRESSION_CONTEXT_FACTORY,
+                "org.apache.myfaces.component.search.SearchExpressionContextFactoryImpl");
+        FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY,
+                "org.apache.myfaces.application.ApplicationFactoryImpl");
+    }
 
     @Override
     protected void setUpJSFObjects() throws Exception
@@ -70,7 +85,8 @@ public abstract class AbstractClientBeha
         super.setUpRenderKit();
         parser = new ConfigParser();
         parser.parse(parser.getPlatformURLs());
-        //parser.parse(this.getClass().getResource("/META-INF/faces-config.xml"));        
+        //parser.parse(this.getClass().getResource("/META-INF/faces-config.xml"));    
+        request.setServletPath("/test");
     }
 
     /**

Modified: myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/HtmlOutcomeTargetButtonClientBehaviorRendererTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/HtmlOutcomeTargetButtonClientBehaviorRendererTest.java?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/HtmlOutcomeTargetButtonClientBehaviorRendererTest.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/HtmlOutcomeTargetButtonClientBehaviorRendererTest.java Fri Nov 25 01:55:53 2016
@@ -65,7 +65,9 @@ public class HtmlOutcomeTargetButtonClie
     @Override
     protected UIComponent createComponentToTest()
     {
-        return new HtmlOutcomeTargetButton();
+        HtmlOutcomeTargetButton button = new HtmlOutcomeTargetButton();
+        button.setOutcome("role");
+        return button;
     }
 
     @Override

Modified: myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/component/search/search1.xhtml
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/component/search/search1.xhtml?rev=1771239&r1=1771238&r2=1771239&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/component/search/search1.xhtml (original)
+++ myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/component/search/search1.xhtml Fri Nov 25 01:55:53 2016
@@ -29,7 +29,9 @@
         <h:form id="mainForm">
             
             <h:outputLabel id="labelName" for="name" value="Name: "/>
+            <div>
             <h:inputText id="name" value="NAME"/>
+            </div>
             <h:message id="msgName" for="name"/>
             
             <h:outputText id="showName" value="showName"/>