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/23 01:36:27 UTC

svn commit: r1770904 [3/3] - in /myfaces/core/branches/2.3.x: api/src/main/java/javax/faces/ api/src/main/java/javax/faces/application/ api/src/main/java/javax/faces/component/search/ impl/src/main/java/org/apache/myfaces/application/ impl/src/main/jav...

Added: 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=1770904&view=auto
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java (added)
+++ myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/component/search/SearchExpressionImplTest.java Wed Nov 23 01:36:27 2016
@@ -0,0 +1,327 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.myfaces.component.search;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.faces.application.StateManager;
+import javax.faces.component.ContextCallback;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIOutput;
+import javax.faces.component.search.ComponentNotFoundException;
+import javax.faces.component.search.SearchExpressionContext;
+import javax.faces.component.search.SearchExpressionHandler;
+import javax.faces.component.search.SearchExpressionHint;
+import javax.faces.context.FacesContext;
+import org.apache.myfaces.mc.test.core.AbstractMyFacesRequestTestCase;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class SearchExpressionImplTest extends AbstractMyFacesRequestTestCase
+{
+    @Override
+    protected boolean isScanAnnotations()
+    {
+        return true;
+    }
+
+    @Override
+    protected void setUpWebConfigParams() throws Exception
+    {
+        super.setUpWebConfigParams();
+        servletContext.addInitParameter("org.apache.myfaces.annotation.SCAN_PACKAGES","org.apache.myfaces.component.search");
+        servletContext.addInitParameter(StateManager.STATE_SAVING_METHOD_PARAM_NAME, StateManager.STATE_SAVING_METHOD_CLIENT);
+        servletContext.addInitParameter("javax.faces.PARTIAL_STATE_SAVING", "true");
+    }
+
+    @Test
+    public void testSearchExpression1() throws Exception
+    {
+        startViewRequest("/search1.xhtml");
+        processLifecycleExecute();
+        executeBeforeRender();
+        executeBuildViewCycle();
+
+        UIOutput out = (UIOutput) facesContext.getViewRoot().findComponent("mainForm:showName");
+        SearchExpressionContext searchContext = 
+                SearchExpressionContext.createSearchExpressionContext(facesContext, out);
+        Collection<String> list = facesContext.getApplication().getSearchExpressionHandler().resolveClientIds(
+                searchContext, "mainForm:showName");
+
+        boolean found = false;
+        for (String clientId : list)
+        {
+            System.out.println(clientId);
+            found = true;
+        }
+        Assert.assertTrue(found);
+        
+        String componentId = facesContext.getApplication().getSearchExpressionHandler().resolveClientIds(
+                searchContext, "@this").get(0);
+        Assert.assertEquals(componentId, "mainForm:showName");
+        
+        componentId = facesContext.getApplication().getSearchExpressionHandler().resolveClientIds(
+                searchContext, "@this:@parent:showName").get(0);
+        Assert.assertEquals(componentId, "mainForm:showName");
+
+        componentId = facesContext.getApplication().getSearchExpressionHandler().resolveClientIds(
+                searchContext, "@parent:showName:@parent:showName").get(0);
+        Assert.assertEquals(componentId, "mainForm:showName");
+        
+        componentId = facesContext.getApplication().getSearchExpressionHandler().resolveClientIds(
+                searchContext, "@form:showName").get(0);
+        Assert.assertEquals(componentId, "mainForm:showName");
+
+        componentId = facesContext.getApplication().getSearchExpressionHandler().resolveClientIds(
+                searchContext, "@namingcontainer:showName").get(0);
+        Assert.assertEquals(componentId, "mainForm:showName");
+
+        UIOutput name = (UIOutput) facesContext.getViewRoot().findComponent("mainForm:name");
+        searchContext = SearchExpressionContext.createSearchExpressionContext(facesContext, name);
+        
+        componentId = facesContext.getApplication().getSearchExpressionHandler().resolveClientIds(
+                searchContext, "@previous").get(0);
+        Assert.assertEquals(componentId, "mainForm:labelName");
+        
+        componentId = facesContext.getApplication().getSearchExpressionHandler().resolveClientIds(
+                searchContext, "@next").get(0);
+        Assert.assertEquals(componentId, "mainForm:msgName");
+        
+        componentId = facesContext.getApplication().getSearchExpressionHandler().resolveClientIds(
+                searchContext, "@parent:@id(msgName)").get(0);
+        Assert.assertEquals(componentId, "mainForm:msgName");
+        
+        facesContext.getViewRoot().invokeOnComponent(facesContext, "mainForm:table:3:nested:1:nestedButton", 
+                new ContextCallback()
+        {
+            @Override
+            public void invokeContextCallback(FacesContext context, UIComponent target)
+            {
+                SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler();
+                SearchExpressionContext searchContext = 
+                        SearchExpressionContext.createSearchExpressionContext(context, target);
+                String componentId = handler.resolveClientIds(searchContext, "mainForm:showName").get(0);
+                Assert.assertEquals(componentId, "mainForm:showName");
+                
+                componentId = handler.resolveClientIds(searchContext, "nested:nestedText").get(0);
+                Assert.assertEquals(componentId, "mainForm:table:3:nested:1:nestedText");
+                
+                componentId = handler.resolveClientIds(searchContext, "table:baseText").get(0);
+                Assert.assertEquals(componentId, "mainForm:table:3:baseText");
+                
+                componentId = handler.resolveClientIds(searchContext, "table:0:baseText").get(0);
+                Assert.assertEquals(componentId, "mainForm:table:0:baseText");
+
+                componentId = handler.resolveClientIds(searchContext, "nested:0:nestedText").get(0);
+                Assert.assertEquals(componentId, "mainForm:table:3:nested:0:nestedText");
+                
+                componentId = handler.resolveClientIds(searchContext, "table:nested").get(0);
+                Assert.assertEquals(componentId, "mainForm:table:3:nested");
+                
+                componentId = handler.resolveClientIds(searchContext, "table:1:nested:0:nestedText").get(0);
+                Assert.assertEquals(componentId, "mainForm:table:1:nested:0:nestedText");
+                
+                //System.out.println(componentId);
+            }
+        });
+       
+        processRemainingPhases();
+    }
+    
+    @Test
+    public void testResolveClientId1() throws Exception
+    {
+        startViewRequest("/search1.xhtml");
+        processLifecycleExecute();
+        executeBeforeRender();
+        executeBuildViewCycle();
+        
+        UIOutput out = (UIOutput) facesContext.getViewRoot().findComponent("mainForm:showName");
+        Set<SearchExpressionHint> expressionHints = new HashSet<SearchExpressionHint>();
+        expressionHints.add(SearchExpressionHint.PARENT_FALLBACK);
+        SearchExpressionContext searchContextWithParentFallback = 
+                SearchExpressionContext.createSearchExpressionContext(facesContext, out, expressionHints, null);
+        SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler();
+        
+        String clientId = handler.resolveClientId(searchContextWithParentFallback, "@none");
+        Assert.assertNotNull(clientId);
+        
+        expressionHints = new HashSet<SearchExpressionHint>();
+        expressionHints.add(SearchExpressionHint.IGNORE_NO_RESULT);
+        SearchExpressionContext searchContextWithIgnoreNoResult = 
+                SearchExpressionContext.createSearchExpressionContext(facesContext, out, expressionHints, null);
+        
+        clientId = handler.resolveClientId(searchContextWithIgnoreNoResult, "@none");
+        Assert.assertNull(clientId);
+        
+        SearchExpressionContext searchContext = 
+                SearchExpressionContext.createSearchExpressionContext(facesContext, out);
+
+        try 
+        {
+            clientId = handler.resolveClientId(searchContext, "@none");
+            Assert.fail();
+        }
+        catch (ComponentNotFoundException e)
+        {
+            //No op
+        }
+    }
+    
+    @Test
+    public void testResolveClientIds1() throws Exception
+    {
+        startViewRequest("/search1.xhtml");
+        processLifecycleExecute();
+        executeBeforeRender();
+        executeBuildViewCycle();
+        
+        UIOutput out = (UIOutput) facesContext.getViewRoot().findComponent("mainForm:showName");
+        Set<SearchExpressionHint> expressionHints = new HashSet<SearchExpressionHint>();
+        expressionHints.add(SearchExpressionHint.PARENT_FALLBACK);
+        SearchExpressionContext searchContextWithParentFallback = 
+                SearchExpressionContext.createSearchExpressionContext(facesContext, out, expressionHints, null);
+        SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler();
+        
+        List<String> clientId = handler.resolveClientIds(searchContextWithParentFallback, "@none");
+        Assert.assertNotNull(clientId.get(0));
+        
+        expressionHints = new HashSet<SearchExpressionHint>();
+        expressionHints.add(SearchExpressionHint.IGNORE_NO_RESULT);
+        SearchExpressionContext searchContextWithIgnoreNoResult = 
+                SearchExpressionContext.createSearchExpressionContext(facesContext, out, expressionHints, null);
+        
+        clientId = handler.resolveClientIds(searchContextWithIgnoreNoResult, "@none");
+        Assert.assertTrue(clientId.isEmpty());
+        
+        SearchExpressionContext searchContext = 
+                SearchExpressionContext.createSearchExpressionContext(facesContext, out);
+
+        try 
+        {
+            clientId = handler.resolveClientIds(searchContext, "@none");
+            Assert.fail();
+        }
+        catch (ComponentNotFoundException e)
+        {
+            //No op
+        }
+    }
+
+    @Test
+    public void testIsValid() throws Exception
+    {
+        startViewRequest("/search1.xhtml");
+        processLifecycleExecute();
+        executeBeforeRender();
+        executeBuildViewCycle();
+
+        SearchExpressionContext searchContext = 
+                SearchExpressionContext.createSearchExpressionContext(facesContext, null);
+        SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler();
+
+        Assert.assertTrue(handler.isValidExpression(searchContext, "mainForm:showName"));
+        Assert.assertTrue(handler.isValidExpression(searchContext, "mainForm:table:3:nested:1:nestedText"));
+        Assert.assertTrue(handler.isValidExpression(searchContext, "mainForm:table:3:baseText"));
+        Assert.assertTrue(handler.isValidExpression(searchContext, "mainForm:table:0:baseText"));
+        Assert.assertTrue(handler.isValidExpression(searchContext, "mainForm:table:3:nested:0:nestedText"));
+        Assert.assertTrue(handler.isValidExpression(searchContext, "mainForm:table:3:nested"));
+        Assert.assertTrue(handler.isValidExpression(searchContext, "mainForm:table:1:nested:0:nestedText"));
+        
+        Assert.assertTrue(handler.isValidExpression(searchContext, "@this"));
+        Assert.assertTrue(handler.isValidExpression(searchContext, "@this:@parent:showName"));
+        Assert.assertTrue(handler.isValidExpression(searchContext, "@parent:showName:@parent:showName"));
+        Assert.assertTrue(handler.isValidExpression(searchContext, "@form:showName"));
+        Assert.assertTrue(handler.isValidExpression(searchContext, "@namingcontainer:showName"));
+        Assert.assertTrue(handler.isValidExpression(searchContext, "@previous"));
+        Assert.assertTrue(handler.isValidExpression(searchContext, "@next"));
+        Assert.assertTrue(handler.isValidExpression(searchContext, "@parent:@id(msgName)"));
+        
+        Assert.assertFalse(handler.isValidExpression(searchContext, "@whoNows"));
+        Assert.assertFalse(handler.isValidExpression(searchContext, "@parent:@whoNows"));
+        Assert.assertFalse(handler.isValidExpression(searchContext, "mainForm:@whoNows"));
+        Assert.assertFalse(handler.isValidExpression(searchContext, "!whoNows"));
+        
+        Assert.assertFalse(handler.isValidExpression(searchContext, "@none:@parent"));
+        Assert.assertFalse(handler.isValidExpression(searchContext, "@all:@parent"));
+    }
+    
+    @Test
+    public void testIsPassthroughExpression() throws Exception
+    {
+        startViewRequest("/search1.xhtml");
+        processLifecycleExecute();
+        executeBeforeRender();
+        executeBuildViewCycle();
+
+        SearchExpressionContext searchContext = 
+                SearchExpressionContext.createSearchExpressionContext(facesContext, null);
+        SearchExpressionHandler handler = facesContext.getApplication().getSearchExpressionHandler();
+
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "mainForm:showName"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "mainForm:table:3:nested:1:nestedText"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "mainForm:table:3:baseText"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "mainForm:table:0:baseText"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "mainForm:table:3:nested:0:nestedText"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "mainForm:table:3:nested"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "mainForm:table:1:nested:0:nestedText"));
+        
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "@this"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "@this:@parent:showName"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "@parent:showName:@parent:showName"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "@form"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "@form:showName"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "@namingcontainer:showName"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "@previous"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "@next"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "@parent:@id(msgName)"));
+        
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "@whoNows"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "@parent:@whoNows"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "mainForm:@whoNows"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContext, "!whoNows"));
+        
+        Set<SearchExpressionHint> expressionHints = new HashSet<SearchExpressionHint>();
+        expressionHints.add(SearchExpressionHint.RESOLVE_AJAX);
+        SearchExpressionContext searchContextWithAjaxResolve = 
+                SearchExpressionContext.createSearchExpressionContext(facesContext, null, expressionHints, null);
+        
+        Assert.assertTrue(handler.isPassthroughExpression(searchContextWithAjaxResolve, "@form"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContextWithAjaxResolve, "@form:showName"));
+        Assert.assertFalse(handler.isPassthroughExpression(searchContextWithAjaxResolve, "@form:@child(0)"));
+    }
+
+    @Test
+    public void testCompositeComponentExpression() throws Exception
+    {
+        startViewRequest("/testCompositeActionSource.xhtml");
+        processLifecycleExecute();
+        executeBeforeRender();
+        executeBuildViewCycle();
+        
+        
+    }
+    
+}

Modified: myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/HtmlLabelRendererTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/HtmlLabelRendererTest.java?rev=1770904&r1=1770903&r2=1770904&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/HtmlLabelRendererTest.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/HtmlLabelRendererTest.java Wed Nov 23 01:36:27 2016
@@ -20,34 +20,51 @@ package org.apache.myfaces.renderkit.htm
 
 import java.io.IOException;
 import java.io.StringWriter;
+import javax.faces.FactoryFinder;
+import javax.faces.application.Application;
 
 import javax.faces.component.behavior.AjaxBehavior;
 import javax.faces.component.html.HtmlOutputLabel;
 
-import junit.framework.Test;
-import junit.framework.TestSuite;
+import org.apache.myfaces.application.ApplicationImpl;
+import org.apache.myfaces.application.ApplicationImplJsfTest;
 
-import org.apache.myfaces.test.base.AbstractJsfTestCase;
+import org.apache.myfaces.test.base.junit4.AbstractJsfConfigurableMockTestCase;
 import org.apache.myfaces.test.mock.MockRenderKitFactory;
 import org.apache.myfaces.test.mock.MockResponseWriter;
 import org.apache.myfaces.test.utils.HtmlCheckAttributesUtil;
 import org.apache.myfaces.test.utils.HtmlRenderedAttr;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import org.junit.Test;
 
-public class HtmlLabelRendererTest extends AbstractJsfTestCase
+public class HtmlLabelRendererTest extends AbstractJsfConfigurableMockTestCase
 {
     private MockResponseWriter writer;
     private HtmlOutputLabel label;
     
-    public HtmlLabelRendererTest(String name)
+    public HtmlLabelRendererTest()
     {
-        super(name);
     }
     
-    public static Test suite() {
-        return new TestSuite(HtmlLabelRendererTest.class);
+    @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");
     }
     
     public void setUp() throws Exception {
+        
         super.setUp();
         label = new HtmlOutputLabel();
         writer = new MockResponseWriter(new StringWriter(), null, null);
@@ -59,6 +76,11 @@ public class HtmlLabelRendererTest exten
                 label.getRendererType(),
                 new HtmlLabelRenderer());
         facesContext.getAttributes().put("org.apache.myfaces.RENDERED_JSF_JS", Boolean.TRUE);
+        
+        
+        //Application _testApplication = new ApplicationImplJsfTest.TestApplicationWrapper(new ApplicationImpl());
+        //facesContext.setApplication(_testApplication);
+        //facesContext.getApplication().setSearchExpressionHandler(new SearchExpressionHandlerImpl());
     }
     
     public void tearDown() throws Exception {
@@ -67,6 +89,7 @@ public class HtmlLabelRendererTest exten
         label = null;
     }
 
+    @Test
     public void testHtmlPropertyPassTru() throws Exception
     {
         HtmlRenderedAttr[] attrs = {
@@ -115,6 +138,7 @@ public class HtmlLabelRendererTest exten
         return ((StringWriter) writer.getWriter()).toString();
     }
     
+    @Test
     public void testEscapeUntouched() throws IOException
     {
         label.setId("labelId");
@@ -127,6 +151,7 @@ public class HtmlLabelRendererTest exten
         assertEquals("<label id=\"labelId\">&lt;span class=&quot;required&quot;&gt;field label&lt;/span&gt;</label>", page);
     }
 
+    @Test
     public void testEscapeSetToFalse() throws IOException
     {
         label.setId("labelId");
@@ -143,6 +168,7 @@ public class HtmlLabelRendererTest exten
     /**
      * Components that render client behaviors should always render "id" and "name" attribute
      */
+    @Test
     public void testClientBehaviorHolderRendersIdAndName() 
     {
         label.addClientBehavior("keypress", new AjaxBehavior());

Modified: myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/HtmlMessageRendererTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/HtmlMessageRendererTest.java?rev=1770904&r1=1770903&r2=1770904&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/HtmlMessageRendererTest.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/HtmlMessageRendererTest.java Wed Nov 23 01:36:27 2016
@@ -19,22 +19,22 @@
 package org.apache.myfaces.renderkit.html;
 
 import java.io.StringWriter;
+import javax.faces.FactoryFinder;
 
 import javax.faces.application.FacesMessage;
 import javax.faces.component.html.HtmlForm;
 import javax.faces.component.html.HtmlInputText;
 import javax.faces.component.html.HtmlMessage;
 
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
 import org.apache.myfaces.test.utils.HtmlCheckAttributesUtil;
 import org.apache.myfaces.test.utils.HtmlRenderedAttr;
-import org.apache.myfaces.test.base.AbstractJsfTestCase;
+import org.apache.myfaces.test.base.junit4.AbstractJsfConfigurableMockTestCase;
 import org.apache.myfaces.test.mock.MockRenderKitFactory;
 import org.apache.myfaces.test.mock.MockResponseWriter;
+import static org.junit.Assert.fail;
+import org.junit.Test;
 
-public class HtmlMessageRendererTest extends AbstractJsfTestCase
+public class HtmlMessageRendererTest extends  AbstractJsfConfigurableMockTestCase
 {
     private static final String ERROR_CLASS = "errorClass";
     private static final String WARN_CLASS = "warnClass";
@@ -45,13 +45,24 @@ public class HtmlMessageRendererTest ext
     private HtmlForm form;
     private HtmlInputText inputText;
 
-    public HtmlMessageRendererTest(String name)
+    public HtmlMessageRendererTest()
     {
-        super(name);
+        
     }
     
-    public static Test suite() {
-        return new TestSuite(HtmlMessageRendererTest.class);
+    @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");
     }
 
     public void setUp() throws Exception
@@ -94,7 +105,8 @@ public class HtmlMessageRendererTest ext
     {
         super.tearDown();
     }    
-    
+
+    @Test
     public void testHtmlPropertyPassTru() throws Exception
     {
         HtmlRenderedAttr[] attrs = {
@@ -136,6 +148,7 @@ public class HtmlMessageRendererTest ext
         }
     }
     
+    @Test
     public void testRenderSpanOnlyWhenNecessary() throws Exception
     {
         facesContext.addMessage(inputText.getClientId(), new FacesMessage(FacesMessage.SEVERITY_WARN, "warnSumary", "detailWarnSummary"));
@@ -146,6 +159,7 @@ public class HtmlMessageRendererTest ext
         System.out.println(output);
     }
     
+    @Test
     public void testHtmlPropertyPassTruNotRendered() throws Exception
     {
         HtmlRenderedAttr[] attrs = HtmlCheckAttributesUtil.generateAttrsNotRenderedForReadOnly();

Modified: myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/HtmlMessagesRendererTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/HtmlMessagesRendererTest.java?rev=1770904&r1=1770903&r2=1770904&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/HtmlMessagesRendererTest.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/renderkit/html/HtmlMessagesRendererTest.java Wed Nov 23 01:36:27 2016
@@ -19,24 +19,25 @@
 package org.apache.myfaces.renderkit.html;
 
 import java.io.StringWriter;
+import javax.faces.FactoryFinder;
 
 import javax.faces.application.FacesMessage;
 import javax.faces.component.html.HtmlMessages;
 
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
 import org.apache.myfaces.test.utils.HtmlCheckAttributesUtil;
 import org.apache.myfaces.test.utils.HtmlRenderedAttr;
-import org.apache.myfaces.test.base.AbstractJsfTestCase;
+import org.apache.myfaces.test.base.junit4.AbstractJsfConfigurableMockTestCase;
 import org.apache.myfaces.test.mock.MockRenderKitFactory;
 import org.apache.myfaces.test.mock.MockResponseWriter;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import org.junit.Test;
 
 /**
  * @author Bruno Aranda (latest modification by $Author$)
  * @version $Revision$ $Date$
  */
-public class HtmlMessagesRendererTest extends AbstractJsfTestCase
+public class HtmlMessagesRendererTest extends AbstractJsfConfigurableMockTestCase
 {
     private static final String ERROR_CLASS = "errorClass";
     private static final String WARN_CLASS = "warnClass";
@@ -45,13 +46,23 @@ public class HtmlMessagesRendererTest ex
     private HtmlMessages messages;
     private MockResponseWriter writer;
 
-    public HtmlMessagesRendererTest(String name)
+    public HtmlMessagesRendererTest()
     {
-        super(name);
     }
     
-    public static Test suite() {
-        return new TestSuite(HtmlMessagesRendererTest.class);
+    @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");
     }
 
     public void setUp() throws Exception
@@ -77,7 +88,8 @@ public class HtmlMessagesRendererTest ex
         messages = null;
         writer = null;
     }
-    
+
+    @Test
     public void testHtmlPropertyPassTru() throws Exception
     {
         HtmlRenderedAttr[] attrs = {
@@ -119,6 +131,7 @@ public class HtmlMessagesRendererTest ex
         }
     }
     
+    @Test
     public void testRenderSpanOnlyWhenNecessary1() throws Exception
     {
         facesContext.addMessage("test1", new FacesMessage(FacesMessage.SEVERITY_WARN, "warnSumary", "detailWarnSummary"));
@@ -129,6 +142,7 @@ public class HtmlMessagesRendererTest ex
         assertTrue(!output.contains("span"));
     }
     
+    @Test
     public void testRenderSpanOnlyWhenNecessary2() throws Exception
     {
         facesContext.addMessage("test1", new FacesMessage(FacesMessage.SEVERITY_WARN, "warnSumary", "detailWarnSummary"));
@@ -140,6 +154,7 @@ public class HtmlMessagesRendererTest ex
         assertTrue(!output.contains("span"));
     }
     
+    @Test
     public void testRenderSpanOnlyWhenNecessary3() throws Exception
     {
         facesContext.addMessage("test1", new FacesMessage(FacesMessage.SEVERITY_WARN, "warnSumary", "detailWarnSummary"));
@@ -155,6 +170,7 @@ public class HtmlMessagesRendererTest ex
      * It should output the class on li
      * @throws Exception
      */
+    @Test
     public void testRenderSpanOnlyWhenNecessary4() throws Exception
     {
         facesContext.addMessage("test1", new FacesMessage(FacesMessage.SEVERITY_FATAL, "fatalSumary", "detailFatalSummary"));
@@ -172,6 +188,7 @@ public class HtmlMessagesRendererTest ex
      * It should output the class on td
      * @throws Exception
      */
+    @Test
     public void testRenderSpanOnlyWhenNecessary5() throws Exception
     {
         facesContext.addMessage("test1", new FacesMessage(FacesMessage.SEVERITY_FATAL, "fatalSumary", "detailFatalSummary"));
@@ -186,6 +203,7 @@ public class HtmlMessagesRendererTest ex
         assertTrue(!output.contains("span"));
     }
     
+    @Test
     public void testHtmlPropertyPassTruNotRendered() throws Exception
     {
         HtmlRenderedAttr[] attrs = HtmlCheckAttributesUtil.generateAttrsNotRenderedForReadOnly();

Modified: myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/view/facelets/FaceletTestCase.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/view/facelets/FaceletTestCase.java?rev=1770904&r1=1770903&r2=1770904&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/view/facelets/FaceletTestCase.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/test/java/org/apache/myfaces/view/facelets/FaceletTestCase.java Wed Nov 23 01:36:27 2016
@@ -40,6 +40,7 @@ import javax.faces.render.RenderKitFacto
 
 import org.apache.myfaces.application.ApplicationFactoryImpl;
 import org.apache.myfaces.application.ViewHandlerImpl;
+import org.apache.myfaces.component.search.SearchExpressionContextFactoryImpl;
 import org.apache.myfaces.config.FacesConfigDispenser;
 import org.apache.myfaces.config.FacesConfigUnmarshaller;
 import org.apache.myfaces.config.RuntimeConfig;
@@ -156,6 +157,8 @@ public abstract class FaceletTestCase ex
                 MockVisitContextFactory.class.getName());
         FactoryFinder.setFactory(FactoryFinder.FACELET_CACHE_FACTORY,
                 FaceletCacheFactoryImpl.class.getName());
+        FactoryFinder.setFactory(FactoryFinder.SEARCH_EXPRESSION_CONTEXT_FACTORY,
+                SearchExpressionContextFactoryImpl.class.getName());
     }
     
     @Override

Copied: myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/component/search/resources/testComposite/compositeActionSource.xhtml (from r1757774, myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/composite/resources/testComposite/compositeActionSource.xhtml)
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/component/search/resources/testComposite/compositeActionSource.xhtml?p2=myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/component/search/resources/testComposite/compositeActionSource.xhtml&p1=myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/composite/resources/testComposite/compositeActionSource.xhtml&r1=1757774&r2=1770904&rev=1770904&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/view/facelets/tag/composite/resources/testComposite/compositeActionSource.xhtml (original)
+++ myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/component/search/resources/testComposite/compositeActionSource.xhtml Wed Nov 23 01:36:27 2016
@@ -23,12 +23,14 @@
 </head>
 <body>
 <composite:interface>
-    <composite:actionSource name="button2" targets="button3"/>
+    <composite:actionSource name="button2" targets="@child(0):button3"/>
 </composite:interface>
 <composite:implementation>
-<testComposite:simpleActionSource id="button3" >
-    <f:actionListener for="button" binding="#{helloWorldBean.actionListener}"/>
-</testComposite:simpleActionSource>
+<h:panelGroup id="panel">
+    <testComposite:simpleActionSource id="button3" >
+        <f:actionListener for="button" binding="#{helloWorldBean.actionListener}"/>
+    </testComposite:simpleActionSource>
+</h:panelGroup>
 </composite:implementation>
 </body>
 </html>
\ No newline at end of file

Copied: myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/component/search/search1.xhtml (from r1757774, myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/application/flow/flow1_1.xhtml)
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/component/search/search1.xhtml?p2=myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/component/search/search1.xhtml&p1=myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/application/flow/flow1_1.xhtml&r1=1757774&r2=1770904&rev=1770904&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/application/flow/flow1_1.xhtml (original)
+++ myfaces/core/branches/2.3.x/impl/src/test/resources/org/apache/myfaces/component/search/search1.xhtml Wed Nov 23 01:36:27 2016
@@ -27,7 +27,27 @@
 <h:body>
     <h:panelGrid columns="1">
         <h:form id="mainForm">
-            <h:commandButton id="startFlow1" action="flow1" value="Start Flow 1"/>
+            
+            <h:outputLabel id="labelName" for="name" value="Name: "/>
+            <h:inputText id="name" value="NAME"/>
+            <h:message id="msgName" for="name"/>
+            
+            <h:outputText id="showName" value="showName"/>
+            
+            <h:dataTable id="table" value="#{searchBean.model}" var="row">
+                <h:column>
+                    <h:outputText id="baseText" value="#{row.text}"/>
+                    <h:outputText id="nestedText"/>
+                    <h:dataTable id="nested" value="#{row.nested}" var="item">
+                        <h:column>
+                            <h:outputText id="nestedText" value="#{item}"/>
+                            <h:outputText id="baseText"/>
+                            <h:commandButton id="nestedButton" value="Press Me!"/>
+                        </h:column>
+                    </h:dataTable>
+                </h:column>
+            </h:dataTable>
+            
         </h:form>
     </h:panelGrid>
 </h:body>

Modified: myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessageRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessageRendererBase.java?rev=1770904&r1=1770903&r2=1770904&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessageRendererBase.java (original)
+++ myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessageRendererBase.java Wed Nov 23 01:36:27 2016
@@ -19,9 +19,11 @@
 package org.apache.myfaces.shared.renderkit.html;
 
 import java.io.IOException;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.logging.Logger;
 
 import javax.faces.application.FacesMessage;
@@ -31,6 +33,9 @@ import javax.faces.component.UIViewRoot;
 import javax.faces.component.behavior.ClientBehavior;
 import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.component.html.HtmlMessage;
+import javax.faces.component.search.SearchExpressionContext;
+import javax.faces.component.search.SearchExpressionHandler;
+import javax.faces.component.search.SearchExpressionHint;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 
@@ -82,8 +87,26 @@ public abstract class HtmlMessageRendere
             return;
         }
 
-        UIComponent forComponent = message.findComponent(forAttr);
-        if (forComponent == null)
+        //UIComponent forComponent = message.findComponent(forAttr);
+        //UIComponent forComponent = message.findComponent(forAttr);
+        //if (forComponent == null)
+        //{
+        //    log.severe("Could not render Message. Unable to find component '" 
+        //            + forAttr + "' (calling findComponent on component '" 
+        //            + message.getClientId(facesContext) 
+        //            + "'). If the provided id was correct, wrap the message and its " 
+        //            + "component into an h:panelGroup or h:panelGrid.");
+        //    return;
+        //}
+
+        //String clientId = forComponent.getClientId(facesContext);
+        SearchExpressionHandler searchExpressionHandler = facesContext.getApplication().getSearchExpressionHandler();
+        Set<SearchExpressionHint> expressionHints = new HashSet<SearchExpressionHint>();
+        expressionHints.add(SearchExpressionHint.IGNORE_NO_RESULT);
+        String clientId = searchExpressionHandler.resolveClientId(
+                SearchExpressionContext.createSearchExpressionContext(
+                        facesContext, message, expressionHints, null), forAttr);
+        if (clientId == null)
         {
             log.severe("Could not render Message. Unable to find component '" 
                     + forAttr + "' (calling findComponent on component '" 
@@ -93,8 +116,6 @@ public abstract class HtmlMessageRendere
             return;
         }
 
-        String clientId = forComponent.getClientId(facesContext);
-
         Iterator<FacesMessage> messageIterator = facesContext.getMessages(clientId);
         if (!messageIterator.hasNext())
         {

Modified: myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessagesRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessagesRendererBase.java?rev=1770904&r1=1770903&r2=1770904&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessagesRendererBase.java (original)
+++ myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessagesRendererBase.java Wed Nov 23 01:36:27 2016
@@ -19,10 +19,12 @@
 package org.apache.myfaces.shared.renderkit.html;
 
 import java.io.IOException;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
+import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -33,6 +35,9 @@ import javax.faces.component.UIViewRoot;
 import javax.faces.component.behavior.ClientBehavior;
 import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.component.html.HtmlMessages;
+import javax.faces.component.search.SearchExpressionContext;
+import javax.faces.component.search.SearchExpressionHandler;
+import javax.faces.component.search.SearchExpressionHint;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 
@@ -70,9 +75,11 @@ public abstract class HtmlMessagesRender
     {
         // check the for attribute
         String forAttr = getFor(messages);
-        UIComponent forComponent = null;
+        //UIComponent forComponent = null;
+        String clientId = null;
         if(forAttr != null && !"".equals(forAttr))
         {
+            /*
             forComponent = messages.findComponent(forAttr);
             if (forComponent == null)
             {
@@ -82,11 +89,27 @@ public abstract class HtmlMessagesRender
                         + "'). If the provided id was correct, wrap the message and its "
                         + "component into an h:panelGroup or h:panelGrid.");
                 return;
+            }*/
+            SearchExpressionHandler searchExpressionHandler = 
+                    facesContext.getApplication().getSearchExpressionHandler();
+            Set<SearchExpressionHint> expressionHints = new HashSet<SearchExpressionHint>();
+            expressionHints.add(SearchExpressionHint.IGNORE_NO_RESULT);
+            clientId = searchExpressionHandler.resolveClientId(
+                    SearchExpressionContext.createSearchExpressionContext(
+                            facesContext, messages, expressionHints, null), forAttr);
+            if (clientId == null)
+            {
+                log.severe("Could not render Message. Unable to find component '" 
+                        + forAttr + "' (calling findComponent on component '" 
+                        + clientId
+                        + "'). If the provided id was correct, wrap the message and its " 
+                        + "component into an h:panelGroup or h:panelGrid.");
+                return;
             }
         }
         
         MessagesIterator messagesIterator = new MessagesIterator(facesContext,
-                isGlobalOnly(messages), isRedisplay(messages), forComponent);
+                isGlobalOnly(messages), isRedisplay(messages), clientId);
 
         if (messagesIterator.hasNext())
         {
@@ -472,13 +495,13 @@ public abstract class HtmlMessagesRender
         private Object _next;
 
         public MessagesIterator(FacesContext facesContext, boolean globalOnly, boolean redisplay,
-                UIComponent forComponent)
+                String clientId)
         {
             _facesContext = facesContext;
             // The for attribute is mutually exclusive with globalOnly and take precedence if used.
-            if(forComponent != null)
+            if(clientId != null)
             {
-                _clientId = forComponent.getClientId(facesContext);
+                _clientId = clientId;
                 _componentMessagesIterator = facesContext.getMessages(_clientId);
                 _globalMessagesIterator = org.apache.myfaces.shared.util.NullIterator.instance();
                 _clientIdsWithMessagesIterator = org.apache.myfaces.shared.util.NullIterator.instance();