diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ProgressiveCommandButtonRenderer.java b/spring-faces/src/main/java/org/springframework/faces/ui/ProgressiveCommandButtonRenderer.java index 41db0b36..ca9f3edc 100644 --- a/spring-faces/src/main/java/org/springframework/faces/ui/ProgressiveCommandButtonRenderer.java +++ b/spring-faces/src/main/java/org/springframework/faces/ui/ProgressiveCommandButtonRenderer.java @@ -84,7 +84,7 @@ public class ProgressiveCommandButtonRenderer extends BaseDojoComponentRenderer } onclick.append("Spring.remoting.submitForm('" + component.getClientId(context) + "', "); onclick.append("'" + RendererUtils.getFormId(context, component) + "', "); - onclick.append("{processIds: '" + processIds + "'" + encodeParams(context, component) + onclick.append("{processIds: '" + processIds + "'" + encodeParamsAsObject(context, component) + "}); return false;"); } else { onclick.append(getOnClickNoAjax(context, component)); @@ -143,23 +143,18 @@ public class ProgressiveCommandButtonRenderer extends BaseDojoComponentRenderer return true; } - protected String encodeParams(FacesContext context, UIComponent component) { - StringBuffer paramArray = new StringBuffer(); - paramArray.append("["); + protected String encodeParamsAsObject(FacesContext context, UIComponent component) { + StringBuffer paramObj = new StringBuffer(); for (int i = 0; i < component.getChildCount(); i++) { if (component.getChildren().get(i) instanceof UIParameter) { UIParameter param = (UIParameter) component.getChildren().get(i); Assert.hasText(param.getName(), "UIParameter requires a name when used as a child of a UICommand component"); - if (paramArray.length() > 1) { - paramArray.append(", "); - } - paramArray.append("{name : '" + param.getName() + "'"); - paramArray.append(", value : '" + param.getValue() + "'}"); + + paramObj.append(", " + param.getName() + " : '" + param.getValue() + "'"); } } - paramArray.append("]"); - return paramArray.toString(); + return paramObj.toString(); } } diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ProgressiveCommandLinkRenderer.java b/spring-faces/src/main/java/org/springframework/faces/ui/ProgressiveCommandLinkRenderer.java index 477ba602..04441876 100644 --- a/spring-faces/src/main/java/org/springframework/faces/ui/ProgressiveCommandLinkRenderer.java +++ b/spring-faces/src/main/java/org/springframework/faces/ui/ProgressiveCommandLinkRenderer.java @@ -26,12 +26,14 @@ import java.util.ListIterator; import java.util.Map; import javax.faces.component.UIComponent; +import javax.faces.component.UIParameter; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.render.Renderer; import org.springframework.beans.BeanUtils; import org.springframework.faces.webflow.JsfUtils; +import org.springframework.util.Assert; /** * {@link Renderer} for the {@code } tag. @@ -162,13 +164,32 @@ public class ProgressiveCommandLinkRenderer extends ProgressiveCommandButtonRend } protected String getOnClickNoAjax(FacesContext context, UIComponent component) { - String params = encodeParams(context, component); + String params = encodeParamsAsArray(context, component); StringBuffer onclick = new StringBuffer(); onclick.append("this.submitFormFromLink('" + RendererUtils.getFormId(context, component) + "','" + component.getClientId(context) + "', " + params + "); return false;"); return onclick.toString(); } + protected String encodeParamsAsArray(FacesContext context, UIComponent component) { + StringBuffer paramArray = new StringBuffer(); + paramArray.append("["); + for (int i = 0; i < component.getChildCount(); i++) { + if (component.getChildren().get(i) instanceof UIParameter) { + UIParameter param = (UIParameter) component.getChildren().get(i); + Assert.hasText(param.getName(), + "UIParameter requires a name when used as a child of a UICommand component"); + if (paramArray.length() > 1) { + paramArray.append(", "); + } + paramArray.append("{name : '" + param.getName() + "'"); + paramArray.append(", value : '" + param.getValue() + "'}"); + } + } + paramArray.append("]"); + return paramArray.toString(); + } + private class DoubleQuoteEscapingWriter extends ResponseWriter { private ResponseWriter original; diff --git a/spring-faces/src/test/java/org/springframework/faces/ui/ProgressiveCommandLinkRendererTests.java b/spring-faces/src/test/java/org/springframework/faces/ui/ProgressiveCommandLinkRendererTests.java new file mode 100644 index 00000000..2954fbac --- /dev/null +++ b/spring-faces/src/test/java/org/springframework/faces/ui/ProgressiveCommandLinkRendererTests.java @@ -0,0 +1,137 @@ +package org.springframework.faces.ui; + +import java.io.StringWriter; + +import javax.faces.component.UIForm; +import javax.faces.component.UIParameter; + +import junit.framework.TestCase; + +import org.apache.shale.test.mock.MockResponseWriter; +import org.springframework.faces.webflow.JSFMockHelper; + +public class ProgressiveCommandLinkRendererTests extends TestCase { + + JSFMockHelper jsf = new JSFMockHelper(); + + ProgressiveCommandLinkRenderer renderer = new ProgressiveCommandLinkRenderer(); + + StringWriter output = new StringWriter(); + + public void setUp() throws Exception { + jsf.setUp(); + jsf.facesContext().setResponseWriter(new MockResponseWriter(output, null, null)); + } + + public void tearDown() throws Exception { + System.out.println(output); + jsf.tearDown(); + } + + public void testRenderOnClick_AjaxEnabled_NoParams() throws Exception { + String expected = ""; + + UIForm form = new UIForm(); + form.setId("myForm"); + ProgressiveUICommand link = new ProgressiveUICommand(); + link.setId("foo"); + form.getChildren().add(link); + + RenderAttributeCallback callback = (RenderAttributeCallback) renderer.getAttributeCallbacks(link) + .get("onclick"); + + jsf.facesContext().getResponseWriter().startElement("a", link); + + callback.doRender(jsf.facesContext(), jsf.facesContext().getResponseWriter(), link, "onclick", null, "onclick"); + + jsf.facesContext().getResponseWriter().endElement("a"); + + assertEquals(expected, output.toString()); + } + + public void testRenderOnClick_AjaxEnabled_WithParams() throws Exception { + String expected = ""; + + UIForm form = new UIForm(); + form.setId("myForm"); + ProgressiveUICommand link = new ProgressiveUICommand(); + link.setId("foo"); + form.getChildren().add(link); + UIParameter param1 = new UIParameter(); + param1.setName("foo"); + param1.setValue("bar"); + UIParameter param2 = new UIParameter(); + param2.setName("zoo"); + param2.setValue("baz"); + link.getChildren().add(param1); + link.getChildren().add(param2); + + RenderAttributeCallback callback = (RenderAttributeCallback) renderer.getAttributeCallbacks(link) + .get("onclick"); + + jsf.facesContext().getResponseWriter().startElement("a", link); + + callback.doRender(jsf.facesContext(), jsf.facesContext().getResponseWriter(), link, "onclick", null, "onclick"); + + jsf.facesContext().getResponseWriter().endElement("a"); + + assertEquals(expected, output.toString()); + } + + public void testRenderOnClick_AjaxDisabled_NoParams() throws Exception { + String expected = ""; + + UIForm form = new UIForm(); + form.setId("myForm"); + ProgressiveUICommand link = new ProgressiveUICommand(); + link.setId("foo"); + link.setAjaxEnabled(Boolean.FALSE); + form.getChildren().add(link); + + RenderAttributeCallback callback = (RenderAttributeCallback) renderer.getAttributeCallbacks(link) + .get("onclick"); + + jsf.facesContext().getResponseWriter().startElement("a", link); + + callback.doRender(jsf.facesContext(), jsf.facesContext().getResponseWriter(), link, "onclick", null, "onclick"); + + jsf.facesContext().getResponseWriter().endElement("a"); + + assertEquals(expected, output.toString()); + } + + public void testRenderOnClick_AjaxDisabled_WithParams() throws Exception { + String expected = ""; + + UIForm form = new UIForm(); + form.setId("myForm"); + ProgressiveUICommand link = new ProgressiveUICommand(); + link.setId("foo"); + link.setAjaxEnabled(Boolean.FALSE); + form.getChildren().add(link); + UIParameter param1 = new UIParameter(); + param1.setName("foo"); + param1.setValue("bar"); + UIParameter param2 = new UIParameter(); + param2.setName("zoo"); + param2.setValue("baz"); + link.getChildren().add(param1); + link.getChildren().add(param2); + + RenderAttributeCallback callback = (RenderAttributeCallback) renderer.getAttributeCallbacks(link) + .get("onclick"); + + jsf.facesContext().getResponseWriter().startElement("a", link); + + callback.doRender(jsf.facesContext(), jsf.facesContext().getResponseWriter(), link, "onclick", null, "onclick"); + + jsf.facesContext().getResponseWriter().endElement("a"); + + assertEquals(expected, output.toString()); + } +}