Author: alexsmirnov
Date: 2007-09-27 16:45:40 -0400 (Thu, 27 Sep 2007)
New Revision: 3157
Added:
trunk/framework/impl/src/main/java/org/ajax4jsf/event/EventsQueue.java
trunk/framework/impl/src/test/java/org/ajax4jsf/event/
trunk/framework/impl/src/test/java/org/ajax4jsf/event/EventsQueueTest.java
Modified:
trunk/framework/impl/src/main/java/org/ajax4jsf/component/AjaxViewRoot.java
Log:
fix for
http://jira.jboss.org/jira/browse/RF-1004
Modified: trunk/framework/impl/src/main/java/org/ajax4jsf/component/AjaxViewRoot.java
===================================================================
--- trunk/framework/impl/src/main/java/org/ajax4jsf/component/AjaxViewRoot.java 2007-09-27
17:58:21 UTC (rev 3156)
+++ trunk/framework/impl/src/main/java/org/ajax4jsf/component/AjaxViewRoot.java 2007-09-27
20:45:40 UTC (rev 3157)
@@ -22,6 +22,7 @@
package org.ajax4jsf.component;
import java.io.IOException;
+import java.util.NoSuchElementException;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
@@ -34,16 +35,13 @@
import org.ajax4jsf.Messages;
import org.ajax4jsf.application.AjaxSingleException;
-import org.ajax4jsf.component.AjaxContainer;
import org.ajax4jsf.context.AjaxContext;
import org.ajax4jsf.context.AjaxContextImpl;
import org.ajax4jsf.context.InvokerCallback;
import org.ajax4jsf.context.ViewIdHolder;
import org.ajax4jsf.event.AjaxListener;
+import org.ajax4jsf.event.EventsQueue;
import org.ajax4jsf.renderkit.AjaxContainerRenderer;
-import org.apache.commons.collections.Buffer;
-import org.apache.commons.collections.BufferUnderflowException;
-import org.apache.commons.collections.UnboundedFifoBuffer;
/**
* Custom ViewRoot for support render parts of tree for Ajax requests. Main
@@ -149,9 +147,9 @@
* phase, for wich events must be processed.
*/
void broadcastEvents(FacesContext context, PhaseId phaseId) {
- Buffer[] events = getEvents(context);
- Buffer anyPhaseEvents = events[PhaseId.ANY_PHASE.getOrdinal()];
- Buffer phaseEvents = events[phaseId.getOrdinal()];
+ EventsQueue[] events = getEvents(context);
+ EventsQueue anyPhaseEvents = events[PhaseId.ANY_PHASE.getOrdinal()];
+ EventsQueue phaseEvents = events[phaseId.getOrdinal()];
if (phaseEvents.isEmpty() && anyPhaseEvents.isEmpty())
return;
// FacesEvent event = null;
@@ -176,7 +174,7 @@
* @param phaseEventsQueue
* @param havePhaseEvents
*/
- public void processEvents(Buffer phaseEventsQueue, boolean havePhaseEvents) {
+ public void processEvents(EventsQueue phaseEventsQueue, boolean havePhaseEvents) {
FacesEvent event;
while (havePhaseEvents) {
try {
@@ -195,20 +193,20 @@
// clearEvents();
// return;
}
- } catch (BufferUnderflowException e) {
+ } catch (NoSuchElementException e) {
havePhaseEvents = false;
}
}
}
public void broadcastAjaxEvents(FacesContext context) {
- Buffer queue = getAjaxEventsQueue(context);
+ EventsQueue queue = getAjaxEventsQueue(context);
processEvents(queue, !queue.isEmpty());
}
- private Buffer[] events;
+ private EventsQueue[] events;
- private Buffer ajaxEvents = new UnboundedFifoBuffer();
+ private EventsQueue ajaxEvents = new EventsQueue();
/**
* Use FIFO buffers for hold Faces Events. Hold this buffers in Request
@@ -219,14 +217,14 @@
* @param phase
* @return
*/
- protected Buffer getEventsQueue(FacesContext context, PhaseId phase) {
+ protected EventsQueue getEventsQueue(FacesContext context, PhaseId phase) {
return getEvents(context)[phase.getOrdinal()];
}
/**
* @return
*/
- protected Buffer[] getEvents(FacesContext context) {
+ protected EventsQueue[] getEvents(FacesContext context) {
if (events == null) {
clearEvents(context);
}
@@ -239,16 +237,16 @@
* @param context
* @return
*/
- protected Buffer getAjaxEventsQueue(FacesContext context) {
+ protected EventsQueue getAjaxEventsQueue(FacesContext context) {
return ajaxEvents;
}
public void clearEvents(FacesContext context) {
int len;
- events = new Buffer[len = PhaseId.VALUES.size()];
+ events = new EventsQueue[len = PhaseId.VALUES.size()];
for (int i = 0; i < len; i++) {
- events[i] = new UnboundedFifoBuffer();
+ events[i] = new EventsQueue();
}
}
Added: trunk/framework/impl/src/main/java/org/ajax4jsf/event/EventsQueue.java
===================================================================
--- trunk/framework/impl/src/main/java/org/ajax4jsf/event/EventsQueue.java
(rev 0)
+++ trunk/framework/impl/src/main/java/org/ajax4jsf/event/EventsQueue.java 2007-09-27
20:45:40 UTC (rev 3157)
@@ -0,0 +1,97 @@
+/**
+ *
+ */
+package org.ajax4jsf.event;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Queue;
+
+import javax.faces.event.FacesEvent;
+
+/**
+ * Very simple implementation of FIFO buffer, to organize JSF events queue.
+ * @author asmirnov
+ *
+ */
+public class EventsQueue {
+
+ private QueueElement first;
+
+ private QueueElement last;
+
+ /**
+ * Remove and return first queued event.
+ * @return faces event form top of queue
+ * @throws NoSuchElementException , if queue is empty.
+ */
+ public FacesEvent remove() throws NoSuchElementException {
+ if(isEmpty()){
+ throw new NoSuchElementException("Events queue is empty");
+ }
+ FacesEvent element = first.getElement();
+ first = first.getPrevisious();
+ if(null == first){
+ last = null;
+ }
+ return element;
+ }
+
+ /**
+ * Add event to queue.
+ * @param element
+ */
+ public void add(FacesEvent element) {
+ QueueElement queueElement = new QueueElement(element);
+ if(isEmpty()){
+ first = last = queueElement;
+ } else {
+ last.setPrevisious(queueElement);
+ last = queueElement;
+ }
+ }
+
+ public void clear() {
+ first = last = null;
+ }
+
+ public boolean isEmpty() {
+ return null == first;
+ }
+
+ private static class QueueElement {
+
+ private QueueElement previsious;
+
+ private FacesEvent element;
+
+ public QueueElement(FacesEvent element) {
+ this.element = element;
+ }
+
+
+ /**
+ * @param previsious the previsious to set
+ */
+ public void setPrevisious(QueueElement previsious) {
+ this.previsious = previsious;
+ }
+
+
+ /**
+ * @return the previsious
+ */
+ public QueueElement getPrevisious() {
+ return previsious;
+ }
+
+ /**
+ * @return the element
+ */
+ public FacesEvent getElement() {
+ return element;
+ }
+
+ }
+}
Added: trunk/framework/impl/src/test/java/org/ajax4jsf/event/EventsQueueTest.java
===================================================================
--- trunk/framework/impl/src/test/java/org/ajax4jsf/event/EventsQueueTest.java
(rev 0)
+++ trunk/framework/impl/src/test/java/org/ajax4jsf/event/EventsQueueTest.java 2007-09-27
20:45:40 UTC (rev 3157)
@@ -0,0 +1,90 @@
+/**
+ *
+ */
+package org.ajax4jsf.event;
+
+
+
+import java.util.NoSuchElementException;
+
+import javax.faces.component.UICommand;
+import javax.faces.event.ActionEvent;
+
+import junit.framework.TestCase;
+
+/**
+ * @author asmirnov
+ *
+ */
+public class EventsQueueTest extends TestCase {
+
+ /**
+ * @param name
+ */
+ public EventsQueueTest(String name) {
+ super(name);
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#tearDown()
+ */
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ /**
+ * Test method for {@link org.ajax4jsf.event.EventsQueue#remove()}.
+ */
+ public void testRemove() {
+ ActionEvent event = new ActionEvent(new UICommand());
+ EventsQueue queue = new EventsQueue();
+ queue.add(event);
+ assertFalse(queue.isEmpty());
+ ActionEvent event2 = new ActionEvent(new UICommand());
+ queue.add(event2);
+ assertSame(event, queue.remove());
+ assertSame(event2, queue.remove());
+ assertTrue(queue.isEmpty());
+ try {
+ queue.remove();
+ } catch (NoSuchElementException e) {
+ return;
+ }
+ assertTrue("exception not thrown",false);
+ }
+
+ /**
+ * Test method for {@link
org.ajax4jsf.event.EventsQueue#add(javax.faces.event.FacesEvent)}.
+ */
+ public void testAdd() {
+ ActionEvent event = new ActionEvent(new UICommand());
+ EventsQueue queue = new EventsQueue();
+ queue.add(event);
+ assertFalse(queue.isEmpty());
+ ActionEvent event2 = new ActionEvent(new UICommand());
+ queue.add(event2);
+ }
+
+ /**
+ * Test method for {@link org.ajax4jsf.event.EventsQueue#clear()}.
+ */
+ public void testClear() {
+ ActionEvent event = new ActionEvent(new UICommand());
+ EventsQueue queue = new EventsQueue();
+ queue.add(event);
+ assertFalse(queue.isEmpty());
+ ActionEvent event2 = new ActionEvent(new UICommand());
+ queue.add(event2);
+ queue.clear();
+ assertTrue(queue.isEmpty());
+ }
+
+
+}