[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