[seam-commits] Seam SVN: r10675 - in branches/community/Seam_2_1/examples: tasks and 13 other directories.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Tue Apr 28 07:35:20 EDT 2009


Author: jharting
Date: 2009-04-28 07:35:20 -0400 (Tue, 28 Apr 2009)
New Revision: 10675

Added:
   branches/community/Seam_2_1/examples/tasks/
   branches/community/Seam_2_1/examples/tasks/build.xml
   branches/community/Seam_2_1/examples/tasks/resources/
   branches/community/Seam_2_1/examples/tasks/resources/components.properties
   branches/community/Seam_2_1/examples/tasks/resources/import.sql
   branches/community/Seam_2_1/examples/tasks/resources/jboss-seam-tasks-ds.xml
   branches/community/Seam_2_1/examples/tasks/resources/seam.properties
   branches/community/Seam_2_1/examples/tasks/src/
   branches/community/Seam_2_1/examples/tasks/src/main/
   branches/community/Seam_2_1/examples/tasks/src/main/org/
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/Authenticator.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/ContextHome.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/ResourceNotFoundException.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/TaskHome.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/UserHome.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/Context.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/Task.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/User.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/ContextResource.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/ResolvedTaskResourceQuery.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/TaskResourceHome.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/TaskResourceQuery.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/UserResourceHome.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/ContextResourceTest.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/ResolvedTaskResourceQueryTest.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/TaskResourceTest.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/UserFactory.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/DelegatingServletInputStream.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/DelegatingServletOutputStream.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/HeaderValueHolder.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockHttpServletRequest.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockHttpServletResponse.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockRequestDispatcher.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/ResourceSeamTest.java
   branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/testng.xml
   branches/community/Seam_2_1/examples/tasks/view/
   branches/community/Seam_2_1/examples/tasks/view/seam-tasks-client.js
Log:
seam tasks example server part

Added: branches/community/Seam_2_1/examples/tasks/build.xml
===================================================================
--- branches/community/Seam_2_1/examples/tasks/build.xml	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/build.xml	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+
+<project name="Tasks" default="deploy" basedir=".">
+
+    <!-- Naming -->
+    <property name="Name"                   value="JBoss Tasks Example"/>
+    <property name="example.name"           value="jboss-seam-tasks"/>
+	
+    <!-- Libraries to include -->
+    <property name="seam.ui.lib"    value="yes"/>
+    <property name="seam.debug.lib" value="yes"/>
+    <property name="facelets.lib"   value="yes"/>
+    <!--<property name="richfaces.lib"   value="yes"/>-->
+    <property name="seam.resteasy.lib"   value="yes"/>
+	
+	<!-- Datasource -->
+    <property name="example.ds"             value="jboss-seam-tasks-ds.xml"/>
+    
+    <import file="../build.xml"/>
+</project>


Property changes on: branches/community/Seam_2_1/examples/tasks/build.xml
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/resources/components.properties
===================================================================
--- branches/community/Seam_2_1/examples/tasks/resources/components.properties	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/resources/components.properties	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,3 @@
+# The pattern in components.xml is replaced by an application server specific value in the ant build. This value is used for running tests
+
+jndiPattern \#{ejbName}/local


Property changes on: branches/community/Seam_2_1/examples/tasks/resources/components.properties
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/resources/import.sql
===================================================================
--- branches/community/Seam_2_1/examples/tasks/resources/import.sql	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/resources/import.sql	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,20 @@
+insert into User (username, password, admin) values ('demo', 'demo', false)
+insert into User (username, password, admin) values ('admin', 'password', true)
+insert into Context (id, name, owner_username) values (1, 'School', 'demo')
+	insert into Task (id, name, resolved, created, updated, context_id) values (2, 'Build the Turing machine', false, '2009-04-19 16:11:05', null, 1)
+	insert into Task (id, name, resolved, created, updated, context_id) values (3, 'Finish the RESTEasy-Seam integration example', false, '2009-04-19 16:11:05', null, 1)
+	insert into Task (id, name, resolved, created, updated, context_id) values (4, 'Learn new vocab for English conversations', false, '2009-04-19 16:11:05', null, 1)
+	insert into Task (id, name, resolved, created, updated, context_id) values (5, 'Prepare a presentation for webdesign seminar', false, '2009-04-19 16:11:05', null, 1)
+
+insert into Context (id, name, owner_username) values (2, 'Work', 'demo')
+	insert into Task (id, name, resolved, created, updated, context_id) values (6, 'Pick up meal tickets', false, '2009-04-19 16:11:05', null, 2)
+insert into Context (id, name, owner_username) values (3, 'Buy', 'demo')
+	insert into Task (id, name, resolved, created, updated, context_id) values (7, 'Buy milk', false, '2009-04-19 16:11:05', null, 3)
+	insert into Task (id, name, resolved, created, updated, context_id) values (8, 'Buy an infinite tape', false, '2009-04-19 16:11:05', null, 3)
+	insert into Task (id, name, resolved, created, updated, context_id) values (9, 'Order books', false, '2009-04-19 16:11:05', null, 3)
+	insert into Task (id, name, resolved, created, updated, context_id) values (10, 'Buy a turtle', true, '2009-04-19 16:11:05', '2009-04-22 13:15:33', 3)
+insert into Context (id, name, owner_username) values (4, 'Other stuff', 'demo')
+	insert into Task (id, name, resolved, created, updated, context_id) values (11, 'Learn to fly', false, '2009-04-19 16:11:05', null, 4)
+	insert into Task (id, name, resolved, created, updated, context_id) values (12, 'Visit grandma', false, '2009-04-19 16:11:05', null, 4)
+	insert into Task (id, name, resolved, created, updated, context_id) values (13, 'Extend passport', false, '2009-04-19 16:11:05', null, 4)
+	insert into Task (id, name, resolved, created, updated, context_id) values (14, 'Get a haircut', false, '2009-04-19 16:11:05', null, 4)

Added: branches/community/Seam_2_1/examples/tasks/resources/jboss-seam-tasks-ds.xml
===================================================================
--- branches/community/Seam_2_1/examples/tasks/resources/jboss-seam-tasks-ds.xml	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/resources/jboss-seam-tasks-ds.xml	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE datasources
+    PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
+    "http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">
+
+<datasources>
+    <local-tx-datasource>
+        <jndi-name>tasksDatasource</jndi-name>
+        <connection-url>jdbc:hsqldb:.</connection-url>
+        <driver-class>org.hsqldb.jdbcDriver</driver-class>
+        <user-name>sa</user-name>
+        <password></password>
+    </local-tx-datasource>
+</datasources>
+


Property changes on: branches/community/Seam_2_1/examples/tasks/resources/jboss-seam-tasks-ds.xml
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/resources/seam.properties
===================================================================


Property changes on: branches/community/Seam_2_1/examples/tasks/resources/seam.properties
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/Authenticator.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/Authenticator.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/Authenticator.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,51 @@
+package org.jboss.seam.example.tasks;
+
+import javax.persistence.EntityManager;
+
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Out;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.example.tasks.entity.User;
+import org.jboss.seam.security.Credentials;
+import org.jboss.seam.security.Identity;
+
+/**
+ * Application authenticator. User is added to admin role if the admin property
+ * is set to true.
+ * 
+ * @author Jozef Hartinger
+ * 
+ */
+ at Name("authenticator")
+ at Scope(ScopeType.EVENT)
+public class Authenticator
+{
+
+   @In
+   private Identity identity;
+   @In
+   private Credentials credentials;
+   @In
+   private EntityManager entityManager;
+   @Out(scope = ScopeType.SESSION)
+   private User user;
+
+   public boolean authenticate()
+   {
+      user = entityManager.find(User.class, credentials.getUsername());
+      if ((user != null) || (user.getPassword().equals(credentials.getPassword())))
+      {
+         if (user.isAdmin())
+         {
+            identity.addRole("admin");
+         }
+         return true;
+      }
+      else
+      {
+         return false;
+      }
+   }
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/Authenticator.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/ContextHome.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/ContextHome.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/ContextHome.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,19 @@
+package org.jboss.seam.example.tasks;
+
+import org.jboss.seam.annotations.AutoCreate;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.example.tasks.entity.Context;
+import org.jboss.seam.framework.EntityHome;
+
+ at Name("contextHome")
+ at AutoCreate
+public class ContextHome extends EntityHome<Context>
+{
+
+   public Context findByUsernameAndContext(String username, String context)
+   {
+      setInstance((Context) getEntityManager().createNamedQuery("contextByNameAndUser").setParameter("username", username).setParameter("context", context).getSingleResult());
+      return getInstance();
+   }
+
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/ContextHome.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/ResourceNotFoundException.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/ResourceNotFoundException.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/ResourceNotFoundException.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,20 @@
+package org.jboss.seam.example.tasks;
+
+/**
+ * This exception is mapped to 404 HTTP response code.
+ * @author Jozef Hartinger
+ *
+ */
+public class ResourceNotFoundException extends RuntimeException
+{
+
+   public ResourceNotFoundException()
+   {
+   }
+
+   public ResourceNotFoundException(String message)
+   {
+      super(message);
+   }
+
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/ResourceNotFoundException.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/TaskHome.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/TaskHome.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/TaskHome.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,17 @@
+package org.jboss.seam.example.tasks;
+
+import org.jboss.seam.annotations.AutoCreate;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.example.tasks.entity.Task;
+import org.jboss.seam.framework.EntityHome;
+
+ at Name("taskHome")
+ at AutoCreate
+public class TaskHome extends EntityHome<Task>
+{
+   public Task findTask(Long context, String task) {
+      setInstance((Task) getEntityManager().createNamedQuery("taskByNameAndContext").setParameter("task", task).setParameter("context", context).getSingleResult());
+      return getInstance();
+   }
+   
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/TaskHome.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/UserHome.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/UserHome.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/UserHome.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,13 @@
+package org.jboss.seam.example.tasks;
+
+import org.jboss.seam.annotations.AutoCreate;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.example.tasks.entity.User;
+import org.jboss.seam.framework.EntityHome;
+
+ at Name("userHome")
+ at AutoCreate
+public class UserHome extends EntityHome<User>
+{
+
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/UserHome.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/Context.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/Context.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/Context.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,90 @@
+package org.jboss.seam.example.tasks.entity;
+
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.hibernate.validator.NotNull;
+
+ at Entity
+ at XmlRootElement
+ at Table(uniqueConstraints = @UniqueConstraint(columnNames = { "NAME", "OWNER_USERNAME" }))
+ at NamedQuery(name = "contextByNameAndUser", query = "select context from Context context where context.owner.username like :username and context.name like :context")
+public class Context
+{
+   private Long id;
+   private String name;
+   private List<Task> tasks;
+   private User owner;
+
+   public Context()
+   {
+   }
+
+   public Context(Long id, String name, List<Task> tasks, User owner)
+   {
+      this.id = id;
+      this.name = name;
+      this.tasks = tasks;
+      this.owner = owner;
+   }
+
+   @Id
+   @GeneratedValue
+   @XmlTransient
+   public Long getId()
+   {
+      return id;
+   }
+
+   public void setId(Long id)
+   {
+      this.id = id;
+   }
+
+   @NotNull
+   public String getName()
+   {
+      return name;
+   }
+
+   public void setName(String name)
+   {
+      this.name = name;
+   }
+
+   @OneToMany(mappedBy = "context", cascade = CascadeType.REMOVE)
+   @XmlTransient
+   public List<Task> getTasks()
+   {
+      return tasks;
+   }
+
+   public void setTasks(List<Task> tasks)
+   {
+      this.tasks = tasks;
+   }
+
+   @ManyToOne
+   @XmlTransient
+   public User getOwner()
+   {
+      return owner;
+   }
+
+   public void setOwner(User owner)
+   {
+      this.owner = owner;
+   }
+
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/Context.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/Task.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/Task.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/Task.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,114 @@
+package org.jboss.seam.example.tasks.entity;
+
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQuery;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.hibernate.validator.NotNull;
+
+ at Entity
+ at XmlRootElement
+ at NamedQuery(name="taskByNameAndContext", query="select task from Task task where task.name like :task and task.context.id = :context")
+public class Task
+{
+   private Long id;
+   private String name;
+   private boolean resolved;
+   private Date created;
+   private Date updated;
+   private Context context;
+
+   @Id
+   @GeneratedValue
+   public Long getId()
+   {
+      return id;
+   }
+
+   public void setId(Long id)
+   {
+      this.id = id;
+   }
+
+   @NotNull
+   public String getName()
+   {
+      return name;
+   }
+
+   public void setName(String name)
+   {
+      this.name = name;
+   }
+
+   @NotNull
+   public boolean isResolved()
+   {
+      return resolved;
+   }
+
+   public void setResolved(boolean resolved)
+   {
+      this.resolved = resolved;
+   }
+
+   @Temporal(TemporalType.TIMESTAMP)
+   @XmlElement(name="created")
+   @NotNull
+   public Date getCreated()
+   {
+      return created;
+   }
+
+   public void setCreated(Date created)
+   {
+      this.created = created;
+   }
+
+   @Temporal(TemporalType.TIMESTAMP)
+   public Date getUpdated()
+   {
+      return updated;
+   }
+
+   public void setUpdated(Date updated)
+   {
+      this.updated = updated;
+   }
+
+   @ManyToOne
+   @XmlTransient
+   @NotNull
+   public Context getContext()
+   {
+      return context;
+   }
+   
+
+   public void setContext(Context context)
+   {
+      this.context = context;
+   }
+   
+   @Transient
+   @XmlElement(name="context")
+   public String getContextName() {
+      return context.getName();
+   }
+   
+   @Transient
+   public User getOwner() {
+      return context.getOwner();
+   }
+   
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/Task.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/User.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/User.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/User.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,65 @@
+package org.jboss.seam.example.tasks.entity;
+
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.hibernate.validator.NotNull;
+
+ at Entity
+ at XmlRootElement
+public class User
+{
+   private String username;
+   private String password;
+   private List<Context> contexts;
+   private boolean admin;
+
+   @Id
+   public String getUsername()
+   {
+      return username;
+   }
+
+   public void setUsername(String username)
+   {
+      this.username = username;
+   }
+
+   @NotNull
+   public String getPassword()
+   {
+      return password;
+   }
+
+   public void setPassword(String password)
+   {
+      this.password = password;
+   }
+
+   @OneToMany(mappedBy = "owner")
+   @XmlTransient
+   public List<Context> getContexts()
+   {
+      return contexts;
+   }
+
+   public void setContexts(List<Context> contexts)
+   {
+      this.contexts = contexts;
+   }
+
+   public boolean isAdmin()
+   {
+      return admin;
+   }
+
+   public void setAdmin(boolean admin)
+   {
+      this.admin = admin;
+   }
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/entity/User.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/ContextResource.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/ContextResource.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/ContextResource.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,91 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.example.tasks.resource;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.example.tasks.ContextHome;
+import org.jboss.seam.example.tasks.entity.User;
+
+/**
+ * This resource demonstrates use of plain JAX-RS resource (no ResourceHome
+ * component) with Seam. It allows retrieving (GET), creating (PUT) and deleting
+ * (DELETE) of task contexts. To create new context, simply send a PUT request
+ * without entity body to /auth/context/name where "name" is the name of
+ * context. Same path applies for retrieving and deleting of context.
+ * 
+ * @author Jozef Hartinger
+ * 
+ */
+
+ at Path("/auth/context/{context}")
+ at Name("contextResource")
+ at Produces( { "application/xml", "application/json", "application/fastinfoset" })
+ at Consumes( { "application/xml", "application/json", "application/fastinfoset" })
+public class ContextResource
+{
+   @In
+   private ContextHome contextHome;
+
+   @javax.ws.rs.core.Context
+   private UriInfo uriInfo;
+
+   @In
+   private User user;
+
+   @PathParam("context")
+   private String context;
+
+   @GET
+   public Response getContext()
+   {
+      return Response.ok(contextHome.findByUsernameAndContext(user.getUsername(), context)).build();
+   }
+
+   @PUT
+   public Response putContext()
+   {
+      contextHome.getInstance().setName(context);
+      contextHome.getInstance().setOwner(user);
+      // may cause exception if user already has a Context with that name
+      // in that case the exception is handled by exception mapper
+      contextHome.persist();
+      return Response.created(uriInfo.getAbsolutePath()).build();
+   }
+
+   @DELETE
+   public void deleteContext()
+   {
+      contextHome.findByUsernameAndContext(user.getUsername(), context);
+      contextHome.remove();
+   }
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/ContextResource.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/ResolvedTaskResourceQuery.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/ResolvedTaskResourceQuery.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/ResolvedTaskResourceQuery.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,111 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.example.tasks.resource;
+
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+
+import org.jboss.resteasy.plugins.providers.atom.Entry;
+import org.jboss.resteasy.plugins.providers.atom.Feed;
+import org.jboss.resteasy.plugins.providers.atom.Person;
+import org.jboss.seam.annotations.Create;
+import org.jboss.seam.annotations.Factory;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.example.tasks.ResourceNotFoundException;
+import org.jboss.seam.example.tasks.entity.Task;
+import org.jboss.seam.resteasy.ResourceQuery;
+
+/**
+ * This resource exposes a list of resolved tasks for a particular user using
+ * ResourceQuery component. This list is available publicly without
+ * authentication needed. The list can be marshalled to XML, JSON, Fastinfoset.
+ * ResourceQuery component is extended in order to provide Atom feed.
+ * 
+ * @author Jozef Hartinger
+ * 
+ */
+ at Name("resolvedTaskResourceQuery")
+ at Path("/user/{username}/tasks/resolved")
+public class ResolvedTaskResourceQuery extends ResourceQuery<Task>
+{
+
+   @PathParam("username")
+   private String username;
+
+   public ResolvedTaskResourceQuery()
+   {
+      setMediaTypes(new String[] { "application/xml", "application/json", "application/fastinfoset" });
+   }
+
+   @Override
+   @Create
+   public void create()
+   {
+      super.create();
+      List<String> restrictions = new ArrayList<String>();
+      restrictions.add("context.owner.username = #{username} AND resolved = true");
+      getEntityQuery().setRestrictionExpressionStrings(restrictions);
+      getEntityQuery().setOrderColumn("updated");
+      getEntityQuery().setOrderDirection("desc");
+   }
+
+   @Produces("application/atom+xml")
+   @GET
+   public Feed getFeed() throws URISyntaxException
+   {
+      List<Task> tasks = getEntityList(0, 0);
+      if (tasks.size() == 0)
+      {
+         // TODO make difference between empty list and nonsense user
+         throw new ResourceNotFoundException();
+      }
+
+      Feed feed = new Feed();
+      feed.setTitle("Resolved feeds for " + username);
+      feed.getAuthors().add(new Person(username));
+      feed.setUpdated(new Date(0));
+
+      for (Task task : tasks)
+      {
+         Entry entry = new Entry();
+         entry.setTitle(task.getName());
+         entry.setSummary(task.getName());
+         entry.setPublished(task.getCreated());
+         entry.setUpdated(task.getUpdated());
+         feed.getEntries().add(entry);
+      }
+      return feed;
+   }
+
+   @Factory("username")
+   public String getUsername()
+   {
+      return username;
+   }
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/ResolvedTaskResourceQuery.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/TaskResourceHome.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/TaskResourceHome.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/TaskResourceHome.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,145 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.example.tasks.resource;
+
+import java.io.InputStream;
+import java.util.Date;
+
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.Response;
+
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.example.tasks.ContextHome;
+import org.jboss.seam.example.tasks.ResourceNotFoundException;
+import org.jboss.seam.example.tasks.TaskHome;
+import org.jboss.seam.example.tasks.entity.Task;
+import org.jboss.seam.example.tasks.entity.User;
+import org.jboss.seam.framework.Home;
+import org.jboss.seam.resteasy.ResourceHome;
+
+/**
+ * This class exposes CRUD interface for manipulating tasks. ResourceHome
+ * component is used as the base and is significantly customized to correspond
+ * with usecase.
+ * 
+ * @author Jozef Hartinger
+ * 
+ */
+ at Path("/auth/context/{context}/{status}")
+ at Name("taskResourceHome")
+public class TaskResourceHome extends ResourceHome<Task, Long>
+{
+
+   @PathParam("status")
+   private String taskStatus;
+   @In
+   private User user;
+   @In
+   private ContextHome contextHome;
+   @In
+   private TaskHome taskHome;
+   @PathParam("context")
+   private String contextName;
+
+   public TaskResourceHome()
+   {
+      setMediaTypes(new String[] { "application/xml", "application/json", "application/fastinfoset" });
+   }
+
+   @Override
+   public Task getEntity(Long id)
+   {
+      Task task = super.getEntity(id);
+      if (!task.getContext().getName().equals(contextName) || !task.getOwner().getUsername().equals(user.getUsername()))
+      {
+         throw new ResourceNotFoundException("Task not found");
+      }
+      if (!task.isResolved() == isResolved())
+      {
+         throw new ResourceNotFoundException("Task found, but in different state.");
+      }
+      return task;
+   }
+
+   @Override
+   @POST
+   public Response createResource(InputStream messageBody)
+   {
+      if (isResolved())
+      {
+         // do not allow creating already resolved tasks
+         return Response.status(405).build();
+      }
+      return super.createResource(messageBody);
+   }
+
+   @Override
+   public Long createEntity(Task entity)
+   {
+      entity.setContext(contextHome.findByUsernameAndContext(user.getUsername(), contextName));
+      entity.setResolved(false);
+      entity.setCreated(new Date());
+      return super.createEntity(entity);
+   }
+
+   @Override
+   public void updateEntity(Task entity, Long id)
+   {
+      Task task = super.getEntity(id);
+      task.setContext(contextHome.findByUsernameAndContext(user.getUsername(), contextName));
+      task.setResolved(isResolved());
+      if (entity.getName() != null)
+      {
+         task.setName(entity.getName());
+      }
+      if (isResolved())
+      {
+         task.setUpdated(new Date());
+      }
+      taskHome.update();
+   }
+
+   @Override
+   public Home<?, Task> getEntityHome()
+   {
+      return taskHome;
+   }
+
+   private boolean isResolved()
+   {
+      if (taskStatus.equals("resolved"))
+      {
+         return true;
+      }
+      else if (taskStatus.equals("unresolved"))
+      {
+         return false;
+      }
+      else
+      {
+         throw new ResourceNotFoundException();
+      }
+   }
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/TaskResourceHome.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/TaskResourceQuery.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/TaskResourceQuery.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/TaskResourceQuery.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,95 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.example.tasks.resource;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+
+import org.jboss.seam.annotations.Create;
+import org.jboss.seam.annotations.Factory;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.example.tasks.ResourceNotFoundException;
+import org.jboss.seam.example.tasks.entity.Task;
+import org.jboss.seam.resteasy.ResourceQuery;
+
+/**
+ * This class exposes two lists of tasks for every context. Unresolved tasks can
+ * be obtained by sending HTTP GET request to context/{context}/unresolved URI.
+ * To obtain a list of already resolved tasks, use context/{context}/resolved
+ * URI.
+ * 
+ * @author Jozef Hartinger
+ * 
+ */
+ at Name("taskResourceQuery")
+ at Path("/auth/context/{context}/{status}")
+public class TaskResourceQuery extends ResourceQuery<Task>
+{
+
+   @PathParam("context")
+   private String contextName;
+   @PathParam("status")
+   private String taskStatus;
+
+   public TaskResourceQuery()
+   {
+      setMediaTypes(new String[] { "application/xml", "application/json", "application/fastinfoset" });
+   }
+
+   @Override
+   @Create
+   public void create()
+   {
+      super.create();
+      List<String> restrictions = new ArrayList<String>();
+      restrictions.add("context.name = #{contextName}");
+      restrictions.add("resolved = #{taskStatus}");
+      restrictions.add("context.owner.username = #{user.username}");
+      getEntityQuery().setRestrictionExpressionStrings(restrictions);
+   }
+
+   @Factory("contextName")
+   public String getContextName()
+   {
+      return contextName;
+   }
+
+   @Factory("taskStatus")
+   public boolean isResolved()
+   {
+      if (taskStatus.equals("resolved"))
+      {
+         return true;
+      }
+      else if (taskStatus.equals("unresolved"))
+      {
+         return false;
+      }
+      else
+      {
+         throw new ResourceNotFoundException();
+      }
+   }
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/TaskResourceQuery.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/UserResourceHome.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/UserResourceHome.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/UserResourceHome.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.example.tasks.resource;
+
+import javax.ws.rs.Path;
+
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.security.Admin;
+import org.jboss.seam.example.tasks.UserHome;
+import org.jboss.seam.example.tasks.entity.User;
+import org.jboss.seam.framework.EntityHome;
+import org.jboss.seam.resteasy.ResourceHome;
+
+/**
+ * This resource demonstrates use of ResourceHome component together with Seam
+ * security. This resource exposes user management as a web service, howeve only
+ * users with admin permission are allowed to access it.
+ * 
+ * @author Jozef Hartinger
+ * 
+ */
+ at Path("/auth/user")
+ at Name("userResourceHome")
+ at Admin
+public class UserResourceHome extends ResourceHome<User, String>
+{
+
+   public UserResourceHome()
+   {
+      setMediaTypes(new String[] { "application/xml", "application/json", "application/fastinfoset" });
+   }
+
+   @In
+   private UserHome userHome;
+
+   @Override
+   public EntityHome getEntityHome()
+   {
+      return userHome;
+   }
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/resource/UserResourceHome.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/ContextResourceTest.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/ContextResourceTest.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/ContextResourceTest.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,168 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.example.tasks.test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import org.jboss.seam.example.tasks.test.fwk.MockHttpServletRequest;
+import org.jboss.seam.example.tasks.test.fwk.MockHttpServletResponse;
+import org.jboss.seam.example.tasks.test.fwk.ResourceSeamTest;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+/**
+ * Test class for /context part of API
+ * @author Jozef Hartinger
+ *
+ */
+public class ContextResourceTest extends ResourceSeamTest
+{
+   @DataProvider(name = "query")
+   public String[][] getQueryData()
+   {
+      return new String[][] { new String[] { "application/xml", "<context><name>School</name></context>" }, new String[] { "application/json", "{\"context\":{\"name\":\"School\"}}" } };
+   }
+
+   @Test(dataProvider = "query")
+   public void getContextListTest(final String contentType, final String expectedResponse) throws Exception
+   {
+      new ResourceRequest(Method.GET, "/v1/auth/context")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Accept", contentType);
+            request.addHeader("Authorization", "BASIC ZGVtbzpkZW1v"); // demo:demo
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 200, "Unexpected response code.");
+            assertTrue(response.getContentAsString().contains(expectedResponse), "Unexpected response.");
+         }
+
+      }.run();
+   }
+
+   @Test
+   public void deleteContextTest() throws Exception
+   {
+      new ResourceRequest(Method.DELETE, "/v1/auth/context/Work")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Accept", "application/xml");
+            request.addHeader("Authorization", "BASIC ZGVtbzpkZW1v"); // demo:demo
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 204, "Unexpected response code.");
+         }
+
+      }.run();
+   }
+
+   @Test
+   public void createContextTest() throws Exception
+   {
+      
+      final String uri = "/v1/auth/context/Test%20Context";
+      final String mimeType = "application/json";
+      final String expectedResponse = "{\"context\":{\"name\":\"Test Context\"}}";
+      
+      new ResourceRequest(Method.PUT, uri)
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Authorization", "BASIC ZGVtbzpkZW1v"); // demo:demo
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 201, "Unexpected response code.");
+         }
+
+      }.run();
+
+      new ResourceRequest(Method.GET, uri)
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Accept", mimeType);
+            request.addHeader("Authorization", "BASIC ZGVtbzpkZW1v"); // demo:demo
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 200, "Unexpected response code.");
+            assertEquals(response.getContentAsString(), expectedResponse, "Unexpected response.");
+         }
+
+      }.run();
+   }
+
+   // @Test
+   // TODO uncomment once JBSEAM-4152 is resolved
+   public void noAuthorizationHeaderTest() throws Exception
+   {
+      new ResourceRequest(Method.GET, "/v1/auth/context")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Accept", "application/xml");
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 401, "Unexpected response code.");
+         }
+
+      }.run();
+   }
+
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/ContextResourceTest.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/ResolvedTaskResourceQueryTest.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/ResolvedTaskResourceQueryTest.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/ResolvedTaskResourceQueryTest.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,103 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.example.tasks.test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import org.jboss.seam.example.tasks.test.fwk.MockHttpServletRequest;
+import org.jboss.seam.example.tasks.test.fwk.MockHttpServletResponse;
+import org.jboss.seam.example.tasks.test.fwk.ResourceSeamTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+/**
+ * Test class for /user/{username}/tasks/resolved part of API.
+ * @author Jozef Hartinger
+ *
+ */
+public class ResolvedTaskResourceQueryTest extends ResourceSeamTest
+{
+   
+   @BeforeClass
+   public void resolveTask() throws Exception {
+      
+      final String mimeType = "application/xml";
+      final String representation = "<task><id>14</id></task>";
+      
+      new ResourceRequest(Method.PUT, "/v1/auth/context/School/resolved/14")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Authorization", "BASIC ZGVtbzpkZW1v"); // demo:demo
+            request.addHeader("Content-Type", mimeType);
+            request.setContentType(mimeType);
+            request.setContent(representation.getBytes());
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 204, "Unexpected response code.");
+         }
+
+      }.run();
+   }
+   
+   @DataProvider(name="data")
+   public String[][] getData() {
+      return new String[][] {
+            new String[] {"application/xml", "<name>Get a haircut</name>"},
+            new String[] {"application/json", "\"name\":\"Get a haircut\""},
+            new String[] {"application/atom+xml", "<atom:title>Get a haircut</atom:title>"}
+      };
+   }
+   
+   @Test(dataProvider="data")
+   public void editTaskTest(final String mimeType, final String expectedResponsePart) throws Exception
+   {
+      new ResourceRequest(Method.GET, "/v1/user/demo/tasks/resolved")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Accept", mimeType);
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 200, "Unexpected response code.");
+            assertTrue(response.getContentAsString().contains(expectedResponsePart), "Unexpected response.");
+         }
+
+      }.run();
+   }
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/ResolvedTaskResourceQueryTest.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/TaskResourceTest.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/TaskResourceTest.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/TaskResourceTest.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,140 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.example.tasks.test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import org.jboss.seam.example.tasks.test.fwk.ResourceSeamTest;
+import org.jboss.seam.example.tasks.test.fwk.MockHttpServletRequest;
+import org.jboss.seam.example.tasks.test.fwk.MockHttpServletResponse;
+import org.testng.annotations.Test;
+
+/**
+ * Test class for TaskResourceHome and TaskResourceQuery components.
+ * @author Jozef Hartinger
+ *
+ */
+public class TaskResourceTest extends ResourceSeamTest
+{
+   @Test
+   public void createTaskTest() throws Exception
+   {
+      final String mimeType = "application/json";
+      final String representation = "{\"task\":{\"name\":\"Test task\"}}";
+      
+      new ResourceRequest(Method.POST, "/v1/auth/context/School/unresolved")
+      {
+         
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Authorization", "BASIC ZGVtbzpkZW1v"); // demo:demo
+            request.addHeader("Content-Type", mimeType);
+            request.setContentType(mimeType);
+            request.setContent(representation.getBytes());
+         }
+         
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 201, "Unexpected response code.");
+         }
+         
+      }.run();
+   }
+
+   @Test
+   public void editTaskTest() throws Exception
+   {
+      final String mimeType = "application/xml";
+      final String representation = "<task><id>4</id><name>Learn new English vocabulary</name></task>";
+
+      new ResourceRequest(Method.PUT, "/v1/auth/context/School/unresolved/4")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Authorization", "BASIC ZGVtbzpkZW1v"); // demo:demo
+            request.addHeader("Content-Type", mimeType);
+            request.setContentType(mimeType);
+            request.setContent(representation.getBytes());
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 204, "Unexpected response code.");
+         }
+
+      }.run();
+
+      new ResourceRequest(Method.GET, "/v1/auth/context/School/unresolved/4")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Accept", "application/xml");
+            request.addHeader("Authorization", "BASIC ZGVtbzpkZW1v"); // demo:demo
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 200, "Unexpected response code.");
+            assertTrue(response.getContentAsString().contains("Learn new English vocabulary"), "Unexpected response.");
+         }
+
+      }.run();
+   }
+   
+   @Test
+   public void deleteTaskTest() throws Exception
+   {
+      new ResourceRequest(Method.DELETE, "/v1/auth/context/School/unresolved/2")
+      {
+         
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Authorization", "BASIC ZGVtbzpkZW1v"); // demo:demo
+         }
+         
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 204, "Unexpected response code.");
+         }
+         
+      }.run();
+   }
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/TaskResourceTest.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/UserFactory.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/UserFactory.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/UserFactory.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,27 @@
+package org.jboss.seam.example.tasks.test;
+
+import org.jboss.seam.annotations.Factory;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.example.tasks.UserHome;
+import org.jboss.seam.example.tasks.entity.User;
+
+/**
+ * Ugly hack that allows the tests tu run until JBSEAM-4152 is resolved.
+ * @author Jozef Hartinger
+ *
+ */
+
+ at Name("userFactory")
+public class UserFactory
+{
+
+   @In private UserHome userHome;
+   
+   @Factory(autoCreate=true, value="user")
+   public User getDemo() {
+      userHome.setId("demo");
+      return userHome.find();
+   }
+   
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/UserFactory.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/DelegatingServletInputStream.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/DelegatingServletInputStream.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/DelegatingServletInputStream.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.example.tasks.test.fwk;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.servlet.ServletInputStream;
+
+/**
+ * Delegating implementation of {@link javax.servlet.ServletInputStream}.
+ *
+ * <p>Used by {@link MockHttpServletRequest}; typically not directly
+ * used for testing application controllers.
+ *
+ * @author Juergen Hoeller
+ * @since 1.0.2
+ * @see MockHttpServletRequest
+ */
+public class DelegatingServletInputStream extends ServletInputStream {
+
+	private final InputStream sourceStream;
+
+
+	/**
+	 * Create a DelegatingServletInputStream for the given source stream.
+	 * @param sourceStream the source stream (never <code>null</code>)
+	 */
+	public DelegatingServletInputStream(InputStream sourceStream) {
+		this.sourceStream = sourceStream;
+	}
+
+	/**
+	 * Return the underlying source stream (never <code>null</code>).
+	 */
+	public final InputStream getSourceStream() {
+		return this.sourceStream;
+	}
+
+
+	public int read() throws IOException {
+		return this.sourceStream.read();
+	}
+
+	public void close() throws IOException {
+		super.close();
+		this.sourceStream.close();
+	}
+
+}
\ No newline at end of file


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/DelegatingServletInputStream.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/DelegatingServletOutputStream.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/DelegatingServletOutputStream.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/DelegatingServletOutputStream.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.example.tasks.test.fwk;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import javax.servlet.ServletOutputStream;
+
+
+/**
+ * Delegating implementation of {@link javax.servlet.ServletOutputStream}.
+ * <p/>
+ * <p>Used by {@link org.jboss.seam.example.restbay.test.fwk.MockHttpServletResponse}; typically not directly
+ * used for testing application controllers.
+ *
+ * @author Juergen Hoeller
+ * @see org.jboss.seam.example.restbay.test.fwk.MockHttpServletResponse
+ * @since 1.0.2
+ */
+public class DelegatingServletOutputStream extends ServletOutputStream
+{
+
+   private final OutputStream targetStream;
+
+
+   /**
+    * Create a DelegatingServletOutputStream for the given target stream.
+    *
+    * @param targetStream the target stream (never <code>null</code>)
+    */
+   public DelegatingServletOutputStream(OutputStream targetStream)
+   {
+      this.targetStream = targetStream;
+   }
+
+   /**
+    * Return the underlying target stream (never <code>null</code>).
+    */
+   public final OutputStream getTargetStream()
+   {
+      return this.targetStream;
+   }
+
+
+   public void write(int b) throws IOException
+   {
+      this.targetStream.write(b);
+   }
+
+   public void flush() throws IOException
+   {
+      super.flush();
+      this.targetStream.flush();
+   }
+
+   public void close() throws IOException
+   {
+      super.close();
+      this.targetStream.close();
+	}
+
+}
\ No newline at end of file


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/DelegatingServletOutputStream.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/HeaderValueHolder.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/HeaderValueHolder.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/HeaderValueHolder.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.example.tasks.test.fwk;
+
+import java.util.*;
+import java.lang.reflect.Array;
+
+/**
+ * Internal helper class that serves as value holder for request headers.
+ *
+ * @author Juergen Hoeller
+ * @author Rick Evans
+ * @since 2.0.1
+ */
+class HeaderValueHolder {
+
+	private final List values = new LinkedList();
+
+
+	public void setValue(Object value) {
+		this.values.clear();
+		this.values.add(value);
+	}
+
+	public void addValue(Object value) {
+		this.values.add(value);
+	}
+
+	public void addValues(Collection values) {
+		this.values.addAll(values);
+	}
+
+	public void addValueArray(Object values) {
+		Object[] arr = toObjectArray(values);
+      this.values.addAll(Arrays.asList(arr));
+	}
+
+	public List getValues() {
+		return Collections.unmodifiableList(this.values);
+	}
+
+	public Object getValue() {
+		return (!this.values.isEmpty() ? this.values.get(0) : null);
+	}
+
+
+	/**
+	 * Find a HeaderValueHolder by name, ignoring casing.
+	 * @param headers the Map of header names to HeaderValueHolders
+	 * @param name the name of the desired header
+	 * @return the corresponding HeaderValueHolder,
+	 * or <code>null</code> if none found
+	 */
+	public static HeaderValueHolder getByName(Map headers, String name) {
+		for (Iterator it = headers.keySet().iterator(); it.hasNext();) {
+			String headerName = (String) it.next();
+			if (headerName.equalsIgnoreCase(name)) {
+				return (HeaderValueHolder) headers.get(headerName);
+			}
+		}
+		return null;
+	}
+
+   public static Object[] toObjectArray(Object source) {
+		if (source instanceof Object[]) {
+			return (Object[]) source;
+		}
+		if (source == null) {
+			return new Object[0];
+		}
+		if (!source.getClass().isArray()) {
+			throw new IllegalArgumentException("Source is not an array: " + source);
+		}
+		int length = Array.getLength(source);
+		if (length == 0) {
+			return new Object[0];
+		}
+		Class wrapperType = Array.get(source, 0).getClass();
+		Object[] newArray = (Object[]) Array.newInstance(wrapperType, length);
+		for (int i = 0; i < length; i++) {
+			newArray[i] = Array.get(source, i);
+		}
+		return newArray;
+	}
+
+}
\ No newline at end of file


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/HeaderValueHolder.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockHttpServletRequest.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockHttpServletRequest.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockHttpServletRequest.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,879 @@
+/*
+ * Copyright 2002-2008 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.example.tasks.test.fwk;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.*;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.jboss.seam.mock.MockServletContext;
+import org.jboss.seam.mock.MockHttpSession;
+
+/**
+ * Mock implementation of the {@link javax.servlet.http.HttpServletRequest}
+ * interface. Supports the Servlet 2.4 API level.
+ *
+ * <p>Used for testing the web framework; also useful for testing
+ * application controllers.
+ *
+ * @author Juergen Hoeller
+ * @author Rod Johnson
+ * @author Rick Evans
+ * @author Mark Fisher
+ * @since 1.0.2
+ */
+public class MockHttpServletRequest implements HttpServletRequest {
+
+	/**
+	 * The default protocol: 'http'.
+	 */
+	public static final String DEFAULT_PROTOCOL = "http";
+
+	/**
+	 * The default server address: '127.0.0.1'.
+	 */
+	public static final String DEFAULT_SERVER_ADDR = "127.0.0.1";
+
+	/**
+	 * The default server name: 'localhost'.
+	 */
+	public static final String DEFAULT_SERVER_NAME = "localhost";
+
+	/**
+	 * The default server port: '80'.
+	 */
+	public static final int DEFAULT_SERVER_PORT = 80;
+
+	/**
+	 * The default remote address: '127.0.0.1'.
+	 */
+	public static final String DEFAULT_REMOTE_ADDR = "127.0.0.1";
+
+	/**
+	 * The default remote host: 'localhost'.
+	 */
+	public static final String DEFAULT_REMOTE_HOST = "localhost";
+
+	private boolean active = true;
+
+
+	//---------------------------------------------------------------------
+	// ServletRequest properties
+	//---------------------------------------------------------------------
+
+	private final Hashtable attributes = new Hashtable();
+
+	private String characterEncoding;
+
+	private byte[] content;
+
+	private String contentType;
+
+	private final Map parameters = new LinkedHashMap(16);
+
+	private String protocol = DEFAULT_PROTOCOL;
+
+	private String scheme = DEFAULT_PROTOCOL;
+
+	private String serverName = DEFAULT_SERVER_NAME;
+
+	private int serverPort = DEFAULT_SERVER_PORT;
+
+	private String remoteAddr = DEFAULT_REMOTE_ADDR;
+
+	private String remoteHost = DEFAULT_REMOTE_HOST;
+
+	/** List of locales in descending order */
+	private final Vector locales = new Vector();
+
+	private boolean secure = false;
+
+	private final ServletContext servletContext;
+
+	private int remotePort = DEFAULT_SERVER_PORT;
+
+	private String localName = DEFAULT_SERVER_NAME;
+
+	private String localAddr = DEFAULT_SERVER_ADDR;
+
+	private int localPort = DEFAULT_SERVER_PORT;
+
+
+	//---------------------------------------------------------------------
+	// HttpServletRequest properties
+	//---------------------------------------------------------------------
+
+	private String authType;
+
+	private Cookie[] cookies;
+
+	/**
+	 * The key is the lowercase header name; the value is a {@link HeaderValueHolder} object.
+	 */
+	private final Hashtable headers = new Hashtable();
+
+	private String method;
+
+	private String pathInfo;
+
+	private String contextPath = "";
+
+	private String queryString;
+
+   private Map<String,String> queryParameters = new HashMap();
+
+	private String remoteUser;
+
+	private final Set userRoles = new HashSet();
+
+	private Principal userPrincipal;
+
+	private String requestURI;
+
+	private String servletPath = "";
+
+	private HttpSession session;
+
+	private boolean requestedSessionIdValid = true;
+
+	private boolean requestedSessionIdFromCookie = true;
+
+	private boolean requestedSessionIdFromURL = false;
+
+
+   //---------------------------------------------------------------------
+	// Constructors
+	//---------------------------------------------------------------------
+
+	/**
+	 * Create a new MockHttpServletRequest with a default
+	 * {@link MockServletContext}.
+	 * @see MockServletContext
+	 */
+	public MockHttpServletRequest() {
+		this(null, "", "");
+	}
+
+	/**
+	 * Create a new MockHttpServletRequest with a default
+	 * {@link MockServletContext}.
+	 * @param method the request method (may be <code>null</code>)
+	 * @param requestURI the request URI (may be <code>null</code>)
+	 * @see #setMethod
+	 * @see #setRequestURI
+	 * @see MockServletContext
+	 */
+	public MockHttpServletRequest(String method, String requestURI) {
+		this(null, method, requestURI);
+	}
+
+	/**
+	 * Create a new MockHttpServletRequest.
+	 * @param servletContext the ServletContext that the request runs in
+	 * (may be <code>null</code> to use a default MockServletContext)
+	 * @see MockServletContext
+	 */
+	public MockHttpServletRequest(ServletContext servletContext) {
+		this(servletContext, "", "");
+	}
+
+	/**
+	 * Create a new MockHttpServletRequest.
+	 * @param servletContext the ServletContext that the request runs in
+	 * (may be <code>null</code> to use a default MockServletContext)
+	 * @param method the request method (may be <code>null</code>)
+	 * @param requestURI the request URI (may be <code>null</code>)
+	 * @see #setMethod
+	 * @see #setRequestURI
+	 * @see MockServletContext
+	 */
+	public MockHttpServletRequest(ServletContext servletContext, String method, String requestURI) {
+		this.servletContext = (servletContext != null ? servletContext : new MockServletContext());
+		this.method = method;
+		this.requestURI = requestURI;
+		this.locales.add(Locale.ENGLISH);
+	}
+
+
+	//---------------------------------------------------------------------
+	// Lifecycle methods
+	//---------------------------------------------------------------------
+
+	/**
+	 * Return the ServletContext that this request is associated with.
+	 * (Not available in the standard HttpServletRequest interface for some reason.)
+	 */
+	public ServletContext getServletContext() {
+		return this.servletContext;
+	}
+
+	/**
+	 * Return whether this request is still active (that is, not completed yet).
+	 */
+	public boolean isActive() {
+		return this.active;
+	}
+
+	/**
+	 * Mark this request as completed, keeping its state.
+	 */
+	public void close() {
+		this.active = false;
+	}
+
+	/**
+	 * Invalidate this request, clearing its state.
+	 */
+	public void invalidate() {
+		close();
+		clearAttributes();
+	}
+
+	/**
+	 * Check whether this request is still active (that is, not completed yet),
+	 * throwing an IllegalStateException if not active anymore.
+	 */
+	protected void checkActive() throws IllegalStateException {
+		if (!this.active) {
+			throw new IllegalStateException("Request is not active anymore");
+		}
+	}
+
+
+	//---------------------------------------------------------------------
+	// ServletRequest interface
+	//---------------------------------------------------------------------
+
+	public Object getAttribute(String name) {
+		checkActive();
+		return this.attributes.get(name);
+	}
+
+	public Enumeration getAttributeNames() {
+		checkActive();
+		return this.attributes.keys();
+	}
+
+	public String getCharacterEncoding() {
+		return this.characterEncoding;
+	}
+
+	public void setCharacterEncoding(String characterEncoding) {
+		this.characterEncoding = characterEncoding;
+	}
+
+	public void setContent(byte[] content) {
+		this.content = content;
+	}
+
+	public int getContentLength() {
+		return (this.content != null ? this.content.length : -1);
+	}
+
+	public void setContentType(String contentType) {
+		this.contentType = contentType;
+	}
+
+	public String getContentType() {
+		return this.contentType;
+	}
+
+	public ServletInputStream getInputStream() {
+		if (this.content != null) {
+			return new DelegatingServletInputStream(new ByteArrayInputStream(this.content));
+		}
+		else {
+			return null;
+		}
+	}
+
+	/**
+	 * Set a single value for the specified HTTP parameter.
+	 * <p>If there are already one or more values registered for the given
+	 * parameter name, they will be replaced.
+	 */
+	public void setParameter(String name, String value) {
+		setParameter(name, new String[] {value});
+	}
+
+	/**
+	 * Set an array of values for the specified HTTP parameter.
+	 * <p>If there are already one or more values registered for the given
+	 * parameter name, they will be replaced.
+	 */
+	public void setParameter(String name, String[] values) {
+		this.parameters.put(name, values);
+	}
+
+	/**
+	 * Sets all provided parameters <emphasis>replacing</emphasis> any
+	 * existing values for the provided parameter names. To add without
+	 * replacing existing values, use {@link #addParameters(Map)}.
+	 */
+	public void setParameters(Map params) {
+		for (Iterator it = params.keySet().iterator(); it.hasNext();) {
+			Object key = it.next();
+			Object value = params.get(key);
+			if (value instanceof String) {
+				this.setParameter((String) key, (String) value);
+			}
+			else if (value instanceof String[]) {
+				this.setParameter((String) key, (String[]) value);
+			}
+			else {
+				throw new IllegalArgumentException("Parameter map value must be single value " +
+						" or array of type [" + String.class.getName() + "]");
+			}
+		}
+	}
+
+	/**
+	 * Add a single value for the specified HTTP parameter.
+	 * <p>If there are already one or more values registered for the given
+	 * parameter name, the given value will be added to the end of the list.
+	 */
+	public void addParameter(String name, String value) {
+		addParameter(name, new String[] {value});
+	}
+
+	/**
+	 * Add an array of values for the specified HTTP parameter.
+	 * <p>If there are already one or more values registered for the given
+	 * parameter name, the given values will be added to the end of the list.
+	 */
+	public void addParameter(String name, String[] values) {
+		String[] oldArr = (String[]) this.parameters.get(name);
+		if (oldArr != null) {
+			String[] newArr = new String[oldArr.length + values.length];
+			System.arraycopy(oldArr, 0, newArr, 0, oldArr.length);
+			System.arraycopy(values, 0, newArr, oldArr.length, values.length);
+			this.parameters.put(name, newArr);
+		}
+		else {
+			this.parameters.put(name, values);
+		}
+	}
+
+	/**
+	 * Adds all provided parameters <emphasis>without</emphasis> replacing
+	 * any existing values. To replace existing values, use
+	 * {@link #setParameters(Map)}.
+	 */
+	public void addParameters(Map params) {
+		for (Iterator it = params.keySet().iterator(); it.hasNext();) {
+			Object key = it.next();
+			Object value = params.get(key);
+			if (value instanceof String) {
+				this.addParameter((String) key, (String) value);
+			}
+			else if (value instanceof String[]) {
+				this.addParameter((String) key, (String[]) value);
+			}
+			else {
+				throw new IllegalArgumentException("Parameter map value must be single value " +
+						" or array of type [" + String.class.getName() + "]");
+			}
+		}
+	}
+
+	/**
+	 * Remove already registered values for the specified HTTP parameter, if any.
+	 */
+	public void removeParameter(String name) {
+		this.parameters.remove(name);
+	}
+
+	/**
+	 * Removes all existing parameters.
+	 */
+	public void removeAllParameters() {
+		this.parameters.clear();
+	}
+
+	public String getParameter(String name) {
+		String[] arr = (String[]) this.parameters.get(name);
+		return (arr != null && arr.length > 0 ? arr[0] : null);
+	}
+
+	public Enumeration getParameterNames() {
+		return Collections.enumeration(this.parameters.keySet());
+	}
+
+	public String[] getParameterValues(String name) {
+		return (String[]) this.parameters.get(name);
+	}
+
+	public Map getParameterMap() {
+		return Collections.unmodifiableMap(this.parameters);
+	}
+
+   /**
+    * Add a query parameter that will be appended to the URI query string.
+    */
+   public void addQueryParameter(String name, String value) {
+      addParameter(name, value);
+      this.queryParameters.put(name, value);
+   }
+
+   public void removeQueryParameter(String name) {
+      removeParameter(name);
+      this.queryParameters.remove(name);
+   }
+
+   public Map<String, String> getQueryParameters()
+   {
+      return queryParameters;
+   }
+
+   public void setProtocol(String protocol) {
+		this.protocol = protocol;
+	}
+
+	public String getProtocol() {
+		return this.protocol;
+	}
+
+	public void setScheme(String scheme) {
+		this.scheme = scheme;
+	}
+
+	public String getScheme() {
+		return this.scheme;
+	}
+
+	public void setServerName(String serverName) {
+		this.serverName = serverName;
+	}
+
+	public String getServerName() {
+		return this.serverName;
+	}
+
+	public void setServerPort(int serverPort) {
+		this.serverPort = serverPort;
+	}
+
+	public int getServerPort() {
+		return this.serverPort;
+	}
+
+	public BufferedReader getReader() throws UnsupportedEncodingException {
+		if (this.content != null) {
+			InputStream sourceStream = new ByteArrayInputStream(this.content);
+			Reader sourceReader = (this.characterEncoding != null) ?
+					new InputStreamReader(sourceStream, this.characterEncoding) : new InputStreamReader(sourceStream);
+			return new BufferedReader(sourceReader);
+		}
+		else {
+			return null;
+		}
+	}
+
+	public void setRemoteAddr(String remoteAddr) {
+		this.remoteAddr = remoteAddr;
+	}
+
+	public String getRemoteAddr() {
+		return this.remoteAddr;
+	}
+
+	public void setRemoteHost(String remoteHost) {
+		this.remoteHost = remoteHost;
+	}
+
+	public String getRemoteHost() {
+		return this.remoteHost;
+	}
+
+	public void setAttribute(String name, Object value) {
+		checkActive();
+		if (value != null) {
+			this.attributes.put(name, value);
+		}
+		else {
+			this.attributes.remove(name);
+		}
+	}
+
+	public void removeAttribute(String name) {
+		checkActive();
+		this.attributes.remove(name);
+	}
+
+	/**
+	 * Clear all of this request's attributes.
+	 */
+	public void clearAttributes() {
+		this.attributes.clear();
+	}
+
+	/**
+	 * Add a new preferred locale, before any existing locales.
+	 */
+	public void addPreferredLocale(Locale locale) {
+		this.locales.add(0, locale);
+	}
+
+	public Locale getLocale() {
+		return (Locale) this.locales.get(0);
+	}
+
+	public Enumeration getLocales() {
+		return this.locales.elements();
+	}
+
+	public void setSecure(boolean secure) {
+		this.secure = secure;
+	}
+
+	public boolean isSecure() {
+		return this.secure;
+	}
+
+	public RequestDispatcher getRequestDispatcher(String path) {
+		return new MockRequestDispatcher(path);
+	}
+
+	public String getRealPath(String path) {
+		return this.servletContext.getRealPath(path);
+	}
+
+	public void setRemotePort(int remotePort) {
+		this.remotePort = remotePort;
+	}
+
+	public int getRemotePort() {
+		return this.remotePort;
+	}
+
+	public void setLocalName(String localName) {
+		this.localName = localName;
+	}
+
+	public String getLocalName() {
+		return this.localName;
+	}
+
+	public void setLocalAddr(String localAddr) {
+		this.localAddr = localAddr;
+	}
+
+	public String getLocalAddr() {
+		return this.localAddr;
+	}
+
+	public void setLocalPort(int localPort) {
+		this.localPort = localPort;
+	}
+
+	public int getLocalPort() {
+		return this.localPort;
+	}
+
+
+	//---------------------------------------------------------------------
+	// HttpServletRequest interface
+	//---------------------------------------------------------------------
+
+	public void setAuthType(String authType) {
+		this.authType = authType;
+	}
+
+	public String getAuthType() {
+		return this.authType;
+	}
+
+	public void setCookies(Cookie[] cookies) {
+		this.cookies = cookies;
+	}
+
+	public Cookie[] getCookies() {
+		return this.cookies;
+	}
+
+   public void addCookie(Cookie cookie) {
+      this.cookies = new Cookie[this.cookies.length+1];
+      this.cookies[this.cookies.length-1] = cookie;
+   }
+
+	/**
+	 * Add a header entry for the given name.
+	 * <p>If there was no entry for that header name before,
+	 * the value will be used as-is. In case of an existing entry,
+	 * a String array will be created, adding the given value (more
+	 * specifically, its toString representation) as further element.
+	 * <p>Multiple values can only be stored as list of Strings,
+	 * following the Servlet spec (see <code>getHeaders</code> accessor).
+	 * As alternative to repeated <code>addHeader</code> calls for
+	 * individual elements, you can use a single call with an entire
+	 * array or Collection of values as parameter.
+	 * @see #getHeaderNames
+	 * @see #getHeader
+	 * @see #getHeaders
+	 * @see #getDateHeader
+	 * @see #getIntHeader
+	 */
+	public void addHeader(String name, Object value) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		if (header == null) {
+			header = new HeaderValueHolder();
+			this.headers.put(name, header);
+		}
+		if (value instanceof Collection) {
+			header.addValues((Collection) value);
+		}
+		else if (value.getClass().isArray()) {
+			header.addValueArray(value);
+		}
+		else {
+			header.addValue(value);
+		}
+	}
+
+	public long getDateHeader(String name) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		Object value = (header != null ? header.getValue() : null);
+		if (value instanceof Date) {
+			return ((Date) value).getTime();
+		}
+		else if (value instanceof Number) {
+			return ((Number) value).longValue();
+		}
+		else if (value != null) {
+			throw new IllegalArgumentException(
+					"Value for header '" + name + "' is neither a Date nor a Number: " + value);
+		}
+		else {
+			return -1L;
+		}
+	}
+
+	public String getHeader(String name) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		return (header != null ? header.getValue().toString() : null);
+	}
+
+	public Enumeration getHeaders(String name) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		return Collections.enumeration(header != null ? header.getValues() : Collections.EMPTY_LIST);
+	}
+
+	public Enumeration getHeaderNames() {
+		return this.headers.keys();
+	}
+
+	public int getIntHeader(String name) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		Object value = (header != null ? header.getValue() : null);
+		if (value instanceof Number) {
+			return ((Number) value).intValue();
+		}
+		else if (value instanceof String) {
+			return Integer.parseInt((String) value);
+		}
+		else if (value != null) {
+			throw new NumberFormatException("Value for header '" + name + "' is not a Number: " + value);
+		}
+		else {
+			return -1;
+		}
+	}
+
+	public void setMethod(String method) {
+		this.method = method;
+	}
+
+	public String getMethod() {
+		return this.method;
+	}
+
+	public void setPathInfo(String pathInfo) {
+		this.pathInfo = pathInfo;
+	}
+
+	public String getPathInfo() {
+		return this.pathInfo;
+	}
+
+	public String getPathTranslated() {
+		return (this.pathInfo != null ? getRealPath(this.pathInfo) : null);
+	}
+
+	public void setContextPath(String contextPath) {
+		this.contextPath = contextPath;
+	}
+
+	public String getContextPath() {
+		return this.contextPath;
+	}
+
+	public void setQueryString(String queryString) {
+		this.queryString = queryString;
+	}
+
+	public String getQueryString() {
+      if (getQueryParameters().size() > 0) {
+         StringBuilder q = new StringBuilder(queryString);
+         if (!queryString.endsWith("&")) q.append("&");
+         for (Map.Entry<String, String> entry : getQueryParameters().entrySet())
+         {
+            q.append(entry.getKey());
+            q.append("=");
+            q.append(entry.getValue());
+            q.append("&");
+         }
+         if (q.toString().endsWith("&")) {
+            q.deleteCharAt(q.length()-1);
+         }
+         return q.toString();
+      }
+		return this.queryString;
+	}
+
+	public void setRemoteUser(String remoteUser) {
+		this.remoteUser = remoteUser;
+	}
+
+	public String getRemoteUser() {
+		return this.remoteUser;
+	}
+
+	/**
+	 * @deprecated in favor of addUserRole
+	 * @see #addUserRole
+	 */
+	public void addRole(String role) {
+		addUserRole(role);
+	}
+
+	public void addUserRole(String role) {
+		this.userRoles.add(role);
+	}
+
+	public boolean isUserInRole(String role) {
+		return this.userRoles.contains(role);
+	}
+
+	public void setUserPrincipal(Principal userPrincipal) {
+		this.userPrincipal = userPrincipal;
+	}
+
+	public Principal getUserPrincipal() {
+		return this.userPrincipal;
+	}
+
+	public String getRequestedSessionId() {
+		HttpSession session = getSession();
+		return (session != null ? session.getId() : null);
+	}
+
+	public void setRequestURI(String requestURI) {
+		this.requestURI = requestURI;
+	}
+
+	public String getRequestURI() {
+		return this.requestURI;
+	}
+
+	public StringBuffer getRequestURL() {
+		StringBuffer url = new StringBuffer(this.scheme);
+		url.append("://").append(this.serverName).append(':').append(this.serverPort);
+		url.append(getRequestURI());
+		return url;
+	}
+
+	public void setServletPath(String servletPath) {
+		this.servletPath = servletPath;
+	}
+
+	public String getServletPath() {
+		return this.servletPath;
+	}
+
+	public void setSession(HttpSession session) {
+		this.session = session;
+      // TODO: We don't need session handling?
+      /*
+		if (session instanceof MockHttpSession) {
+			MockHttpSession mockSession = ((MockHttpSession) session);
+			mockSession.access();
+		}
+		*/
+	}
+
+	public HttpSession getSession(boolean create) {
+		checkActive();
+		// Reset session if invalidated.
+		if (this.session instanceof MockHttpSession && ((MockHttpSession) this.session).isInvalid()) {
+			this.session = null;
+		}
+		// Create new session if necessary.
+		if (this.session == null && create) {
+			this.session = new MockHttpSession(this.servletContext);
+		}
+		return this.session;
+	}
+
+	public HttpSession getSession() {
+		return getSession(true);
+	}
+
+	public void setRequestedSessionIdValid(boolean requestedSessionIdValid) {
+		this.requestedSessionIdValid = requestedSessionIdValid;
+	}
+
+	public boolean isRequestedSessionIdValid() {
+		return this.requestedSessionIdValid;
+	}
+
+	public void setRequestedSessionIdFromCookie(boolean requestedSessionIdFromCookie) {
+		this.requestedSessionIdFromCookie = requestedSessionIdFromCookie;
+	}
+
+	public boolean isRequestedSessionIdFromCookie() {
+		return this.requestedSessionIdFromCookie;
+	}
+
+	public void setRequestedSessionIdFromURL(boolean requestedSessionIdFromURL) {
+		this.requestedSessionIdFromURL = requestedSessionIdFromURL;
+	}
+
+	public boolean isRequestedSessionIdFromURL() {
+		return this.requestedSessionIdFromURL;
+	}
+
+	public boolean isRequestedSessionIdFromUrl() {
+		return isRequestedSessionIdFromURL();
+	}
+
+   public boolean isAllParametersInQueryString() {
+      return true;
+   }
+
+}
\ No newline at end of file


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockHttpServletRequest.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockHttpServletResponse.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockHttpServletResponse.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockHttpServletResponse.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,518 @@
+/*
+ * Copyright 2002-2008 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.example.tasks.test.fwk;
+
+import org.jboss.seam.example.tasks.test.fwk.DelegatingServletOutputStream;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * Mock implementation of the {@link javax.servlet.http.HttpServletResponse}
+ * interface. Supports the Servlet 2.4 API level.
+ *
+ * <p>Used for testing the web framework; also useful for testing
+ * application controllers.
+ *
+ * @author Juergen Hoeller
+ * @author Rod Johnson
+ * @since 1.0.2
+ */
+public class MockHttpServletResponse implements HttpServletResponse {
+
+	public static final int DEFAULT_SERVER_PORT = 80;
+
+	private static final String CHARSET_PREFIX = "charset=";
+
+
+	//---------------------------------------------------------------------
+	// ServletResponse properties
+	//---------------------------------------------------------------------
+
+	private boolean outputStreamAccessAllowed = true;
+
+	private boolean writerAccessAllowed = true;
+
+	private String characterEncoding = "ISO-8859-1";
+
+	private final ByteArrayOutputStream content = new ByteArrayOutputStream();
+
+	private final ServletOutputStream outputStream = new ResponseServletOutputStream(this.content);
+
+	private PrintWriter writer;
+
+	private int contentLength = 0;
+
+	private String contentType;
+
+	private int bufferSize = 4096;
+
+	private boolean committed;
+
+	private Locale locale = Locale.getDefault();
+
+
+	//---------------------------------------------------------------------
+	// HttpServletResponse properties
+	//---------------------------------------------------------------------
+
+	private final List cookies = new ArrayList();
+
+	/**
+	 * The key is the lowercase header name; the value is a {@link HeaderValueHolder} object.
+	 */
+	private final Map headers = new HashMap();
+
+	private int status = HttpServletResponse.SC_OK;
+
+	private String statusMessage;
+
+	private String redirectedUrl;
+
+	private String forwardedUrl;
+
+	private String includedUrl;
+
+
+   //---------------------------------------------------------------------
+	// ServletResponse interface
+	//---------------------------------------------------------------------
+
+	/**
+	 * Set whether {@link #getOutputStream()} access is allowed.
+	 * <p>Default is <code>true</code>.
+	 */
+	public void setOutputStreamAccessAllowed(boolean outputStreamAccessAllowed) {
+		this.outputStreamAccessAllowed = outputStreamAccessAllowed;
+	}
+
+	/**
+	 * Return whether {@link #getOutputStream()} access is allowed.
+	 */
+	public boolean isOutputStreamAccessAllowed() {
+		return this.outputStreamAccessAllowed;
+	}
+
+	/**
+	 * Set whether {@link #getWriter()} access is allowed.
+	 * <p>Default is <code>true</code>.
+	 */
+	public void setWriterAccessAllowed(boolean writerAccessAllowed) {
+		this.writerAccessAllowed = writerAccessAllowed;
+	}
+
+	/**
+	 * Return whether {@link #getOutputStream()} access is allowed.
+	 */
+	public boolean isWriterAccessAllowed() {
+		return this.writerAccessAllowed;
+	}
+
+	public void setCharacterEncoding(String characterEncoding) {
+		this.characterEncoding = characterEncoding;
+	}
+
+	public String getCharacterEncoding() {
+		return this.characterEncoding;
+	}
+
+	public ServletOutputStream getOutputStream() {
+		if (!this.outputStreamAccessAllowed) {
+			throw new IllegalStateException("OutputStream access not allowed");
+		}
+		return this.outputStream;
+	}
+
+	public PrintWriter getWriter() throws UnsupportedEncodingException {
+		if (!this.writerAccessAllowed) {
+			throw new IllegalStateException("Writer access not allowed");
+		}
+		if (this.writer == null) {
+			Writer targetWriter = (this.characterEncoding != null ?
+					new OutputStreamWriter(this.content, this.characterEncoding) : new OutputStreamWriter(this.content));
+			this.writer = new ResponsePrintWriter(targetWriter);
+		}
+		return this.writer;
+	}
+
+	public byte[] getContentAsByteArray() {
+		flushBuffer();
+		return this.content.toByteArray();
+	}
+
+	public String getContentAsString() {
+		flushBuffer();
+      try {
+         return (this.characterEncoding != null) ?
+               this.content.toString(this.characterEncoding) : this.content.toString();
+      } catch (UnsupportedEncodingException ex) {
+         throw new RuntimeException(ex);
+      }
+	}
+
+	public void setContentLength(int contentLength) {
+		this.contentLength = contentLength;
+	}
+
+	public int getContentLength() {
+		return this.contentLength;
+	}
+
+	public void setContentType(String contentType) {
+		this.contentType = contentType;
+		if (contentType != null) {
+			int charsetIndex = contentType.toLowerCase().indexOf(CHARSET_PREFIX);
+			if (charsetIndex != -1) {
+				String encoding = contentType.substring(charsetIndex + CHARSET_PREFIX.length());
+				setCharacterEncoding(encoding);
+			}
+		}
+	}
+
+	public String getContentType() {
+		return this.contentType;
+	}
+
+	public void setBufferSize(int bufferSize) {
+		this.bufferSize = bufferSize;
+	}
+
+	public int getBufferSize() {
+		return this.bufferSize;
+	}
+
+	public void flushBuffer() {
+		setCommitted(true);
+	}
+
+	public void resetBuffer() {
+		if (isCommitted()) {
+			throw new IllegalStateException("Cannot reset buffer - response is already committed");
+		}
+		this.content.reset();
+	}
+
+	private void setCommittedIfBufferSizeExceeded() {
+		int bufSize = getBufferSize();
+		if (bufSize > 0 && this.content.size() > bufSize) {
+			setCommitted(true);
+		}
+	}
+
+	public void setCommitted(boolean committed) {
+		this.committed = committed;
+	}
+
+	public boolean isCommitted() {
+		return this.committed;
+	}
+
+	public void reset() {
+		resetBuffer();
+		this.characterEncoding = null;
+		this.contentLength = 0;
+		this.contentType = null;
+		this.locale = null;
+		this.cookies.clear();
+		this.headers.clear();
+		this.status = HttpServletResponse.SC_OK;
+		this.statusMessage = null;
+	}
+
+	public void setLocale(Locale locale) {
+		this.locale = locale;
+	}
+
+	public Locale getLocale() {
+		return this.locale;
+	}
+
+
+	//---------------------------------------------------------------------
+	// HttpServletResponse interface
+	//---------------------------------------------------------------------
+
+	public void addCookie(Cookie cookie) {
+		this.cookies.add(cookie);
+	}
+
+	public Cookie[] getCookies() {
+		return (Cookie[]) this.cookies.toArray(new Cookie[this.cookies.size()]);
+	}
+
+	public Cookie getCookie(String name) {
+		for (Iterator it = this.cookies.iterator(); it.hasNext();) {
+			Cookie cookie = (Cookie) it.next();
+			if (name.equals(cookie.getName())) {
+				return cookie;
+			}
+		}
+		return null;
+	}
+
+	public boolean containsHeader(String name) {
+		return (HeaderValueHolder.getByName(this.headers, name) != null);
+	}
+
+	/**
+	 * Return the names of all specified headers as a Set of Strings.
+	 * @return the <code>Set</code> of header name <code>Strings</code>, or an empty <code>Set</code> if none
+	 */
+	public Set getHeaderNames() {
+		return this.headers.keySet();
+	}
+
+	/**
+	 * Return the primary value for the given header, if any.
+	 * <p>Will return the first value in case of multiple values.
+	 * @param name the name of the header
+	 * @return the associated header value, or <code>null<code> if none
+	 */
+	public Object getHeader(String name) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		return (header != null ? header.getValue() : null);
+	}
+
+	/**
+	 * Return all values for the given header as a List of value objects.
+	 * @param name the name of the header
+	 * @return the associated header values, or an empty List if none
+	 */
+	public List getHeaders(String name) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		return (header != null ? header.getValues() : Collections.EMPTY_LIST);
+	}
+
+	/**
+	 * The default implementation returns the given URL String as-is.
+	 * <p>Can be overridden in subclasses, appending a session id or the like.
+	 */
+	public String encodeURL(String url) {
+		return url;
+	}
+
+	/**
+	 * The default implementation delegates to {@link #encodeURL},
+	 * returning the given URL String as-is.
+	 * <p>Can be overridden in subclasses, appending a session id or the like
+	 * in a redirect-specific fashion. For general URL encoding rules,
+	 * override the common {@link #encodeURL} method instead, appyling
+	 * to redirect URLs as well as to general URLs.
+	 */
+	public String encodeRedirectURL(String url) {
+		return encodeURL(url);
+	}
+
+	public String encodeUrl(String url) {
+		return encodeURL(url);
+	}
+
+	public String encodeRedirectUrl(String url) {
+		return encodeRedirectURL(url);
+	}
+
+	public void sendError(int status, String errorMessage) throws IOException {
+		if (isCommitted()) {
+			throw new IllegalStateException("Cannot set error status - response is already committed");
+		}
+		this.status = status;
+		this.statusMessage = errorMessage;
+		setCommitted(true);
+	}
+
+	public void sendError(int status) throws IOException {
+		if (isCommitted()) {
+			throw new IllegalStateException("Cannot set error status - response is already committed");
+		}
+		this.status = status;
+		setCommitted(true);
+	}
+
+	public void sendRedirect(String url) throws IOException {
+		if (isCommitted()) {
+			throw new IllegalStateException("Cannot send redirect - response is already committed");
+		}
+		this.redirectedUrl = url;
+		setCommitted(true);
+	}
+
+	public String getRedirectedUrl() {
+		return this.redirectedUrl;
+	}
+
+	public void setDateHeader(String name, long value) {
+		setHeaderValue(name, new Long(value));
+	}
+
+	public void addDateHeader(String name, long value) {
+		addHeaderValue(name, new Long(value));
+	}
+
+	public void setHeader(String name, String value) {
+		setHeaderValue(name, value);
+	}
+
+	public void addHeader(String name, String value) {
+		addHeaderValue(name, value);
+	}
+
+	public void setIntHeader(String name, int value) {
+		setHeaderValue(name, new Integer(value));
+	}
+
+	public void addIntHeader(String name, int value) {
+		addHeaderValue(name, new Integer(value));
+	}
+
+	private void setHeaderValue(String name, Object value) {
+		doAddHeaderValue(name, value, true);
+	}
+
+	private void addHeaderValue(String name, Object value) {
+		doAddHeaderValue(name, value, false);
+	}
+
+	private void doAddHeaderValue(String name, Object value, boolean replace) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		if (header == null) {
+			header = new HeaderValueHolder();
+			this.headers.put(name, header);
+		}
+		if (replace) {
+			header.setValue(value);
+		}
+		else {
+			header.addValue(value);
+		}
+	}
+
+	public void setStatus(int status) {
+		this.status = status;
+	}
+
+	public void setStatus(int status, String statusMessage) {
+		this.status = status;
+		this.statusMessage = statusMessage;
+	}
+
+	public int getStatus() {
+		return this.status;
+	}
+
+	public String getStatusMessage() {
+		return this.statusMessage;
+	}
+
+
+	//---------------------------------------------------------------------
+	// Methods for MockRequestDispatcher
+	//---------------------------------------------------------------------
+
+	public void setForwardedUrl(String forwardedUrl) {
+		this.forwardedUrl = forwardedUrl;
+	}
+
+	public String getForwardedUrl() {
+		return this.forwardedUrl;
+	}
+
+	public void setIncludedUrl(String includedUrl) {
+		this.includedUrl = includedUrl;
+	}
+
+	public String getIncludedUrl() {
+		return this.includedUrl;
+	}
+
+
+   /**
+	 * Inner class that adapts the ServletOutputStream to mark the
+	 * response as committed once the buffer size is exceeded.
+	 */
+	private class ResponseServletOutputStream extends DelegatingServletOutputStream
+   {
+
+		public ResponseServletOutputStream(OutputStream out) {
+			super(out);
+		}
+
+		public void write(int b) throws IOException {
+			super.write(b);
+			super.flush();
+			setCommittedIfBufferSizeExceeded();
+		}
+
+		public void flush() throws IOException {
+			super.flush();
+			setCommitted(true);
+		}
+	}
+
+
+	/**
+	 * Inner class that adapts the PrintWriter to mark the
+	 * response as committed once the buffer size is exceeded.
+	 */
+	private class ResponsePrintWriter extends PrintWriter {
+
+		public ResponsePrintWriter(Writer out) {
+			super(out, true);
+		}
+
+		public void write(char buf[], int off, int len) {
+			super.write(buf, off, len);
+			super.flush();
+			setCommittedIfBufferSizeExceeded();
+		}
+
+		public void write(String s, int off, int len) {
+			super.write(s, off, len);
+			super.flush();
+			setCommittedIfBufferSizeExceeded();
+		}
+
+		public void write(int c) {
+			super.write(c);
+			super.flush();
+			setCommittedIfBufferSizeExceeded();
+		}
+
+		public void flush() {
+			super.flush();
+			setCommitted(true);
+		}
+	}
+
+}
\ No newline at end of file


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockHttpServletResponse.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockRequestDispatcher.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockRequestDispatcher.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockRequestDispatcher.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.example.tasks.test.fwk;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Mock implementation of the {@link javax.servlet.RequestDispatcher} interface.
+ *
+ * <p>Used for testing the web framework; typically not necessary for
+ * testing application controllers.
+ *
+ * @author Rod Johnson
+ * @author Juergen Hoeller
+ * @since 1.0.2
+ */
+public class MockRequestDispatcher implements RequestDispatcher {
+
+	private final Log logger = LogFactory.getLog(getClass());
+
+	private final String url;
+
+
+	/**
+	 * Create a new MockRequestDispatcher for the given URL.
+	 * @param url the URL to dispatch to.
+	 */
+	public MockRequestDispatcher(String url) {
+		this.url = url;
+	}
+
+
+	public void forward(ServletRequest request, ServletResponse response) {
+		if (response.isCommitted()) {
+			throw new IllegalStateException("Cannot perform forward - response is already committed");
+		}
+		getMockHttpServletResponse(response).setForwardedUrl(this.url);
+		if (logger.isDebugEnabled()) {
+			logger.debug("MockRequestDispatcher: forwarding to URL [" + this.url + "]");
+		}
+	}
+
+	public void include(ServletRequest request, ServletResponse response) {
+		getMockHttpServletResponse(response).setIncludedUrl(this.url);
+		if (logger.isDebugEnabled()) {
+			logger.debug("MockRequestDispatcher: including URL [" + this.url + "]");
+		}
+	}
+
+	/**
+	 * Obtain the underlying MockHttpServletResponse,
+	 * unwrapping {@link HttpServletResponseWrapper} decorators if necessary.
+	 */
+	protected MockHttpServletResponse getMockHttpServletResponse(ServletResponse response) {
+		if (response instanceof MockHttpServletResponse) {
+			return (MockHttpServletResponse) response;
+		}
+		if (response instanceof HttpServletResponseWrapper) {
+			return getMockHttpServletResponse(((HttpServletResponseWrapper) response).getResponse());
+		}
+		throw new IllegalArgumentException("MockRequestDispatcher requires MockHttpServletResponse");
+	}
+
+}
\ No newline at end of file


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/MockRequestDispatcher.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/ResourceSeamTest.java
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/ResourceSeamTest.java	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/ResourceSeamTest.java	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,179 @@
+package org.jboss.seam.example.tasks.test.fwk;
+
+import org.jboss.seam.mock.SeamTest;
+import org.jboss.seam.servlet.SeamResourceServlet;
+import org.testng.annotations.BeforeClass;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.Cookie;
+import java.util.*;
+import java.io.IOException;
+import java.security.Principal;
+
+/**
+ * @author Christian Bauer
+ */
+public class ResourceSeamTest extends SeamTest
+{
+
+   public enum Method
+   {
+      GET, PUT, POST, DELETE, HEAD, OPTIONS
+   }
+
+   protected SeamResourceServlet resourceServlet;
+
+   @BeforeClass
+   public void initResourceServlet() throws Exception
+   {
+      resourceServlet = new SeamResourceServlet();
+      resourceServlet.init(
+            new ServletConfig()
+            {
+               public String getServletName()
+               {
+                  return "Seam Resource Servlet";
+               }
+
+               public ServletContext getServletContext()
+               {
+                  return servletContext;
+               }
+
+               public String getInitParameter(String s)
+               {
+                  return null;
+               }
+
+               public Enumeration getInitParameterNames()
+               {
+                  return null;
+               }
+            }
+      );
+
+   }
+
+   public abstract class ResourceRequest
+   {
+
+      private Method httpMethod;
+      private String requestPath;
+      private MockHttpServletRequest request;
+      private MockHttpServletResponse response;
+
+      protected ResourceRequest(Method httpMethod, String requestPath)
+      {
+         this.httpMethod = httpMethod;
+         this.requestPath = getServletPath() + (requestPath.startsWith("/") ? requestPath : "/" + requestPath);
+      }
+
+      public void run() throws Exception
+      {
+         init();
+         prepareRequest(request);
+         seamFilter.doFilter(request, response, new FilterChain()
+         {
+            public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException
+            {
+               resourceServlet.service(request, response);
+            }
+         });
+         seamFilter.destroy();
+         onResponse(getResponse());
+      }
+
+      protected void init()
+      {
+         request = createRequest();
+         response = createResponse();
+
+         request.setMethod(httpMethod.toString());
+         request.setRequestURI(requestPath);
+
+         request.setServletPath(getServletPath());
+
+         request.setCookies(getCookies().toArray(new Cookie[getCookies().size()]));
+
+         for (Map.Entry<String, Object> entry : getDefaultHeaders().entrySet())
+         {
+            request.addHeader(entry.getKey(), entry.getValue());
+         }
+
+         request.setUserPrincipal(
+               new Principal()
+               {
+                  public String getName()
+                  {
+                     return getPrincipalName();
+                  }
+               }
+         );
+         for (String role : getPrincipalRoles())
+         {
+            request.addUserRole(role);
+         }
+
+      }
+
+      protected MockHttpServletRequest createRequest()
+      {
+         return new MockHttpServletRequest();
+      }
+
+      protected MockHttpServletResponse createResponse()
+      {
+         return new MockHttpServletResponse();
+      }
+
+      protected Map<String, String> getRequestQueryParameters()
+      {
+         return Collections.EMPTY_MAP;
+      }
+
+      protected List<Cookie> getCookies()
+      {
+         return Collections.EMPTY_LIST;
+      }
+
+      protected String getPrincipalName()
+      {
+         return null;
+      }
+
+      protected Set<String> getPrincipalRoles()
+      {
+         return Collections.EMPTY_SET;
+      }
+
+      protected void prepareRequest(MockHttpServletRequest request)
+      {
+      }
+
+      protected void onResponse(MockHttpServletResponse response)
+      {
+      }
+
+      public HttpServletRequest getRequest()
+      {
+         return request;
+      }
+
+      public MockHttpServletResponse getResponse()
+      {
+         return response;
+      }
+
+   }
+
+   public String getServletPath()
+   {
+      return "/seam/resource";
+   }
+
+   public Map<String, Object> getDefaultHeaders() {
+      return Collections.EMPTY_MAP;
+   }
+
+}


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/fwk/ResourceSeamTest.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/testng.xml
===================================================================
--- branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/testng.xml	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/testng.xml	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,12 @@
+<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
+
+<suite name="Tasks" verbose="2" parallel="false">
+
+    <test name="Tasks">
+        <classes>
+            <class name="org.jboss.seam.example.tasks.test.ContextResourceTest"/>
+            <class name="org.jboss.seam.example.tasks.test.TaskResourceTest"/>
+            <class name="org.jboss.seam.example.tasks.test.ResolvedTaskResourceQueryTest"/>
+        </classes>
+    </test>
+</suite>
\ No newline at end of file


Property changes on: branches/community/Seam_2_1/examples/tasks/src/main/org/jboss/seam/example/tasks/test/testng.xml
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/community/Seam_2_1/examples/tasks/view/seam-tasks-client.js
===================================================================
--- branches/community/Seam_2_1/examples/tasks/view/seam-tasks-client.js	                        (rev 0)
+++ branches/community/Seam_2_1/examples/tasks/view/seam-tasks-client.js	2009-04-28 11:35:20 UTC (rev 10675)
@@ -0,0 +1,79 @@
+function getContexts(callback) {
+	$.get("seam/resource/v1/auth/context", callback);
+}
+
+function putContext(contextName, callback) {
+	$.ajax({
+		type: "PUT",
+		url: "seam/resource/v1/auth/context/" + contextName,
+		contentType: "application/xml",
+		success: callback
+	});
+}
+
+function deleteContext(contextName, callback) {
+	$.ajax({
+		type: "DELETE",
+		url: "seam/resource/v1/auth/context/" + contextName,
+		success: callback
+	});
+}
+
+function getTask(contextName, taskId, taskDone, callback) {
+	var URI = escape("seam/resource/v1/auth/context/" + contextName + (taskDone ? "/resolved" : "/unresolved"));
+	$.get(URI, callback);
+}
+
+function getTasksForContext(contextName, taskDone, callback) {
+	var URI = escape("seam/resource/v1/auth/context/" + contextName + (taskDone ? "/resolved" : "/unresolved"));
+	$.get(URI, function(data) {
+		callback(data);
+	});
+}
+
+function getResolvedTasks(username, start, show, callback) {
+	var URI = escape("seam/resource/v1/user/" + username + "/tasks/resolved.xml");
+	URI += "?start=" + start + "&show=" + show;
+	$.get(URI, function(data) {
+		callback(data);
+	});
+}
+
+function postTask(contextName, taskName, callback) {
+	var URI = escape("seam/resource/v1/auth/context/" + contextName + "/unresolved");
+	var data = '<task><name>' + taskName + '</name></task>';
+	var request = $.ajax({
+		type: "POST",
+		url: URI,
+		contentType: "application/xml",
+		dataType: "application/xml",
+		data: data,
+		success: function() {
+			callback(request.getResponseHeader('Location'));
+		}
+	});
+}
+
+function putTask(contextName, taskId, taskName, taskDone, callback) {
+	var URI = escape("seam/resource/v1/auth/context/" + contextName + (taskDone ? "/resolved/" : "/unresolved/") + taskId);
+	var data = '<task><id>' + taskId + '</id><name>' + taskName + '</name></task>'
+	$.ajax({
+		type: "PUT",
+		url: URI,
+		contentType: "application/xml",
+		data: data,
+		success: function() {
+			callback(data);
+		}
+	});
+}
+
+function deleteTask(contextName, taskId, taskDone, callback) {
+	var URI = escape("seam/resource/v1/auth/context/" + contextName + (taskDone ? "/resolved/" : "/unresolved/") + taskId);
+	$.ajax({
+		type: "DELETE",
+		url: URI,
+		dataType: "application/xml",
+		success: callback
+	});
+}
\ No newline at end of file


Property changes on: branches/community/Seam_2_1/examples/tasks/view/seam-tasks-client.js
___________________________________________________________________
Name: svn:mime-type
   + text/plain




More information about the seam-commits mailing list