diff --git a/spring-faces/src/main/java/META-INF/faces-config.xml b/spring-faces/src/main/java/META-INF/faces-config.xml index 3ededa42..99d5dfb7 100644 --- a/spring-faces/src/main/java/META-INF/faces-config.xml +++ b/spring-faces/src/main/java/META-INF/faces-config.xml @@ -8,8 +8,8 @@ org.springframework.faces.webflow.FlowActionListener org.springframework.faces.model.SelectionTrackingActionListener - org.springframework.faces.expression.CompositeFlowVariableResolver - org.springframework.faces.expression.CompositeFlowPropertyResolver + org.springframework.faces.webflow.FlowVariableResolver + org.springframework.faces.webflow.FlowPropertyResolver org.springframework.faces.webflow.FlowViewStateManager org.springframework.faces.webflow.FlowViewHandler diff --git a/spring-faces/src/main/java/org/springframework/faces/config/FacesFlowBuilderServicesBeanDefinitionParser.java b/spring-faces/src/main/java/org/springframework/faces/config/FacesFlowBuilderServicesBeanDefinitionParser.java index 5644baa5..703f920a 100644 --- a/spring-faces/src/main/java/org/springframework/faces/config/FacesFlowBuilderServicesBeanDefinitionParser.java +++ b/spring-faces/src/main/java/org/springframework/faces/config/FacesFlowBuilderServicesBeanDefinitionParser.java @@ -19,9 +19,9 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.binding.expression.el.DefaultExpressionFactoryUtils; -import org.springframework.faces.expression.LegacyJSFELExpressionParser; import org.springframework.faces.model.converter.FacesConversionService; import org.springframework.faces.webflow.JsfViewFactoryCreator; +import org.springframework.faces.webflow.JsfManagedBeanAwareELExpressionParser; import org.springframework.util.StringUtils; import org.springframework.webflow.engine.builder.support.FlowBuilderServices; import org.springframework.webflow.expression.el.WebFlowELExpressionParser; @@ -54,7 +54,7 @@ public class FacesFlowBuilderServicesBeanDefinitionParser extends AbstractSingle protected void doParse(Element element, BeanDefinitionBuilder definitionBuilder) { boolean enableManagedBeans = parseEnableManagedBeans(element, definitionBuilder); if (enableManagedBeans) { - definitionBuilder.addPropertyValue(EXPRESSION_PARSER_PROPERTY, new LegacyJSFELExpressionParser( + definitionBuilder.addPropertyValue(EXPRESSION_PARSER_PROPERTY, new JsfManagedBeanAwareELExpressionParser( DefaultExpressionFactoryUtils.createExpressionFactory())); } else { parseExpressionParser(element, definitionBuilder); diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/BaseDojoParentComponentRenderer.java b/spring-faces/src/main/java/org/springframework/faces/ui/BaseDojoParentComponentRenderer.java index 8dc1da1b..7042eeff 100644 --- a/spring-faces/src/main/java/org/springframework/faces/ui/BaseDojoParentComponentRenderer.java +++ b/spring-faces/src/main/java/org/springframework/faces/ui/BaseDojoParentComponentRenderer.java @@ -7,7 +7,7 @@ import java.util.Map; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; -import org.springframework.faces.ui.resource.FlowResourceHelper; +import org.springframework.faces.ui.resource.ResourceHelper; public abstract class BaseDojoParentComponentRenderer extends BaseSpringFacesParentComponentRenderer { @@ -19,7 +19,7 @@ public abstract class BaseDojoParentComponentRenderer extends BaseSpringFacesPar private String springDojoJsResourceUri = "/spring/Spring-Dojo.js"; - private FlowResourceHelper resourceHelper = new FlowResourceHelper(); + private ResourceHelper resourceHelper = new ResourceHelper(); public void encodeBegin(FacesContext context, UIComponent component) throws IOException { super.encodeBegin(context, component); diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/BaseSpringFacesParentComponentRenderer.java b/spring-faces/src/main/java/org/springframework/faces/ui/BaseSpringFacesParentComponentRenderer.java index 01b276d5..6da05144 100644 --- a/spring-faces/src/main/java/org/springframework/faces/ui/BaseSpringFacesParentComponentRenderer.java +++ b/spring-faces/src/main/java/org/springframework/faces/ui/BaseSpringFacesParentComponentRenderer.java @@ -5,13 +5,13 @@ import java.io.IOException; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; -import org.springframework.faces.ui.resource.FlowResourceHelper; +import org.springframework.faces.ui.resource.ResourceHelper; public abstract class BaseSpringFacesParentComponentRenderer extends BaseParentComponentRenderer { private String springJsResourceUri = "/spring/Spring.js"; - private FlowResourceHelper resourceHelper = new FlowResourceHelper(); + private ResourceHelper resourceHelper = new ResourceHelper(); public void encodeBegin(FacesContext context, UIComponent component) throws IOException { diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/DojoAdvisorRenderer.java b/spring-faces/src/main/java/org/springframework/faces/ui/DojoAdvisorRenderer.java index 607d7e9f..b7147d5e 100644 --- a/spring-faces/src/main/java/org/springframework/faces/ui/DojoAdvisorRenderer.java +++ b/spring-faces/src/main/java/org/springframework/faces/ui/DojoAdvisorRenderer.java @@ -24,14 +24,14 @@ import javax.faces.component.ValueHolder; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; -import org.springframework.faces.ui.resource.FlowResourceHelper; +import org.springframework.faces.ui.resource.ResourceHelper; import org.springframework.util.StringUtils; public class DojoAdvisorRenderer extends DojoRenderer { private static final String SCRIPT_ELEMENT = "script"; - private FlowResourceHelper resourceHelper = new FlowResourceHelper(); + private ResourceHelper resourceHelper = new ResourceHelper(); public void encodeEnd(FacesContext context, UIComponent component) throws IOException { diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/DojoRenderer.java b/spring-faces/src/main/java/org/springframework/faces/ui/DojoRenderer.java index 7ed704b4..3bce8595 100644 --- a/spring-faces/src/main/java/org/springframework/faces/ui/DojoRenderer.java +++ b/spring-faces/src/main/java/org/springframework/faces/ui/DojoRenderer.java @@ -22,7 +22,7 @@ import java.util.Map; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; -import org.springframework.faces.ui.resource.FlowResourceHelper; +import org.springframework.faces.ui.resource.ResourceHelper; public class DojoRenderer extends SpringFacesRenderer { @@ -34,7 +34,7 @@ public class DojoRenderer extends SpringFacesRenderer { private String springDojoJsResourceUri = "/spring/Spring-Dojo.js"; - private FlowResourceHelper resourceHelper = new FlowResourceHelper(); + private ResourceHelper resourceHelper = new ResourceHelper(); public void encodeBegin(FacesContext context, UIComponent component) throws IOException { diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ExtJsRenderer.java b/spring-faces/src/main/java/org/springframework/faces/ui/ExtJsRenderer.java index 08f8fe8d..3f0c0580 100644 --- a/spring-faces/src/main/java/org/springframework/faces/ui/ExtJsRenderer.java +++ b/spring-faces/src/main/java/org/springframework/faces/ui/ExtJsRenderer.java @@ -20,7 +20,7 @@ import java.io.IOException; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; -import org.springframework.faces.ui.resource.FlowResourceHelper; +import org.springframework.faces.ui.resource.ResourceHelper; public class ExtJsRenderer extends SpringFacesRenderer { @@ -30,7 +30,7 @@ public class ExtJsRenderer extends SpringFacesRenderer { private static final String SPRING_EXT_SCRIPT = "/spring/Spring-Ext.js"; - private FlowResourceHelper resourceHelper = new FlowResourceHelper(); + private ResourceHelper resourceHelper = new ResourceHelper(); public void encodeBegin(FacesContext context, UIComponent component) throws IOException { diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/SpringFacesRenderer.java b/spring-faces/src/main/java/org/springframework/faces/ui/SpringFacesRenderer.java index 80975979..ddd52db5 100644 --- a/spring-faces/src/main/java/org/springframework/faces/ui/SpringFacesRenderer.java +++ b/spring-faces/src/main/java/org/springframework/faces/ui/SpringFacesRenderer.java @@ -21,13 +21,13 @@ import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.render.Renderer; -import org.springframework.faces.ui.resource.FlowResourceHelper; +import org.springframework.faces.ui.resource.ResourceHelper; public class SpringFacesRenderer extends Renderer { private String springJsResourceUri = "/spring/Spring.js"; - private FlowResourceHelper resourceHelper = new FlowResourceHelper(); + private ResourceHelper resourceHelper = new ResourceHelper(); public void encodeBegin(FacesContext context, UIComponent component) throws IOException { diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/resource/FlowResourceHelper.java b/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResourceHelper.java similarity index 89% rename from spring-faces/src/main/java/org/springframework/faces/ui/resource/FlowResourceHelper.java rename to spring-faces/src/main/java/org/springframework/faces/ui/resource/ResourceHelper.java index af296593..56d297ed 100644 --- a/spring-faces/src/main/java/org/springframework/faces/ui/resource/FlowResourceHelper.java +++ b/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResourceHelper.java @@ -25,9 +25,6 @@ import java.util.Set; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; -import org.springframework.webflow.execution.RequestContext; -import org.springframework.webflow.execution.RequestContextHolder; - /** * Helper used by Spring Faces component renderers to add links to javascript and css resources. The resource links will * be rendered in the correct format for the requests to be handled by Web Flow and routed to a special "resources" flow @@ -36,7 +33,7 @@ import org.springframework.webflow.execution.RequestContextHolder; * @author Jeremy Grelle * */ -public class FlowResourceHelper { +public class ResourceHelper { private static final String RENDERED_RESOURCES_KEY = "org.springframework.faces.RenderedResources"; @@ -58,31 +55,20 @@ public class FlowResourceHelper { * @throws IOException */ public void renderScriptLink(FacesContext facesContext, String scriptPath, Map attributes) throws IOException { - if (alreadyRendered(facesContext, scriptPath)) { return; } - - RequestContext requestContext = RequestContextHolder.getRequestContext(); - ResponseWriter writer = facesContext.getResponseWriter(); - writer.startElement("script", null); - writer.writeAttribute("type", "text/javascript", null); - Iterator i = attributes.keySet().iterator(); while (i.hasNext()) { String key = (String) i.next(); writer.writeAttribute(key, attributes.get(key), null); } - - String src = requestContext.getExternalContext().getContextPath() + "/resources" + scriptPath; - + String src = facesContext.getExternalContext().getRequestContextPath() + "/resources" + scriptPath; writer.writeAttribute("src", src, null); - writer.endElement("script"); - markRendered(facesContext, scriptPath); } @@ -93,26 +79,16 @@ public class FlowResourceHelper { * @throws IOException */ public void renderStyleLink(FacesContext facesContext, String cssPath) throws IOException { - if (alreadyRendered(facesContext, cssPath)) { return; } - - RequestContext requestContext = RequestContextHolder.getRequestContext(); - ResponseWriter writer = facesContext.getResponseWriter(); - writer.startElement("link", null); - writer.writeAttribute("type", "text/css", null); writer.writeAttribute("rel", "stylesheet", null); - - String src = requestContext.getExternalContext().getContextPath() + "/resources" + cssPath; - + String src = facesContext.getExternalContext().getRequestContextPath() + "/resources" + cssPath; writer.writeAttribute("href", src, null); - writer.endElement("link"); - markRendered(facesContext, cssPath); } @@ -123,21 +99,14 @@ public class FlowResourceHelper { * @throws IOException */ public void renderDojoInclude(FacesContext facesContext, String module) throws IOException { - if (alreadyRendered(facesContext, module)) { return; } - ResponseWriter writer = facesContext.getResponseWriter(); - writer.startElement("script", null); - writer.writeAttribute("type", "text/javascript", null); - writer.writeText("dojo.require('" + module + "');", null); - writer.endElement("script"); - markRendered(facesContext, module); } diff --git a/spring-faces/src/main/java/org/springframework/faces/expression/CompositeFlowPropertyResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowPropertyResolver.java similarity index 65% rename from spring-faces/src/main/java/org/springframework/faces/expression/CompositeFlowPropertyResolver.java rename to spring-faces/src/main/java/org/springframework/faces/webflow/FlowPropertyResolver.java index 183ea1c3..0847d133 100644 --- a/spring-faces/src/main/java/org/springframework/faces/expression/CompositeFlowPropertyResolver.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowPropertyResolver.java @@ -13,22 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.faces.expression; +package org.springframework.faces.webflow; import javax.el.CompositeELResolver; import javax.faces.el.PropertyResolver; import org.springframework.binding.expression.el.MapAdaptableELResolver; -import org.springframework.webflow.expression.el.RequestContextELResolver; -import org.springframework.webflow.expression.el.ScopeSearchingELResolver; +import org.springframework.faces.expression.ELDelegatingPropertyResolver; /** - * Assembles {@link RequestContextELResolver} and {@link ScopeSearchingELResolver} into a composite that may be used - * with JSF 1.1 and higher for property resolution. + * For resolving MapAdaptable properties with JSF 1.1 or >. * * @author Jeremy Grelle */ -public class CompositeFlowPropertyResolver extends ELDelegatingPropertyResolver { +public class FlowPropertyResolver extends ELDelegatingPropertyResolver { private static final CompositeELResolver composite = new CompositeELResolver(); @@ -36,7 +34,7 @@ public class CompositeFlowPropertyResolver extends ELDelegatingPropertyResolver composite.add(new MapAdaptableELResolver()); } - public CompositeFlowPropertyResolver(PropertyResolver nextResolver) { + public FlowPropertyResolver(PropertyResolver nextResolver) { super(nextResolver, composite); } } diff --git a/spring-faces/src/main/java/org/springframework/faces/expression/CompositeFlowVariableResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowVariableResolver.java similarity index 81% rename from spring-faces/src/main/java/org/springframework/faces/expression/CompositeFlowVariableResolver.java rename to spring-faces/src/main/java/org/springframework/faces/webflow/FlowVariableResolver.java index 563d9c23..59cb406e 100644 --- a/spring-faces/src/main/java/org/springframework/faces/expression/CompositeFlowVariableResolver.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowVariableResolver.java @@ -13,11 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.faces.expression; +package org.springframework.faces.webflow; import javax.el.CompositeELResolver; import javax.faces.el.VariableResolver; +import org.springframework.faces.expression.ELDelegatingVariableResolver; import org.springframework.util.ClassUtils; import org.springframework.webflow.expression.el.ImplicitFlowVariableELResolver; import org.springframework.webflow.expression.el.RequestContextELResolver; @@ -26,26 +27,25 @@ import org.springframework.webflow.expression.el.SpringBeanWebFlowELResolver; import org.springframework.webflow.expression.el.SpringSecurityELResolver; /** - * Assembles {@link RequestContextELResolver} and {@link ScopeSearchingELResolver} into a composite that may be used - * with JSF 1.1 and higher for variable resolution. + * For resolving flow request context variables with JSF 1.1 or >. * * @author Jeremy Grelle */ -public class CompositeFlowVariableResolver extends ELDelegatingVariableResolver { +public class FlowVariableResolver extends ELDelegatingVariableResolver { private static final CompositeELResolver composite = new CompositeELResolver(); static { composite.add(new RequestContextELResolver()); + composite.add(new ImplicitFlowVariableELResolver()); + composite.add(new ScopeSearchingELResolver()); if (ClassUtils.isPresent("org.springframework.security.context.SecurityContextHolder")) { composite.add(new SpringSecurityELResolver()); } composite.add(new SpringBeanWebFlowELResolver()); - composite.add(new ImplicitFlowVariableELResolver()); - composite.add(new ScopeSearchingELResolver()); } - public CompositeFlowVariableResolver(VariableResolver nextResolver) { + public FlowVariableResolver(VariableResolver nextResolver) { super(nextResolver, composite); } } diff --git a/spring-faces/src/main/java/org/springframework/faces/expression/LegacyJSFELExpressionParser.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanAwareELExpressionParser.java similarity index 93% rename from spring-faces/src/main/java/org/springframework/faces/expression/LegacyJSFELExpressionParser.java rename to spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanAwareELExpressionParser.java index da1f98e0..f019fe91 100644 --- a/spring-faces/src/main/java/org/springframework/faces/expression/LegacyJSFELExpressionParser.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanAwareELExpressionParser.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.faces.expression; +package org.springframework.faces.webflow; import java.util.ArrayList; import java.util.List; @@ -43,9 +43,9 @@ import org.springframework.webflow.expression.el.SpringSecurityELResolver; * * @author Jeremy Grelle */ -public class LegacyJSFELExpressionParser extends ELExpressionParser { +public class JsfManagedBeanAwareELExpressionParser extends ELExpressionParser { - public LegacyJSFELExpressionParser(ExpressionFactory expressionFactory) { + public JsfManagedBeanAwareELExpressionParser(ExpressionFactory expressionFactory) { super(expressionFactory); putContextFactory(RequestContext.class, new RequestContextELContextFactory()); putContextFactory(MutableAttributeMap.class, new AttributeMapELContextFactory()); @@ -63,7 +63,7 @@ public class LegacyJSFELExpressionParser extends ELExpressionParser { customResolvers.add(new SpringSecurityELResolver()); } customResolvers.add(new SpringBeanWebFlowELResolver(context)); - customResolvers.add(new LegacyJSFBeanResolver()); + customResolvers.add(new JsfManagedBeanResolver()); ELResolver resolver = new DefaultELResolver(target, customResolvers); return new WebFlowELContext(resolver); } diff --git a/spring-faces/src/main/java/org/springframework/faces/expression/LegacyJSFBeanResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanResolver.java similarity index 97% rename from spring-faces/src/main/java/org/springframework/faces/expression/LegacyJSFBeanResolver.java rename to spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanResolver.java index cb3c3fa5..4c57f80c 100644 --- a/spring-faces/src/main/java/org/springframework/faces/expression/LegacyJSFBeanResolver.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanResolver.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.faces.expression; +package org.springframework.faces.webflow; import java.util.Iterator; @@ -32,7 +32,7 @@ import org.springframework.webflow.execution.RequestContextHolder; * * @author Jeremy Grelle */ -public class LegacyJSFBeanResolver extends ELResolver { +public class JsfManagedBeanResolver extends ELResolver { public Class getCommonPropertyType(ELContext context, Object base) { return Object.class; diff --git a/spring-faces/src/test/java/org/springframework/faces/config/FacesFlowBuilderServicesBeanDefinitionParserTests.java b/spring-faces/src/test/java/org/springframework/faces/config/FacesFlowBuilderServicesBeanDefinitionParserTests.java index 7edc747d..dbe45a2f 100644 --- a/spring-faces/src/test/java/org/springframework/faces/config/FacesFlowBuilderServicesBeanDefinitionParserTests.java +++ b/spring-faces/src/test/java/org/springframework/faces/config/FacesFlowBuilderServicesBeanDefinitionParserTests.java @@ -3,10 +3,10 @@ package org.springframework.faces.config; import junit.framework.TestCase; import org.springframework.context.support.ClassPathXmlApplicationContext; -import org.springframework.faces.expression.LegacyJSFELExpressionParser; import org.springframework.faces.model.converter.FacesConversionService; import org.springframework.faces.webflow.JSFMockHelper; import org.springframework.faces.webflow.JsfViewFactoryCreator; +import org.springframework.faces.webflow.JsfManagedBeanAwareELExpressionParser; import org.springframework.webflow.engine.builder.support.FlowBuilderServices; import org.springframework.webflow.expression.el.WebFlowELExpressionParser; @@ -36,7 +36,7 @@ public class FacesFlowBuilderServicesBeanDefinitionParserTests extends TestCase public void testEnableManagedBeans() { builderServices = (FlowBuilderServices) context.getBean("flowBuilderServicesLegacy"); assertNotNull(builderServices); - assertTrue(builderServices.getExpressionParser() instanceof LegacyJSFELExpressionParser); + assertTrue(builderServices.getExpressionParser() instanceof JsfManagedBeanAwareELExpressionParser); assertTrue(builderServices.getViewFactoryCreator() instanceof JsfViewFactoryCreator); assertTrue(builderServices.getConversionService() instanceof FacesConversionService); } diff --git a/spring-faces/src/test/java/org/springframework/faces/ui/resource/FlowResourceHelperTests.java b/spring-faces/src/test/java/org/springframework/faces/ui/resource/FlowResourceHelperTests.java index d742d5b9..754bf169 100644 --- a/spring-faces/src/test/java/org/springframework/faces/ui/resource/FlowResourceHelperTests.java +++ b/spring-faces/src/test/java/org/springframework/faces/ui/resource/FlowResourceHelperTests.java @@ -6,17 +6,11 @@ import java.io.StringWriter; import junit.framework.TestCase; import org.apache.shale.test.mock.MockResponseWriter; -import org.easymock.EasyMock; import org.springframework.faces.webflow.JSFMockHelper; -import org.springframework.webflow.context.ExternalContext; -import org.springframework.webflow.execution.RequestContext; -import org.springframework.webflow.execution.RequestContextHolder; public class FlowResourceHelperTests extends TestCase { - RequestContext requestContext = (RequestContext) EasyMock.createMock(RequestContext.class); - ExternalContext externalContext = (ExternalContext) EasyMock.createMock(ExternalContext.class); - FlowResourceHelper resourceHelper = new FlowResourceHelper(); + ResourceHelper resourceHelper = new ResourceHelper(); StringWriter writer = new StringWriter(); @@ -24,9 +18,8 @@ public class FlowResourceHelperTests extends TestCase { protected void setUp() throws Exception { jsf.setUp(); + // TODO figure out how to set the context path jsf.facesContext().setResponseWriter(new MockResponseWriter(writer, "text/html", "UTF-8")); - EasyMock.expect(requestContext.getExternalContext()).andStubReturn(externalContext); - RequestContextHolder.setRequestContext(requestContext); } protected void tearDown() throws Exception { @@ -36,17 +29,11 @@ public class FlowResourceHelperTests extends TestCase { public final void testRenderScriptLink() throws IOException { String scriptPath = "/dojo/dojo.js"; - String expectedUrl = "/context/resources/dojo/dojo.js"; - - EasyMock.expect(externalContext.getContextPath()).andReturn("/context"); - - EasyMock.replay(new Object[] { requestContext, externalContext }); + String expectedUrl = "null/resources/dojo/dojo.js"; resourceHelper.renderScriptLink(jsf.facesContext(), scriptPath); resourceHelper.renderScriptLink(jsf.facesContext(), scriptPath); - EasyMock.verify(new Object[] { externalContext }); - String expectedOutput = "