[seam-commits] Seam SVN: r14365 - in branches/community/Seam_2_3/examples-ee6/tasks: tasks-ear and 39 other directories.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Tue Mar 6 15:10:34 EST 2012


Author: dhinojosa
Date: 2012-03-06 15:10:30 -0500 (Tue, 06 Mar 2012)
New Revision: 14365

Added:
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-arquillian/pom.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/pom.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/application/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/application/META-INF/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/application/META-INF/jboss-deployment-structure.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/resources/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/resources/jboss-seam-tasks-ds.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/pom.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/Authenticator.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/CategoryHome.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/ResourceNotFoundException.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/entity/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/entity/Category.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/entity/Task.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/entity/User.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/CategoryResource.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/ResolvedTaskResourceQuery.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/TaskResourceHome.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/TaskResourceQuery.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/UserResourceHome.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/META-INF/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/META-INF/ejb-jar.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/META-INF/persistence.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/import.sql
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/seam.properties
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/pom.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/CategoryResourceTest.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/ResolvedTaskResourceQueryTest.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/TaskResourceTest.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/selenium/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/selenium/SeleniumTasksTest.java
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources-ftest/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources-ftest/testng.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources-integration/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources-integration/testng.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources/WEB-INF/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources/WEB-INF/components.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources/seam.properties
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/pom.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/components.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/pages.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/web.xml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/categories.js
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/categories.xhtml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/bg.png
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/task-delete.png
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/task-done.png
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/task-edit.png
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/task-undo.png
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/tasks-logo.png
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/index.html
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/jquery-1.3.2.min.js
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/login.xhtml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/resolved.js
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/resolved.xhtml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/seam-tasks-client.js
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/style.css
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/tasks.js
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/tasks.xhtml
   branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/template.xhtml
Log:
added seam code to tasks

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-arquillian/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-arquillian/pom.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-arquillian/pom.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>tasks</artifactId>
+        <groupId>org.jboss.seam.examples-ee6</groupId>
+        <version>2.3.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.jboss.seam.examples-ee6</groupId>
+    <artifactId>tasks-arquillian</artifactId>
+    <name>Tasks Arquillian Module (EE6)</name>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.seleniumhq.selenium.server</groupId>
+            <artifactId>selenium-server</artifactId>
+            <classifier>standalone</classifier>
+        </dependency>
+        <dependency>
+            <groupId>org.seleniumhq.selenium.client-drivers</groupId>
+            <artifactId>selenium-java-client-driver</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.seam</groupId>
+            <artifactId>functional-tests</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <testResources>
+            <testResource>
+                <directory>src/test/resources</directory>
+                <filtering>true</filtering>
+            </testResource>
+            <testResource>
+                <directory>src/test/bootstrap</directory>
+                <filtering>false</filtering>
+            </testResource>
+        </testResources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skipTests>false</skipTests>
+                    <argLine>-Dsun.lang.ClassLoader.allowArraySyntax=true -Xms512m -Xmx512m</argLine>
+                    <additionalClasspathElements>
+                        <additionalClasspathElement>${basedir}/../tasks-web/src/main/webapp</additionalClasspathElement>
+                    </additionalClasspathElements>
+                    <suiteXmlFiles>
+                        <suiteXmlFile>src/test/resources-integration/testng.xml</suiteXmlFile>
+                    </suiteXmlFiles>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-seam-bootstrap</id>
+                        <phase>process-resources</phase>
+                        <goals>
+                            <goal>unpack</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.jboss.seam</groupId>
+                                    <artifactId>jboss-embedded-bootstrap</artifactId>
+                                    <version>${project.version}</version>
+                                    <type>jar</type>
+                                    <overWrite>false</overWrite>
+                                    <outputDirectory>${basedir}/src/test</outputDirectory>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>${basedir}/src/test/META-INF/</directory>
+                        </fileset>
+                        <fileset>
+                            <directory>${basedir}/src/test/bootstrap</directory>
+                        </fileset>
+                    </filesets>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>ftest-jbossas</id>
+            <properties>
+                <example.context.path>seam-tasks</example.context.path>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>jboss-maven-plugin</artifactId>
+                        <configuration>
+                            <jbossHome>${jboss.home}</jbossHome>
+                            <serverName>${jboss.domain}</serverName>
+                            <fileNames>
+                                <param>${basedir}/../tasks-ear/target/seam-tasks.ear</param>
+                            </fileNames>
+                        </configuration>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>selenium-maven-plugin</artifactId>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>failsafe-maven-plugin</artifactId>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-antrun-plugin</artifactId>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>ftest-tomcat</id>
+            <properties>
+                <example.context.path>jboss-seam-tasks</example.context.path>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>selenium-maven-plugin</artifactId>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>failsafe-maven-plugin</artifactId>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-antrun-plugin</artifactId>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/pom.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/pom.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>tasks</artifactId>
+        <groupId>org.jboss.seam.examples-ee6</groupId>
+        <version>2.3.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>tasks-ear</artifactId>
+    <packaging>ear</packaging>
+    <name>Tasks EAR Module (EE6)</name>
+
+    <properties>
+        <jboss.home>${env.JBOSS_HOME}</jboss.home>
+        <jboss.domain>default</jboss.domain>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.jboss.seam.examples-ee6</groupId>
+            <artifactId>tasks-web</artifactId>
+            <type>war</type>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.seam.examples-ee6</groupId>
+            <artifactId>tasks-ejb</artifactId>
+            <type>ejb</type>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>seam-tasks</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-ear-plugin</artifactId>
+                <configuration>
+                    <version>6</version>
+                    <defaultLibBundleDir>lib</defaultLibBundleDir>
+                    <!-- Exclude eclipse generated application.xml and manually modified jboss-app.xml during mvn build  -->
+                    <earSourceExcludes>**/application.xml, **/jboss-app.xml</earSourceExcludes>
+                    <!-- use maven generated application.xml instead -->
+                    <generateApplicationXml>true</generateApplicationXml>
+                    <filtering>true</filtering>
+                    <modules>
+                        <webModule>
+                            <groupId>org.jboss.seam.examples-ee6</groupId>
+                            <artifactId>tasks-web</artifactId>
+                            <contextRoot>/seam-tasks</contextRoot>
+                            <bundleFileName>tasks-web.war</bundleFileName>
+                        </webModule>
+                        <ejbModule>
+                            <groupId>org.jboss.seam.examples-ee6</groupId>
+                            <artifactId>tasks-ejb</artifactId>
+                            <bundleFileName>tasks-ejb.jar</bundleFileName>
+                        </ejbModule>
+                        <ejbModule>
+                            <groupId>org.jboss.seam</groupId>
+                            <artifactId>jboss-seam-jsf2</artifactId>
+                            <bundleFileName>jboss-seam.jar</bundleFileName>
+                        </ejbModule>
+                    </modules>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.jboss.as.plugins</groupId>
+                <artifactId>jboss-as-maven-plugin</artifactId>
+                <version>7.1.0.CR1b</version>
+                <executions>
+                    <!-- This requires to be enabled manually as <enabled>true</enabled> doesn't
+                             work -->
+                    <!-- <execution> -->
+                    <!-- <id>add-datasource</id> -->
+                    <!-- <phase>package</phase> -->
+                    <!-- <configuration> -->
+                    <!-- <address>subsystem=datasources,data-source=java:/bookingDatasource</address> -->
+                    <!-- <properties> -->
+                    <!-- <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url> -->
+                    <!-- <jndi-name>java:/bookingDatasource</jndi-name> -->
+                    <!-- <enabled>true</enabled> -->
+                    <!-- <pool-name>bookingDSPool</pool-name> -->
+                    <!-- <user-name>sa</user-name> -->
+                    <!-- <driver-name>h2</driver-name> -->
+                    <!-- </properties> -->
+                    <!-- </configuration> -->
+                    <!-- <goals> -->
+                    <!-- <goal>add-resource</goal> -->
+                    <!-- </goals> -->
+                    <!-- </execution> -->
+                    <!-- Datasource has to be created before running deploy -->
+                    <execution>
+                        <phase>install</phase>
+                        <goals>
+                            <goal>deploy</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>exploded</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-dependency-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>unpack</id>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>unpack</goal>
+                                </goals>
+                                <configuration>
+                                    <artifactItems>
+                                        <artifactItem>
+                                            <groupId>org.jboss.seam.examples-ee6</groupId>
+                                            <artifactId>tasks-ear</artifactId>
+                                            <type>ear</type>
+                                            <overWrite>true</overWrite>
+                                            <outputDirectory>${project.build.directory}/${project.build.finalName}-exploded/${project.build.finalName}.ear</outputDirectory>
+                                        </artifactItem>
+                                        <artifactItem>
+                                            <groupId>org.jboss.seam.examples-ee6</groupId>
+                                            <artifactId>tasks-web</artifactId>
+                                            <type>war</type>
+                                            <overWrite>true</overWrite>
+                                            <outputDirectory>${project.build.directory}/${project.build.finalName}-exploded/${project.build.finalName}.ear/${example.name}-web.war</outputDirectory>
+                                        </artifactItem>
+                                        <artifactItem>
+                                            <groupId>org.jboss.seam.examples-ee6</groupId>
+                                            <artifactId>tasks-ejb</artifactId>
+                                            <type>jar</type>
+                                            <overWrite>true</overWrite>
+                                            <outputDirectory>${project.build.directory}/${project.build.finalName}-exploded/${project.build.finalName}.ear/${example.name}-ejb.jar</outputDirectory>
+                                        </artifactItem>
+                                    </artifactItems>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>jboss-maven-plugin</artifactId>
+                        <configuration>
+                            <jbossHome>${jboss.home}</jbossHome>
+                            <serverName>${jboss.domain}</serverName>
+                            <fileNames>
+                                <directory>${project.build.directory}/${project.build.finalName}-exploded/${project.build.finalName}.ear</directory>
+                            </fileNames>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+</project>

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/application/META-INF/jboss-deployment-structure.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/application/META-INF/jboss-deployment-structure.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/application/META-INF/jboss-deployment-structure.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,12 @@
+<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
+  <deployment>
+      <dependencies>
+<!--           <module name="org.apache.log4j" export="true"/> -->
+          <module name="org.dom4j" export="true"/>
+<!--           <module name="org.apache.commons.logging" export="true"/> -->
+<!--           <module name="org.apache.commons.collections" export="true"/> -->
+          <module name="javax.faces.api" export="true"/>
+          <module name="com.sun.jsf-impl" export="true"/>
+        </dependencies>
+  </deployment>  
+</jboss-deployment-structure> 
\ No newline at end of file

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/resources/jboss-seam-tasks-ds.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/resources/jboss-seam-tasks-ds.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/resources/jboss-seam-tasks-ds.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -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>
+

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/pom.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/pom.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>tasks</artifactId>
+        <groupId>org.jboss.seam.examples-ee6</groupId>
+        <version>2.3.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>tasks-ejb</artifactId>
+    <packaging>ejb</packaging>
+    <name>Tasks EJB Module (EE6)</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.jboss.seam</groupId>
+	    <artifactId>jboss-seam</artifactId>
+	    <version>${project.version}</version>
+            <type>ejb</type>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.seam</groupId>
+	    <artifactId>jboss-seam-resteasy</artifactId>
+	    <version>2.3.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-validator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate.javax.persistence</groupId>
+            <artifactId>hibernate-jpa-2.0-api</artifactId>
+        </dependency>
+    </dependencies>
+</project>

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/Authenticator.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/Authenticator.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/Authenticator.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,77 @@
+/*
+ * 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;
+
+import javax.persistence.EntityManager;
+
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Logger;
+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.log.Log;
+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;
+   @Logger
+   private Log log;
+
+   public boolean authenticate()
+   {
+      user = entityManager.find(User.class, credentials.getUsername());
+      if ((user != null) && (user.getPassword().equals(credentials.getPassword())))
+      {
+         if (user.isAdmin())
+         {
+            log.info("Admin rights granted for {0}", user.getUsername());
+            identity.addRole("admin");
+         }
+         return true;
+      }
+      else
+      {
+         return false;
+      }
+   }
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/CategoryHome.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/CategoryHome.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/CategoryHome.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,45 @@
+/*
+ * 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;
+
+import org.jboss.seam.annotations.AutoCreate;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.example.tasks.entity.Category;
+import org.jboss.seam.framework.EntityHome;
+
+/**
+ * 
+ * @author Jozef Hartinger
+ *
+ */
+ at Name("categoryHome")
+ at AutoCreate
+public class CategoryHome extends EntityHome<Category>
+{
+
+   public Category findByUsernameAndCategory(String username, String category)
+   {
+      setInstance((Category) getEntityManager().createNamedQuery("categoryByNameAndUser").setParameter("username", username).setParameter("category", category).getSingleResult());
+      return getInstance();
+   }
+
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/ResourceNotFoundException.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/ResourceNotFoundException.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/ResourceNotFoundException.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,41 @@
+/*
+ * 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;
+
+/**
+ * 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);
+   }
+
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/entity/Category.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/entity/Category.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/entity/Category.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,116 @@
+/*
+ * 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.entity;
+
+import org.hibernate.validator.NotNull;
+
+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;
+
+/**
+ * 
+ * @author Jozef Hartinger
+ *
+ */
+ at Entity
+ at XmlRootElement
+ at Table(uniqueConstraints = @UniqueConstraint(columnNames = { "NAME", "OWNER_USERNAME" }))
+ at NamedQuery(name = "categoryByNameAndUser", query = "select category from Category category where category.owner.username like :username and category.name like :category")
+public class Category
+{
+   private Long id;
+   private String name;
+   private List<Task> tasks;
+   private User owner;
+
+   public Category()
+   {
+   }
+
+   public Category(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 = "category", 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;
+   }
+
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/entity/Task.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/entity/Task.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/entity/Task.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,117 @@
+/*
+ * 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.entity;
+
+import org.hibernate.validator.NotNull;
+
+import javax.persistence.*;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+import java.util.Date;
+
+/**
+ * @author Jozef Hartinger
+ */
+ at Entity
+ at XmlRootElement
+ at NamedQuery(name = "taskByNameAndCategory", query = "select task from Task task where task.name like :task and task.category.id = :category")
+public class Task {
+   private Long id;
+   private String name;
+   private boolean resolved;
+   private Date created;
+   private Date updated;
+   private Category category;
+
+   @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 Category getCategory() {
+      return category;
+   }
+
+
+   public void setCategory(Category category) {
+      this.category = category;
+   }
+
+   @Transient
+   @XmlElement(name = "category")
+   public String getCategoryName() {
+      return category.getName();
+   }
+
+   @Transient
+   public User getOwner() {
+      return category.getOwner();
+   }
+
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/entity/User.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/entity/User.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/entity/User.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -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.entity;
+
+import org.hibernate.validator.NotNull;
+
+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;
+
+/**
+ * 
+ * @author Jozef Hartinger
+ *
+ */
+ at Entity
+ at XmlRootElement
+public class User
+{
+   private String username;
+   private String password;
+   private List<Category> categories;
+   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<Category> getCategories()
+   {
+      return categories;
+   }
+
+   public void setCategories(List<Category> categories)
+   {
+      this.categories = categories;
+   }
+
+   public boolean isAdmin()
+   {
+      return admin;
+   }
+
+   public void setAdmin(boolean admin)
+   {
+      this.admin = admin;
+   }
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/CategoryResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/CategoryResource.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/CategoryResource.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -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.CategoryHome;
+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 categories. To create new category, simply send a PUT request
+ * without entity body to /auth/category/name where "name" is the name of
+ * category. Same path applies for retrieving and deleting of category.
+ * 
+ * @author Jozef Hartinger
+ * 
+ */
+
+ at Path("/auth/category/{category}")
+ at Name("categoryResource")
+ at Produces( { "application/xml", "application/json", "application/fastinfoset" })
+ at Consumes( { "application/xml", "application/json", "application/fastinfoset" })
+public class CategoryResource
+{
+   @In
+   private CategoryHome categoryHome;
+
+   @javax.ws.rs.core.Context
+   private UriInfo uriInfo;
+
+   @In
+   private User user;
+
+   @PathParam("category")
+   private String category;
+
+   @GET
+   public Response getCategory()
+   {
+      return Response.ok(categoryHome.findByUsernameAndCategory(user.getUsername(), category)).build();
+   }
+
+   @PUT
+   public Response putCategory()
+   {
+      categoryHome.getInstance().setName(category);
+      categoryHome.getInstance().setOwner(user);
+      // may cause exception if user already has a category with that name
+      // in that case the exception is handled by exception mapper
+      categoryHome.persist();
+      return Response.created(uriInfo.getAbsolutePath()).build();
+   }
+
+   @DELETE
+   public void deleteCategory()
+   {
+      categoryHome.findByUsernameAndCategory(user.getUsername(), category);
+      categoryHome.remove();
+   }
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/ResolvedTaskResourceQuery.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/ResolvedTaskResourceQuery.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/ResolvedTaskResourceQuery.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,109 @@
+/*
+ * 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.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("category.owner.username = #{resolvedTaskResourceQuery.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;
+   }
+
+   public String getUsername()
+   {
+      return username;
+   }
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/TaskResourceHome.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/TaskResourceHome.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/TaskResourceHome.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -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.CategoryHome;
+import org.jboss.seam.example.tasks.ResourceNotFoundException;
+import org.jboss.seam.example.tasks.entity.Task;
+import org.jboss.seam.example.tasks.entity.User;
+import org.jboss.seam.framework.EntityHome;
+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/category/{category}/{status}")
+ at Name("taskResourceHome")
+public class TaskResourceHome extends ResourceHome<Task, Long>
+{
+
+   @PathParam("status")
+   private String taskStatus;
+   @In
+   private User user;
+   @In
+   private CategoryHome categoryHome;
+   @In
+   private EntityHome<Task> taskHome;
+   @PathParam("category")
+   private String categoryName;
+
+   public TaskResourceHome()
+   {
+      setMediaTypes(new String[] { "application/xml", "application/json", "application/fastinfoset" });
+   }
+
+   @Override
+   public Task getEntity(Long id)
+   {
+      Task task = super.getEntity(id);
+      if (!task.getCategory().getName().equals(categoryName) || !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.setCategory(categoryHome.findByUsernameAndCategory(user.getUsername(), categoryName));
+      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.setCategory(categoryHome.findByUsernameAndCategory(user.getUsername(), categoryName));
+      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();
+      }
+   }
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/TaskResourceQuery.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/TaskResourceQuery.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/TaskResourceQuery.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -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 category. Unresolved tasks can
+ * be obtained by sending HTTP GET request to category/{category}/unresolved URI.
+ * To obtain a list of already resolved tasks, use category/{category}/resolved
+ * URI.
+ * 
+ * @author Jozef Hartinger
+ * 
+ */
+ at Name("taskResourceQuery")
+ at Path("/auth/category/{category}/{status}")
+public class TaskResourceQuery extends ResourceQuery<Task>
+{
+
+   @PathParam("category")
+   private String categoryName;
+   @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("category.name = #{categoryName}");
+      restrictions.add("resolved = #{taskStatus}");
+      restrictions.add("category.owner.username = #{user.username}");
+      getEntityQuery().setRestrictionExpressionStrings(restrictions);
+   }
+
+   @Factory("categoryName")
+   public String getCategoryName()
+   {
+      return categoryName;
+   }
+
+   @Factory("taskStatus")
+   public boolean isResolved()
+   {
+      if (taskStatus.equals("resolved"))
+      {
+         return true;
+      }
+      else if (taskStatus.equals("unresolved"))
+      {
+         return false;
+      }
+      else
+      {
+         throw new ResourceNotFoundException();
+      }
+   }
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/UserResourceHome.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/UserResourceHome.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/java/org/jboss/seam/example/tasks/resource/UserResourceHome.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,60 @@
+/*
+ * 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.Restrict;
+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, however only
+ * users with admin permission are allowed to access it.
+ * 
+ * @author Jozef Hartinger
+ * 
+ */
+ at Path("/auth/user")
+ at Name("userResourceHome")
+ at Restrict("#{s:hasRole('admin')}")
+public class UserResourceHome extends ResourceHome<User, String>
+{
+
+   public UserResourceHome()
+   {
+      setMediaTypes(new String[] { "application/xml", "application/json", "application/fastinfoset" });
+   }
+
+   @In
+   private EntityHome<User> userHome;
+
+   @Override
+   public EntityHome getEntityHome()
+   {
+      return userHome;
+   }
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/META-INF/ejb-jar.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/META-INF/ejb-jar.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/META-INF/ejb-jar.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" 
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
+         version="3.0">
+         
+   <interceptors>
+     <interceptor>
+       <interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
+     </interceptor>
+   </interceptors>
+   
+   <assembly-descriptor>
+      <interceptor-binding>
+         <ejb-name>*</ejb-name>
+         <interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
+      </interceptor-binding>
+   </assembly-descriptor>
+   
+</ejb-jar>

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/META-INF/persistence.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/META-INF/persistence.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/META-INF/persistence.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
+             version="1.0">
+    <persistence-unit name="messageDatabase">
+        <provider>org.hibernate.ejb.HibernatePersistence</provider>
+        <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
+        <properties>
+            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+        </properties>
+    </persistence-unit>
+</persistence>
\ No newline at end of file

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/import.sql
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/import.sql	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/import.sql	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,26 @@
+insert into User (username, password, admin) values ('demo', 'demo', false)
+insert into User (username, password, admin) values ('admin', 'password', true)
+
+insert into Category (id, name, owner_username) values (1, 'School', 'demo')
+insert into Task (id, name, resolved, created, updated, category_id) values (2, 'Build the Turing machine', false, '2009-04-19 16:11:05', null, 1)
+insert into Task (id, name, resolved, created, updated, category_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, category_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, category_id) values (5, 'Prepare a presentation for webdesign seminar', false, '2009-04-19 16:11:05', null, 1)
+
+insert into Category (id, name, owner_username) values (2, 'Work', 'demo')
+insert into Task (id, name, resolved, created, updated, category_id) values (6, 'Pick up meal tickets', false, '2009-04-19 16:11:05', null, 2)
+
+insert into Category (id, name, owner_username) values (3, 'Buy', 'demo')
+insert into Task (id, name, resolved, created, updated, category_id) values (7, 'Buy milk', false, '2009-04-19 16:11:05', null, 3)
+insert into Task (id, name, resolved, created, updated, category_id) values (8, 'Buy an infinite tape', false, '2009-04-19 16:11:05', null, 3)
+insert into Task (id, name, resolved, created, updated, category_id) values (9, 'Order books', false, '2009-04-19 16:11:05', null, 3)
+insert into Task (id, name, resolved, created, updated, category_id) values (10, 'Buy a turtle', true, '2009-04-19 16:11:05', '2009-04-22 13:15:33', 3)
+
+insert into Category (id, name, owner_username) values (4, 'Other stuff', 'demo')
+insert into Task (id, name, resolved, created, updated, category_id) values (11, 'Learn to fly', false, '2009-04-19 16:11:05', null, 4)
+insert into Task (id, name, resolved, created, updated, category_id) values (12, 'Visit grandma', false, '2009-04-19 16:11:05', null, 4)
+insert into Task (id, name, resolved, created, updated, category_id) values (13, 'Extend passport', false, '2009-04-19 16:11:05', null, 4)
+insert into Task (id, name, resolved, created, updated, category_id) values (14, 'Get a haircut', false, '2009-04-19 16:11:05', null, 4)
+
+insert into Category (id, name, owner_username) values (5, 'Administration', 'admin')
+insert into Task (id, name, resolved, created, updated, category_id) values (15, 'Ban demo user :-)', false, '2009-05-04 12:35:13', null, 5)

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/src/main/resources/seam.properties
===================================================================
Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/pom.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/pom.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+   <modelVersion>4.0.0</modelVersion>
+   <parent>
+      <artifactId>tasks</artifactId>
+      <groupId>org.jboss.seam.examples-ee6</groupId>
+      <version>2.3.0-SNAPSHOT</version>
+      <relativePath>../pom.xml</relativePath>
+   </parent>
+
+   <groupId>org.jboss.seam.examples-ee6</groupId>
+   <artifactId>tasks-seamtest</artifactId>
+   <name>Tasks Seam Test Module (EE6)</name>
+
+   <dependencies>
+      <dependency>
+         <groupId>org.jboss.embedded</groupId>
+         <artifactId>jboss-embedded-all</artifactId>
+         <version>2.3.0-SNAPSHOT</version>
+         <exclusions>
+            <exclusion>
+               <groupId>org.jboss.microcontainer</groupId>
+               <artifactId>jboss-deployers-client-spi</artifactId>
+            </exclusion>
+            <exclusion>
+               <groupId>org.jboss.microcontainer</groupId>
+               <artifactId>jboss-deployers-core-spi</artifactId>
+            </exclusion>
+         </exclusions>
+      </dependency>
+      <dependency>
+         <groupId>org.jboss.seam.embedded</groupId>
+         <artifactId>thirdparty-all</artifactId>
+         <version>2.3.0-SNAPSHOT</version>
+      </dependency>
+      <dependency>
+         <groupId>org.jboss.seam.embedded</groupId>
+         <artifactId>hibernate-all</artifactId>
+      </dependency>
+      <dependency>
+         <groupId>org.testng</groupId>
+         <artifactId>testng</artifactId>
+         <classifier>jdk15</classifier>
+      </dependency>
+      <dependency>
+         <groupId>org.jboss.seam.examples-ee6</groupId>
+         <artifactId>tasks-ejb</artifactId>
+         <type>ejb</type>
+         <scope>test</scope>
+      </dependency>
+      <dependency>
+         <groupId>org.jboss.seam</groupId>
+         <artifactId>jboss-seam</artifactId>
+         <type>ejb</type>
+         <scope>test</scope>
+      </dependency>
+      <dependency>
+         <groupId>org.slf4j</groupId>
+         <artifactId>slf4j-log4j12</artifactId>
+         <scope>test</scope>
+      </dependency>
+      <dependency>
+         <groupId>javax.faces</groupId>
+         <artifactId>jsf-api</artifactId>
+      </dependency>
+      <dependency>
+         <groupId>javax.mail</groupId>
+         <artifactId>mail</artifactId>
+      </dependency>
+      <dependency>
+         <groupId>org.seleniumhq.selenium.server</groupId>
+         <artifactId>selenium-server</artifactId>
+         <classifier>standalone</classifier>
+      </dependency>
+      <dependency>
+         <groupId>org.seleniumhq.selenium.client-drivers</groupId>
+         <artifactId>selenium-java-client-driver</artifactId>
+      </dependency>
+      <dependency>
+         <groupId>org.jboss.seam</groupId>
+         <artifactId>functional-tests</artifactId>
+         <scope>test</scope>
+      </dependency>
+   </dependencies>
+
+   <build>
+      <testResources>
+         <testResource>
+            <directory>src/test/resources</directory>
+            <filtering>true</filtering>
+         </testResource>
+         <testResource>
+            <directory>src/test/bootstrap</directory>
+            <filtering>false</filtering>
+         </testResource>
+      </testResources>
+      <plugins>
+         <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+               <skipTests>false</skipTests>
+               <argLine>-Dsun.lang.ClassLoader.allowArraySyntax=true -Xms512m -Xmx512m</argLine>
+               <additionalClasspathElements>
+                  <additionalClasspathElement>${basedir}/../tasks-web/src/main/webapp</additionalClasspathElement>
+               </additionalClasspathElements>
+               <suiteXmlFiles>
+                  <suiteXmlFile>src/test/resources-integration/testng.xml</suiteXmlFile>
+               </suiteXmlFiles>
+            </configuration>
+         </plugin>
+         <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-dependency-plugin</artifactId>
+            <executions>
+               <execution>
+                  <id>copy-seam-bootstrap</id>
+                  <phase>process-resources</phase>
+                  <goals>
+                     <goal>unpack</goal>
+                  </goals>
+                  <configuration>
+                     <artifactItems>
+                        <artifactItem>
+                           <groupId>org.jboss.seam</groupId>
+                           <artifactId>jboss-embedded-bootstrap</artifactId>
+                           <version>${project.version}</version>
+                           <type>jar</type>
+                           <overWrite>false</overWrite>
+                           <outputDirectory>${basedir}/src/test</outputDirectory>
+                        </artifactItem>
+                     </artifactItems>
+                  </configuration>
+               </execution>
+            </executions>
+         </plugin>
+         <plugin>
+            <artifactId>maven-clean-plugin</artifactId>
+            <configuration>
+               <filesets>
+                  <fileset>
+                     <directory>${basedir}/src/test/META-INF/</directory>
+                  </fileset>
+                  <fileset>
+                     <directory>${basedir}/src/test/bootstrap</directory>
+                  </fileset>
+               </filesets>
+            </configuration>
+         </plugin>
+      </plugins>
+   </build>
+
+   <profiles>
+      <profile>
+         <id>ftest-jbossas</id>
+         <properties>
+            <example.context.path>seam-tasks</example.context.path>
+         </properties>
+         <build>
+            <plugins>
+               <plugin>
+                  <groupId>org.codehaus.mojo</groupId>
+                  <artifactId>jboss-maven-plugin</artifactId>
+                  <configuration>
+                     <jbossHome>${jboss.home}</jbossHome>
+                     <serverName>${jboss.domain}</serverName>
+                     <fileNames>
+                        <param>${basedir}/../tasks-ear/target/seam-tasks.ear</param>
+                     </fileNames>
+                  </configuration>
+               </plugin>
+               <plugin>
+                  <groupId>org.codehaus.mojo</groupId>
+                  <artifactId>selenium-maven-plugin</artifactId>
+               </plugin>
+               <plugin>
+                  <groupId>org.codehaus.mojo</groupId>
+                  <artifactId>failsafe-maven-plugin</artifactId>
+               </plugin>
+               <plugin>
+                  <groupId>org.apache.maven.plugins</groupId>
+                  <artifactId>maven-antrun-plugin</artifactId>
+               </plugin>
+            </plugins>
+         </build>
+      </profile>
+      <profile>
+         <id>ftest-tomcat</id>
+         <properties>
+            <example.context.path>jboss-seam-tasks</example.context.path>
+         </properties>
+         <build>
+            <plugins>
+               <plugin>
+                  <groupId>org.codehaus.mojo</groupId>
+                  <artifactId>selenium-maven-plugin</artifactId>
+               </plugin>
+               <plugin>
+                  <groupId>org.codehaus.mojo</groupId>
+                  <artifactId>failsafe-maven-plugin</artifactId>
+               </plugin>
+               <plugin>
+                  <groupId>org.apache.maven.plugins</groupId>
+                  <artifactId>maven-antrun-plugin</artifactId>
+               </plugin>
+            </plugins>
+         </build>
+      </profile>
+   </profiles>
+
+</project>

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/CategoryResourceTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/CategoryResourceTest.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/CategoryResourceTest.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,170 @@
+/*
+ * 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.mock.SeamTest;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.Method;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.ResourceRequest;
+import org.jboss.seam.mock.EnhancedMockHttpServletRequest;
+import org.jboss.seam.mock.EnhancedMockHttpServletResponse;
+import org.jboss.seam.mock.ResourceRequestEnvironment;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+/**
+ * Test class for /category part of API
+ * @author Jozef Hartinger
+ *
+ */
+public class CategoryResourceTest extends SeamTest
+{
+   @DataProvider(name = "query")
+   public String[][] getQueryData()
+   {
+      return new String[][] { new String[] { "application/xml", "<category><name>School</name></category>" }, new String[] { "application/json", "{\"category\":{\"name\":\"School\"}}" } };
+   }
+
+   @Test(dataProvider = "query")
+   public void getCategoryListTest(final String contentType, final String expectedResponse) throws Exception
+   {
+      new ResourceRequest(new ResourceRequestEnvironment(this), Method.GET, "/v1/auth/category")
+      {
+
+         @Override
+         protected void prepareRequest(EnhancedMockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Accept", contentType);
+            request.addHeader("Authorization", "Basic ZGVtbzpkZW1v"); // demo:demo
+         }
+
+         @Override
+         protected void onResponse(EnhancedMockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 200, "Unexpected response code.");
+            assertTrue(response.getContentAsString().contains(expectedResponse), "Unexpected response.");
+         }
+
+      }.run();
+   }
+
+   @Test
+   public void deleteCategoryTest() throws Exception
+   {
+      new ResourceRequest(new ResourceRequestEnvironment(this), Method.DELETE, "/v1/auth/category/Work")
+      {
+
+         @Override
+         protected void prepareRequest(EnhancedMockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Accept", "application/xml");
+            request.addHeader("Authorization", "Basic ZGVtbzpkZW1v"); // demo:demo
+         }
+
+         @Override
+         protected void onResponse(EnhancedMockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 204, "Unexpected response code.");
+         }
+
+      }.run();
+   }
+
+   @Test
+   public void createCategoryTest() throws Exception
+   {
+      
+      final String uri = "/v1/auth/category/Test%20Category";
+      final String mimeType = "application/json";
+      final String expectedResponse = "{\"category\":{\"name\":\"Test Category\"}}";
+      
+      new ResourceRequest(new ResourceRequestEnvironment(this), Method.PUT, uri)
+      {
+
+         @Override
+         protected void prepareRequest(EnhancedMockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Authorization", "Basic ZGVtbzpkZW1v"); // demo:demo
+         }
+
+         @Override
+         protected void onResponse(EnhancedMockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 201, "Unexpected response code.");
+         }
+
+      }.run();
+
+      new ResourceRequest(new ResourceRequestEnvironment(this), Method.GET, uri)
+      {
+
+         @Override
+         protected void prepareRequest(EnhancedMockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Accept", mimeType);
+            request.addHeader("Authorization", "Basic ZGVtbzpkZW1v"); // demo:demo
+         }
+
+         @Override
+         protected void onResponse(EnhancedMockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 200, "Unexpected response code.");
+            assertEquals(response.getContentAsString(), expectedResponse, "Unexpected response.");
+         }
+
+      }.run();
+   }
+
+   @Test
+   public void noAuthorizationHeaderTest() throws Exception
+   {
+      new ResourceRequest(new ResourceRequestEnvironment(this), Method.GET, "/v1/auth/category")
+      {
+
+         @Override
+         protected void prepareRequest(EnhancedMockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Accept", "application/xml");
+         }
+
+         @Override
+         protected void onResponse(EnhancedMockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 401, "Unexpected response code.");
+         }
+
+      }.run();
+   }
+
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/ResolvedTaskResourceQueryTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/ResolvedTaskResourceQueryTest.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/ResolvedTaskResourceQueryTest.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,107 @@
+/*
+ * 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.mock.SeamTest;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.Method;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.ResourceRequest;
+import org.jboss.seam.mock.EnhancedMockHttpServletRequest;
+import org.jboss.seam.mock.EnhancedMockHttpServletResponse;
+import org.jboss.seam.mock.ResourceRequestEnvironment;
+import org.testng.annotations.BeforeMethod;
+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 SeamTest
+{
+
+   // We could do this BeforeClass only once but we can't do ResourceRequests there
+   @BeforeMethod
+   public void resolveTask() throws Exception {
+      
+      final String mimeType = "application/xml";
+      final String representation = "<task><id>14</id></task>";
+      
+      new ResourceRequest(new ResourceRequestEnvironment(this), Method.PUT, "/v1/auth/category/School/resolved/14")
+      {
+
+         @Override
+         protected void prepareRequest(EnhancedMockHttpServletRequest 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(EnhancedMockHttpServletResponse 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(new ResourceRequestEnvironment(this), Method.GET, "/v1/user/demo/tasks/resolved")
+      {
+
+         @Override
+         protected void prepareRequest(EnhancedMockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Accept", mimeType);
+         }
+
+         @Override
+         protected void onResponse(EnhancedMockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 200, "Unexpected response code.");
+            assertTrue(response.getContentAsString().contains(expectedResponsePart), "Unexpected response.");
+         }
+
+      }.run();
+   }
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/TaskResourceTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/TaskResourceTest.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/TaskResourceTest.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,143 @@
+/*
+ * 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.mock.SeamTest;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.Method;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.ResourceRequest;
+import org.jboss.seam.mock.EnhancedMockHttpServletRequest;
+import org.jboss.seam.mock.EnhancedMockHttpServletResponse;
+import org.jboss.seam.mock.ResourceRequestEnvironment;
+import org.testng.annotations.Test;
+
+/**
+ * Test class for TaskResourceHome and TaskResourceQuery components.
+ * @author Jozef Hartinger
+ *
+ */
+public class TaskResourceTest extends SeamTest
+{
+   @Test
+   public void createTaskTest() throws Exception
+   {
+      final String mimeType = "application/json";
+      final String representation = "{\"task\":{\"name\":\"Test task\"}}";
+      
+      new ResourceRequest(new ResourceRequestEnvironment(this), Method.POST, "/v1/auth/category/School/unresolved")
+      {
+         
+         @Override
+         protected void prepareRequest(EnhancedMockHttpServletRequest 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(EnhancedMockHttpServletResponse 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(new ResourceRequestEnvironment(this), Method.PUT, "/v1/auth/category/School/unresolved/4")
+      {
+
+         @Override
+         protected void prepareRequest(EnhancedMockHttpServletRequest 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(EnhancedMockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 204, "Unexpected response code.");
+         }
+
+      }.run();
+
+      new ResourceRequest(new ResourceRequestEnvironment(this), Method.GET, "/v1/auth/category/School/unresolved/4")
+      {
+
+         @Override
+         protected void prepareRequest(EnhancedMockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Accept", "application/xml");
+            request.addHeader("Authorization", "Basic ZGVtbzpkZW1v"); // demo:demo
+         }
+
+         @Override
+         protected void onResponse(EnhancedMockHttpServletResponse 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(new ResourceRequestEnvironment(this), Method.DELETE, "/v1/auth/category/School/unresolved/2")
+      {
+         
+         @Override
+         protected void prepareRequest(EnhancedMockHttpServletRequest request)
+         {
+            super.prepareRequest(request);
+            request.addHeader("Authorization", "Basic ZGVtbzpkZW1v"); // demo:demo
+         }
+         
+         @Override
+         protected void onResponse(EnhancedMockHttpServletResponse response)
+         {
+            super.onResponse(response);
+            assertEquals(response.getStatus(), 204, "Unexpected response code.");
+         }
+         
+      }.run();
+   }
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/selenium/SeleniumTasksTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/selenium/SeleniumTasksTest.java	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/java/org/jboss/seam/example/tasks/test/selenium/SeleniumTasksTest.java	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,295 @@
+/*
+ * 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.selenium;
+
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+
+import org.jboss.seam.example.common.test.selenium.SeamSeleniumTest;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ * This is the base class for Tasks functional tests. Uses jQuery library and
+ * Selenium to match AJAX updates.
+ * 
+ * @author kpiwko
+ * 
+ */
+public class SeleniumTasksTest extends SeamSeleniumTest
+{
+
+   public static final String LOGIN_URL = "/login.seam";
+   public static final String TASKS_URL = "/tasks.seam";
+   public static final String LOGIN_USERNAME = "id=login:username";
+   public static final String LOGIN_PASSWORD = "id=login:password";
+   public static final String LOGIN_SUBMIT = "xpath=//input[@value='Login']";
+
+   public static final String ACTION_BUTTON_FORMATTER = "xpath=//td[contains(., '%s')]/ancestor::tr/descendant::img[@title='%s']";
+
+   public static final String RESOLVE_BTN_TITLE = "Resolve this task";
+   public static final String EDIT_BTN_TITLE = "Edit this task";
+   public static final String DELETE_BTN_TITLE = "Delete this task";
+   public static final String UNDO_BTN_TITLE = "Undo this task";
+   public static final String DELETE_BTN_CAT_TITLE = "Delete this category";
+
+   public static final String DEFAULT_USERNAME = "demo";
+   public static final String DEFAULT_PASSWORD = "demo";
+
+   public static final String TASKS_LINK = "xpath=//a[.='Tasks']";
+   public static final String RESOLVED_LINK = "xpath=//a[.='Resolved tasks']";
+   public static final String CATEGORIES_LINK = "xpath=//a[.='Categories']";
+   public static final String LOGOUT_LINK = "id=menuLogoutId";
+
+   public static final String EDIT_TASK_DESCRIPTION = "xpath=//form[@id='updateTask']/input[@class='nameField']";
+   public static final String EDIT_TASK_CATEGORY = "xpath=//form[@id='updateTask']/select[@id='editTaskCategory']";
+   public static final String EDIT_TASK_SUBMIT = "xpath=//form[@id='updateTask']/input[@id='update']";
+
+   public static final String NEW_TASK_DESCRIPTION = "xpath=//form[@id='newTask']/input[@id='editTaskName']";
+   public static final String NEW_TASK_CATEGORY = "xpath=//form[@id='newTask']/select[@id='editTaskCategory']";
+   public static final String NEW_TASK_SUBMIT = "xpath=//form[@id='newTask']/input[@id='editTaskSubmit']";
+
+   public static final String NEW_CATEGORY_DESCRIPTION = "xpath=//form[@id='newCategoryForm']/input[@id='editCategoryName']";
+   public static final String NEW_CATEGORY_SUBMIT = "xpath=//form[@id='newCategoryForm']/input[@id='editCategorySubmit']";
+
+   @BeforeMethod
+   @Override
+   public void setUp()
+   {
+      super.setUp();
+      browser.open(CONTEXT_PATH + LOGIN_URL);
+      browser.type(LOGIN_USERNAME, DEFAULT_USERNAME);
+      browser.type(LOGIN_PASSWORD, DEFAULT_PASSWORD);
+      navigate(LOGIN_SUBMIT);
+      assertTrue(browser.getLocation().contains(TASKS_URL), "Navigation failure. Tasks page expected.");
+   }
+
+   @Test(groups = { "school" })
+   public void resolveTuringTask()
+   {
+      String turing = "Build the Turing machine";
+      resolveTask(turing);
+      buttonMissing(turing, RESOLVE_BTN_TITLE);
+
+      navigate(RESOLVED_LINK);
+      buttonPresent(turing, UNDO_BTN_TITLE);
+      navigate(LOGOUT_LINK);
+   }
+
+   @Test
+   public void deleteMilkTask()
+   {
+      String milk = "Buy milk";
+      deleteTask(milk);
+      buttonMissing(milk, RESOLVE_BTN_TITLE);
+
+      navigate(RESOLVED_LINK);
+      buttonMissing(milk, UNDO_BTN_TITLE);
+      navigate(LOGOUT_LINK);
+   }
+
+   @Test(groups = { "turtle", "school" })
+   public void undoTurtleTask()
+   {
+      String turtle = "Buy a turtle";
+      navigate(RESOLVED_LINK);
+      undoTask(turtle);
+      buttonMissing(turtle, UNDO_BTN_TITLE);
+
+      navigate(TASKS_LINK);
+      buttonPresent(turtle, RESOLVE_BTN_TITLE);
+      navigate(LOGOUT_LINK);
+   }
+
+   @Test(dependsOnGroups = { "turtle" })
+   public void editTurtleTask()
+   {
+      String turtle = "Buy a turtle";
+      String newCategory = "Work";
+      String newDescription = "Buy a turtle and take it to work";
+      editTask(turtle, newCategory, newDescription);
+      buttonPresent(newDescription, RESOLVE_BTN_TITLE);
+      navigate(LOGOUT_LINK);
+   }
+
+   @Test(groups = { "qa" })
+   public void createQACategory()
+   {
+      String category = "JBoss QA";
+      navigate(CATEGORIES_LINK);
+      newCategory(category);
+      buttonPresent(category, DELETE_BTN_CAT_TITLE);
+      navigate(LOGOUT_LINK);
+   }
+
+   @Test(dependsOnGroups = { "qa" })
+   public void createSeleniumTask()
+   {
+      String description = "Create selenium ftests for all available examples";
+      newTask("Work", description);
+      buttonPresent(description, RESOLVE_BTN_TITLE);
+      navigate(LOGOUT_LINK);
+   }
+
+   @Test(dependsOnGroups = { "school" })
+   public void deleteSchoolCategory()
+   {
+      String category = "School";
+      navigate(CATEGORIES_LINK);
+      buttonPress(category, DELETE_BTN_CAT_TITLE);
+
+      buttonMissing(category, DELETE_BTN_CAT_TITLE);
+
+      // all tasks from category are deleted as well
+      navigate(TASKS_LINK);
+      buttonMissing("Finish the RESTEasy-Seam integration example", RESOLVE_BTN_TITLE);
+      navigate(LOGOUT_LINK);
+   }
+
+   /**
+    * Presses undo button for given task
+    * 
+    * @param task The task name
+    */
+   protected void undoTask(String task)
+   {
+      buttonPress(task, UNDO_BTN_TITLE);
+   }
+
+   /**
+    * Presses resolve button for given task
+    * 
+    * @param task The task name
+    */
+   protected void resolveTask(String task)
+   {
+      buttonPress(task, RESOLVE_BTN_TITLE);
+   }
+
+   /**
+    * Presses delete button for given task
+    * 
+    * @param task The task name
+    */
+   protected void deleteTask(String task)
+   {
+      buttonPress(task, DELETE_BTN_TITLE);
+   }
+
+   /**
+    * Goes to another page and waits for dynamic reload
+    * 
+    * @param anchor Locator of the anchor
+    */
+   protected void navigate(String anchor)
+   {
+      browser.clickAndWait(anchor);
+      browser.waitForAJAXUpdate();
+   }
+
+   /**
+    * Executes arbitrary button task, e.g. delete, undo, resolve
+    * 
+    * @param description Name of task or description on which an action is
+    *           triggered
+    * @param button Type of action to be triggered - title of the button
+    */
+   protected void buttonPress(String description, String button)
+   {
+      String btn = buttonPresent(description, button);
+      browser.click(btn);
+      browser.waitForAJAXUpdate();
+   }
+
+   /**
+    * Checks whether button is present on page
+    * 
+    * @param description The task/category associated with button
+    * @param button Button type label
+    * @return Button locator
+    */
+   protected String buttonPresent(String description, String button)
+   {
+      String btn = String.format(ACTION_BUTTON_FORMATTER, description, button);
+      assertTrue(browser.isElementPresent(btn), "There should be a '" + button + "' button for: " + description + ".");
+      return btn;
+   }
+
+   /**
+    * Checks whether button is not present on page
+    * 
+    * @param description The task/category associated with button
+    * @param button Button type label
+    * @return Button locator
+    */
+   protected String buttonMissing(String task, String button)
+   {
+      String btn = String.format(ACTION_BUTTON_FORMATTER, task, button);
+      assertFalse(browser.isElementPresent(btn), "There should NOT be a '" + button + "' button for: " + task + ".");
+      return btn;
+   }
+
+   /**
+    * Creates new task
+    * 
+    * @param category Category of the task
+    * @param description Description of the task
+    */
+   protected void newTask(String category, String description)
+   {
+      browser.select(NEW_TASK_CATEGORY, String.format("value=%s", category));
+      browser.type(NEW_TASK_DESCRIPTION, description);
+      browser.click(NEW_TASK_SUBMIT);
+      browser.waitForAJAXUpdate();
+   }
+
+   /**
+    * Edits task
+    * 
+    * @param task Old description of the task
+    * @param newCategory New category
+    * @param newDescription Old description of the task
+    */
+   protected void editTask(String task, String newCategory, String newDescription)
+   {
+      String btn = buttonPresent(task, EDIT_BTN_TITLE);
+      browser.click(btn);
+      browser.waitForAJAXUpdate();
+      browser.select(EDIT_TASK_CATEGORY, String.format("value=%s", newCategory));
+      browser.type(EDIT_TASK_DESCRIPTION, newDescription);
+      browser.click(EDIT_TASK_SUBMIT);
+      browser.waitForAJAXUpdate();
+   }
+
+   /**
+    * Creates new category
+    * 
+    * @param category Category description
+    */
+   protected void newCategory(String category)
+   {
+      browser.type(NEW_CATEGORY_DESCRIPTION, category);
+      browser.click(NEW_CATEGORY_SUBMIT);
+      browser.waitForAJAXUpdate();
+   }
+
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources/WEB-INF/components.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources/WEB-INF/components.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources/WEB-INF/components.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components xmlns="http://jboss.com/products/seam/components"
+	xmlns:core="http://jboss.com/products/seam/core" xmlns:security="http://jboss.com/products/seam/security"
+	xmlns:transaction="http://jboss.com/products/seam/transaction"
+	xmlns:persistence="http://jboss.com/products/seam/persistence"
+	xmlns:framework="http://jboss.com/products/seam/framework" xmlns:web="http://jboss.com/products/seam/web"
+	xmlns:resteasy="http://jboss.com/products/seam/resteasy" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.3.xsd
+		http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.3.xsd
+        http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.3.xsd
+        http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.3.xsd
+        http://jboss.com/products/seam/framework http://jboss.com/products/seam/framework-2.3.xsd
+        http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.3.xsd
+        http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.3.xsd
+        http://jboss.com/products/seam/resteasy http://jboss.com/products/seam/resteasy-2.3.xsd">
+
+	<core:init jndi-pattern="#{ejbName}/local" debug="false" />
+
+	<core:manager conversation-timeout="120000"
+		concurrent-request-timeout="500" conversation-id-parameter="cid" />
+
+	<transaction:ejb-transaction />
+
+	<persistence:managed-persistence-context
+	name="entityManager" auto-create="true" persistence-unit-jndi-name="java:/tasksEntityManagerFactory" />
+
+	<framework:entity-home name="userHome"
+		entity-class="org.jboss.seam.example.tasks.entity.User" auto-create="true" />
+		
+	<framework:entity-home name="taskHome"
+		entity-class="org.jboss.seam.example.tasks.entity.Task" auto-create="true" />
+
+	<framework:entity-query name="categoryQuery"
+		ejbql="select c from Category c">
+		<framework:restrictions>
+			<value>c.owner.username =
+				#{user.username}</value>
+		</framework:restrictions>
+	</framework:entity-query>
+
+	<resteasy:resource-query name="categoryResourceQuery"
+		entity-query="#{categoryQuery}" path="/auth/category"
+		entity-class="org.jboss.seam.example.tasks.entity.Category"
+		media-types="application/xml application/json application/fastinfoset"/>
+
+	<resteasy:application resource-path-prefix="/v1" destroy-session-after-request="false">
+		<resteasy:media-type-mappings>
+			<key>xml</key>
+			<value>application/xml</value>
+		</resteasy:media-type-mappings>
+	</resteasy:application>
+
+
+	<web:authentication-filter url-pattern="/seam/resource/v1/auth/*"
+	auth-type="basic" realm="Seam Tasks Application" />
+
+	<security:identity authenticate-method="#{authenticator.authenticate}" />
+
+</components>

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources/seam.properties
===================================================================
Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources-ftest/testng.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources-ftest/testng.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources-ftest/testng.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,30 @@
+<!--
+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.
+--> 
+<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
+<suite name="Tasks example" verbose="2" parallel="false">
+   <test name="tasks_tests">
+      <parameter name="PROPERTY_FILE" value="" />
+      <packages>
+         <package name="org.jboss.seam.example.tasks.test.selenium" />
+      </packages>
+   </test>
+</suite>


Property changes on: branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources-ftest/testng.xml
___________________________________________________________________
Added: svn:executable
   + *

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources-integration/testng.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources-integration/testng.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-seamtest/src/test/resources-integration/testng.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -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.CategoryResourceTest"/>
+            <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

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/pom.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/pom.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>tasks</artifactId>
+        <groupId>org.jboss.seam.examples-ee6</groupId>
+        <version>2.3.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>tasks-web</artifactId>
+    <packaging>war</packaging>
+    <name>Tasks Web Module (EE6)</name>
+
+    <properties>
+        <!-- filtering property for components.xml -->
+        <jndiPattern>java:app/tasks-ejb/#{ejbName}</jndiPattern>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.jboss.seam.examples-ee6</groupId>
+            <artifactId>tasks-ejb</artifactId>
+            <type>ejb</type>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.seam</groupId>
+            <artifactId>jboss-seam-ui-jsf2</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.jboss.seam</groupId>
+                    <artifactId>jboss-seam-jul</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-collections</groupId>
+                    <artifactId>commons-collections</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.seam</groupId>
+            <artifactId>jboss-seam-jsf2</artifactId>
+            <version>${project.version}</version>
+            <type>ejb</type>
+            <scope>provided</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>jboss</groupId>
+                    <artifactId>javassist</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.faces</groupId>
+            <artifactId>jsf-api</artifactId>
+            <version>${version.jsf2}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.faces</groupId>
+            <artifactId>jsf-impl</artifactId>
+            <version>${version.jsf2}</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <configuration>
+                    <webResources>
+                        <resource>
+                            <directory>src/main/webapp</directory>
+                            <filtering>true</filtering>
+                        </resource>
+                    </webResources>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>tomcat</id>
+            <properties>
+                <!-- filtering property for components.xml -->
+                <jndiPattern>#{ejbName}/local</jndiPattern>
+            </properties>
+            <dependencies>
+                <dependency>
+                    <groupId>org.jboss.seam.examples-ee6</groupId>
+                    <artifactId>tasks-ejb</artifactId>
+                    <type>ejb</type>
+                    <scope>compile</scope>
+                </dependency>
+                <dependency>
+                    <groupId>org.jboss.seam</groupId>
+                    <artifactId>jboss-seam</artifactId>
+                    <type>ejb</type>
+                    <scope>compile</scope>
+                    <exclusions>
+                        <exclusion>
+                            <groupId>com.thoughtworks.xstream</groupId>
+                            <artifactId>xstream</artifactId>
+                        </exclusion>
+                        <exclusion>
+                            <groupId>xpp3</groupId>
+                            <artifactId>xpp3_min</artifactId>
+                        </exclusion>
+                    </exclusions>
+                </dependency>
+                <dependency>
+                    <groupId>javax.faces</groupId>
+                    <artifactId>jsf-api</artifactId>
+                    <scope>compile</scope>
+                </dependency>
+                <dependency>
+                    <groupId>javax.faces</groupId>
+                    <artifactId>jsf-impl</artifactId>
+                    <scope>compile</scope>
+                </dependency>
+            </dependencies>
+            <build>
+                <finalName>jboss-seam-tasks</finalName>
+            </build>
+        </profile>
+    </profiles>
+
+</project>

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/components.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/components.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/components.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components xmlns="http://jboss.com/products/seam/components"
+	xmlns:core="http://jboss.com/products/seam/core" xmlns:security="http://jboss.com/products/seam/security"
+	xmlns:transaction="http://jboss.com/products/seam/transaction"
+	xmlns:persistence="http://jboss.com/products/seam/persistence"
+	xmlns:framework="http://jboss.com/products/seam/framework" xmlns:web="http://jboss.com/products/seam/web"
+	xmlns:resteasy="http://jboss.com/products/seam/resteasy" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.3.xsd
+		http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.3.xsd
+        http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.3.xsd
+        http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.3.xsd
+        http://jboss.com/products/seam/framework http://jboss.com/products/seam/framework-2.3.xsd
+        http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.3.xsd
+        http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.3.xsd
+        http://jboss.com/products/seam/resteasy http://jboss.com/products/seam/resteasy-2.3.xsd">
+
+	<core:init jndi-pattern="@jndiPattern@" debug="false" />
+
+	<core:manager conversation-timeout="120000"
+		concurrent-request-timeout="500" conversation-id-parameter="cid" />
+
+	<transaction:ejb-transaction />
+
+	<persistence:managed-persistence-context
+	name="entityManager" auto-create="true" persistence-unit-jndi-name="java:/tasksEntityManagerFactory" />
+
+	<framework:entity-home name="userHome"
+		entity-class="org.jboss.seam.example.tasks.entity.User" auto-create="true" />
+		
+	<framework:entity-home name="taskHome"
+		entity-class="org.jboss.seam.example.tasks.entity.Task" auto-create="true" />
+
+	<framework:entity-query name="categoryQuery"
+		ejbql="select c from Category c">
+		<framework:restrictions>
+			<value>c.owner.username =
+				#{user.username}</value>
+		</framework:restrictions>
+	</framework:entity-query>
+
+	<resteasy:resource-query name="categoryResourceQuery"
+		entity-query="#{categoryQuery}" path="/auth/category"
+		entity-class="org.jboss.seam.example.tasks.entity.Category"
+		media-types="application/xml application/json application/fastinfoset"/>
+
+	<resteasy:application resource-path-prefix="/v1" destroy-session-after-request="true">
+		<resteasy:media-type-mappings>
+			<key>xml</key>
+			<value>application/xml</value>
+		</resteasy:media-type-mappings>
+	</resteasy:application>
+
+
+	<web:authentication-filter url-pattern="/seam/resource/v1/auth/*"
+	auth-type="basic" realm="Seam Tasks Application" />
+
+	<security:identity authenticate-method="#{authenticator.authenticate}" />
+
+</components>

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/pages.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/pages.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/pages.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pages xmlns="http://jboss.com/products/seam/pages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://jboss.com/products/seam/pages /home/jharting/jboss/workspace/Seam_trunk_working_copy/src/main/org/jboss/seam/pages-2.3.xsd"
+
+	no-conversation-view-id="/main.xhtml" login-view-id="/login.xhtml">
+
+	<page view-id="/login.xhtml">
+		<navigation from-action="#{identity.login}">
+			<rule if="#{identity.loggedIn}">
+				<redirect view-id="/tasks.xhtml" />
+			</rule>
+		</navigation>
+	</page>
+
+	<page view-id="/tasks.xhtml" login-required="true" />
+
+	<page view-id="/categories.xhtml" login-required="true" />
+
+	<page view-id="/resolved.xhtml" login-required="true" />
+
+	<exception class="javax.persistence.NoResultException"
+		log-level="debug">
+		<http-error error-code="404" />
+	</exception>
+
+	<exception class="org.jboss.seam.security.AuthorizationException"
+		log-level="debug">
+		<http-error error-code="403">
+			<message>Unauthorized</message>
+		</http-error>
+	</exception>
+
+	<exception class="org.jboss.seam.framework.EntityNotFoundException"
+		log-level="debug">
+		<http-error error-code="404">
+			<message>Not Found</message>
+		</http-error>
+	</exception>
+
+	<exception
+		class="org.jboss.seam.example.tasks.exceptions.ResourceNotFoundException"
+		log-level="debug">
+		<http-error error-code="404">
+			<message>Not Found</message>
+		</http-error>
+	</exception>
+
+	<exception class="java.sql.BatchUpdateException" log-level="debug">
+		<http-error error-code="409">
+			<message>Conflict</message>
+		</http-error>
+	</exception>
+	
+	<exception class="javax.persistence.EntityExistsException" log-level="debug">
+		<http-error error-code="409">
+			<message>Conflict</message>
+		</http-error>
+	</exception>
+	
+	<exception class="org.hibernate.PropertyValueException"
+		log-level="debug">
+		<http-error error-code="400">
+			<message>Bad request</message>
+		</http-error>
+	</exception>
+
+	<exception>
+		<http-error error-code="500" />
+	</exception>
+
+</pages>

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/web.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/web.xml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/web.xml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="2.5"
+    xmlns="http://java.sun.com/xml/ns/javaee"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+
+    <display-name>Seam Tasks Example</display-name>
+    
+    <!-- Seam -->
+    
+    <listener>
+        <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
+    </listener>
+    
+    <servlet>
+        <servlet-name>Seam Resource Servlet</servlet-name>
+        <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class>
+    </servlet>
+    
+    <servlet-mapping>
+        <servlet-name>Seam Resource Servlet</servlet-name>
+        <url-pattern>/seam/resource/*</url-pattern>
+    </servlet-mapping>
+    
+    <filter>
+        <filter-name>Seam Filter</filter-name>
+        <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>Seam Filter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+    
+    <!-- JSF -->
+    
+    <context-param>
+        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
+        <param-value>.xhtml</param-value>
+    </context-param>
+    
+    <context-param>
+        <param-name>facelets.DEVELOPMENT</param-name>
+        <param-value>true</param-value>
+    </context-param>
+    
+    <servlet>
+        <servlet-name>Faces Servlet</servlet-name>
+        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    
+    <servlet-mapping>
+        <servlet-name>Faces Servlet</servlet-name>
+        <url-pattern>*.seam</url-pattern>
+    </servlet-mapping>
+
+    <session-config>
+        <session-timeout>10</session-timeout> 
+    </session-config>    
+    
+</web-app>

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/categories.js
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/categories.js	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/categories.js	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,30 @@
+$(document).ready(function() {
+	// load category list
+	getCategories(function(data) {
+		$(data).find('category').each(function() {
+			var categoryName = $(this).find('name').text();
+			addCategory(categoryName);
+	 	});
+	});
+	// create new category on submit
+	$('#editCategorySubmit').click(function(event) {
+		event.preventDefault();
+		var categoryName = $('#editCategoryName').attr('value');
+		putCategory(categoryName, function() {
+			addCategory(categoryName);
+			$('#editCategoryName').attr('value', '');
+		});
+	});
+});
+
+function addCategory(categoryName) {
+	var nameCell = $('<td/>').addClass('name').text(categoryName);
+	var deleteButton = $('<img/>').attr('src', 'img/task-delete.png').attr('title', 'Delete this category').click(function(event) {
+		event.preventDefault();
+		deleteCategory(categoryName, function() {
+			$('[id=' + categoryName + ']').remove();
+		});
+	});
+	var buttonCell = $('<td/>').append(deleteButton);
+	$('<tr/>').attr('id', categoryName).append(buttonCell).append(nameCell).appendTo('#categories tbody');
+}
\ No newline at end of file

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/categories.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/categories.xhtml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/categories.xhtml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,27 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:f="http://java.sun.com/jsf/core" template="template.xhtml">
+
+    <ui:define name="head">
+        <script src="categories.js" type="text/javascript" />
+    </ui:define>
+    <ui:define name="body">
+        <table id="categories">
+            <thead>
+                <tr><td colspan="2"><h2>Categories</h2></td></tr>
+            </thead>
+            <tbody/>
+        </table>
+
+        <hr />
+        
+        <form action="" id="newCategoryForm">
+            <h2>Care for a new category?</h2>
+            <input id="editCategoryName" type="text" />
+            <input id="editCategorySubmit" type="button" value="Create" />
+        </form>
+    </ui:define>
+</ui:composition>
\ No newline at end of file

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/bg.png
===================================================================
(Binary files differ)


Property changes on: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/bg.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/task-delete.png
===================================================================
(Binary files differ)


Property changes on: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/task-delete.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/task-done.png
===================================================================
(Binary files differ)


Property changes on: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/task-done.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/task-edit.png
===================================================================
(Binary files differ)


Property changes on: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/task-edit.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/task-undo.png
===================================================================
(Binary files differ)


Property changes on: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/task-undo.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/tasks-logo.png
===================================================================
(Binary files differ)


Property changes on: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/img/tasks-logo.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/index.html
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/index.html	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/index.html	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,5 @@
+<html>
+<head>
+  <meta http-equiv="Refresh" content="0; URL=tasks.seam">
+</head>
+</html>
\ No newline at end of file

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/jquery-1.3.2.min.js
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/jquery-1.3.2.min.js	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/jquery-1.3.2.min.js	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,19 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(!
 H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(fun!
 ction(){var G=this;while(G.firstChild){G=G.firstChild}return G!
 }).appen
d(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.no!
 CloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pu!
 shStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilt!
 er(E,thi
s)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.!
 makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;functi!
 on K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?!
 (N.getEl
ementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"}!
 ,isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?!
 I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\!
 s+/),fun
ction(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}ret!
 urn o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("di!
 v");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S!
 ){return
}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.le!
 ngth){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}!
 if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return !
 I&&I.spe
cified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}!
 return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){retu!
 rn o.nth(E,2,"previousSibling")},nextAll:function(E){return o.!
 dir(E,"n
extSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeo!
 f E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"q!
 ueue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.ma!
 keArray(
H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)!
 }if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){!
 if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=!
 false;if
(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{!
 "class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementByI!
 d!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]!
 :[]}},NA
ME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}ret!
 urn X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"sub!
 mit"===T.type},image:function(T){return"image"===T.type},reset!
 :functio
n(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}!
 }return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var !
 M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[!
 O].sourc
e+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplic!
 ate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undef!
 ined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.h!
 ref=func
tion(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;f!
 or(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.!
 match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}!
 T=I.rela
tive[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);!
 H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort(!
 ).join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}!
 else{for
(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)!
 }if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaK!
 ey newValue originalTarget pageX pageY prevValue relatedNode r!
 elatedTa
rget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},s!
 pecial:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagatio!
 nStopped:k,isImmediatePropagationStopped:k};var a=function(F){!
 var E=F.
relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}r!
 eturn this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/!
 \./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false!
 ,readyLi
st:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,e!
 rror").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.st!
 yle.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:fal!
 se,noClo
neEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.s!
 lice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o!
 .fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend!
 ({get:fu
nction(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.dat!
 a=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.h!
 ost)){var H=document.getElementsByTagName("head")[0];var T=doc!
 ument.cr
eateElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState!
 ==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxSt!
 op")}}return J},handleError:function(F,H,E,G){if(F.error){F.er!
 ror(H,E,
G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunctio!
 n(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G]!
 ,"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.le!
 ngth;G<F
;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cu!
 r(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};retur!
 n E},easing:{linear:function(G,H,E,F){return E+F*G},swing:func!
 tion(G,H
,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n)!
 ;n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.e!
 lem)}return false}else{var J=G-this.startTime;this.state=J/thi!
 s.option
s.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this!
 [0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{to!
 p:N,left:I}}}o.offset={initialize:function(){if(this.initializ!
 ed){retu
rn}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:functi!
 on(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||th!
 is[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxMode!
 l&&docum
ent.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
\ No newline at end of file

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/login.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/login.xhtml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/login.xhtml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:f="http://java.sun.com/jsf/core"
+                template="template.xhtml">
+
+    <ui:define name="body">
+		<h:form id="login">
+			<h2>Welcome to Seam Tasks.</h2>
+			<div>
+				<h:outputLabel value="Username" for="username" />
+				<h:inputText id="username" value="#{credentials.username}" />
+			</div>
+			<div>
+				<h:outputLabel value="Password" for="password" />
+				<h:inputSecret id="password" value="#{credentials.password}" />
+			</div>
+			<div><h:messages/></div>
+			<div><h:commandButton action="#{identity.login}" value="Login" /></div>
+		</h:form>
+		<div id="rightPanel">Welcome to Seam Tasks application. This application demonstrates integration of Seam and RESTEasy. Please log in to see more. You can use demo/demo for user account or admin/password for admin account.</div>
+	</ui:define>
+</ui:composition>

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/resolved.js
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/resolved.js	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/resolved.js	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,68 @@
+var firstTask = 0;
+var maxResults = 25;
+var username;
+
+
+$(document).ready(function() {
+	username = $('#username').text();
+	
+	// next and previous buttons
+	$('.next').click(function(event) {
+		event.preventDefault();
+		firstTask += maxResults;
+		loadTasks();
+	});
+	$('.previous').click(function(event) {
+		event.preventDefault();
+		firstTask -= maxResults;
+		loadTasks();
+	});
+	
+	loadTasks();
+});
+
+function loadTasks() {
+	$('#tasks tbody').empty();
+	getResolvedTasks(username, firstTask, maxResults, function(data) {
+		var tasks = $(data).find('task');
+		tasks.each(function() {
+			addTask($(this));
+		})
+		// pagination handling
+		if (tasks.size() == maxResults) {
+			$('.next').show();
+		} else { 
+			$('.next').hide();
+		}
+		if (firstTask >= maxResults) {
+			$('.previous').show();
+		} else {
+			$('.previous').hide();
+		}
+	});
+}
+
+function addTask(task) {
+	var taskId = $(task).find('id').text();
+	var taskName = $(task).find('name').text();
+	var categoryName = $(task).find('category').text();
+	var taskCompleted = $(task).find('completed').text();
+	
+	var parent = $('#tasks tbody');
+	var nameCell = $('<td/>').addClass('name').text(taskName);
+	var completedCell = $('<td/>').addClass('completed').text(taskCompleted);
+	var undoButton = $('<img/>').attr('src', 'img/task-undo.png').attr('title', 'Undo this task').click(function(event) {
+		event.preventDefault();
+		putTask(categoryName, taskId, taskName, false, function() {
+			$('#' + taskId).remove();
+		});
+	});
+	var deleteButton = $('<img/>').attr('src', 'img/task-delete.png').attr('title', 'Delete this task').click(function(event) {
+		event.preventDefault();
+		deleteTask(categoryName, taskId, true, function() {
+			$('#' + taskId).remove();
+		});
+	});
+	var buttonCell = $('<td/>').append(undoButton).append(deleteButton);
+	$('<tr/>').attr('id', taskId).append(buttonCell).append(nameCell).append(completedCell).appendTo(parent);
+}
\ No newline at end of file

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/resolved.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/resolved.xhtml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/resolved.xhtml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,27 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+	    		xmlns:ui="http://java.sun.com/jsf/facelets"
+	  			xmlns:h="http://java.sun.com/jsf/html"
+	  			xmlns:f="http://java.sun.com/jsf/core"
+				template="template.xhtml">
+
+<ui:define name="head">
+	<script src="resolved.js" type="text/javascript" />
+</ui:define>
+<ui:define name="body">
+	<table id="tasks">
+		<thead>
+			<tr>
+				<td colspan="3"><h2>Hooray, resolved tasks!</h2></td>
+			</tr>
+		</thead>
+		<tbody/>
+		<tfoot>
+			<tr>
+				<td class="previous">Previous</td><td class="next">Next</td>
+			</tr>
+		</tfoot>
+	</table>
+</ui:define>
+</ui:composition>
\ No newline at end of file

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/seam-tasks-client.js
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/seam-tasks-client.js	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/seam-tasks-client.js	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,81 @@
+$(document).ready(function() {
+	$.ajaxSetup({ cache: false }); // workaround for IE
+})
+
+function getCategories(callback) {
+	$.get("seam/resource/v1/auth/category", callback);
+}
+
+function putCategory(categoryName, callback) {
+	$.ajax({
+		type: "PUT",
+		url: "seam/resource/v1/auth/category/" + categoryName,
+		contentType: "application/xml",
+		success: callback
+	});
+}
+
+function deleteCategory(categoryName, callback) {
+	$.ajax({
+		type: "DELETE",
+		url: "seam/resource/v1/auth/category/" + categoryName,
+		success: callback
+	});
+}
+
+function getTask(categoryName, taskId, taskDone, callback) {
+	var URI = escape("seam/resource/v1/auth/category/" + categoryName + (taskDone ? "/resolved" : "/unresolved"));
+	$.get(URI, callback);
+}
+
+function getTasksForCategory(categoryName, taskDone, callback) {
+	var URI = escape("seam/resource/v1/auth/category/" + categoryName + (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(categoryName, taskName, callback) {
+	var URI = escape("seam/resource/v1/auth/category/" + categoryName + "/unresolved");
+	var data = '<task><name>' + taskName + '</name></task>';
+	var request = $.ajax({
+		type: "POST",
+		url: URI,
+		contentType: "application/xml",
+		data: data,
+		success: function() {
+			callback(request.getResponseHeader('Location'));
+		}
+	});
+}
+
+function putTask(categoryName, taskId, taskName, taskDone, callback) {
+	var URI = escape("seam/resource/v1/auth/category/" + categoryName + (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(categoryName, taskId, taskDone, callback) {
+	var URI = escape("seam/resource/v1/auth/category/" + categoryName + (taskDone ? "/resolved/" : "/unresolved/") + taskId);
+	$.ajax({
+		type: "DELETE",
+		url: URI,
+		success: callback
+	});
+}
\ No newline at end of file

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/style.css
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/style.css	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/style.css	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,129 @@
+body {
+    background: white url(img/bg.png) repeat scroll center;
+    font-family: Verdana, Arial;
+    margin: 0;
+    padding: 0;
+}
+
+div.container
+{
+    background: white url(img/tasks-logo.png) no-repeat left top;
+    background-position:20px 20px;
+    width: 666px;
+    margin: 0 auto;
+    padding: 0;
+}
+
+/* header */
+div.header {
+    padding: 0;
+    height: 140px;
+}
+
+/* image replacemement header */
+div.header h1 {
+    display: none;
+}
+
+#menu {
+    display: block;
+    margin: 110px 0 0 100px;
+    float:left;
+}
+
+#menu  li
+{
+    margin-left: 10px;
+    margin-right: 10px;
+    float:left;
+    display: inline;
+    font-size: 14px;
+}
+
+#menu a {
+    color: #899ea6;
+    text-decoration:none;
+    font-weight: bold;
+}
+
+#menu  a:hover   {
+    color:#99ccff;
+    text-decoration:none;
+    font-weight: bold;
+}
+
+
+/* content */
+
+hr {
+    width: 626px;
+    border: solid #dedede 1px;
+    border-bottom: none;
+}
+
+table
+{
+    border: none;
+    margin: 20px;
+    width: 626px;
+}
+
+#login
+{
+	float: left;
+    margin: 20px;
+    width: 326px;
+}
+
+#login div {
+	margin: 10px;
+}
+
+#login label {
+	display: block;
+}
+
+#rightPanel {
+	width: 270px;
+	margin: 30px 30px 0px 0px;
+	float: right;
+	text-align: justify;
+}
+
+table td.name {
+    color: #99ccff;
+    font-weight: bold;
+}
+
+h2
+{
+    margin: 0;
+    padding:0;
+    color: #899ea6;
+}
+
+#newTask, #newCategoryForm {
+    margin: 10px 20px 10px 20px;
+}
+
+/* footer */
+#footer a
+{
+    color: #99ccff;
+    text-decoration:none;
+    font-weight: bold;
+}
+
+#footer {
+    width: 646px;
+    height: 35px;
+    text-align: center;
+    margin: 0 auto;
+    padding: 0;
+    clear: both;
+}
+
+#footer div {
+    font-size: 11px;
+    margin: 0 20px 2px 0;
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/tasks.js
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/tasks.js	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/tasks.js	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,97 @@
+$(document).ready(function() {
+	printCategories();
+	$('#editTaskSubmit').click(function() {
+		var name = $('#editTaskName').val();
+		var categoryName = $('#editTaskCategory').val()
+		postTask(categoryName, name, function(location) {
+			$('#editTaskName').val('');
+			$.get(location, function(data) {
+				addTask($(data).find('task'), categoryName);
+			});
+		});
+	});
+});
+
+function showTaskEditForm(categoryName, taskId) {
+	var categories = $('#editTaskCategory').clone();
+	$(categories).find('[value=' + categoryName + ']').attr('selected', 'selected');
+	var taskName = $('#' + taskId + " .name").text();
+	var name = $('<input/>').attr('type', 'text').addClass('nameField').val(taskName);
+	
+	var update = $('<input/>').attr('type', 'button').attr('id', 'update').val('Update').click(function() {
+		var newCategoryName = $(categories).val();
+		var callback = function(data) {
+			removeTaskEditForm(taskId, taskName);
+				if (categoryName == newCategoryName) {
+					updateTaskNameOnUI(taskId, data); // just update the name
+				} else {
+					$('#' + taskId).remove(); // add the task into new category
+					addTask(data, newCategoryName);
+				}
+		}
+		putTask(newCategoryName, taskId, $(name).val(), false, callback);
+	});
+	var form = $('<form/>').attr('id', 'updateTask').append(categories).append(name).append(update);
+	$('#' + taskId + ' .name').replaceWith(form);
+}
+
+function removeTaskEditForm(taskId, taskName) {
+	$('#' + taskId + ' form').replaceWith($('<span/>').addClass('name').text(taskName));
+}
+
+function printCategories() {
+	getCategories(function(data) {
+ 	   $(data).find('category').each(function() {
+ 		   addCategory($(this));
+ 	   });
+	});
+}
+
+function addCategory(category) {
+	var categoryName = $(category).find('name').text();
+	var escapedCategoryName = escape(categoryName);
+	var categoryCell = $('<td/>').attr('colspan', '2').addClass('name').text(categoryName);
+	var categoryRow = $('<tr/>').attr('id', categoryName).append(categoryCell);
+	$('#categories tbody').append(categoryRow).appendTo('#categories');
+	$('<option/>').attr('value', categoryName).text(categoryName).appendTo('#editTaskCategory');
+	getTasksForCategory(categoryName, false, function(data) {
+		$(data).find('task').each(function() {
+			addTask($(this), categoryName);
+	 	});
+	});
+}
+
+function addTask(task, categoryName) {
+	var taskId = $(task).find('id').text();
+	var taskName = $(task).find('name').text();
+	
+	var parent = $('[id=' + categoryName + ']');
+	var nameCell = $('<td/>').append($('<span/>').addClass('name').text(taskName));
+	var doneButton = $('<img/>').attr('src', 'img/task-done.png').attr('title', 'Resolve this task').click(function(event) {
+		event.preventDefault();
+		putTask(categoryName, taskId, taskName, true, function() {
+			$('#' + taskId).remove();
+		});
+	});
+	var editButton = $('<img/>').attr('src', 'img/task-edit.png').attr('title', 'Edit this task').click(function(event) {
+		event.preventDefault();
+		if ($('#' + taskId + ' #updateTask').size() == 0) {
+			showTaskEditForm(categoryName, taskId);
+		} else {
+			removeTaskEditForm(taskId, taskName);
+		}
+	});
+	var deleteButton = $('<img/>').attr('src', 'img/task-delete.png').attr('title', 'Delete this task').click(function(event) {
+		event.preventDefault();
+		deleteTask(categoryName, taskId, false, function() {
+			$('#' + taskId).remove();
+		});
+	});
+	var buttonCell = $('<td/>').append(doneButton).append(editButton).append(deleteButton);
+	$('<tr/>').attr('id', taskId).append(buttonCell).append(nameCell).insertAfter('[id=' + categoryName + ']');
+}
+
+function updateTaskNameOnUI(taskId, task) {
+	var taskName = $(task).find('name').text();
+	$('#' + taskId + " .name").text(taskName);
+}

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/tasks.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/tasks.xhtml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/tasks.xhtml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,29 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:f="http://java.sun.com/jsf/core"
+                template="template.xhtml">
+
+    <ui:define name="head">
+        <script src="tasks.js" type="text/javascript" />
+    </ui:define>
+
+    <ui:define name="body">
+        <table id="categories">
+            <thead>
+                <tr>
+                    <td colspan="2"><h2>Yet, unresolved tasks.</h2></td>
+                </tr>
+            </thead>
+            <tbody/>
+        </table>
+        <hr/>
+        <form id="newTask">
+            <h2>Create new task</h2>
+            <select id="editTaskCategory" /> <input id="editTaskName" type="text" />
+            <input id="editTaskSubmit" type="button" value="Create" />
+        </form>
+    </ui:define>
+</ui:composition>
\ No newline at end of file

Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/template.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/template.xhtml	                        (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/template.xhtml	2012-03-06 20:10:30 UTC (rev 14365)
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<f:view xmlns="http://www.w3.org/1999/xhtml"
+        xmlns:ui="http://java.sun.com/jsf/facelets"
+        xmlns:f="http://java.sun.com/jsf/core"
+        xmlns:h="http://java.sun.com/jsf/html"
+        xmlns:s="http://jboss.com/products/seam/taglib" contentType="text/html">
+    <html>
+        <head>
+            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+            <title>Seam Tasks</title>
+            <script src="jquery-1.3.2.min.js" type="text/javascript" />
+            <script src="seam-tasks-client.js" type="text/javascript" />
+            <link href="style.css" rel="stylesheet" type="text/css" />
+            <ui:insert name="head" />
+        </head>
+        <body >
+            <div class="container">
+                <div class="header">
+                    <h1>Seam Tasks</h1>
+                    <s:div rendered="#{identity.loggedIn}">
+	                    <ul id="menu">
+	                        <li><a href="tasks.seam">Tasks</a></li>
+	                        <li><a href="categories.seam">Categories</a></li>
+	                        <li><a href="resolved.seam">Resolved tasks</a></li>
+	                        <li>
+	                            <s:link id="menuLogoutId" action="#{identity.logout}" value="Logout" propagation="none" />
+	                        </li>
+	                        <li>Logged as: <h:outputText id="username" value="#{credentials.username}" /></li>
+	                    </ul>
+	            	</s:div>
+                </div>
+                <div id="content">
+                    <ui:insert name="body" />
+                </div>
+		        <div id="footer">
+                	<hr/>
+		            <div>Powered by Seam 2.2, RESTEasy, Hibernate, Facelets and jQuery. Find more at <span><a href="http://seamframework.org">seamframework.org</a></span></div>
+		        </div>
+            </div>
+        </body>
+    </html>
+</f:view>



More information about the seam-commits mailing list