Author: dmorozov
Date: 2008-11-23 15:30:33 -0500 (Sun, 23 Nov 2008)
New Revision: 11306
Added:
trunk/ui/core/src/test/java/org/ajax4jsf/component/QueueRendererTest.java
Modified:
trunk/ui/core/src/main/config/component/queue.xml
trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/QueueRenderer.java
trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/QueueRendererData.java
trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/scripts/QueueScriptResourceRenderer.java
Log:
https://jira.jboss.org/jira/browse/RF-4662
Modified: trunk/ui/core/src/main/config/component/queue.xml
===================================================================
--- trunk/ui/core/src/main/config/component/queue.xml 2008-11-23 20:28:15 UTC (rev 11305)
+++ trunk/ui/core/src/main/config/component/queue.xml 2008-11-23 20:30:33 UTC (rev 11306)
@@ -6,6 +6,7 @@
<family>org.ajax4jsf.Queue</family>
<classname>org.ajax4jsf.component.html.HtmlQueue</classname>
<superclass>org.ajax4jsf.component.UIQueue</superclass>
+ <test />
<description>
<![CDATA[The <a4j:queue> tag.]]>
</description>
@@ -26,7 +27,7 @@
-->
<property>
<name>size</name>
- <classname>java.lang.Integer</classname>
+ <classname>int</classname>
</property>
<property>
<name>name</name>
@@ -36,15 +37,15 @@
<property >
<name>requestDelay</name>
- <classname>java.lang.Integer</classname>
+ <classname>int</classname>
</property>
<property>
<name>ignoreDupResponses</name>
- <classname>java.lang.Boolean</classname>
+ <classname>boolean</classname>
</property>
<property>
<name>timeout</name>
- <classname>java.lang.Integer</classname>
+ <classname>int</classname>
</property>
<property>
<name>disabled</name>
Modified: trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/QueueRenderer.java
===================================================================
--- trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/QueueRenderer.java 2008-11-23
20:28:15 UTC (rev 11305)
+++ trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/QueueRenderer.java 2008-11-23
20:30:33 UTC (rev 11306)
@@ -32,6 +32,7 @@
import org.ajax4jsf.javascript.JSFunctionDefinition;
import org.ajax4jsf.renderkit.AjaxRendererUtils;
import org.ajax4jsf.renderkit.HeaderResourcesRendererBase;
+import org.ajax4jsf.renderkit.RendererUtils;
import org.ajax4jsf.renderkit.html.scripts.QueueScript;
import org.ajax4jsf.resource.InternetResource;
import org.richfaces.component.util.MessageUtil;
@@ -63,10 +64,9 @@
public static final String BEHAVIOR_FIRE_NEW = "fireNew";
private static final String[] REQUEST_ATTRIBUTES = new String[] {
- "requestDelay",
- "timeout",
"ignoreDupResponses",
- "limitToList"
+ "requestDelay",
+ "timeout"
};
private volatile InternetResource[] scripts;
@@ -92,20 +92,7 @@
return UIQueue.class;
}
- private boolean isNotEmpty(Object object) {
- if (object == null) {
- return false;
- }
-
- if (object instanceof String) {
- String s = (String) object;
- if (s.length() == 0) {
- return false;
- }
- }
-
- return true;
- }
+ private static final RendererUtils utils = RendererUtils.getInstance();
private boolean isValidBehaviorValue(String value) {
return BEHAVIOR_DROP_NEW.equals(value) || BEHAVIOR_DROP_NEXT.equals(value) ||
@@ -117,13 +104,13 @@
QueueRendererData data = new QueueRendererData();
- Integer size = (Integer) attributes.get(SIZE);
- if (size != null) {
+ int size = queue.getSize();
+ if (utils.shouldRenderAttribute(size)) {
data.addQueueAttribute(SIZE, size);
}
String sizeExceededBehavior = (String) attributes.get(SIZE_EXCEEDED_BEHAVIOR);
- if (isNotEmpty(sizeExceededBehavior)) {
+ if (utils.shouldRenderAttribute(sizeExceededBehavior)) {
if (!isValidBehaviorValue(sizeExceededBehavior)) {
throw new IllegalArgumentException(sizeExceededBehavior + " value of " +
SIZE_EXCEEDED_BEHAVIOR + " attribute is not a legal one for component: " +
@@ -133,30 +120,30 @@
data.addQueueAttribute(SIZE_EXCEEDED_BEHAVIOR, sizeExceededBehavior);
}
+ String onsizeexceeded = queue.getOnsizeexceeded();
+ if (utils.shouldRenderAttribute(onsizeexceeded)) {
+ data.addQueueAttribute("onsizeexceeded", new
JSFunctionDefinition("query", "options",
"event").addToBody(onsizeexceeded));
+ }
+
for (String attributeName : REQUEST_ATTRIBUTES) {
Object value = attributes.get(attributeName);
- if (isNotEmpty(value)) {
+ if (utils.shouldRenderAttribute(value)) {
data.addRequestAttribute(attributeName, value);
}
}
- String onsizeexceeded = queue.getOnsizeexceeded();
- if (isNotEmpty(onsizeexceeded)) {
- data.addQueueAttribute("onsizeexceeded", new
JSFunctionDefinition("query", "options",
"event").addToBody(onsizeexceeded));
+ String onBeforeDomUpdate = queue.getOnbeforedomupdate();
+ if (utils.shouldRenderAttribute(onBeforeDomUpdate)) {
+ data.addRequestAttribute(QUEUE_ONBEFOREDOMUPDATE_ATTRIBUTE,
AjaxRendererUtils.buildAjaxOnBeforeDomUpdate(onBeforeDomUpdate));
}
String oncomplete = queue.getOncomplete();
- if (isNotEmpty(oncomplete)) {
+ if (utils.shouldRenderAttribute(oncomplete)) {
data.addRequestAttribute(QUEUE_ONCOMPLETE_ATTRIBUTE,
AjaxRendererUtils.buildAjaxOncomplete(oncomplete));
}
- String onBeforeDomUpdate = queue.getOnbeforedomupdate();
- if (isNotEmpty(onBeforeDomUpdate)) {
- data.addRequestAttribute(QUEUE_ONBEFOREDOMUPDATE_ATTRIBUTE,
AjaxRendererUtils.buildAjaxOnBeforeDomUpdate(onBeforeDomUpdate));
- }
-
String onsubmit = queue.getOnsubmit();
- if (isNotEmpty(onsubmit)) {
+ if (utils.shouldRenderAttribute(onsubmit)) {
JSFunctionDefinition onsubmitFunction = new
JSFunctionDefinition("request");
onsubmitFunction.addToBody(onsubmit);
@@ -164,7 +151,7 @@
}
String onerror = queue.getOnerror();
- if (isNotEmpty(onerror)) {
+ if (utils.shouldRenderAttribute(onerror)) {
JSFunctionDefinition onerrorFunction = new JSFunctionDefinition("request",
"status", "message");
onerrorFunction.addToBody(onerror);
Modified: trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/QueueRendererData.java
===================================================================
---
trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/QueueRendererData.java 2008-11-23
20:28:15 UTC (rev 11305)
+++
trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/QueueRendererData.java 2008-11-23
20:30:33 UTC (rev 11306)
@@ -22,7 +22,7 @@
package org.ajax4jsf.renderkit.html;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.Map;
/**
@@ -37,7 +37,7 @@
public void addQueueAttribute(String key, Object value) {
if (queueAttributes == null) {
- queueAttributes = new HashMap<String, Object>();
+ queueAttributes = new LinkedHashMap<String, Object>();
}
queueAttributes.put(key, value);
@@ -45,7 +45,7 @@
public void addRequestAttribute(String key, Object value) {
if (requestAttributes == null) {
- requestAttributes = new HashMap<String, Object>();
+ requestAttributes = new LinkedHashMap<String, Object>();
}
requestAttributes.put(key, value);
Modified:
trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/scripts/QueueScriptResourceRenderer.java
===================================================================
---
trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/scripts/QueueScriptResourceRenderer.java 2008-11-23
20:28:15 UTC (rev 11305)
+++
trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/scripts/QueueScriptResourceRenderer.java 2008-11-23
20:30:33 UTC (rev 11306)
@@ -24,6 +24,7 @@
import java.io.IOException;
import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
@@ -46,6 +47,9 @@
*/
public class QueueScriptResourceRenderer extends BaseResourceRenderer {
+ //TODO rename?
+ public static final String QUEUE_SCRIPT_ID = "richfaces:ajaxqueues";
+
private void encodeQueue(ResponseWriter writer, String queueName, QueueRendererData
queueData)
throws IOException {
@@ -107,6 +111,8 @@
super.encode(resource, context, data, attributes);
}
+ } else {
+ context.getExternalContext().log("");
}
}
@@ -114,14 +120,19 @@
public void encode(InternetResource resource, FacesContext context,
Object data, Map<String, Object> attributes) throws IOException {
- doEncode(resource, context, data, attributes);
+ Map<String,Object> newAttributes = new LinkedHashMap<String,
Object>(attributes);
+ newAttributes.put(HTML.id_ATTRIBUTE,
context.getExternalContext().encodeNamespace(QUEUE_SCRIPT_ID));
+
+ doEncode(resource, context, data, newAttributes);
}
@Override
public void encode(InternetResource resource, FacesContext context,
Object data) throws IOException {
- doEncode(resource, context, data, Collections.EMPTY_MAP);
+ doEncode(resource, context, data,
+ Collections.singletonMap(HTML.id_ATTRIBUTE,
+ (Object) context.getExternalContext().encodeNamespace(QUEUE_SCRIPT_ID)));
}
@Override
Added: trunk/ui/core/src/test/java/org/ajax4jsf/component/QueueRendererTest.java
===================================================================
--- trunk/ui/core/src/test/java/org/ajax4jsf/component/QueueRendererTest.java
(rev 0)
+++ trunk/ui/core/src/test/java/org/ajax4jsf/component/QueueRendererTest.java 2008-11-23
20:30:33 UTC (rev 11306)
@@ -0,0 +1,224 @@
+/**
+ * License Agreement.
+ *
+ * JBoss RichFaces - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.ajax4jsf.component;
+
+import java.util.List;
+
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIForm;
+import javax.faces.component.UIInput;
+import javax.faces.component.UIViewRoot;
+
+import org.ajax4jsf.renderkit.html.scripts.QueueScriptResourceRenderer;
+import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
+import org.jaxen.JaxenException;
+
+import com.gargoylesoftware.htmlunit.html.DomText;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+
+/**
+ * @author Nick Belaevski
+ * @since 3.3.0
+ */
+
+public class QueueRendererTest extends AbstractAjax4JsfTestCase {
+
+ private UIForm form;
+
+ private static final String dry(String s) {
+ return s.replace(" ", "");
+ }
+
+ private static final String QUEUE_INIT_PROLOG = "A4J.AJAX.EventQueue.addQueue(new
A4J.AJAX.EventQueue(";
+
+ private static final String QUEUE_INIT_PROLOG_DRIED = dry(QUEUE_INIT_PROLOG);
+
+ /**
+ * @param name
+ */
+ public QueueRendererTest(String name) {
+ super(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.ajax4jsf.tests.AbstractAjax4JsfTestCase#setUp()
+ */
+ public void setUp() throws Exception {
+ super.setUp();
+
+ UIViewRoot root = facesContext.getViewRoot();
+ List<UIComponent> children = root.getChildren();
+
+ form = (UIForm) application.createComponent(UIForm.COMPONENT_TYPE);
+ form.setId("theform");
+ form.getChildren().add(application.createComponent(UIInput.COMPONENT_TYPE));
+ children.add(form);
+ }
+
+ /* (non-Javadoc)
+ * @see org.ajax4jsf.tests.AbstractAjax4JsfTestCase#tearDown()
+ */
+ public void tearDown() throws Exception {
+ super.tearDown();
+
+ form = null;
+ }
+
+ private String getQueueScript(HtmlPage page) throws JaxenException {
+ List<?> list = page.getByXPath("//head/script[@id='" +
QueueScriptResourceRenderer.QUEUE_SCRIPT_ID + "']/text()");
+ DomText text = (DomText) list.get(0);
+ return text.getData();
+ }
+
+ public void testViewQueueName() throws Exception {
+ UIQueue queue = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
+ queue.setName("test_view_queue");
+ facesContext.getViewRoot().getChildren().add(queue);
+
+ HtmlPage page = renderView();
+ String queueScript = getQueueScript(page);
+ assertTrue(queueScript.startsWith(QUEUE_INIT_PROLOG +
"'test_view_queue'"));
+ }
+
+ public void testViewQueueDefaultName() throws Exception {
+ UIQueue queue = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
+ facesContext.getViewRoot().getChildren().add(queue);
+
+ HtmlPage page = renderView();
+ String queueScript = getQueueScript(page);
+ assertTrue(queueScript.startsWith(QUEUE_INIT_PROLOG + "'" +
UIQueue.GLOBAL_QUEUE_NAME + "'"));
+ }
+
+ public void testFormQueueName() throws Exception {
+ UIQueue queue = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
+ queue.setName("test_view_queue");
+ form.getChildren().add(queue);
+
+ HtmlPage page = renderView();
+ String queueScript = getQueueScript(page);
+ assertTrue(queueScript.startsWith(QUEUE_INIT_PROLOG +
"'theform:test_view_queue'"));
+ }
+
+ public void testFormQueueDefaultName() throws Exception {
+ UIQueue queue = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
+ form.getChildren().add(queue);
+
+ HtmlPage page = renderView();
+ String queueScript = getQueueScript(page);
+ assertTrue(queueScript.startsWith(QUEUE_INIT_PROLOG + "'theform'"));
+ }
+
+ public void testRenderQueueAttributes() throws Exception {
+ UIQueue queue1 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
+
+ queue1.setSize(10);
+ queue1.setOnsizeexceeded("sizeexceeded_handler()");
+ queue1.setSizeExceededBehavior("dropNext");
+ form.getChildren().add(queue1);
+
+ UIQueue queue2 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
+ queue2.setSize(-1);
+ queue2.setName("unsizedQueue");
+ form.getChildren().add(queue2);
+
+ UIQueue queue3 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
+ queue3.setName("defaultSizeQueue");
+ form.getChildren().add(queue3);
+
+ HtmlPage page = renderView();
+ String queueScript = dry(getQueueScript(page));
+ String[] scripts = queueScript.split(";");
+ assertEquals(3, scripts.length);
+
+ assertEquals(QUEUE_INIT_PROLOG_DRIED +
+ "'theform',{'size':10,'sizeExceededBehavior':'dropNext','onsizeexceeded':function(query,options,event){sizeexceeded_handler()}},null))",
+ scripts[0]);
+
+ assertEquals(QUEUE_INIT_PROLOG_DRIED +
+ "'theform:unsizedQueue',{'size':-1},null))", scripts[1]);
+
+ assertEquals(QUEUE_INIT_PROLOG_DRIED +
+ "'theform:defaultSizeQueue',null,null))", scripts[2]);
+ }
+
+ public void testRenderRequestAttributes() throws Exception {
+ UIQueue queue1 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
+
+ queue1.setName("queue1");
+ queue1.setTimeout(50021);
+ queue1.setOnerror("error_queue_handler()");
+ queue1.setOnsubmit("submit_queue_handler()");
+ queue1.setIgnoreDupResponses(false);
+ form.getChildren().add(queue1);
+
+ UIQueue queue2 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
+
+ queue2.setName("queue2");
+ queue2.setRequestDelay(600);
+ queue2.setIgnoreDupResponses(true);
+ queue2.setOnbeforedomupdate("beforedomupdate_handler()");
+ queue2.setOncomplete("complete_handler()");
+ form.getChildren().add(queue2);
+
+ HtmlPage page = renderView();
+ String queueScript = dry(getQueueScript(page));
+ String[] scripts = queueScript.split(";");
+ assertEquals(2, scripts.length);
+
+ assertEquals(QUEUE_INIT_PROLOG_DRIED +
"'theform:queue1',null,{'timeout':50021,'queueonsubmit':function(request){submit_queue_handler()},'queueonerror':function(request,status,message){error_queue_handler()}}))",
scripts[0]);
+ assertEquals(QUEUE_INIT_PROLOG_DRIED +
"'theform:queue2',null,{'ignoreDupResponses':true,'requestDelay':600,'queueonbeforedomupdate':function(request,event,data){beforedomupdate_handler()},'queueoncomplete':function(request,event,data){complete_handler()}}))",
scripts[1]);
+ }
+
+ public void testInvalidSizeExceededBehavior() throws Exception {
+ UIQueue queue = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
+ queue.setSizeExceededBehavior("unknownBehavior");
+ form.getChildren().add(queue);
+
+ try {
+ renderView();
+ fail();
+ } catch (IllegalArgumentException e) {
+ //ok
+ }
+ }
+
+ public void testDuplicateQueues() throws Exception {
+ UIQueue queue1 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
+ queue1.setName("testQueue");
+ queue1.setSize(2);
+ form.getChildren().add(queue1);
+
+ UIQueue queue2 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
+ queue2.setName("testQueue");
+ queue2.setSize(5);
+ form.getChildren().add(queue2);
+
+ HtmlPage page = renderView();
+
+ String queueScript = dry(getQueueScript(page));
+ String[] scripts = queueScript.split(";");
+ assertEquals(1, scripts.length);
+
+ assertEquals(QUEUE_INIT_PROLOG_DRIED +
"'theform:testQueue',{'size':2},null))", scripts[0]);
+ }
+
+}