You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by gb...@apache.org on 2009/06/02 17:30:10 UTC

svn commit: r781060 - in /incubator/pivot/trunk: core/src/pivot/util/ core/src/pivot/util/concurrent/ core/test/pivot/util/concurrent/test/ web/test/pivot/web/test/

Author: gbrown
Date: Tue Jun  2 15:30:09 2009
New Revision: 781060

URL: http://svn.apache.org/viewvc?rev=781060&view=rev
Log:
Allow TaskGroup and TaskSequence to contain any type of task (Task<?> vs. Task<V>); update task and web query client tests to use JUnit.

Modified:
    incubator/pivot/trunk/core/src/pivot/util/ImmutableIterator.java
    incubator/pivot/trunk/core/src/pivot/util/concurrent/TaskGroup.java
    incubator/pivot/trunk/core/src/pivot/util/concurrent/TaskSequence.java
    incubator/pivot/trunk/core/test/pivot/util/concurrent/test/TaskTest.java
    incubator/pivot/trunk/web/test/pivot/web/test/WebQueryTestClient.java

Modified: incubator/pivot/trunk/core/src/pivot/util/ImmutableIterator.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/core/src/pivot/util/ImmutableIterator.java?rev=781060&r1=781059&r2=781060&view=diff
==============================================================================
--- incubator/pivot/trunk/core/src/pivot/util/ImmutableIterator.java (original)
+++ incubator/pivot/trunk/core/src/pivot/util/ImmutableIterator.java Tue Jun  2 15:30:09 2009
@@ -24,9 +24,9 @@
  * @author gbrown
  */
 public class ImmutableIterator<T> implements Iterator<T> {
-    Iterator<T> iterator;
+    Iterator<? extends T> iterator;
 
-    public ImmutableIterator(Iterator<T> iterator) {
+    public ImmutableIterator(Iterator<? extends T> iterator) {
         if (iterator == null) {
             throw new IllegalArgumentException("iterator is null.");
         }

Modified: incubator/pivot/trunk/core/src/pivot/util/concurrent/TaskGroup.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/core/src/pivot/util/concurrent/TaskGroup.java?rev=781060&r1=781059&r2=781060&view=diff
==============================================================================
--- incubator/pivot/trunk/core/src/pivot/util/concurrent/TaskGroup.java (original)
+++ incubator/pivot/trunk/core/src/pivot/util/concurrent/TaskGroup.java Tue Jun  2 15:30:09 2009
@@ -24,24 +24,22 @@
 
 /**
  * Class that runs a group of tasks in parallel and notifies listeners
- * when all tasks are complete. Callers can retrieve task results or faults by
- * calling {@link Task#getResult()} and {@link Task#getFault()},
- * respectively.
+ * when all tasks are complete.
  *
  * @author tvolkert
  * @author gbrown
  */
-public class TaskGroup<V> extends Task<Void>
-    implements Group<Task<V>>, Iterable<Task<V>> {
-    private class TaskHandler implements TaskListener<V> {
-        public void taskExecuted(Task<V> task) {
+public class TaskGroup extends Task<Void>
+    implements Group<Task<?>>, Iterable<Task<?>> {
+    private class TaskHandler implements TaskListener<Object> {
+        public void taskExecuted(Task<Object> task) {
             synchronized (TaskGroup.this) {
                 tasks.put(task, Boolean.TRUE);
                 TaskGroup.this.notify();
             }
         }
 
-        public void executeFailed(Task<V> task) {
+        public void executeFailed(Task<Object> task) {
             synchronized (TaskGroup.this) {
                 tasks.put(task, Boolean.TRUE);
                 TaskGroup.this.notify();
@@ -49,7 +47,7 @@
         }
     }
 
-    private HashMap<Task<V>, Boolean> tasks = new HashMap<Task<V>, Boolean>();
+    private HashMap<Task<?>, Boolean> tasks = new HashMap<Task<?>, Boolean>();
     private boolean executing = false;
 
     public TaskGroup() {
@@ -61,15 +59,16 @@
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public synchronized Void execute() throws TaskExecutionException {
         executing = true;
 
         try {
             TaskHandler taskHandler = new TaskHandler();
 
-            for (Task<V> task : tasks) {
+            for (Task<?> task : tasks) {
                 tasks.put(task, Boolean.FALSE);
-                task.execute(taskHandler);
+                ((Task<Object>)task).execute(taskHandler);
             }
 
             boolean complete = false;
@@ -77,12 +76,12 @@
             while (!complete) {
                 try {
                     wait();
-                } catch (InterruptedException ex) {
-                    throw new TaskExecutionException(ex);
+                } catch (InterruptedException exception) {
+                    throw new TaskExecutionException(exception);
                 }
 
                 complete = true;
-                for (Task<V> task : tasks) {
+                for (Task<?> task : tasks) {
                     if (!tasks.get(task)) {
                         complete = false;
                         break;
@@ -96,31 +95,34 @@
         return null;
     }
 
-    public synchronized void add(Task<V> element) {
+    @SuppressWarnings("unchecked")
+    public synchronized void add(Task<?> element) {
         if (executing) {
             throw new IllegalStateException("Task group is executing.");
         }
 
-        tasks.put(element, Boolean.FALSE);
+        tasks.put((Task<Object>)element, Boolean.FALSE);
     }
 
-    public synchronized void remove(Task<V> element) {
+    @SuppressWarnings("unchecked")
+    public synchronized void remove(Task<?> element) {
         if (executing) {
             throw new IllegalStateException("Task group is executing.");
         }
 
-        tasks.remove(element);
+        tasks.remove((Task<Object>)element);
     }
 
-    public boolean contains(Task<V> element) {
-        return tasks.containsKey(element);
+    @SuppressWarnings("unchecked")
+    public boolean contains(Task<?> element) {
+        return tasks.containsKey((Task<Object>)element);
     }
 
     public boolean isEmpty() {
         return tasks.isEmpty();
     }
 
-    public Iterator<Task<V>> iterator() {
-        return new ImmutableIterator<Task<V>>(tasks.iterator());
+    public Iterator<Task<?>> iterator() {
+        return new ImmutableIterator<Task<?>>(tasks.iterator());
     }
 }

Modified: incubator/pivot/trunk/core/src/pivot/util/concurrent/TaskSequence.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/core/src/pivot/util/concurrent/TaskSequence.java?rev=781060&r1=781059&r2=781060&view=diff
==============================================================================
--- incubator/pivot/trunk/core/src/pivot/util/concurrent/TaskSequence.java (original)
+++ incubator/pivot/trunk/core/src/pivot/util/concurrent/TaskSequence.java Tue Jun  2 15:30:09 2009
@@ -30,9 +30,9 @@
  *
  * @author gbrown
  */
-public class TaskSequence<V> extends Task<Void>
-    implements Sequence<Task<V>>, Iterable<Task<V>> {
-    private ArrayList<Task<V>> tasks = new ArrayList<Task<V>>();
+public class TaskSequence extends Task<Void>
+    implements Sequence<Task<?>>, Iterable<Task<?>> {
+    private ArrayList<Task<?>> tasks = new ArrayList<Task<?>>();
     private int activeTaskIndex = -1;
 
     public TaskSequence() {
@@ -44,15 +44,16 @@
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public synchronized Void execute() throws TaskExecutionException {
-        TaskListener<V> taskListener = new TaskListener<V>() {
-            public void taskExecuted(Task<V> task) {
+        TaskListener<Object> taskListener = new TaskListener<Object>() {
+            public void taskExecuted(Task<Object> task) {
                 synchronized (TaskSequence.this) {
                     TaskSequence.this.notify();
                 }
             }
 
-            public void executeFailed(Task<V> task) {
+            public void executeFailed(Task<Object> task) {
                 synchronized (TaskSequence.this) {
                     TaskSequence.this.notify();
                 }
@@ -62,7 +63,7 @@
         activeTaskIndex = 0;
 
         while (activeTaskIndex < tasks.getLength()) {
-            Task<V> activeTask = tasks.get(activeTaskIndex);
+            Task<Object> activeTask = (Task<Object>)tasks.get(activeTaskIndex);
             activeTask.execute(taskListener);
 
             try {
@@ -79,14 +80,14 @@
         return null;
     }
 
-    public int add(Task<V> task) {
+    public int add(Task<?> task) {
         int index = tasks.getLength();
         insert(task, index);
 
         return index;
     }
 
-    public synchronized void insert(Task<V> task, int index) {
+    public synchronized void insert(Task<?> task, int index) {
         if (activeTaskIndex != -1) {
             throw new IllegalStateException();
         }
@@ -94,7 +95,7 @@
         tasks.insert(task, index);
     }
 
-    public synchronized Task<V> update(int index, Task<V> task) {
+    public synchronized Task<?> update(int index, Task<?> task) {
         if (activeTaskIndex != -1) {
             throw new IllegalStateException();
         }
@@ -102,7 +103,7 @@
         return tasks.update(index, task);
     }
 
-    public int remove(Task<V> task) {
+    public int remove(Task<?> task) {
         int index = tasks.indexOf(task);
         if (index != -1) {
             tasks.remove(index, 1);
@@ -111,7 +112,7 @@
         return index;
     }
 
-    public synchronized Sequence<Task<V>> remove(int index, int count) {
+    public synchronized Sequence<Task<?>> remove(int index, int count) {
         if (activeTaskIndex != -1) {
             throw new IllegalStateException();
         }
@@ -119,12 +120,11 @@
         return tasks.remove(index, count);
     }
 
-    public Task<V> get(int index) {
+    public Task<?> get(int index) {
         return tasks.get(index);
     }
 
-
-    public int indexOf(Task<V> task) {
+    public int indexOf(Task<?> task) {
         return tasks.indexOf(task);
     }
 
@@ -132,7 +132,7 @@
         return tasks.getLength();
     }
 
-    public Iterator<Task<V>> iterator() {
-        return new ImmutableIterator<Task<V>>(tasks.iterator());
+    public Iterator<Task<?>> iterator() {
+        return new ImmutableIterator<Task<?>>(tasks.iterator());
     }
 }

Modified: incubator/pivot/trunk/core/test/pivot/util/concurrent/test/TaskTest.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/core/test/pivot/util/concurrent/test/TaskTest.java?rev=781060&r1=781059&r2=781060&view=diff
==============================================================================
--- incubator/pivot/trunk/core/test/pivot/util/concurrent/test/TaskTest.java (original)
+++ incubator/pivot/trunk/core/test/pivot/util/concurrent/test/TaskTest.java Tue Jun  2 15:30:09 2009
@@ -16,6 +16,8 @@
  */
 package pivot.util.concurrent.test;
 
+import org.junit.Test;
+
 import pivot.util.concurrent.Task;
 import pivot.util.concurrent.TaskGroup;
 import pivot.util.concurrent.TaskListener;
@@ -50,7 +52,8 @@
         }
     }
 
-    public static void main(String[] args) {
+    @Test
+    public void testTaskSequence() {
         TaskListener<Void> taskListener = new TaskListener<Void>() {
             public synchronized void taskExecuted(Task<Void> task) {
                 System.out.println("EXECUTED");
@@ -63,14 +66,7 @@
             }
         };
 
-        testTaskSequence(taskListener);
-        testTaskGroup(taskListener);
-    }
-
-    private static void testTaskSequence(TaskListener<Void> taskListener) {
-        System.out.println("Testing task sequence");
-
-        TaskSequence<Void> taskSequence = new TaskSequence<Void>();
+        TaskSequence taskSequence = new TaskSequence();
 
         SleepTask task1 = new SleepTask(2000);
         taskSequence.add(task1);
@@ -91,10 +87,21 @@
         }
     }
 
-    private static void testTaskGroup(TaskListener<Void> taskListener) {
-        System.out.println("Testing task group");
+    @Test
+    public void testTaskGroup() {
+        TaskListener<Void> taskListener = new TaskListener<Void>() {
+            public synchronized void taskExecuted(Task<Void> task) {
+                System.out.println("EXECUTED");
+                notify();
+            }
+
+            public synchronized void executeFailed(Task<Void> task) {
+                System.out.println("FAILED: " + task.getFault());
+                notify();
+            }
+        };
 
-        TaskGroup<Void> taskGroup = new TaskGroup<Void>();
+        TaskGroup taskGroup = new TaskGroup();
 
         SleepTask task1 = new SleepTask(2000);
         taskGroup.add(task1);

Modified: incubator/pivot/trunk/web/test/pivot/web/test/WebQueryTestClient.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/web/test/pivot/web/test/WebQueryTestClient.java?rev=781060&r1=781059&r2=781060&view=diff
==============================================================================
--- incubator/pivot/trunk/web/test/pivot/web/test/WebQueryTestClient.java (original)
+++ incubator/pivot/trunk/web/test/pivot/web/test/WebQueryTestClient.java Tue Jun  2 15:30:09 2009
@@ -16,12 +16,15 @@
  */
 package pivot.web.test;
 
-import java.net.URL;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
 
 import pivot.collections.Dictionary;
 import pivot.serialization.BinarySerializer;
 import pivot.serialization.JSONSerializer;
 import pivot.util.concurrent.Task;
+import pivot.util.concurrent.TaskGroup;
 import pivot.util.concurrent.TaskListener;
 import pivot.web.BasicAuthentication;
 import pivot.web.GetQuery;
@@ -38,9 +41,12 @@
     final static int PORT = 8080;
     final static boolean SECURE = false;
 
-    public static void main(String[] args) throws Exception {
+    @Test
+    public void basicTest() {
         final BasicAuthentication authentication = new BasicAuthentication("foo", "bar");
 
+        TaskGroup queryGroup = new TaskGroup();
+
         // GET
         final GetQuery getQuery = new GetQuery(HOSTNAME, PORT, PATH, SECURE);
         getQuery.getParameters().put("a", "b");
@@ -48,11 +54,28 @@
         getQuery.getRequestHeaders().add("bar", "hello");
         getQuery.getRequestHeaders().add("bar", "world");
         authentication.authenticate(getQuery);
+        queryGroup.add(getQuery);
+
+        // POST
+        final PostQuery postQuery = new PostQuery(HOSTNAME, PORT, PATH, SECURE);
+        authentication.authenticate(postQuery);
+        postQuery.setValue(JSONSerializer.parseList("[1, 2, 3]"));
+        queryGroup.add(postQuery);
+
+        // PUT
+        final PutQuery putQuery = new PutQuery(HOSTNAME, PORT, PATH, SECURE);
+        authentication.authenticate(putQuery);
+        putQuery.setValue(JSONSerializer.parseMap("{a:100, b:200, c:300}"));
+        queryGroup.add(putQuery);
 
-        getQuery.execute(new TaskListener<Object>() {
+        // POST
+        final DeleteQuery deleteQuery = new DeleteQuery(HOSTNAME, PORT, PATH, SECURE);
+        authentication.authenticate(deleteQuery);
+        queryGroup.add(deleteQuery);
+
+        queryGroup.execute(new TaskListener<Void>() {
             @SuppressWarnings("unchecked")
-            public void taskExecuted(Task<Object> task) {
-                GetQuery getQuery = (GetQuery)task;
+            public synchronized void taskExecuted(Task<Void> task) {
                 Dictionary<String, Object> result = (Dictionary<String, Object>)getQuery.getResult();
 
                 System.out.println("GET result: "
@@ -71,58 +94,33 @@
 
                     System.out.print("\n");
                 }
-            }
-
-            public void executeFailed(Task<Object> task) {
-                System.out.println("GET fault: " + task.getFault());
-            }
-        });
-
-        // POST
-        PostQuery postQuery = new PostQuery(HOSTNAME, PORT, PATH, SECURE);
-        authentication.authenticate(postQuery);
-        postQuery.setValue(JSONSerializer.parseList("[1, 2, 3]"));
+                System.out.println("GET fault: " + getQuery.getFault());
 
-        postQuery.execute(new TaskListener<URL>() {
-            public void taskExecuted(Task<URL> task) {
                 System.out.println("POST result: " + task.getResult());
-            }
-
-            public void executeFailed(Task<URL> task) {
-                System.out.println("POST fault: " + task.getFault());
-            }
-        });
-
-        // PUT
-        PutQuery putQuery = new PutQuery(HOSTNAME, PORT, PATH, SECURE);
-        authentication.authenticate(putQuery);
-        putQuery.setValue(JSONSerializer.parseMap("{a:100, b:200, c:300}"));
+                System.out.println("POST fault: " + postQuery.getFault());
 
-        putQuery.execute(new TaskListener<Void>() {
-            public void taskExecuted(Task<Void> task) {
-                System.out.println("PUT result");
+                System.out.println("PUT fault: " + putQuery.getFault());
+                System.out.println("DELETE fault: " + deleteQuery.getFault());
             }
 
-            public void executeFailed(Task<Void> task) {
-                System.out.println("PUT fault: " + task.getFault());
+            public synchronized void executeFailed(Task<Void> task) {
+                // No-op; task groups don't fail
             }
         });
 
-        // POST
-        DeleteQuery deleteQuery = new DeleteQuery(HOSTNAME, PORT, PATH, SECURE);
-        authentication.authenticate(deleteQuery);
-
-        deleteQuery.execute(new TaskListener<Void>() {
-            public void taskExecuted(Task<Void> task) {
-                System.out.println("DELETE result");
-            }
-
-            public void executeFailed(Task<Void> task) {
-                System.out.println("DELETE fault: " + task.getFault());
+        synchronized(queryGroup) {
+            if (queryGroup.isPending()) {
+                try {
+                    queryGroup.wait(10000);
+                } catch(InterruptedException exception) {
+                    throw new RuntimeException(exception);
+                }
             }
-        });
+        }
 
-        // HACK - wait for all requests to complete
-        Thread.sleep(3000);
+        assertTrue(getQuery.getFault() == null
+            && postQuery.getFault() == null
+            && putQuery.getFault() == null
+            && deleteQuery.getFault() == null);
     }
 }