Seam SVN: r14467 - in branches/community/Seam_2_3/examples-ee6: tasks and 39 other directories.
by seam-commits@lists.jboss.org
Author: maschmid
Date: 2012-04-02 09:19:59 -0400 (Mon, 02 Apr 2012)
New Revision: 14467
Added:
branches/community/Seam_2_3/examples-ee6/tasks/
branches/community/Seam_2_3/examples-ee6/tasks/pom.xml
branches/community/Seam_2_3/examples-ee6/tasks/readme.txt
branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/
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/application/META-INF/jboss-seam-tasks-ds.xml
branches/community/Seam_2_3/examples-ee6/tasks/tasks-ejb/
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-tests/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/pom.xml
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/CategoryResourceTest.java
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/ResolvedTaskResourceQueryTest.java
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/TaskResourceTest.java
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/selenium/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/selenium/SeleniumTasksTest.java
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources-ftest/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources-ftest/testng.xml
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources-integration/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources-integration/testng.xml
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources/WEB-INF/
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources/WEB-INF/components.xml
branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources/seam.properties
branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/
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/faces-config.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:
add tasks example to ee6 examples
Added: branches/community/Seam_2_3/examples-ee6/tasks/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/pom.xml 2012-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,46 @@
+<?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>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <artifactId>tasks</artifactId>
+ <parent>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>examples-ee6</artifactId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ </parent>
+ <packaging>pom</packaging>
+ <name>Tasks Example (EE6)</name>
+
+ <properties>
+ <example.name>tasks</example.name>
+ </properties>
+
+ <modules>
+ <module>tasks-ear</module>
+ <module>tasks-ejb</module>
+ <module>tasks-web</module>
+ <module>tasks-tests</module>
+ </modules>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.tasks</groupId>
+ <artifactId>tasks-ejb</artifactId>
+ <version>${project.version}</version>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.tasks</groupId>
+ <artifactId>tasks-web</artifactId>
+ <version>${project.version}</version>
+ <type>war</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.tasks</groupId>
+ <artifactId>tasks-ear</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+</project>
Added: branches/community/Seam_2_3/examples-ee6/tasks/readme.txt
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/readme.txt (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/readme.txt 2012-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,19 @@
+Seam Tasks Example
+==================
+
+This example demonstrates the integration with RestEasy. It runs on JBoss
+AS as an EAR
+
+To deploy the example to JBoss AS, follow these steps:
+
+* In the example root directory run:
+
+ mvn clean package
+
+* Set JBOSS_HOME environment property.
+
+* In the tasks-ear directory run:
+
+ mvn jboss:hard-deploy
+
+* Open this URL in a web browser: http://localhost:8080/seam-tasks
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-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,133 @@
+<?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.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.tasks</groupId>
+ <artifactId>tasks-ear</artifactId>
+ <packaging>ear</packaging>
+ <name>Tasks EAR Module (EE6)</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.tasks</groupId>
+ <artifactId>tasks-web</artifactId>
+ <type>war</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.tasks</groupId>
+ <artifactId>tasks-ejb</artifactId>
+ <type>ejb</type>
+ </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>
+ </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.tasks</groupId>
+ <artifactId>tasks-web</artifactId>
+ <contextRoot>/seam-tasks</contextRoot>
+ <bundleFileName>tasks-web.war</bundleFileName>
+ </webModule>
+ <ejbModule>
+ <groupId>org.jboss.seam.examples-ee6.tasks</groupId>
+ <artifactId>tasks-ejb</artifactId>
+ <bundleFileName>tasks-ejb.jar</bundleFileName>
+ </ejbModule>
+ <ejbModule>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ <bundleFileName>jboss-seam.jar</bundleFileName>
+ </ejbModule>
+ </modules>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>exploded</id>
+ <properties>
+ <example.name>tasks</example.name>
+ </properties>
+ <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.tasks</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.tasks</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.tasks</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>
+ </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-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,9 @@
+<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
+ <deployment>
+ <dependencies>
+ <module name="org.dom4j" export="true"/>
+ <module name="org.apache.commons.collections" export="true"/>
+ <module name="javax.faces.api" export="true"/>
+ </dependencies>
+ </deployment>
+</jboss-deployment-structure>
Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/application/META-INF/jboss-seam-tasks-ds.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/application/META-INF/jboss-seam-tasks-ds.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-ear/src/main/application/META-INF/jboss-seam-tasks-ds.xml 2012-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<datasources xmlns="http://www.jboss.org/ironjacamar/schema">
+ <datasource
+ jndi-name="java:/tasksDatasource"
+ enabled="true"
+ use-java-context="true" pool-name="tasksdb">
+ <connection-url>jdbc:h2:mem:tasksdb;DB_CLOSE_DELAY=-1</connection-url>
+ <driver>h2</driver>
+ <security>
+ <user-name>sa</user-name>
+ <password>sa</password>
+ </security>
+ </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-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,89 @@
+<?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.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.tasks</groupId>
+ <artifactId>tasks-ejb</artifactId>
+ <packaging>ejb</packaging>
+ <name>Tasks EJB Module (EE6)</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-validator</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-entitymanager</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.ejb</groupId>
+ <artifactId>ejb-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.faces</groupId>
+ <artifactId>jsf-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-jaxrs</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-atom-provider</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-resteasy</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-jaxrs</artifactId>
+ </exclusion>
+
+ <exclusion>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-jaxb-provider</artifactId>
+ </exclusion>
+
+ <exclusion>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-jettison-provider</artifactId>
+ </exclusion>
+
+ <exclusion>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-atom-provider</artifactId>
+ </exclusion>
+ </exclusions>
+ </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-04-02 13:19:59 UTC (rev 14467)
@@ -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
+ *
+ */
+@Name("authenticator")
+(a)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-04-02 13:19:59 UTC (rev 14467)
@@ -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
+ *
+ */
+@Name("categoryHome")
+@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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -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 java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * @author Jozef Hartinger
+ *
+ */
+@Entity
+@XmlRootElement
+@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "NAME", "OWNER_USERNAME" }))
+@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-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,140 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.example.tasks.entity;
+
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQuery;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * @author Jozef Hartinger
+ *
+ */
+@Entity
+@XmlRootElement
+@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-04-02 13:19:59 UTC (rev 14467)
@@ -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 java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * @author Jozef Hartinger
+ *
+ */
+@Entity
+@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-04-02 13:19:59 UTC (rev 14467)
@@ -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
+ *
+ */
+
+@Path("/auth/category/{category}")
+@Name("categoryResource")
+@Produces( { "application/xml", "application/json", "application/fastinfoset" })
+@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-04-02 13:19:59 UTC (rev 14467)
@@ -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
+ *
+ */
+@Name("resolvedTaskResourceQuery")
+@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-04-02 13:19:59 UTC (rev 14467)
@@ -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
+ *
+ */
+@Path("/auth/category/{category}/{status}")
+@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-04-02 13:19:59 UTC (rev 14467)
@@ -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
+ *
+ */
+@Name("taskResourceQuery")
+@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-04-02 13:19:59 UTC (rev 14467)
@@ -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
+ *
+ */
+@Path("/auth/user")
+@Name("userResourceHome")
+@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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,18 @@
+<?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="tasksDatabase">
+ <provider>org.hibernate.ejb.HibernatePersistence</provider>
+ <jta-data-source>java:/tasksDatasource</jta-data-source>
+ <properties>
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ <property name="hibernate.show_sql" value="true"/>
+ <!-- These are the default for JBoss EJB3, but not for HEM: -->
+ <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
+ <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
+ <property name="jboss.entity.manager.factory.jndi.name" value="java:/tasksEntityManagerFactory"/>
+ </properties>
+ </persistence-unit>
+</persistence>
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-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,24 @@
+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-tests/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/pom.xml 2012-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,113 @@
+<?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.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.tasks</groupId>
+ <artifactId>tasks-tests</artifactId>
+ <name>Tasks Integration Tests Module (EE6)</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.testng</groupId>
+ <artifactId>testng</artifactId>
+ <classifier>jdk15</classifier>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.tasks</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>com.sun.faces</groupId>
+ <artifactId>jsf-api</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>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-resteasy</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ <filtering>true</filtering>
+ </testResource>
+ <testResource>
+ <directory>${basedir}/../tasks-ear/src/main/resources</directory>
+ <filtering>true</filtering>
+ </testResource>
+ <testResource>
+ <directory>${basedir}/../tasks-web/src/main/resources</directory>
+ <filtering>true</filtering>
+ </testResource>
+ </testResources>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </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>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-tests/src/test/java/org/jboss/seam/example/tasks/test/CategoryResourceTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/CategoryResourceTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/CategoryResourceTest.java 2012-04-02 13:19:59 UTC (rev 14467)
@@ -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-tests/src/test/java/org/jboss/seam/example/tasks/test/ResolvedTaskResourceQueryTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/ResolvedTaskResourceQueryTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/ResolvedTaskResourceQueryTest.java 2012-04-02 13:19:59 UTC (rev 14467)
@@ -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-tests/src/test/java/org/jboss/seam/example/tasks/test/TaskResourceTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/TaskResourceTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/TaskResourceTest.java 2012-04-02 13:19:59 UTC (rev 14467)
@@ -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-tests/src/test/java/org/jboss/seam/example/tasks/test/selenium/SeleniumTasksTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/selenium/SeleniumTasksTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/java/org/jboss/seam/example/tasks/test/selenium/SeleniumTasksTest.java 2012-04-02 13:19:59 UTC (rev 14467)
@@ -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-tests/src/test/resources/WEB-INF/components.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources/WEB-INF/components.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources/WEB-INF/components.xml 2012-04-02 13:19:59 UTC (rev 14467)
@@ -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-tests/src/test/resources/seam.properties
===================================================================
Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources-ftest/testng.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources-ftest/testng.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources-ftest/testng.xml 2012-04-02 13:19:59 UTC (rev 14467)
@@ -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-tests/src/test/resources-ftest/testng.xml
___________________________________________________________________
Added: svn:executable
+ *
Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources-integration/testng.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources-integration/testng.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-tests/src/test/resources-integration/testng.xml 2012-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,80 @@
+<?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.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.tasks</groupId>
+ <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.tasks</groupId>
+ <artifactId>tasks-ejb</artifactId>
+ <type>ejb</type>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-ui</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-jul</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-debug</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-collections</groupId>
+ <artifactId>commons-collections</artifactId>
+ </exclusion>
+ </exclusions>
+ </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>
+
+</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-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,61 @@
+<?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}" />
+
+ <component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/>
+
+</components>
Added: branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/faces-config.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/faces-config.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/tasks/tasks-web/src/main/webapp/WEB-INF/faces-config.xml 2012-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<faces-config version="2.1"
+ 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-facesconfig_2_1.xsd">
+
+</faces-config>
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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="3.0"
+ 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_3_0.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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -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-04-02 13:19:59 UTC (rev 14467)
@@ -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>
12 years, 1 month
Seam SVN: r14466 - branches/community/Seam_2_3/jboss-seam-resteasy/src/main/java/org/jboss/seam/resteasy.
by seam-commits@lists.jboss.org
Author: maschmid
Date: 2012-04-02 09:04:07 -0400 (Mon, 02 Apr 2012)
New Revision: 14466
Modified:
branches/community/Seam_2_3/jboss-seam-resteasy/src/main/java/org/jboss/seam/resteasy/ResourceHome.java
Log:
fix for JBSEAM-4923
Modified: branches/community/Seam_2_3/jboss-seam-resteasy/src/main/java/org/jboss/seam/resteasy/ResourceHome.java
===================================================================
--- branches/community/Seam_2_3/jboss-seam-resteasy/src/main/java/org/jboss/seam/resteasy/ResourceHome.java 2012-04-02 11:25:27 UTC (rev 14465)
+++ branches/community/Seam_2_3/jboss-seam-resteasy/src/main/java/org/jboss/seam/resteasy/ResourceHome.java 2012-04-02 13:04:07 UTC (rev 14466)
@@ -36,12 +36,12 @@
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.GenericEntity;
+import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.MessageBodyReader;
-import org.jboss.resteasy.core.Headers;
import org.jboss.resteasy.core.StringParameterInjector;
import org.jboss.seam.Entity;
import org.jboss.seam.annotations.Create;
@@ -68,7 +68,7 @@
@Context
private UriInfo uriInfo;
@Context
- private Headers headers;
+ private HttpHeaders headers;
@HeaderParam("Content-Type")
private MediaType requestContentType;
@@ -275,7 +275,7 @@
T entity;
try
{
- entity = reader.readFrom(entityClass, entityClass, entityClass.getAnnotations(), requestContentType, headers, is);
+ entity = reader.readFrom(entityClass, entityClass, entityClass.getAnnotations(), requestContentType, headers.getRequestHeaders(), is);
}
catch (Exception e)
{
12 years, 1 month
Seam SVN: r14465 - branches/community/Seam_2_3/examples-ee6.
by seam-commits@lists.jboss.org
Author: maschmid
Date: 2012-04-02 07:25:27 -0400 (Mon, 02 Apr 2012)
New Revision: 14465
Modified:
branches/community/Seam_2_3/examples-ee6/pom.xml
Log:
enable restbay
Modified: branches/community/Seam_2_3/examples-ee6/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/pom.xml 2012-04-02 11:16:37 UTC (rev 14464)
+++ branches/community/Seam_2_3/examples-ee6/pom.xml 2012-04-02 11:25:27 UTC (rev 14465)
@@ -28,6 +28,7 @@
<module>remoting/gwt</module>
<module>remoting/helloworld</module>
<module>remoting/progressbar</module>
+ <module>restbay</module>
<module>seampay</module>
<module>seamspace</module>
<module>todo</module>
12 years, 1 month
Seam SVN: r14464 - in branches/community/Seam_2_3/examples-ee6: restbay and 52 other directories.
by seam-commits@lists.jboss.org
Author: maschmid
Date: 2012-04-02 07:16:37 -0400 (Mon, 02 Apr 2012)
New Revision: 14464
Added:
branches/community/Seam_2_3/examples-ee6/restbay/
branches/community/Seam_2_3/examples-ee6/restbay/pom.xml
branches/community/Seam_2_3/examples-ee6/restbay/readme.txt
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/pom.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/src/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/src/main/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/src/main/application/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/src/main/application/META-INF/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/src/main/application/META-INF/jboss-deployment-structure.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/src/main/application/META-INF/jboss-seam-restbay-ds.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/pom.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Aargh.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Account.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Auction.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/AuctionEndAction.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/AuctionImage.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/AuctionService.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Bid.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Category.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryResourceHome.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryResourceQuery.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryService.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryServiceImpl.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Feedback.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/User.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/ContextDataResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/SecuredResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/SubResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestAuthenticator.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestComponent.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestEjb.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestEjbLocal.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestForm.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/applicationcomponent/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/applicationcomponent/ApplicationComponentTestResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/eventcomponent/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/eventcomponent/EventComponentTestResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceapplicationcomponent/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceapplicationcomponent/InterfaceApplicationComponentTestResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceapplicationcomponent/InterfaceApplicationComponentTestResourceBean.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceeventcomponent/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceeventcomponent/InterfaceEventComponentTestResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceeventcomponent/InterfaceEventComponentTestResourceBean.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfacestatelesscomponent/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfacestatelesscomponent/InterfaceStatelessComponentTestResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfacestatelesscomponent/InterfaceStatelessComponentTestResourceBean.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/plain/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/plain/PlainRootResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/plain/PlainTestResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/ApplicationComponentTestProvider.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/InterfaceApplicationComponenTestProviderBean.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/InterfaceApplicationComponentTestProvider.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/PlainResteasyStringConverterProvider.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/PlainTestProvider.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelesscomponent/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelesscomponent/StatelessComponentTestResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejb/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejb/StatelessEjbTestResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejb/StatelessEjbTestResourceBean.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejbcomponent/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejbcomponent/StatelessEjbComponentTestResource.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejbcomponent/StatelessEjbComponentTestResourceBean.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/subresource/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/subresource/Garage.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/subresource/Vehicle.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/META-INF/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/META-INF/ejb-jar.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/META-INF/persistence.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/import.sql
branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/seam.properties
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/pom.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/AuctionServiceTest.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/BasicServiceTest.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/CategoryServiceDBUnitTest.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/ContextDataTest.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/ResourceHomeTest.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/ResourceQueryTest.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/SecurityTest.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/SubresourceTest.java
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources-integration/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources-integration/testng.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/WEB-INF/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/WEB-INF/components.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/org/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/org/jboss/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/org/jboss/seam/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/org/jboss/seam/example/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/org/jboss/seam/example/restbay/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/org/jboss/seam/example/restbay/test/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/org/jboss/seam/example/restbay/test/dbunitdata.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/seam.properties
branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/pom.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/
branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/components.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/faces-config.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/pages.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/web.xml
branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/index.html
Log:
add restbay to the ee6 examples
Added: branches/community/Seam_2_3/examples-ee6/restbay/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/pom.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,46 @@
+<?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>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <artifactId>restbay</artifactId>
+ <parent>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>examples-ee6</artifactId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ </parent>
+ <packaging>pom</packaging>
+ <name>Restbay Example (EE6)</name>
+
+ <properties>
+ <example.name>restbay</example.name>
+ </properties>
+
+ <modules>
+ <module>restbay-ear</module>
+ <module>restbay-ejb</module>
+ <module>restbay-web</module>
+ <module>restbay-tests</module>
+ </modules>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.restbay</groupId>
+ <artifactId>restbay-ejb</artifactId>
+ <version>${project.version}</version>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.restbay</groupId>
+ <artifactId>restbay-web</artifactId>
+ <version>${project.version}</version>
+ <type>war</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.restbay</groupId>
+ <artifactId>restbay-ear</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+</project>
Added: branches/community/Seam_2_3/examples-ee6/restbay/readme.txt
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/readme.txt (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/readme.txt 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,21 @@
+Seam RestBay Example
+====================
+
+This example shows Seam/JAX-RS RESTful HTTP webservices integration.
+It runs on JBoss AS as an EAR.
+
+To deploy the example to JBoss AS, follow these steps:
+
+* In the example root directory run:
+
+ mvn clean package
+
+* Set JBOSS_HOME environment property.
+
+* In the restbay-ear directory run:
+
+ mvn jboss:hard-deploy
+
+* Open this URL in a web browser: http://localhost:8080/seam-restbay
+
+Note: this example doesn't have functional tests, because all functionality is verified in integration tests
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/pom.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,139 @@
+<?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>restbay</artifactId>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.restbay</groupId>
+ <artifactId>restbay-ear</artifactId>
+ <packaging>ear</packaging>
+ <name>Restbay EAR Module (EE6)</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.restbay</groupId>
+ <artifactId>restbay-web</artifactId>
+ <type>war</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.restbay</groupId>
+ <artifactId>restbay-ejb</artifactId>
+ <type>ejb</type>
+ </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>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-resteasy</artifactId>
+ </dependency>
+-->
+ </dependencies>
+
+
+ <build>
+ <finalName>seam-restbay</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.restbay</groupId>
+ <artifactId>restbay-web</artifactId>
+ <contextRoot>/seam-restbay</contextRoot>
+ <bundleFileName>restbay-web.war</bundleFileName>
+ </webModule>
+ <ejbModule>
+ <groupId>org.jboss.seam.examples-ee6.restbay</groupId>
+ <artifactId>restbay-ejb</artifactId>
+ <bundleFileName>restbay-ejb.jar</bundleFileName>
+ </ejbModule>
+ <ejbModule>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ <bundleFileName>jboss-seam.jar</bundleFileName>
+ </ejbModule>
+ </modules>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>exploded</id>
+ <properties>
+ <example.name>restbay</example.name>
+ </properties>
+ <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.restbay</groupId>
+ <artifactId>restbay-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.restbay</groupId>
+ <artifactId>restbay-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.restbay</groupId>
+ <artifactId>restbay-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>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+</project>
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/src/main/application/META-INF/jboss-deployment-structure.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/src/main/application/META-INF/jboss-deployment-structure.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/src/main/application/META-INF/jboss-deployment-structure.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,9 @@
+<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
+ <deployment>
+ <dependencies>
+ <module name="org.dom4j" export="true"/>
+ <module name="org.apache.commons.collections" export="true"/>
+ <module name="javax.faces.api" export="true"/>
+ </dependencies>
+ </deployment>
+</jboss-deployment-structure>
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/src/main/application/META-INF/jboss-seam-restbay-ds.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/src/main/application/META-INF/jboss-seam-restbay-ds.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ear/src/main/application/META-INF/jboss-seam-restbay-ds.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<datasources xmlns="http://www.jboss.org/ironjacamar/schema">
+ <datasource
+ jndi-name="java:/restbayDatasource"
+ enabled="true"
+ use-java-context="true" pool-name="restbaydb">
+ <connection-url>jdbc:h2:mem:restbaydb;DB_CLOSE_DELAY=-1</connection-url>
+ <driver>h2</driver>
+ <security>
+ <user-name>sa</user-name>
+ <password>sa</password>
+ </security>
+ </datasource>
+</datasources>
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/pom.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,88 @@
+<?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>restbay</artifactId>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.restbay</groupId>
+ <artifactId>restbay-ejb</artifactId>
+ <packaging>ejb</packaging>
+ <name>Restbay EJB Module (EE6)</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-validator</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-entitymanager</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.ejb</groupId>
+ <artifactId>ejb-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.faces</groupId>
+ <artifactId>jsf-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-jaxrs</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-resteasy</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-jaxrs</artifactId>
+ </exclusion>
+
+ <exclusion>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-jaxb-provider</artifactId>
+ </exclusion>
+
+ <exclusion>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-jettison-provider</artifactId>
+ </exclusion>
+
+ <exclusion>
+ <groupId>org.jboss.resteasy</groupId>
+ <artifactId>resteasy-atom-provider</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.opensymphony.quartz</groupId>
+ <artifactId>quartz</artifactId>
+ </dependency>
+ </dependencies>
+
+</project>
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Aargh.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Aargh.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Aargh.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,80 @@
+package org.jboss.seam.example.restbay;
+
+import org.jboss.seam.Component;
+import static org.jboss.seam.ScopeType.APPLICATION;
+import org.jboss.seam.annotations.Create;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.Startup;
+import org.jboss.seam.annotations.intercept.BypassInterceptors;
+
+import javax.naming.InitialContext;
+import javax.persistence.EntityManager;
+import javax.transaction.SystemException;
+import javax.transaction.UserTransaction;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * Nasty nasty hack because hsqldb doesn't support date arithmetic and we actually
+ * want to deploy with usable test data.
+ *
+ * @author shane
+ *
+ */
+@Startup
+@Name("aargh")
+@Scope(APPLICATION)
+@BypassInterceptors
+public class Aargh
+{
+
+ @Create
+ public void create()
+ {
+ UserTransaction t = null;
+ try
+ {
+ InitialContext ctx = new InitialContext();
+
+ t = (UserTransaction) ctx.lookup("java:/jboss/UserTransaction");
+ t.begin();
+
+ EntityManager em = (EntityManager) Component.getInstance("entityManager", true);
+
+ List<Auction> auctions = em.createQuery("select a from Auction a").getResultList();
+
+ Calendar cal = new GregorianCalendar();
+
+ Random r = new Random(System.currentTimeMillis());
+
+ for (Auction auction : auctions)
+ {
+ cal.setTime(auction.getEndDate());
+ cal.add(Calendar.DATE, r.nextInt(7));
+ cal.add(Calendar.MINUTE, 30 + r.nextInt(1410));
+ auction.setEndDate(cal.getTime());
+ auction.setStatus(Auction.STATUS_COMPLETED);
+ em.merge(auction);
+
+ AuctionEndAction auctionEnd = (AuctionEndAction) Component.getInstance(AuctionEndAction.class, true);
+ auctionEnd.endAuction(auction.getAuctionId(), auction.getEndDate());
+ }
+
+ t.commit();
+ }
+ catch (Exception e)
+ {
+ try
+ {
+ if (t != null)
+ t.rollback();
+ }
+ catch (SystemException e1) {}
+
+ throw new RuntimeException("Error starting transaction", e);
+ }
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Account.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Account.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Account.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,109 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+@Entity
+@Table(uniqueConstraints = @UniqueConstraint(columnNames = "name"))
+public class Account implements Serializable
+{
+ private static final long serialVersionUID = 8444287111124328025L;
+
+ private Integer accountId;
+ private String name;
+ private int feedbackScore;
+ private float feedbackPercent;
+ private Date memberSince;
+ private String location;
+
+ @Id @GeneratedValue
+ public Integer getAccountId()
+ {
+ return accountId;
+ }
+
+ public void setAccountId(Integer accountId)
+ {
+ this.accountId = accountId;
+ }
+
+ @NotNull
+ @Size(min = 3, max = 40)
+ @Pattern(regexp="[a-zA-Z]?[a-zA-Z0-9]+",
+ message="Account name must start with a letter, and only contain letters or numbers")
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ public int getFeedbackScore()
+ {
+ return feedbackScore;
+ }
+
+ public void setFeedbackScore(int score)
+ {
+ this.feedbackScore = score;
+ }
+
+ public float getFeedbackPercent()
+ {
+ return feedbackPercent;
+ }
+
+ public void setFeedbackPercent(float percent)
+ {
+ this.feedbackPercent = percent;
+ }
+
+ public Date getMemberSince()
+ {
+ return memberSince;
+ }
+
+ public void setMemberSince(Date memberSince)
+ {
+ this.memberSince = memberSince;
+ }
+
+ public String getLocation()
+ {
+ return location;
+ }
+
+ public void setLocation(String location)
+ {
+ this.location = location;
+ }
+
+ @Override
+ public boolean equals(Object value)
+ {
+ if (!(value instanceof Account)) return false;
+
+ Account other = (Account) value;
+
+ return other.accountId != null && other.accountId.equals(this.accountId);
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return accountId != null ? accountId.intValue() : super.hashCode();
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Auction.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Auction.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Auction.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,294 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.Lob;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
+import javax.persistence.Transient;
+import javax.persistence.Version;
+
+import javax.validation.constraints.NotNull;
+
+@Entity
+public class Auction implements Serializable
+{
+ public static final int STATUS_UNLISTED = 0;
+ public static final int STATUS_LIVE = 1;
+ public static final int STATUS_COMPLETED = 2;
+
+ private static final long serialVersionUID = -8349473227099432431L;
+
+ private Integer auctionId;
+ private Account account;
+ private Category category;
+ private String title;
+ private String description;
+ private Date endDate;
+ private AuctionImage image;
+ private Bid highBid;
+ private int bids;
+ private double startingPrice;
+
+ private int status;
+ private int version;
+
+ @Id @GeneratedValue
+ public Integer getAuctionId()
+ {
+ return auctionId;
+ }
+
+ public void setAuctionId(Integer auctionId)
+ {
+ this.auctionId = auctionId;
+ }
+
+ @NotNull
+ @ManyToOne
+ @JoinColumn(name = "ACCOUNT_ID")
+ public Account getAccount()
+ {
+ return account;
+ }
+
+ public void setAccount(Account account)
+ {
+ this.account = account;
+ }
+
+ @NotNull
+ @ManyToOne
+ @JoinColumn(name = "CATEGORY_ID")
+ public Category getCategory()
+ {
+ return category;
+ }
+
+ public void setCategory(Category category)
+ {
+ this.category = category;
+ }
+
+ @NotNull
+ public String getTitle()
+ {
+ return title;
+ }
+
+ public void setTitle(String title)
+ {
+ this.title = title;
+ }
+
+ @NotNull
+ @Lob
+ public String getDescription()
+ {
+ return description;
+ }
+
+ public void setDescription(String description)
+ {
+ this.description = description;
+ }
+
+ @NotNull
+ public Date getEndDate()
+ {
+ return endDate;
+ }
+
+ public void setEndDate(Date endDate)
+ {
+ this.endDate = endDate;
+ }
+
+ @OneToOne
+ @JoinColumn(name = "IMAGE_ID")
+ public AuctionImage getImage()
+ {
+ return image;
+ }
+
+ public void setImage(AuctionImage image)
+ {
+ this.image = image;
+ }
+
+ @OneToOne
+ public Bid getHighBid()
+ {
+ return highBid;
+ }
+
+ public void setHighBid(Bid highBid)
+ {
+ this.highBid = highBid;
+ }
+
+ public int getBids()
+ {
+ return bids;
+ }
+
+ public void setBids(int bids)
+ {
+ this.bids = bids;
+ }
+
+ @Transient
+ public long getTimeLeft()
+ {
+ return endDate != null ? (endDate.getTime() - System.currentTimeMillis()) : 0;
+ }
+
+ @Transient
+ public String getPrettyTimeLeft()
+ {
+ long timeLeft = getTimeLeft() / 1000;
+
+ int days = (int) Math.floor(timeLeft / (60 * 60 * 24));
+
+ timeLeft -= days * 24 * 60 * 60;
+ int hours = (int) Math.floor(timeLeft / (60 * 60));
+
+ timeLeft -= hours * 60 * 60;
+ int minutes = (int) Math.floor(timeLeft / 60);
+
+ StringBuilder sb = new StringBuilder();
+
+ if (days > 0)
+ sb.append(String.format("%dd ", days));
+
+ if (hours > 0)
+ sb.append(String.format("%dh ", hours));
+
+ if (minutes > 0)
+ sb.append(String.format("%dm ", minutes));
+
+ return sb.toString();
+ }
+
+ @Transient
+ public String getDaysHoursLeft()
+ {
+ long timeLeft = getTimeLeft() / 1000;
+
+ int days = (int) Math.floor(timeLeft / (60 * 60 * 24));
+
+ timeLeft -= days * 24 * 60 * 60;
+ int hours = (int) Math.floor(timeLeft / (60 * 60));
+
+ StringBuilder sb = new StringBuilder();
+
+ if (days > 0)
+ sb.append(String.format("%d days ", days));
+
+ if (hours > 0)
+ sb.append(String.format("%d hour", hours));
+
+ if (hours > 1)
+ sb.append('s');
+
+ return sb.toString();
+ }
+
+ public double getStartingPrice()
+ {
+ return startingPrice;
+ }
+
+ public void setStartingPrice(double startingPrice)
+ {
+ this.startingPrice = startingPrice;
+ }
+
+ public int getStatus()
+ {
+ return status;
+ }
+
+ public void setStatus(int status)
+ {
+ this.status = status;
+ }
+
+ @Version
+ public int getVersion()
+ {
+ return version;
+ }
+
+ public void setVersion(int version)
+ {
+ this.version = version;
+ }
+
+ @Transient
+ public double getCurrentPrice()
+ {
+ return highBid != null ? highBid.getActualAmount() : getStartingPrice();
+ }
+
+ @Transient
+ public double getRequiredBid()
+ {
+ return highBid != null ? getRequiredBid(highBid.getActualAmount()) :
+ getStartingPrice();
+ }
+
+ /**
+ * Returns the amount required to outbid the specified bid amount.
+ *
+ * @param amount The current bid amount
+ * @return The bid amount required to outbid the current bid
+ */
+ @Transient
+ static double getRequiredBid(double amount)
+ {
+ if (amount < 100)
+ {
+ return Math.ceil(amount) + 1;
+ }
+ else if (amount < 200)
+ {
+ return Math.ceil(amount) + 2;
+ }
+ else if (amount < 500)
+ {
+ return Math.ceil(amount) + 5;
+ }
+ else if (amount < 1000)
+ {
+ return Math.ceil(amount) + 10;
+ }
+ else if (amount < 5000)
+ {
+ return Math.ceil(amount) + 20;
+ }
+ else if (amount < 20000)
+ {
+ return Math.ceil(amount) + 50;
+ }
+ else if (amount < 50000)
+ {
+ return Math.ceil(amount) + 100;
+ }
+ else if (amount < 100000)
+ {
+ return Math.ceil(amount) + 200;
+ }
+ else if (amount < 500000)
+ {
+ return Math.ceil(amount) + 500;
+ }
+
+ return Math.ceil(amount) + 1000;
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/AuctionEndAction.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/AuctionEndAction.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/AuctionEndAction.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,32 @@
+package org.jboss.seam.example.restbay;
+
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Transactional;
+import org.jboss.seam.annotations.async.Asynchronous;
+import org.jboss.seam.annotations.async.Expiration;
+
+import javax.persistence.EntityManager;
+import javax.persistence.LockModeType;
+import java.util.Date;
+
+@Name("auctionEnd")
+public class AuctionEndAction
+{
+ @In EntityManager entityManager;
+
+ @Asynchronous
+ @Transactional
+ public void endAuction(int auctionId, @Expiration Date endDate)
+ {
+ System.out.println("Auction " + auctionId + " ending");
+
+ Auction auction = entityManager.find(Auction.class, auctionId);
+
+ entityManager.lock(auction, LockModeType.WRITE);
+
+ auction.setStatus(Auction.STATUS_COMPLETED);
+
+ entityManager.merge(auction);
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/AuctionImage.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/AuctionImage.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/AuctionImage.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,67 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.Lob;
+import javax.persistence.ManyToOne;
+import javax.xml.bind.annotation.XmlTransient;
+
+@Entity
+public class AuctionImage implements Serializable
+{
+ private static final long serialVersionUID = -1219357931402690891L;
+
+ private Integer imageId;
+ private Auction auction;
+ private byte[] data;
+ private String contentType;
+
+ @Id @GeneratedValue
+ public Integer getImageId()
+ {
+ return imageId;
+ }
+
+ public void setImageId(Integer imageId)
+ {
+ this.imageId = imageId;
+ }
+
+ @XmlTransient
+ @ManyToOne
+ @JoinColumn(name = "AUCTION_ID")
+ public Auction getAuction()
+ {
+ return auction;
+ }
+
+ public void setAuction(Auction auction)
+ {
+ this.auction = auction;
+ }
+
+ @Lob
+ public byte[] getData()
+ {
+ return data;
+ }
+
+ public void setData(byte[] data)
+ {
+ this.data = data;
+ }
+
+ public String getContentType()
+ {
+ return contentType;
+ }
+
+ public void setContentType(String contentType)
+ {
+ this.contentType = contentType;
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/AuctionService.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/AuctionService.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/AuctionService.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,75 @@
+package org.jboss.seam.example.restbay;
+
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+
+import javax.persistence.EntityManager;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.UriInfo;
+import java.net.URI;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Name("auctionService")
+@Path("/auction")
+public class AuctionService
+{
+
+ @Context
+ private UriInfo uriInfo;
+
+ private HttpHeaders headers;
+
+ @Context
+ public void setHeaders(HttpHeaders headers) {
+ this.headers = headers;
+ }
+
+ @In
+ EntityManager entityManager;
+
+ @GET
+ @Produces("text/plain")
+ public String getAuctions()
+ {
+
+ URI builtURI = uriInfo.getAbsolutePathBuilder().path("3").build();
+ // We can't test for /<context> prefix here, as we don't have a context in unit tests but we
+ // have it when the application is deployed... so use endsWith()
+ assert builtURI.getPath().endsWith("/seam/resource/restv1/auction/3");
+
+ // This is supposed to test field and setter injection for @Context
+ assert uriInfo.getPath().equals("/auction");
+ assert headers.getAcceptableMediaTypes().size() == 1;
+ assert headers.getAcceptableMediaTypes().get(0).toString().equals("text/plain");
+
+ List<Object[]> auctions =
+ entityManager.createQuery("select a.auctionId, a.title from Auction a order by a.auctionId asc").getResultList();
+ StringBuilder s = new StringBuilder();
+ for (Object[] auction : auctions)
+ {
+ s.append(auction[0]).append(",").append(auction[1]).append("\n");
+ }
+
+ return s.toString();
+ }
+
+ @GET
+ @Path("/{auctionId}")
+ @Produces("text/plain")
+ public String getAuction(@Context HttpHeaders httpHeaders, @PathParam("auctionId") int auctionId)
+ {
+ assert httpHeaders.getAcceptableMediaTypes().size() == 1;
+ assert httpHeaders.getAcceptableMediaTypes().get(0).toString().equals("text/plain");
+
+ return entityManager.find(Auction.class, auctionId).getTitle();
+ }
+
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Bid.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Bid.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Bid.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,90 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import javax.validation.constraints.NotNull;
+
+@Entity
+public class Bid implements Serializable
+{
+ private static final long serialVersionUID = -6214050645831251660L;
+
+ private Integer bidId;
+ private Auction auction;
+ private Account account;
+ private Date bidDate;
+ private double maxAmount;
+ private double actualAmount;
+
+ @Id @GeneratedValue
+ public Integer getBidId()
+ {
+ return bidId;
+ }
+
+ public void setBidId(Integer bidId)
+ {
+ this.bidId = bidId;
+ }
+
+ @NotNull
+ @ManyToOne
+ public Auction getAuction()
+ {
+ return auction;
+ }
+
+ public void setAuction(Auction auction)
+ {
+ this.auction = auction;
+ }
+
+ @NotNull
+ public Account getAccount()
+ {
+ return account;
+ }
+
+ public void setAccount(Account account)
+ {
+ this.account = account;
+ }
+
+ @NotNull
+ public Date getBidDate()
+ {
+ return bidDate;
+ }
+
+ public void setBidDate(Date bidDate)
+ {
+ this.bidDate = bidDate;
+ }
+
+ public double getMaxAmount()
+ {
+ return maxAmount;
+ }
+
+ public void setMaxAmount(double maxAmount)
+ {
+ this.maxAmount = maxAmount;
+ }
+
+ public double getActualAmount()
+ {
+ return actualAmount;
+ }
+
+ public void setActualAmount(double actualAmount)
+ {
+ this.actualAmount = actualAmount;
+ }
+}
+
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Category.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Category.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Category.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,55 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@Entity
+@XmlRootElement
+public class Category implements Serializable
+{
+ private static final long serialVersionUID = 411989568594034566L;
+
+ private Integer categoryId;
+ private String name;
+ private Category parent;
+
+ @Id
+ @GeneratedValue
+ public Integer getCategoryId()
+ {
+ return categoryId;
+ }
+
+ public void setCategoryId(Integer categoryId)
+ {
+ this.categoryId = categoryId;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ @ManyToOne
+ @JoinColumn(name = "PARENT_CATEGORY_ID")
+ public Category getParent()
+ {
+ return parent;
+ }
+
+ public void setParent(Category parent)
+ {
+ this.parent = parent;
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryResourceHome.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryResourceHome.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryResourceHome.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,37 @@
+package org.jboss.seam.example.restbay;
+
+import javax.ws.rs.Path;
+
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.framework.EntityHome;
+import org.jboss.seam.framework.Home;
+import org.jboss.seam.resteasy.ResourceHome;
+
+/**
+ * This resource demonstrates using ResourceHome component. This resource is
+ * used for testing purposes.
+ *
+ * @author Jozef Hartinger
+ *
+ */
+
+@Name("categoryResourceHome")
+@Path("extendedCategory")
+public class CategoryResourceHome extends ResourceHome<Category, Integer>
+{
+
+ @In
+ private EntityHome<Category> categoryHome;
+
+ @Override
+ public Home<?, Category> getEntityHome()
+ {
+ return categoryHome;
+ }
+
+ public CategoryResourceHome()
+ {
+ setMediaTypes(new String[] { "application/xml", "application/json" });
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryResourceQuery.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryResourceQuery.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryResourceQuery.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,19 @@
+package org.jboss.seam.example.restbay;
+
+import javax.ws.rs.Path;
+
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.resteasy.ResourceQuery;
+
+/**
+ * Example of ResourceQuery usage. Used for testing purposes.
+ *
+ * @author Jozef Hartinger
+ *
+ */
+@Name("categoryResourceQuery")
+@Path("extendedCategory")
+public class CategoryResourceQuery extends ResourceQuery<Category>
+{
+
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryService.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryService.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryService.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,13 @@
+package org.jboss.seam.example.restbay;
+
+/**
+ * @author Christian Bauer
+ */
+public interface CategoryService
+{
+
+ public String getCategories();
+
+ public String getCategory(int categoryId);
+
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryServiceImpl.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryServiceImpl.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/CategoryServiceImpl.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,45 @@
+package org.jboss.seam.example.restbay;
+
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.In;
+
+import javax.ws.rs.*;
+import javax.persistence.EntityManager;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Name("categoryService")
+@Path("/category")
+public class CategoryServiceImpl implements CategoryService
+{
+
+ @In
+ EntityManager entityManager;
+
+ @GET
+ @Produces("text/plain")
+ public String getCategories()
+ {
+ List<Object[]> categories =
+ entityManager.createQuery("select c.categoryId, c.name from Category c order by c.id asc").getResultList();
+ StringBuilder s = new StringBuilder();
+ for (Object[] category : categories)
+ {
+ s.append(category[0]).append(",").append(category[1]).append("\n");
+ }
+
+ return s.toString();
+ }
+
+ @GET
+ @Path("/{categoryId}")
+ @Produces("text/plain")
+ public String getCategory(@PathParam("categoryId") int categoryId)
+ {
+ return entityManager.find(Category.class, categoryId).getName();
+ }
+
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Feedback.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Feedback.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/Feedback.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,116 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
+
+@Entity
+public class Feedback implements Serializable
+{
+ private static final long serialVersionUID = -5814392910187956828L;
+
+ public enum Rating {positive, neutral, negative};
+
+ private Integer feedbackId;
+ private Account forAccount;
+ private Account fromAccount;
+ private Date feedbackDate;
+ private Auction item;
+ private Rating rating;
+ private String comment;
+ private String response;
+
+ @Id @GeneratedValue
+ public Integer getFeedbackId()
+ {
+ return feedbackId;
+ }
+
+ public void setFeedbackId(Integer feedbackId)
+ {
+ this.feedbackId = feedbackId;
+ }
+
+ @ManyToOne
+ @JoinColumn(name = "FOR_ACCOUNT_ID")
+ public Account getForAccount()
+ {
+ return forAccount;
+ }
+
+ public void setForAccount(Account account)
+ {
+ this.forAccount = account;
+ }
+
+ @ManyToOne
+ @JoinColumn(name = "FROM_ACCOUNT_ID")
+ public Account getFromAccount()
+ {
+ return fromAccount;
+ }
+
+ public void setFromAccount(Account account)
+ {
+ this.fromAccount = account;
+ }
+
+ public Date getFeedbackDate()
+ {
+ return feedbackDate;
+ }
+
+ public void setFeedbackDate(Date feedbackDate)
+ {
+ this.feedbackDate = feedbackDate;
+ }
+
+ @OneToOne
+ @JoinColumn(name = "ITEM_ID")
+ public Auction getItem()
+ {
+ return item;
+ }
+
+ public void setItem(Auction item)
+ {
+ this.item = item;
+ }
+
+ public Rating getRating()
+ {
+ return rating;
+ }
+
+ public void setRating(Rating rating)
+ {
+ this.rating = rating;
+ }
+
+ public String getComment()
+ {
+ return comment;
+ }
+
+ public void setComment(String comment)
+ {
+ this.comment = comment;
+ }
+
+ public String getResponse()
+ {
+ return response;
+ }
+
+ public void setResponse(String response)
+ {
+ this.response = response;
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/User.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/User.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/User.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,75 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+@Entity
+@Table(uniqueConstraints = @UniqueConstraint(columnNames = "username"))
+public class User implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+
+ private Integer userId;
+ private String username;
+ private String password;
+ private Account account;
+
+ @Id @GeneratedValue
+ public Integer getUserId()
+ {
+ return userId;
+ }
+
+ public void setUserId(Integer userId)
+ {
+ this.userId = userId;
+ }
+
+ @NotNull
+ @Size(min = 3, max = 40)
+ @Pattern(regexp="[a-zA-Z]?[a-zA-Z0-9]+",
+ message="Username must start with a letter, and only contain letters or numbers")
+ public String getUsername()
+ {
+ return username;
+ }
+
+ public void setUsername(String username)
+ {
+ this.username = username;
+ }
+
+ public String getPassword()
+ {
+ return password;
+ }
+
+ public void setPassword(String password)
+ {
+ this.password = password;
+ }
+
+ @OneToOne
+ @NotNull
+ @JoinColumn(name = "ACCOUNT_ID")
+ public Account getAccount()
+ {
+ return account;
+ }
+
+ public void setAccount(Account account)
+ {
+ this.account = account;
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/ContextDataResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/ContextDataResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/ContextDataResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,35 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.ext.Providers;
+
+import org.jboss.resteasy.spi.ResteasyProviderFactory;
+
+@Path("/contextData")
+@Produces("text/plain")
+public class ContextDataResource
+{
+ @GET
+ @Path("/providers")
+ public boolean providersAvailable()
+ {
+ return ResteasyProviderFactory.getContextData(Providers.class) != null;
+ }
+
+ @GET
+ @Path("/registry")
+ public boolean registryAvailable()
+ {
+ return ResteasyProviderFactory.getContextData(Providers.class) != null;
+ }
+
+ @GET
+ @Path("/dispatcher")
+ public boolean dispatcherAvailable()
+ {
+ return ResteasyProviderFactory.getContextData(Providers.class) != null;
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/SecuredResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/SecuredResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/SecuredResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,67 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+import org.jboss.seam.Component;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Transactional;
+import org.jboss.seam.annotations.security.Restrict;
+import org.jboss.seam.security.Identity;
+import org.jboss.seam.transaction.Synchronizations;
+
+/**
+ *
+ * @author Jozef Hartinger
+ *
+ */
+
+@Path("/secured")
+@Name("securedResource")
+@Produces("text/plain")
+public class SecuredResource
+{
+
+ @In
+ private Identity identity;
+
+ @GET
+ public String getHello()
+ {
+ return "Hello world!";
+ }
+
+ @GET
+ @Path("/admin")
+ public boolean isAdmin() {
+ return identity.hasRole("admin");
+ }
+
+ @GET
+ @Path("/restrictedAdmin")
+ @Restrict("#{s:hasRole('admin')}")
+ public boolean restrictedIsAdmin() {
+ return identity.hasRole("admin");
+ }
+
+ @GET
+ @Path("/synchronizationsLookup")
+ @Transactional
+ public boolean synchronizationsLookup()
+ {
+ Synchronizations ejb = (Synchronizations) Component.getInstance("org.jboss.seam.transaction.synchronizations", ScopeType.EVENT);
+ return ejb.isAwareOfContainerTransactions();
+ }
+
+ @GET
+ @Path("/ejbLookup")
+ public boolean ejbLookup()
+ {
+ TestEjbLocal ejb = (TestEjbLocal) Component.getInstance("securedEjb", ScopeType.EVENT);
+ return ejb.foo();
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/SubResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/SubResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/SubResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,21 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import javax.ws.rs.GET;
+
+/**
+ * @author Christian Bauer
+ */
+public class SubResource
+{
+ private String baz;
+
+ public SubResource(String baz)
+ {
+ this.baz = baz;
+ }
+
+ @GET
+ public String get() {
+ return "bar: " + baz;
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestAuthenticator.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestAuthenticator.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestAuthenticator.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,51 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+
+import org.jboss.seam.Component;
+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.Scope;
+import org.jboss.seam.annotations.Transactional;
+import org.jboss.seam.log.Log;
+import org.jboss.seam.security.Credentials;
+import org.jboss.seam.security.Identity;
+
+@Name("testAuthenticator")
+(a)Scope(ScopeType.EVENT)
+public class TestAuthenticator
+{
+
+ @In
+ private Identity identity;
+
+ @In
+ private Credentials credentials;
+
+ @Logger
+ private Log log;
+
+ @Transactional
+ public boolean authenticate()
+ {
+ // Tests that the SFSB can be obtained in both ContextualHttpRequests (authentication and web service invocation)
+ TestEjbLocal ejb = (TestEjbLocal) Component.getInstance("securedEjb", ScopeType.EVENT);
+ ejb.foo();
+
+ log.debug("Authenticating username/password: " + credentials.getUsername() + "/" + credentials.getPassword());
+ if (credentials.getUsername().equals(credentials.getPassword())) {
+ log.info("Authenticated {0}", credentials.getUsername());
+
+ if (credentials.getUsername().equals("admin")) {
+ identity.addRole("admin");
+ log.info("Admin rights granted for {0}", credentials.getUsername());
+ }
+ log.debug("Authentication valid");
+ return true;
+ } else {
+ log.debug("Authentication invalid");
+ return false;
+ }
+ }
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestComponent.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestComponent.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestComponent.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,27 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.AutoCreate;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * @author Christian Bauer
+ */
+@Name("testComponent")
+@AutoCreate
+public class TestComponent
+{
+
+ public List<String[]> getCommaSeparated() {
+ List<String[]> csv = new ArrayList();
+ csv.add(new String[]{"foo", "bar"});
+ csv.add(new String[]{"asdf", "123"});
+ return csv;
+ }
+
+ public String getTestString() {
+ return "abc";
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestEjb.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestEjb.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestEjb.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,23 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import javax.ejb.Remove;
+import javax.ejb.Stateful;
+
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+
+@Stateful
+(a)Scope(ScopeType.EVENT)
+@Name("securedEjb")
+public class TestEjb implements TestEjbLocal
+{
+
+ public boolean foo()
+ {
+ return true;
+ }
+
+ @Remove
+ public void remove() {}
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestEjbLocal.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestEjbLocal.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestEjbLocal.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,10 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import javax.ejb.Local;
+
+@Local
+public interface TestEjbLocal
+{
+ boolean foo();
+ void remove();
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestForm.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestForm.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestForm.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,23 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import javax.ws.rs.FormParam;
+import javax.ws.rs.HeaderParam;
+
+/**
+ * @author Christian Bauer
+ */
+public class TestForm
+{
+
+ @FormParam("foo")
+ private String[] foo;
+
+ @HeaderParam("bar")
+ private String bar;
+
+ @Override
+ public String toString()
+ {
+ return bar + foo[0] + foo[1];
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/TestResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,124 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.UriInfo;
+import java.util.ArrayList;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Collections;
+import java.util.Arrays;
+
+/**
+ * Plain JAX RS root resource, no Seam components/lifecycle.
+ *
+ * @author Christian Bauer
+ */
+public class TestResource
+{
+
+ @Context
+ protected UriInfo uriInfo;
+
+ @Context
+ protected HttpHeaders headers;
+
+ public void setUriInfo(UriInfo uriInfo)
+ {
+ this.uriInfo = uriInfo;
+ }
+
+ public void setHeaders(HttpHeaders headers)
+ {
+ this.headers = headers;
+ }
+
+ public String echoUri()
+ {
+ return uriInfo.getPath();
+ }
+
+ public String echoQueryParam(String bar)
+ {
+ return bar;
+ }
+
+ public String echoHeaderParam(String bar)
+ {
+ return bar;
+ }
+
+ public String echoCookieParam(String bar)
+ {
+ return bar;
+ }
+
+ public String echoTwoParams(String one, String two)
+ {
+ return one+two;
+ }
+
+ public String echoEncoded(String val)
+ {
+ return val;
+ }
+
+ public String echoFormParams(MultivaluedMap<String, String> formMap)
+ {
+ String result = "";
+ for (String s : formMap.get("foo"))
+ {
+ result = result + s;
+ }
+ return result;
+ }
+
+ public String echoFormParams2(String[] foo)
+ {
+ String result = "";
+ for (String s : foo)
+ {
+ result = result + s;
+ }
+ return result;
+ }
+
+ public String echoFormParams3(TestForm form)
+ {
+ return form.toString();
+ }
+
+ public SubResource getBar(String baz)
+ {
+ return new SubResource(baz);
+ }
+
+ public long convertPathParam(GregorianCalendar isoDate)
+ {
+ return isoDate.getTime().getTime();
+ }
+
+ public String throwException()
+ {
+ throw new UnsupportedOperationException("foo");
+ }
+
+ public List<String[]> getCommaSeparated() {
+ assert headers.getAcceptableMediaTypes().size() == 2;
+ assert headers.getAcceptableMediaTypes().get(0).toString().equals("text/plain");
+ assert headers.getAcceptableMediaTypes().get(1).toString().equals("text/csv");
+ return new TestComponent().getCommaSeparated();
+ }
+
+ public String[] getCommaSeparatedStrings() {
+ return new String[] {"foo", "bar", "baz"};
+ }
+
+ public Integer[] getCommaSeparatedIntegers() {
+ return new Integer[] {1, 2, 3};
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/applicationcomponent/ApplicationComponentTestResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/applicationcomponent/ApplicationComponentTestResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/applicationcomponent/ApplicationComponentTestResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,194 @@
+package org.jboss.seam.example.restbay.resteasy.applicationcomponent;
+
+import org.jboss.resteasy.annotations.Form;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.example.restbay.resteasy.TestResource;
+import org.jboss.seam.example.restbay.resteasy.TestComponent;
+import org.jboss.seam.example.restbay.resteasy.TestForm;
+import org.jboss.seam.example.restbay.resteasy.SubResource;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.contexts.Contexts;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.CookieParam;
+import javax.ws.rs.Encoded;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MultivaluedMap;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Name("applicationComponentTestResource")
+@Path("/applicationComponentTest")
+(a)Scope(ScopeType.APPLICATION)
+public class ApplicationComponentTestResource extends TestResource
+{
+ protected final String INSTANCE_CODE_KEY = "applicationComponentTestResource.instanceCode";
+
+ // We want to verify that this is really an application-scoped single instance
+ public ApplicationComponentTestResource()
+ {
+ // Yes, this check is really required, probably because Seam instantiates this twice or something for proxying?! :)
+ if (Contexts.getApplicationContext().get(INSTANCE_CODE_KEY) == null)
+ {
+ Contexts.getApplicationContext().set(INSTANCE_CODE_KEY, hashCode());
+ }
+ }
+
+ protected void assertSingleton()
+ {
+ assert Contexts.getApplicationContext().get(INSTANCE_CODE_KEY).equals(hashCode());
+ }
+
+ @In
+ TestComponent testComponent;
+
+ @GET
+ @Path("/echouri")
+ @Override
+ public String echoUri()
+ {
+ assertSingleton();
+ return super.echoUri();
+ }
+
+ @GET
+ @Path("/echoquery")
+ @Override
+ public String echoQueryParam(@QueryParam("bar") String bar)
+ {
+ assertSingleton();
+ return super.echoQueryParam(bar);
+ }
+
+ @GET
+ @Path("/echoheader")
+ @Override
+ public String echoHeaderParam(@HeaderParam("bar") String bar)
+ {
+ assertSingleton();
+ return super.echoHeaderParam(bar);
+ }
+
+ @GET
+ @Path("/echocookie")
+ @Override
+ public String echoCookieParam(@CookieParam("bar") String bar)
+ {
+ assertSingleton();
+ return super.echoCookieParam(bar);
+ }
+
+ @GET
+ @Path("/echotwoparams/{1}/{2}")
+ @Override
+ public String echoTwoParams(@PathParam("1") String one, @PathParam("2") String two)
+ {
+ assertSingleton();
+ return super.echoTwoParams(one, two);
+ }
+
+ @GET
+ @Path("/echoencoded/{val}")
+ @Override
+ public String echoEncoded(@PathParam("val") @Encoded String val)
+ {
+ assertSingleton();
+ return super.echoEncoded(val);
+ }
+
+ @POST
+ @Path("/echoformparams")
+ @Consumes("application/x-www-form-urlencoded")
+ @Override
+ public String echoFormParams(MultivaluedMap<String, String> formMap)
+ {
+ assertSingleton();
+ return super.echoFormParams(formMap);
+ }
+
+ @POST
+ @Path("/echoformparams2")
+ @Override
+ public String echoFormParams2(@FormParam("foo") String[] foo)
+ {
+ assertSingleton();
+ return super.echoFormParams2(foo);
+ }
+
+ @POST
+ @Path("/echoformparams3")
+ @Override
+ public String echoFormParams3(@Form TestForm form)
+ {
+ assertSingleton();
+ return super.echoFormParams3(form);
+ }
+
+ @Path("/foo/bar/{baz}")
+ @Override
+ public SubResource getBar(@PathParam("baz") String baz)
+ {
+ assertSingleton();
+ return super.getBar(baz);
+ }
+
+ @GET
+ @Path("/convertDate/{isoDate}")
+ @Override
+ public long convertPathParam(@PathParam("isoDate") GregorianCalendar isoDate)
+ {
+ assertSingleton();
+ return super.convertPathParam(isoDate);
+ }
+
+ @GET
+ @Path("/trigger/unsupported")
+ @Override
+ public String throwException()
+ {
+ assertSingleton();
+ return super.throwException();
+ }
+
+ @GET
+ @Path("/commaSeparated")
+ @Produces("text/csv")
+ @Override
+ public List<String[]> getCommaSeparated()
+ {
+ assertSingleton();
+ return testComponent.getCommaSeparated();
+ }
+
+ @GET
+ @Path("/commaSeparatedStrings")
+ @Produces("text/plain")
+ @Override
+ public String[] getCommaSeparatedStrings()
+ {
+ assertSingleton();
+ return super.getCommaSeparatedStrings();
+ }
+
+ @GET
+ @Path("/commaSeparatedIntegers")
+ @Produces("text/plain")
+ @Override
+ public Integer[] getCommaSeparatedIntegers()
+ {
+ assertSingleton();
+ return super.getCommaSeparatedIntegers();
+ }
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/eventcomponent/EventComponentTestResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/eventcomponent/EventComponentTestResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/eventcomponent/EventComponentTestResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,170 @@
+package org.jboss.seam.example.restbay.resteasy.eventcomponent;
+
+import org.jboss.resteasy.annotations.Form;
+import org.jboss.seam.Component;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.example.restbay.resteasy.TestResource;
+import org.jboss.seam.example.restbay.resteasy.TestComponent;
+import org.jboss.seam.example.restbay.resteasy.TestForm;
+import org.jboss.seam.example.restbay.resteasy.SubResource;
+import org.jboss.seam.transaction.Synchronizations;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.CookieParam;
+import javax.ws.rs.Encoded;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MultivaluedMap;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Name("eventComponentTestResource")
+@Path("/eventComponentTest")
+public class EventComponentTestResource extends TestResource
+{
+
+ @In
+ TestComponent testComponent;
+
+ @GET
+ @Path("/echouri")
+ @Override
+ public String echoUri()
+ {
+ return super.echoUri();
+ }
+
+ @GET
+ @Path("/echoquery")
+ @Override
+ public String echoQueryParam(@QueryParam("bar") String bar)
+ {
+ return super.echoQueryParam(bar);
+ }
+
+ @GET
+ @Path("/echoheader")
+ @Override
+ public String echoHeaderParam(@HeaderParam("bar") String bar)
+ {
+ return super.echoHeaderParam(bar);
+ }
+
+ @GET
+ @Path("/echocookie")
+ @Override
+ public String echoCookieParam(@CookieParam("bar") String bar)
+ {
+ return super.echoCookieParam(bar);
+ }
+
+ @GET
+ @Path("/echotwoparams/{1}/{2}")
+ @Override
+ public String echoTwoParams(@PathParam("1") String one, @PathParam("2") String two)
+ {
+ return super.echoTwoParams(one, two);
+ }
+
+ @GET
+ @Path("/echoencoded/{val}")
+ @Override
+ public String echoEncoded(@PathParam("val") @Encoded String val)
+ {
+ return super.echoEncoded(val);
+ }
+
+ @POST
+ @Path("/echoformparams")
+ @Consumes("application/x-www-form-urlencoded")
+ @Override
+ public String echoFormParams(MultivaluedMap<String, String> formMap)
+ {
+ return super.echoFormParams(formMap);
+ }
+
+ @POST
+ @Path("/echoformparams2")
+ @Override
+ public String echoFormParams2(@FormParam("foo") String[] foo)
+ {
+ return super.echoFormParams2(foo);
+ }
+
+ @POST
+ @Path("/echoformparams3")
+ @Override
+ public String echoFormParams3(@Form TestForm form)
+ {
+ return super.echoFormParams3(form);
+ }
+
+ @Path("/foo/bar/{baz}")
+ @Override
+ public SubResource getBar(@PathParam("baz") String baz)
+ {
+ return super.getBar(baz);
+ }
+
+ @GET
+ @Path("/convertDate/{isoDate}")
+ @Override
+ public long convertPathParam(@PathParam("isoDate") GregorianCalendar isoDate)
+ {
+ return super.convertPathParam(isoDate);
+ }
+
+ @GET
+ @Path("/trigger/unsupported")
+ @Override
+ public String throwException()
+ {
+ return super.throwException();
+ }
+
+ @GET
+ @Path("/commaSeparated")
+ @Produces("text/csv")
+ @Override
+ public List<String[]> getCommaSeparated()
+ {
+ return testComponent.getCommaSeparated();
+ }
+
+ @GET
+ @Path("/commaSeparatedStrings")
+ @Produces("text/plain")
+ @Override
+ public String[] getCommaSeparatedStrings()
+ {
+ return super.getCommaSeparatedStrings();
+ }
+
+ @GET
+ @Path("/commaSeparatedIntegers")
+ @Produces("text/plain")
+ @Override
+ public Integer[] getCommaSeparatedIntegers()
+ {
+ return super.getCommaSeparatedIntegers();
+ }
+
+ @GET
+ @Path("/synchronizationsLookup")
+ public boolean synchronizationsLookup()
+ {
+ Synchronizations ejb = (Synchronizations) Component.getInstance("org.jboss.seam.transaction.synchronizations", ScopeType.EVENT);
+ return ejb.isAwareOfContainerTransactions();
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceapplicationcomponent/InterfaceApplicationComponentTestResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceapplicationcomponent/InterfaceApplicationComponentTestResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceapplicationcomponent/InterfaceApplicationComponentTestResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,101 @@
+package org.jboss.seam.example.restbay.resteasy.interfaceapplicationcomponent;
+
+import org.jboss.resteasy.annotations.Form;
+import org.jboss.seam.example.restbay.resteasy.TestForm;
+import org.jboss.seam.example.restbay.resteasy.SubResource;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.CookieParam;
+import javax.ws.rs.Encoded;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.UriInfo;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Path("/interfaceApplicationComponentTest")
+public interface InterfaceApplicationComponentTestResource
+{
+
+ @Context
+ public void setUriInfo(UriInfo uriInfo);
+
+ @Context
+ public void setHeaders(HttpHeaders headers);
+
+ @GET
+ @Path("/echouri")
+ String echoUri();
+
+ @GET
+ @Path("/echoquery")
+ String echoQueryParam(@QueryParam("bar") String bar);
+
+ @GET
+ @Path("/echoheader")
+ String echoHeaderParam(@HeaderParam("bar") String bar);
+
+ @GET
+ @Path("/echocookie")
+ String echoCookieParam(@CookieParam("bar") String bar);
+
+ @GET
+ @Path("/echotwoparams/{1}/{2}")
+ String echoTwoParams(@PathParam("1") String one, @PathParam("2") String two);
+
+ @GET
+ @Path("/echoencoded/{val}")
+ String echoEncoded(@PathParam("val") @Encoded String val);
+
+ @POST
+ @Path("/echoformparams")
+ @Consumes("application/x-www-form-urlencoded")
+ String echoFormParams(MultivaluedMap<String, String> formMap);
+
+ @POST
+ @Path("/echoformparams2")
+ String echoFormParams2(@FormParam("foo") String[] foo);
+
+ @POST
+ @Path("/echoformparams3")
+ String echoFormParams3(@Form TestForm form);
+
+ @Path("/foo/bar/{baz}")
+ SubResource getBar(@PathParam("baz") String baz);
+
+ @GET
+ @Path("/convertDate/{isoDate}")
+ long convertPathParam(@PathParam("isoDate") GregorianCalendar isoDate);
+
+ @GET
+ @Path("/trigger/unsupported")
+ String throwException();
+
+ @GET
+ @Path("/commaSeparated")
+ @Produces("text/csv")
+ List<String[]> getCommaSeparated();
+
+ @GET
+ @Path("/commaSeparatedStrings")
+ @Produces("text/plain")
+ String[] getCommaSeparatedStrings();
+
+ @GET
+ @Path("/commaSeparatedIntegers")
+ @Produces("text/plain")
+ Integer[] getCommaSeparatedIntegers();
+
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceapplicationcomponent/InterfaceApplicationComponentTestResourceBean.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceapplicationcomponent/InterfaceApplicationComponentTestResourceBean.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceapplicationcomponent/InterfaceApplicationComponentTestResourceBean.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,32 @@
+package org.jboss.seam.example.restbay.resteasy.interfaceapplicationcomponent;
+
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.example.restbay.resteasy.TestComponent;
+import org.jboss.seam.example.restbay.resteasy.TestResource;
+
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Name("interfaceApplicationComponentTestResource")
+(a)Scope(ScopeType.EVENT)
+public class InterfaceApplicationComponentTestResourceBean extends TestResource implements InterfaceApplicationComponentTestResource
+{
+
+ @In
+ TestComponent testComponent;
+
+ @Override
+ public List<String[]> getCommaSeparated()
+ {
+ assert headers.getAcceptableMediaTypes().size() == 2;
+ assert headers.getAcceptableMediaTypes().get(0).toString().equals("text/plain");
+ assert headers.getAcceptableMediaTypes().get(1).toString().equals("text/csv");
+ return testComponent.getCommaSeparated();
+ }
+
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceeventcomponent/InterfaceEventComponentTestResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceeventcomponent/InterfaceEventComponentTestResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceeventcomponent/InterfaceEventComponentTestResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,101 @@
+package org.jboss.seam.example.restbay.resteasy.interfaceeventcomponent;
+
+import org.jboss.resteasy.annotations.Form;
+import org.jboss.seam.example.restbay.resteasy.TestForm;
+import org.jboss.seam.example.restbay.resteasy.SubResource;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.CookieParam;
+import javax.ws.rs.Encoded;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.UriInfo;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Path("/interfaceEventComponentTest")
+public interface InterfaceEventComponentTestResource
+{
+
+ @Context
+ public void setUriInfo(UriInfo uriInfo);
+
+ @Context
+ public void setHeaders(HttpHeaders headers);
+
+ @GET
+ @Path("/echouri")
+ String echoUri();
+
+ @GET
+ @Path("/echoquery")
+ String echoQueryParam(@QueryParam("bar") String bar);
+
+ @GET
+ @Path("/echoheader")
+ String echoHeaderParam(@HeaderParam("bar") String bar);
+
+ @GET
+ @Path("/echocookie")
+ String echoCookieParam(@CookieParam("bar") String bar);
+
+ @GET
+ @Path("/echotwoparams/{1}/{2}")
+ String echoTwoParams(@PathParam("1") String one, @PathParam("2") String two);
+
+ @GET
+ @Path("/echoencoded/{val}")
+ String echoEncoded(@PathParam("val") @Encoded String val);
+
+ @POST
+ @Path("/echoformparams")
+ @Consumes("application/x-www-form-urlencoded")
+ String echoFormParams(MultivaluedMap<String, String> formMap);
+
+ @POST
+ @Path("/echoformparams2")
+ String echoFormParams2(@FormParam("foo") String[] foo);
+
+ @POST
+ @Path("/echoformparams3")
+ String echoFormParams3(@Form TestForm form);
+
+ @Path("/foo/bar/{baz}")
+ SubResource getBar(@PathParam("baz") String baz);
+
+ @GET
+ @Path("/convertDate/{isoDate}")
+ long convertPathParam(@PathParam("isoDate") GregorianCalendar isoDate);
+
+ @GET
+ @Path("/trigger/unsupported")
+ String throwException();
+
+ @GET
+ @Path("/commaSeparated")
+ @Produces("text/csv")
+ List<String[]> getCommaSeparated();
+
+ @GET
+ @Path("/commaSeparatedStrings")
+ @Produces("text/plain")
+ String[] getCommaSeparatedStrings();
+
+ @GET
+ @Path("/commaSeparatedIntegers")
+ @Produces("text/plain")
+ Integer[] getCommaSeparatedIntegers();
+
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceeventcomponent/InterfaceEventComponentTestResourceBean.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceeventcomponent/InterfaceEventComponentTestResourceBean.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfaceeventcomponent/InterfaceEventComponentTestResourceBean.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,32 @@
+package org.jboss.seam.example.restbay.resteasy.interfaceeventcomponent;
+
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.example.restbay.resteasy.TestResource;
+import org.jboss.seam.example.restbay.resteasy.TestComponent;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Name("interfaceEventComponentTestResource")
+(a)Scope(ScopeType.EVENT)
+public class InterfaceEventComponentTestResourceBean extends TestResource implements InterfaceEventComponentTestResource
+{
+
+ @In
+ TestComponent testComponent;
+
+ @Override
+ public List<String[]> getCommaSeparated()
+ {
+ assert headers.getAcceptableMediaTypes().size() == 2;
+ assert headers.getAcceptableMediaTypes().get(0).toString().equals("text/plain");
+ assert headers.getAcceptableMediaTypes().get(1).toString().equals("text/csv");
+ return testComponent.getCommaSeparated();
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfacestatelesscomponent/InterfaceStatelessComponentTestResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfacestatelesscomponent/InterfaceStatelessComponentTestResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfacestatelesscomponent/InterfaceStatelessComponentTestResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,101 @@
+package org.jboss.seam.example.restbay.resteasy.interfacestatelesscomponent;
+
+import org.jboss.resteasy.annotations.Form;
+import org.jboss.seam.example.restbay.resteasy.TestForm;
+import org.jboss.seam.example.restbay.resteasy.SubResource;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.CookieParam;
+import javax.ws.rs.Encoded;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.UriInfo;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Path("/interfaceStatelessComponentTest")
+public interface InterfaceStatelessComponentTestResource
+{
+
+ @Context
+ public void setUriInfo(UriInfo uriInfo);
+
+ @Context
+ public void setHeaders(HttpHeaders headers);
+
+ @GET
+ @Path("/echouri")
+ String echoUri();
+
+ @GET
+ @Path("/echoquery")
+ String echoQueryParam(@QueryParam("bar") String bar);
+
+ @GET
+ @Path("/echoheader")
+ String echoHeaderParam(@HeaderParam("bar") String bar);
+
+ @GET
+ @Path("/echocookie")
+ String echoCookieParam(@CookieParam("bar") String bar);
+
+ @GET
+ @Path("/echotwoparams/{1}/{2}")
+ String echoTwoParams(@PathParam("1") String one, @PathParam("2") String two);
+
+ @GET
+ @Path("/echoencoded/{val}")
+ String echoEncoded(@PathParam("val") @Encoded String val);
+
+ @POST
+ @Path("/echoformparams")
+ @Consumes("application/x-www-form-urlencoded")
+ String echoFormParams(MultivaluedMap<String, String> formMap);
+
+ @POST
+ @Path("/echoformparams2")
+ String echoFormParams2(@FormParam("foo") String[] foo);
+
+ @POST
+ @Path("/echoformparams3")
+ String echoFormParams3(@Form TestForm form);
+
+ @Path("/foo/bar/{baz}")
+ SubResource getBar(@PathParam("baz") String baz);
+
+ @GET
+ @Path("/convertDate/{isoDate}")
+ long convertPathParam(@PathParam("isoDate") GregorianCalendar isoDate);
+
+ @GET
+ @Path("/trigger/unsupported")
+ String throwException();
+
+ @GET
+ @Path("/commaSeparated")
+ @Produces("text/csv")
+ List<String[]> getCommaSeparated();
+
+ @GET
+ @Path("/commaSeparatedStrings")
+ @Produces("text/plain")
+ String[] getCommaSeparatedStrings();
+
+ @GET
+ @Path("/commaSeparatedIntegers")
+ @Produces("text/plain")
+ Integer[] getCommaSeparatedIntegers();
+
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfacestatelesscomponent/InterfaceStatelessComponentTestResourceBean.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfacestatelesscomponent/InterfaceStatelessComponentTestResourceBean.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/interfacestatelesscomponent/InterfaceStatelessComponentTestResourceBean.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,153 @@
+package org.jboss.seam.example.restbay.resteasy.interfacestatelesscomponent;
+
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.contexts.Contexts;
+import org.jboss.seam.example.restbay.resteasy.SubResource;
+import org.jboss.seam.example.restbay.resteasy.TestComponent;
+import org.jboss.seam.example.restbay.resteasy.TestForm;
+import org.jboss.seam.example.restbay.resteasy.TestResource;
+
+import javax.ws.rs.core.MultivaluedMap;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Name("interfaceStatelessComponentTestResource")
+(a)Scope(ScopeType.EVENT)
+public class InterfaceStatelessComponentTestResourceBean extends TestResource implements InterfaceStatelessComponentTestResource
+{
+
+ protected final String INSTANCE_CODE_KEY = "interfaceStatelessComponentTestResource.instanceCode";
+
+ // We want to verify that this is really stateless (Seam doesn't pool POJO instances, so that should work)
+ public InterfaceStatelessComponentTestResourceBean()
+ {
+ Integer instanceCode;
+ if ((instanceCode = (Integer)Contexts.getApplicationContext().get(INSTANCE_CODE_KEY)) != null)
+ {
+ assert !instanceCode.equals(hashCode());
+ }
+ Contexts.getApplicationContext().set(INSTANCE_CODE_KEY, hashCode());
+ }
+
+ protected void assertStateless()
+ {
+ assert !Contexts.getApplicationContext().get(INSTANCE_CODE_KEY).equals(hashCode());
+ }
+
+ @In
+ TestComponent testComponent;
+
+ @Override
+ public String echoUri()
+ {
+ assertStateless();
+ return super.echoUri();
+ }
+
+ @Override
+ public String echoQueryParam(String bar)
+ {
+ assertStateless();
+ return super.echoQueryParam(bar);
+ }
+
+ @Override
+ public String echoHeaderParam(String bar)
+ {
+ assertStateless();
+ return super.echoHeaderParam(bar);
+ }
+
+ @Override
+ public String echoCookieParam(String bar)
+ {
+ assertStateless();
+ return super.echoCookieParam(bar);
+ }
+
+ @Override
+ public String echoTwoParams(String one, String two)
+ {
+ assertStateless();
+ return super.echoTwoParams(one, two);
+ }
+
+ @Override
+ public String echoEncoded(String val)
+ {
+ assertStateless();
+ return super.echoEncoded(val);
+ }
+
+ @Override
+ public String echoFormParams(MultivaluedMap<String, String> formMap)
+ {
+ assertStateless();
+ return super.echoFormParams(formMap);
+ }
+
+ @Override
+ public String echoFormParams2(String[] foo)
+ {
+ assertStateless();
+ return super.echoFormParams2(foo);
+ }
+
+ @Override
+ public String echoFormParams3(TestForm form)
+ {
+ assertStateless();
+ return super.echoFormParams3(form);
+ }
+
+ @Override
+ public SubResource getBar(String baz)
+ {
+ assertStateless();
+ return super.getBar(baz);
+ }
+
+ @Override
+ public long convertPathParam(GregorianCalendar isoDate)
+ {
+ assertStateless();
+ return super.convertPathParam(isoDate);
+ }
+
+ @Override
+ public String throwException()
+ {
+ assertStateless();
+ return super.throwException();
+ }
+
+ @Override
+ public List<String[]> getCommaSeparated()
+ {
+ assertStateless();
+ assert headers.getAcceptableMediaTypes().size() == 2;
+ assert headers.getAcceptableMediaTypes().get(0).toString().equals("text/plain");
+ assert headers.getAcceptableMediaTypes().get(1).toString().equals("text/csv");
+ return testComponent.getCommaSeparated();
+ }
+
+ @Override
+ public String[] getCommaSeparatedStrings()
+ {
+ assertStateless();
+ return super.getCommaSeparatedStrings();
+ }
+
+ @Override
+ public Integer[] getCommaSeparatedIntegers()
+ {
+ assertStateless();
+ return super.getCommaSeparatedIntegers();
+ }
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/plain/PlainRootResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/plain/PlainRootResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/plain/PlainRootResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,20 @@
+package org.jboss.seam.example.restbay.resteasy.plain;
+
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.GET;
+
+/**
+ * @author Christian Bauer
+ */
+@Path("/")
+public class PlainRootResource
+{
+
+ @GET
+ @Produces("text/plain")
+ public String getResource()
+ {
+ return "Root";
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/plain/PlainTestResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/plain/PlainTestResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/plain/PlainTestResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,142 @@
+package org.jboss.seam.example.restbay.resteasy.plain;
+
+import org.jboss.resteasy.annotations.Form;
+import org.jboss.seam.example.restbay.resteasy.TestResource;
+import org.jboss.seam.example.restbay.resteasy.TestForm;
+import org.jboss.seam.example.restbay.resteasy.SubResource;
+
+import javax.ws.rs.*;
+import javax.ws.rs.core.MultivaluedMap;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Path("/plainTest")
+public class PlainTestResource extends TestResource
+{
+
+ @GET
+ @Path("/echouri")
+ @Override
+ public String echoUri()
+ {
+ return super.echoUri();
+ }
+
+ @GET
+ @Path("/echoquery")
+ @Override
+ public String echoQueryParam(@QueryParam("bar") String bar)
+ {
+ return super.echoQueryParam(bar);
+ }
+
+ @GET
+ @Path("/echoheader")
+ @Override
+ public String echoHeaderParam(@HeaderParam("bar") String bar)
+ {
+ return super.echoHeaderParam(bar);
+ }
+
+ @GET
+ @Path("/echocookie")
+ @Override
+ public String echoCookieParam(@CookieParam("bar") String bar)
+ {
+ return super.echoCookieParam(bar);
+ }
+
+ @GET
+ @Path("/echotwoparams/{1}/{2}")
+ @Override
+ public String echoTwoParams(@PathParam("1") String one, @PathParam("2") String two)
+ {
+ return super.echoTwoParams(one, two);
+ }
+
+ @GET
+ @Path("/echoencoded/{val}")
+ @Override
+ public String echoEncoded(@PathParam("val") @Encoded String val)
+ {
+ return super.echoEncoded(val);
+ }
+
+ @POST
+ @Path("/echoformparams")
+ @Consumes("application/x-www-form-urlencoded")
+ @Override
+ public String echoFormParams(MultivaluedMap<String, String> formMap)
+ {
+ return super.echoFormParams(formMap);
+ }
+
+ @POST
+ @Path("/echoformparams2")
+ @Override
+ public String echoFormParams2(@FormParam("foo") String[] foo)
+ {
+ return super.echoFormParams2(foo);
+ }
+
+ @POST
+ @Path("/echoformparams3")
+ @Override
+ public String echoFormParams3(@Form TestForm form)
+ {
+ return super.echoFormParams3(form);
+ }
+
+ @Path("/foo/bar/{baz}")
+ @Override
+ public SubResource getBar(@PathParam("baz") String baz)
+ {
+ return super.getBar(baz);
+ }
+
+ @GET
+ @Path("/convertDate/{isoDate}")
+ @Override
+ public long convertPathParam(@PathParam("isoDate") GregorianCalendar isoDate)
+ {
+ return super.convertPathParam(isoDate);
+ }
+
+ @GET
+ @Path("/trigger/unsupported")
+ @Override
+ public String throwException()
+ {
+ return super.throwException();
+ }
+
+ @GET
+ @Path("/commaSeparated")
+ @Produces("text/csv")
+ @Override
+ public List<String[]> getCommaSeparated()
+ {
+ return super.getCommaSeparated();
+ }
+
+ @GET
+ @Path("/commaSeparatedStrings")
+ @Produces("text/plain")
+ @Override
+ public String[] getCommaSeparatedStrings()
+ {
+ return super.getCommaSeparatedStrings();
+ }
+
+ @GET
+ @Path("/commaSeparatedIntegers")
+ @Produces("text/plain")
+ @Override
+ public Integer[] getCommaSeparatedIntegers()
+ {
+ return super.getCommaSeparatedIntegers();
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/ApplicationComponentTestProvider.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/ApplicationComponentTestProvider.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/ApplicationComponentTestProvider.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,64 @@
+package org.jboss.seam.example.restbay.resteasy.provider;
+
+import org.jboss.seam.example.restbay.resteasy.TestComponent;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.ScopeType;
+
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+/**
+ * @author Christian Bauer
+ */
+@Name("applicationComponentTestProvider")
+(a)Scope(ScopeType.APPLICATION)
+@Provider
+@Produces("text/plain")
+public class ApplicationComponentTestProvider implements MessageBodyWriter
+{
+
+ // TODO: Retracted support for Seam component providers, injection shouldn't happen, see https://jira.jboss.org/jira/browse/JBSEAM-4247
+ @In
+ TestComponent testComponent = new TestComponent();
+
+ public boolean isWriteable(Class aClass, Type type, Annotation[] annotations, MediaType mediaType)
+ {
+ return aClass.isArray() && (aClass.getComponentType().equals(String.class)) ;
+ }
+
+ public long getSize(Object o, Class aClass, Type type, Annotation[] annotations, MediaType mediaType)
+ {
+ return -1;
+ }
+
+ public void writeTo(Object o, Class aClass, Type type, Annotation[] annotations, MediaType mediaType,
+ MultivaluedMap httpHeaders, OutputStream outputStream) throws IOException, WebApplicationException
+ {
+ String[] strings = (String[])o;
+
+ StringBuilder line = new StringBuilder();
+
+ line.append(testComponent.getTestString()).append(",");
+
+ for (String string : strings)
+ {
+ line.append(string).append(",");
+ }
+ if (line.length()>0) {
+ line.deleteCharAt(line.length() - 1);
+ }
+
+ outputStream.write(line.toString().getBytes());
+
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/InterfaceApplicationComponenTestProviderBean.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/InterfaceApplicationComponenTestProviderBean.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/InterfaceApplicationComponenTestProviderBean.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,58 @@
+package org.jboss.seam.example.restbay.resteasy.provider;
+
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.example.restbay.resteasy.TestComponent;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.In;
+
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.MediaType;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+/**
+ * @author Christian Bauer
+ */
+@Name("interfaceApplicationComponentTestProvider")
+(a)Scope(ScopeType.APPLICATION)
+public class InterfaceApplicationComponenTestProviderBean implements InterfaceApplicationComponentTestProvider
+{
+
+ @In
+ TestComponent testComponent;
+
+ public boolean isWriteable(Class aClass, Type type, Annotation[] annotations, MediaType mediaType)
+ {
+ return aClass.isArray() && (aClass.getComponentType().equals(Integer.class)) ;
+ }
+
+ public long getSize(Object o, Class aClass, Type type, Annotation[] annotations, MediaType mediaType)
+ {
+ return -1;
+ }
+
+ public void writeTo(Object o, Class aClass, Type type, Annotation[] annotations, MediaType mediaType,
+ MultivaluedMap httpHeaders, OutputStream outputStream) throws IOException, WebApplicationException
+ {
+ Integer[] integers = (Integer[])o;
+
+ StringBuilder line = new StringBuilder();
+
+ line.append(testComponent.getTestString()).append(",");
+
+ for (Integer integer : integers)
+ {
+ line.append(integer).append(",");
+ }
+ if (line.length()>0) {
+ line.deleteCharAt(line.length() - 1);
+ }
+
+ outputStream.write(line.toString().getBytes());
+
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/InterfaceApplicationComponentTestProvider.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/InterfaceApplicationComponentTestProvider.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/InterfaceApplicationComponentTestProvider.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,15 @@
+package org.jboss.seam.example.restbay.resteasy.provider;
+
+import javax.ws.rs.Produces;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+
+/**
+ * @author Christian Bauer
+ */
+@Provider
+@Produces("text/plain")
+public interface InterfaceApplicationComponentTestProvider extends MessageBodyWriter
+{
+
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/PlainResteasyStringConverterProvider.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/PlainResteasyStringConverterProvider.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/PlainResteasyStringConverterProvider.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,42 @@
+package org.jboss.seam.example.restbay.resteasy.provider;
+
+import org.jboss.resteasy.spi.StringConverter;
+
+import javax.ws.rs.ext.Provider;
+import java.util.GregorianCalendar;
+import java.text.SimpleDateFormat;
+import java.text.ParseException;
+
+/**
+ * Converts QueryParam etc. strings to GregorianCalendar if they are in ISO date format
+ *
+ * @author Christian Bauer
+ */
+@Provider
+public class PlainResteasyStringConverterProvider implements StringConverter<GregorianCalendar>
+{
+ public static final String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ";
+
+ public GregorianCalendar fromString(String s)
+ {
+ SimpleDateFormat sdf = new SimpleDateFormat(ISO_FORMAT);
+ GregorianCalendar cal = new GregorianCalendar();
+ try
+ {
+ cal.setTime(sdf.parse(s));
+ }
+ catch (ParseException e)
+ {
+ throw new RuntimeException(e);
+ }
+ return cal;
+
+ }
+
+ // TODO: RESTEasy doesn't seem to use that at all
+ public String toString(GregorianCalendar gregorianCalendar)
+ {
+ SimpleDateFormat sdf = new SimpleDateFormat(ISO_FORMAT);
+ return sdf.format(gregorianCalendar.getTime());
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/PlainTestProvider.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/PlainTestProvider.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/provider/PlainTestProvider.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,50 @@
+package org.jboss.seam.example.restbay.resteasy.provider;
+
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Provider
+@Produces("text/csv")
+public class PlainTestProvider implements MessageBodyWriter
+{
+
+ public boolean isWriteable(Class aClass, Type type, Annotation[] annotations, MediaType mediaType)
+ {
+ return List.class.isAssignableFrom(aClass);
+ }
+
+ public long getSize(Object o, Class aClass, Type type, Annotation[] annotations, MediaType mediaType)
+ {
+ return -1;
+ }
+
+ public void writeTo(Object o, Class aClass, Type type, Annotation[] annotations, MediaType mediaType,
+ MultivaluedMap httpHeaders, OutputStream outputStream) throws IOException, WebApplicationException
+ {
+ List<String[]> lines = (List<String[]>) o;
+ StringBuilder csv = new StringBuilder();
+ for (String[] line : lines)
+ {
+ for (String field : line)
+ {
+ csv.append(field).append(",");
+ }
+ csv.deleteCharAt(csv.length() - 1);
+ csv.append("\r\n");
+ }
+ outputStream.write(csv.toString().getBytes());
+
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelesscomponent/StatelessComponentTestResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelesscomponent/StatelessComponentTestResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelesscomponent/StatelessComponentTestResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,199 @@
+package org.jboss.seam.example.restbay.resteasy.statelesscomponent;
+
+import org.jboss.resteasy.annotations.Form;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.example.restbay.resteasy.TestResource;
+import org.jboss.seam.example.restbay.resteasy.TestComponent;
+import org.jboss.seam.example.restbay.resteasy.TestForm;
+import org.jboss.seam.example.restbay.resteasy.SubResource;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.contexts.Contexts;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.CookieParam;
+import javax.ws.rs.Encoded;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MultivaluedMap;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Name("statelessComponentTestResource")
+@Path("/statelessComponentTest")
+(a)Scope(ScopeType.STATELESS)
+public class StatelessComponentTestResource extends TestResource
+{
+
+ protected final String INSTANCE_CODE_KEY = "statelessComponentTestResource.instanceCode";
+
+ // We want to verify that this is really stateless (Seam doesn't pool POJO instances, so that should work)
+ public StatelessComponentTestResource()
+ {
+ Integer instanceCode;
+ if ((instanceCode = (Integer)Contexts.getApplicationContext().get(INSTANCE_CODE_KEY)) != null)
+ {
+ assert !instanceCode.equals(hashCode());
+ }
+ Contexts.getApplicationContext().set(INSTANCE_CODE_KEY, hashCode());
+ }
+
+ protected void assertStateless()
+ {
+ assert !Contexts.getApplicationContext().get(INSTANCE_CODE_KEY).equals(hashCode());
+ }
+
+ @In
+ TestComponent testComponent;
+
+ @GET
+ @Path("/echouri")
+ @Override
+ public String echoUri()
+ {
+ assertStateless();
+ return super.echoUri();
+ }
+
+ @GET
+ @Path("/echoquery")
+ @Override
+ public String echoQueryParam(@QueryParam("bar") String bar)
+ {
+ assertStateless();
+ return super.echoQueryParam(bar);
+ }
+
+ @GET
+ @Path("/echoheader")
+ @Override
+ public String echoHeaderParam(@HeaderParam("bar") String bar)
+ {
+ assertStateless();
+ return super.echoHeaderParam(bar);
+ }
+
+ @GET
+ @Path("/echocookie")
+ @Override
+ public String echoCookieParam(@CookieParam("bar") String bar)
+ {
+ assertStateless();
+ return super.echoCookieParam(bar);
+ }
+
+ @GET
+ @Path("/echotwoparams/{1}/{2}")
+ @Override
+ public String echoTwoParams(@PathParam("1") String one, @PathParam("2") String two)
+ {
+ assertStateless();
+ return super.echoTwoParams(one, two);
+ }
+
+ @GET
+ @Path("/echoencoded/{val}")
+ @Override
+ public String echoEncoded(@PathParam("val") @Encoded String val)
+ {
+ assertStateless();
+ return super.echoEncoded(val);
+ }
+
+ @POST
+ @Path("/echoformparams")
+ @Consumes("application/x-www-form-urlencoded")
+ @Override
+ public String echoFormParams(MultivaluedMap<String, String> formMap)
+ {
+ assertStateless();
+ return super.echoFormParams(formMap);
+ }
+
+ @POST
+ @Path("/echoformparams2")
+ @Override
+ public String echoFormParams2(@FormParam("foo") String[] foo)
+ {
+ assertStateless();
+ return super.echoFormParams2(foo);
+ }
+
+ @POST
+ @Path("/echoformparams3")
+ @Override
+ public String echoFormParams3(@Form TestForm form)
+ {
+ assertStateless();
+ return super.echoFormParams3(form);
+ }
+
+ @Path("/foo/bar/{baz}")
+ @Override
+ public SubResource getBar(@PathParam("baz") String baz)
+ {
+ assertStateless();
+ return super.getBar(baz);
+ }
+
+ @GET
+ @Path("/convertDate/{isoDate}")
+ @Override
+ public long convertPathParam(@PathParam("isoDate") GregorianCalendar isoDate)
+ {
+ assertStateless();
+ return super.convertPathParam(isoDate);
+ }
+
+ @GET
+ @Path("/trigger/unsupported")
+ @Override
+ public String throwException()
+ {
+ assertStateless();
+ return super.throwException();
+ }
+
+ @GET
+ @Path("/commaSeparated")
+ @Produces("text/csv")
+ @Override
+ public List<String[]> getCommaSeparated()
+ {
+ assertStateless();
+ assert headers.getAcceptableMediaTypes().size() == 2;
+ assert headers.getAcceptableMediaTypes().get(0).toString().equals("text/plain");
+ assert headers.getAcceptableMediaTypes().get(1).toString().equals("text/csv");
+ return testComponent.getCommaSeparated();
+ }
+
+ @GET
+ @Path("/commaSeparatedStrings")
+ @Produces("text/plain")
+ @Override
+ public String[] getCommaSeparatedStrings()
+ {
+ assertStateless();
+ return super.getCommaSeparatedStrings();
+ }
+
+ @GET
+ @Path("/commaSeparatedIntegers")
+ @Produces("text/plain")
+ @Override
+ public Integer[] getCommaSeparatedIntegers()
+ {
+ assertStateless();
+ return super.getCommaSeparatedIntegers();
+ }
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejb/StatelessEjbTestResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejb/StatelessEjbTestResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejb/StatelessEjbTestResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,106 @@
+package org.jboss.seam.example.restbay.resteasy.statelessejb;
+
+import org.jboss.resteasy.annotations.Form;
+import org.jboss.seam.example.restbay.resteasy.TestForm;
+import org.jboss.seam.example.restbay.resteasy.SubResource;
+
+import javax.ejb.Local;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.Path;
+import javax.ws.rs.GET;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.CookieParam;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Encoded;
+import javax.ws.rs.POST;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.Produces;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Local
+@Path("/statelessEjbTest")
+public interface StatelessEjbTestResource
+{
+
+ // TODO: RESTEasy can not inject setter/fields on plain EJBs, see https://jira.jboss.org/jira/browse/RESTEASY-151
+ // That's why we have to do it through parameter injection below
+ @Context
+ public void setUriInfo(UriInfo uriInfo);
+
+ @Context
+ public void setHeaders(HttpHeaders headers);
+
+
+ @GET
+ @Path("/echouri")
+ String echoUri(@Context UriInfo uriInfo); // TODO
+
+ @GET
+ @Path("/echoquery")
+ String echoQueryParam(@QueryParam("bar") String bar);
+
+ @GET
+ @Path("/echoheader")
+ String echoHeaderParam(@HeaderParam("bar") String bar);
+
+ @GET
+ @Path("/echocookie")
+ String echoCookieParam(@CookieParam("bar") String bar);
+
+ @GET
+ @Path("/echotwoparams/{1}/{2}")
+ String echoTwoParams(@PathParam("1") String one, @PathParam("2") String two);
+
+ @GET
+ @Path("/echoencoded/{val}")
+ String echoEncoded(@PathParam("val") @Encoded String val);
+
+ @POST
+ @Path("/echoformparams")
+ @Consumes("application/x-www-form-urlencoded")
+ String echoFormParams(MultivaluedMap<String, String> formMap);
+
+ @POST
+ @Path("/echoformparams2")
+ String echoFormParams2(@FormParam("foo") String[] foo);
+
+ @POST
+ @Path("/echoformparams3")
+ String echoFormParams3(@Form TestForm form);
+
+ @Path("/foo/bar/{baz}")
+ SubResource getBar(@PathParam("baz") String baz);
+
+ @GET
+ @Path("/convertDate/{isoDate}")
+ long convertPathParam(@PathParam("isoDate") GregorianCalendar isoDate);
+
+ @GET
+ @Path("/trigger/unsupported")
+ String throwException();
+
+ @GET
+ @Path("/commaSeparated")
+ @Produces("text/csv")
+ List<String[]> getCommaSeparated(@Context HttpHeaders headers); // TODO
+
+ @GET
+ @Path("/commaSeparatedStrings")
+ @Produces("text/plain")
+ String[] getCommaSeparatedStrings();
+
+ @GET
+ @Path("/commaSeparatedIntegers")
+ @Produces("text/plain")
+ Integer[] getCommaSeparatedIntegers();
+
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejb/StatelessEjbTestResourceBean.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejb/StatelessEjbTestResourceBean.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejb/StatelessEjbTestResourceBean.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,35 @@
+package org.jboss.seam.example.restbay.resteasy.statelessejb;
+
+import org.jboss.seam.example.restbay.resteasy.TestResource;
+
+import javax.ejb.Stateless;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.UriInfo;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Stateless
+public class StatelessEjbTestResourceBean extends TestResource implements StatelessEjbTestResource
+{
+
+ @javax.annotation.Resource // EJB injection!
+ javax.ejb.SessionContext ejbSessionContext;
+
+
+ public String echoUri(@Context UriInfo uriInfo)
+ {
+ assert ejbSessionContext != null; // Ensure this is executed in the EJB container
+ setUriInfo(uriInfo);
+ return super.echoUri();
+ }
+
+ public List<String[]> getCommaSeparated(@Context HttpHeaders headers)
+ {
+ setHeaders(headers);
+ return super.getCommaSeparated();
+ }
+
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejbcomponent/StatelessEjbComponentTestResource.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejbcomponent/StatelessEjbComponentTestResource.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejbcomponent/StatelessEjbComponentTestResource.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,105 @@
+package org.jboss.seam.example.restbay.resteasy.statelessejbcomponent;
+
+import org.jboss.resteasy.annotations.Form;
+import org.jboss.seam.example.restbay.resteasy.TestForm;
+import org.jboss.seam.example.restbay.resteasy.SubResource;
+
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.GET;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Encoded;
+import javax.ws.rs.CookieParam;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.UriInfo;
+import javax.ejb.Local;
+import java.util.List;
+import java.util.GregorianCalendar;
+
+/**
+ * @author Christian Bauer
+ */
+@Local
+@Path("/statelessEjbComponentTest")
+public interface StatelessEjbComponentTestResource
+{
+ // TODO: RESTEasy can not inject setter/fields on plain EJBs, see https://jira.jboss.org/jira/browse/RESTEASY-151
+ // That's why we have to do it through parameter injection below
+ @Context
+ public void setUriInfo(UriInfo uriInfo);
+
+ @Context
+ public void setHeaders(HttpHeaders headers);
+
+
+ @GET
+ @Path("/echouri")
+ String echoUri(@Context UriInfo uriInfo); // TODO
+
+ @GET
+ @Path("/echoquery")
+ String echoQueryParam(@QueryParam("bar") String bar);
+
+ @GET
+ @Path("/echoheader")
+ String echoHeaderParam(@HeaderParam("bar") String bar);
+
+ @GET
+ @Path("/echocookie")
+ String echoCookieParam(@CookieParam("bar") String bar);
+
+ @GET
+ @Path("/echotwoparams/{1}/{2}")
+ String echoTwoParams(@PathParam("1") String one, @PathParam("2") String two);
+
+ @GET
+ @Path("/echoencoded/{val}")
+ String echoEncoded(@PathParam("val") @Encoded String val);
+
+ @POST
+ @Path("/echoformparams")
+ @Consumes("application/x-www-form-urlencoded")
+ String echoFormParams(MultivaluedMap<String, String> formMap);
+
+ @POST
+ @Path("/echoformparams2")
+ String echoFormParams2(@FormParam("foo") String[] foo);
+
+ @POST
+ @Path("/echoformparams3")
+ String echoFormParams3(@Form TestForm form);
+
+ @Path("/foo/bar/{baz}")
+ SubResource getBar(@PathParam("baz") String baz);
+
+ @GET
+ @Path("/convertDate/{isoDate}")
+ long convertPathParam(@PathParam("isoDate") GregorianCalendar isoDate);
+
+ @GET
+ @Path("/trigger/unsupported")
+ String throwException();
+
+ @GET
+ @Path("/commaSeparated")
+ @Produces("text/csv")
+ List<String[]> getCommaSeparated(@Context HttpHeaders headers); // TODO
+
+ @GET
+ @Path("/commaSeparatedStrings")
+ @Produces("text/plain")
+ String[] getCommaSeparatedStrings();
+
+ @GET
+ @Path("/commaSeparatedIntegers")
+ @Produces("text/plain")
+ Integer[] getCommaSeparatedIntegers();
+
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejbcomponent/StatelessEjbComponentTestResourceBean.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejbcomponent/StatelessEjbComponentTestResourceBean.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/statelessejbcomponent/StatelessEjbComponentTestResourceBean.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,45 @@
+package org.jboss.seam.example.restbay.resteasy.statelessejbcomponent;
+
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.example.restbay.resteasy.TestComponent;
+import org.jboss.seam.example.restbay.resteasy.TestResource;
+
+import javax.ejb.Stateless;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.UriInfo;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+@Name("statelessEjbComponentTestResource")
+(a)Scope(ScopeType.STATELESS)
+@Stateless
+public class StatelessEjbComponentTestResourceBean extends TestResource implements StatelessEjbComponentTestResource
+{
+
+ @javax.annotation.Resource // EJB injection!
+ javax.ejb.SessionContext ejbSessionContext;
+
+ @In
+ TestComponent testComponent;
+
+ public String echoUri(@Context UriInfo uriInfo)
+ {
+ assert ejbSessionContext != null; // Ensure this is executed in the EJB container
+ setUriInfo(uriInfo);
+ return super.echoUri();
+ }
+
+ public List<String[]> getCommaSeparated(@Context HttpHeaders headers)
+ {
+ setHeaders(headers);
+ super.getCommaSeparated(); // Ignore return, just to run the assertions
+ return testComponent.getCommaSeparated();
+ }
+
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/subresource/Garage.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/subresource/Garage.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/subresource/Garage.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,24 @@
+package org.jboss.seam.example.restbay.resteasy.subresource;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+import org.jboss.seam.Component;
+import org.jboss.seam.annotations.Name;
+
+@Path("/garage")
+@Produces("text/plain")
+@Name("garage")
+public class Garage
+{
+ @GET
+ public String getInfo() {
+ return "garage";
+ }
+
+ @Path("/1")
+ public Vehicle getVehicle() {
+ return (Vehicle) Component.getInstance(Vehicle.class);
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/subresource/Vehicle.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/subresource/Vehicle.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/java/org/jboss/seam/example/restbay/resteasy/subresource/Vehicle.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,16 @@
+package org.jboss.seam.example.restbay.resteasy.subresource;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Produces;
+
+import org.jboss.seam.annotations.Name;
+
+@Name("vehicle")
+@Produces("text/plain")
+public class Vehicle
+{
+ @GET
+ public String getInfo() {
+ return "Honda";
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/META-INF/ejb-jar.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/META-INF/ejb-jar.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/META-INF/ejb-jar.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -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/restbay/restbay-ejb/src/main/resources/META-INF/persistence.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/META-INF/persistence.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/META-INF/persistence.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,18 @@
+<?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="restbayDatabase">
+ <provider>org.hibernate.ejb.HibernatePersistence</provider>
+ <jta-data-source>java:/restbayDatasource</jta-data-source>
+ <properties>
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ <property name="hibernate.show_sql" value="false"/>
+ <!-- These are the default for JBoss EJB3, but not for HEM: -->
+ <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
+ <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
+ <property name="jboss.entity.manager.factory.jndi.name" value="java:/restbayEntityManagerFactory"/>
+ </properties>
+ </persistence-unit>
+</persistence>
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/import.sql
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/import.sql (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/import.sql 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,108 @@
+insert into category (categoryId, name) values (1, 'Antiques');
+ insert into category (categoryId, name, parent_category_id) values (1001, 'Furniture', 1);
+ insert into category (categoryId, name, parent_category_id) values (1002, 'Silverware', 1);
+
+insert into category (categoryId, name) values (2, 'Art');
+ insert into category (categoryId, name, parent_category_id) values (2001, 'Paintings', 2);
+ insert into category (categoryId, name, parent_category_id) values (2002, 'Prints', 2);
+ insert into category (categoryId, name, parent_category_id) values (2003, 'Sculptures', 2);
+
+insert into category (categoryId, name) values (3, 'Books');
+ insert into category (categoryId, name, parent_category_id) values (3001, 'Fiction', 3);
+ insert into category (categoryId, name, parent_category_id) values (3002, 'Non Fiction', 3);
+ insert into category (categoryId, name, parent_category_id) values (3003, 'Comic Books', 3);
+ insert into category (categoryId, name, parent_category_id) values (3004, 'Children', 3);
+
+insert into category (categoryId, name) values (4, 'Cameras and Photography');
+ insert into category (categoryId, name, parent_category_id) values (4001, 'Digital Cameras', 4);
+ insert into category (categoryId, name, parent_category_id) values (4002, 'Memory Cards', 4);
+ insert into category (categoryId, name, parent_category_id) values (4003, 'Film Cameras', 4);
+ insert into category (categoryId, name, parent_category_id) values (4004, 'Video Cameras', 4);
+
+insert into category (categoryId, name) values (5, 'Cars and Boats');
+ insert into category (categoryId, name, parent_category_id) values (5001, 'Cars', 5);
+ insert into category (categoryId, name, parent_category_id) values (5002, 'Motorcycles', 5);
+ insert into category (categoryId, name, parent_category_id) values (5003, 'Car Parts', 5);
+
+insert into category (categoryId, name) values (6, 'Cell Phones');
+ insert into category (categoryId, name, parent_category_id) values (6001, 'Mobile Phones', 6);
+ insert into category (categoryId, name, parent_category_id) values (6002, 'Mobile Accessories', 6);
+ insert into category (categoryId, name, parent_category_id) values (6003, 'Prepaid cards', 6);
+
+insert into category (categoryId, name) values (7, 'Clothing and Shoes');
+ insert into category (categoryId, name, parent_category_id) values (7001, 'Women', 7);
+ insert into category (categoryId, name, parent_category_id) values (7002, 'Men', 7);
+ insert into category (categoryId, name, parent_category_id) values (7003, 'Girls', 7);
+ insert into category (categoryId, name, parent_category_id) values (7004, 'Boys', 7);
+ insert into category (categoryId, name, parent_category_id) values (7005, 'Babies', 7);
+
+insert into category (categoryId, name) values (8, 'Computers');
+ insert into category (categoryId, name, parent_category_id) values (8001, 'Notebooks', 8);
+ insert into category (categoryId, name, parent_category_id) values (8002, 'Desktop PCs', 8);
+ insert into category (categoryId, name, parent_category_id) values (8003, 'Servers', 8);
+ insert into category (categoryId, name, parent_category_id) values (8004, 'Hardware', 8);
+ insert into category (categoryId, name, parent_category_id) values (8005, 'Software', 8);
+
+insert into category (categoryId, name) values (9, 'Music');
+ insert into category (categoryId, name, parent_category_id) values (9001, 'CDs', 9);
+ insert into category (categoryId, name, parent_category_id) values (9002, 'Records', 9);
+
+insert into category (categoryId, name) values (10, 'Electronics');
+ insert into category (categoryId, name, parent_category_id) values (10001, 'Home Audio', 10);
+ insert into category (categoryId, name, parent_category_id) values (10002, 'MP3 Players', 10);
+ insert into category (categoryId, name, parent_category_id) values (10003, 'Television', 10);
+ insert into category (categoryId, name, parent_category_id) values (10004, 'Home theatre', 10);
+
+insert into category (categoryId, name) values (11, 'Home and Garden');
+ insert into category (categoryId, name, parent_category_id) values (11001, 'Kitchen', 11);
+ insert into category (categoryId, name, parent_category_id) values (11002, 'Real Estate', 11);
+ insert into category (categoryId, name, parent_category_id) values (11003, 'Furniture', 11);
+
+insert into category (categoryId, name) values (12, 'Musical Instruments');
+ insert into category (categoryId, name, parent_category_id) values (12001, 'Guitars', 12);
+ insert into category (categoryId, name, parent_category_id) values (12002, 'Pianos and Keyboards', 12);
+ insert into category (categoryId, name, parent_category_id) values (12003, 'Percussion', 12);
+ insert into category (categoryId, name, parent_category_id) values (12004, 'Orchestral', 12);
+
+insert into category (categoryId, name) values (13, 'Sporting goods');
+ insert into category (categoryId, name, parent_category_id) values (13001, 'Golf', 13);
+ insert into category (categoryId, name, parent_category_id) values (13002, 'Fishing', 13);
+ insert into category (categoryId, name, parent_category_id) values (13003, 'Tennis', 13);
+
+insert into category (categoryId, name) values (14, 'Toys');
+ insert into category (categoryId, name, parent_category_id) values (14001, 'Remote control', 14);
+ insert into category (categoryId, name, parent_category_id) values (14002, 'Cars and trucks', 14);
+ insert into category (categoryId, name, parent_category_id) values (14003, 'Dolls', 14);
+ insert into category (categoryId, name, parent_category_id) values (14004, 'Educational', 14);
+
+insert into category (categoryId, name) values (15, 'Video Games');
+ insert into category (categoryId, name, parent_category_id) values (15001, 'PC', 15);
+ insert into category (categoryId, name, parent_category_id) values (15002, 'Nintendo Wii', 15);
+ insert into category (categoryId, name, parent_category_id) values (15003, 'Sony Playstation 3', 15);
+ insert into category (categoryId, name, parent_category_id) values (15004, 'XBox 360', 15);
+
+insert into account (accountId, name, feedbackScore, feedbackPercent, memberSince, location) values (1, 'honestjoe', 0, 0, CURRENT_TIMESTAMP, 'Sydney, NSW, Australia');
+insert into user (userId, username, password, account_id) values (1, 'demo', 'demo', 1);
+
+insert into account (accountId, name, feedbackScore, feedbackPercent, memberSince, location) values (2, 'bob', 0, 0, CURRENT_TIMESTAMP, 'Brisbane, QLD, Australia');
+insert into user (userId, username, password, account_id) values (2, 'bob', 'bob', 2);
+
+insert into auction (auctionId, account_id, title, description, category_Id, startingPrice, bids, endDate, status, version) values (19264723, 1, 'Whistler''s Mother, original painting by James McNeill Whistler', '+Whistler''s Mother *Arrangement in Grey and Black*: The Artist''s Mother, famous under its colloquial name Whistler''s Mother, is an 1871 oil-on-canvas painting by American-born painter James McNeill Whistler. The painting is 56.81 x 63.94 inches (144.3 x 162.4 cm), displayed in a frame of Whistler''s own design, and is currently owned by the Mus�e d''Orsay in Paris.', 2, 5999999.00, 0, CURRENT_TIMESTAMP, 1, 0);
+insert into auction (auctionId, account_id, title, description, category_Id, startingPrice, bids, endDate, status, version) values (62748261, 1, 'Lost Tales Volume 1 by J.R.R. Tolkien', 'THE BOOK OF LOST TALES, I, stands at the beginning of the entire conception of Middle-earth and Valinor. Here is the whole, glorious history of Middle-earth that J.R.R. Tolkien brought to mythic and dramatic life with his classic fantasy novels of the Ring Cycle.', 3, 4.50, 0, CURRENT_TIMESTAMP, 1, 0);
+insert into auction (auctionId, account_id, title, description, category_Id, startingPrice, bids, endDate, status, version) values (71234567, 1, 'Nikon D80 Digital Camera', 'The D80 features a new 10.2 effective megapixel DX Format CCD image sensor, bringing a new level of high resolution and sharp detail to the class while also providing plenty of freedom to crop creatively and print impressive enlargements. Nikon''s DX Format sensor and Nikon F bayonet lens mount design assure unprecedented compatibility across the comprehensive assortment of AF Nikkor lenses and DX Nikkor lenses designed exclusively for Nikon digital SLR cameras.', 4001, 899, 0, CURRENT_TIMESTAMP, 1, 0);
+insert into auction (auctionId, account_id, title, description, category_Id, startingPrice, bids, endDate, status, version) values (73219532, 1, 'Pontiac Firebird Trans Am T-top', 'In good condition, this car has had some custom work done on it.', 5001, 199000, 0, CURRENT_TIMESTAMP, 1, 0);
+
+insert into auctionImage (imageId, auction_id, data) values (1, 19264723, '89504E470D0A1A0A0000000D49484452000000C8000000B7080300000060F2E1B80000000467414D410000AFC837058AE90000001974455874536F6674776172650041646F626520496D616765526561647971C9653C00000300504C5445956836B5874746423BCAA6764A4541A67636CAA5695B5653D8AC75D5A967E5B877F8D699ECC589BA9877BB9457D9B687865419767267A39C8E3A3532DAB578E8C996A88557AB8764885922CAA884E5BB87030203716D63F9E8B6504B466D6962CDA45B615D54D9CEB0B48A67DBC78D956A44413B3899958E9B724634291469655C513211956527FCE7A9764817ABA49AB8B4A8867B69F4CB888B6335A47B574437229B755621180FE7C27B845933F7DAA7171211DAB99527221835302B8B6445AD8348C39D75BDA56D302B27DAB369514732FEF9CB7B542759544C2B2722BB8C5255514BC4945AD3AD856239128A8479F2CE957B55339E6F38FEFCD5694624ECD5A8726A5BEDD6B4AF833B764B2365615A8B6027EAD79A928B77684219AB7B40C59C63FCFBE7EACCA4BC8D5B93621B0F0909BB9248B48C51CC9C63C5964BFBE19E645448C493533A2F1AB2AEA6C59B5CA37B416D695D4A402BCFB287B4946CC49D6BF7D48FFDEEC255442!
7AC7C4BBC9361F3DCB61910099D8766B38C5CB38451CC9B5BA27340C59562656155E3D9C5A37D62ADA9A2A37B4BBC946C7C4F185D594FC49B51B58D71CFC0A5CCB477B493627B786FEFE6A5BD9C6E865C41A99476BD9B61CC9D6BE8D38CFDF1B5CBB7966A6354776346C49E81956D51B17D448B836DDECFC48A6A52C38D57A3744BCBAC9030260D634A36BCA2852B1F0DF2D0A69F8258785A40AD8F67C8B06AA9A4908F5C25CB9B53724931EFE4B1E8CDB2B2AC9CAB8C6EB2855E9B927E6753397B715D555144EDE6C4D5AD918D755AC4956C594219634C44754410BEA25BB59C6BC08D49544D4EB9B49D523A21C9965CD3A1665C534566604C673A20584E38140C0FCA9651453C3D896F489F6D44F9EED99D6F2D877F8F7C75896D6A53746C79B07D53332C2DB49B616C502AD19D58824E21BA8550655E61AB754BA88F5CA87540905F35412D1F69676EBB865E5E5A43E1AF643C383E6E400F2E2F2A6F70630808092B2B2D0C0C0C101010231D1B906F3FBEBAAE303131A07052BE8E6552403048414D4B22051E1F1E55564555594DE0C09D755C50EBF67C9B000059A54944415478DA947D0D405475BAFE611860401CD44140C481B9CA0888BA32201032A068CC0CA032192124709D1052888FC4829071600D1DBD6A1AD49AE24DB2D034AB5D35D9D25259C592D0E5DE56B6841!
233C9908F75D5ACF6FFBCBFDF9901DBFAEFDEF7CC9C3973E683DF739EF7793!
F7EE7E80
813B6CE733C24DBB2658BA727BB61D9E2E1E13145B4FF98F2F87F3C8A85DB7FC17E47F7DFFDE977AF4D7863DEE9835BBDC367CF0E0F0AAA0D9FBD7BC78EC0B8B8DDBBE376C7ED78737720B67607CE6E9C8D175E5DBF7EED57DEDE6BBDBCB71E3CBDC5D1D171DEF6795BB73BCEAD3AB861DEBCEDA7B756797D75B06AF576AF83AB0F1E38F8E21BA74FCF3B3D6FDEE9D378DF3CDCEB2ACA1C0F39CF8BF2F49C327E8A876F94E74B51535EC2B2E5A1C71F7F61E5F4C7C7BF347DFABBE385A7BD77874FBE535D5D9D5396EF2C93796E993265FCF8F118FEF277FFC8ECE13FFFF93F6921FBF37F8A1BB4FDC73FFF71D273FBC7CFF1F8C92305D0531CE7CE1D3DD97BF3E4F5DEDE9347CF1DBD7AF2C10D1B566F98BB61F4E6D1BBDE4F714C9930E1FDF7E7FCF4D34F53F0D6146CCC99F274CA1C0CCD23E5FD091352764DD8B56BF491CD4746C3C68D1EBD79F2E4A3F81E7CDDE60DB0C978EA15EE153EFBEF383CBBE3E2E202777F10B77B08C7E940ED8103B387BCBC85B9291ECE516BC2606B56329BFEC2CB640F3FFC08378CF991FF7CC0FEFC9F8FFCF9E13F3FFCF033CFBC3CFDF197A64C719F12E5EBE9BBC5D5B92EC739A7AEA2AE2CC7D9D959764876C8D939C0795ED9860D39756565CECE8E8E4F83E9C741B387C7168F2D5BE61D3A346FDE3CF802764F90793C3D65CAD3F31C7138!
B6E0131B1CE74E98B07AF5DC37DE7074F4240E1D1D274C709CE0F1BBA727BC9F3267CEEF5E7BEDB5378076F3E60D9B374C1EFDE2FAF5B385C98E390EE90E9B563CB962935BD4FCF9F3A3C85E82AD7C41B497B1D08DECDD77DF7DE171BC88D1E0BE65CAA153F3B71C0A381570EAED804D9B56380504ACC3E3A64DEB3605B8060404DC0808983FDFD575BE6B80AB9B9BE77CCFA8299E51519EF3E1249EF4A7B03FE05451C0A9530187E6630FEDF5747575057EE79CB29C32E7436587E6391FDA7268DEA19C9C535B9C9DCB9CCBE6CDFBABDCF9100C47E2AF7F5D0DA73CE075A0E2ABD96BBD850DAECE39F1D13EC67207A715019BBEC09F3F15303F80D921FCAD43046DFE162C87020E61C0A74E6D3A255F01C3B857E4C5C7A7A7A7177738393965A7A73B39A5673BE13936F0485B2BD81327DA745871E6C94DF4B1534FAE600B1D3A0787F4F46C07D8A653F4859B3615ACC8CB5B41AF19D2D3E3E3F3F21CD25714C8E50E799B0A1C563864171717E37BF2707770C057E5ADC8F3F28AF73A7020F5E2D0412FE1447D806B4EF9D22B3E637C9E78E289D0D0D04CDC43B189A787E99119F6D076E813879F18E33366CCC68D1BC7F8C0D84EDB8B993E63323333E94DB68F8D19F3C418FA26FAEEC3F451DB6B6C7538131F09A54F7774748476848676300BEDC8EE604F845001A3C93C8C77!
F9E0BBF137376223D1676362E298C4449FCC4C9FE84C8D3014B7E495BADABA!
3A21E75C
AB6B4E5DDCC2850BBFFDE8231AE0460C74CC4676C387C7D0B8690F8DE630DBA24DDB6B3EE2887DD84EFA3856ECEDEC755A6DE45FE673D8670CB0307800884F1E3E4CC782BE634CE6133E99EC8BF02413DF8681D30BECEEE37365E3C619DCB2B0907DFBED421AF0C285590B179E7DF3404090A94828CB5FF74551C5DCE8EFA72DFCF6DB6F3FC29B181C801E33E6CA18FBF83EE228C78CA187191B377E34E3233CCCD8C8863A63069E32FBF65BFE25788FF8FC23767C3E6207801D8D31FC2810BA19573672A4EC9B7DF821F3E107D276087CF813FA8BDC683B71C647DFE29695B570DAF7A9AF06CA83E4C982636B6B7E6B5D59F2C2EF812F2BEB231AC5952B893E3E87A30FC34271D80E1F1E730507E630BE1547F1CAD22B57AE2CDD88750FBD01073634B40747901E7C7A0E0B3D3D0239674F0FF6C239E83BC861C84F0E1FEE0915D897E22BC78CC17AE3C62B890C0C0DFA0A01FC881FFD2C76CCE9B09365D1116187896F7C84C3FD6D167899F6FDC28B414379B506B950DFDA9A5CEF5C96A3591A2704065EB27C79B9FCCB2F2F7F7999D9F53B77AE5F0E0F3F3A39FCEF97D75F3FBAFE32E239621E82FBF5C947995DBF7CB9BCFCCBABE5E59672B3B92BBBA101028E2F379797973798CB1D4C06F3E5CB86BDD8DFD5B5F772D7F5BDD7F79299BABACCF858797CF62532600F0C0C140!
27BE8CE569AB8E8D4779626A65E599AB5E4934F3E7967E9D2A55045B44FE261A3201885504D6666E2951957962C5C382DFAE2EC8BF2F8BC22A13EE0ED8273D5151B26C7ADBF73C2D95196E2E14B367EFCF2E5FB7FFFD873648F3DF6D8EF7FFFFBC77ECBB61EFBE3737F7CEEB7CFD1AEFFA0E4F6B4E3DCD35BCBB6575599CDB5E5E6CB00116FAE3099AA4C55E6A37293B9EE44C586B20D5B37383ACE2D4B9179F87AC852F8E258E638D771EE76CA767726E35671A7AAA2A2AA62C39DB9658E8EF5734FECBA33F9CEE4A3938F5E0EF73EFAF7F0F5978F5EA6E3E65D853F741447A7BCB111E544DC3B4BE2761F1892D7AEC811E6AE7B7BEFB99CA31B28EF8E7EEDE93953E6FCD7949FFECB5692E0FEDF5846189EE2F65FFFF537AA54FEF0DAEF7EF7C68437DE98BB1D839A3B61FB89B2131B566F9FBB1DE9CB71FB8409F3E66279C3F18DD513B09AE7B87D5E190A92D3DBB7CF7B63DEDC0D1B46AF3EB8FA08D2F77AEFF55EEBC367AF67367BF76CA4EEBFCF9E8D1CFEF7D9E1E18DA88066AFC706B3A3DEEB8F7A1F3D7A70F569DC46AFF60EF78E8B9B3D7B481EE4502438BA3EB937BFBE62AEC7A8C5CB1F7A77D2BBEF4E9AF44724F66790DA617F7EE4CF8F3C62CBF1A2E1E9338F3CFCCC1F9F7BF78547294F6FF18CF288F238E4CC12394B67CEF3E8D9A143C881F3B744454D41D21!
EFFD21456BF79501AF5406EF7402AF7F098830798E36B5B263CFDF46B4F638!
56A85F6C
CF99DC76B13525E9BC08D1EE980ED7AE38DD1BB4623A7BF38FAC5D3DB8FBC5A265B1F377BFD90BCBC2B59A8CF2F28C84FAE720490F10FF9E614B9F26478CA15B910D990F2E329B60F09F1D0A15387D8C321ECDEC48C92DB0A4A7C0EC55087036D8946CF9E94F3444746DFF136AB20363D89A7C8AC487EF1F1C5C574A3C761B314436CB5C5C54877F179555579E6BC3C39AA1C543E393975A88190E31DB79C3E307A97DC33FC2218D954DC5524B4B67EF169AB7CB26CCEFEC58B1F5AEC4101EF897F324A6094CD787E43A07FC29E42D82EFB9B587E23EBC066077BC67674883B11BF6837CF19A19962B21823260CE4B8CC4CEC159F903DC177B0ED508125EB50A123D4A943481D2A9B5B250BBF18543BB429FB4C91E0DAFAC5B92FAA37A4CC19B5D8FDA1F1A39C911737B258CDD3E218CA2657688DD51584C88F107C6760F9E80AA234A227E5129E405908F5197325F1CA18D1368A8F14B9C78899447CE50A520F7DD1158AA5B4CCA090FA114B49333ECAA2983BE3DB8F449BC1C2F218CA8B5452B02F98967AFAD4DC3B73670F0D1D085A91FD361871FD22799DBC2CC563FFE2F1FBDD178745EF68AC0D2FF70ABF1CEE653E7A94CACB3B2760F5BB5067A7EC826D184DEBD173B16334D68E8E5030EAD50A39621582D5F60A04968A9CBA737253757E757275757E7D7DD9DCB2B9DBB7!
6FDF505156B69D95E4938F561D3D1AEEE58DBF128E90B41EA246004675DEB3A367C78ED41DD1587A52A31397BEB3343A31118706C96BC6D219388000C773FA342F537EFD1DD9ECDAA003C5C9D99FCA85D62FBEF874DD9DB2145F0019E53E7EF1AE09E8163C9F7E3A8596D79EFEDDEFA03AD8D3AF91E4DE40D3F0C61B4C71A35763397264EDFAB5070E1C089F7D00C12508F75ABE34CE6EC40D71C6CBEBAB2AEFB507F146EF232FBEF8221EB178A3C93A72F008DD8F6C5EFDE2EAD1EC156CB22F3F3D7AF4E9D1DB776DA7CE64FBE87964380E6515751BCACACAB6DED970A7EACE86F01DEF58CC45F5775A0F00487641C3A7C9E45A9F9EABAE97CD798831B2FFB949A377EF7AEDB539BF9B83F8CAA3ED7FF3D583F65B2CFFFD1FC825BE7328F6A4A43C3D61CB842D147771A30D4799634ACAF89F589B3665CA9C9FE6A4A450FF043BB10BBDD6EACD47366FF6C682E8BB7EFD1104DEF5A0C69B0EC807AC757A15CB8EB81D3B76BC4ABB3E78F5D5573FD8FD2A42F3ABA06EC78694A0A0F873B23BCEDEC826F10ED905A4914FCF1454CC0590FD8B478D5FBCFCB949CFFDE76F7FFB47BA61356CFFF15B1A3D862FA695E553C64FE13D92275AA82D6408BA8E689610800FA1377576441CF6941D9ACF5AA72D4F4FA135822D026D4A0A85D80908B51328E292E18594F73D00577C32873593!
CBC7FFF4D3F847F73FF628D9BBEF221D3F3AFEA7F13FEDF2DEBED8AB31AF48!
66CEF72A
0EF232E7599EAC83463E2D483E512FF3786894FBFEF18BF74F9AF4D0335B3E9F9198B8143541260A652C8246ACAA0594CD8246A3C9BC92A8D144472746631BFE9C1A1DFDA6060FA9D1AF68A253133F4F4CC49E546CC1DBA377E01D1AACB0D60CC509713D71FC3BF0C9A54B53D9A7F1AEC0C09E2194297881DF87822C8220A05CC13E6168E8E2ECDA211C7A78B1D7575FCDDE3E21674D78505E80CC2BE7686DAD9721DEF8C55F05D98D4F3F2D28724C791F7964D4E2FDC4C8F4973F680A0EBE160CBB9670ED9A42DBA988E855A8150ADCAF29D8034CABD5E295CE04BD5EA173D125E95A94A2B5B424295B925AECA66B7111AD9B2D2E2AAB0A4F7449E775BA55A27DC86CD5C8A7AF63F9906F61F39BF75E7FFDBDF7DE7BFD9D1DAFBC79D1D931276C7D507C806B55595571B997BC5C80D85D5D9FFCB4A0DE51E6FBD0E2C570AEE593A63F377DFA81DEF6F6F67BEDF7A4520CC945A773E9F657A95419DD1918818ACCC52529A94529954A2512B55AEAE7F79D9F3FECEB909090EE10DAF88E9EFA63FD9D1F5E1C3B769B688B16CD5AB468D1B645DBB6CDFADF6D0FD8D86D63616C35F62F7E63BFC337FA616BEC587C81F8E5DDDD5FDF53CC9CBA6DED21591D80C0B5AA72AA2C8D5EA662235CCBD5F5ED270DADB214DF87D60008B916807CA09690B54B08098EB14EA5D20182CEEA8207B!
AE1F8B70086B45DDDABEE958694F89594E06F014746085949087B02F3FFDADFDFCF6F2C8D7378C8DC668DDD767C1B1BF977808A01D3988FD3B0D3E8CBFCFDB87DE757E247A008CEB696D23FCD9CFAE2264FB9FBE4C678B97355455590A536AFDC78264770BDF1E419871C990712E278E0580E8D4C5FC980B44BEE492452A512379DCA25E9479DCB8F56971F9392408632A919BBA512697BAF5AD12BC9F02F29E1E30EA9C90014C24448FCBBD978BEF663C7F9C1C38FF571A0602F310863C581FBD388F11852C21EFCFD4B68EF5FFCFCFFE2EFFF9716C95B33A7AE0DF094876D088A4F6E35D555D5D6D65E8E0F753008CE37DE3E73065AF77DE825F7518B173320D32FAA25EDEA76E9BD7670A294B628935C5CE0F9492D706C1082ADE624006C012924977615065DF2D9673B3F0BD95953B3B3E4B31262E8B39D256925696C6C6339101AFCAC6D8C04B6CD3DC96FA4F9DB6E7E3836FE251C09DFF117DA0290E7A71E0B70AB0B9B0B20AED773AA1AC36BCBCB8D2B920567682439DFD1171A715FBC78145CEB5D06440210ED0404060456064447D2C083AEB919AA3EDFACBC0B8D0008A850F6F6F62A98A9B5BD0AB6D9DBDB8E1B94460B7885934A43381046909D8C613A4A00807B1588F067DBB092AFFDBEF607B17E7F69290590B501BE150464AFCC54B735A83CDC7C55484F46D47!
AF2EDA27C99C74F2B171323147E5F5879917030634094248B9616523D1C0BA!
C2401C80
5E585E6F3D25209460E2025ED2EFFFB17D8D7B4FA5FB2FFF99FFF610F7C93DB22894A8461B7612A6C479F20B007711961635BD48C117779547D509E5C76A7A2AAB1DC2B7EC8188FA875A3E0C975D5AD1EEEDCB57ECFC47EB15D092814BAA40C880B0F53E45C49A476A54EA96CBEA05CA0949482110212D2BEEDA9B766CE9C396E1CEE33673E8FCD99CFC3663EFFD453B8FDE6374FFD86D6CA9A6D634778DAD891AEE52FBA561A16E656F0AE92120E8562C9D778D545F1D6F3E3D69E7297BB5507AD2892A1A7B4C47BD51A350E147E3FFDF4ED1C34B8702DC4ADE5CF3C474058604500A6B085C0054692A00DDCA0155D12D44E22B98037B513232E0022F9FAF971643347D8F3B4C09E22FBCD6FFE06202A1B906D0F309286C5C64A1AC64DF1C2AFC49FE32861B18405B216ADC8C88D9C460031E56CBD448C087972E10680ACAB96C9C8B516A34B7C66D2A4E92F5C6444DC9348296A2939102673889EBC8B5C0B7C2C90422304C43FA4044066721420E60F7F98F9070E854010231CC76F94D66D22215CE83620ECD0DBDC2B64581C25885D14CD2990877C1DE2E772731C18A98B92BB9EA8958391B2AA4BC55FD51A87D2F304B71B9F3EB9C994C2811023939E9B34FD15268D7BCCAD08084BC474835080A44589E8BB40BA0040DBD5C38CBC358E50906FBDF5D65B1CD6F3CFFFE9A93F!
3DF5D41F8003409E02101E6945ADFBD9C49E56220638F6C45F44C580004509638432928BF6D8CC99C79CA3AA02728AE5724F53595550A3B9D6223831209F6E3221214E5F339EC2EF9F01642507A264C106A9AF8534C20D30C8800E6C49188EDB6A1D80A88911722D4231F3AD716F89EEF50766BF2103315230E26753C90824240C9B54281FFA95D84330C321BA96BF2A61D9CC712FCE8B32B50248B2A7497E34A831BCBCD8A9410E20679ECC2F7294FD841265144A943F4F7F6ED20BAFB42BED8C50B9E4D28DAA44C73C8CC1A1C28AF23A03A2502465D484B47F3D932B64DCB23DB065CB961DC30D36F5D8A265536D4094C340B6B15C2EA6426804D2B025909212AE177F0E81FC8B548300ACD22F9B3AF5585D94C9B5AED854E07A34EF68A0A5F672B9537C3CA2D69933EBEAEB5310B516030A732D004962381823481C2E2C6CD19AF19144FB281E00079068936A5435BD702D781312EFF1597BF6CC9AB5873D1C3F7E7CD6F190EF66914608C902EBD8918CF871B5D3BD24CDDFAE8B10A28255582525ACD4610AFA9A18D1EF993A151AA908A82BAE90CB8EE6790941976B8DC50D0E00B2E2CC991C6284B4CE5DEB8557A42DA2DA6D8C70C75291D259BD98C40A1435AF835B6A426A1462D47AEBD8F1B49D213B8F97D4A876D6586BC6A67DBC13A518C8F8DBDF0006AE856C300285!
2D27A6A5A5F15C8E353EC034C2F9B0030161212E09CB1890B2FC9C5A79C17C!
AFA23B3D
81B5431AA7F83C62E4C9E46A99A7EF4351E347AD81D8DF9DC41951B2C825A5E49104D722182A5126903BF91655BE2C972B6B326A7ABB9944C68D3B96F699B526C4AF645B8D2AA3A6662C021A0E3917FB6FFE26D58DB5552C7EB61A8B1ED3A852C480D3A00ED43A3B1929252C5CED0CC9F0E7410D0FE45AFFB3B628AABAA82228AF607E5E8EB927A83628CEE8E020CCBFB1F74903C4EEBED29D89FD610099FEB1A445C4718F5C2BC925A3DB2E76CA25494C23A242149D2D00A2E87E1E1227209FEDFCB866E7D8123F545D288659D1E1477E05247F9310103F5BE41D2BA262A12A8D460B624276EE4C5BB46C5B491A6303E486705494F04354FA45E3A6AE2D0A3B915C468C1C9597075E6A1CD258107EE743235D47651EEEA3DC911017FFFEE1497F9CF4C29BC8EC528A5C121108274325424176A42ADE0E444A1AE97E7EDC4C11C84E84533FC8532CBF21ECA7B8487E23D16D63CFFDEC48388E340EC42FEDB392CF8EA71DDFB6ECD89EB11C081C8D6452C2D3BC0B340246DCF38BCA6AF30CAE7979B59782E05AC5C8ECF36F749DE99AEC28731F15361E40F63F3C09AEF51E80B44B2562D4D2B9A88810ABCB08A3F82B5533D7EABDAD54D5D4A8996B4D05903DCBF6CCDA767C166F3CA889422BC56B14680440ECE2E0C177ACBDDAFD2CE4E38F672D1B77ECD89E3DC7F71C5B96B6F3B!
31AC865A75D2640E6A21F3B75D9DABAB0FA1C06C49C178FA618564CB556838379B24CB678947BD8E2C5EEBF7F8480AC42F845F52121D7A21E5195319C47380E16B40807FA60ADB4BB46A51635F2D6B1597B58009E85080C088B8068D12C5E694123147EFDFC6C40781249E36DC7CE8F9B4BEF1E5FF6228E0508D9732C6DE7CE1A722CA0A107E218AEF5DDB1FFD9B329ACDED9B1D1C120F392E76900C3A2F182D803E20D5D771C53168F0A0B5B1C06207F244648EAC8128C111D4F232C8588FD37DC8DB587BC75D74A55191CC8D47153671E3B8EE03B6BDB67DFD99A414A1933FFF614D30867843361CBEA884E4448C8C7172222224A41C91BC70065CFB2B11F436B805153033C35C44948864AFFD9D4457BE46165BE1382E2F39CCD79759AA120A1311AD5AF6C5D3680C83CC78F725F1C66630440DA79A72B5552C9DB8DA8A52304ACE272E15A0723E2240418E1AE3575EAB899C7E0E47EC7D3FC43BE13DBC2458B962D630AB103B19529363AA8F508C95875174022561D3BF616BC0B40667DFCB14A458C30630D740803B2765398B36F4A509E83CC2C77061063ADA616AEB5A9A1C174C251062064BF7FE4B96700E49ED2D655C1B39254DD6CDE0319A425C92E1029698480DC062304844B64E6B859B3A815476C2275CC221C4C231C48F336B191E2524FE38CF8A761BCAB5EF95!
07DF7C30BB38E8D23EF8273A69DB7AAC8B918109A0CC8A82120CBE05A8E6E2!
9C5790EA
E5526D38EA1DA38CD50719130DFD5C1E1FA9D7AD9E235BEEE58F63FFCEE33D35F789D55F1E846949C918C6EABCE85267D684EC545A7B4455F42D2A9ED94A8541F2BBE1EF71670A038456902752C5B347519167084DBB8E7593A44ADC5808CF5B3E50FDB140980EC5C7531FC1F1FAE3AFF0D54B2ECAD1797CD5A36EBBCD50A4AE05100B21348325400326ED11EC64831C47EC760DE11D8B8432314A3430C70E83299EA65CB47B9B9FBBAF9FE1E40263D7E01EAA0FEF01E4D5661F02135D6241DEBD65B5809CC6AC6762E76AD08A49BE743EA40785F45C52F95F0F61A9E03B1CD8E8C1D9E6E28F1A3698BF75E39E07DFCEE85F7D296BD786C1C53898A5112C2BD8B114240A6AE3D1596E3FB7471DE8A1B274CA6389AF5D380115940B679EF9D13885A6EBEBE9EC4C81F5F7EFC7526F5F6760A4E54FC8658939A75E4582D62854253281211482780D4EC54A89863F17E64B81779CA06840CE137699BBD45B7052DCA984883AA55AF7F7E60D7F1BBEFAD9AB5ECD88B8CD7101B9010824140BA6301E4C54DEE65514F17CB0B5CAB4DA6C0B8C0B8DAA17483E0E15A1E6FAA208DF8FABA797AEC7F843142057ABB5AC2A22C58806735B3D9134041CF4EF308AC6624897426243020DDC3A5FBCC61287F607DD5534F711C7F9328B7F93D6869AC194102AF59F5FADDF7BC47BFFAE1F9B4637B!
5E3CF622C2F7CE6F542A3E51468E155293A1AA894D1B37F5D8A6B0324F596D72416B91C11C3414A7A935667B099EAD0DE6E43B48886BDC7CDD5A6570AD492F3FFE2C7996BA9775EC4A90510320E0A185DDF9ECA8C8080849E86C57D5402354FB3228CFFFC18663A6ADCFE5B5D69FFEB640B9CDEE51BCBFA546248D798F6EF63FEE5E5C3DFAD50BEF211D521FB0A7E6FCC72A71BE8C42162402D79A39F5D8DBD088ACDC24773D67300C5D8CDB6111E2AB0437D7F8AE8A0A47C7F1A33CDDDDEA65FB99469EE5F5070141B3DBACB3EA9218105A92D03052EDDBCEF20811A25513906EF22AAE1370F3A07F3DFF3C2BB5189034BF92EF462049437DC508517DB3F9831DBB0F8E3EF28F0BAB961D5BFBCDF165B354DFC0B54A868140F40032F3C50077675FCFC68282563980C4C569CA8DD955C2FC000703809046C6BBC9DE67510B40A0905EB55ACA674D9BAD560644C94951523A14631611A265AE657DEBAD1759AD05EE8F3138B03FFCE14FE80FC9BBFEF49B3FC1162C184B2595389945356F5A08852C98F595ED1FECF0AE0AF75EFF8FF7661DDBB3F3B3E37BB67DFC0D5CABC436114B2289FDEC4FCF9FDEE4EEE826B3C8935D0B0C154340922788404C398E1EE3117EDD64BEA491175E7A96A22F80B0A4A804105D339B034E5226B1A9767816698824024208488D5A1BA1A0CC5CAA!
2E9594962E582059B04079E1876FBE39FF8DF51BEB79EBF91FAC3F58BFF946!
21F98EF2
F858D6CAA689456F1AD5B83BCF7FB0352EEEA89797F79159AF22F4C2F64024351C4306EBDD3390D9177CF7D9F14D51CE6EB22FE59FBA269B4CB385B8A172E3D53CC11340AE9F90B98191C5EEADBE8F01C8F497EE92D87BD54AB59A015152E4E5270C68F65A2996BE3C66257492D8553AD4CB08751256694AD823DFA66E929AFCE6A46672529A4E15CB12AA7659EBB4330365D537AFBCB223307CBD97B7F76C02729C6A4FE476042BEA06A868A4B825C11F5C80841825BB6AD84440868676084663B99CF2C81900F108438912251B06020C0A5D3307D2E2A253B1D994A4165592B2459C79E09516F26182C4AAFA18CB37D61F7556172BB298954E3DD4A8AC743CFDC78AB3D2B6D6636C096BD259E3C4D940BADBA952ADBAF0CA8EF0F0F507D7BFFAC1DA638B66A5BDBEF31F1F53FEC8E0D3416C8D44BF33E3E2A628574F6864856BB5E14E5060DC905168900B9E5F38745D3FE1E1B9780D3A12DFF1DCB5EEB279464844CD7C8BE6801810658B1FCD69B3E02B329290A06F97E8307632DD0F569DF51B6C138C1A9603481268926C53D97EDFA5B186D08F4F2BECA435468B68615D657DF69DC0F070AF8BAF7EB0FED8A2E3C7577D58F20DE22F9AB60C3271B21F45E42B8C118BFCC9D6645345D0D00E8DB1078CB8053838984EA08C5F130520EE003269E54B67C1487BBB629B4ACD4F9!
120174A552ECCC9880FDEB02B6C40B4D21F388CF358AC0C938A0DA0863B379B16B10119CB4E79F8B1E69C81D9491E534314AE5AF0A666BDD7EC570ECC9A3575D1F145C7C7CEAAC111A2EF517120241374BE699BC25C3D658DC945ADF2EAEADA40CDD055A181C26F7A83215FE6418C84B9873DF6F0F449D3A7102338E2D22411088A2CA9BF4ACA4F96B0742811271E12605A29864E20E8649AD52AB20328EC6409861C5232A24E14B3B9BFBF38D90309D3591515F3AD8BAFEE7EE5D503B3F68CDBB367D1F159CB6A92446EBB6D9464C0118F3F090D00C8A6D6E46A53505C7460B660313320A6FC566AAC50FF2EDEFFC84308BF77DB2928C178F8A51CD8A253B269C7162A24956C6E8E475F3D32BB959B4EA75B65678446C0442A4E80FA8DECA5FCD814B51F9B5F60473C4465FDF19B0B1FBFF2DE7B00B26C192544142935497464F055DDEC909470A910103759A3BC8080046AA23516C1A916E1D7C99C5C2DF36540C2DC1F7DF88549107B293C4BAD001F4CEDAC4C645C28D9E48A72B8AB02219D3AE937183BEE2EF073AB0803CE9251C3E6D6D8C45B89BFDFC8592C3B9012727BE2AE46F5834E7761C185F756BDB2F6C565E31621008FFDCE8A38A7B3F2D3977CE234E4B39090E36FBBB97A3A7EB9178C5454D3E9614B68B9191DE29906430E0702D7FAFDC32F3CB3F2A5D2763A5!
BA02056105159164C6248A4366B6F17832F4C21D17142AC5616B458D422D72!
68D96703
A58DCB217276CD62A248401C9E0B011E3503E9CFFE6E38FFFB1E7C565533F0B51470E0E2648080973AD6EDBC9BD12FFE39B0044F6651E34B2B73A4E83D64A538C84F87657BCE10407829EFDD187E15A53CEB633CFA1AE9C4E912875492A9554F96392C8C6C82C92A04D5033203ABAE9AC3A1B2724602E921036F1365CF3FAF153067C721A54F0D0A0B222D39C3F8EE6126EB5C75AA31D1C1C8C552829F7108E10BBF91F2F726B85D80D9B5AF79A0024CE1298E85425786E6A70D82BBA165ADDFD8F80912967D50C891A40D45470A9FCFD5A5A7EFC91F220533AE5758A5A9D14B31290EF9840CEEBAC36E31A11D54E48FC1E38C346D1D7961F6A443D8191E6E60B48E7633F9BB5CD2FC3453F180B246A65334722B2411F416667400A5CE5A63B9AE8A12121BAD84B707D3BBBCBC6481831321D4022D44CECED6CA60409BADB452A6951FEC8F4D1A2646713A4A829D11D6A13F47AAD244947B1D78EC31E80336A441C3F03C24FDDECA4584A40288F008855A9BC609DF5F1CDD21ABF906E250819BCDF94C06A56AE113EBBD51D92F66994B34CF6A54381F35E0089130463345CCBB5E8AA83A1DE0EE4F79C113A15AA56485849C5FDA985A68279134FDDBA54AA504B140AA534419AA05723B8E8ACE7CF5BAD762C3AEEF8E2D41A5349892DEE8A40326AF8C2F98087599B9592B1D6C8FB!
CAE66D19FEED0424363656D29CC44379088FE4C4481131526E4E6E3524DF090CD468CA338B0D82AC20DBC17C429612C6813CF6F0CA97A74F890010A54421492217A200AC744902A0967BACF24249A5E635BC42AA1E946AF512028244C281E89850B8E7D7D866A0C532C576464DCCD219193C66A9080E2A6C494648E460677388BFCA5F31C890442A58E0A2BCC8CE5A1192E37551AEF33DCB0D72CAEC814371D1826041AD657070309B5A53C2E8A4EE1A778A5A103B97B352C2C256BB145A6F414A6CE194F06B2228B777EA13145089BA99015945BC503261BAE72AC9105D8B052E7F712A9A15E619ACF4A8A9E1314EC508D185E823D54ADD77AA906EFDE020C256EC60ACB4B93989123CABE5BF26D11F3FE51930DFE34B43DEBA64136A2D8DC628184D82B3A1CBC17087158D2B01E4B1871F2746F82C22CD2FB013BB2E192ED290B1CDEC24550B2B73A52D1250A3A5323E011E46A990542222B1B2E84F03B49F1360912BA4C496CF33481D901043A0B27956887E30C1EA1252A25225314206236323D5507B1267C49FE7F6B422CF0099DB975D862203AA5F34ED9668631E5C0B404C322A1A1F128140ECBC246C674530C69DC4B208BBAE434A9E2555B7E8D4CA24C4AD04BD0240887D74F5CDE7752E3AD1444678ACF163E36715169DB2E5F55506AB2B33C4372268E942D483B112!
A595204B8990C8FB83F707152C6E596B28707D1DD20D20C7EBE6E7CB7CBFCC!
33E49B92
4D41468D70553324171CE57B1BC0088A46CEC8330C08C55D88BD852512DE6228D965366C4AB89D9E21274AB4C8220ABD42D2CCC6DEACFB810111BD8B0E35AF90180FFC641A3BBFC926A928CF10673C54ABAC3F841CF31F8CBC2969AE811B86F446DEC742BE45710BBE65E5A984B956DD8D00003124E71B2A0C419734966C02526FB87AD594DC2A5B438C84898C5C53E3A02BD42CFAD2ACBC52D2425264D7755028A3FA1E40A84841F46D514B81E287F3CDE4CD76467832E11538EB3DD835007EACABA861F983BB15D308C58845631591916A14A07E7E192AE6570C8A9E620DE5F7EE8CAFFDFDE92AAAE339F35B01C454946F3A670A12E22C1661284F702E307E6992B7CA461123C340588D0227C22A091257F92749432010CAED2D52356121A4A56A855E9FD0AE55323E74C34058DCAAE149519C9AE29198C75D962A993F89E18DE2F536EBE0FD48A9B544E7E717D212C31889A1C0554AB30674CD58065C8BAE393A5EE7DAEAEADB283F579F9C9F2C040EA1642C0690BD168B596424CC06A4903C4A41133EC82549ED12153262BBCA45D2CE2A60A90A725192F741EBFA043D5C8F7C0BAEDCFC20210C4B8D588197F0333F7C3684CD1A7242AC7CC3AAF3D342150A3C858EA43183913131241294290404D90472E7674401C45936BED15094232F9243233D1DD9C55F09AE864BB51C8!
8EF4AF7C5EECF7146502F22E32975A8B7A4D874D12541167028EB6740D7BB284401D743424489A28ED007AB2549F84BE459493F03C21B3C9E94C52B664A78E45589D2E048ACD61FACD0F7FD48B555E5F275924A1D13138985A9248125AF662B87886F389E23739EFF53A33CF95CF23A431018E9281EAA129C93AF965F97B7BA829195EE61E319235B0AA96254F4AAD55ACA7CED126A462875F0C9857B2E4A2621B516158A42A1BFAF6F272034BD90D43C1209F31BB1B9E3E7CE9846E0559C10FE067603A10920245219A272B1B624915B45DE8F21DF8ABD59CA80501CECF667516BDE7C67D94FB579E78A8AF2E5E45A82D1F815C46E293799444658F89DBE061A81D720B86AE9020DD4556C825489FC685D40C8D494F5593F024EB0D2B7131BCDE400CD761CA2906DF91B7EC54E68B21E5DC57B5BDE4BB274A86B56C6C60CC60C365B95AA966E35E303CF4149EC4D85522A15816474237E1CCFF17496F9D6E615E58313E1529060B4801102626040DCC9B51E7BF9F1E7C0888235B22479AD82CFA420BD83147F2BBB1A3309C992C3401ED1AB29B537332C48CE3A22C6DEBA838E6ED6CA96883D49897F062FAE9830546274B3FED0A2A0BC11AB54E95C923262C9B3EEC73028B1098A05F8FBEC2BBBC165774DDAA9F965AE60A4A83E39B94830060A0DC5025CCBC1584E518B31820!
EF1E5F1D3574E492026E8DEACA50D127812055D66782E55ABDAF1CA6D94BEF!
AD804758
23A8949A45949C98B90F0BE849CA6BB5B95C16B767E655F892D99D7A87EFCF147AB08E4BC4EAD8FA148250DB12A93BA317EA287800CEAB50A56ED41252E2C9EABD24EB9E6388F0FCF43CC4A5E17680CB234141BBD049983803AB2DE936BC477FFCB8F4F5AB92558CD295148B45A0572075DC0284DD2216AA99949D5BAF64E85E2260A944E6DAC3E58C1A6DF940C08E0342B936CEE45FDB68A1589E20526FE34FB63E5A9E347AB5894597F50321C31284892925AD491DCB5C80613B4143E592E01926E7CE567A73CEB5DC707E59DAB4E96AF331A838C4ED99603428EC1586EDE9B2F5BB35804B2FCE5951EC1284FDAB5DC6ED3E9053A243AB85608C7C1A4AEE8D5EAA9418C8DD52B1802EAE99B955CF53A1B14FC6948A484E77756308A8C90EFFD28A6CD1FD4FA4136F058854A29EDA44D92089112C97C42C255E2A20229D69D459E9EAD3F21D6562717E40F7538598CF1C67868E44BB3C10446C21890475F5E8EEA574F575B43025A6A67A93EA47A970A483F0200BD5319D62955EB298DC0D40C01BF105B0C5FB6828BB5EE35AC022EE1A7FD436C45226FF009903A961FFFC8D8053F48B4781C20BF62F7FB9D08391C48920E40BA5D7ECC3835DF97C46E5A977C0E1A09321A1D3AE29147AE9A4D5D5CECE3C37C1F7BF9D197A76F49E0D78B6A09C86DA5BFA4191D2E3BA948AD2F80!
48D01D6A3BB552F4EC5A3DBA1F70A614F9E0A434DB2AC71A2A73C56B494A32F80571353B55E45DFC06DF6A56C40E324FC25A2DD18AA0C8A0F741AD9666414420743DBA0B807838BA075599107F8B842144AD74A772C139AF3CDE64AAF758B326ECA1307702F2CC74E411FAB882F3A2EC96B00E914FA3D2892C244317A5A2B393D5F0B1E45A0B943624E46476242A31198694F0061D50FC50FBF2591616D7A866C6D00763B82618A061208445CBC681F88FA8C8AF56D85934DF138C542517AD2BCA178420A325DD295EC8C9AB35EF35B4BA31D77247F87DE899955BB4ED0AF1A27EF2D0766A0AF98975099F5E51A8553A7527CDCFE915DA586D21F2FF0534DC0C0A4B28493AD6D7519D25CEAA85F0B9383AEF54A3E2D58BD505D9432949888D8C14D3464CE40320C8F41C08028E54C9280190BAF9BECEBE074CC945F9F9F942B470C9E8906D16EAF3AE96A343F4080B0B031088FDD167561E2220D0BB1438B4BDED52159DB8A2F97764907676264B51A3D46A3B69C61440904BA45C203C66914292C469A11AF142125E3266D08C678D9842AC3A9A90D1C60E521A17E51D33F82021F751A130206A76B5ABD20E8418290838D1DADAE3730940E2F38432438325BE2BDF978044B9FB3EF7F2E3CF4C3F44E1173A50334AD474F196A4DD652755904A52BACB0F6A255E437D8284481AA1!
E60730A4CDEC51C9A4CE53448DAD60E417608510901AD245420295A4D4D00E!
875A716B
2492483D07C2A64094747165B775A77CBE87CC3DDC50D45A9FDF8A7E5DB01023399B56A41B4C8E6E00F290BBBBE76393964F5A79484FE1973E2FA1AB7FA4AC3B6CA949AA41C9AB432A41215FCA80B09015AB8F555F48B22B44C9DB079AFB60B5480697093F1DC24A7895DFD845DF29B42AE98821DBA4F1A06BDD874412880F3E99AEE4224993CFF775FDC9CB941F509F9F6F34A2637748AF021087F4BDD5F5BE61885A51EE3C8F1CA23C42690F318458A5F92009F2618654AA430AA1634FE779B40C879EBA4406A0599C1D86E9B85FD99B763EE71E92B113DB35218B8E4D5D366BD1225D1B1BED405BCCAF5B2C01E9558840942E56628434E21E2E2F6ACD87D83BAE0A1D0DD9D4585D6D38B3B7DE77315CCBD706A409403A51FF3256253FB2EB02939AD12BB42C4253A268CFA0F9150684E6E7E80C892D912C504A16B024AC13E7E8C4E9449ABE55599B17007F82E2F8AC0FD2DE3CBFD34FCD70F011131A51EAFC61806DED2BBC799B53C25C2B892E7E0B39E5EA26F3F59217B4169DCBD708419A8E867402E2D470665D354A9430BAF6E12106E41AAFB4288F3046E87C08B0D448918F5AF0AD2D74F906B916D880DCF5B7A54AFB74BD44D408ABE45994A2F91130888CC3F41099B0F3D5B4B8B47FEC5934B6BB77206660C08663D8CB806200BB10CD620B6FB33188AE4522B1EE3C3!
5DFD31940025A7300A44308BDEA0046725638749D59774246E117401E9D8E5A0BAE059742C62320ED3479022F6BFF7ADB370B1001248AA4A476A91A799ECEF28010A95EDFD94E6448C107821B51636F49E82CA922413FC8448D862FA65331F8E107AFBEFAC1AC65CBB66D0BD1F77342DA606CA35254C90041C1479A0A6F924CD5FCEA7662A45BB5B3CED5CDD1CD4BFE452B1A924C8DA0716A70920B39671C1AF6B6B67A88401E9ABE7CFACA53C1D48524507CD52A7A7BD1AAF7227F246D2B61173649593BA2C471EA4CE05AD7774A201B96DDE15A5CEC7CE63449DD198BBE8F6A72169106DADAFFE272FCE37F7C30EB833DB3A6EED1B70D60C4FD0423B7ADADB2B2BF52743472ACB64A345A4D099C11FE8FA4D85556AA9D702D570FAFA2D6D6FCEA6A8D8FD0D3E1E094276C3873E64C57800CE11740A011911175CB2A04A7845EFAE72CD21F2512F423EDDD4AC2D74EF35BCA16E443899662AFBE534F40864F9DF08CC2E68714B1312CD751A981BB42E9123276D9FF94CC3AF6C1ACE3B396BD7573A072A0AD6DA0BFBF9F708085B6CA61183131FBF0E95814BFC3626FA194A8AA39E52C73F488AF43CCAAAE88D618351DE9D972E18EE98C43D70D37008902239ECBA7EF87460AAF69EF49A5DDD64EA9E2B6A257F223AAC65E690B886027E3D8DCB6B6532A49008EC14EB860025C6!
B810437A9941C8C750FA85212C8E3599263D587BE45E5FF976DDB3242B61D5!
BB46DD9B
2B742722B898B0132E6591C466525574C645353CCFDE04E5663A8C5ABF9D835E13BEB0264AE1E07922BF28BAA4DD11A21DAC901AE7527AFA1E18C9B2780F842EC6EFBA73F0AD72A542728FC69F6AAFD96B6F7B6F2473A512271A1E21D72699752360442052AF8D858123CD5F1ECCA271B2154A9E8D476F532286DB7B72529AD21DDDDFEFE8B76AEDAB66DAAAA327740C4418FC3D9A4520C5E2033F8B6626442D48191EE8FEB021C651EB572537272F59D68419389A2D124783B3434801124C4A8516E6E9E8F4E7F74D29A79D750114A3A6F75AA3B3B7B7BEF6528C426444DB3F04A29BE96CE8D50E17B132D09748C1A85CD4696121428FE02758ACAC898B6FBC32E8F91DD8A6CBBDD2BE9855FC60EEA23F552053BF49075DB805DEDCCA96C418BDA2A1E39D93F5BE3C5966AA7DCD5D1D5A3512E3719AAF7A66A041FC1A1C3245415671BBB6EDC700B73775BE31605200F4D5F332FE22E34DD79BB5D7BBBB757716F1BDADCDE76EAAF68D6974EF22869D637813C4B1F4B73827A74A3702C76E5868414DFFC43B34E3F22AC0ED887D88F3835D04FE38CE9A7683522F98D78425199182189B0CE8A74C9FA6817176BC6A65667C7945A7951B221DF909A89B231BBE3A870B0DC2274B9324616BB45B93D8A7E64CDBC0F91246EDF6EEFEDEC6D57F4B684B4487B2179CA053CCD53E5A84D!
E84C806B0DC6EAF570310521908897A028418AF20745E588AE6238573047B2016BEB7F10490C511343B2A7B720ED0C6AB5BCFA65618B4D38A2684C0E70764D6994D7559BF24DD18942748FB1C32CACBE1C78C92C232060C40D79E4D1E9A30EDD55D2DC82FAD63D974E756F2F54DEAB56B4E8C8C1927452059DADA213D39DA003AEA51F041689084302A5138E05D2C8814A1A53DB483E08473F43C209686B1B1881A48D499FF9187B4F53252A14ADCDB7182508852D2E1905F96587522EC98BAA0D15044473D8186A12B6160348ABAF5B58541480782E1FB59F5C0B72D6696F2BDA5D90187B291DF6F2EBD0DA754A691236B4EC9A07643AE520124542AC56B24022190603E50FE652D6E0428E612ECFC63A30C0731D7BEC6F6329C4469058783134CCB72A4923FA4EC24294B04495D462556D5A57E69A1264AA4B3618BA12333B841E63A641A8680C02104F59541463643C03A255B7BBB0939D8ADBBD5408B3AA5E4DD75F239FD009207043E7D7D9B47F67E4A01E40A4507A29FF37BEA024A18D8DDA1692F89116632D7B0431904B3FDB63A78CE5C536111C01894DA0CBA88814358B8868785B74AB8A02729C3D83AA92E5D7F30C00A2F131F6E4095B2D8197C2AB5B5B39236ECB1793D83BD5DAA41AE4A14E2844AAA06A04C55E8B0BFA0175A7CA452B25AE13F40968DC6F472AB4!
31E45A0B9846D4A27BA9635860A5A10E504C22E7CF65AE847D1C483F254206!
E401BD33
D7E2509051EE27204931EF12033025F755750175F91E41F17293D900204E9AC31D0052511BF8F72FEFD403086384BB5682C22584FE3D45AFE2B6144D263C74AC52D97D4FDD8294DE4E735DF8724AE814B43A891605D14167224A49EDD205372B19211CC800F717C2C6860F87220CFD1C53CCC8086D07435E09207A0A299472A976254E2EA08CFBB0AEA8ACC8E3527C95A1CBC19C98199AA9B11C8E17EE9407ED6EAC3ED7EACE80B8ED7F7CFFF4957F0D56B434AB15F7DA6F51DC65C136497AAFBDB7C5AF59AF6C467172FB169B65EC1C44E2A69301833729C794AA23C008C402A5D3C831DEDC36EE3C03CC6FFA6DBBFAF9ABF44A3F79D6FD81FB2C770C3095D864820D722D42A215733BBB30FCFCA6A29C228FA0F23CC3E5F8A38963044D687A4FB150512E040148BD6F94DBA8F970AD8716BFBC725E44E73D159AF2965B943FE05C6A8554A550DD73F1937462A888EDB76FDFEC44A53508A9EB11EF6F69812102C229E51AB9D94FC73517464ED26F1306C69F9BCB052E3A1869C59637C47B3FCF8FCCBD2AD90C60825694BB848944795EBEA98C8098F3C2CBC3AF4487FA843A01C89DDAC0A0C6BDE7EA49EC3237DFC50F8D7FF9A553EADE960B38F094C015BDAC75675574779A55721B406EB7DF56DC4A505052472E8C8C641991A4CE70944A4A590D4583CEA572D026065EE4E6F!
67341B347C6080FB73CE4E2B93D0AB70D54EE4BE8ECE401F8364DA74958E0BA209797257B06D5C6E7D5D6865F391CEAD3E194192F6C2D17021B4DC9ADEE6E0444B69F80CCFB1032C651EF55A342D1F2F96C17658D427D412AB9FD83420BE9286EA10905190829B109A80B491D12BAC0541DA1288D6563ED678C00098F4E4CEEB6DDFD04126B1BC40131BF90AA6CF54A1B732DF2AC4EDB9410BF5E61815C9E23F7182A2E8F6FAC6D4C3D9C7938B4C3C72C6C8D8F6BBCDC554D620FBBE1261BBFD21D40D85462EF3D3AA9D0CE7A2BB4BD687193A42E524948BBBA17D10AB98326A43AA965A7AE2FE1A6B6507B1347EF666C2C86DC8711F6F5F335595F9BDD72FBB02BD766FCE0F78B405808A05080EDCA81CADC413DBBB2AD93E74536F18CC3B5A220C7E01B585C1C1F54FBF72B3D9999A14688BDCA1C78E9B2A1DA31CCCD6D3131B2723CE511652789C3C5E5767BE72D84E15E6D3B9D6C835CD01BF6AADB93F0CD7A9A910227FA84E001EA39D8D82AD11CB1F161B07D7D7D1C0407D26F133BA3C186032D08C4C45CAC5F0C656C83B265CC406E650C3BB54BDE1BC9AF4D415514BC429E6FF0102CC58C119FC33E991D9966A12A1E40AAF6D653F845C945405E3A0520A8B47A5D92B49D9D68087AB56A6582324DD1F2177F6BB7E2767BBB343641ADBF0942622BF157B43191F8B37C6!
07DB63BD944209928E2217FE2412B9730E6B671DFAAE49589188DFB6D60781!
D53C934C
622D9400C3F5D420DB37E4541759767A0A5B8B6D1F2F72B00E24340B602084DC7934644206B4E6925A8E33BEF2111020F38ED54F52628D428E0DB95AADE16E83F56DF1EABA5A9CEC1CA844A54A903B96D76670190BE891C09812166FAFB6C112C57046973AC814A0A07237088C9075BD43DD24121B49523B2665BB0435E729E2CD0581BDF1814944AFF4B2269A4AAD878C96C36E5C3B5C2EC40EED2447C2738912021D2AC7C0BCD467403925E714FAFD6C1AF1262A175EAFF0A6FC6F6C7540EA3A0C14F9CD8F78001481B23C006D42E10B4E9B9B604C9DC8E7B1E4F9678A5AF5FD4913D5B56028883C92C0B3216C75B2C97A2E9BFE262AE552C18CB2F9B5C0988CC06A45441F30EBDDACEDEDBBDB73BD9B4BB1649110C49D1C8AB93683E0BBD089BDDD1D349CC7E8E61A2CDA71812EE551C4AEECF4CDC81A3CE1E996C449C141F581FDF963B40618147BC1145B27E85D9E0200B0A2A8EBFDA7809AE352634D4A71C1A112E992FDF9145B9DD0893CD972D1E3565FA9ABF5E43B8EA54DF6B57E851332628B49DD0089D18012F2DB7E161D2588516CAA31E36B232762072900FCDCEC430108CAA8F45AE5C3B21F44E11D9801D180F003CF5F040478ED52F9229C6631148535EBCC1E01C64292E2F26460E6FECF1F16914EA8A35C6F2F88AD628374F0ABFCBC148D85FAF25495BD4A80D!
6FDFBA759B0AE09B5A14EEFC5233ABB653A92D1D445315098D54122584878D6E629FCDB5208DFE61466C831CB6892221228AE14046AE2506ED36A634DA214E17715ADADA621D1ACC86FA4644ADAB163092E97338F170A350518C38664EAE8FBA21836BC91673208A7B5655676F67A71E486E533DA2602DE76DA9BA3942F1F105B091C05D6B106167203721762239FE443EF6894448BFE8546D2C1473246D0FC211473F9C6D44F28663B62D828B9C705E726357A49B1D721A6B117E2F05456F7C82FE43CF20A1AA566369309B5ADD64B2B0F93764EE2BDDA7879DBA865A13EAEEBC0520B76EB5DFBEC92E710021F7D01AAA3EBB4028F47441155102A547C6F4310933776238FA6CE3C031168150B9486808132B55F88456AE0D823D770E6FD95311159836B5F703C8E5F87CB8567C6D636D2AFF9FF88284C996388BD9905CEDE6EA491A0190952F9DBA4693499D0A54EA80428C24B0CA4D812E076EF6C30505499D65F6CAC1CAFB9131CC59B0D8F898389146698BBB6C347CF08C17961D28E672E988A9933BA1282BDBDAC6487F9B6D6AA28D187128CF2E021088A43C7523FB3F048DC2D120C162CE939F9BEF0A466432F751EE2BC34EE925F47F67118CDBFA5BBDB71537D50ABD96956FB78046A257532322298D1C4C40EA1DEC8B24FF1191101DE459B603DAC754C3D23A0B55FD!
7DB93CCAB22AA63F37B7EFE791FAC14DAEFB7EBB4018232BCCD9F941B5F45F!
3C7ABDF3
91CF18E82450F00AD204C65FCECB97B9CAD6C86EB8112351F39AB46A346648EAF76F91DC6FDE962AF5440A22F12DF4D0120985AC08A02085B0A9C489B913EDD6C76256BF98DCFBD96AD8E9FB8707DBFF0B08FAFB47EEE9B757397620FD0072C6904D512B3BDEA9EB9DA5D1D14B97FA084295313AD0CB9C973CDF15798469048C50530618E89D6EDDBA094BA0896A54A16CFAFD56884E19194B174E32AEFBF5B1EDB103187C2E836003239628C3F98457910F8C74E2AF50F1C01E9BFCB9D829C0C1B5F21A722CB5160031456725267E9EB53150C8137604D69AF3AA5DF3B96BADF15D19B63598F84840E7741F1AB979F33670101DD440A3999248B4D4850437F3B333039109912C87E43E48091FAA888AC1B06799BE5F3191321BA336926C0992B56603FDB1C8ECD0487150767C8361C7D2C4A5594B96C2B58468C17239EF5C6B8E6CB1E70D99EF62DF95517F6DA2F68FA6D96FD3B9B55B3769A56557F86A63F5B7D48A4814A1918334058722A86D60624C2405DF1138FE09081BD444F1B98D267BFEFC1918717FBFFD055BA6A73A676020D621DD60915B6A8D00628A5E9AB864C992CF838472BADCA931FE5C72BD6CB14C26732320A722F969CE41FDED9BB7D8E3FDFBBDDBE85C9B96B8A1996B3D21816FA16768CBA5C26FA238ECBE077C6BE4135BCAFF3921FF54993D006CA23D0!
2B3484751AF09409C8A026B2DE9D9E979D1331267A412905A8B60F932C82C3754CBC23CDD1810F7534DFC34E7E06D2D13C860ECFDFBB7BB5BE8E20060D01214D4BD5469E552B9C86EC3FAE81B81434C2CC3A39A38B20EFB674F9BF8209091159B2D95F6B7C5A6673BA4E70BC5B5E9E5D9A6E8199F672D5D923824840F192DE58D7906B349E6EED6DA2AF3F504234DFA603A87A3D5DEBFC94F40DFBA7F0B5985E6AC636FD24B0391F7D9199C4A0AA4AC62E2103831F6C03502905DCC3698131FC0F16084B0F9D6C4BE61BDE7B285925164BA437C76D150636DFCE56C7374D6D2A5001224845FEA70B258E2BBE24DF561BEAEE74EC8521623FCEAD98500C87B8309B10484E677911507091664423D15C18811AB3E1C2EEE552290BE61D7EA7BB00C7E4041C3B0EC1F9928B268D7BE18B40606EC9D726E537ABC21BBE852716DB9D978293A0B1259B2148C0842C7554BB9B9FC4E6B985B6B81C9D1714DD4BC48AE043020D112103A7710AB671739507112CBFC2AB2B2ADD256CE46E68E707F4E0ECB84F6616195FBB3433F0288E892E2C26089AFF68B1D594C656524FA685AC1B5D20DD9C9C6E2F2788B1098FA09625656A245B81C1ADA616C8C37979B1CDDDD5CD7994E94AD893AB54F41A70C22511992BAF7B14E3992C1D0DB36060763C476AA8F57BEB6C1D8814CE49AB0C3C81D0!
E5B233433FC01F1483CF83ABEBA8D00D0F9ABC8C8262AEE2A9BD2D3F702C85!
554F11A2
1FA131032A3C722D4863ED181A6D15C7EBDDADD13402AE6AEA1CC4E572F0DB21B45DAD8D8260682CEE0122574094924B5D4BC439AD8F7402614E5923B0C8925995C9BE38C18E80881D8DFD96767966EB9A020A632D26E0012ECE420CF3618B389110D772D1F8B501CDAD17135DBC1A1BCFC04C47ECE5CE5380AE1970D9CAC6930765F6CF03E460B4311CB11D2D509956D2223F664383200E7DA42942D9451401821765BB4B603E91BF1DE3EFB5BE88469652543203212D9D4905E0046B2B38B2D43424F5656D6921900522E84763434C43B947F79C7DDB3F55CF91D00791B518BC6CBD134C506C7068B209A188626767D710C4D3CF136A9EF014E8673C7C49F1560C372983852E83FFBE488103EB18F608884341110BA1A223D5D1E5F2D94038810A4C9CA3AB96429CAF8CB426828FDFFFBE6EB27DC65ADADE5C4480043D0D48471E31EDBB48F03625FD4241E1C263D4EC9C4E18C3DA2767C201FDA1F7F3EEC07D1FE3C13814642D1D4B42F383898EEC1FBF635355DCB4E4F6E48161AB2CB8D9AA1E8250032C32750A8ED093DDC6076C8EB3A7A878098AF236A9D8A6C62009AC40778177FD6D4241E95C1260E45ECD57F6934237CE601B1FC6CC4BFF4C989F6E03B113062830B0B2322AE15465CBB56782D785F61F035A77479B63C303BBBA158A3495D7892800842ADD0D3D35070!
CE10FFE5645FD7FCD6649363989B333B02DC0A61C3EBE0E0A67D3638FBF67DDF1419C325F28B4046942BC351E99F0FFD3FE3B157CB13FB2A239B180E661804065618E184A8552D646797170B9A44EE5A0424B3A721795D41F9E5EBBEF3D7B59EAB908545393735D1FBAF15165E8B8828C51A0B47C5181669099E56B8AF895AC35F3BAE2353C4AFEDB729FE810A87E626481AD8AE8CDD771338CE96128E0830024200242F3B592877022343EF64657D9295052041822634BBE05C41F6D1EB6EAE45AD7BAB1DC3A09160BC9D7D34A2B4948E0483C268B9161C1CCB5921206CAA77E2AF03F92715FFF2DE07F1F23964F407D83DD0145B68670403092ED41223068B018C64176B029700C692AC448D30A4C9ECB96AC82F28375F97B9AECBDF5B2F0B739BD7D454A8050682B1E0D9D2BBB415A1C50264D7E0AAD7D87F335D78F2644413CDB04DFC9728FA7E1D9FAD8CB4876A36A9C472601B7CAB3F12A288B02309A6634A40AE260B57C18810B86421124956A2205C1284D0AB79456F373498DC5CCFE59F436F353F805CEB5AE9DD5200797601EC2EF1426818410C4E61E1B49385D30AC148DFFF9F8F5F8C4B0FAAC896FCC4271C07820975FC91FB82454AE82FC3DBB58510BB035CEB6A71B64533B464217064656A8446A1A7C39897B3CEA161EF0D00494E718B723B8578078DD16717!
3C7B77C182D205A5B088528682D935FAF29311FB2A6D09F1FF4748DFAFB994!
5D28C3E1
DBE65814E26348ED2C68D9D5CEFF3034525E0046B22D42DC276004404285C69ECC50A339E09C4343B5DB1700229345B9054452D8028CBB60E5EE820B84A574040CF675F0AC93FB6886E7C166FD5705FF4B443CE8632304D2C6521544D237CC4804795521A1816BC51B048B25DD32A439BBF0247C2B3313623F7CD862CE2F307725DF58975CCF1809008EC208C6C182BB00423870BF7BF76E69A98808AA2B2D3D19C1268272FBFE8F2A9F389281BE8923C316C751C9EB91186224988DFE1A5B15924B17461811B50CA10444089C064296906B05099982A5217F6F43D7F51BEB0A5AABDDDC7CDD8A8299CC4107A4BEE0026CC1B0DD657898464E9E2C0C8E1C2E7CFF4F421F1EFCC8F7E48AC52E4D6236DD8FEC27460A29F0302A0A0913B956B643795EA8A5381E8C4C6362A71FB412320F1B0988990391819173C111A0E102605CB8504A383EBCB0E0C208249C92936408244D48F103957DFF3AC8FE4BF1D8F207E703455D5B5F5F25855FEE5B1C86A230A2A3A1EBAA994EBD1987A217669148342290F273050DE6BD37D69D031099FB8DA2E0521A317CE90218F9905122B2729745B0D2889B85FB5876DCB78FD73F9195FF9E7BF53D48D68350C8AF6278E741A52995D87D95FB380ED207DD99D8B3BBAEC60B43966CA390B8108DD58C2C1F1148F6DE82ECCBA61B01C9AD10BB9BDBB!
A6BB628F56C44040D9EEE04C4AE782A16F645B2539FE2299B89FF9E3D5034F6F53D5049F6B551EB012083D4011192D8C8BEFE265E20913C22B478D40603C865026244F59BB81048B2BE9DA11102358999C6AB7B0DD90DC4088B5A378ACE9632A99F7DF6D988D2BB8C0909A3A8D45EF31406130D91F65EF7976BA99FEDEAFB8570363C89447331BC5E1F8CE48577F0BEC8FE360212CC705C13FF3480345C35675ED238916B2D4466FF76A946B82824FA18AF1AC8B5E6B732206E3702A695B26C18F1EC02107281E3289500881ABBD580739301A1F2B7D276B6E617C7DCD7F7AF32BEBDC12275100034759191BC0D4243973B6063A490FB1555491DE90D4EE64C638FD32541438CCC58B814E157937838D4D855E0D0B5F7C617EB92CF1110E708AA4AC8B31694DAD4215D401118B291308D906BB1521EC7B15F3C09F52F4BAE5FAED76DF9BC92FA0ED654A34940EF100BFDC50EE4EEE338506A88780AAF1901E472E625C1221090854B961290B8CCC4C382D17CCEA1CB7463DDBAE46459BEEF8DFC695C22DCB32EF06CB8A0D496444A2314A514AD8209089BE160AC4CFC37AAC70743967DD685F7E634721C1E34A4687EF6015370A13E06AE652BBD0BED8C3434181B00C42808C234CE480F8A469F4CE16A5741BC39F946C1BA73D5B25637D7645653314E287CD165320484AB9D0A9!
752149085C1E45B1468DA2A45FF9A98FB8B19BDEF973A9111732D84043868F!
02C0EEAF
79101078044563615168EE88C3890EC0EA7F2C35F0A1D8251C37E6A6F2134122720BD5BE42B1A1C4CAE05E7F2ABDD646EAE056721F4081042E990270F866801772F80A1FFA5ED5AF03E7BD7881B9547B9BF2A869F37B923E7805847CBFB5950124B2058640FBE49F91640AE053308D74452B4A14E4663760FFD648C20D06F22662DDCA8115235993E82656F5176BC897EE426DF5326BB917F96C72CCAEB4C1E1246070F5D04451DC1A0D0B1822FEC139B4630F4EBAAEEFBE5025E9CA0041D3472186188DD67772600E19D69210F5E6C53E8301A8D3D702CDC177EF2C9C2255900F22680745C4D0E70B2185CCF19AAEB7D5D65F33F3DCB1C0830EE5E605904DEC50217B62E9452C1A5B6856172051B314DFB067F2D7FFF73DEEF1BEE80E19D237AEB7DBC15D5D35A1BDC3431F21AA383B7A7C137098E60EC300A3EC61E4130062E24DF3A4940E05AA1C5F99B9C2CA6D6737BF79EF075F5747DF22CE138F96C2979D6DDBBA267914E08CDDD91E9A490E3D8C7E6299A6273FF6F9523CF24B995FB86670886A70AD8D09B2245604CF2B4F3667044B153A81125A240BF8D48E1F7E4B74BA38537334520C6AED675C977AADD5CE7BB3E39EDD98867CF9E7DF62E558CA5AC2A612611F1702485D77862B413128964FF7FAAB6F8ABB9681AF8A400D7B21D113F4EC136B7B2BF5068CCCEEC10!
7C044D0FB91689FDE4C6682115403A8CF9014E46736B72F2DE3B6EAEB21B4FA2DB7F1669FD6C292B7C9FB50B9D3FDE1D51A814EE63920F6EA21923FCD5817FBFAD1227C2C8ADC44C115C384C091F321B3FADAFD91126A04471CAECC84C0410C42D56A2646DCC14A235A13EA1C6E480F44BA6D682BD7BAB65F900320D118BEA93BB17982D78D65EFA5EA0B28BAAFB5256594788AEC534DF44F1A6EFDFACB66CFA8884B20BED484602D9C76928B4259060FBC494D1097E95184A8CF47C42254AD612BAD4FFF018E491B7D3853BF97B0DC926D75659EB8AB31188BC28189FE552BFC0EB5E9E56D033DE2D0590B311D32222A67195EC639A67A570E4FF610E05457A243E5968CF115C0EFB827942B13DB141E2E01282AF851A0F77088902D46D146832286BE10C00C9CC3C8CCE6A53BA603A6730ECBD236B9505384C230C182CE9C3868409E56EA94D2F88070C46E134D101602CA555FEBB02A15CCA0A2A1B001B193CC107DB0F104B2FC3110D1AC9F4310A1B054D66A8934073D8590B3FA77F0FF3C418C1D85004D73AD7D5B5D7E4D92AFB624561E1D988B3627F4EF595D8E3F239946B6C0EA5900F7FDFB0058B9ACFFD9738FAC45630B2491F9C200A5CD44830FF22AA5178A21FE16EFB68663D3836F25AB64F223A114113DAE344B556D60CAE9131D08839B9E192E953872E838118!
7972DA3E7BA9C9ABCE6B62DD663B32DC6CD18ACF07F3397F24F8DC074E40FD!
8A4C0807
9B62267135F110CE73EBF0B990A61126FE112AEF821B7DAE040248A610DAC1802CF97649345CCBE7708F312F39DE72FD6D4383C9207395057C7196D7CCD3C40E33A2D036636A73021B10FC2D76EE829D176313F454DAFF7CC6A7CF3E156FABB0FAC4A92BDB598FE161DABE841BAF7E9A86DF421377C196A52812AFA0B4123A7A18230BB3C00FFD4CA7A52BD9E14BF3B9BD97CDD7EB5D65AE4527BF9F760D4BF0B4C2EFAF7D1FFC7DF0BEEF1F3836E2B7B3E9F8CA7FB67FDD2DE6DAE7E06C78446BE315E803663F50EC04226E4D4159593D3D898853A1C69E69C4C8C2193E426A74E618C1D2258F6F34271BCA2F9BEB5D5364F3E2ABF21CE21D1C1CD2B3E38B8BCBCB8BAF161B9D8CF4C3CB870F1F663F2D98983863E9D2A5ACF0249B06638F6C75F2EC34D49BAF3FBB04F7F75EC7265D9A80FBB34B4E621B9996D9C9B30BB34E662DF97CE9129ACF616FF8FCF32567CF7EF2FA92773EA1674B3FFFFC9DCFB16B69E2E79FA762214BFDFCF5251752772CF944D39388E81B2AF46451465C480931FAF0985027074303C05C2DBF5CE55CEF3977FD6B739E9EF2D314761BBF7CF9F8E5E3E97726D92F4D4E89E2BF8EEBE9B1658BA3B3734E7585499E97176F708807F03C835C5E5050E45C975DBBF5B4F357A7E76DDF3EEFAB83A70F1D9CB7FAF47CB71B376EB8067CD1FA7681C16C315!
778E5E5D41539E7B0DF803CE4EC5C5694F3D7D5A74FAFFEEAC0ECD55E8D97C36B8F7A7B1DADAAAAF2AAF2FAEAF4E90DAB2BB64E3E3AD9DB2B7C765C5CDC3FDE79FD59014034F44BD740F1EDC9931B8991C33EA116735EBCC5DC55FCE55193CC599647BFB418DDD313483F094D3F491AC756B0DD78BE9BDB0771BBE97730A371EFD1C4D14F37D2AD877EC0FA556357D0AAB3EBDFFCC781F56F7EF5CADA57E65D589BF6A69783F94CC199EC86E40EA70EA325283535957F7807FB39CD38FCC137DF79FD9D77DE01454BB350D17E026E4F8A64C3BEFF7EDAF7B4E2B42FF93C10E2EE89CE147C96B0DF360723D189570E0B41F179664B79D7E5C6EB4753EA274C99E3E1E9E13B65FC4BEE53DCC7BBFB4679F87ABA79CE97CD9739BBCEF77475756E75CE49961B0C8686068BC568B4189D8AD11F7438599C2CC5D90E0D0E0EC54EC5D9EFBDB935F595031FCC1E1AFAEACD03AF87BFF98F8B43A9D13D993D33A2AF5C99B1D4A7273AF0127DD458CCD70DE50DF1B541C6212188FD3E30B7DAF8035F7DE575C00B56F515D901EFAAAD5BAB2A56AF5EFFF71D9AC44CA40E217306809D64AE957805E5B059EE606C3499C3271F2DABDA41C7FED5DD1FCCDECD7E88F403DADA7D9131F1C17AEC5ABBFEC0FAB5F483D0B377FF3D2E905B50E0B0ED8E1356383804D5060D05D56A6AA33B044DB42!
6FA9293311089D84983D20E7FFF4ADCDF67C7A5E21B0377075EA4DF387D73C!
78E3753D
F7C27F5CD1DC454F49BD19A37DFD4BCC2164DEAE789EF80C1D4CFDF498572A09E773E59181D9D8AAFCD1C8A5E9A452C11109FC4D0A0DDE5F0DBF0EB79E1DEDE8E299EF0DC9CEA1327F2735A9D5B5BF3F38B0A0C38FE796668FF6A716DF1554B7931FDFF04993D3D3D3E3E577CAE5CB9423FA94EBF19BF71C646FAB5F5190B978476F824666A348989C2D2C33E89784BF498D0A599993E1B7D1267CC1833E6936933C00B7BEFC62B4B375EC1C712372E1D9308DB98483F779CD911DAD151DC413F694CBFEEDE31D43114D4119F171F9F9EEE80F5577979E1A9899AE86863F48C8F1067A66D440C4B4D4CBD78B1D65C9E1D7EF9FAECF5293FCD99F3D3F89F48DACB17EF67C67EB8723976B8FF044FA357E877CF3D3C53648ECE65B0BA0AB9D96CCE8355E56D95D7D5D555799183141BE123F1C5D970B7F8F878733973987876B7D45EAEAAA82B732E7374A6AFA0ADB28AAA8AB28A0A3CD95E5637B72C4726DBE2E939C53DCAD3B98E7ED8D6D179FBEA835FAD5DBB7AEEF6B9DB478FDE8EFBFAD457A233E312B3889169DF260AA9A99AD4B88BC5E6ECCB7F3F6A5A3FE1FDF75398BDFFBEC74F84897E14963660EFD38A7E4276C21BB8EF7A63F4E823AB0FAEFEEAA097B7F781702C64F0686FEF8370E48393B1AC263B7D7AF4F6D1A7576F66CF0E1ED97CE4C8C18347BCBD276FDE4C3F!
5A3F7AF3E8D11B36B31FAFF7DEECBD9E1EBC8FD2EF9B7B796FDD1ABE792B44C18ED65CEFB56B3F988DD78F1CF15AEF7D64F211EFF5B3D1A56B529101100BB25285CFA3113F2ED69AB22F41E9EBE98B77ED4A49D935FAB55DBB264C002A8F39EF4F78FF356CBEF67ECAFBAF01E284F7771198B9BBE68E5EBD79C3666F6F04C5F0F0C6D9B3C369095FEF7514AB706F4245BFBDEE7DE48837FDB4F1118C1EE3F3A6F7F38DC96CF13E4ABB26D30A3B271FC1EAA897F7EA835BAB266FF6DA5AB5A162C3862AAFF5FF8FAC2B0A6DDB8AA20922C66B22B90CC7AAFD35E61A020D8162236A08D82F0C0CA52E7171C94C4B1CDA115308A460F9A30AD548C158A56E044A14089506EE0CA68A4A31C561032F5D9B417FF2D3FC3664E0E4AF9F05F7CFEC5C397FBB929EA3A727BD7B9FEE3DE79A90DCA85BC52454CABD9AB011BB36203385770043F2C740B62FB9915C21998C7FAA09EBB1BEBA07804D9D014DE343583C4BD1968A4DD9FDA321040F833915B33D5CC6D5B3B3543C99017826291CE1A749AA1B1DF75A0F5F539BB19487E14700914D3C05A87EE695E2CD0D8BEF424E726D2F9A73B9420E3CDB06BEC5BD6BC94C66F8703AA312BF675E41DEB3782C3E129BFA3D11CF65DEE577F3576EE67323ED7C26F32255136EF5AB7C335006EC0270290822F49B92C8E54864023F830783C1A0!
DFFF3A12DCF083BFE8BF1428379E08219061295D5C1F2BDE3A2D3E2A8E158B!
A7A7A7EB
EBC084878F86185A4CA78BE95F1125A3E962314D238A0F713A5A5ABEFEF2FACB1BAB82B0BAA4284F4CE589A65C174CC1F471DBF7EF7FDBBBAF9882AA2A9AAE547C3E2AC25D998383719AA169F0C9A80AD792529BB91C38E5F8E3CD02BD91426EF3452D1493760FB114E7786A1F1DF58F6247FDBE07B3F0847EA22A7A45A2A96274B46A2724C9712469CA96627D60AF3DB5F9D59E92B04DD953537DF858AD1672FAD29EE70E4E027B4894E813F84DB8DE2707A94A50A72FD98D06E12F1098203845EA8119DB8576BEFD7F3924F46D1F927C3C3C2CDC59CCEF1E5F5924F8452E83BB6D47AEAD3F4A97FE1D1DFD676565E5C18365700100F76734BF41C6C64E6F9D22DF02184E4F4FBFA112F1178715D3215F16DF2FCE3C2D10003F2D14B0CF5053289C0C0FEAA02B4F4F66323384D58BDE5D3320850C952A471F9AF754B0FDE2C91BFAC396E969AA307FE70EC0F8128E0CFA32977E997E334D9D973C7C1E89C3D3BE7E75DEBDC31B592CC09036DE48EA05A5575D42DE09402F30963097E4EEF8DDF157E3F3F39354892872EDDA0415F2B9100C5EB8B0E1F72D9942AF04EE7D984E87E03CA5DE72495816209F4D6A01C5374C73D55C0224EB8A690A04D1680445C57D00EB5208DE535285510CA5F1CF9E3D5B59FD4110BC41A552AFA4974AA6F9C147C9D84F482A7C3EF383A9AB6AEFF!
3E710A675DC9ED3E91C7FC4D7F68B6448266737AE369BAD66B3B9333B784B683B18FC786F6D6D616D6161616DED2D6480E31E7A0783E7B83A3BBBB3B3D30CB75A56D8B200F0862C8B3D002B10F6C0E0382A6C6EE0685916D558B77803E318CF33AAE82E76A8B43B557797F93A76F86AE77147AE1CE8598EDBC806FD5C8533741983EB0C21A1C91CE3C2812C3D95D33111D30D5C96AB55C7E9E9724FEC54DB37AF2C6692239BEDE46EE3AF16D901BD604C77C7638DC1B9DC1B74BD1374ED0C884BBAE59D70B31C0622839CE6383407BADBAB814210021DBEC5C0323CB35A56D3DA024940234645D9CFAD623C8C826DD0B4D341571DF00CC475650351AC693AD425DEE00CC3A8330ED18D0964DD601AABF882B4426C4E9BC3A7256FB98E4B0178B591877BE13B7B2699FBF3FB666BB8BC98043336BBA47017D4D11C0ACEBBCFC98A9D6E970AA887B3612B4BFAF2862B3A554AEB9C2171B8D0E94016C17DE0382C765D76EBDE0B60BC864E32857926E1C7BABC5577C956F98091BA9AA2AABACA285720F2AC6B4C65ACC28B6EDD8D46798E31ADA79AC65C85E30C19D021EA2EC0C779FCF82A90373712CF251BD52D9EB932ACCF66B92C6E60A0BB70B7BC7139E0299DC5DE85EEDDB027D970132BC271D63E543B90E1B3A20A4B7AD84451930DC66322D5AD47C1FBB46110A3E1783066F!
0EACB37C3650E232D0D7E02C378805B341152A37A28B1872421011C2376AD4!
921902D6
02E010BB79962F8E6B88AA11FE8A25EAAA9BA1272444712EDC6A7E34C0AB95652EA749045C82C18D94086E3077B07B27839DDC9DBB7EF22DAE727C7C75FCD47B2012294C8C42CAE4702601C7F30E0E70C4D010DA8885FF5B3622A8AC9E0D3DBDBFBDB5A85F397B90DCFB7296E5A68CB65D861212760589A72201B8020910241BD0EBEF66FF87CDFC98AE95B12BCAF536665CE5C9A5B3291A350AAC505C06691D989498E0570EFE5F26C60831958765516371B30C47653EDBFFF201447EE0E66A7DC3D21C51A12DCAF53DFE2B7F8D650AC568B0297B7109F708716798756AF56F7F6A2247B893AE3BF69FBFBFBA428DCE01BBF0F77F262FC3C442C8B72ABBA0700AD308145989ECA0866BAE530F9016F3159D70DD755F7DCA8AC8909646CC870C0618E53953C16B2919FD80DBC33904F7217F93ED284FCEEA7FF041800DC233D536C32B8830000000049454E44AE426082');
+
+insert into auctionImage (imageId, auction_id, data) values (2, 62748261, '89504E470D0A1A0A0000000D4948445200000082000000DF08030000000DCDFBE60000000467414D410000AFC837058AE90000001974455874536F6674776172650041646F626520496D616765526561647971C9653C00000300504C5445925131A9B3AEFFFCD8EFC872C4E5FFB6DBFED1CCB45E7788928B6DFFFFF5423A2F72694FA9CAE7BCE3FF474336D3D7CC859BA6C9B88FFFFFFE98A9A98A744D2B2823FFFFED3147547A98A5AAC5D9DCB055FFFBCA393632D7C591506879A9956CE7BB69312C2898B9D6B9D5ECA4BBCD585444BBDCF56C5033E4B756302A24DCB767758C9688A9C586979BF9DA99C3DFFE74858A33302B675B45AE8D53FEE7A8A8704B79949C38332BB4A571FCEAB899B5CC8BA3AAFEEAC8FBD888FFF6B9DBBA76F1DCC76A8089FFFFE4E8C98387A4BA67777A799AB697ABB4F8DDA595A39CB4D6F5998355534A37C4DEF5302A19474743E9D8A6FFE4986B8795A6A79DDFC376C3DAE9B3CEE6FBEED4FEDBBB7975646A8AA4877D65989784B3C9DAEDD599BCC8C758533A3B382BEAE7D6A9A58A425B6D7D8379B5DBF5B8AA85B9AC97263946C5BEA5CDB676CCE6FEBAC2BAE4CD96E4DBBAEBE5CA727B7AC8936A878B8345412D565A51BBB59B33302393AEC!
4C7AB77FFF4A9D9E2DA949B97BBD7F5504C40F6CF8089958AC8A764AED4F538332245545855452AA49B877B6438DAAD64DBEAE7EDD38CADC4CE718FA7B6E3FF646A657EA0ABC5E4F6CA9954E2B78CCDECFF875841B5D7FDAFD2ECF4C9A8393F39D4E9FC2B3334A0C2DB4A4F49C5EBFF9EB3BABCB689E9EDE46A736AECF3E7B68839CFB566BCD7FD2A3029F5CC93CFE1E5EFE4B75C615CA1C4E5E0CCA651421AE9FEFDF6F5E1172E3A8FB3CA66441DBDD2DC3E3822FAD1B1C5D5F47DA2C291B3D3ADCEF0C8DFFEEEE2AA7F8E93BA9F59F4F6EE392C2BE1D0B7DAF4FFCDE5F4C67956434D53FEF6DFBBE3F6FBEFE36080935B4F28B4CFF1C9DEF6939082F6FEF6FCF6ECDDB0747C908D3A2C1E6F9199CE9F7E5E6F769CBCDF32382EF2FFFE2C2422A0B8A9342C2C8DAECE4B4E372A2C2DACB18AA2603EC3D7FCA3BEDF736E60AFB29A34392333242B423D3BBADFFFBEDFFFBADBFFBADBFBB9DFFBBEDFF9BEDBFFBEDBF9F9FBEE7093AD1C1C1822201AB07D5DD0ECF8E79675F3FBE57290AFC2D3ECA2A07B844427C4D1C9F7F7F3E8C16182A0BFBADEFF31F2450A000051D74944415478DA8CBC095C5367DA361EE0B00512911D0960580D1043221201850104641305C4028AA4222AE2C2188C1B68C5AD6ED8566806D48E53A415EA542B53C1D2C16F3EB55AFD8D4B91D722B695DA1!
036C7DFD7F7F759DBBFE67FDDCF09D699B7F37EEF012190E43CD7B997EBBEE!
EFB39284
88E484876F2AA56984C83D623EC308D0CBFFCB0663FF34F988C46936998FD968E21F3617E60CDBFDE7AC8C4FFD2DA441F26EBF1C3FCE3F82F8687D83946AA53530595959509070061D024B21E19A4837DB51EB12EC3078130B1AFD62338B96968787818BFE68F21F6513F544FDFACD9EBCBEA8719A4FAF175FFE978E54786C0BA7E386063AA20A23239210A108C83227C0C9AC68F7F7D3BBB3C53FD4B238C1FF5FFE5C3FA9FAFFCE5895E7D0C9CBC31468FA70A96552624472DAE360E0D0DF200E865F5D6D6BF8101C7303308FFDCBF3C6F5EBDFEBF0030FDFAD8F412060F617024783F592121D9D3ABFA717DFDBFAE6BFA1718CCCBC3080A3A152287DCF5AFC7E02BDF5F85C0AFFFAB81E1537C1DB42E7B0C089511C911A95E0163F5E9F565D683E617F0AFB436BD02DB0CC1641AE18D35C8DCF64FEB32C3102EC0FB97AB1E5FFDA5A38D7884338C6479C5221C93E58BBD02468787F8357FB5192DF34F20281EC7CFC2103008A6C1718C83F4038B657AE695EBFEF5D1E078B4310883229122508E58A83C7E2EB0FAF1307E37F2D26CFFFC7AD32BBF0404D1D0A06808E12BB2B61699AC45FC650F8A8CF578CC632014A6DF3CFE058231787F84605972D72FFB8F673DAE3621274DFFCD61FDEA893893694824E28D0E2883CC120066CD1E1F1CFC6FCFF42B84C1C1C7FBC304553D2E!
1F9EDB5F1D0C0826D1BF41FECF57C0D573E938070B48138745E97D22CEBA1EB8387666EBFF29046BD1E8FE58C1CE65BF7C78FC787EF0A8F1DFBE7CDC21E327AEE70639A371983C912E028571654062322A8CE90063BEBAC1FF010490A1312B30565095F6A645586C7EB0021086FE5F10F8EF22307519671A4E1FE1B8618EE38C2346A368B85AA138369CCE0DBE0AF6FF610511F14297A0D562823CEC78C0E151E3F0FFEB7DE3DC65B4361AD3878D266EB861B8AC33DD18CC81B10214C1F9D58AB1612A24FF530883A291E0C50982CA5F9624271C0FC81A1DFC77A1F02A043AB71187634AE9D34E2EBDD0F77CF88170AE3AF85883ADED8B9442FF0A56CBFE07078360A258E8020497E45BC7173F1E53C0B5BFAE33F80A8DBC8280F9C17AD068ECB0F5E7AADF395FEA18FCA2941B3556734F6D031E5F2DCC5700C2E0AB91FCEB0F2FB10D1AD94F944F1CF1C2D6D595B7D2BE5E30A65098460E8E8C67B509C55B645ED2C8DECC175023AD20B21EE2027D632E7015B37DF3AF6F2CAD0EE646B80309E7FEE679F54B05576F045F588BC64F653E98F17817B173100C9CE8A03130426071FCC4F6AF97FCE1C249A3F54191C8387870F0E0C17A13074B59BF8440843EC24A39DE8E4C1A345E08EC89A9503C9EED3BDB2B6776D668F0E0B103B6C737166E1CAD1EA69CE4AC4D83BF0161908F!
123C2024838307AD0F8E6E4C10AC76AA4CFB7A7FD6D8498E2355426FB51619!
115546D1
3FA7D608DEC1DE0D08438AC09EC00B8A8AF0D214DF030187B974EED8015FCF52A72C147DCE8482C712E39F11987EB5027B8679E2E0480CAC10E19456773CBF4281C01E5510545CEAB0821BC6B95ED68397FE1934B2EFD617027D038F550342D66C5F2F2E9813890E24FC74C0373F98339A882E4D83AFC42F8B09A3D901E398E8A7836068C4426A446A58C2712F912220EB9D2C050EA34231CA2982DF79ECB8C3F86B411A277E066150C4C5F8068E95BDF3C2D731CBF7AA6238DDFA9D42DBFC73BEE78DD63B0000E2E75F13805634BE7239E3804460479788D9C939671DB9D13A4FAFC759C1C159F8A8CE1AADCE4F4919364318E48B07E35D3CC2551A2B626CFDCFDF2F2B2CDD181053BAB12DC5BFDED6372638C5B7E36E61A7E8D56C329AC6F888E63118C7411099D2458D7AA50AE4114EB651810DDC615B8F525B5F5F5B5F5B1CF85E7AD54B61E46360648477A6B5359FAEC6C151CE3FA7D3BF6D474C7853707078CC97F7DB76DCAFF30F0E08F7773CBFC364E4CAC606CD0B8F99E873C8384691C0C703E29D4281A52F8A75AA606B44976D945770D995AB674A0B9F1616DAAE5CE97BE0C993A7577D631E2B8CF5A24144A9482462D7806CA3B388AA535EC4740C1E148D8860B5C320562337C465057365CC4943C3C1C10A11119D5131AA500C716326C59851C191251ED3C55B1FD!
C71CC5AA1A836E2B4A38060915C59199B5F7D25D8B734E6BB2FB3B28EAF5C19B5202B78B4C9F745D64905C7A597898E612D059DA31EC9C6718AC7DCC694A6614E74B06C3438AB024184304E7FCCD1C2D6833B449C312BEBB011FCC5052B82B38062746CF8247712F08D8A8A8A6A0587627EB09E43C40D0D9B148B5305B9035B2DCE9D1B3ED6501AF5E98551EE9DC0952B9DFE90257AA7DE76F6619085911B690B0F6F72745470D5C3102B3B1CD30302F21D1B4824588BB8F4FCFCFCACEA86C70AFC36207898E542673E1EA78B50C9F07D4156757EF568FA9701431CB723BD7A71FE75C5F041280BD19701DCE374CEF838F0B82077BDCD1FB79CAB56A417FA8F9E348E64C578AC74AA184525BEEF780119E2186E6BFBA4D0B6D4F6457E16656AC7D5D2525FDFABFEC322785454B6B1D0173F16E6371596228C3AD22118EE239C7C7D7DDB06D3AB0B7DF12C1F5B5787ACFDAFE2D7BEFB7F0A06070E3A1652C03DEDACD8EF22D85D54BE6ECB922F8D571A821548EFC3810481C3159A0E672916DCF5B5F5DFB1C37AC7DD420FDF8D28E8C7D21D0B577AA4E6577307EB712D23014D292B3D66C3106DBEA5E16D659C6807677DB71086DCB10341B938A6F44CE9C626C7B6B6ABA523F5A21DE74BCF34FAEEAF28131DB4367E195E5ADAB1E3F163AFE3821B2A3F1F9BD59F2AAC8F959521A!
3157084FC3AB94BF4B87A8197AF6F2767CD71A35901511EA51B0F8F5607BF1!
3EE51FA5
3D6A8F1202E65709803640FAFC30BB266DB8673C40F9C49A188F1D8B91F6950CD1D5E1075C637A0A2E2E498FFD59365D6239CA787FE4C44FE3198705811E06BDBC9E1FD6865F6CC98586EF1E998F5C12B22060156386C146181D1C38B4B4BFD2BAAB993F5A359150109674A9B5013B366AF2C3DF76985F58E8307AD45C3A3594D2B3D1667656DB4DD9895053F89EA4DC315811E97022B068DC35C5680E719DB4FB31E8F5DC84FE9E4C026B377B67A34E6941D4C1F341E56D8DA3E568C5D471F61E73A63E2C4D59F0E8948791E04EDC18A1760A983A6AC050756DA5E783C8AD4E182AB2B62769EC9091E15711B3D769E7B5C2D121D24675567ED5FB9D3EB5C604F78C568B5C8388440AF3E8C570472F52285E2F14F9E67AE5EBFF09DA27AF43027AA575438F51CEF59B932767404A70CB0B51D321AB300C1D5753A205423EF407D074760D846A7C388B583A6EB8B4B3D9CFE305A06A50CEB28AA6D1FECF482F04F05842C23D8E52031F6E1FDB0C2C69ED805081F64DD308AFE851882007EF84EF1E9D33309D72B2A2ECC760C06378C5D78D1F3D3625FC4D208573DFAA5EDD5619191A84935DD75D37BABABE99CC45B5CA07EA5D3753CB01ECC3AEEE111F307144C585C641ABBE0F4C063A36884ACF05316E2805E8217ED5F79C9E952E9F5EBC1AC9301FB8C5E8FF1F008E40E8E0C8D!
8D7DDAB5D2F6A1D7C3D9A54D57468C63272FA0A6FD21B0B4B1D4ABCC388A5840491E85155419D3FD608541B3152E2016E4152672F4774E2B71352440000FC53355BF32E59835475608E62B17AE3B1856283DE3E1F4370EB5034A6508F44C56B85276D07A48B120ECCC4EDBABB6A52BCF5E1119C71415293D8BFF706163E94A5F140485ADAF4264A49ED2F5AB8CB7C90A23ACBA0C561CF790385D807C39287A9CB2F292FFE151489B835058C38AD9FA95B30181AC306A1C34F185332B70A54744C4198F988A91F4418A276B2332A23450340208C10BEE34FAA66E8C7951EA7F45641A527075507717BE9BBD72656140D64FB6B6F51CB3C2DAD7A66D7A6F0920302163BC709C7801340E2BBC38E3B1B14244740A695B7621F6CC257FD1E0773C0423D33F43C62B812B2F7DFAA5EF99D2402ED8C8D00E2A3A90111C19E40A9232E19D778E5DB9EA4F2F567029B68E1CF8F689C7CAA8BF9DF3B58528500082BBF7D44D1BC81104C1A4B8BE9132620CFEB7362239EE1CE6C8E324F883C31A6D3B4DA2C70C02699B51B4B964854B3F5D7F587AC636FF3007E3211E60058270D07ACC187CE74C427585A2BA6D078C00B2AFB3F51AC1AB46406FB17FB3F57DAC18CD4238CEB4F49EB3813262900A2A201800C1C82E3CBFF48C6F3EAA13CD884012BE2B9D3811F75DAA4769C028099B60C2B1!
00103EFCF4FA6C8F339E0BAA47AD07EB19849D8117AC4DF5278D016167AEFE!
A4387952
313C3A3434167CB8CEB78943E51E6EE84110F7D8068F0E13049F7DDEDEE5ABEB210B5087D30F5F4F85152A1423F5D0B2C1B11E2BEBAA396385F5494570C5EC95B6018A412E6BB6C7CE0094C0B1ACC3FE0F4DE9140BD77FBABEA00ED71570389DDB3198CE6D44185F38593F76F224C231E1D393DF5D38F9A5A2E3CB93595975A58157686005DA5DE9B1F2EAA7A38A2CD4885579F3E32E069AAD40948A620D1E01538E049FB35DE9115EA1F8F28222F86F1B4B7D17678DA49BFE90EA71C9EB0A579D55916FFBC2F8CEE1540F8F05D7B30E07F4347A04A2D8A1CFBB809C09BC3E765271726C41C4195B50D37759150F6D1F5607FF67AC6F130C38347478C1FED233676C2176C90AAB9A27ED5B6B7192C2D168AC76DC6F7BE68CAF577EBA0815E3D88273611EA52FF21F5FA8CE0FF7B55D7C78C1E0B1FAC59E1E1E4F9A1A1A0216D795DE578CE4D79DD9E915501D7C18E72C8DC9876E500478AEF470F929B8FAE4C980C09E33BEA9F95FFE14E095E3DB79E1D305393B37D2544B311A9015B8F3CC55945E0AC7F8497BF37EC7626170C878DEB7D46367A947A96F0A7162D9E1AC800E5F0FDFAB8528C9B3AF046471D6D628D61E2B519FA1EC3C6CBFE4C2F1A3876FA163439DED4E0F8FD2ABFEC6EA8E03BE7845428CA2C2118FF0908A75A9C753C5D8591044E98136EA8547AF5F08F7B86!
A040458216FCAF3F88B4B4EB21192D1B1A9A9A9CDCBEB61479BC804CD96AEE0B2C61CC39F16A6DCC5BBAAAFA08A38DE0D5CDCD0D6D671F761608C23A7686BF2F76FF2BFFBE5705B53608CD7FD9836B49B1BFD9B02F7C738060F75FA07EEDFBF3F262626D03FE66CBAE264E7D9A6A6B3FE5F1AA1A820BDBE4B4921F188E63E74D294E6894BBE14914A2631076196C5A121A1E909711DA92D6AE04D83F42BEBFA0BD73F1D05391BAF43B28DD58B0E5E395C017D683D325ACD29A020A135451C24E5316EC8C48946CAF040C11D3E76E5583A442C8A1547094604565D31360682E508C21440D8FF29E3059A5C31CD6934D2F08BFA266B2375EE6C8664CD14B4E2BB8A6A545445D67759E801A15A4646205E59E330646D14D11819D847CA76D03CCA38324C67B40EBE52862EC8280A2E2BB316B17E6C5031C6918A1735C50A264D9914BA81089AEF7519E5F1CD2BFA5A6BE26C30F90888AF1EBF00E5A58FB1A66EE882A21A576F1A1229F00F5050A2D091A6A3AA89AC49498B44F5AC831619212745A2B263341B1BA4F9147D8110863FF0030D7A6085D089ABD32173152636007EB5931CE45B7163BA7114C46A0D6988158DC7E026721807810E558A8B3E468C046FE1138DA011327B6870C82482C2E1685DEBC1FF7298F8D99C28CBCB8920C4A34C01024DA17F6BD0059BDCEFF0C7477!
8C7DD8EB6326367877F67BAFFFDA6BBF77728868C6DF7119058834BF76FF3B!
F5B6D541
C1B726C7BD8E188B73535E5A73B36EDE044D6D6BF35FA63507808935E5AE1E06FCE67A085C23BFC9FBCF07F71B7A3D07F986B484909E89C5DD8D4F40235A7DEF1404A53F87D4EE4D871D7B1AD2325DD58D6E1DFE678F77C8731BDA9B0A921DC7F07F974F0B721A0A6F15608A562ADF82D2B98DBC2E14E6370CAEC63C1C1FE07F2DF091E0DC743FF9463C71CD387B874634AF895B34FB8E117F7E19AF4A7E1A3FE2FDA5040FC9F34553B167A353595A199120D99FE1D848A40DE0AEFADAE37220D4CFF0682C8385CD690127E0C2DD6939826C7A6BAB3C1C1319E4DE13082820B4E09F7AA0B7FC7FF29A39C8EC2CEF0172624F5704A4A7AD38198B30130EED090E9B72140117081512C16282346FFBD1528B91A5266071FE6FC9FDC0F8F894989C9E2CE16FAA7DC45BE72E907EA36D66DCC0A4F492F5304073B169E4D4941981A83C3672BBCAE163E0DE0402CF5FF068208FA66631841983C7149FA7F670513972E0A3870F68AA2A2232520B8AC3A3CFC70F0EC94C36D0DA0F474C593F0C381079A629E3A72A3C19C7FA1E38B17C661937114909B0E3C4C99CD8D0D7343C67F076150911A2188A758D85F4D1006C7C3D1DA9C0D88A321F4D4F5A26A51C393700E2D7D4A2788EBC57D0542921B19EEACE74E0E3FDD8862E0FFE581FB20FCE0176747CF163A72D5C6FC94A62CAF27F98E!
4FEF2B90A44611CE4327A3A19EB57982443939CC6D4C40999A12EFC35BE125048E4645221A44C237B804C588A92D253C7DF4E4FD1447E3B0634AF870C38B94CE1D1D77EBC7149D4FC31DFD5F382AFC53FC1BAAC367370437BC78D1A668E8B81F7C18C1FB78E35347F8B19EDF932062E2109BD62F2198B81806A1B97C49B568F85708A2FA74909A697C8383A39C68DAE8DF60DC71F77EDBF0D00E7F7F54A78EBB77EF772A4ED6DF0DBF7FF6617A8551E1E81F7EFF2EC8A93ABDED4578474330D7E03FFB61E7DD17F73BB9329016D8851B44600E2AD0FAFECA0B1762220479CFA7DC84235E85005A03D7C20883C46D349B1E32960D933D391A770F2145D211FE282446D0E318C73D369E1C52942940A1DCF0285E38A4009FD2CC0C0D15CDCD760CD6535A184578BE13A5C24CBB3439CA8A0913E46DB30A2D5F92FE4F10506A40E43850BC445426497A72C3E3F3549188B32E03BE6328A86043B4D070F42023E874C4AE62F8246ADD31C58851916E1AE38EA14541678CCCAEE776DC3D7FBED3C4FD0AC1381AD825C8B37A3E99204097FF6A85C1B2CEB636C711519963DB5D3CB01E32A5B73D847C36A1DA74A257C7B7918626C7F4363CE9D8E6D8202A6B6B4BEFC4330DB8CC61CE543F94DE995E0F51945E9FEED809F9D3D9892EDA646C7B71F56A271C621A7784280BD4848CC84338!
8A504BC7796150B4E32E083FFC7E4359C793F3FEF7C37718871C9F3EB99B8E!
A23DD2E1
EFD871FFACE8CADDF0B32F10A3770BC3CFA6341DDB71BEE36E4AC7C3279D5CE78BBB90D79DE1E71DA130BEBC9FE2DFD6D154066113DEC09938EBB6C2C24E6E70E4250463B0572C85639ECF2F014815233FF3C5EF87EE77EC308D383EF10FF67AE22F2ABBDB39C8959D0F179101F1CC88A829E56C43CAD9630F1D51AF9EDC2D6B6A18ECF477747CDA11EC3F3CDA56988228509C4F4947D537DD0569C24CE71BD2EFEEA04CEB0484116B74E507CDA55241043DE979F37B363F190F8A068DE641A7E2E1D34EC57059D9D9030DF92931016D3B464CA286F0F0E07A28BBA76DA3C1A301FE079A529EEC409428AA9FDE150D97216FC01C4D504BC31DE14F1DC1DBE1E1C348E6E1B694E161C7918603FE15303FC287AC40BBC207D954DD44491906473437FBAC5EA038281A21D8D43971E14FBF3BA9E0CAFC73F21DEFCC3E7BDE4B641A4E0704C4F28BC2CEE1E0E060D4C0A60385671B46AB035262200E480D3A3EF11AE5AA1BC21D53EE738F47EFBFF812526EB4E94047780C373ABB70761B72AC4CE15808E21A1939C8C6A9E40D0520BC1D1ADAFC9EC54F0AC235C426F4835CC753474540F015FFA701F99E671B9A1A8CC3C3E975B347CB868CE185289AD5A38E398E5C534ACEC62BC1014FFCF12E34FFA2FC278EC19CA2E9E9C3A7298F1515E12F02140AC5E187298E4D0F031E3F8E399!
0D2203AA6E01C0F5CCD3F46D33A73E619C70223046F4FB9E9333137FF2453746C3E3B22F27ABAF18262B42C7CF663AF2781C7AAD3878D8AEA17B3213C071D0B3B386869FF947CEE9D32CFF30DC1570A9B88C4A07B1B0E3C548CA6DF6F7B7C37050119FE220B2D006A7680E23124DEE1FC27E1C691EA635E8539F95C7099898D85A91210849B37E3D7D8B82C36D24481DF681D1929DBF834A6BAC1FF457AC5C3A71DA365C343264567DD8B00EBB6B6FAF3E79B3A879A663B36C4943550D12E7BE25F4FB2C8DAD4F0F421C22D65F8587DCA0B8E0B4F090868F07ADC71A0B322FD61873F1CE60F41CD791D28F40A367240C094AAC9F45D4C97E0A655FCC4F2AF178F890E8EF0D2111E1155C74027F9EF3859EFFFC2BFD39AE466DB8BF367FDC3FD0FEEE8B8DFD171B7333DFD7EF8D97047489727F71DAD493EEEF007153B76BCE8B4EE3C7F1E3990829777B4BD78EADF71FEEEC3171DE1E1B423DEF6A2B030FC21789536154670D1A6ACE37241BC55FC8C6FD2BC460F8E8CD084DE9A66486523C1D5C3F5F5A6B1A17AEBFA74B62F8C04A15B24505FEB77EC4847249775EEE04651DD4CD523F5A44F45F5A6FA41C50E641CDB701795A58F388E183B71824E937187E30E23CD3FD21DF3BFCCEFE4685B63144149633D8210FFDE86D52EF91746064F9A148A3113EDD6588F28468787E89!
606AC6E4DA335982C7874043E1CC1022814B01837A4407788CC41EF6D4227C!
4D1C2223
C43328DB6FF583F41D591ED6CD21EF7A0694C31A6500CD2D0C74823C67AE3E340B960D51B132FFE92BA382B58F1DD05C5850B0A23ED3D5FC90A868A42A73D4AE7C109868D87830F67E1181D350E0E0F8B907DE98A319CEEF149C700C786320EE982AC704C876E195170D4945D115D617586A3FAA0605ADF484C82674DB4F5820A861F2E04A2B98F9F686321DF7F7DC1E2C58BD1012E06E7B7397A79ED5FECE5886F5E8BBDD8D1B4D88BFAC3FD5E5EF9C0A108760C9FED0F9B5D780C5DB4B16EF659AF60341AC686F0D967B3B22A0E1FAE08080CC45B17E7E7E77B7939E6E73BE6E3A16327BC90FF654067E7F097D5013F9D3B17702EE0FA1FE41182668442EED6D5ABD396ADBFB17EFDB2CA889CAB09390911111109F4853FC222927B7A4E545676452427CB0317E7FFB47F764E8E674C7ED64F1B9D9CF2FFF37F05A47A860770E90181B3C33C6371EC3FE7D4E3DB43876F0FCE9280134424E48485E54439CD8E9D3D7B764A6AAA4B9A85C5F72E2E4B96249F103437CF7886E39B1933962F9FF1CCAEE0504F4F7272654225BE54AE5F5670021F950527AA6A6A82060A6EDCA83C7AA9B52739213921C13376F67100485DF0E7FFF8F39FFFB6D8D3D32B2060B14B54F2A54B3B77B6F654ED3CCA1F55872A2B2B4F9C38511911916C9B70AB2BA127A1CB33276DBBDD37DF7CF3DE37DF!
2CDD6EB75E10DA3C63E9333BBB673366CCD814BFEA5951C1A1CA885B8BD2162DDABA68FB86E58BEC701415151538B043152496481E48565E6A8D88B5D81F9B1CB1FFC337F71F8F8AD9BF2030C173F1820F8FCB4F541DEDCFCECE3EDA1FA4AA0A02EA81430E453716E163FBF6ADDBB76FAFAC3A21978745A5A5A595FBBCF7DE8C457603B94B0549CDCB6FDCB8F1CC2FC3D575DAB4691919454595CB16E50263F9F74B6197893E1B96DF702D707575CD70B876FA76AD50289118F4977656F5DC4A4BFBFA970FDF7CD3292139226AF1FED8E3A9695BE5CB4E54E91F894BFAC599252A1C007D4D55F06C834DF9D21BCFBE4FCBDDBEECC4B2ADDB6F6DDFBAA17CADCF723FBB8CA5DFE7DE40464C2BBA71C3EE999F5F46C6B4B7DEFADCAFC8A1C06EF93357BFF7DE5B3E71E28AEFBF5F54E45094E1A0B223085AA1C4D0D8D8A8C797EC9D27D2DEB4FFF387E7D2D222625D8E9FFB70BF53F2CE9D47FBF5865EAD38A824A8447BAD045F7154152C5AB16869F937EF7D54BEC1CEA1B5CAE190C38F9B7CE27D66642CB7B958BEFE8460D31B33FC9E2D6B1D78F66CF9C4774343F36E66EC5165BCF79EEB8CBC4D6B665E2E07EC13AD0E457B428A6EF8A94EB76BF48D127C36EAF52BF5872ABFFEF39F57BBB824B446A4A5BDE97C6E596BB65EDFABD41BF4E2201C25701B8EFEAA135DEB5B5545!
CF26CE8B8BFB66C0AE203324F3C8EF6FEECD7B2363D39A8B2B06825A05CD93!
566DB22B
285A3A6386CF449FA4C949F1AB5CF7383C2B9FF16C934FB1CF338781435537D6AB5499A755AECFFC1C4E0BC50F0C121C7A4963EFCEF54BDEFCF3925817B9938B8BCB8209FB2B7BF48DFA5E8944AAD48AC5FD2A872255504D49FFA3AAED370E05955C53F99547C7D9D9F9A9B42147F6DC9C14FAC6B4CFE357CDF0B17370403715BACAAEC86EF9AAE61933BE5A9594B7376F959FDD22BBED7619AB3E87F1EDEC06ECEC54BBDA4F9FBEE63A638643FBEDDAF67661FBED471A49F6A15BDB57BF79DCC5E5DC874BA2D2BE76B975A2B5B757AF94F46A34B58FFA4B0A8A8A82C406F1AED3250505AA9A921278F39B450E7B101B197BF6E4C537674CCFC878BF79DE8CA2226A6BF366B8FACDD8E7D39CE19731312F2F1469FA4D51819D5FB9CF47DFFB3D7BE6E0EAEA702444A8D5F63BF815855CCB98E6BAE7DAE976756376EBB2ED4E16B14EFB5DC29CD2A27A5A77665F821B7A35C2A0818112AD839F9D43A6C1A0BD864076509538383C5B6D53FE0C89E55AE470C4F58DCF711AD769CD793E7EAE3704CD53263DCFCBD8336DF3FC353E19457E3392429B43D7CC5BB17B45F9D22284B4DF8C196F644CFB51B54B28EE77282A72CDD8B42AB4F9F369AAF6ECECD6D69D272222E87EA0FDC713765ED25F3AAAD74B84FDCBD6DAEC1E7028F22B2AE9370877B96E7A7BD334BF4DCFEC1C16D96C7!
9DD66E9D26738EB11A49FEB9EF721963ECF705D0108A179B3A66EFA3C292E7ADE2A3BD73D7E6FACC95BF3DA5F262E1A106BB42A3F9F55CDF1D3BECA3892293E7A292848E5EAFAF9F3D02979CD7B8405EB971DAAF2684D88FDDBFFFACF73F2842A0FD0D08945EB0782767F3C6177914386DD9E7EBD587DDAF5EDF8F73F5FB56995DD9E5D0EBB374C78FD9715F07AC1B56B7B3EC95835F98DF75D7F5C5E2E88DF7B7392D5E6CD6FFF7E53E467C8936BD7327C10977EAE25BB548B325CFDA67DFEC6B4F76F4E3F72CD70F468768D4A75CD35D46ACAF37857D78FECFFB8AC45DF93107B7CFFE2E36109C93B8F5659FC7FCECE36254BD7953F5B047B9568FBFBC5A7F7DC9CFCFEF4F7A7C1FFB8F01287DD3636B94B7F2C08515D7BBF39B419CFBCBD66A2E0E694C993274D9E1A99B429CE7B0ED2E15A094210FEDF93F19177DC1A9F551F7CF0D6DEBDD3A75FD3F667D788C5AA3D7B56CDCA0BB50AFD7C4DA2FDB2C64395094EB1A9A9510909B70EE90B80C07EC3A2B56B7917F6C333E2F64FA6DFB49AF4C6A4E6E7CFF3C0040EAA56CA94906BA7F73437874E9E3CF96673BC0F20EC9D3265D2DEC9494973BCBD23E700C3AE1220C898E13375CEBE7D793E73366FDBFBD6FB7BF79CD68AFBF541AA6B7BDE9E65B5D76ADBE639DECE5BFB936FDDCA71F2ACCBE909733AD49F0B04F697132!
D2F4E7CE69059D2AFD71FD50B777D72E47D5C42E8E42993A63CCF2B9EF7ACC!
0AE0008A
EED697E9EB76DD6B6C993F2F6C509263F9F3469CAA4C9934267EDDBEC6D6919F7EEC4197B5C9F7DE3F3D99AA4F979CDA1F153A74E9EF2FEFB7B334E6BFBF5FD4141BB5CDFFE6072E8E4BC7DC5DECEABABAA22A292C3C2E006A7B0AA82D79D81C1DD3D6EED47CF54DAA01A83C12011AA3E09117C3B7DFA5B6F4D99126AB52F327161F9A2015C86EBAABCE6F9F3677D103A65FE666F9AB24C9A3265EFA4D06DFB22A32D131323A77E108FCE62B37764F19C6D7B93AC66C1F5EFBF35E5F34FDAB5FA7EB1F6F48CA991567B4393E2A313EDED17E90F45244445D9DA4638451CDA0000809078EAA389760EDA4CB141A216EE0A0939F2F3118140F0ED5B93676DF6F64EB477FEDD8A8C0CBF89D3DEDFB739FEE607F3376FDE6C090856CF9F5B854E7E9EB46F6A5CA2BBE59AC9569343F336E3F571C5DB70BDCFA710C6D09B19A76F6BB5EDED7B7C36CFDF161A5FFC5AA2BBBBF39F96B55646C5A686411324A7250281B3BBBBE567F3DEB373DD2514EE12B687B81E093942080482E9BFFF20DAD2DDDDDEFEEFE5BB977F35DDF57DABC94953B14652B1A5E066E8B659B3AC429392A646CE8F4B4CB48C8B9C3FEBF9E46DFBE65B7A2759594D22134D9A8458B9E9FAC9E9DBA7F72C9F3A3F69565E7CB177A2BBBDBBF3846561A90BCE2D088CB54D5E6D6F4F4600848F9E6514959CA6177F3EE3!
C8270CC2B7823D3FFEFEC7E56B6165CB8F36BD3DFD081C63B56D5B52A477D23C4BC1DB3727CF9A959734F5DD79AF454646132E2B1C7B6FEE8B8CDC6765F51C08A6BC4501153AE5735757BB4D6BD64C9DBA2D2F2F321110EC9D5FBFB5F5C3FFF8CFFF78333021D9063FDB0382F7BC3576AEC8888C3D196FE4ED253F7CCBCCE03ABD68BADF339F68CBE84D9F4F7FC36AD6249C7A6F52D29AB844C1AAA4B8B8C859C5DE9633A32DBD2DBDE3229B43F3426745E67D3075FEACC9932856C90AF8F23C34694E64F1BEA459B3929AE7E072E8AAFFB4CCE23F1084CEBF74B5A62D74774F744FB43C053F643884B836C7BF91B769CF9E234798198EB063BAABDF269F39796FD0554F993279EFCD2444E329C1AAE6A9C884E839C8266FEFE8C87D79F1F1DBF6ED9BBA2FAF392F29CF6ADB1433024ADCBCC8F949A1C825AB78B8951038AF5E6FB165C9845F7EB18838513011B0121327A212A8AE15ECD9F3F9AABC35D33E09095161E99F431812C29031E3F3CF6FC6C7CFB782733F88F38EDB5CEC2358D39CB72F320EB4B4E6B3C8C8B8F9FBB0C4663C133935292F69FEAC6DA166003826CF9A1FB92D3434749B555E1C2020FADC172DCBFDE5F58F6DAAAA4E9C70D8337166A2E5F2A56B9FED52153984EC796346C69ED3D7AE8520275447E82B1D217B323266CCC898366DD6ACE7CFB7C57947!
E635AF89167CB62F699B55E4E6B8B8B8CDFB8AE3E3F76D8EDBD61C8AD804C2!
B8A993B1
22B300FE3DB77A3E0BB98C1C0D4D2208F6EEF61F97FF896562AEF8685050C891E53397BB3EB3834E825EC0EAD7769DCE54658604310421AA904F006697835D46068AD41B08B3597392DE5EF59977A2A0386FDBB6BD93AD36CF8FCFDB367F7E7C52DCE65949F13793A237476EDE1C373F0F2CCACC30093C0E0643FE6E9B0408C870841E2519B2C0FE75554B55104C7EC3AE644055A26DD73ED264BADAA9DA8525104E99210EAA90924C952A042F5195F4EF2982429CF679DEF3D09B37D72006DD053ECD4956A1CD939EEFB36A6E4E9A9FB46F7E5ED2E6E839F16FAF593311393375D67CABC9C81F941104C3145865D2A4D0C9B0422248C89E1D1415DF6B6B33718D2A689B475A00D0B40885627C92822B29513994A8D00484B01F824A54AE45767ED3DEC8CB8B7F0D6495E82C28DEB76FD6075656CDFB662559ED9B5ABC26293E2F12E1F9597474F19C7920AFCDB342274DB64224902FA61097A3BA8340100989CC1BC40F0B5BE70A77E14277696FD7CE7DD4DBAB6E518B856A89243BBB2628A886AEBD5F4C8F2025FBFBB580EA9A91D19C3715E492E8EE2C98579C3415D78A24981A17171D1D3967AA0F9217CF8145E6F81447CE8F4491988485194F4D825FA07123F102770600EEA0AF8B6A6F0B3333B18246572B93BAC9D44AB5542371536B0C3535FDFDAA7E14EE6C40E83F5AD!
5DFFFA81F9AD235E3FD19442E086BC1A9CF8AE7CD29DEB7A6785E71B4A5A565A2F73C1F9F7933E939F744EF53F3E6440242A8D5DEC993B7814B9E5B81BE118E8491967636BBC23DB7465DAB11E22A33D532A954DAD7ADC1A1566B2412AD46ACCDECD7025D4D9058035DDBAF85C8871D5C337C88629D9D0596DE33677A47479F8A5B8810A308030ECBCBEE3CDD26267A7B6F9E1ABA77D6B649CFB7A1964C06991397C2118984E0E28444160B36ADC21675AF460F6BD7A865DDDD3F740B85428D10288490B042718DB63FA83FB3A65FA3D56BC580200EBA760DBE9848AE7C5DE0CE5F3099948A2D732EB18E335FF8405AC5DB4267594D7A3E6BD636B0C22CA409713B3361F9C0047BF6E2DD52BDA445D7AB7E64A809CA161286DA76AD902C2161711924D606F58BFB6BB49A471A2D0E8390EC6067F791BDFD171304CC167C6CB3655F3EE27F488C2E2E9E0A82A2B4D8367F56687CE4E67DFB928AE318E602AD0DBD66DD8A209944D2D222E9D52985D9E48BEEDBB2769841AD8131901704A1A6462BAE110BE9375A2D542EE80399B1EEE309B0C2AFEB99BF3BBF7AD85B4627C5CFCA43248211664526AD9A4F0C5A6C49D1E83E3077C06EF7223B95466630281FB829957D3AB5465C937DFB9E4E57DB8DE01076D7AA859935E2203823534360C8411ABD5AA34174AA0A8A9E5DB49920F!
8F592DD5F627805055C51BC6972DE145236A1F1F3A726CD89DB3C27691EEF8!
8A5998FD
0D9CCBD5D9B596350FE704FD6A756AB6B25E21ACD5C9D5229ED561B343AD95CB5161032854283E69150CB20A0D9E995186A5441D75425CF6C6C04EEEEE38B25FEF3F58F4348F42EDE07570001545C349513EF397004F3C484A52AEDAE4C1C12499FEC07595FB75A5AABD388B3356E6E5275B754AD51DFD6D5AAB5C2FE4C83C6A055AB79089A476AAD52928DB8016D2DCD15809ECC8B5DFE6D08C040696105869EBA39CEDB32D13271DEBC798C55EC5F5FEA505203432B918832373799B44FDD8D78A811CF8549944A9952098FE8C8231A3520E82414A3F0820E0129118AB5C2A0A0430502CB7108EEEB7E1302AB0590B553ADAC3E88DC3C7F4E34204417CF0314E4A25D89B01D277473EB55BA8190100C7DD26E9841AC96018F52A6D3E994B53A8A4AB51AFF946A3202E84223D4225B109862437695E094A579E5D76DFEE8FC9B18E8722DE72441F583179322E32C5163F7A14A24963B08B5EDB7E78292756E3A9D54760F18C81C5260E806069DCCAD056650338A521357E95E6290E05BAD305BAC111A0417BDCD106CBEB1F97756A080F84BFCCDBD7B9FEF9B85328E02BA0F145DAEBADDDE8E56BB76AE4E874FA152860B578299652024350049A52D80A1A30501432D11AA75B08304102464148A1AA4A9416013678E478BDDABFF2B02465C0423D1327A6AD2DEE7F3374FDD573C!
1F15658EA54FC96D6682B9EDAA1B05F8DA5DDB0D0412A55A296B516A109E80E0D6226B916245AC0A6C12FA821F241A0641ADD3696AB285D982799F512620112D727F0BC2C2999689BC2E4DF48E8C6FDE373F72FE07FB92F28A8B3F2AA25183AAC86ED1F2B5EEEB8AE66A11824845ACD2828B574AD4527628996180A01B4F1110209108CD6E91EAC4D91283E0D43C2CE1ECEEFC666EDAEABFFEE35F23D27D26952C568E80610EC4DC0753A74EFD20A9F8233B9860D7EE75544DF0EE757E1B768BE7CA74B082B245296D6911AAFB10152DD207141EB03E5B5F2D4105831D2464078D04F1A3CED62B05D1F3BC71928FFFF84BDA768B2D5BFE35101267CE3BC5A4AA3B2546DC6728AA73A2677AC7CD5B1E72FBF6FF7178DDD9FC0C52DB7DB7F0FFCC45D44B5B94A06AB54489C8708341A4585928D1C9280000907E94A859702034644282F0D9299861CB6A0BF9AD5C8BD5667E7E592FDC2D235FA392CAFBC23D6EDE9C357F21729A786DEEDCB9AA72774269EFCE17EECBB92A3505BDB257969DAD23A3CBDC1E48658C33B12CEF08B5B44FC9D627CA20B7F5E905A736477AA32DDAEA22BF9526DFC043B0B71F4702EB4793382057B8534C467F563C67CEBEA91910A2372EBA13ABDB134941C5B923707283E8DA646EE27EC49A5AE9E6A67C4001A153EBB251C4751418080F3E26943AA5!
8E0245223815173DD3DDDE469E1A2B7791E7DA9B8B84190483306F21AF5209!
027A8DB8
3579ABF27C4E9D5A372E9912CDCA895EBF9B54D35C9D58AC012DC10D445752D023D2545C0BA6C075231CA46A864049B90308F322A3A3DD1357BBC4C6CA53D3B6FF751C015FB349B458CEBCCC0370675C6D6939277ED5AA35DECCFA3C0ADE4B44F097D7439ED4648AB54416ED321982810C8E0C44FE893558564D18E8E2198348198435C5C4B9DFCBC3A2C2E4F2F57F1A570CF62C1E98F5CD52196B5E2C5F3EC327CEBB7855DEBE71154FE295B7C1E50D13CA77170D14150C142D2B72086A075BC9DC90113A99B45628AED58883AA32790F485FA26891227405F3F64D4587B85A7EE74E545757AE3D6F025E38D93B3B9B9B05FCF6F23A9BDDBBCB4FADFB6826BA4F9FE89989AC4EF10A966266E1EE2095C300C4715026C802404AE00B508414FC08A5A0A161606B8D584D7CA1EC7B690906A1B8B878A6BB8D4B6A6C6CAC0B9F11660CBC77DDF9076B97FAED2E7F1D8AF1F2EF12292A493D26F2A940AF285FB448A5D5D64215422DB5C3F10E8B76AB6A51A5503A74B5284750B7350505AD416210D2EDEEDBDD521D31A952DAA8EC15446F2EFE2032711D4170C97DFDA5267ED9A6B0878936AA81EFCB73772F2FF746F441D49E5A730AB53291D9E8B2BDFDDA82FE4CB1100BA21EAB6B215634990E8B960EB4D7B60BD5B25A35F422C850452E1AC8ACBD4D477BBB16B5ABFB41E3835E0!
1DAE9E262EF7516A9A9A91680F0F270B737071C7D2EDD35B0A1486567F391CF454B4244A9BAD0D2ACE42FAF5B5BA07D044A40055453F653DC6BDB331D8A54ED254135424DAD460B808FFA55550345F8DD6DE1AE10955D51914377B75AD9D8A81378C7CDF9604E9CF7D7B1A9A969B91FBF348039DC13897CDC6FEC0A7175B8E6BAC2671E328241A046879A797AD965BB01ED23A150A904EF2B5921862A8150697778E69089A6B2063A05A2514D5B042A075566A6CAF52B9F723BBB22D5EDDBEA078D2D02CBB862205867218FEA8AB0E013FCA50BD8E3753637D0257F12B2E7C71933FC8A2DF918A4AF7C3024BA5F76A86DD710D149D4BC3850D72A755443B51BCA559941AAA01AB14E53ABAE453B5302CD4AEDDCF2E51976AEAEAE9FDC56373636C211E8E4BCBDBF97CBBB6EFD62CFC7BF79FDC47530C1EBBB6FA84EC30A8269F19B36C5AFE1D99AEFE678AA70B754B5CFD5B8F15C03B1929D09218290B8DD5E5BB47611757955415A528CE871FB4BFA83608502BF0C34F976197B3EB92D018468D4BF39DEDEE5692E694E7FE423C06C0BE7B51B50046F0C386496ECC9D8F4FBB7A61F99B6E98D62DEF83C61F318166ADB35129E6B0C90E658B146580BF5DA7EBB64C30A87CC9AA02A87AA9A1AB1B8849ACACC9A5D8690A20C3FBFDD197E3F66EC39DD2D418D888CFCA078CEA9EFD!
35C5CE413C6C38F0751BED4DE7E375AA04C55886BC657493F1E9936E7834D3!
3CD8CE86
C2E91EE89CFE6C20F7D0F48B0D51080A04C5841D6DD276C6F2FB073D0C2FEC845343278AAA43F138189405DFED1EE1FA7F94DFFDCB55B5823888B2608F3566CB548DBBAC4FE25021C7FB75B6ABF811A0F6D66490842E1E611C1EF3F58C343308FD788C0BFB9565B2B25086E3209B173B698CC2EE9530B6B6F970CA8D04D0198584BCD4B498D18E4BD2BB3C4CEE6222C31FDFD6D5FDD16DA2123E2A0017CBEC9CD75495B6DF6334F073603362B4A6E6B6A1F6934DA5DD74242FC8E84FCECFA86A5D9FEEC2597ED2D97EE827613A28F00E141881858A30016E893486A6F67AA4AB0284D166A353A71504D0D847B3BAEE8FBB52B067E9CF6ED1B49BFFFF993DD0847EFE835F37C72D3725D722DFE4121E0CE87E3DF8B0A80A05D8DE2A2438F5A52722424E49323AEAFB1347819944B4FB797B8AA2007E00719A524556B54C6BE3E68B57674B0E8EF80405CABD6A1AD8460D6B6C311E513EC5C7FDC337DD6ACF8239F1C11A0953FF5D1A90D4B735D2C5C72574F701FAF11CEE5412A7409EDB5B5D48CA8DBDB3355AA4F8ECCC898C81098B9D97EA1AAD6E1E2EB7673354AA541ED4669413588F44A9FA4BB56A8BEAD866FFAE1884724D9334111E8ED4B0A6C2614FDF863C8CDA993270B3ED9836ECAB2DC66EDF76916162E5BB72FCBFD986768D4C122945CE27B1D983FA8E88656989929!
0CF9C867C6423E0A7912BB98D9FEDEBAC4A57375506C4C8DB8F5A12A400F402529A96511A26DEBEF0F42283CA28762F2447F91CD8A239F4F9FFEC1D449CFF74CDF040889DF97AFFE262DF0B84B44C47A973F998B94B34D26108BB56A4D7B7BD0D2D7FFBEAEA636287357884FE2475F30047C503A7F31A0DD55B06E614189161A8964222A316B27A0A06BD5DD1A03DAA51AA1B65FAB7EA4A1B814A3B36D170F94BBFA7DF5FEB6E859939FBFFFD62A34F7FF37376DFBF6D8D4E3A9B12E6916BFFC915568E7850570A45EA3D7CD6D772877B7FFC7172AA121B3BDC4EFD45F12C70B381B84FFCECEEE2248ECF2EBCB846C7119C2D20DC2883165B744689048C48F50A51EA150182818B48847955DC6EFDFB78A9C7A330FCDB20F3AEB8569DB6FDDAA8B42B14E75494B334FD497526A095B90592A36E05E4773A24C57BF8FA0E913172E64CD0533056F35E78F8BD044114149FB20549844454474774BBA2506214A08A41B595548DFB441769BA6BDBF79FEE4BD56CF2785C20ADEDECB97755D3D107BDCC525D5C5E5FB5F9015EE5FAC50815F346877DA3337B06BDE807308B521AE3EA8094B5BEDEC6EACF89D3DCFCF2C2ED72D13A279D548492ACAA4884BF45450EB4A52CFC8696A6B350603E36914AD1ABF4D6F59CD7ABE97363B4237092EC745976F757A1AE594E60408695B27B87F!
6C5F3E40842A44A1AF6DDFCD0C9F588453A0C8EEF1B174BF58D53FA06A6F2F!
72679D3F
6170FE7860AE0CD59029226A6CA11AFBA861A0AE41438A49080DAF113208064028CA609B5593270182ABC072E6BCF2ADF2036151B7E4B12EB1A988868F2754E9D4628DDA8008D2A82EDA53ECADCD440BDC7DDAD5D5CFD2FD86F651FF40C82ED58A75EBF8EC00958BA90C0949151204C240B3064090299968A384C1570A6FA156B2CB75531E8D949F873E7FDEBC078E9867B348EE541776EB56EC46A7AD100D5B726BA1C21149B0427BC1EBCCDEBB719A5A61889DDFE796A082DAB92AD7CCF61095EB8A85041046500BD93232B202F5B3040144459429AC51EBE839E8686D36284A2336685DF326B1C1515E6852BC9F20D172DE5A8BAEBAD4885B72CF54272744834581462F51EAB5BD1A6DEDAEA5346C765FA86A570BE78AFD36F9F95C5E219EDB5E9BE9EABAAB7D57896A030B5E9B5D42840E542113A5589F4584949F36A0D1D76998A412821F6B75C21A71BB6BB395D594E6E6BCA4A4E2C8CB82CBDE176DCAE5B1B151F2BAD8D42824C5D7EBFBF53497D128C14B0533ED898C51ADD492DA5DEFADF53BB570A05B785B7B4DE5F0A34AB8ABC4F562E2C28BBB0B32C5990634EBB8F23EE26A29DF2DF09DB55A4C7396710820C99A9A76D7BCF9F3ADF27C22E3488509DC2DCB9FA142DDAA9347A5CE0EEB4ACD4D3B841462432184DC45BE6C1581F595B5ED7EF33EB2FC5D6637B24A1!
502F1539259B2ABA0A8C02108B2448C159432487489C100BFD732B224083235646D2D13741A614D26345D667F7BC62AABA4A4397134B772B717AC4B5CB76CBB4B5A9DBCAECEC9891CB1BD9FB4288237535CB4D69E0FC620A14EEDA62BB15B3A33D1AEBBBB5BAB7208A1BD0EBA4F24B3A4065A04B4A791D4D292A001363C5053DD62EE208650B23113AC80A7B4B042311B9CB1847216AC9E30C16E7B9A4BACDC332A2C4CEE62915609790116D58A07962E64AD8CBDF3066DAD4E22ABDDE5F09EFB5A9550DD2DA4FD0D7E7321C87CD06095DA142827315DAF5AC903A0A138AFAC919010B034960ED2FAB10EC09EA75841EED71BD20021B5EE4E4E424257ACCBD6AA472054A136B368ADBBB3599ED9A15482F3B525E5F6364150FFED244A697BA1BF0462906D3250566A7808D934E6D5A08B92B1FC942AF9490F20D440D281A96B3297F2AA87EF1E055B211AE530022044852574A56D6D6D45816A5721DFC6CBF6C72A8434E2CA61D106FB09556A89EEB63693BFF62A9AF1F78B69B24DC36564257800C204393A1E8F8441C2A2110537285383AEA2266829DF24B2ED14670192E1CE2D97AE9CBAA83B51F28408F9D62ADA3118B0F9C7CBDED27E42899A20740F2C5DF1F15283BA4F36B77D57D0CB03178D3E8E8D97256A5C39FA0561AD46681E36B1EE91461BE400D20DED24A5778F9!
B8074B0C029B62E21C22922C1B30E8E48E88975395175A875A0DCFDEFE0DF8!
51318867
2108A5022EDCE76D8BD6540D622D3CDADD59218EB17334D46EB8BB528CB0844E225438D160424E4F392FF025EA2A6B22A484C93586DD022B3320282BF7F2188AD9BED19152B2F74AABB1391909323971F3AB16CD9F7BF94DBE015ABCB5F87319CD7539D1322BB84058B827A116773E73ED25655D564A276D6504C640AD9905FC88A84140511D6D68CA725C38076B3167DA683967A5C4DCD8DF1299EBDFD177F143845793A39C9A3C2A270C8A33C6F2524A741444EB0489BF08F2DDB17FD027B4D08C2DB0C1A19CA6E8DB85789767DEE5C9D249BC563093801254DCB3661241AA54CA704FDD5A01468D4FC24D68C4146F56A6040087D85B45CF67FEDC707237FFFAB401ED19390D3639BE09B9C13E61425F74C96BBB8A4B958C8E5B1812E5DEBD3B6383BE792E8D48A3532A910FA504667D6B92959D70203682912B4B4F5426440EDBC10E2A89D869D3AF3E0D16C88DA1A079550869653AF5FF6E69B5BFEF4477CBCBE65CB1F052EF284B030FA8C08937B86C5C6CA91215DEB23222A7B2A13BA2292B72FF98F459A76D4B820B14EC7271A4BB63E3594201A032D3B687D213FE857B3C60D3D2420E095BA710C4A5977B62AA81DC92969A9B2D8B265C204FCDB4287401ED605528AEA0A0BEB720A4B708A8D75494D93A7C9B7CABB706CBD752BED8F5BC1EBB711CE383FCD8ADC640C07!
229FB61D6104F649237E21429245289A486244546A9D6E7C9AA294D68A6B322127C512C9B2D5BF6CF9700B7D4E98F0E11641443212C1966EA2CCF1CC2108D00CB116E8F453A1A1E092D57FDDAABCADAE556752974EA30335ABC932994E9389EE9101A08C240C7418C42C42A9D546D9D2295F1ED26E8AD3B91A7D6F95CB6A0B60F8F0975F565B58AC5E22E8C2EAB6097484D585E538C53AC9A19DB0F856A734F6EDEB3F598865B5100B482974E932947D35EF8E5A31CFCB42E609C68E140C90053564328A059D52FAD20CE069F415528D5ABF3ED7C2C562C992255F1F4FA3B0832370FD8420E74E9D67D89D584F50652C5DBF3C1618B6CA2D9C5FAF92D60A596B88BCC62280A0A3699A8C08979A45A179CF896D33A8898AD95E1CB5FB40C020B4E0915A795BA796889586CA4AF9F1AF8F7FBD1F9768E1E2922BD88A4CF48CAAF38C8A72024186C53A39C5DE921384AD7801502E71FEF32125CDCCA8CAD092B026D51DE95C197810FD2A5D3E6DB25099A24D0709DB6DC9D64AC8097C52D09CAF458A948543C5BDBD427DE56A9784885492CB3804B13D4E4E9EB17572274F4FE048880DBB8314614F5AD0F372F8ED28BB32CA7C145B6115E81012144D930CCD720D7E5D5B4B9A94AA948C1FFCD3CBB3C51A26639524EE2993293894C848A5B4575F59B953EF1B9B8A703B9EEB22E83A!
14961376071F6151757561BE77A2A866A7BAC4A6B9B0904067B1EC281891F4!
3FDB4E42
A72C260C14946A6810AD986FA5D91618258A44C2AC040C12998C2812ACD4472FA64E4B03FA52F682191A5726B81C47F6C522162A7D290E7240CE514E9E39BE60C91C22CA5B4EB002EC90762BA2F228AE4D27AE41F181470C428301C9C797212C44FD3AA52B49740956E1773C9093A0525A18A58B44A49B140FD069F2E398C6C6C69DF2D83AA73A27B95C2EE8E94142801D936DC37212927B22C2C26015A447541ACB4917F9F6B4437AA544A94139D6D4EA58FFAEA155D80895769700619C1734126A68F1454618B20D3A14168992C96A4040D556F363DF16A5BE15512727089582E4E488B03B0909B72222A2802121CA33D609E688728A65B1F23579A432FB01A91EAC065E2049A06425A88FCE4DBF2542023AB6ED24615B0D444AD25A43B6504A66C0CBBA65D26EB290D23C846E696C4D937BC20A51B111824A3033AE1B11D01515063C514E613907502E9CF8708521BEDE7AC8401B3B08BE6C9D1BEB9BBB89A2995E576AC80C94252451B13C1BB7803674B0041C26E3A5BCB4BB4FD9CD7757F473AD54D2EA14EBE974272759BE15D48448C80100206104058E3C7035ACCE89B103D81AE5E250B684824922CE1622C2686B852050CB26653B8F100BAC489101FAA46E32733B25534247F26E9041F4327B00789F4C3657ADAFAABCE5147B75A747B29CFEA722E4A39353545844584!
232E83A2AECEA9D9C3B4EF81563A81EBD5ECFBB5102F71A345272B5922F55EC21C2035460A0BC603B3E4CB4BAA1B5250585E65E2D35CF80D42C2A08244C23BEB4333921C777E5CEE42E4157581DA8C933CA36D996958B88A89C3B51774012759EC010BBF5A894C6F96C2F85325CAD247DA6D43149283107A5542A21FA34A0DF61A25126E3AD000685A8072A37B639368E80BC810B4B4ED8B9D323011911D1E5999372E74E14B2212C220105232CE10E2051A878A274276723BB69EB596A3E2D7A15C80635B54DDD92BE3E255BD14DD647F12A26254FC947A58CB6D1F1454D630EDAA4E32D673EF4BD8DFACAAED69DAD5DC8884A27CFAB75108EB040046148084344C20D708493A7BCC720314F96953F10D7E17A642CF369C7B1AF4F66DEA57663CB69A09F8452A2D2EC1A9E1CF95004218959E7FFABAA962825FA9EAE849E1E79579520411E76352AC5C916FC4025B3A78795CD1C8A5104696BE303759F4E59CBF6E4798EA1948025FAA47D2FAF895DF15C580B0C6EA03A6130D400043C564BD21986CF3648CC829EBD0BEECCD667F79CE8A9949FD00B22C2E07CCF3B61093DBEC9949709949F38E09B2879585523025847CA833280E24A26ED7333D31C795746974F5FF0CC5C371D0DB7240652FC445544E4624A5890162F23192B5070025363F6D1435DCB2E35522C508192531!
878B2DCE08F3A1CB1CBF48D0F7036BA2D44D90D0CF7DC18927B34BE508F437!
01B87206
3BBF67D6405B184FA6C1DD54F78A05668660496B7640D90A644D278E94465D5831641421755484F79986D7282BC2EAA2E16CC48694A87BCE7C103B00A8946F23C3BA46EF77EE893FE700F7EE97B19FC44052421E08F7BCCDC6C317A1F6D88A240B259A494ED13D39BA803D72B1F541D3A2A7920112002C30EE42484DD62D5EA0E3E0F841D883A9073079EA8DCD9F240AAEEA6F33308CA3E373732E8031AAAB144E003D1BCE746FA44C62708E2020D3EFA17B4763AB58632494D31C15E87BAD9CDAA95E1A884F629E94F79727250322212921184576D6D73AE26E023073FB4EA1FB0B7F264D8DD875EEE07B71FD84F6E6EF7DCF8EE9DDD0E409BF1FC7D092FBB7A663B360B0612A98E924249C30704A3941983368BCD10404611E86200018A21EA0E5C0103809AA212F42D0F9474838C198392468AE6040002BA23837DA07A53092786646C353EF03233949AC918760785448C4E448A7051B319AD1B4D6901219917AFA4A3513A796204617AC6DEDAD9D8027AED96F293025801EBE2EC08C07BF7A4D003D98878A2082A9054BE195F305F9B075E8C32644C371139521E49943237D0989A1F8811594A205F7908C9C9093D7227F4D9E8F0EEDC41214FEBE96D5152AF4C65B1454610F8F067E795D4D0660FE898A71F65378DA0D5CA973326999B190320C8DCD894816F72A9118141CC!
2C830F8340DEC59BA012FFBA927B92E5B1B3A19BEA62E5113BDD5A948845B2024242DADD6D9E6A2211647D861A7EAEA2948D0721C5C6CB2E929115F39A9B94A713A623098244CA4B17B2810C7E16A34C45D8DA1229C00A091E068FD2649469CF9E56DFA38D0F5A688EDBDDCDC24BD9DDCD4FD2A8E6CA74ECBE086AD95E5E2CAB2070911B6F03F2978CA70D7E30CFBF914F1E56B170027AAB41D015911391437F34970C23A022E8F5AD951148051CCAF1D8C23BA138945410D9BD414A19BB4A5CDB3D3E4B411632DE0E3C4730D3332CF7DC90474ABA9F082C25BB778FE50AB538E43B46947A01F423B110AAE3F6AE9D1209881399C38B4C0A9E3EF3781FE980AA4835926E44315F3C33351F80FC27C5A9D9E08CA1F046944AF89B4190C8EEDDEEEEBEAD54F7221CBB75DDEA6E0AD16CC4C2018ABF3B517279B284DDD6A0E669D45CE2D935CA9850949205E83625F57887C0DF1B43955B030AC66B98979992E9E361F0A55228E926B9D4F743F70F3FF4F535B28C900203BA3D40A0FA7CD5F62A14ECB243BD349011666B692A43E37B89B90EB999B52AC961D2E5ACF881A7700221E35C260A088FB846C2CB232A207D323E308912FAFA1EF43D780086FD015FD89D46083235133E02F2431D941AA2A155A243D3E6303010D44FB78BB2418939B2E1075C2AD6A31E91CCC06A14D34DE6!
00A1FD08D08298952F3ED8C6139410D0AA0FA48DCA075225BEE06C90C0DD78!
4D37F102
15A53ACF5B69F265977AD10CD6B41614140CD468D0A6E14CAC02102F91EE64DD03A966D626AB79D6932140D88D733462670D869A111533C3CB310F8520F45F8BAE856509E525720DC100530862595D8E8A75429BA7176A589F4E1B22E80CD44AA9DBAF628B06DC140974CB14937FECDE24084B8D81CD16587B2D8615E88506491F751B52B32F64DDB76FD3AD13B57474DFEE66304985022BA829025D7D9D535AE551FA133C9C8EBF01404B9364DA4FE02F05CEA0C82356A0B89232D2277AD1E9DCD46C2047B347D227241A292A49E2F7F15A55CA06D042FAE33BD6756766626121DD730945936D10F4F8DAFA5E8D754241D0EB79CBCACC335B89C45CF4E8963DE4372118573E94ECBC06D1E9507A34D4CCB07D1F5E3DDC23E1405CD127E5334923136ABAD99DD1A0F4EE1FEEDD96CD9D4B37844A714E4165EC9DABBE51F21EB2019D9BE97CD278ECF22916C07714947DE61641AAE407CB6C8C05C46EA48C0C6CDC452337A95943F0E5A48FF941AAEEA5DBAF33B5FDDA47623DCC20DCB54BBC4B9CA9D521AE1E089CEAEEF8E6C4765D6A649D16AB5E7DF4563E9418CBD109E98E4EB28F1BCF137D2C126894279349C80F6A351B71C8CCA55C66AE10EC2C7DCA47FAA53636177DCA6DCA6D56AF9D6073F1E247172F5EB4B129429BDCAB14D000BCAE2E819A67590BCF827D0C411F2D7!
E4F66A67A37265B6901A579ACAC265F130C21DA2C1A28A86542A1F29E6CBC8190F2D7C1EF48942CFCC7CC99AF2D9C39D3DB7BE6CCCB0B17FE0E0FBF705EA151B7281B057234119EB1AD8D38E73D1D085D6936C003E93DE64EC0209146B5C08D0F853E257FA31CDF1D81A1353C26999BA14638EE01192F72CCA5F3F6B5E8D7A64FFFF65B7CBA4E9F7E04DFA7BB7EEB97B842582B9336C211754FEAEA5A1F48BAD573998AE8E379C01C896EAC46491945CAF882C57A6A751F1FEE4AE53D248959DB1B6A0CFC2BA54ADE924A56DCF0AE5DD17FF9592010FC2C98FED5BBEF7E35FD67FCF0B3EB171385B7BBC18EC44B7572DF0706752DEBDC799561164A7CD565FE95F2EEE06381B1255FFDD5F7CCB7FD92AB24867B3CF1B0169B816542656EE6CCD7D85F4FFD3E9AB6425EFBDFF4774CD3BFF8EAF66DB5442F003301C4A1C65EA9A41B390E832BA5F7EE29D56EF794F76875D43E73F195F1A121E50B8694DD310887B070919AA5589F1BF52960C83E255F31DD786954728A201CF9FDC7FCFD48AFFDF8F3B782E95FAC68977437C20A726AA213F4FA6C3556C3250105E2FD9E4489EF4C2AB322ECC60F8C5846F491186757A9A4BB37DC28B9653C7F48F96D42AA53D216BAE552FDC00D813E3733FA2FF41764BF73764FB44CB477FEC7DB4704821F17AED0491FF4322B00C29D9D8D781!
B3E5BA4EC3E4DE93D56EA292EFADCB00EF102EF5537F2300F015C6930D04BC!
506250B4
26615225F44EA03A5DE20D1672B29B0A5CACC998070E46DDA6E5B68E9EEEE9CF87B84C517365A491F392296ACE01971E9C1837BD20712370242A7C215D0A63356768350813F988FF93B0398872979A06EE0369A7A30FBA8D5E6FB6A5998641FCDCEAE3A8A33F64A752504E1DBD7E8CFFCD8ED07FF781710165E6CAD426B491008833C99FE885CE9A657EA25D46150482859B551539650E3C2525DC65307CB053E7F78F1C400329DC5DFC5A06C51EAB3254A40A49B0A0D0E0BDF452C2E9CB9CE3B7A62F4CC85A716CEA45828EF6FADCACE167439911152535DE4115DFA653796B5B62E5B565950596090B21922D351E64D4FEA00C6F759489052B6DCE30344CD14B979F46ABEA113170067B83D10571DD5AA16C20A5FB95B5ACE8CF389F3B6B45C78F9C79FA75F5E21AC397AB44AE01B010C51C73FFCF09709132A57FF71C98D1B4B262C593D61429554C22426D5BC5FE95A2D79A94394AFF4943C57C9A4AF8CFEF1580F31CCDA36A5AC1F8EF8F6DDBFBB9F8AB62CF6B69C87BCF8EAE71F2F6F7824397A74A740BF3321AACEC9E5DC12170B8BAD95B969870AB6EFDEBA2837B78A49C13EDE29E658A7019784DF9B7793F265009DB4394F792EE1EF3336637163914B02B70456F8F62FF6896BE32CD7785B7EE46EEFFE2E5941238119048D2B3D7C23E4728BDCA324DA1BA5BD06A5A4!
46DC9ADD2D9549D80DD41229F5EB549F996750E995AC4960F5540D4EBCC7C700A90824355F48E9DEDE5EF20DBE487A95B29285AFB168B4F48E8E8723C6213C524B100BD9BD8D2B77B6F6F46C3FEAA67CD0DB7BF4A89B5BD0FAAA1A9A1C4BA8FDA4722CE5ED4100F01E491FDFA64889C6988A521BD801BCA022FA2D72B4850D5A7B593BD0A22B59F8EE11400086793ED1DEF427B6EFFEFCE3C20DED2047BDE084C7CAC69567F4D955D93A69F6FA25ABABE63E5A3D61A09FCFAF3EF344800904838145859AA60CF4D70FF7180420A33F1542F6D4644BC0062D640129632682A0812A6F51EA4A2CFF22980E2B789F8223C80AF6B002412082DE1AD1EA0114BD477BA59A435B3E5EDFA2DFE06C135403F58CE4C499954C3428E98FA60D2063CA018A827BCC085809E121532322F8698194D91E8CD842377AC30868FA5A744A5DE665160B0BD77927AE894B9C7939F1EF6FC31113851A7244579A534E4FEB4E7DAB5ED952F0D75F7455139C9D17098384EA5A1AF8533413F3C0049271E1E6666E14912A64F33EF8EB5E1FAF2CC142D2164A46B716E60AC83476EBB91A56F8F9DB77ED2D2DED2DD75CB64F04417E05081BA025B38F0A12E46863A36E551EEA6D3158FC75D13220F8B8B53D48580B298473110B19B2599BC2F656400DA4E4DCA42C3FA9AFA1F8BB87571A8E1A10D02D8806!
3D3584B8789D92A29139427519E1F836BBCFFF236FDAB0FE02BC3073457B77!
3762A135
CCD33356EEB47EA7A6B7A660FDB20DCECECE1BDAB5AA4724C90D12D6FBF2DBEF4A767F8E928D7858E3D84731AA6675445A7354EA8640A50CA6CD0F98D7A0E91DBFDF1B684AA858FBFDDDD91D103EA2BDF8D78E087EBCBCA2BD56A6EC155CEA714A8872921FAA123FB2D962B3DDC6D9F97587B9FD4174A394AC1B10BA41D2FCB8B18FD74D6E6EE6BB026434E167F0B06AB644FACA78019D9D41924DF149031E442C78E108CB4A7BFB8B7497FF3FDE1650466835346BD2B746258475F518760AF51F3B3BAFFBABB37BC1DC16FA9BBF5EB546D6DD0708C26EF3AD52BC2234EB9A3EE90F325E38F551ABA694F4BDEC7AD83D6EEC5E5C6A34D91FE96412410BDEA65B972DD95F7EFCF8338A7579A658AF96082EED4CC809EBF2D51F128BD7D21FC77CECBE5B23CB6CADD1E8F824246FBB99472866253B3EF595F2429F91D103126E7D66C5C70F57FA0CD96406622D5DC9655841307D66E2CC85EE745FE9DB506ED317AE108A41E282433DB6095DF2D6C6D6D645AFFF83FD85CC961B41D935B92A098A045DB4942F06E3C32B37B7F1893ADAB43E7E355635CD0D241F308483353FACFB073B5E262BFCFC7B4B4BF6E7D17FF996007DB1A296B6B20495B4639C7CA9B76AD90971C16AE7D727D8BB4FC82D5A961B04B6A512CD0FD9C78DECE6E6368E41F6EB10BC8F9F27984198C50D939C527!
EB628E3AD7044F0D54C526E7FF916BAEDE71F01819E16D07F8694D0DAD85BD5AB9434D658A0424DB041BD1676F3332225AF665BCC837CBE4D79657D73E926352BE5EFB67C8976FCCFA650C865AC580BBE855A7BFBB5BFBC7DE467FAAF00C80A3AB0AA20223922E1D04E7DAFBE57D9D8A8ACC9CD9DB0E5869B906D3848694F93FECF9B16FA90B2BF8172336FF93C18F7C62B702826FACCAE20D569FEE31C824110BE65FF050182E0936F050CC2C2F7401DB042576504FAC943555586DEC6C6ECECD643AB6F64BB65575555E9599C4B008376BD1B952D04E4FFA7E28A41DC86A1A8D3AD1E3214B469F170940C1D54085E3AB4851B8E1EF5A0E112E892426829189AFACC2D221C24B77AEA208CA078F1A0BDB307F7B62C598C13088136F55EC32D99FABFECA4A98864CB0424BEFF97DE7B92CCD00C645DA62435640F11666BF2237B3361E298D544F7707AEC39CC11DB1CBF89B1CD81C7F4AD3C47779CCD803C5BE3577A9E16677A1C29F563AEE680A4948AA248919AA435645242DB046A242DA15E967549EA3AFD434CDBE581439C08118E73043946AF77DD258C0BFB6D8E69FBF025CF1FB6F0EBDF7F9BDDD8CCB6A250C6A95443AE27131D9EDF9E4FCE237D2B42E5259E548A324FD2BA5093248934D82A54999E32B8ABC2D0C3F060C7D7D13B367F28DA29160C0208FAEBD6240B8!
B3EBE95FEA38FBB999D518BC22C99166A18768578D6E9AC2EF8EA220A83442!
5BEE05C5
C70B110820780A3E036107C31E53F2BEE0751C71F570EF9DF2D0DD26227BB890CB1828E80159EEEF77BCC165CCCFD9BD71F76CB51665B058D8142D8FAAC9A08DC8DCD579D40A5A1AEB42F3A0BEE77DE2D38F7C5220804B41B70A1F938E43E1F737F4C013191F5411B6DFBD090B9936041035DDE3F1E0C5E18720DD7C1E00A8AAB27BF66AE6B772DC0EC1B401DF659186A70011D0D93444D55B774A730BA2118929E9CC2BC0349165887316F0AE09B7A4060CA6601B3592F69FB901D14DBD63DD0512E3FBDC4F419F277C8EF9B5A30CBB2CCB3289E1D8208B4DD54A631855CD091749DCA29111DB14D4D585D6E7A25851E806F823FAE7B318B252154228361260EB38307AE9B46FF217F23D3B26BFBFA0EF5285CB5B8EBB6428BCDA00B9555E1F045B3D10D1DC545B1319F9D424195A23CDBCEB7B19183A5F2A47902B15A4805E6AB60F85D9BF39AF8E7460764ED09B5067FB7E21C737BCBB7CB9B74B7CB32B327DA41D9AD877BF77F577F05180070305F1E2202685D0000000049454E44AE426082');
+
+insert into auctionImage (imageId, auction_id, data) values (3, 71234567, 'FFD8FFE000104A46494600010200006400640000FFEC00114475636B7900010004000000320000FFEE000E41646F62650064C000000001FFDB008400080606060606080606080C0807080C0E0A08080A0E100D0D0E0D0D10110C0E0D0D0E0C110F12131413120F18181A1A181823222222232727272727272727272701090808090A090B09090B0E0B0D0B0E110E0E0E0E11130D0D0E0D0D1318110F0F0F0F1118161714141417161A1A18181A1A212120212127272727272727272727FFC000110800BE00BE03012200021101031101FFC400A300000104030100000000000000000000000003040506020708010101010101010100000000000000000000000102030405100002010302030406060608030509000001020300110412052131064151221361718132140791A1B1425223C1627282B233D1E192A2C2532415F04334D26373A3168393B37484942527081101010002010302060301000000000000000111023121410361045171B1123213E1224223FFDA000C03010002110311003F00DFF4514501451450145145014514501451450145145014964E4E3E1C2F93952AC30C62EF24842A81E926AB5D55D77B374D6248FE7C7979A874FC140EB24CB7E1ADE256D5A54!
F3E55A23ABBAFB76DDF27C134B2A000AB491F96109E6B1C00B2ADBF19249AB225AE8EDB3A8765DE64961DB331326584069635B8650C4852CAC01E36A93AE5BD9FE63F55F4EE3A60EDD938FE55C12A71D1CB13CCC8E815DDBBC9635B4BA6FE6BEEBBCC6D24DB07E445E1972E19FC25D45DAD1326B03B7D1DF4C196D2A2B4E6F5F31333224231672ACBC55216291A7EDBF36ABB7CBCEA36EA2D8964C9CA8B2736076498C6EACC50B1F2DDD5492B71C38F3B52CC12E56DA28A2A28A28A280A28A280A28A280A28A81DF3AD3A57A6C94DEB75C7C597FC82DAA5FF00DD47A9FEAA09EA2B5B657CF2E8483F91265E5FA61C6703FF003BCBA6D1FCFAE8E720362EE280F69810FF000CA68369515AAF73F9EBD3B876183B766E6330B82EAB8E9EABC8DABFBB50C7E7FE41375E9B1A3D39A2FF00FC0A60CB76D15AA76CF9DF8392BE66E5B0E76240085391094C88C16171FE5B721D82A4FA9FE6F74D6D1B3459BB3E447BB67E629387891B5B4DB9BE57DE8957B88D4790EF04CC5ABA93AA764E93C03B8EF792208CDC4310F14B2B817D10C638B1FA876DAB9FFAAFE6C750F567998FB7BB6D1B3B12A208188C8900F09F3E65B117FC2961DE4D54776DDB75EA4DC9F75DEB25B2B2E4E1A8F048D2F711C29C910770F6F1A4042A1FCC43A18FBF6E4D6FC43F4D590B5E431884EA886827995E078!
F7D28C0B1D4D727BCD16717F1281EA3FD358B391F7AFECFEBAA80803D14A62!
6EF91B46
5264EDF2BA6546750086E0FEDA9E16F5D36725C589B03DDC0FD3483B244342003BC7F4D07999919D931159B234A7F94BEE9FDAB5AF5B23FFE7FDD22DBBA9770DBB2E68E21B8632F91A982892589F822DED76D2E7856AD7624DCD25A8A9041208E208E0411C88A2BBA68AE70E95F9F1BC6D18D0606FD88375C78404F8A57D195A7B0BEABA4840F513DA6B7D74EF50ED9D53B441BD6D3217C59C1E0C34BA329B34722F1B329ACAA568A28A028A28A02986F3BCEDDD3FB6CFBB6EB3AE3E263AEA776E64F6220FBCCDC801CE9EC8E91234B23048D0167763600017249F45735754F50E77CCEDFA6876FF30EDB8775DB6153A5145CA1CB9458DE47FBA2DC17877D04AF537CE8DFB7AC56C7E9CC1976AC63A84D98E43CE47604D234C7E9E24D6B04C1CCDC1E6CB5864CC78AD264E490D2E8D6748795ED65D478788D5E13E5D67A2049E7982B5B4C4A596307B2CA0F1AAF4B9F9B89B7E5EC3F10B1E0E166CA9262405109981D1E7D8FF38022DE23E1AD3286304C3DE5361DDFD54629C7F89920CB3E5A18C490C9D9AA3BB37AC9E02D565DBB71DDA1D9E464D8F0B70C04631AEE2F1E96591CDD7CC7F30316E36B30E1DF503B8E124980AF9457E2148D4C82CACEC7DD5F4D0CCF8AEB16FF00D3187852C7BAEDB90B2C7043E764E24D1CFA4C97F0C7165A8D1C54DD751A4F23A97A0F132A4276!
F9C478615668CE263B5CB02BC4F9DC4926FCF81AA218321E026F2B248DADD8BC6EACC2E2E75D9BB7BE99E4E0E74BE74D279ACB29F3257214036B9BDC31E1C682F39BD65B3489E4ED1879AD3411B471CF3C90E3C68641E12F1E323B48539AFE60AA9A46071ED3CCF69F5D4E6DBB2E3626D58D3E540F264650F38330B8D04D97C2A4F136BF2AC644C4BD952207BAC07DB4C2749C4450B0ACB59A732C517646A3D2B71F61A6AEAA395C7D7FD1555E137AF2BC8C79B2794846BEE26DF6D2B247E502A38B7227FA281BC8FA780E7DA69A352D25C70A41AA2927E548B1A55CDE9BB3807BFD028053C6DE822B71FC81EADF81DDF23A572E4B63EE43CEC30790C98C78D47FE2463E95AD316919B87D03D34F7026CEDAF331B73C162995872A4F111CF54643034A3B9A8A8FD8B76C7DFB66C1DE714FE4E74293A8EED42E54FA54F0A90ACA8A28A2835A7CECEA37D9FA5576AC672997BDC871B5036231D46BC83ED164FDEAD25D21BCEEFD2396FBCEDC60B245E4E563E490639632DE65B4DC3020F152BF655E7E770C9CAEB0DBF1E4BFC2C1801E207DDD52CCE246FA23515ADB7CDA63DACE3CA26975E44624D31101403702F70D7AD49D12AD9BBFCEADFB75832B140C0C28E54F2965C68E433C7ABDE7865672755B85C2F0ECE3540974CDE5C30466281486676E0EF637B05E6013CC9E269B43!
2438C2D047A6FCD98DDBF457AD9A40366B5FF0F0FB2825866AE26385202B5D!
999A43C2
E493C1071350B9BBC34AC7CA25DF9099F869FD841C1699E54E5C902FC799A683B4136BD2986C1E82E988FA8F033A7C9CD971E0DB93CFC891046238A366203BB49A99D9F43E9555ECE278D36CEDB1303758B6E973A3976BCA78AF9E9658DA266172EAA5BCB75E2B22DF8536E89EA2CCE9CC962029C69884C98278FCD8A48CFE38CD8929EF211C8F7DEA6F76DCE3DD53142C28B0431B2C6C57F32457919F5CC493A9BC46DE8A764BCAFDB0CF8437D6DEDD91F6ED9A093314232905615F2608D08278B16BD38EA6C0C1DBB33718E2C78A78362DBE7C861240AE24DC379C86F868A4E57F2C38D1DD5A68E1AFC4EA5458E2009F3233A1B570FC2453819BBB61FF00D26EB9318F3239B43B97532424344EC1B9B211E1BF2A0D83D41D010C599B7EDFB7CD0634E71944EAFA990AE247AB3F70CA983111E991B40402E6DD955B9FA177DF8E970B05E1CB54C38B728F29253145263E412B132F9FA74B330B6935190F5DF58E14F14CF9706E0B0AE4C7E565C48E92266B0972525161AD64717373EAA17E65EF4B3CF36E3818F9432F271323256CD1A98B038E3E246233A5215201B01CF99A08EDC3073B66DDE6DBF3BF2B2F124F2A78D595C060037065B83C0D483462DACDE457173A8F107D07B2AB99FBFB6E5B864EE59487CFCC9E4C99AC786A95CB902FD82F615350F53F4EAC0914D899ACE!
A2CD22CB1007F7741B7D34C9837C982C0BC675A8E63932FED0FD351D2BA20BB1B7701CEA465DDBA7B264508B990A936676F2DAC0F3365D37A75B547B3ED9BBEBDC9E0CBDB322190E267B248C8AE002AE513C5AD48D24106C7E9A2ABE46A1AAFC08B803BBD7590C6636E1607881DE0D3BDD25C2CADCF2E6DB11930A595A4C7575D074B73B2EA6B0D5CB8D2A64F2F0F195C6A50192FDA2C6FCFDB40D5200BC7B69655038F60AC93437B8D73DDC8D1243E6A34478123977F6D04EEC5D6BD4FD38AA366DD24871D6E463330960E3C4FE5497517F45AB717447CE9C4DDE78B69EA88936FCE908487312E31E463C02B87E3131ECE247A4569DDC7130BA736DDBA195E2C8CCCFC54CD974D99214909F2E21DEFC3C5DDCAA2B76C59E1C3DBE5C82867CD864CA6547570B1960220D637562035D4F1A83B468AE7FF0096BF3A8624583D37D50ACF1061041BB6AB945274C6B90A45C85F77583CB98EDAE80A8AD17F37B2C3F5A62624A584306DF1B89109568A496697C608BF30801AD7DBBEC53661494CAAC54594B4416EBDFAA1F09FECD5DFE61B09BE6367A37111E2E2C76FDC793FC75599A59F0243F08EAD09E2D8D28D519FD922C50FAAB3B6BBF3E3DB17BCBC57ABDBF9BDBE3F5FBAF17DD27E3BEB99BEBE971F94FA2AEBD2D9321D31BA5FB000DFF669A6E1D3FF00EDCA1F3B2442BD800!
E27D43813560CFDF3708D4B40B163771505DBE97E1F5552775C89F26633644!
AD2CA49D
4EE4B13F4F2A9ACF2FF00ADB1F2917CBB7B297FE3A5DFD6DDA4FAE4CE768359106A651C9A4E67D82B38CF951875FE639B06FC2391B536A908317CD1196242817D2BC58DFD57B0AE91E4DAE6E7127C8F36E8834B6278801549E3E3979B7B16A7A6961F308D6156F65B71B01651F50A8C8E3754F2D621123789BC5A6FE963727B294455001D2835701DFF005D564BB48AFEE191AC09711A8240ECFC74D32F1E4867F2A49D9C0557678665916CEBA829310E045FC4BD87853C8A4C8818B63C8D130209F2C95371C45F49ECA4242D2316909673CD98DCFD26985CA365C6325DA299DADCC17D4413DE08A61262E42936BB05EFE753830FE2658E252AAD23045776D2A093CD9FEE8A4F2B133701D5332162928D71483EFADEDAE36E522DEA60CABA6E0F1E06BCA979E1C778C3960437BA4733E8B73A6498524CF64B2802E7511C07A871FAA98536B8D36B7A6FDB4F30646659316E6CE35C63B9D471B7AD6F4DE481E3731B8B3AF31DE3BC5630C86195251CD1835BD541669A4DBDF6BC248420CB842F9BE55C5D5C36A12A9E4E8C398F794FA293C85276DD43FE54BFC429028AACCA0F82FE027F09E2BF51A76AAD2EDD9F18F7A38D66007721B31FAEAA23E26BFB2A4F19FCD0219399E11BF71EE3E8A6381B66E39302CF0A44C8D7B069F1D1F877C724AAE3E8A95C7D937B747923C279444A!
5E4F24C7332A8E6DA2191DAC3B4DA886992CD2E977E33E3AF971B3712A973C16FCB49351933B9F05F9713C6E4FACD4BEE31B8F87CA0418F263D60AF6904A37D9508CA16503BEE3E9E1453766209B7672F65769FF00BB0FFD09FEF9AB87FB4FC5EAF4FC3F995C5D23799202AA07002DEAE17ADD1B3754EEB9FF00253A976D9A7FCEDA0E2E24130001F84C99624F29BBFC1AD2FDD52871D767FF00D91BC1EE5C503FFB74FE9AADE6CACA64B0F7869B8E24036E3C2AC5D7DE1F98DBCFA5314DFF00FA741FA2AB196DC4F6FA3D35A9C337957B2CBAC0DAAFA59CE807BAC2FF005D56B36E640A05C9E42AD39E8D31080F0ED63D9C6BDC6DA7216D2C51F924F0F3E4035907F086BE91EA5F6D4540E0EC92CBA24C90555B8AC63991DEC4F05152E9008D34C68A80B5B48600D87E2BF1A903B6C03F9BAA43DA599D87D1A94560F8F8518B79641EF52C3EDD74C19346571E631040FBCDEF0F628F7BD66B12C411A8942C3803E295BFA053A5C7C3907872D2092FC17255910FAA784385FDF503D3586562E660BA7C54463F387E4CA4ABC720FF00B9C888B46FEC6340DCD9542B0F2C1E5127163FB46863DB25947DD51C58D0AA782422CE78B16E2DECEFAF06924F9635B1E6E68002DC6D74EDB8FB694F87132D938DB921248F65F95266C0DCF89FBBB2958DDA33AB80B5B52DFEBA08CCB87CA1!
ACC292A837915810FC3D208FAE968FFD4188E38690B831C28A2E7C475140A0!
5EF7EEAB
2614E89219D50491CAA22CA8C2866786E1995351166E1DFC6AAD91E561E53E461078B0DA40C149BC91E9374901E3E2068161B51DD70669B1640F978C430C75167F2AC4B49AB9691DBDDF6D79D75297B5997848BE9FC5EDAB3E6678CC396B32FC0C732F018C9E689A4D5E643F14D248AC4160DF9838F1E56A63B6E141BA66C8999998FB608A0999A69C111C8D1A16487C1F7DED607F4F3553CD8F728F6FF23709618F2156192178A6019091C05C107B34D39DA63F3F731005B266C534010DEC04A8CC9F4102D515B33C1108C6646F2E3E3E5413CD14640778588675427EF32A70AB01CF824DFE3CFC7F063AE4234234B4768C3F01A646765F0F31ABD5C2818E149B03ED7045BB0D590259926F878819E38CE9D2753695621C31009E54B8936C89E0C8DA648B172E3895FCD00C2F1CDA1445E5BF8ACC928D4E6FCAAB9BEC1F07BEE7C086CA991205B1E0416245658A49B5CF77D34173EAA9B6ECE497376950B82372CC4C6B2E90639024A0AAF62B36A603B01AA5CA2CE0F2E3FA6ACA9E3E9A9C73F273A17F6490C89FE1AAE640F6F6D0618D0B4B2CF1C6A59CAF840ED3AD455E3A61E51D11D758A14D9A3DB18FA1C66AA5BEBAA463BBC5933BC6C55BCB7B11CC71156CD932A4C7E97EA6C4D47466E1E3CA47EBC1B863056FA246A0BD7CC65D1F31B713F8F1F11AFF00FB32BFE1AAB4E!
924D3886152F2C86C91F227D7E8EF356FF9AC9E57CC067E425C0C77BFECBCC9FA2A0E29136EC6932FF2D7265505E69BF9704646A50C058B337BC11789EDE1567097932931F6FD8D03E537C4E7B0D41540E17FC01B820FD66E26A1B2773DC72C9F2408D4F644A656F6B9069093738A595A4C388E4BB125B3F33C4CE4F364887814562D919925F5E4372E005940F60A06B90B9F62D2CB94BE9D2C05FE8A6666C9D568B3C920FB93007B7B6AED0B745CF04693646760E5363812CABAA655C90A97741A8DE366D570470FA2A337DDAF6E85227C2DCA3DDA395995D1E3D0F1D8075FCCE1AB9DB5055E3432AC3E7E545C72A10CBC3F362F4FD5D94F307779B1D1D31241262CA41C8C3906B864B7F9B0B70BF730F10EC34DDF1A44623158863CF1E437BF0B781BB787B7D34CCC0B331931AF0E429E31F2E3DDD96B0E77A8AB4418906E71993680C66894BCFB63317994282CD2623F395140B943F98BFAC38D350BE72A287015B8AB8E4D7E5723B6A130F3668E6492366832E160E8C84AB065370C84710473AB5CF9789BC629DCD42C3B9060BB9632AD9272C0FF00AC8828B2BF0FCD5E00FBEBF7851114A6FE1896C396B3CFFAA8E00D97C6E7FE3852D28F390967B18949371EFADF9DFBC522A4B02221A40F79C9FB68178A67C77125AD13358806E14F3B561B9C297F88400C5370917B357!
F5D60045AB410CE18789870B1B731EA34BE1FFA88E4C29BDE3E1F511EE9AA2!
1A1495EF
8719FCC881747B78DA01E3B03FAA45FECA4BCC4D1A23168C8E24F16614F61963C4C869F220F39E28E787CBBD806951A20C7D08C6F51AA34D81E361C6A29CE1DD629C5EE5102DBF6645753FD9661ECAF336738A4C4FC64EC00DC5BB0DEB1C79C45E7B15BFE5116ED2C1B40FE214D2139AA8D343E388717516702FD8CA79502D14F3E44DE64F12C80D831616361E9A934DBE392369B0B8941AA484FBC00E6C3BE9B99124C44CB8134293E5CA8392BDAE3D8D4E766C87833B1F207882BADC7E25274B29F58341258773B06E8BCF4CB8725FF007A44FD355DC91CED56C971D70D3A8F0E2E31C3242A9EA139B7DB554C9E47EAA04A1FFA89BFF0DFEC156CD8E113F4D753E4123FD1E0E322AF6DE7DC31F8FD11D552117C89872FCB7E27D9574E99889E88EB99FB160DB23BFED66AB7E8A0D8DF37B18B75AEDD213A227DB899653EEAA4133B3B1F507F6D6A4DEB749378CDF868EE98501368EFDA78F8BBD8F363ECE42B6BFCFBDDA1C7CBC4C5880F8818EDE73F6F965C388FD45D54D69280F918BADB8BBDC9EF24F3FA4D2702423D523F918EB723DE6EC029C9C350006BC8DDA5AFA7D8A2DF5D3EDBB0BE1B0D4BF19651ADCFAEB0CA2224200F19ED3F656B1D1E6F279AE6EBAF493BA2E6C7C241F99A40FD58D0FF001014D81C243FE9B2DA07EE652A87D762E9FDD15ECB1BCD2E917676F6!
9F6D2F89B54790EE919D663FE6CA6C114FE1D4785EB17A2F8F7DAFF24DA61611672A856FE5E4C67F2C9ECE22FA4FB6D5E4D8C677F2D8E9CB1FC89B979B6FB8FDCDDC695936F748DDB1D9254E22489486E5DA54535C77560312427CB63681CFBC8E3888C9FE13ECA4B97794D2689B257CC50572A3E6391B8E63D0072F5FAE9C6DB9ACACB3A1B32F86551FF1ED14A65066033748F35088B2D7B18FDD73E86EDA62E462E62CC0FE54DC24BF3E3F788E16EFAAA9D94F96CB2456D37BA70F0F2E2BEA20FD158CE9E2598D931E5BB46A87EEF6ADBB08ACF1D5A681E0E6CA4691F4E8FAEEBEDAC1151F1A4D68CF242434416E4056367D407603C6AA305D4EA51088E2E275376D877FA6948E4D3950CFE66B325D5EFEF02A6C357AC5607924B3B6AB70F2BB6CB6B03E822B290388598C3A3CA915F571BAA9F0E93E837A832DFB18459EC40F065C4265F59163FDE5A80B5CDEAE1D4281B0B64CCEFF003616F63238FE23552B69623B891F41A0418E99651FA84FD256B3D95A3F8F09331582447599BB9749607D840A560556C99CB0054461483E9E3FA2B38704487C8490A2486CC02A8245F916BF2A294DADE2381BBAB0F04A22F201EC904A185BF775539C068E0956561758C863E9B710BED3484FE5E1BAE342A1D53BEE45FBFD26BC123CAC0B72EE1C00F50A09CC795E7DB77A9E537925F2!
1D8FA5A6D46ABB93C6E6A7F1386CBB99EF38C3FBEC7F4557F22F7B50248409!
A6D46DE0
603DA456E0D9BA5372C0F92DD49B84B8B27C4EEEF8B3C38E14F99F0B8D3C4DE615E76B6B7FD9E35A7553CCCC48EDC5E554FA580AEE9F2C7C3F956E1A34DBD16B54A398BE74CFF17D6B99149ABCB8FE1E0B2F16D3652DA477F1AA66E3851E267C185148F225E124C89A1AEEBE615B71E5DF571F9D50B63F58EE2E2FE2F879D78DB9AA76F67106AABBD3E9DC31F2480B718F215120942F0F2CAEA1DD6AA2CD3A853A4725F081E81C2A1F3389B9F4FD75313B02DAAFC0F1FA78D4365F6FA2E2BAECF9D223D51CA49E5FF32421030E617B4D4AC9819102E26DF8EDA0C807E61008506DA9ADC89E35E74F498072333173DB479D8EE31A4EC128E201F5D259FB9CD9D8F143190B2C17B30E0483E13CAB8DCFDD3E1DDEEF6F3C7FAF6BB5C6D8FEBF3EF2B0CDC59A193831F28314138035AB0E4D7502FC7DE1DD5079035F97311E5F9C0A49A7EEBAB5B50FD96B1A9C8B2258D089889E420E88549625BBDDADA5477F6D41EE80E3C51E331BBC6A59CF6966E24FD34DF6977B759359DA4E8B259C9EE332E498CCC005CA071B20760727483EC6A8E9E076C7971E41F9B0B30B71F7949BFB787D752BB36D93EEEDB962C32C70BC18EDB806975043E5A8D6BA941D2C59469E1C4F0ACB738C1CE192A2D1E763C1976E36BCD1F8FDDFD74AAD30D85CE49C75BF8A7538E4FEBDBC07FB616A412364DCB!
CB864117C402A9211C144E97048EE17E3509B1BB6317039E364AB8FDD607FC3567DDA358777C7503DD6084778599D07F76912A091748758D448EA46A9BEEA8E2BC2FD87BEBD7F2FC9C8FCE666D0A4920D99AEBE1FDDEF34A4C024932321C650E4261AF3E0DEEB7ECD6190645C79752A0044519516BADC823DA40E35448EF3287D8F678CFBDF1129F669415556605D8F7927EBA95DDB2BF2B060BF08237948F4B1E1FC350909D72017E1CCD45384BA2B13EF4AC5ADE81C07D94F713C0AF90FC028B0F5D618F8AD396773A631EFB9E40770AF32A6125A18B8429C17D27BCD03566323B4879937A5A3E7EBA480B52D18B9A099C736D8F3CF7CB8E2FEAD66ABF3F16F6D4FAF8762C8B1B6BC98B87ECA39AAFCA497EFE200A053688BE237CDBE21FF00332E15FED4AA2BB96B8C3A1B03FDC7ADB61C68EF66CD819CDAF6D0DE6B7D4B5D9F52F2AD0BF3FF00672B9BB7EEEABF97970BE2CAC3B1E33A96FEB57FAAB4F48B1E46CF0C8AB1C52C5FE9E650E5A42070491C1E5E25B57597CC3E9AFF00D55D2D99B744A0E6460646113FE747C42FEF8BAFB6B9331C08F38E1E4C871F1B2C94C8B8008900F0AB92090350E356254FEDF9C3336E8A427F31079720EE65E148E51B8BF7F03E83D950D04B3ECD9D2E2E48B293A651C08BF638B5C71A909661CC1BA9FA08AE92E67AC79B7D31B667151!
D33B236A1C181A45B2622DE65DA197B597883ECA73347E60F05DBD5EF0F67D!
E151B243
25C85B311D80D8FF65AC6B1B1ACB0E9F779954A8C86248B12A2C7E9E3516CF265CEB1AF391801DE4936E359B62CE4710101ED623EC1763F4539860F86000FFAA97C1129E05750E3237E1B0E55CDDF58B1F4A4D0C5BCCB992A66490C3039276E04CAA1CC881DADF734B71F65259C41C5D94837FF0042D1FA4AC7952AA5EDFAB521D23911ECFE76E93413BC12AAC71CF085D3114D2F8ED3860DC18C40F2EDA85CDC8E38A8E6E71B114C9CBDE919F21B9FA6415BECBDCDF6C177CCB0F7A6D23D773FD3564DDF2125DE636D5650E4B37E1024663501B327970C72C9FF003243337A81FEAA70990EF912E4DC068D4952DC46A6E1CBB4F13483D2C59A46562E2573F9ADC657E24DC0ECBDE9B65B20686254D06E65604DFC3C93F4D2DE18D4BCBA82A8F1B8E7CFBFB3D0291DA767DE3AA3735DBB67C67C9CB9FEE2F28E21C2EEE7C28A395CD15179B399646606FE610A96FC0BC07D269FE0E0A431879AEEEDC4A2F1F65EBA3FA13E4D6C7D3719CDDF638B76DDA54D0C2440F8D0A91C5228E40751FD7617EEB558733E57F40E69264D8B1A363F7B1C3407FF002192A6472ACED24A0269288392AF65346465E7CBBEBA6B27E487464B738EF9B8A7B04791AC0F64CB2542657C83C737387BE48BDCB3E3A3FD68D1FD95730C39FE948F9D6E4C8F90FBFA5CE3EE18338EC0EB2C44FD024151727C!
96EB38CD93170E41F89726DFC6829914490E9D8D7F5F289F5E98C7FDAA8DC2DAB3B74CE870B031DF232A636871E21A9D8FABB07793CAB6F6D7F243A972DD23DDF2F1B6EC356D44404E44C6FCF4F0441F4D6DEE96E89E9FE90C7316D18D699C5A7CC94EB9E4FDA73D9E81615326156F963F2B60E8F8C6EDBAE89F7C954A80BC63C656F79233F798FDE6F60E1CF6551454515CF3F3AFE5F360E54BD55B6437DBB31BFF00C94683F933B7FCEF4239E7DCDEBAE86A4F231E0CA824C6C98D658265292C4E032B2B0B1560798341C5EB2E3EED847133DC47B96329F2324803CE516558ADABC44F6F0E14C4FC560C870F363789D403A1C10C011707D208EDAD9BF327E5065EC0F2EEDB046F97B2DCC8D125DA6C4EDF4978C7637676F7D51A1DDA2CD7D1D469F121C24699A01BA2EABB35D4DD48BDF8037E55B959B3B544BCACBE21C47630E55E7FB9B28B31D407E2B1FB6F4E8C788D2C8715D8C3ADBCA2DEF14B9D3A8AF6DAB35C78CF320FA74A93F652F5666B8E0C06E3953DD31A32C7F101603D7D82A4368D967CD96DC6432DC48F7D21C0F118E326DE1FC6FDD4B22C09CD7CC23906F77E8152FB46E93451E746618658A64119C99515840476202ADAF503FCAFBDDBC2F5246927BF4C9B56D2BB1E34EC51F8E69471E5B9215F5268B7874586961753606FC2A86E25CE9CC2BC24CA6D4F!
FA912FF50B54A6E595267E418E2064762491704DC9D44B30E172C6EC7E8E00!
52F8F8F1
6D90B49211264C9C5CF2E5C947728A53835CA2B8C8228C58800003B07203DB58C51E845436B93A98DF8EA3D9ECABCF45FCAFDEFAC265DCB34B6DFB493ABE2DD3F325FF00E5E37ECEE73E1EEBD6F6D83A03A4FA6CACBB66DC9F12B6FF00573DE69AE3B43C97D3FBB6A995C342F4CFCA8EA4EAC923932236DA768E0CF9592A44920E7F910B589F416B0F5D741F4BF49EC9D21B78DBB65C7F295ACD3CEDE2966702DAE57ED3DDD83B054E5151451451405145140514514051451405145140514514056BBEAAF93DD35D42F2666003B46E0FC5A4C7506176EF920E02FE9522B625141CD3BA7C93EADC07271F1A1DCA3EC970E511BDBD31CDA38FA89A853F2F3AA62243ECBBA0B73D312BFD62F5D61455CD4C390DF62CCC47D12EC9B84928FBB930CC17FB11A2DFE9A798FD29D5DBC1448367CC310E11A240608941EC06411AA8AEB0A299A61CF7B57C98EAD9BCB191F09B642FFCD2EE669547EC4434B1FDFAD83D39F283A6F6678F2F742DBCE7A1D424C816841ECD30025787EB5EB61D14EA74780000002C0700057B451514514514051451405145140514514051451405145141FFD9');
+
+insert into auctionImage (imageId, auction_id, data) values (4, 73219532, 'FFD8FFE000104A46494600010201004800480000FFE1122B4578696600004D4D002A000000080007011200030000000100010000011A00050000000100000062011B0005000000010000006A012800030000000100020000013100020000001B0000007201320002000000140000008D8769000400000001000000A4000000D00000004800000001000000480000000141646F62652050686F746F73686F702043532057696E646F777300323030373A30383A32312031343A32373A3533000000000003A001000300000001FFFF0000A0020004000000010000019BA003000400000001000000D30000000000000006010300030000000100060000011A0005000000010000011E011B0005000000010000012601280003000000010002000002010004000000010000012E0202000400000001000010F50000000000000048000000010000004800000001FFD8FFE000104A46494600010201004800480000FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0!
E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005200A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F2A4925A3D07A657D47A9574E4BDD4E1B4EFCAB9BCB6B68DFB5AE77E8DB6DDB7D1A3D4FD1FAAF4948B1BA5E5DF5B2FF4CB71DEE2D6D874DC447E8E907F9DB773B6376FE7AF51C5FF00127!
D31D431F959F90CB5C039EC68AE1B23F9BDD0FDFB3F7D0BA074FC1EA3D7FEA!
FDADAEB7
BC576750BDB53CBEAC7AA9366374CC0A36FE8D8CC5C866FB1FF004F272FED17FA8BD41D05A41E0E85016934347E78EB3D37EACF4FEA57E150FCCC9AE976D1901D500E8FA5FA3D9FBDFCB59E71BA3983EAE5563BFE8AB7FF00EECD2BDE327EA3FD57C876F7F4EC6DCE3EE22B689FF3550BBFC597D50B2670437CEBB2C61FFA366D44D742A1E2F92744FAA8EFAC19A70BA5E656DB830BC0CB6BA998E5ACF47ED9EE566EFF0016DF5B19D4ACE9B562B322FA982D2EAEC6B58584EDDCC7E41A3F397A6E0FF8BCE8BD1FA8D3D4B02EBF19F4B8101F6B5CC3FC83EAB3F3BFAEAF7D71BAFE9A707EB062B1D63F12DF4B22A6CFBE8B47BDAE89FA16358E6222BBA0BE2DD4BEA67D69E961CECDE997B2B60DCFB58DF56B681F9CFBB1FD5A99FE7AC55F5074ECEA3A86155998E7F4768DC01E47F25CB99FAE1FE2E7A47D62A9F7E335983D53E933258D86D879DB975B3E9EFF00F4FF00CF33FE17F9A414F82A4AEF59E8F9DD13A8DBD373DA1991491BA24B4823735EC710DDCC72A49294924924A5249249294924924A524924929FFFD0F2FC5AEFB2FADB8EC365C5CD0C686EE971706D63619DDBAC735ABD1BA9399F57BA158336BCAE9DD67298D193877B1991D3F35FBBD47DB5BAAF528C6B19F4FF0056BB12DC67FF00825C57D5FEBFD4BA35EEFB13ABDB73AA7D955C03AB7BB1EC6E5E3EEF!
A2EF6DB5FE63EB5EB1D1BEBB7D5EFAEB8F6F40EB58DF63CABC167D9AD32D7BBC71AE7358EAF26B77BDB5BD9EA33FC17AA929F3DE81F5DB27A0D8D7D14B0B9CD2CB6D2497EC25EF6D6CDD156DAEDB6DB7659F9FFB8BA7ABEB97D69EB56D55F42EAF88E7DAE6B3D2CAC618B60793ED67E91D9B8B639DF99E9E57AB67F83A571BF58BEAE370ADCBB7A4B9DD43A560D82AB7A835CD700F7C06B2DAEAFE69ACB7753EB6DF4EE7FF00C6D6BA9FFC6E32E9E8785D5FA1BFD5EA0719B6E7F4CC9009B5B645AEA7D2FA2EDBF43D37ECF576576D7E9E4A14B897A4AFA5FF008D605C6CEA186C24C9347A6D9EDBB6DDD3EEDDFF0081A164E17F8D5A585D57560F7766BF1B1CB7FEDCC7AEEB3FF65D59FA9FF5D31ADC22DCFC8786565CC2CBC39D7E3D8C69B2CC4C9B3F9CCA6ECAEDB30F21CCFB45955575791EA5F8F6D88D9DFE367EA66201E9645B9AEEEDC7A9D23FB593F67AFF00E9A5C28B79637FF8CACACB6D5976F4EC8CAC72432BC838CDB59BE376DA7F43733D4F6FE62DC2EFF1B6EC66B0E3F4DB00FCD6B8877DEDB5B5AC7EAFFE383A3E638D23A10CFC51AB3ED8E634EEFDEF4BD3CA633FEDC5C9D7F5EFAC62E4BACE9CE763E2BB8C37D8FB58DF2AAE2E664D4CFF008BB91FAA9ED70F03FC6431D6373B032763DFB9AFE9F9F463EC04FE65173B2287FF009957FC23D74383D1BEB438!
977EDCEA18959E28C9A30EEB1BFD6C8AFD7A6CFEC2F3FA7FC65F5A7B36E3F5!
07E15C7F
3729ADC9A4FC323D3FB551FF005C6DFF00F09720E4FF008CDFAFD8CE1EAE4561AEFA0F6D35398E03FD1DAC6B98FF00ECBD222FAA2DF42EBBF519FF00582918FD47A8D793753FCDE43F19ADC860D7D9EA635B8ECF49CE3BF63E85E57F5BBEA1758FAAFB6EC8DB918563B6B32AA9DA1DFE8ED69F756F42CBFAF3F59F2BA81EA2FCD757710D696D5EC6437E8FE899EDDFAFF3BFCEFF002D747D27FC6B5D662BFA6FD65C56751C2B9BB1EE3A3A3FE13DAFDFFE6FABFF0008950517CF2125B7D7713A251D5DC3A4DEFB3A5DA4398E30E7D6D31B9BED73BD5F49FF00BEB2DE4D56398ED966D301ED00B5C3F79A9290248CE752EE6BDA4F769D3EE76E43DADECEFBD25314939696F29925292492494FFFD1F2FA1F435978B5A5CF7571491D9FBEB76E76ADFF0004DB5AAD559F5DE68AFA8B4DCCA346BDB1EA160FA18F63E5BBEAFCC66EFD2D15FF0035FA3FD12AD4FA1E95FEA025FB07A2418876F66E96FE7FE8BD441060C8E7B24A767EAE75AEA7D133EBCFC6F7556BF65D5DB269BB8DD5DCDFF09E9FA8DB3F7E9FE714FAB7D69EA599F59EDFAC547EA19C5CC2DF49C4EC7575B31FF3BE9B2CF4FF00495BFD9FE0D49AC3D4FD3C4AF26AC2C0C66329A8E4EE0D75A1BBF21CDF42BB9CCDF77AB75977F35456FF00D358A56754B2B73BA37D64C365B550E0CF56A6575E5D247F85A72696B5B!
9BBF76FD994EBAACBFF0007755FD2101AAE2340F43D5722AEB9D25FF5CBA68F4729BB31FEB160D26087021D8FD4F1F5F52BFD2B2BB6AB3F7EBFA7FA1CBF578DEA5416DC5F688B5C03ED0C1EC70780FAB2AAFCDF4721AF6BFF00AFFE62B26BCEFABF994F50C2B5B938974FA1920134DF5F17E2E4D4EFE43BD2CCC2BBFF003D3E9BACD2C77E3752A5B895E39DDB5EEE90D0E2E2E6171B72FA1DD646EB5EDDF65BD3BFC27AFE9FFDCDFD1943CC4D5D83BEF1FDC9035FEEBBEF1FF9147B71F0D8E206438C1E3D321C3FADB9CDF72116E30262C79F0F601FFA31252FE9B5EDDD48712D6CBDA60989FA4D8FCC6B7E927A72EFA1AE631D353FF9CA9C258E8FDEADDEDFEABFE9A835E2B707D6E70734C830041FBCAB7938953B0EBEA14BD8458E2CBF1EB906978FA1BF7B76FA7930FB29F4B7B3FC124A693CB49968DA0FE6F31F04C9E59E07EF1FDC9D9E96F1EA077A7DF6913F88494C525A2DC3E965A1C321E416CFD1E1DFE8FF00F3352FB2F491CDD61F648E3E9FEE7F57F9699EE8ED2FB1B039399D78B1FF008F173125A7E8F4601DAD84C0DB2401BBF3F77F27F7522DE88D0E80F710D1B65DF9DF9DC7E621EE0FDD97D89FBA1EB9710FF0DA75D22D67E89D36807754ED376BFE07F7FDBFE0FF009CFF0047BD01C04E9F72D2EA38FD3862E3E4603A7DA2BCAADCEDC7D5027D6AA5B5BDB!
4DCDFF07FE0AD59B04F6253C1B6B1146BF259252D8E3DBEFD14488307FBD14!
3FFD2F2A
486841F04921CA4A7B4FAAD8B55F5B7A65B7370EDEA543463E53B4DB6B2E666B9ADB0FB6B76462D4FA77FF84FD0D4B03ADE3E5D4EAABCB66CBB187D99F10416B3F498EEDEDFE73F4166D659FB95AD1EAA2A6FD5AE916CB9B5E456F6D9B359752E7575EF9F6FF39BBFEB6B0EBADD6E15EF3681F67756452774B83B757BD9F99FA2F6FF00DB899106C9F164911407806FF477752A70B22DAE819BD32C77A59B86E3209DB35DCD68FD2537D7B9CEC7CAA7DF5FFC47AD558D8D9548C4662D59AFAA96DEEC8AD8E66DB28B80636AC9AADA9DFA6DCDAD95DBB365BFE169C7B16762E5E4E1DA2EC6B0D760EE3BF939A7DAEFED21EC7B9A6C825A0C39DDA4A70E2B3755D169E1A1577FA5DBE8F7F8D4749FF18D762372F2DBD2FEB1555FA792FF004DA59962BFA36B18D763B7ED3B4FE6FF00DB7E8D55AB977F896CDA5AEB29CA66596825B492692E23F37D5D9735ABCD2BB1F5BC3D8E2D70E083075D0F1FC9571BD53AADF147AF93735C0EEA85B61DC00DCEF66E7FD162286DF5AC4A7A565598191D37D0C9AA3713906DE46E6B83AA0D62CB17B5B21B58877D205CED44EEDA61CD572EC234515E465616563D3701E8DB630EC7E9F98F70A5B67F610AAAF16DDCC6D36BAC602E7064980DD5EFFCFF006B3F3D252017D627F57AF5FEB98FFC113FDAA38AAA1FD99FFAADCADBFA4DF5E3FDAEDC!
4CA6620DB391B49A86FF00A1FA66B3D3F77E6FB9557B3127D9618F39FF00C824AD54DCC7480FAEA7B265CCD8D6CFF6EB0CB5BFD87AD2C7FABF6F56ACDDD049CAB191EAF4F711F6A64FE7D6DF637368FF0085C7FD2B3FC3E353F9F9EFC56B2BAEE707B69B645769076B8B63D40C7EC0D7ECDCDDEA5899630726BCAC4B2C6DF53839AE80069D8C39252D97D2BAA6139CDCCC3BF1DCD12E16D6F640F1F7B5AAAAF46CAFF19BF5A7368B2BE9543198AF6ECDEE76EBEB247B9ADC9F559BBFE0ED7D1EAFFC67F3CB91B716E881D206E77E7D6FB9FAFCADB1A9BC71BAE217DAD7704EAF84D77A720C83AE853124F795D7F42FAB14F54E9D5E6F54BF0BA1E187BA9A32328BC597B9A76DBB196E454CB198EE3B3D46FF00E8B47FACBD3BEA67D5B7D7D3A2FEB79A432FB5F5DACC7A5A1CD9A99FA1AAF73FD563DB6FD2DFE9FA5FAC237DB55B4F1201260092780B4EFF00AB9D4F1706CCDCE6B30831AD7D78F90F15E45A1CE156EA309DFACB99EEDFEABEBAEAF4FF003D6B7493D7B375E8D463743C4921F9E3F4418D3F49D6754CA75F9CC67FC4DDFF005A59FD7EAE8D875D789D373DDD5725EE36E7E5EC2CAF78F6D5563FAA7D5B76EEBDD6DCEFE77F43E9A4083B288ADDFFD3F2A49249253D263D4EEA7F53ED6D52EC9E8B6BAF2C6BB9C6C8DAD7D9E97E7B712FAEEF51FF00E0BED6B3EAAC!
D5F57B22D712DFB564D55B04B40736A6DAFB1DB4FE91CD6BDF5FD0F625F577!
ABBBA575
3A323716303B6D8E6C1863FF004776E63B732D66CFF04FF63D5BFADDD671BAA75065781A74EC261AB146C6573AEEB6DD94B6B67E99FEFF00A0C4DD6EBEABFA5FD1C11CEBA8F05D0D7818393F57DF938563321D8C1C7330AD219954EE79F4F270DED1B73315ACF4FED2D77D0FE73D0A7F9E5CF153A322EC7B5B752F35D8DFA2E1CA72C62013C0981263C1131321F8993564B58C7BA9707865AD0F618FCDB2B77B5ECFE4AD9AAAE85D4FA4E4E47DA074CEB38D363B1CE98D93572E6E2ED9F4333FEEBFF316FE8FD2FF000BE8630B6C78D86F7060D00717447F55BBD25336750CC0C153AD75B4C6D14DAE2EAF82D6FE8DC767B376EAD3D3857580B9AF63034725D1E5F9A846CB2769BA5A3832E8FC4284999DDAF8EA81BE9A2E0475D5B95E2D818FA9994DADB6C0B19FA40D7869DEDDDB5877ED7FEF209C32013EA34C7835FF00FA4F6AD6E99D63EAFD18A29EA1D128CDB9BC647DA726A7B8F8D8DA9EF67FDB7E92C4701261E23C04FDDEE096BDD5A765EC75BB595B9E5CC64EC69261B265DB1A7E8EE510D27C3E64048B4013B81F213FDC991436F1B3B3716A753458D635CEDCEFA24CF1F48EE57F17EB5755C7780F7557B48DBB6C6FB7E334FA4E58A9934E389DE20FD170C9302848D76BD1DBEA7998F9D97F69EA79CECCB1ADF4EBA71185B532B6CFA78F4D993E9FA35B27FC1E35D!
FE93F9C7EF54FF68515698787554623D4BBF4F67C7F4BFAB7F998AA8C84D28D05BC45B3939F9596E6BB32FB2FDBF45AE71200FDD60FA157F618ABB9D3A7026404C922AB7FFFD4F2A4924925294BF37BFF00051492485249249214924924A5249249294924924A5249249294924924A5249249294924924A7FFFD9FFED16CA50686F746F73686F7020332E30003842494D0425000000000010000000000000000000000000000000003842494D03ED000000000010004800000001000200480000000100023842494D042600000000000E000000000000000000003F8000003842494D040D0000000000040000001E3842494D04190000000000040000001E3842494D03F3000000000009000000000000000001003842494D040A00000000000100003842494D271000000000000A000100000000000000023842494D03F5000000000048002F66660001006C66660006000000000001002F6666000100A1999A0006000000000001003200000001005A00000006000000000001003500000001002D000000060000000000013842494D03F80000000000700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E80000000!
0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D0!
40800000
0000010000000010000024000000240000000003842494D041E000000000004000000003842494D041A00000000033D000000060000000000000000000000D30000019B00000004006B00690074007400000001000000000000000000000000000000000000000100000000000000000000019B000000D300000000000000000000000000000000010000000000000000000000000000000000000010000000010000000000006E756C6C0000000200000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000000D300000000526768746C6F6E670000019B00000006736C69636573566C4C73000000014F626A6300000001000000000005736C6963650000001200000007736C69636549446C6F6E67000000000000000767726F757049446C6F6E6700000000000000066F726967696E656E756D0000000C45536C6963654F726967696E0000000D6175746F47656E6572617465640000000054797065656E756D0000000A45536C6963655479706500000000496D672000000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E6700000000!
0000000042746F6D6C6F6E67000000D300000000526768746C6F6E670000019B0000000375726C54455854000000010000000000006E756C6C54455854000000010000000000004D7367655445585400000001000000000006616C74546167544558540000000100000000000E63656C6C54657874497348544D4C626F6F6C010000000863656C6C546578745445585400000001000000000009686F727A416C69676E656E756D0000000F45536C696365486F727A416C69676E0000000764656661756C740000000976657274416C69676E656E756D0000000F45536C69636556657274416C69676E0000000764656661756C740000000B6267436F6C6F7254797065656E756D0000001145536C6963654247436F6C6F7254797065000000004E6F6E6500000009746F704F75747365746C6F6E67000000000000000A6C6566744F75747365746C6F6E67000000000000000C626F74746F6D4F75747365746C6F6E67000000000000000B72696768744F75747365746C6F6E6700000000003842494D042800000000000C000000013FF00000000000003842494D041100000000000101003842494D0414000000000004000000013842494D040C00000000111100000001000000A000000052000001E0000099C0000010F500180001FFD8FFE000104A46494600010201004800!
480000FFED000C41646F62655F434D0002FFEE000E41646F62650064800000!
0001FFDB
0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005200A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F2A49!
25A3D07A657D47A9574E4BDD4E1B4EFCAB9BCB6B68DFB5AE77E8DB6DDB7D1A3D4FD1FAAF4948B1BA5E5DF5B2FF4CB71DEE2D6D874DC447E8E907F9DB773B6376FE7AF51C5FF00127D31D431F959F90CB5C039EC68AE1B23F9BDD0FDFB3F7D0BA074FC1EA3D7FEAFDADAEB7BC576750BDB53CBEAC7AA9366374CC0A36FE8D8CC5C866FB1FF004F272FED17FA8BD41D05A41E0E85016934347E78EB3D37EACF4FEA57E150FCCC9AE976D1901D500E8FA5FA3D9FBDFCB59E71BA3983EAE5563BFE8AB7FF00EECD2BDE327EA3FD57C876F7F4EC6DCE3EE22B689FF3550BBFC597D50B2670437CEBB2C61FFA366D44D742A1E2F92744FAA8EFAC19A70BA5E656DB830BC0CB6BA998E5ACF47ED9EE566EFF0016DF5B19D4ACE9B562B322FA982D2EAEC6B58584EDDCC7E41A3F397A6E0FF8BCE8BD1FA8D3D4B02EBF19F4B8101F6B5CC3FC83EAB3F3BFAEAF7D71BAFE9A707EB062B1D63F12DF4B22A6CFBE8B47BDAE89FA16358E6222BBA0BE2DD4BEA67D69E961CECDE997B2B60DCFB58DF56B681F9CFBB1FD5A99FE7AC55F5074ECEA3A86155998E7F4768DC01E47F25CB99FAE1FE2E7A47D62A9F7E335983D53E933258D86D879DB975B3E9EFF00F4FF00CF33FE17F9A414F82A4AEF59E8F9DD13A8DBD373DA1991491BA24B4823735EC710DDCC72A49294924924A52492492949249!
24A524924929FFFD0F2FC5AEFB2FADB8EC365C5CD0C686EE971706D63619DD!
BAC735AB
D1BA9399F57BA158336BCAE9DD67298D193877B1991D3F35FBBD47DB5BAAF528C6B19F4FF0056BB12DC67FF00825C57D5FEBFD4BA35EEFB13ABDB73AA7D955C03AB7BB1EC6E5E3EEFA2EF6DB5FE63EB5EB1D1BEBB7D5EFAEB8F6F40EB58DF63CABC167D9AD32D7BBC71AE7358EAF26B77BDB5BD9EA33FC17AA929F3DE81F5DB27A0D8D7D14B0B9CD2CB6D2497EC25EF6D6CDD156DAEDB6DB7659F9FFB8BA7ABEB97D69EB56D55F42EAF88E7DAE6B3D2CAC618B60793ED67E91D9B8B639DF99E9E57AB67F83A571BF58BEAE370ADCBB7A4B9DD43A560D82AB7A835CD700F7C06B2DAEAFE69ACB7753EB6DF4EE7FF00C6D6BA9FFC6E32E9E8785D5FA1BFD5EA0719B6E7F4CC9009B5B645AEA7D2FA2EDBF43D37ECF576576D7E9E4A14B897A4AFA5FF008D605C6CEA186C24C9347A6D9EDBB6DDD3EEDDFF0081A164E17F8D5A585D57560F7766BF1B1CB7FEDCC7AEEB3FF65D59FA9FF5D31ADC22DCFC8786565CC2CBC39D7E3D8C69B2CC4C9B3F9CCA6ECAEDB30F21CCFB45955575791EA5F8F6D88D9DFE367EA66201E9645B9AEEEDC7A9D23FB593F67AFF00E9A5C28B79637FF8CACACB6D5976F4EC8CAC72432BC838CDB59BE376DA7F43733D4F6FE62DC2EFF1B6EC66B0E3F4DB00FCD6B8877DEDB5B5AC7EAFFE383A3E638D23A10CFC51AB3ED8E634EEFDEF4BD3CA633FEDC5C9!
D7F5EFAC62E4BACE9CE763E2BB8C37D8FB58DF2AAE2E664D4CFF008BB91FAA9ED70F03FC6431D6373B032763DFB9AFE9F9F463EC04FE65173B2287FF009957FC23D74383D1BEB438977EDCEA18959E28C9A30EEB1BFD6C8AFD7A6CFEC2F3FA7FC65F5A7B36E3F507E15C7F3729ADC9A4FC323D3FB551FF005C6DFF00F09720E4FF008CDFAFD8CE1EAE4561AEFA0F6D35398E03FD1DAC6B98FF00ECBD222FAA2DF42EBBF519FF00582918FD47A8D793753FCDE43F19ADC860D7D9EA635B8ECF49CE3BF63E85E57F5BBEA1758FAAFB6EC8DB918563B6B32AA9DA1DFE8ED69F756F42CBFAF3F59F2BA81EA2FCD757710D696D5EC6437E8FE899EDDFAFF3BFCEFF002D747D27FC6B5D662BFA6FD65C56751C2B9BB1EE3A3A3FE13DAFDFFE6FABFF0008950517CF2125B7D7713A251D5DC3A4DEFB3A5DA4398E30E7D6D31B9BED73BD5F49FF00BEB2DE4D56398ED966D301ED00B5C3F79A9290248CE752EE6BDA4F769D3EE76E43DADECEFBD25314939696F29925292492494FFFD1F2FA1F435978B5A5CF7571491D9FBEB76E76ADFF0004DB5AAD559F5DE68AFA8B4DCCA346BDB1EA160FA18F63E5BBEAFCC66EFD2D15FF0035FA3FD12AD4FA1E95FEA025FB07A2418876F66E96FE7FE8BD441060C8E7B24A767EAE75AEA7D133EBCFC6F7556BF65D5DB269BB8DD5DCDFF09E9FA8DB3F!
7E9FE714FAB7D69EA599F59EDFAC547EA19C5CC2DF49C4EC7575B31FF3BE9B!
2CF4FF00
495BFD9FE0D49AC3D4FD3C4AF26AC2C0C66329A8E4EE0D75A1BBF21CDF42BB9CCDF77AB75977F35456FF00D358A56754B2B73BA37D64C365B550E0CF56A6575E5D247F85A72696B5B9BBF76FD994EBAACBFF0007755FD2101AAE2340F43D5722AEB9D25FF5CBA68F4729BB31FEB160D26087021D8FD4F1F5F52BFD2B2BB6AB3F7EBFA7FA1CBF578DEA5416DC5F688B5C03ED0C1EC70780FAB2AAFCDF4721AF6BFF00AFFE62B26BCEFABF994F50C2B5B938974FA1920134DF5F17E2E4D4EFE43BD2CCC2BBFF003D3E9BACD2C77E3752A5B895E39DDB5EEE90D0E2E2E6171B72FA1DD646EB5EDDF65BD3BFC27AFE9FFDCDFD1943CC4D5D83BEF1FDC9035FEEBBEF1FF9147B71F0D8E206438C1E3D321C3FADB9CDF72116E30262C79F0F601FFA31252FE9B5EDDD48712D6CBDA60989FA4D8FCC6B7E927A72EFA1AE631D353FF9CA9C258E8FDEADDEDFEABFE9A835E2B707D6E70734C830041FBCAB7938953B0EBEA14BD8458E2CBF1EB906978FA1BF7B76FA7930FB29F4B7B3FC124A693CB49968DA0FE6F31F04C9E59E07EF1FDC9D9E96F1EA077A7DF6913F88494C525A2DC3E965A1C321E416CFD1E1DFE8FF00F3352FB2F491CDD61F648E3E9FEE7F57F9699EE8ED2FB1B039399D78B1FF008F173125A7E8F4601DAD84C0DB2401BBF3F77F27F7522DE88D0E80F710D1B65DF9DF9!
DC7E621EE0FDD97D89FBA1EB9710FF0DA75D22D67E89D36807754ED376BFE07F7FDBFE0FF009CFF0047BD01C04E9F72D2EA38FD3862E3E4603A7DA2BCAADCEDC7D5027D6AA5B5BDB4DCDFF07FE0AD59B04F6253C1B6B1146BF259252D8E3DBEFD14488307FBD143FFD2F2A486841F04921CA4A7B4FAAD8B55F5B7A65B7370EDEA543463E53B4DB6B2E666B9ADB0FB6B76462D4FA77FF84FD0D4B03ADE3E5D4EAABCB66CBB187D99F10416B3F498EEDEDFE73F4166D659FB95AD1EAA2A6FD5AE916CB9B5E456F6D9B359752E7575EF9F6FF39BBFEB6B0EBADD6E15EF3681F67756452774B83B757BD9F99FA2F6FF00DB899106C9F164911407806FF477752A70B22DAE819BD32C77A59B86E3209DB35DCD68FD2537D7B9CEC7CAA7DF5FFC47AD558D8D9548C4662D59AFAA96DEEC8AD8E66DB28B80636AC9AADA9DFA6DCDAD95DBB365BFE169C7B16762E5E4E1DA2EC6B0D760EE3BF939A7DAEFED21EC7B9A6C825A0C39DDA4A70E2B3755D169E1A1577FA5DBE8F7F8D4749FF18D762372F2DBD2FEB1555FA792FF004DA59962BFA36B18D763B7ED3B4FE6FF00DB7E8D55AB977F896CDA5AEB29CA66596825B492692E23F37D5D9735ABCD2BB1F5BC3D8E2D70E083075D0F1FC9571BD53AADF147AF93735C0EEA85B61DC00DCEF66E7FD162286DF5AC4A7A565598191D37D0C9AA3!
713906DE46E6B83AA0D62CB17B5B21B58877D205CED44EEDA61CD572EC2345!
15E46561
6563D3701E8DB630EC7E9F98F70A5B67F610AAAF16DDCC6D36BAC602E7064980DD5EFFCFF006B3F3D252017D627F57AF5FEB98FFC113FDAA38AAA1FD99FFAADCADBFA4DF5E3FDAEDC4CA6620DB391B49A86FF00A1FA66B3D3F77E6FB9557B3127D9618F39FF00C824AD54DCC7480FAEA7B265CCD8D6CFF6EB0CB5BFD87AD2C7FABF6F56ACDDD049CAB191EAF4F711F6A64FE7D6DF637368FF0085C7FD2B3FC3E353F9F9EFC56B2BAEE707B69B645769076B8B63D40C7EC0D7ECDCDDEA5899630726BCAC4B2C6DF53839AE80069D8C39252D97D2BAA6139CDCCC3BF1DCD12E16D6F640F1F7B5AAAAF46CAFF19BF5A7368B2BE9543198AF6ECDEE76EBEB247B9ADC9F559BBFE0ED7D1EAFFC67F3CB91B716E881D206E77E7D6FB9FAFCADB1A9BC71BAE217DAD7704EAF84D77A720C83AE853124F795D7F42FAB14F54E9D5E6F54BF0BA1E187BA9A32328BC597B9A76DBB196E454CB198EE3B3D46FF00E8B47FACBD3BEA67D5B7D7D3A2FEB79A432FB5F5DACC7A5A1CD9A99FA1AAF73FD563DB6FD2DFE9FA5FAC237DB55B4F1201260092780B4EFF00AB9D4F1706CCDCE6B30831AD7D78F90F15E45A1CE156EA309DFACB99EEDFEABEBAEAF4FF003D6B7493D7B375E8D463743C4921F9E3F4418D3F49D6754CA75F9CC67FC4DDFF005A59FD7EAE8D875D789D373DDD5725EE36E7E5EC!
2CAF78F6D5563FAA7D5B76EEBDD6DCEFE77F43E9A4083B288ADDFFD3F2A49249253D263D4EEA7F53ED6D52EC9E8B6BAF2C6BB9C6C8DAD7D9E97E7B712FAEEF51FF00E0BED6B3EAACD5F57B22D712DFB564D55B04B40736A6DAFB1DB4FE91CD6BDF5FD0F625F577ABBBA5753A323716303B6D8E6C1863FF004776E63B732D66CFF04FF63D5BFADDD671BAA75065781A74EC261AB146C6573AEEB6DD94B6B67E99FEFF00A0C4DD6EBEABFA5FD1C11CEBA8F05D0D7818393F57DF938563321D8C1C7330AD219954EE79F4F270DED1B73315ACF4FED2D77D0FE73D0A7F9E5CF153A322EC7B5B752F35D8DFA2E1CA72C62013C0981263C1131321F8993564B58C7BA9707865AD0F618FCDB2B77B5ECFE4AD9AAAE85D4FA4E4E47DA074CEB38D363B1CE98D93572E6E2ED9F4333FEEBFF316FE8FD2FF000BE8630B6C78D86F7060D00717447F55BBD25336750CC0C153AD75B4C6D14DAE2EAF82D6FE8DC767B376EAD3D3857580B9AF63034725D1E5F9A846CB2769BA5A3832E8FC4284999DDAF8EA81BE9A2E0475D5B95E2D818FA9994DADB6C0B19FA40D7869DEDDDB5877ED7FEF209C32013EA34C7835FF00FA4F6AD6E99D63EAFD18A29EA1D128CDB9BC647DA726A7B8F8D8DA9EF67FDB7E92C4701261E23C04FDDEE096BDD5A765EC75BB595B9E5CC64EC69261B265DB1A7E8EE510!
D27C3E64048B4013B81F213FDC991436F1B3B3716A753458D635CEDCEFA24C!
F1F48EE5
7F17EB5755C7780F7557B48DBB6C6FB7E334FA4E58A9934E389DE20FD170C9302848D76BD1DBEA7998F9D97F69EA79CECCB1ADF4EBA71185B532B6CFA78F4D993E9FA35B27FC1E35DFE93F9C7EF54FF68515698787554623D4BBF4F67C7F4BFAB7F998AA8C84D28D05BC45B3939F9596E6BB32FB2FDBF45AE71200FDD60FA157F618ABB9D3A7026404C922AB7FFFD4F2A4924925294BF37BFF00051492485249249214924924A5249249294924924A5249249294924924A5249249294924924A7FFFD9003842494D042100000000005300000001010000000F00410064006F00620065002000500068006F0074006F00730068006F00700000001200410064006F00620065002000500068006F0074006F00730068006F007000200043005300000001003842494D04060000000000070003000000010100FFE11803687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D27EFBBBF272069643D2757354D304D7043656869487A7265537A4E54637A6B633964273F3E0A3C783A786D706D65746120786D6C6E733A783D2761646F62653A6E733A6D6574612F2720783A786D70746B3D27584D5020746F6F6C6B697420332E302D32382C206672616D65776F726B20312E36273E0A3C7264663A52444620786D6C6E733!
A7264663D27687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E73232720786D6C6E733A69583D27687474703A2F2F6E732E61646F62652E636F6D2F69582F312E302F273E0A0A203C7264663A4465736372697074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A657869663D27687474703A2F2F6E732E61646F62652E636F6D2F657869662F312E302F273E0A20203C657869663A436F6C6F7253706163653E343239343936373239353C2F657869663A436F6C6F7253706163653E0A20203C657869663A506978656C5844696D656E73696F6E3E3431313C2F657869663A506978656C5844696D656E73696F6E3E0A20203C657869663A506978656C5944696D656E73696F6E3E3231313C2F657869663A506978656C5944696D656E73696F6E3E0A203C2F7264663A4465736372697074696F6E3E0A0A203C7264663A4465736372697074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A7064663D27687474703A2F2F6E732E61646F62652E636F6D2F7064662F312E332F2!
73E0A203C2F7264663A4465736372697074696F6E3E0A0A203C7264663A446!
57363726
97074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A70686F746F73686F703D27687474703A2F2F6E732E61646F62652E636F6D2F70686F746F73686F702F312E302F273E0A20203C70686F746F73686F703A486973746F72793E3C2F70686F746F73686F703A486973746F72793E0A203C2F7264663A4465736372697074696F6E3E0A0A203C7264663A4465736372697074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A746966663D27687474703A2F2F6E732E61646F62652E636F6D2F746966662F312E302F273E0A20203C746966663A4F7269656E746174696F6E3E313C2F746966663A4F7269656E746174696F6E3E0A20203C746966663A585265736F6C7574696F6E3E37322F313C2F746966663A585265736F6C7574696F6E3E0A20203C746966663A595265736F6C7574696F6E3E37322F313C2F746966663A595265736F6C7574696F6E3E0A20203C746966663A5265736F6C7574696F6E556E69743E323C2F746966663A5265736F6C7574696F6E556E69743E0A203C2F7264663A4465736372697074696F6E3E0A0A!
203C7264663A4465736372697074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A7861703D27687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F273E0A20203C7861703A437265617465446174653E323030372D30382D32315431343A32353A32312B31303A30303C2F7861703A437265617465446174653E0A20203C7861703A4D6F64696679446174653E323030372D30382D32315431343A32373A35332B31303A30303C2F7861703A4D6F64696679446174653E0A20203C7861703A4D65746164617461446174653E323030372D30382D32315431343A32373A35332B31303A30303C2F7861703A4D65746164617461446174653E0A20203C7861703A43726561746F72546F6F6C3E41646F62652050686F746F73686F702043532057696E646F77733C2F7861703A43726561746F72546F6F6C3E0A203C2F7264663A4465736372697074696F6E3E0A0A203C7264663A4465736372697074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A7861704D4D3D27687474703A2F2F6E732E61646F62652E636F6D!
2F7861702F312E302F6D6D2F273E0A20203C7861704D4D3A446F63756D656E!
7449443E
61646F62653A646F6369643A70686F746F73686F703A63393464383463362D346639652D313164632D623434612D6462616432653537656630373C2F7861704D4D3A446F63756D656E7449443E0A203C2F7264663A4465736372697074696F6E3E0A0A203C7264663A4465736372697074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A64633D27687474703A2F2F7075726C2E6F72672F64632F656C656D656E74732F312E312F273E0A20203C64633A666F726D61743E696D6167652F6A7065673C2F64633A666F726D61743E0A203C2F7264663A4465736372697074696F6E3E0A0A3C2F7264663A5244463E0A3C2F783A786D706D6574613E0A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202!
020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202!
0202020202020202020202020202020200A202020202020202020202020202!
02020202
0202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A20202020202020!
2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020!
2020200A202020202020202020202020202020202020202020202020202020!
20202020
2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A20202020202020202020202020202020202020202!
0202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A2020202020202020202!
02020202020202020202020202020202020202020202020202020202020202!
02020202
0202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A20202020202020202020202020202020202020202020202020202020202020202020!
2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A2020202020202020202020202020202020202020202020!
20202020202020202020202020202020202020202020202020202020202020!
20202020
2020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A3C3F787061636B657420656E643D2777273F3EFFEE000E41646F626500640000000001FFDB0084000A07070708070A08080A0F0A080A0F120D0A0A0D1214101012101014110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010B0C0C15131522181822140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC000110800D3019B03011100021101031101FFDD0004003!
4FFC401A20000000701010101010000000000000000040503020601000708090A0B0100020203010101010100000000000000010002030405060708090A0B1000020103030204020607030402060273010203110400052112314151061361227181143291A10715B14223C152D1E1331662F0247282F12543345392A2B26373C235442793A3B33617546474C3D2E2082683090A181984944546A4B456D355281AF2E3F3C4D4E4F465758595A5B5C5D5E5F566768696A6B6C6D6E6F637475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F82939495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFA110002020102030505040506040803036D0100021103042112314105511361220671819132A1B1F014C1D1E1234215526272F1332434438216925325A263B2C20773D235E2448317549308090A18192636451A2764745537F2A3B3C32829D3E3F38494A4B4C4D4E4F465758595A5B5C5D5E5F5465666768696A6B6C6D6E6F6475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F839495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFAFFDA000C03010002110311003F00E338ABB15762AEC55D8ABB15762AEC55D4C55D4C55D4C55D4C55D4C55D8ABA98ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AE!
C55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5!
5D8ABB15
762AEC55D8ABB157FFFD0E338ABB15762AEC55D8ABB155F1C324868AA4F6AE0269205B30F2BE8CEBA95BDA49A643737329A96B9E4CAAAC3F6A1FB1FF079599B6703DCB47F26797EDE10F269907AAF42C1A34201F051C7ECE4A365814D3FC37E5EFF00AB5DA7857D08FF00E69C931B483CE16FA069BA7B3AE9F6A25A1A7EE631DBE1FD9E593885B78C5D79B658E7744D3AC99396DFBA02A3232098943BF99ED9EA24D134F2C7AF18A877F1FDAC8D32523ACE90451F43B7DFF90B2E2B4D1BDF2AC8E1A5D1E5407ED08A634FF600E2B4B5FF00C16E4520D4231D36789B7FA571B2B4B1348D0AEE5E169753C658D156745DABFCCC8D920189653FF2A535C96D56E2D2FEDA6E42BC183A1DFA745930134A0245ABFE5B7997498CCB70B0C918EF149CBF80C41B5A48E0D0757B8DA0B492523F9057F564A90D4DA16B5054CDA7DCA05EA4C4F414FF002B8D302A04A95342083E076C55AC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABFFFD1E338ABB15762AEC55D8AA77E5BF2DCFACCAF2BB7A1A75B82F7574DB2A81FB20FF3B64652A6518DA75777FA6A294B08C4505B8020000AB536F51DBF99FED653B92DE299E7E50E8725D4B73AF5E3191C90B106DF7A7DBC9016C245EB4065AD2E3B0C!
2AF25FCC49B53B9B8748EDE564A9DC027AF4E83F6572C082F29B9D3EF44ACCD6F28249FB4A47F0DB224241421B79947C51B76EC47CBB60A4DB4508EA30526D6F163B5294F1FA322432B70046F4C56D1760E639C1F7FD472712D65EFDE43D48DDE9F1C25B93014F889EC3BFD1864141641ABE8D6D7D6B22BC6A5F89E2C7AF8F7F87005615E554B2B1D567B5994092324AF2DB6F1FF886495E851A44CA085AAD29423BF7FB59029416A1E59F2F6A8A45FE9D6F715EACD1AF2DBFCB03960430FD6FF25BCA97EA5AC049A74DDBD36E49FF0001272FF89629797F993F2A3CCFA187992317D68A4D2582A5A9FCCD1F518DAD30A646462AE0AB29A3291420E14358ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AFFFD2E338ABB15762AEC551DA369373AB6A3058DB29692660BB7604EEDFEC7232953288B7A84F656D39B4F24E9429046C0DE4A06EEEBFDE3D476E59546C96D3B04179E34ED374C82D74CB48B835033B53E23D157FE1B2F9000358365EC3E53D323D2F40B3B4414E3186623BB37C4DFAF2B80599DD39CB1834FBA91E3D7BE02A8196D165724D46F4DB635EBFF11C2249212F9F4547154501BB0DBC695FB3FF0060F2568A427F86E1706A919A9A54A0A787BE1B0A8697C9FA5B805ECA26A8D8!
95506BF2FA31B5415C7E5DF9725A9364AA294251B8D083F16DFEC7FCFEDE05!
4BEE3F29
FCBEF411ACD19E838BD7E2AB03D7F6A98D252B9FF296D91C7D5AEA443B7DA0A46FB76A74638400825927943CB77FA3DC2FEFD668CD08AA9141F6149E5FCDCB12A033FD99771B1ED90579779E2C8E93AB457D01A2B6FB6D4FC4FECFC39645059B79775AB6D4EC90C720760A050EC41A7BEFFEB64484A76BD37C82B476C055A342B461F4604B01F3BFE58699AF4525DD9C62DB5203E164002B91D9C61052F05D6344D4747BA7B5BE85A37534048D8FCB2484BF143B15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB157FFFD3E338ABB156C2D4D05493D862AE5525801D4ED8A43D0FC8C89A4417377222C7792A18EDE690D046187C4E72B9449671349FF906E34CB4F344AD777D1DCDDDD2B242D1F2216BF130FE5F897964626994907A8BAEB3E72782302482194CB31FF253655DBE15DF2C9498443DBAD5425BC680710140A7D18C58956C28689F6AE02556725A604B9C023E2E9892AE50BD7A9EB5F7E871B55A557B1A0EF4A78636AE31AD3E5523BF6A7BE1E25532869B0ED5EBF8FF00C2E0E24A9B42A6A8CBB375EA7AD77F8B0F12D3422457241DC9A915AD4D001D7ED6DFF35E1E2B452363FB3BFF0098ED8841623F989A7C979A621450CC84915F61BD3271D90F3BF2F6A3716172B1C9511921452B4AF4ED922!
87B3695769716884302E051857BF86FFE4F1C81648E39155A77141F4644A5A00508ED885487CCDE51D2B5E857EB56C92C919AA96A827FC9665F8B0ABE7CF39F95FF00436A92C76E8C90B125617AD50782B1FEF13F970AD318C28762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB157FFD4E338ABB154FF0040B7D164B3B86BA9261AA160B671A01E9D29F1F3277E4D842A69059FE879A39AFF0049924B4660E250A4301E2BB7FB2C4A433BD5DFCBFE63D3E19B48BD88DCC518596D1E91CAC07829A2B32E444BA24C5845816B2F3344A89E9BC61B973DA950D534C810CC72657E49B76B391F5865E51DECDC149A1A80DCD8AF2FF2B0016AF625B880202644E951F10FEB9214D641529F54B0881E5750A11B90CEBFD701924040CDE65D11369353B651DFF789FD71E24F0A1AE7CD3E5E28D4D5605F75753BF5EC701290109179E3CB70C7E9CBAB41211B862E2B4F0395D967C2170FCC2F28AD6BA9C3B74A303F778E4ACB1315ABF98DE51A1E5A8463DAB5A636BC2BD3F307CA2C69FA4E214EBC8918D95E1565F3D7945AA3F4B5B8FF00663240B13142EAFE67D2AF2C1EDF49D62DA3BA620095A40283BF1FF2B083BA692AD3E2861A037304EDDDC4C189FF0086CB048312197E9B7D0143575AF5FB61BB7FC0FECFECE02!
57856EA77D66D1947F8D54FC63B74C3128A2C3F504D1B831F4C46CB5A501EF!
5FB59340
50B0F3C436158A2B39AE20068CD0AF24A8FF2BFC9FE5C3CD168A97F3674C818896C6EC28EADC09EE7B655205902D47F9D1E543F6D2E233DEA953FAF2165970A616FF9AFE4C94D0DE18DAA07C68C3AFD1B60E25E14D6D7CF5E53B91FBBD56DEA7F659C29FB9B25C48E12A1E63D1BCBDE6AB0685A685E602B0CF1BAB329EA3EC9C6D68BC1BCD9E4CD4746BC78A58EBD59644DD587D1D0EF920A4314208343B11D46162EC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB157FFD5E338ABB1546E9AD24570B2C6A5829A9DABF3D86297D15E59F36796757B086CEE1E249D1557D29E82A69FB3EA64884301FCD5D1BCBF6F22DD694C914E77758C8A57724FC3838536F3CB4BDB857E44866E25096A9241F13D722CB9239FCCBAA2ADBA4337A705B0FDDC2BB26FD792E3C979A7369E62F2D6A748B5A827B476EB756D2311BFED321DB06CBB856BBF22DB5EC267D03584BF04545BCD20590FB76DFF0067ECE3C34A0B17BAF2C6BD6B37A5358CFCAB4AAA16077FF23960B0947C1E4AF3B2209A0D26EC2B0142226DC1E878D315B4CAD3CAFE7A5DA4D05EE17B89E1DFC695F870AA60BE50BD714BCF295CC7E2F6A48FF846AE0428C9E48D22426AD7DA6B5765BCB73407DCA8F8714DA1A7FCBABF281F4FBAB6BD5EA151C2B7FC036349!
B63F7BE5DD66C9CA5CD84D1B0EFC1B8FD0CB5C56D0234FBC6345B795BE48DFD315555D2B53A82B6D38FF0060E3EEDB1B545DB695E656DEDA0BC045775120FC462845187CF16BFF002DEA3D8498ECA86B9BDF35B232CF2DD94E8DCC3D29DD4E112410B74BD77CC1A4BD6CE69156B568981287FD65C3C48E166BA5FE68B10B16B3A52C8BB03340A4377FD93F0E3C416991C50FE5E799A30DC561B83BD194C2F5F6FE6E8B902C91B6FF00953E4E256AB34B53B7EF36DFFD55C484DA716FF95FE49550469E1BDD99ABFAF080C4C9737E58F9441E505BC96EDD8C5232FF005C7851C450D71F96B6AC0882FEE545085591F9A8069E2B9245B09F307E4F5E8E52DB37AE402792ECDDBED0DF0ABCD356D0AF34B99A39D190AF40C38D4614259815D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABFFFD6E338AB22D03C95ABEB9A55FEAD6C512CEC01F519CEECE007F4D147F92705ABD4BF293C97A7CBA1AEA9A8DB892595996347150029A72A1FE6C92B21F317E5AE95A842EFA728B3BB00B46C9F08E5D474C41578B79A743D6F48B9306A45DC0DD589AD7B8C2770A18E8620785695C83353663F8F4C0AB4B1FBB0D22D1961A8B5B38E5531D7E250687E60FF003610696ADE95E58F385F69912DD076D47495A7AC0FC53423FCBAF55C06!
36A090F63D2758D3F57B44BAB1996589C576EA3FD65C508EC50EC2AD322B02!
AC0153D4
1DC6054B6E3CB7A1DC37392CA30FD990703FF09C71A4DA0E7F2A45C58DA5DCD0B7EC873EAA0FF60DBF1FF658D2DA413DAF9B34E6669AC2DEFA104D25B7015E9E250E46AD97121A1F37D9C5384BB8DED1C6CCB347C4547F95BFFC364F802389935979974F923E71857DBFDD6411DBF0C7851699C5A969F31550C013D030A63C2AAE6DECE51BC71C83FD556F960A5B526D23496FB5636E7FE7927FCD38D2DBBF43E93FF2C307FC8A4FF9A70505B2B1F43D1A4003D8C040DC7EED47EA18696D5A3D3ECE2004518403600569BFB634B6AE1157A75A52BDE98D212AD535A1A74D1C6ED19E6090AE78B1F97ECE4C0B555B7D7F4D95C46F20864207C321001AF83569829531D987883F48A605631E70F2758EB96329F4C2DDA8255C0DCD3B6D84157CE3AFE817DA25F3DB5DC65373C188D8807122952CE35FEB8134D889E9502BEDDF05AD35C1BA50D7E5850B68475C55D4C55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55FFFD7E338AB2AF2879BAEB45B1D4F4E047D52F63E4C09350E9B2F0FF5EBC5B01487AEFE5E7E60E897BA65B6992B0B5B981029E7B2B31279529F671521E86AE8E39230653D0835185093F99BCB765E61D365B3B850242A7D294804AB50F1DFED71DF1055F3D6B5E49D734A9E48A6B4731AC8104C07C2D5FB254E12120B1FBFB55B5!
98C2B2895D7EDF1E80F75FA32292878636964545FB4E4015F12683150CC20FCBFD49F48BBB978D96EED08631D2B543D48382D29069FA85F68B7A258495653C648987C2CB5F895D0F55A6157A3683A890875CF2DB142BBEA1A583D0FED3443A64A9897A9F967CCF69AEDA2C8A42CE3ED2F4A9EF4C084F315762AEC55D8AA1A7D4AC206E135C468DFCA58576C55037B3F96EEA16FAD35BCE846EA4AB350F80FB7855E33E61B5B0B29E4B8D2A76B57EBFBA63C09A0FD9AE4A9095D87E636A76F586FD45D20F84C8A78B506DFEAE478995322B2F37E9B7C01B4D424B2BBEC9292072DBBD7085298CDE69F3669EA65F5CCF101B303CD48192A0C504FF9D3AADAB159A0576A529C40A6020282E3F9EF774A7D49397F36FF00860D9560FCF1D45B6FABA83E3F0D3F563B2AFB7FCF3BA5FEF6D43EFB5475FF0027E1C1B258BF9C3F31EF7CC5441188501A823AA8DF65A7F2E1B5A49AC3CDFACDA0F4DE5FACC03FDD736FB7806EAB91B4B2EF2FFE664F692288266850905AD663CE2249FD96FD9AE485143D4341FCC3D23520B1DD11693B7424D626F949DBFD96242A2BCCDE53D1BCD161C1C27320B453250D6A3F981FE6FDAC0AF9E7CD7E55BDF2D6A06DA7AB46DBC6F4EA3B602120A4D127360A3666341F4E0A656DB1922728E0AB2EC57C0D30B16C4B5DFF000EBE1DB0DA1504D11004918!
3BEFB0AD053BF5C55CD1D9C83E1AA3788A907BF4F8B1553FA9291F0CA3E904!
7EAE58D2
A83C1221A11F76F81565315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB157FFD0E338AAE8C8E6BCBA577C551B2C7240C248DFE1FD8950EDD7D8E0A656CAFCA7F98FAD681208CC9EBD9B30E68FBEC3C0F6C569EF3E5EF34693E61B513D84A19E80C911FB4B5EDFE562C6921FCC5D5B4FFD1CFA4ADD88B529C0E0AA03305DF7FF00230713201E2573E46D712CA4D46085AE2CD0D1DC0DC78F25DF0AA47676F34D771C5102652C29E35AE297D55E5E0F2E8D672DCC7C6778544AA69B9038EF82904B11F3CFE59E9FAA412DE69F1FA576AB5F4D07DAA7864916F1AB7B8D5BCA7ABAB85292467E346FB322D7ECFF00B25C79279BD4F4CD7B4F36516B160A12DE57FF004A2868D149FCCC3F97964D872661279EB43B2B6497519BD1A8DDC02CA7A7C4A57E791A4A4F77F9C9E4D8437A52C9311D288547FC36FF00F0B8D2B11D4FF3CEECB95D3AD51129B336E7FE1B1D9522B8FCE6F364A8C8B22206AEEAA0115F0A2E0B4B14BDF336AF7B299A6B862EC6BD70DAA0DB52BF7AD677F8B63434FD582D548DCCCC38B3B30F024E2AB2BBFBE04DB7534C529869FAF6A7A791F579D820FD8624A9FF00626BFEAE4AD8D268DAC68DAB8E3A95BFD5A720FEFE2E95EBBA530DB14BAF7CBD3C4BEADA38BA80F464A134FF00571A54A0A952430208EA0E04B60E0576296B1577EBC508BB4D46!
EACCD61734E9C4F4A61056999797BCFCF6D2AF3964B2714F8E33CA33DBE38C8C24AA6FE6DF317E99453EAC3323A541E038D695F81FAFC5CBF6B2403125E62E642E5A94604D29E3ED4CADB39A6B3CB6FAA5AA30023D4A15E2E2BB48BD981FE7E3F6B25CD8F2497A1AD771914B61A9FE7E18AAE24D295DBA62AD7A8C3BFD18DAB6253DFEFC55CD213D77F9FF006D7157108FDB89F6C5569888E8790F6C50B315762AEC55D8ABB15762AEC55D8ABB15762AFF00FFD1E338AAADB40D712F05EA1598FC9472C52113617E2D27FDEC627B63B490B7423A62A9A5F68F6D25AFE91D1E4F5ED284CD09FEF623DD641FB4BFE5E349B4268FAD6B1A35DACFA5DCBC339F868BB86AFEC943D6B815BD7759BCD4AEFD4BA62D702A6573D4BF7FF81C1492699B7E5FFE62C1A34634DD494C967310198D4F1A9FB584297A0E97F96BA147A936AF1FEF1243EAC201A81507A7DF86D8B0DFCD0F37F98F44F310D374BBC7B4B486142A894DEBBEED4C8D26D0DE53FCE6D5EDAE520D79BEB768EC019800244A9A576A72C559F79CBCA3A579B345FAF5804698A19A0993F6B6AE482393C5B42D565D03549ECAF949B09898AF213E07E1F500FF00270834A45A69797B1C2CDA2EA2DEAE9F2D1EC2E7C14D08E9F3C921865F594B6570F049BD3EC378AF62320943D7B62AD549EB8A1D8A5C37F9E2ADE056FF00!
577C55C7A62968FF0099C50EAD70AABDB5E5CDAB73824287BD3A7DD8DA2934!
1A8699A8
294D462F46E2945B98C6D53FCEB92B08A405EE9B25B51D1965818556543514276AE02136833D7FCFA604B58A1D8ABB15762AA89712A2940E781EAB5DB0DAD384C46DD8F6F95302569735A8EB8AAD249EBDFBE28762AE0698A5DD715762877BE2976055C1C8141EFF008E156CB2B9F8877EA3C3155A508F96285B8ABB15762AEC55D8ABB15762AEC55FFFD2E338AA73E5778535098CB2A435B69951E4FB3C8A5157014849B0A111677B73672FA96EE50F461D88FE5618AA77A29D3A6BE5BC91D22F4B93C90374242FEC7D3894848A790CB34929EAECCDF79AE052B01C52F41D07F347CC3A168D1430AA5D428C54FAE492BE014FF2E049633E6EF33CDE66D5DB5396210B322A18C1A814EE30B148C1C55E9BF951F982748BA5D17527FF0071D72E043231DA273F0FFC8B380A79B21FCD3F20C57103EBDA5A80F4E5322F420FED2F11879A06CF2A8EE1AF2C7EA13926E20A9B527AFF00951E486FB29EF5289D2FA2FA9DD3F0B88FFDE691813FF3C9B0284034091B9477A329A1DBFAE04D3825B8EAC4FCBC31577FA2F5F8BE5B6286AB057EC9A7CF14B7CA0EE877F7C55DCE0EF1FE27156FD4B5A6F19AFB1C50BE686D4A46D6AECEE56B3230A7135E8BFCD8AA17BD3BE156F1571AE2AAB05D4D0D551AA87AA1DD4FFB1C6D0D49E9BD5D071F15FE9812A5850EC55D8AB58AB7DB156B156!
F156B156F15762AEEF8AB8604BB1576142ADBAC2D2A89DCA46DB33015A62956B9B392DC86FEF213BA4ABF648FA30250E1856806D850D1094F87AF8628598ABB15762AEC55D8ABB15762AFFFD3E338AB6868714868E28762AA901FDE0A8AEC462521B8E29659561894B48C68AA3A9381534D4342B8D2D62375C59E4152886A57D9FC1B224B30146D104914F00AB7A82A83FCA5AFF0C54840B432AEFC4D3E59360A7B8C55B048208342370462AF75FCB4F3F586ABA3FE81D6A709751A18D1E46E3EA47D29C9BF6D723C95E77E7CF2F4BA06B6D3414FABC8DEAC0EBBAEE796DF4E4AD3497EB1A77D6AC21F3058AFEE9CF0BB8D3731CA3F68FF0092F8AA512A5C5DACB74685A3A7A8075A7F3D302109850EC55AC55BC55D8A5D8A1B562AC194D08EF8A51AF025D406E20DA54FEF611D69FCC98AA08EDF218AB47143B15762AEC52EC50EC55D8ABB156B156F156B156F15762AEC55BE98A5C715762AD6284559DFCB6A4A802485BEDC2FBA9FA314AEBA8ADA40D7168782F56858EEB5FE5FF271541D714358ABB15762AEC55D8ABB15762AFF00FFD4E338AA32C74E9AEE1BB9E300ADA46259077A1609FC71484253156B1436AC54861B118AB24F295B88C5E6AEEA48B38C88BFE323EDFF000AB912C8285E6B22E0B015657079B11B93D4D321C2D9612F867782649E2A06435A7CBC72682!
CD34AFCC0D0E04105E689134727F7CE054D4FED2A9C935B5AD794B48D5EDDF!
55F2A482
48F7696CBA3AEDFB2AD84845B03961921629229561D4114351812B031520A9A30EE36C559CF963558B5FB06F2D6AF255C293A75C39DD48DDA3A9C0136A5E5CB91A45E5DE95A901E8BD62BB81BA32578F35FF2F15426AFE5DBBD07525953F7BA5DC54C13FECBC4DFB24FF371C52916A7642D67F8378241CE26ED43DBFD8E1625038A1BC55D8ABB1576F8A5D8A15219648241246DC597A1C528DB9B78EEA037B6A2857FDE8847EC9FE75FF25B0252F20F8628A750F4C2B4EE0FD2876EB8AD3B8375A74C55BE0FFCA7EEC556D0E285E20958542123B1A1C064198812BBEAD31FD9391E20D83048F42B859CFF00CA71E30CBF2D3EE77D4E7FE438F1851A69F72E5B0B83FB269F2C1E206434933D177E8DB9077423E783C40CBF2735DFA2EE6952BB78E0F14321A29AF4D16EDC121761B93F2C4E6013F9193869339341B93D863E2865F9092F3A3CAA68C68723E30643B3E47F1FF1D54FD052802AD4E5D3078E127407BFF1FE955B4EF2B6A1A8C770F68BCCDB02CEB5DC81D78E5D1982E065C662527654524106A3623A11F3C9B52C34A6D507155B4C50D62ADE2AD62AEC55D8ABB15762AFFFD5E338AA67A4DCCD6F6BA918DA8B25BFA722F8867518AA5A7156B1570C55398F5492D745FA8C7B199FD4761E1DB0331C9BD0F451A8B34B7330B6B28CD1E6A57AF655C84A54CA31B6417BE4!
8B6974F7BCD02F96F922AFAD6E4709471FB452BF6FF9B0092486112290E54EC41A119606A28BD2F57BFD26E96E6CA568E41D403B30FE565EF92050CC5BF44F9D612D185B3D7D17E24A7C131F15FD9E75C3CD584DED8DC594ED6F708525434653DA9914A823BC6C1D18AB8355606841C509C5C4B2EA9A7FD719B95E5AD04E7BB21FB2E7FD5C4A4320F2DEB0758D125F2B5F4844B532E9D31DC875F8BD1DFF00D5C8948492492CE312D8EA6B298A27F82440032B8F85978B7ECE1494233E803ECC770DFEC94628D94CDC69409A5ABB8FF2A423FE238AECB5EEB4FAFC1674F9C8C71A45AC1756C3A5AA56B5DC938ADAD6BA56624431A8ECA06D856D699F6FB0A2BD36EC702DAD33313BD3DF6C56D19A2FD59B508A3BB99A0B590F195D372478531484D3CD9A55BE9B7AB2E9AE65D3A6158A5AD4D47DA0D8D258F191EB5AEFE38D31B6BD593AF23855C2593F98F86287737229C8D3C31A4DB553D71547DAEA72C68B139AC6BD06D954E16E5E9F3889DD3A8EEF4E6B42776989A03DB314C656EE2192077D9D6B77688C7D652C08D80EB8C816D94E2792C82F2059C3B2D6304EC7C3E9C4C4D2F1C48A6AE2F217999914AA1ED8889A5196202A5D6A503A22C69C4A8F888EF82302C4668858754436DE97015FE6EF87C336BE3C2EDB835730C4F1A81F1F8D09C4E224B13A8815186FD5240E!
00D8F439238CA7F3515F3EA6B3CBEA3F53E0300C6580D5443573AB195154B5!
78EC0D3F
CEB86389AE7AB88E48ED07566B03EADADD05724728DB6A13D59724410E1E49C6480F3469C8253A85B00A929FF488C7ECB9FDB1FE449993136EBE428B1D2724C5AC50D62AEC55D8AAE11B9D8035C534D3295346143E18A1AC55D8ABFFD6E338AB61980201201D88F1C55AC55D8AB856B8AA20A996548D77AD117F56064CC34CD126D5661A4DA49C12DA22F393D0BA8E5C731EDBC8A0A76BA8DBD8CB15F584AF1CB6CE4CB6D27DA634E1B3775CB406B281F37D8C6CD6BAD5B270B7D4939B2765906CEBFECB26181635858AF8669609165898A3A905586C411BE2ACF74EBCD2FCE968BA6EA6CB6BAE46BC6D6E8FD9948E88FD32576AC3F59D12FF0047BD7B4BC8CA3A9F849E8C3B329C8A557CB7232EB16D1F2558E77114A24FB051CF16E58DA808EF35D82E81E66923B13C52064960706BBFDAE4ADF31812F43D37CB7A2F9F34D4D52290457ACA22BE8B6F865514136D9032A6556F33F33F966F3CBB7ED69742BB9F4DE840650763930589092E1438E28762AEC55BA1F9629A750834C569B181535B3D4C359C96175F14120F81BBAB766C369A4A585188AD69DF145358A1D438A5B0AC7A02715A5C2294F4463F20702D2E5B4BA6DC42E4788538555E2B4D4148020929E054E4486C8C88EA89B8B6BE8006688AA91DC7F6E478436F8D2EF4219E4F1E95DB0F08478D2EF5A6E24EA5B1E!
10C4E6977B46663D5B0D20E43DED19D8FED63C28F10B4677FE6C691C656FACE3B9FBF0D2F1977AADD6A71A471968B31DC9C69165BE55EFE3BE34BC4883A8DD1B716ECD58E9420F5A78634B686A2F7E9E38A1C4C7BD01C2AEE49D97F1C0B6D161FCA0615B5CB2B28A2D062B6D7AB27F37DF8A16924F535C55AC55D8ABFFFD7E338ABB15762AEC55B1D715098E8AAD26A71B01C8A55C0F1E3F16573E4D90E6F40F21DCA47E628E365005D16576269F1302331ADC923663FAB7972E74E83509E68CF2B7BAE00914AA9272EE2DDAA92EFAC35EE917B6E187A50159A046FB400FB5C6BFB3973531FC2C1D8AB6A5948652430DC11B10714B294F33C3AC698BA56BBFDEC43FD135003E2423F665FE65C0A527FD03A9BC8CB6D09B80A2A1E2F8811E238E369E156B633DFA1D2EE2BF5A1FEF33C868411FEEA35FE6C28A28DF29F982F7CA7AFACB2AB0881F4AF2DCF74AFC5B7B7ECE448640BD5BCD5A4E9DE76D3126B2915AE0A096D5AA396E3ECB2E423B3221E74BF953E6BAA86B47A10492ABCA94C9DB05927E5D6AB1920DADD965EA040C7F1031B4D282F93A48686E2CEF78F7222236FF6430A16345E51B462B75697DCC7ECB155E9ED8AAC9351F2505022D32E4B52956947DFFB58ADA02E350D11FF00B9D3D90EDBB48715B413CF6BFB36F4F9B138A1BFAE463A5BC74F03538A5B4D415!
2BFE8B0B127A9535FD78A2DC352707E182102BB7C15C696D736B17447D88D7!
E4831A5B
5A357BF1F664E3F251FD31A5B68EADA89EB3B7DC07F0C696D69D4AFC8A7AEF4F634C348586F6F0F59DCFF00B238A6DA4BCB9470E246246E2A491F8E34B69CC10E99ADAF1F512C354A7C3C8F186520789FEEDF0252CD434CBFD3A6F46F21689BB123E123C55BA3614213143B1570C55D8ABBB62AEC52DFB7EBC55DEF8A1AC52E2298A1D8AB58ABB15762ADD2B8AB650D0B5361D7DB155B8ABFFFD0E338ABB15762AEC55D8AA79E5789E4BAB96404BC76EEFB7CC6573E4DB0E69AB5EDCE9620BD836904AAC29D6A32902DB897A5EA5AD797BCC5A1AC8248D1EE47EF626F84F203E22DF77C3913B200796DCE911E9DAEC708902D95C7250F52400C29C4FD397E3958DDAF24698DDCC5E8DC4B175F4DD96BF234CB5A94CF6C5596687A4E9DA9693475513A13CA4A856DCFBE61E5C9289D9CEC38E321BA55A9797EE2D034B19F5211DC751BF719663CE24C726988DC25F697D7B672092D67785C774623F565F4E1D946BEB26F24125F2D6E06EB751FC32023ECB1FE6DF0532BB52D4EFA7BD6479D848EA3889A94765EDEA789C284DFCBDE6CBDD2A38E20D58A36E50BD48642372B5FE56C052FA0FCB3E71D1F5FD3E2B88275498802585C8043F703C7FC9C431213FDB0A164D043327A72A0743D8E2AC1FCD1E49F2ACB2196655499D764EA7E630A6DE1FE62D2ACF4FBE920B76E48A76AEF!
B0DBB625212371434FBB1415B8ABB143B156B156F156B156F156B15762AEC55B04D7DF1566BE58F33DA4F08D23CC708BCB23F0C12B00658C9FE573D5710C89641FF2A7A3D5D5AEF41D423FAA9AF159ABC837F29E01B094241AAFE5379C34F72A2D45D46057D580F25A7DD5C0A90BF94F5F4AF3D3E71C763FBB6A0A7D18152D9ED67B7204D1B464F40C08FD78554A9F462AEA6F8157B46D4069B1EF8554F143B156FAE2968ED8A1AC55B552C683A9E98AA2ACF4DBBBD97D1B689E690F458D4B1FC305B2A66369F97CB650ADDF996FA1D2A0D8984B07B86FF5231809480EF31DFF009363F2AFD4B43B3717124E805ECC07A8EB1D5A4237F8579620959304C9307FFFD1E338ABB15762AEC55C31564DE4AB79A7BDBC8E204B9B57341EC572126C8A69ADBBD97D62DC44AF14B1A08CC8BDE9F13A7F94AD950E6DBCC30CFAC4A360E40F9E5DC21AB888578EF672D1F27E7C18150E7606BEF8294CAD46F64325D48E400C4D485E95C9060543A1C50AF6B7973692092091908F03407E6304A20B642663C93F5F334135A4B15CC656564215977049CC5FCBD4AC39875571A6344E663816D0C55D538AB81C56D36D335BBCB4B736B0CCB123372A95DBDF937DAED81369AA79F7CE81825BEAB3708871501CD29F22710AB87E6279D092B2EAB73E14572A41F98C5692BBAD6B55BB93D4B9D427!
2D5A82ECC7E5F1570A10724734BF1B5CA4B2375AB54FFC3604A91B2B824900!
311D6846
1435F50BBFF7D31F90AF4F962868D9DD8EB0BFFC09EF8AAC30CABB3230F9823155B423B62AD5315762B4EA62AEC55D8ABA98ABA98AB6A581041A11D0E2967BE42F36DCC17F0D8BDCB5B3CADC526AFC0C49D9645F7C0AF6EB2F335BA916FAA3A5B4DFB13310B1BFFB23F0AB7F9388521172798F438D589BC8DB88A90A791FC30A1E37E7CD4752F353AC56BA6451450B12930203B0247DA3B1ED925610DE52D7475B63DFA32FF0391A64A12797756854B4B07003AD48C690ABA6E9171732189A48E343DE460A2B86916BEFFCB72DAC8144B1C808EA86BF88C69508DA484DE49957C4753912590088B0D21AE2654B5B79AEDC900041B75FBB23C41908944DFF009435A8F5192DBF47CEB312088550B50353F6F11253144C5F975AF2A09AFD23D3ADF6265B960A69FEA7DAC36C69111DAF9074750D75732EB176BD6180048ABEEEDD7136952BCFCC2BE585AD744B58748B53B7EE14190FFAD31DF1016D8CC93DE5FDC069A492E2773B3312EC49F9D70A115AF29B7BA4B006A2CE35434E9CD87A927FC3362104A575C287FFD2E338ABB15762AEC55D8AB2FF00CBE24F981E152795C412A285AD49FB54FF0085C849B228FF0039AFA69609C8F2F4C8E27B50FC59586CB61D7D716D32C29140B149182B2C8A4FC67B315CB834C9062B5F9E1404EBCC5A1B696B632D2897902CA056B43FB43!
6C012424B8A1C70A1DED8ABB157018ABB15762AE15C55BE4474DB14B83B78E2B68A8353BB876560C3BABA86C555BF4BB56AD6B0904D4D1698AB6751B17147B155F74760715B515BB8D1C95122A7F287FBB15B4645A94206D75711D3A29F8BF8E2B6B5EFD5BA5D48DFEB01DFDC8C5567E90626866DBC4A7F41884B7F5C1CC51D0AF72CA3DB142A99E061B3C42BE232485093D3626861A76E8B914A994A529E91F9506295EC24E247A70F80206F8AAC5AD29E9C7F11D8D715733DB4647AB02B1F056F1C505AFAE5A2FD8B6FBD8E14350DF243711DC4702F28D83053D2A0F21D302593DD79E2E2FEC120BD025442C52D4034E44539F3FF002460654C69AE7507A942EA95F85456806F80C82F01EE53FF004F3FEFC3DFAB7F9F6C1C63BD3C07B9717BF514E52AFCC9C3C41784A935D5C9146918D7B924E4AD8D2C2EEDB6368A7A87933F2BE7D5B4C86FAF6E648619B75886C695F85B7F1CA0C89E4DC000CEB4EFCA7F2E5A3ABBA199850D5C93EFD0E3C25066986BB71E5FF26E9125F3C61154718615A2B3B6C02AEDFEAE3C081325E3FACFE6F799AFD985994B085BA08C55FF00E46B648414C9865EEA7A85FC865BCB992773D5A462DFAF2CA616A30DB4F3B058919D8F6504E032014449667E58FCB2D57596592E644B4B6A8E4588673FEAA03903907467C0F466D13F2EFC8962D3DE4!
8936A010F02FF00BC90B11F0F0857ECF5C90DD897835E5C35CDDCD70DB995D!
9F7EBF11
AE4D828E2AFFFD3E338ABB15762AEC55D8AA7FE50BD167E62D3EE18FC1EA04623B72FDDFEAC89661927E60431D16290F09ED5DC293BF3590F25CAE3CD99E4F3F78D929C87DA151BD72D6A2168DCEDD70AB20D76D1AD74DB28E572F2B00E4313C96A3EC6F910C8B1FED9260EC55D8AA26C6D24BA94A44A5DC296006FD3C71A4AA5E08185445F57B85FB71F63EEB8AA0B143B15762AE38AAE8FD3E69CEBC2BF153AD3DB0253D934FD16396D26996EA0D3E65AB3B254920FFBACFED7C38195278D63F95CF6AA1750BA49D8EEEC84D3FD8D306E9D9896AB67696D7456CAE3EB56A45526E257FD890DDF24C690721424715E3B6E3AD4F8E142E81A24995A65E718FB495A5702A3EEAE74A59A19ECA034E03D686424A892BBF13E18D26D33B7D7BCB323402FB44555423D4781D94914FE5AE0A4D854F35C5E4A36B0DD79724904933524B592B58E9FEB622D058AD724C5D8A5DBE284E3CBD0E812CF2B6B73BC3022D5163524BB787C39136CC25B77F57FACCBF55AFD5F911172EBC7F679610C4A8D4E143B157034C555E0BB9E260508047B0C043389DD9BA44AD1C4CCA3914566A78F5CD64C9B76B8C0E16D220C76A2F86024B2118AA1D22D661C6715EF41B7E38633218CE00B8795F4EFB621A8F1249DFC7F0CB0E493488455F44F24D8C9AAFD76E9D63D36DFF7B372D9405F8A9960C848!
A6A942215FCC7F9BD7A8FF00A3FCB6AB6D6508E097054176A0A1E21BECAE5F1877B8E4A49A47E6A79BB4EB9469EF5AEADC35658A40AD55AFC40353E1C970A109E79F3ADE79AF50599818ACA0A8B7B73BD3F99DBFCAC2C58DC56B248788049F000938929E1643A6F956E5C09EE63582DC6FEADC3841FF0003F6B2A948F46D8C40E69BAEADE59D1A3E0B39BD94758EDD78A57DE56C87864B33900E481D47F323579A236DA6A2E9D6C76223F89C8FF8CAE32D8E301A4CD8A4B35C5D4A6495DE695CD4B1259893965303BA8B295255B6606847B8C2C5AC55FFD4E338ABB15762AEC55D8AA26D64646575EB1B0714EBB11912CE2F4EF3AE976DAB5AE97AA5B49437F002D535F8D5072A8FF85CAB8A9B00795C808620F6CB83515F6B049717314110AC9230551EE71280C8FCEB14F05D4714CFEA7C2BC18F5A2A852323167262E726C1D8A156D638659552593D356DB9F61F3C5592689E57D4A46BD9616A1B581A68E64DC350576A78D327548B4326ABA76A30341AA4423BAA522BC4DB7EDEA0C814A497307A12B47C83807661D08F1C52A5B628762AD62AD83435F0ED8AA75AB799EF753D2EC74C991560B1148D86EC7B7C55C00322525C2C51D65AACD6904B0055912452143EFC49FDA18A6D038A1D8A5D438AD3A8715710476C50EC55AC55BA62AEC55D8ABB14BB143B156D4F121A9D!
37F6C0905336D7F502080C00200D87400532BF083778C54A3D6B5189832CA6!
A37C4E28
A3C69045A79A754570CEC18775A01913862CFF003124F6CFCF76E9195B8B76E5D82D08F7EB959C05B066096EBFE71BCD521FA9C0A6DECBAB463AB9A53E3A65D085344E76925B69D7F78DC6DA0794FF0092A4E4EC30A25385F28CF0289352B982CD0FECBB866FF805C8992447BD733F946C80A09F5097B9DA28FF00E6AC1522CAC0517F35DCC7198B4EB78AC90FED22867FF836192E063C6945CDEDDDD316B999E527BB31392A0C6C9510093B0C28568E28854CEFC40FD91BB1F60302694BD561F64951ED86916B3143B157FFD5E338ABB15762AEC55D8AAADB3012807A1FD780B289DDEADE416B6D6B42BCD0EE49FACD9D6E2C8ED5A1D9D14FDAFB5FC994486EDCF38D6F49BBD32ECC37402C8DF1D01AECDBE5D16A92BF95F4F375A9A4AC4AC56A0CEEC3C23DFAF6C4958854F37943AA1F4E5F55194480D79539EF4C42C92139262EC50EC5594793BCEF79E5CBCAB28B8B294709E16DFE03D69FF3461B5669E6DF2EF92B58D206B3E5D7586E187236E94AFF00B28FED2E1A5793CF118A568DBAA9A6452A74C50D9523AEDE18AB54C55D8ABB15753156D4027734C5211296F11A55ABE343B64496C1108FB7B0B46721892A07507FAE532996D100A9243A6C47E1899C8EF5DBC3E788322990885159E00DFDC7C3B6C0F6193DDAF65513695237EF2C9D8FB3D31DD765295AC03D62B26!
E3E0CE4E116834B3D4829F0D8AFD2C7C30B15394827E1B644E9DC9C2B487757353C500F6FD585042811BE2C5C17DC0C2ADF05AFDA0305A69516288F59540EFD71B5A718E21FEEC18AD0770B7FF7E7E18AD06B8DB8FDA24E2BB2C6E1FB35A7BE14394A721CC7C35DFE58AA7C9AD6876683EA5A5ACB2D07EF2E9B9FC43FC85A6468B2B086BAF34EB33A98D66F4223B7A700E0B4FA3E2C78429914A9E492462D231763D598D4FDE70B1B5B850EA62AD8A77FC314BB9B0FB3B62B6B6A49A9C50EC55D8ABB157FFFD6E338ABB15762AEC55D8AB8120D47518AB23D0B55BBD3EF20BEB37E13A1DB7D88FDA8DBFC96CAA41BE2F47D5ECFCB7E69812EE778ECEE9C0F55643C0EDD7D27FDA1918C96410D369DA2683E5FB916F203EAA15129DFD43523E03FC8B88B43C9266E4E77A81D32D0C0A99DBAE162D6143B156B154CF47D5A6B096AADF07F29E87DB0DAA6973A75BEB3135DD8B05B9AFEF2DCEC6B848B5482E6DA6B63C268D91C13D452B91A4DBA5BB9258D2370BC5294A000EC3155F15F7A69C1A08A4F765A9DB15B735EA9047D5A200F829FEB8AA9099791631A9AF6ED8AAA9BA848A7D5D3E78A149A588D3F7607CABFD714B5EA2F65FA2B82936DFD61C1D89FBF070A788AE178FF00CA3E9AFF005C7853C6C9346F26F9BB59884D61A7892261C96462A8B43FE5332E1A4712327FC!
B7F3F5B935D2B9D3FDF6CAFB7FB16F8B1A419316BFB7D474FB936F7D0BDBDC!
2F589C50
EFED8D2F121FEB53766FC31A5E2537919CF226A70A2D6E286B156F15762AEC55AC55BC55D8AB58ABB156F156B155C013D074C52D1C50D571575715762AEC55D8ABB15762AFF00FFD7E338ABB15762AEC55D8ABB15445B5CB42C37A0AD41F039122D9C64F52F23DF585EC4DF5D457E042AC6C030A52B5CAAA8B61DD22F3FEB9697F24696EFCBEA8CF1040388E2771B6594C6D8281BE49834D8A16E143B157571575715558AE2589C346E558742A68714BD83C8571E5DF38E93268FADA45FA4A304432100391DA443B726FF00271560DE73F245D795AF95276F52C6727EAF70BEC7A32F50D82D698ABAAAB9556E401D9BC70A1512DA7701952A0F43518A57FE8FBCA06F4CD0F7A8FEB8A2945E378CD1C50E295CB04CC01552478F6C556FA5252BC4D315A68AB034228475C569DC1A95A6D8AD322D13CF1E6AD182476178E2251C4444065A0FF5B15A64C3F397CF063E2120E5FEFCF4C7EAC28A619AEEADAC6BF7C6FF005221EE080B50028A0F618094D2586271B152305AD2D2AC3A8A62B4DFA521FD93F71C2B4D1561D4118AB5435C50EA1C55D438ABB89C569D4F1C55D8AB58AB862ADE2AEA818AB8B1229DB156B15762AEC55D8ABB15762AEC55D8ABFFD0E338ABB15762AEC55D8ABB15762A8AB4D46EAD2A2191901F024603164254A6CED212E4D4B1FC714F35BD01ED5FD58A16!
13858B58ABB15762AEC55D8AAF8279ADE559A0731CA86A8EA684118AA79ADF9DBCC3AE59C567A8DC0960880A0E0B5247ED33D397FC0E29B483143AA7156C3B0E848F962AE2C49A9249C55B0EE0503103D8E2AD726EB535C55AE47156F9B789C56DBF524FE63F7E29B6FD697F9CFDE7143425907476FBCE2AEF564FE6351B83538A6DC6473D589FA715B6FD697F9CFDE7145AD2EEDD589F99C55AE4715754E2AEA9C55D5C55D5C55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB157FFD1E338ABB15762AEC55D8ABB15762AE18AAE1F4FD1D31641AFBF14358A1D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABFFFD9');
+
+update auction set image_id = 1 where auctionId = 19264723;
+update auction set image_id = 2 where auctionId = 62748261;
+update auction set image_id = 3 where auctionId = 71234567;
+update auction set image_id = 4 where auctionId = 73219532;
+
+insert into feedback (feedbackId, for_account_id, from_account_id, feedbackDate, item_id, rating, comment, response) values (1, 1, 2, CURRENT_TIMESTAMP, 19264723, 0, 'Pleasure to deal with', 'Thanks!');
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-ejb/src/main/resources/seam.properties
===================================================================
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/pom.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,69 @@
+<?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>restbay</artifactId>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.restbay</groupId>
+ <artifactId>restbay-tests</artifactId>
+ <name>Restbay Integration Tests Module (EE6)</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ <type>ejb</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-resteasy</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.testng</groupId>
+ <artifactId>testng</artifactId>
+ <classifier>jdk15</classifier>
+ </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>
+ <dependency>
+ <groupId>org.dbunit</groupId>
+ <artifactId>dbunit</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ <filtering>true</filtering>
+ </testResource>
+ </testResources>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/AuctionServiceTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/AuctionServiceTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/AuctionServiceTest.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,108 @@
+package org.jboss.seam.example.restbay.test;
+
+import org.jboss.seam.mock.EnhancedMockHttpServletResponse;
+import org.jboss.seam.mock.SeamTest;
+import org.jboss.seam.mock.ResourceRequestEnvironment;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import static org.jboss.seam.mock.ResourceRequestEnvironment.Method;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.ResourceRequest;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class AuctionServiceTest extends SeamTest
+{
+
+ ResourceRequestEnvironment requestEnv;
+
+ @BeforeClass
+ public void prepareEnv() throws Exception
+ {
+ requestEnv = new ResourceRequestEnvironment(this)
+ {
+ @Override
+ public Map<String, Object> getDefaultHeaders()
+ {
+ return new HashMap<String, Object>()
+ {{
+ put("Accept", "text/plain");
+ }};
+ }
+ };
+ }
+
+ @Test
+ public void testCategories() throws Exception
+ {
+
+ // Just verify we can do that, even if it doesn't make much sense
+ new ResourceRequest(new ResourceRequestEnvironment(this), Method.GET, "/restv1/category").run();
+
+ reset();
+
+ new ResourceRequest(requestEnv, Method.GET, "/restv1/category")
+ {
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ String[] lines = response.getContentAsString().split("\n");
+ assert lines[0].equals("1,Antiques");
+ assert lines[1].equals("2,Art");
+ assert lines[2].equals("3,Books");
+ }
+
+ }.run();
+
+ reset();
+
+ new ResourceRequest(requestEnv, Method.GET, "/restv1/category/1")
+ {
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("Antiques");
+ }
+
+ }.run();
+
+ }
+
+ @Test
+ public void testAuctions() throws Exception
+ {
+
+ new ResourceRequest(requestEnv, Method.GET, "/restv1/auction")
+ {
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ // TODO: Assert content
+ }
+
+ }.run();
+
+ reset();
+
+ new ResourceRequest(requestEnv, Method.GET, "/restv1/auction/19264723")
+ {
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("Whistler's Mother, original painting by James McNeill Whistler");
+ }
+
+ }.run();
+
+ }
+
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/BasicServiceTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/BasicServiceTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/BasicServiceTest.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,449 @@
+package org.jboss.seam.example.restbay.test;
+
+import org.jboss.seam.mock.EnhancedMockHttpServletResponse;
+import org.jboss.seam.mock.EnhancedMockHttpServletRequest;
+import org.jboss.seam.mock.SeamTest;
+import org.jboss.seam.mock.ResourceRequestEnvironment;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.Method;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.ResourceRequest;
+import org.testng.annotations.Test;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.BeforeClass;
+import static org.testng.Assert.assertEquals;
+
+import javax.servlet.http.Cookie;
+import javax.ws.rs.core.MediaType;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * This is the test matrix for resources:
+ * </p>
+ *
+ * <pre>
+ * | EVENT | CONVERSATION | SESSION | APPLICATION | STATELESS
+ * ---------------------------------------------------------------------------------------------
+ * Plain JAX-RS Resource | OK | - | - | - | -
+ * ---------------------------------------------------------------------------------------------
+ * POJO Seam Component Resource | OK | ? | ? | OK | OK
+ * ---------------------------------------------------------------------------------------------
+ * POJO interface-annotated Component | OK | ? | ? | OK | OK
+ * ---------------------------------------------------------------------------------------------
+ * EJB Plain SLSB Resource | - | - | - | - | OK
+ * ---------------------------------------------------------------------------------------------
+ * EJB SLSB Seam Component Resource | - | - | - | - | OK
+ * ---------------------------------------------------------------------------------------------
+ * EJB SFSB Seam Component Resource | ? | ? | ? | ? | -
+ * ---------------------------------------------------------------------------------------------
+ * </pre>
+ *
+ * <p>
+ * Note that all EJB resources are always @Path annotated on their interface, not the implementation class.
+ * </p>
+ *
+ * <p>
+ * This is the test matrix for providers:
+ * </p>
+ *
+ * <pre>
+ * | EVENT | CONVERSATION | SESSION | APPLICATION | STATELESS
+ * ---------------------------------------------------------------------------------------------
+ * Plain JAX-RS Provider | - | - | - | - | OK
+ * ---------------------------------------------------------------------------------------------
+ * RESTEasy StringConverter Provider | - | - | - | - | OK
+ * ---------------------------------------------------------------------------------------------
+ * RESTEasy StringConverter Component | ? | - | - | ? | ?
+ * ---------------------------------------------------------------------------------------------
+ * POJO Seam Component Provider | ? | - | - | OK | ?
+ * ---------------------------------------------------------------------------------------------
+ * POJO interface-annotated Component | ? | - | - | OK | ?
+ * ---------------------------------------------------------------------------------------------
+ * EJB Plain SLSB Provider | - | - | - | - | ?
+ * ---------------------------------------------------------------------------------------------
+ * EJB SLSB Seam Component Provider | - | - | - | - | ?
+ * ---------------------------------------------------------------------------------------------
+ * EJB SFSB Seam Component Resource | ? | - | - | ? | -
+ * ---------------------------------------------------------------------------------------------
+ * </pre>
+ *
+ */
+public class BasicServiceTest extends SeamTest
+{
+
+ ResourceRequestEnvironment requestEnv;
+
+ @BeforeClass
+ public void prepareEnv() throws Exception
+ {
+ requestEnv = new ResourceRequestEnvironment(this)
+ {
+ @Override
+ public Map<String, Object> getDefaultHeaders()
+ {
+ return new HashMap<String, Object>()
+ {{
+ put("Accept", "text/plain");
+ }};
+ }
+
+ @Override
+ public String getServletPath()
+ {
+ return "/override/seam/resource/is/not/my/path/for/SeamResourceServlet";
+ }
+
+ };
+ }
+
+ @DataProvider(name = "queryPaths")
+ public Object[][] getData()
+ {
+ return new String[][] {
+ { "/restv1/plainTest" },
+
+ { "/restv1/eventComponentTest" },
+ { "/restv1/applicationComponentTest" },
+ { "/restv1/statelessComponentTest" },
+
+ { "/restv1/interfaceEventComponentTest" },
+ { "/restv1/interfaceApplicationComponentTest" },
+ { "/restv1/interfaceStatelessComponentTest" },
+
+ { "/restv1/statelessEjbTest" },
+ { "/restv1/statelessEjbComponentTest" }
+ };
+ }
+
+ @Test
+ public void testRootResource() throws Exception {
+ new ResourceRequest(requestEnv, Method.GET, "/restv1/")
+ {
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 200);
+ assertEquals(response.getContentAsString(), "Root");
+ }
+
+ }.run();
+ }
+
+ @Test(dataProvider = "queryPaths")
+ public void testExeptionMapping(final String resourcePath) throws Exception
+ {
+ new ResourceRequest(requestEnv, Method.GET, resourcePath + "/trigger/unsupported")
+ {
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 501;
+ assert response.getStatusMessage().equals("The request operation is not supported: foo");
+ }
+
+ }.run();
+
+ }
+
+ @Test(dataProvider = "queryPaths")
+ public void testEchos(final String resourcePath) throws Exception
+ {
+ new ResourceRequest(requestEnv, Method.GET, resourcePath + "/echouri")
+ {
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().endsWith("/echouri");
+ }
+
+ }.run();
+
+ reset();
+
+ new ResourceRequest(requestEnv, Method.GET, resourcePath + "/echoquery")
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ request.setQueryString("asdf=123");
+ request.addQueryParameter("bar", "bbb");
+ request.addQueryParameter("baz", "bzzz");
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("bbb");
+ }
+
+ }.run();
+
+ reset();
+
+ new ResourceRequest(requestEnv, Method.GET, resourcePath + "/echoheader")
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ request.addHeader("bar", "baz");
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("baz");
+ }
+
+ }.run();
+
+ reset();
+
+ new ResourceRequest(requestEnv, Method.GET, resourcePath + "/echocookie")
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ request.addCookie(new Cookie("bar", "baz"));
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("baz");
+ }
+
+ }.run();
+
+ reset();
+
+ new ResourceRequest(requestEnv, Method.GET, resourcePath + "/foo/bar/asdf")
+ {
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("bar: asdf");
+ }
+
+ }.run();
+
+ reset();
+
+ new ResourceRequest(requestEnv, Method.GET, resourcePath + "/echotwoparams/foo/bar")
+ {
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("foobar");
+ }
+
+ }.run();
+
+ }
+
+ @Test(dataProvider = "queryPaths")
+ public void testEncoding(final String resourcePath) throws Exception
+ {
+ new ResourceRequest(requestEnv, Method.GET, resourcePath + "/echoencoded/foo bar")
+ {
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("foo%20bar");
+ }
+
+ }.run();
+ }
+
+ @Test(dataProvider = "queryPaths")
+ public void testFormHandling(final String resourcePath) throws Exception
+ {
+ new ResourceRequest(requestEnv, Method.POST, resourcePath + "/echoformparams")
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ request.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+ request.addParameter("foo", new String[]{"bar", "baz"});
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("barbaz");
+ }
+
+ }.run();
+
+ reset();
+
+ new ResourceRequest(requestEnv, Method.POST, resourcePath + "/echoformparams2")
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ request.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+ request.addParameter("foo", new String[]{"bar", "baz"});
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("barbaz");
+ }
+
+ }.run();
+
+ reset();
+
+ new ResourceRequest(requestEnv, Method.POST, resourcePath + "/echoformparams3")
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ request.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+ request.addHeader("bar", "foo");
+ request.addParameter("foo", new String[]{"bar", "baz"});
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("foobarbaz");
+ }
+
+ }.run();
+
+ reset();
+
+ }
+
+ @Test(dataProvider = "queryPaths")
+ public void testStringConverter(final String resourcePath) throws Exception
+ {
+ final String ISO_DATE = "2007-07-10T14:54:56-0500";
+ final String ISO_DATE_MILLIS = "1184097296000";
+
+ new ResourceRequest(requestEnv, Method.GET, resourcePath + "/convertDate/" + ISO_DATE)
+ {
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assertEquals(response.getContentAsString(), ISO_DATE_MILLIS);
+ }
+
+ }.run();
+
+ }
+
+ @Test(dataProvider = "queryPaths")
+ public void testProvider(final String resourcePath) throws Exception
+ {
+
+ new ResourceRequest(requestEnv, Method.GET, resourcePath + "/commaSeparated")
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ request.addHeader("Accept", "text/csv");
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("foo,bar\r\nasdf,123\r\n");
+ }
+
+ }.run();
+
+ reset();
+
+ new ResourceRequest(requestEnv, Method.GET, resourcePath + "/commaSeparatedStrings")
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ request.addHeader("Accept", "text/plain");
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("abc,foo,bar,baz");
+ }
+
+ }.run();
+
+ reset();
+
+ new ResourceRequest(requestEnv, Method.GET, resourcePath + "/commaSeparatedIntegers")
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ request.addHeader("Accept", "text/plain");
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ assert response.getContentAsString().equals("abc,1,2,3");
+ }
+ };
+ // }.run();
+ // TODO: Retracted support for Seam component providers, injection shouldn't happen, see https://jira.jboss.org/jira/browse/JBSEAM-4247
+
+ }
+
+ @Test
+ // JBPAPP-3713
+ public void synchronizationsLookup() throws Exception
+ {
+ new ResourceRequest(requestEnv, Method.GET, "/restv1/eventComponentTest/synchronizationsLookup")
+ {
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 200, "Unexpected response code.");
+ assert response.getContentAsString().equals("true");
+ }
+
+ }.run();
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/CategoryServiceDBUnitTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/CategoryServiceDBUnitTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/CategoryServiceDBUnitTest.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,82 @@
+package org.jboss.seam.example.restbay.test;
+
+import org.dbunit.operation.DatabaseOperation;
+import org.testng.annotations.Test;
+import org.testng.annotations.BeforeClass;
+import org.jboss.seam.mock.DBUnitSeamTest;
+
+import org.jboss.seam.mock.ResourceRequestEnvironment;
+import org.jboss.seam.mock.EnhancedMockHttpServletRequest;
+import org.jboss.seam.mock.EnhancedMockHttpServletResponse;
+
+import static org.jboss.seam.mock.ResourceRequestEnvironment.ResourceRequest;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.Method;
+
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ *
+ */
+public class CategoryServiceDBUnitTest extends DBUnitSeamTest
+{
+
+ protected void prepareDBUnitOperations() {
+ beforeTestOperations.add(
+ new DataSetOperation("org/jboss/seam/example/restbay/test/dbunitdata.xml", DatabaseOperation.CLEAN_INSERT)
+ );
+ }
+
+ // Or, if you don't want shared headers between test methods, just use
+ // it directly in your test method:
+
+ // new ResourceRequest(new ResourceRequestTest(this), Method.GET, ...).run();
+
+ ResourceRequestEnvironment sharedEnvironment;
+ @BeforeClass
+ public void prepareSharedEnvironment() throws Exception
+ {
+ sharedEnvironment = new ResourceRequestEnvironment(this)
+ {
+ @Override
+ public Map<String, Object> getDefaultHeaders()
+ {
+ return new HashMap<String, Object>()
+ {{
+ put("Accept", "text/plain");
+ }};
+ }
+ };
+ }
+
+ @Test
+ public void testCategories() throws Exception
+ {
+ // new ResourceRequest(new ResourceRequestEnvironment(this), Method.GET, "/restv1/category")
+ // or:
+ new ResourceRequest(sharedEnvironment, Method.GET, "/restv1/category")
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ // Or set it as default in environment
+ request.addHeader("Accept", "text/plain");
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assert response.getStatus() == 200;
+ String[] lines = response.getContentAsString().split("\n");
+ assert lines[0].equals("16,foo");
+ assert lines[1].equals("17,bar");
+ assert lines[2].equals("18,baz");
+ }
+
+ }.run();
+
+ }
+
+
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/ContextDataTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/ContextDataTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/ContextDataTest.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,50 @@
+package org.jboss.seam.example.restbay.test;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jboss.seam.mock.EnhancedMockHttpServletRequest;
+import org.jboss.seam.mock.EnhancedMockHttpServletResponse;
+import org.jboss.seam.mock.ResourceRequestEnvironment;
+import org.jboss.seam.mock.SeamTest;
+import org.jboss.seam.mock.ResourceRequestEnvironment.Method;
+import org.jboss.seam.mock.ResourceRequestEnvironment.ResourceRequest;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+/**
+ *
+ * @author Jozef Hartinger
+ */
+public class ContextDataTest extends SeamTest
+{
+ @DataProvider(name = "contextDataTypes")
+ public Object[][] getContextDataTypePaths()
+ {
+ return new String[][]{ { "/providers" }, { "/registry" }, { "/dispatcher" } };
+ }
+
+ @Test(dataProvider = "contextDataTypes")
+ public void testContextData(String pathSegment) throws Exception
+ {
+ final String path = "/restv1/contextData" + pathSegment;
+
+ new ResourceRequest(new ResourceRequestEnvironment(this), Method.GET, path)
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.addHeader("Accept", "text/plain");
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 200, "Unexpected response code.");
+ assertEquals(response.getContentAsString(), "true", "Unexpected response.");
+ }
+
+ }.run();
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/ResourceHomeTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/ResourceHomeTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/ResourceHomeTest.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,170 @@
+package org.jboss.seam.example.restbay.test;
+
+import org.jboss.seam.mock.EnhancedMockHttpServletRequest;
+import org.jboss.seam.mock.EnhancedMockHttpServletResponse;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.Method;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.ResourceRequest;
+import org.jboss.seam.mock.SeamTest;
+import org.jboss.seam.mock.ResourceRequestEnvironment;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+
+/**
+ *
+ * @author Jozef Hartinger
+ *
+ */
+public class ResourceHomeTest extends SeamTest
+{
+
+ @DataProvider(name = "queryPaths")
+ public Object[][] getData()
+ {
+ return new String[][]{ { "/configuredCategory" }, { "/extendedCategory" } };
+ }
+
+ @Test(dataProvider = "queryPaths")
+ public void testResourceHomeRead(final String resourcePath) throws Exception
+ {
+ final String expectedResponse = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><category><categoryId>1</categoryId><name>Antiques</name></category>";
+ final String path = "/restv1" + resourcePath + "/1";
+
+ new ResourceRequest(new ResourceRequestEnvironment(this), Method.GET, path)
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.addHeader("Accept", "application/xml");
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getContentAsString(), expectedResponse, "Unexpected response.");
+ }
+
+ }.run();
+ }
+
+ @Test(dataProvider = "queryPaths")
+ public void testResourceHomeCreate(final String resourcePath) throws Exception
+ {
+ final String name = "Airplanes";
+ final String body = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><category><name>" + name + "</name></category>";
+ final String mediaType = "application/xml";
+ final String path = "/restv1" + resourcePath;
+
+ new ResourceRequest(new ResourceRequestEnvironment(this), Method.POST, path)
+ {
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ // TODO for some reason content type must be set using both these
+ // methods
+ request.addHeader("Content-Type", mediaType);
+ request.setContentType(mediaType);
+ request.setContent(body.getBytes());
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 201, "Unexpected response code.");
+ }
+
+ }.run();
+ }
+
+ @Test(dataProvider = "queryPaths")
+ public void testResourceHomeUpdate(String resourcePath) throws Exception
+ {
+ final String body = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><category><categoryId>5</categoryId><name>" + resourcePath.hashCode() + "</name></category>";
+ final String mediaType = "application/xml";
+ final String path = "/restv1" + resourcePath + "/5";
+
+ new ResourceRequest(new ResourceRequestEnvironment(this), Method.PUT, path)
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.setContentType(mediaType);
+ request.addHeader("Content-Type", mediaType);
+ request.setContent(body.getBytes());
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 204, "Unexpected response code.");
+ }
+
+ }.run();
+
+ reset();
+
+ new ResourceRequest(new ResourceRequestEnvironment(this), Method.GET, path)
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.addHeader("Accept", mediaType);
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 200, "Unexpected response code.");
+ assertEquals(response.getContentAsString(), body, "Unexpected response.");
+ }
+
+ }.run();
+
+ }
+
+ @Test
+ public void testResourceHomeDelete() throws Exception
+ {
+
+ final String path = "/restv1/configuredCategory/15004";
+
+ new ResourceRequest(new ResourceRequestEnvironment(this), Method.DELETE, path)
+ {
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 204, "Unexpected response code.");
+ }
+
+ }.run();
+
+ reset();
+
+ new ResourceRequest(new ResourceRequestEnvironment(this), Method.GET, path)
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.addHeader("Accept", "application/xml");
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 404, "Unexpected response code.");
+ }
+
+ }.run();
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/ResourceQueryTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/ResourceQueryTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/ResourceQueryTest.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,55 @@
+package org.jboss.seam.example.restbay.test;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jboss.seam.mock.EnhancedMockHttpServletRequest;
+import org.jboss.seam.mock.EnhancedMockHttpServletResponse;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.Method;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.ResourceRequest;
+import org.jboss.seam.mock.SeamTest;
+import org.jboss.seam.mock.ResourceRequestEnvironment;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+/**
+ *
+ * @author Jozef Hartinger
+ *
+ */
+public class ResourceQueryTest extends SeamTest
+{
+
+ @DataProvider(name = "queryPaths")
+ public Object[][] getData()
+ {
+ String[][] data = new String[2][1];
+ data[0][0] = "/configuredCategory";
+ data[1][0] = "/extendedCategory";
+ return data;
+ }
+
+ @Test(dataProvider = "queryPaths")
+ public void testResourceQuery(String path) throws Exception
+ {
+ new ResourceRequest(new ResourceRequestEnvironment(this), Method.GET, "/restv1" + path)
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.addHeader("Accept", "application/xml");
+ request.setQueryString("start=2&show=2");
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ String expectedResponse = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><collection><category><categoryId>3</categoryId><name>Books</name></category><category><categoryId>4</categoryId><name>Cameras and Photography</name></category></collection>";
+ assertEquals(response.getContentAsString(), expectedResponse, "Unexpected response.");
+ }
+
+ }.run();
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/SecurityTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/SecurityTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/SecurityTest.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,210 @@
+package org.jboss.seam.example.restbay.test;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jboss.seam.mock.EnhancedMockHttpServletRequest;
+import org.jboss.seam.mock.EnhancedMockHttpServletResponse;
+import org.jboss.seam.mock.SeamTest;
+import org.jboss.seam.mock.ResourceRequestEnvironment;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.Method;
+import static org.jboss.seam.mock.ResourceRequestEnvironment.ResourceRequest;
+import org.testng.annotations.Test;
+import org.testng.annotations.BeforeClass;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This class tests RESTEasy integration together with Seam Security.
+ *
+ * @author Jozef Hartinger
+ */
+public class SecurityTest extends SeamTest
+{
+
+ ResourceRequestEnvironment requestEnv;
+
+ @BeforeClass
+ public void prepareEnv() throws Exception
+ {
+ requestEnv = new ResourceRequestEnvironment(this)
+ {
+ @Override
+ public Map<String, Object> getDefaultHeaders()
+ {
+ return new HashMap<String, Object>()
+ {{
+ put("Accept", "text/plain");
+ }};
+ }
+ };
+ }
+
+ @Test
+ public void basicAuthTest() throws Exception
+ {
+ new ResourceRequest(requestEnv, Method.GET, "/restv1/secured/admin")
+ {
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.addHeader("Accept", "text/plain");
+ request.addHeader("Authorization", "Basic ZGVtbzpkZW1v"); // demo:demo
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 200, "Unexpected response code.");
+ assertEquals(response.getContentAsString(), "false", "Unexpected response.");
+ }
+
+ }.run();
+ }
+
+ @Test
+ public void invalidCredentialsBasicAuthTest() throws Exception
+ {
+ new ResourceRequest(requestEnv, Method.GET, "/restv1/secured")
+ {
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.addHeader("Accept", "text/plain");
+ request.addHeader("Authorization", "Basic ZGVtbzpvbWVk"); // demo:omed
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(
+ response.getHeader("WWW-Authenticate"),
+ "Basic realm=\"Seam RestBay Application\"",
+ "Invalid authentication header value"
+ );
+ assertEquals(response.getStatus(), 401, "Unexpected response code.");
+ }
+
+ }.run();
+ }
+
+ @Test
+ public void adminRoleTest() throws Exception
+ {
+ new ResourceRequest(requestEnv, Method.GET, "/restv1/secured/admin")
+ {
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.addHeader("Accept", "text/plain");
+ request.addHeader("Authorization", "Basic YWRtaW46YWRtaW4="); // admin:admin
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 200, "Unexpected response code.");
+ assertEquals(response.getContentAsString(), "true");
+ }
+
+ }.run();
+ }
+
+ @Test
+ public void adminRoleTestWithRestriction() throws Exception
+ {
+ new ResourceRequest(requestEnv, Method.GET, "/restv1/secured/restrictedAdmin")
+ {
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.addHeader("Accept", "text/plain");
+ request.addHeader("Authorization", "Basic YWRtaW46YWRtaW4="); // admin:admin
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 200, "Unexpected response code.");
+ assertEquals(response.getContentAsString(), "true");
+ }
+
+ }.run();
+ }
+
+ @Test
+ public void invalidAdminAuthorization() throws Exception
+ {
+ new ResourceRequest(requestEnv, Method.GET, "/restv1/secured/restrictedAdmin")
+ {
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.addHeader("Accept", "text/plain");
+ request.addHeader("Authorization", "Basic ZGVtbzpkZW1v"); // demo:demo
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ // See AuthorizationException mapping to 403 in pages.xml!
+ assertEquals(response.getStatus(), 403, "Unexpected response code.");
+ assert response.getStatusMessage().startsWith("Not authorized to access resource");
+ }
+
+ }.run();
+ }
+
+ @Test
+ // JBPAPP-3713
+ public void ejbLookup() throws Exception
+ {
+ new ResourceRequest(requestEnv, Method.GET, "/restv1/secured/ejbLookup")
+ {
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.addHeader("Accept", "text/plain");
+ request.addHeader("Authorization", "Basic ZGVtbzpkZW1v"); // demo:demo
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 200, "Unexpected response code.");
+ assert response.getContentAsString().equals("true");
+ }
+
+ }.run();
+ }
+
+ @Test
+ // JBPAPP-3713
+ public void synchronizationsLookup() throws Exception
+ {
+ new ResourceRequest(requestEnv, Method.GET, "/restv1/secured/synchronizationsLookup")
+ {
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.addHeader("Accept", "text/plain");
+ request.addHeader("Authorization", "Basic ZGVtbzpkZW1v"); // demo:demo
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 200, "Unexpected response code.");
+ assert response.getContentAsString().equals("true");
+ }
+
+ }.run();
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/SubresourceTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/SubresourceTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/java/org/jboss/seam/example/restbay/test/SubresourceTest.java 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,39 @@
+package org.jboss.seam.example.restbay.test;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jboss.seam.mock.EnhancedMockHttpServletRequest;
+import org.jboss.seam.mock.EnhancedMockHttpServletResponse;
+import org.jboss.seam.mock.ResourceRequestEnvironment;
+import org.jboss.seam.mock.SeamTest;
+import org.jboss.seam.mock.ResourceRequestEnvironment.Method;
+import org.jboss.seam.mock.ResourceRequestEnvironment.ResourceRequest;
+import org.testng.annotations.Test;
+
+public class SubresourceTest extends SeamTest
+{
+ @Test
+ public void testSubresourceGET() throws Exception
+ {
+ final String path = "/restv1/garage/1";
+
+ new ResourceRequest(new ResourceRequestEnvironment(this), Method.GET, path)
+ {
+
+ @Override
+ protected void prepareRequest(EnhancedMockHttpServletRequest request)
+ {
+ super.prepareRequest(request);
+ request.addHeader("Accept", "text/plain");
+ }
+
+ @Override
+ protected void onResponse(EnhancedMockHttpServletResponse response)
+ {
+ assertEquals(response.getStatus(), 200, "Unexpected response code.");
+ assertEquals(response.getContentAsString(), "Honda", "Unexpected response.");
+ }
+
+ }.run();
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/WEB-INF/components.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/WEB-INF/components.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/WEB-INF/components.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components xmlns="http://jboss.com/products/seam/components"
+ xmlns:core="http://jboss.com/products/seam/core"
+ xmlns:persistence="http://jboss.com/products/seam/persistence"
+ xmlns:security="http://jboss.com/products/seam/security"
+ xmlns:drools="http://jboss.com/products/seam/drools"
+ xmlns:async="http://jboss.com/products/seam/async"
+ xmlns:web="http://jboss.com/products/seam/web"
+ xmlns:resteasy="http://jboss.com/products/seam/resteasy"
+ xmlns:framework="http://jboss.com/products/seam/framework"
+ xmlns:transaction="http://jboss.com/products/seam/transaction"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation=
+ "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.3.xsd
+ http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.3.xsd
+ http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.3.xsd
+ http://jboss.com/products/seam/async http://jboss.com/products/seam/async-2.3.xsd
+ http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.3.xsd
+ http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.3.xsd
+ http://jboss.com/products/seam/resteasy http://jboss.com/products/seam/resteasy-2.3.xsd
+ http://jboss.com/products/seam/framework http://jboss.com/products/seam/framework-2.3.xsd
+ http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.3.xsd
+ http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.3.xsd">
+
+ <core:init jndi-pattern="#{ejbName}/local" debug="true"/>
+
+ <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:/restbayEntityManagerFactory"/>
+
+ <async:quartz-dispatcher/>
+
+ <framework:entity-home name="categoryHome"
+ entity-class="org.jboss.seam.example.restbay.Category"
+ auto-create="true"/>
+
+ <resteasy:application resource-path-prefix="/restv1">
+ <resteasy:resource-class-names>
+ <value>org.jboss.seam.example.restbay.resteasy.statelessejb.StatelessEjbTestResourceBean</value>
+ </resteasy:resource-class-names>
+ </resteasy:application>
+
+ <resteasy:resource-home path="/configuredCategory" name="configuredCategoryResourceHome"
+ entity-home="#{categoryHome}" entity-id-class="java.lang.Integer"
+ media-types="application/xml application/json"/>
+
+ <resteasy:resource-query path="/configuredCategory" name="configuredCategoryResourceQuery"
+ entity-class="org.jboss.seam.example.restbay.Category"
+ media-types="application/xml application/json"/>
+
+ <web:authentication-filter
+ url-pattern="/seam/resource/restv1/secured/*"
+ auth-type="basic"
+ realm="Seam RestBay Application"/>
+
+ <security:identity authenticate-method="#{testAuthenticator.authenticate}" />
+
+</components>
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/org/jboss/seam/example/restbay/test/dbunitdata.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/org/jboss/seam/example/restbay/test/dbunitdata.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/org/jboss/seam/example/restbay/test/dbunitdata.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<dataset>
+
+ <category categoryId="16" name="foo"/>
+ <category categoryId="17" name="bar"/>
+ <category categoryId="18" name="baz"/>
+
+</dataset>
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources/seam.properties
===================================================================
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources-integration/testng.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources-integration/testng.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-tests/src/test/resources-integration/testng.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,57 @@
+<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
+
+<suite name="RestBay" verbose="2" parallel="false">
+
+ <test name="RestBay Basic Services">
+ <classes>
+ <class name="org.jboss.seam.example.restbay.test.BasicServiceTest"/>
+ </classes>
+ </test>
+
+ <test name="RestBay Auction Services">
+ <classes>
+ <class name="org.jboss.seam.example.restbay.test.AuctionServiceTest"/>
+ </classes>
+ </test>
+
+ <test name="RestBay ResourceHome">
+ <classes>
+ <class name="org.jboss.seam.example.restbay.test.ResourceHomeTest"/>
+ </classes>
+ </test>
+
+ <test name="RestBay ResourceQuery">
+ <classes>
+ <class name="org.jboss.seam.example.restbay.test.ResourceQueryTest"/>
+ </classes>
+ </test>
+
+ <test name="RestBay Security">
+ <classes>
+ <class name="org.jboss.seam.example.restbay.test.SecurityTest"/>
+ </classes>
+ </test>
+
+ <test name="RestBay Subresources">
+ <classes>
+ <class name="org.jboss.seam.example.restbay.test.SubresourceTest"/>
+ </classes>
+ </test>
+
+ <test name="RestBay Context Data">
+ <classes>
+ <class name="org.jboss.seam.example.restbay.test.ContextDataTest"/>
+ </classes>
+ </test>
+
+ <test name="RestBay DBUnit Integration">
+
+ <parameter name="database" value="hsql"/>
+ <parameter name="datasourceJndiName" value="java:/restbayDatasource"/>
+
+ <classes>
+ <class name="org.jboss.seam.example.restbay.test.CategoryServiceDBUnitTest"/>
+ </classes>
+ </test>
+
+</suite>
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/pom.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,70 @@
+<?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>restbay</artifactId>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.restbay</groupId>
+ <artifactId>restbay-web</artifactId>
+ <packaging>war</packaging>
+ <name>Restbay Web Module (EE6)</name>
+
+ <properties>
+ <!-- filtering property for components.xml -->
+ <jndiPattern>java:app/restbay-ejb/#{ejbName}</jndiPattern>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.restbay</groupId>
+ <artifactId>restbay-ejb</artifactId>
+ <type>ejb</type>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-ui</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-jul</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils</artifactId>
+ </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>
+
+</project>
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/components.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/components.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/components.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components xmlns="http://jboss.com/products/seam/components"
+ xmlns:core="http://jboss.com/products/seam/core"
+ xmlns:persistence="http://jboss.com/products/seam/persistence"
+ xmlns:security="http://jboss.com/products/seam/security"
+ xmlns:drools="http://jboss.com/products/seam/drools"
+ xmlns:async="http://jboss.com/products/seam/async"
+ xmlns:web="http://jboss.com/products/seam/web"
+ xmlns:resteasy="http://jboss.com/products/seam/resteasy"
+ xmlns:framework="http://jboss.com/products/seam/framework"
+ xmlns:transaction="http://jboss.com/products/seam/transaction"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation=
+ "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.3.xsd
+ http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.3.xsd
+ http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.3.xsd
+ http://jboss.com/products/seam/async http://jboss.com/products/seam/async-2.3.xsd
+ http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.3.xsd
+ http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.3.xsd
+ http://jboss.com/products/seam/resteasy http://jboss.com/products/seam/resteasy-2.3.xsd
+ http://jboss.com/products/seam/framework http://jboss.com/products/seam/framework-2.3.xsd
+ http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.3.xsd
+ http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.3.xsd">
+
+ <core:init jndi-pattern="@jndiPattern@" debug="true"/>
+
+ <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:/restbayEntityManagerFactory"/>
+
+ <async:quartz-dispatcher/>
+
+ <framework:entity-home name="categoryHome"
+ entity-class="org.jboss.seam.example.restbay.Category"
+ auto-create="true"/>
+
+ <resteasy:application resource-path-prefix="/restv1">
+ <resteasy:resource-class-names>
+ <value>org.jboss.seam.example.restbay.resteasy.statelessejb.StatelessEjbTestResourceBean</value>
+ </resteasy:resource-class-names>
+ </resteasy:application>
+
+ <resteasy:resource-home path="/configuredCategory" name="configuredCategoryResourceHome"
+ entity-home="#{categoryHome}" entity-id-class="java.lang.Integer"
+ media-types="application/xml application/json"/>
+
+ <resteasy:resource-query path="/configuredCategory" name="configuredCategoryResourceQuery"
+ entity-class="org.jboss.seam.example.restbay.Category"
+ media-types="application/xml application/json"/>
+
+ <web:authentication-filter
+ url-pattern="/seam/resource/restv1/secured/*"
+ auth-type="basic"
+ realm="Seam RestBay Application"/>
+
+ <security:identity authenticate-method="#{testAuthenticator.authenticate}" />
+
+ <component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/>
+
+</components>
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/faces-config.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/faces-config.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/faces-config.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faces-config version="2.1"
+ 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-facesconfig_2_1.xsd">
+
+</faces-config>
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/pages.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/pages.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/pages.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,18 @@
+<?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 http://jboss.com/products/seam/pages-2.3.xsd">
+
+ <exception class="java.lang.UnsupportedOperationException" log="false">
+ <http-error error-code="501">
+ <message>The request operation is not supported: #{org.jboss.seam.handledException.message}</message>
+ </http-error>
+ </exception>
+
+ <exception class="org.jboss.seam.security.AuthorizationException" log="false">
+ <http-error error-code="403">
+ <message>Not authorized to access resource: #{org.jboss.seam.handledException.message}</message>
+ </http-error>
+ </exception>
+
+</pages>
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/web.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/web.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/WEB-INF/web.xml 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,93 @@
+<?xml version="1.0" ?>
+<web-app 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_3_0.xsd"
+ version="3.0">
+
+ <!-- Seam -->
+
+ <listener>
+ <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
+ </listener>
+
+ <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>
+
+ <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>
+
+ <!-- Facelets development mode (disable in production) -->
+
+ <context-param>
+ <param-name>facelets.DEVELOPMENT</param-name>
+ <param-value>false</param-value>
+ </context-param>
+
+ <context-param>
+ <param-name>facelets.SKIP_COMMENTS</param-name>
+ <param-value>true</param-value>
+ </context-param>
+
+ <!-- JSF -->
+
+ <context-param>
+ <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
+ <param-value>.xhtml</param-value>
+ </context-param>
+
+ <context-param>
+ <param-name>com.sun.faces.numberOfViewsInSession</param-name>
+ <param-value>15</param-value>
+ </context-param>
+
+ <context-param>
+ <param-name>com.sun.faces.numberOfLogicalViews</param-name>
+ <param-value>15</param-value>
+ </context-param>
+
+ <context-param>
+ <param-name>com.sun.faces.responseBufferSize</param-name>
+ <param-value>32768</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>
+
+ <security-constraint>
+ <display-name>Restrict raw XHTML Documents</display-name>
+ <web-resource-collection>
+ <web-resource-name>XHTML</web-resource-name>
+ <url-pattern>*.xhtml</url-pattern>
+ </web-resource-collection>
+ <auth-constraint>
+ <role-name>NONE</role-name>
+ </auth-constraint>
+ </security-constraint>
+
+ <session-config>
+ <session-timeout>10</session-timeout>
+ </session-config>
+
+</web-app>
Added: branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/index.html
===================================================================
--- branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/index.html (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/restbay/restbay-web/src/main/webapp/index.html 2012-04-02 11:16:37 UTC (rev 14464)
@@ -0,0 +1,31 @@
+<html>
+<head>
+ <title>restBay Seam example</title>
+</head>
+
+<body>
+
+<p>This application does not have a human-user interface. Execute 'ant test' to run the unit tests
+and explore the source code.</p>
+
+<p>
+You can invoke some of the RESTful webservices directly in your browser though:
+</p>
+
+<ul>
+ <li>
+ <a href="http://localhost:8080/seam-restbay/seam/resource/restv1/auction">GET /auction</a>
+ </li>
+ <li>
+ <a href="http://localhost:8080/seam-restbay/seam/resource/restv1/auction/19264723">GET /auction/{auctionId}</a>
+ </li>
+ <li>
+ <a href="http://localhost:8080/seam-restbay/seam/resource/restv1/category">GET /category/</a>
+ </li>
+ <li>
+ <a href="http://localhost:8080/seam-restbay/seam/resource/restv1/category/4">GET /category/{categoryId}</a>
+ </li>
+</ul>
+
+</body>
+</html>
12 years, 1 month
Seam SVN: r14463 - branches/community/Seam_2_3/examples-ee6.
by seam-commits@lists.jboss.org
Author: maschmid
Date: 2012-04-02 06:30:06 -0400 (Mon, 02 Apr 2012)
New Revision: 14463
Modified:
branches/community/Seam_2_3/examples-ee6/pom.xml
Log:
enable nestedbooking
Modified: branches/community/Seam_2_3/examples-ee6/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/pom.xml 2012-04-02 10:27:17 UTC (rev 14462)
+++ branches/community/Seam_2_3/examples-ee6/pom.xml 2012-04-02 10:30:06 UTC (rev 14463)
@@ -23,6 +23,7 @@
<module>excel</module>
<module>mail</module>
<module>messages</module>
+ <module>nestedbooking</module>
<module>remoting/chatroom</module>
<module>remoting/gwt</module>
<module>remoting/helloworld</module>
12 years, 1 month
Seam SVN: r14462 - in branches/community/Seam_2_3/examples-ee6: nestedbooking and 38 other directories.
by seam-commits@lists.jboss.org
Author: maschmid
Date: 2012-04-02 06:27:17 -0400 (Mon, 02 Apr 2012)
New Revision: 14462
Added:
branches/community/Seam_2_3/examples-ee6/nestedbooking/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/pom.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/src/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/src/main/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/src/main/application/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/src/main/application/META-INF/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/src/main/application/META-INF/jboss-deployment-structure.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/src/main/application/META-INF/jboss-seam-booking-ds.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/pom.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Authenticator.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/AuthenticatorAction.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Booking.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/BookingList.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/BookingListAction.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/ChangePassword.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/ChangePasswordAction.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Hotel.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelBooking.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelBookingAction.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelSearching.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelSearchingAction.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Register.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RegisterAction.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Room.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomHome.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomList.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomPreference.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomPreferenceAction.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/User.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/META-INF/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/META-INF/ejb-jar.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/META-INF/persistence.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/import.sql
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/seam.properties
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/pom.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/BookingTest.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/ChangePasswordTest.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/LoginTest.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/selenium/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/selenium/NestedConversationTest.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/selenium/NestedSimpleBookingTest.java
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources-ftest/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources-ftest/testng.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources-integration/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources-integration/testng.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/WEB-INF/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/WEB-INF/components.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/nestedbooking.properties
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/seam.properties
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/pom.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/components.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/faces-config.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/pages.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/web.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/book.xhtml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/confirm.xhtml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/conversations.xhtml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/css/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/css/date.css
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/css/screen.css
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/css/trailblazer_main.css
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/edit.xhtml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/home.xhtml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/hotel.xhtml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/bg.gif
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/btn.bg.gif
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/cal-next.png
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/cal-prev.png
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/cnt.bg.gif
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/dtpick.gif
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/hdr.ad.jpg
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/hdr.bar.jpg
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/hdr.bg.gif
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/hdr.title.gif
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/header_line.gif
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/input.bg.gif
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/sdb.bg.gif
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/spinner.gif
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/th.bg.gif
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/index.html
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/main.xhtml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/output.xhtml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/password.xhtml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/payment.xhtml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/register.xhtml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/rooms.xhtml
branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/template.xhtml
branches/community/Seam_2_3/examples-ee6/nestedbooking/pom.xml
branches/community/Seam_2_3/examples-ee6/nestedbooking/readme.txt
Log:
Add nestedbooking example to ee6 examples
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/pom.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,127 @@
+<?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>nestedbooking</artifactId>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.nestedbooking</groupId>
+ <artifactId>nestedbooking-ear</artifactId>
+ <packaging>ear</packaging>
+ <name>Nested Booking EAR Module (EE6)</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.nestedbooking</groupId>
+ <artifactId>nestedbooking-web</artifactId>
+ <type>war</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.nestedbooking</groupId>
+ <artifactId>nestedbooking-ejb</artifactId>
+ <type>ejb</type>
+ </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>
+ </dependencies>
+
+ <build>
+ <finalName>seam-nestedbooking</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.nestedbooking</groupId>
+ <artifactId>nestedbooking-web</artifactId>
+ <contextRoot>/seam-nestedbooking</contextRoot>
+ <bundleFileName>nestedbooking-web.war</bundleFileName>
+ </webModule>
+ <ejbModule>
+ <groupId>org.jboss.seam.examples-ee6.nestedbooking</groupId>
+ <artifactId>nestedbooking-ejb</artifactId>
+ <bundleFileName>nestedbooking-ejb.jar</bundleFileName>
+ </ejbModule>
+ </modules>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>exploded</id>
+ <properties>
+ <example.name>nestedbooking</example.name>
+ </properties>
+ <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.nestedbooking</groupId>
+ <artifactId>nestedbooking-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.nestedbooking</groupId>
+ <artifactId>nestedbooking-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.nestedbooking</groupId>
+ <artifactId>nestedbooking-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>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+</project>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/src/main/application/META-INF/jboss-deployment-structure.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/src/main/application/META-INF/jboss-deployment-structure.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/src/main/application/META-INF/jboss-deployment-structure.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -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>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/src/main/application/META-INF/jboss-seam-booking-ds.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/src/main/application/META-INF/jboss-seam-booking-ds.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ear/src/main/application/META-INF/jboss-seam-booking-ds.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<datasources xmlns="http://www.jboss.org/ironjacamar/schema">
+ <datasource
+ jndi-name="java:/nestedBookingDatasource"
+ enabled="true"
+ use-java-context="true" pool-name="nestedbookingdb">
+ <connection-url>jdbc:h2:mem:nestedbookingdb;DB_CLOSE_DELAY=-1</connection-url>
+ <driver>h2</driver>
+ <security>
+ <user-name>sa</user-name>
+ <password>sa</password>
+ </security>
+ </datasource>
+</datasources>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/pom.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,46 @@
+<?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>nestedbooking</artifactId>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.nestedbooking</groupId>
+ <artifactId>nestedbooking-ejb</artifactId>
+ <packaging>ejb</packaging>
+ <name>Nested Booking EJB Module (EE6)</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-validator</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.ejb</groupId>
+ <artifactId>ejb-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.faces</groupId>
+ <artifactId>jsf-api</artifactId>
+ </dependency>
+ </dependencies>
+
+</project>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Authenticator.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Authenticator.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Authenticator.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,9 @@
+package org.jboss.seam.example.booking;
+
+import javax.ejb.Local;
+
+@Local
+public interface Authenticator
+{
+ boolean authenticate();
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/AuthenticatorAction.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/AuthenticatorAction.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/AuthenticatorAction.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,39 @@
+package org.jboss.seam.example.booking;
+
+import static org.jboss.seam.ScopeType.SESSION;
+
+import java.util.List;
+
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Out;
+
+@Stateless
+@Name("authenticator")
+public class AuthenticatorAction implements Authenticator
+{
+ @PersistenceContext EntityManager em;
+
+ @Out(required=false, scope = SESSION)
+ private User user;
+
+ public boolean authenticate()
+ {
+ List results = em.createQuery("select u from User u where u.username=#{identity.username} and u.password=#{identity.password}")
+ .getResultList();
+
+ if ( results.size()==0 )
+ {
+ return false;
+ }
+ else
+ {
+ user = (User) results.get(0);
+ return true;
+ }
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Booking.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Booking.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Booking.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,188 @@
+//$Id: Booking.java 6893 2007-12-04 12:05:03Z pmuir $
+package org.jboss.seam.example.booking;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.text.DateFormat;
+import java.util.Date;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+import org.jboss.seam.annotations.Name;
+
+@Entity
+@Name("booking")
+public class Booking implements Serializable
+{
+ private Long id;
+ private User user;
+ private Hotel hotel;
+ private Date checkinDate;
+ private Date checkoutDate;
+ private String creditCard;
+ private String creditCardName;
+ private int creditCardExpiryMonth;
+ private int creditCardExpiryYear;
+ private Room roomPreference;
+
+ public Booking() {}
+
+ public Booking(Hotel hotel, User user)
+ {
+ this.hotel = hotel;
+ this.user = user;
+ this.roomPreference = this.hotel.getStandardRoom();
+ }
+
+ @Transient
+ public BigDecimal getTotal()
+ {
+ return getTotal(roomPreference);
+ }
+
+ @Transient
+ public BigDecimal getTotal(Room room)
+ {
+ return room.getPrice().multiply(new BigDecimal(getNights()));
+ }
+
+ @Transient
+ public int getNights()
+ {
+ return (int) ( checkoutDate.getTime() - checkinDate.getTime() ) / 1000 / 60 / 60 / 24;
+ }
+
+ @Id @GeneratedValue
+ public Long getId()
+ {
+ return id;
+ }
+ public void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ @NotNull
+ @Basic @Temporal(TemporalType.DATE)
+ public Date getCheckinDate()
+ {
+ return checkinDate;
+ }
+ public void setCheckinDate(Date datetime)
+ {
+ this.checkinDate = datetime;
+ }
+
+ @ManyToOne @NotNull
+ public Hotel getHotel()
+ {
+ return hotel;
+ }
+ public void setHotel(Hotel hotel)
+ {
+ this.hotel = hotel;
+ }
+
+ @ManyToOne @NotNull
+ public User getUser()
+ {
+ return user;
+ }
+ public void setUser(User user)
+ {
+ this.user = user;
+ }
+
+ @Basic @Temporal(TemporalType.DATE)
+ @NotNull
+ public Date getCheckoutDate()
+ {
+ return checkoutDate;
+ }
+ public void setCheckoutDate(Date checkoutDate)
+ {
+ this.checkoutDate = checkoutDate;
+ }
+
+ @NotNull(message="Credit card number is required")
+ @Size(min=16, max=16, message="Credit card number must 16 digits long")
+ @Pattern(regexp="^\\d*$", message="Credit card number must be numeric")
+ public String getCreditCard()
+ {
+ return creditCard;
+ }
+
+ public void setCreditCard(String creditCard)
+ {
+ this.creditCard = creditCard;
+ }
+
+ @Transient
+ public String getDescription()
+ {
+ DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
+ return hotel==null ? null : hotel.getName() +
+ ", " + df.format( getCheckinDate() ) +
+ " to " + df.format( getCheckoutDate() );
+ }
+
+ @ManyToOne @NotNull
+ public Room getRoomPreference()
+ {
+ return roomPreference;
+ }
+
+ public void setRoomPreference(Room roomPreference)
+ {
+ this.roomPreference = roomPreference;
+ }
+
+ @NotNull(message="Credit card name is required")
+ @Size(min=3, max=70, message="Credit card name is required")
+ public String getCreditCardName()
+ {
+ return creditCardName;
+ }
+
+ public void setCreditCardName(String creditCardName)
+ {
+ this.creditCardName = creditCardName;
+ }
+
+ public int getCreditCardExpiryMonth()
+ {
+ return creditCardExpiryMonth;
+ }
+
+ public void setCreditCardExpiryMonth(int creditCardExpiryMonth)
+ {
+ this.creditCardExpiryMonth = creditCardExpiryMonth;
+ }
+
+ public int getCreditCardExpiryYear()
+ {
+ return creditCardExpiryYear;
+ }
+
+ public void setCreditCardExpiryYear(int creditCardExpiryYear)
+ {
+ this.creditCardExpiryYear = creditCardExpiryYear;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "Booking(" + user + ","+ hotel + ")";
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/BookingList.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/BookingList.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/BookingList.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,13 @@
+//$Id: BookingList.java 6826 2007-11-25 13:12:07Z pmuir $
+package org.jboss.seam.example.booking;
+
+import javax.ejb.Local;
+
+@Local
+public interface BookingList
+{
+ public void getBookings();
+ public Booking getBooking();
+ public void cancel();
+ public void destroy();
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/BookingListAction.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/BookingListAction.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/BookingListAction.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,72 @@
+//$Id: BookingListAction.java 8748 2008-08-20 12:08:30Z pete.muir(a)jboss.org $
+package org.jboss.seam.example.booking;
+import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
+import static org.jboss.seam.ScopeType.SESSION;
+import java.io.Serializable;
+import java.util.List;
+import javax.ejb.Remove;
+import javax.ejb.Stateful;
+import javax.ejb.TransactionAttribute;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import org.jboss.seam.annotations.Destroy;
+import org.jboss.seam.annotations.Factory;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Logger;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Observer;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.datamodel.DataModel;
+import org.jboss.seam.annotations.datamodel.DataModelSelection;
+import org.jboss.seam.annotations.security.Restrict;
+import org.jboss.seam.faces.FacesMessages;
+import org.jboss.seam.log.Log;
+
+@Stateful
+@Scope(SESSION)
+@Name("bookingList")
+@Restrict("#{identity.loggedIn}")
+@TransactionAttribute(REQUIRES_NEW)
+public class BookingListAction implements BookingList, Serializable
+{
+ private static final long serialVersionUID = 1L;
+ @PersistenceContext
+ private EntityManager em;
+
+ @In
+ private User user;
+
+ @DataModel
+ private List<Booking> bookings;
+ @DataModelSelection
+ private Booking booking;
+
+ @Logger
+ private Log log;
+
+ @Factory
+ @Observer("bookingConfirmed")
+ public void getBookings()
+ {
+ bookings = em.createQuery("select b from Booking b where b.user.username = :username order by b.checkinDate")
+ .setParameter("username", user.getUsername())
+ .getResultList();
+ }
+
+ public void cancel()
+ {
+ log.info("Cancel booking: #{bookingList.booking.id} for #{user.username}");
+ Booking cancelled = em.find(Booking.class, booking.getId());
+ if (cancelled!=null) em.remove( cancelled );
+ getBookings();
+ FacesMessages.instance().add("Booking cancelled for confirmation number #0", booking.getId());
+ }
+
+ public Booking getBooking()
+ {
+ return booking;
+ }
+
+ @Destroy @Remove
+ public void destroy() {}
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/ChangePassword.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/ChangePassword.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/ChangePassword.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,16 @@
+//$Id: ChangePassword.java 6826 2007-11-25 13:12:07Z pmuir $
+package org.jboss.seam.example.booking;
+
+import javax.ejb.Local;
+
+@Local
+public interface ChangePassword
+{
+ public void changePassword();
+ public boolean isChanged();
+
+ public String getVerify();
+ public void setVerify(String verify);
+
+ public void destroy();
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/ChangePasswordAction.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/ChangePasswordAction.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/ChangePasswordAction.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,71 @@
+//$Id: ChangePasswordAction.java 6826 2007-11-25 13:12:07Z pmuir $
+package org.jboss.seam.example.booking;
+import static org.jboss.seam.ScopeType.EVENT;
+import javax.ejb.Remove;
+import javax.ejb.Stateful;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import org.jboss.seam.annotations.Destroy;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Out;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.security.Restrict;
+import org.jboss.seam.faces.FacesMessages;
+
+@Stateful
+@Scope(EVENT)
+@Name("changePassword")
+@Restrict("#{identity.loggedIn}")
+public class ChangePasswordAction implements ChangePassword
+{
+ @In @Out
+ private User user;
+
+ @PersistenceContext
+ private EntityManager em;
+
+ private String verify;
+
+ private boolean changed;
+
+ @In
+ private FacesMessages facesMessages;
+
+ public void changePassword()
+ {
+ if ( user.getPassword().equals(verify) )
+ {
+ user = em.merge(user);
+ facesMessages.add("Password updated");
+ changed = true;
+ }
+ else
+ {
+ facesMessages.addToControl("verify", "Re-enter new password");
+ revertUser();
+ verify=null;
+ }
+ }
+
+ public boolean isChanged()
+ {
+ return changed;
+ }
+
+ private void revertUser()
+ {
+ user = em.find(User.class, user.getUsername());
+ }
+ public String getVerify()
+ {
+ return verify;
+ }
+ public void setVerify(String verify)
+ {
+ this.verify = verify;
+ }
+
+ @Destroy @Remove
+ public void destroy() {}
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Hotel.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Hotel.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Hotel.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,173 @@
+//$Id: Hotel.java 6893 2007-12-04 12:05:03Z pmuir $
+package org.jboss.seam.example.booking;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.Transient;
+
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotNull;
+import org.jboss.seam.annotations.Name;
+
+@Entity
+@Name("hotel")
+public class Hotel implements Serializable
+{
+ private Long id;
+ private String name;
+ private String address;
+ private String city;
+ private String state;
+ private String zip;
+ private String country;
+ private List<Room> rooms;
+
+ Hotel() {
+ this.rooms = new ArrayList<Room>();
+ }
+
+ @Id @GeneratedValue
+ public Long getId()
+ {
+ return id;
+ }
+ public void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ @Size(max=50) @NotNull
+ public String getName()
+ {
+ return name;
+ }
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ @Size(max=100) @NotNull
+ public String getAddress()
+ {
+ return address;
+ }
+ public void setAddress(String address)
+ {
+ this.address = address;
+ }
+
+ @Size(max=40) @NotNull
+ public String getCity()
+ {
+ return city;
+ }
+ public void setCity(String city)
+ {
+ this.city = city;
+ }
+
+ @Size(min=4, max=6) @NotNull
+ public String getZip()
+ {
+ return zip;
+ }
+ public void setZip(String zip)
+ {
+ this.zip = zip;
+ }
+
+ @Size(min=2, max=10) @NotNull
+ public String getState()
+ {
+ return state;
+ }
+ public void setState(String state)
+ {
+ this.state = state;
+ }
+
+ @Size(min=2, max=40) @NotNull
+ public String getCountry()
+ {
+ return country;
+ }
+ public void setCountry(String country)
+ {
+ this.country = country;
+ }
+
+ @Transient
+ public BigDecimal getMinPrice()
+ {
+ return this.getStandardRoom().getPrice();
+ }
+
+ @Transient
+ public BigDecimal getMaxPrice()
+ {
+ BigDecimal maxPrice = this.getRooms().get(0).getPrice();
+
+ for(int i = 1; i < this.getRooms().size(); i++)
+ {
+ Room room = this.getRooms().get(i);
+
+ if(maxPrice.compareTo(room.getPrice()) < 0)
+ {
+ maxPrice = room.getPrice();
+ }
+ }
+
+ return maxPrice;
+ }
+
+ @OneToMany
+ @JoinColumn(name="HOTEL_ID")
+ public List<Room> getRooms()
+ {
+ return rooms;
+ }
+
+ public void setRooms(List<Room> roomsSelections)
+ {
+ this.rooms = roomsSelections;
+ }
+
+ @Transient
+ public List<Room> getAvailableRooms(Date checkinDate, Date checkoutDate)
+ {
+ // checking could be performed here to determine which
+ // rooms are available for the provided dates. to simplify
+ // the example, just return the list of rooms
+
+ return rooms;
+ }
+
+ @Transient
+ public Room getStandardRoom()
+ {
+ for(Room room : this.getRooms())
+ {
+ if(room.isIncluded())
+ {
+ return room;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "Hotel(" + name + "," + address + "," + city + "," + zip + ")";
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelBooking.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelBooking.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelBooking.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,21 @@
+//$Id: HotelBooking.java 6826 2007-11-25 13:12:07Z pmuir $
+package org.jboss.seam.example.booking;
+
+import javax.ejb.Local;
+
+@Local
+public interface HotelBooking
+{
+ public void selectHotel(Hotel selectedHotel);
+
+ public void bookHotel();
+
+ public String setBookingDates();
+
+ public void confirm();
+
+ public void cancel();
+
+ public void destroy();
+
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelBookingAction.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelBookingAction.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelBookingAction.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,115 @@
+//$Id: HotelBookingAction.java 8991 2008-09-14 17:16:48Z jacob.orshalick $
+package org.jboss.seam.example.booking;
+import static javax.persistence.PersistenceContextType.EXTENDED;
+import java.util.Calendar;
+import javax.ejb.Remove;
+import javax.ejb.Stateful;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import org.jboss.seam.annotations.Begin;
+import org.jboss.seam.annotations.Destroy;
+import org.jboss.seam.annotations.End;
+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.security.Restrict;
+import org.jboss.seam.core.Conversation;
+import org.jboss.seam.core.Events;
+import org.jboss.seam.faces.FacesMessages;
+import org.jboss.seam.log.Log;
+
+@Stateful
+@Name("hotelBooking")
+@Restrict("#{identity.loggedIn}")
+public class HotelBookingAction implements HotelBooking
+{
+
+ @PersistenceContext(type=EXTENDED)
+ private EntityManager em;
+
+ @In
+ private User user;
+
+ @In(required=false) @Out
+ private Hotel hotel;
+
+ @In(required=false)
+ @Out(required=false)
+ private Booking booking;
+
+ @In(required=false)
+ private Room roomSelection;
+
+ @In
+ private FacesMessages facesMessages;
+
+ @In
+ private Events events;
+
+ @Logger
+ private Log log;
+
+ @Begin
+ public void selectHotel(Hotel selectedHotel)
+ {
+ log.info("Selected hotel #0", selectedHotel.getName());
+ hotel = em.merge(selectedHotel);
+ }
+
+ public String setBookingDates()
+ {
+ // the result will indicate whether or not to begin the nested conversation
+ // as well as the navigation. if a null result is returned, the nested
+ // conversation will not begin, and the user will be returned to the current
+ // page to fix validation issues
+ String result = null;
+
+ Calendar calendar = Calendar.getInstance();
+ calendar.add(Calendar.DAY_OF_MONTH, -1);
+
+ // validate what we have received from the user so far
+ if ( booking.getCheckinDate().before( calendar.getTime() ) )
+ {
+ facesMessages.addToControl("checkinDate", "Check in date must be a future date");
+ }
+ else if ( !booking.getCheckinDate().before( booking.getCheckoutDate() ) )
+ {
+ facesMessages.addToControl("checkoutDate", "Check out date must be later than check in date");
+ }
+ else
+ {
+ result = "rooms";
+ }
+
+ return result;
+ }
+
+ public void bookHotel()
+ {
+ booking = new Booking(hotel, user);
+ Calendar calendar = Calendar.getInstance();
+ booking.setCheckinDate( calendar.getTime() );
+ calendar.add(Calendar.DAY_OF_MONTH, 1);
+ booking.setCheckoutDate( calendar.getTime() );
+ }
+
+ @End(root=true)
+ public void confirm()
+ {
+ // on confirmation we set the room preference in the booking. the room preference
+ // will be injected based on the nested conversation we are in.
+ booking.setRoomPreference(roomSelection);
+
+ em.persist(booking);
+ facesMessages.add("Thank you, #{user.name}, your confimation number for #{hotel.name} is #{booking.id}");
+ log.info("New booking: #{booking.id} for #{user.username}");
+ events.raiseTransactionSuccessEvent("bookingConfirmed");
+ }
+
+ @End(root=true, beforeRedirect=true)
+ public void cancel() {}
+
+ @Destroy @Remove
+ public void destroy() {}
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelSearching.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelSearching.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelSearching.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,23 @@
+//$Id: HotelSearching.java 6826 2007-11-25 13:12:07Z pmuir $
+package org.jboss.seam.example.booking;
+
+import javax.ejb.Local;
+
+@Local
+public interface HotelSearching
+{
+ public int getPageSize();
+ public void setPageSize(int pageSize);
+
+ public String getSearchString();
+ public void setSearchString(String searchString);
+
+ public String getSearchPattern();
+
+ public void find();
+ public void nextPage();
+ public boolean isNextPageAvailable();
+
+ public void destroy();
+
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelSearchingAction.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelSearchingAction.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/HotelSearchingAction.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,84 @@
+//$Id: HotelSearchingAction.java 6826 2007-11-25 13:12:07Z pmuir $
+package org.jboss.seam.example.booking;
+import java.util.List;
+import javax.ejb.Remove;
+import javax.ejb.Stateful;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.Destroy;
+import org.jboss.seam.annotations.Factory;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.datamodel.DataModel;
+import org.jboss.seam.annotations.security.Restrict;
+
+@Stateful
+@Name("hotelSearch")
+(a)Scope(ScopeType.SESSION)
+@Restrict("#{identity.loggedIn}")
+public class HotelSearchingAction implements HotelSearching
+{
+
+ @PersistenceContext
+ private EntityManager em;
+
+ private String searchString;
+ private int pageSize = 10;
+ private int page;
+
+ @DataModel
+ private List<Hotel> hotels;
+
+ public void find()
+ {
+ page = 0;
+ queryHotels();
+ }
+ public void nextPage()
+ {
+ page++;
+ queryHotels();
+ }
+
+ private void queryHotels()
+ {
+ hotels = em.createQuery("select h from Hotel h where lower(h.name) like #{pattern} or lower(h.city) like #{pattern} or lower(h.zip) like #{pattern} or lower(h.address) like #{pattern}")
+ .setMaxResults(pageSize)
+ .setFirstResult( page * pageSize )
+ .getResultList();
+ }
+
+ public boolean isNextPageAvailable()
+ {
+ return hotels!=null && hotels.size()==pageSize;
+ }
+
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+
+ @Factory(value="pattern", scope=ScopeType.EVENT)
+ public String getSearchPattern()
+ {
+ return searchString==null ?
+ "%" : '%' + searchString.toLowerCase().replace('*', '%') + '%';
+ }
+
+ public String getSearchString()
+ {
+ return searchString;
+ }
+
+ public void setSearchString(String searchString)
+ {
+ this.searchString = searchString;
+ }
+
+ @Destroy @Remove
+ public void destroy() {}
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Register.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Register.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Register.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,16 @@
+//$Id: Register.java 6826 2007-11-25 13:12:07Z pmuir $
+package org.jboss.seam.example.booking;
+
+import javax.ejb.Local;
+
+@Local
+public interface Register
+{
+ public void register();
+ public void invalid();
+ public String getVerify();
+ public void setVerify(String verify);
+ public boolean isRegistered();
+
+ public void destroy();
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RegisterAction.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RegisterAction.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RegisterAction.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,76 @@
+//$Id: RegisterAction.java 6826 2007-11-25 13:12:07Z pmuir $
+package org.jboss.seam.example.booking;
+import static org.jboss.seam.ScopeType.EVENT;
+import java.util.List;
+import javax.ejb.Remove;
+import javax.ejb.Stateful;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import org.jboss.seam.annotations.Destroy;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.faces.FacesMessages;
+@Stateful
+@Scope(EVENT)
+@Name("register")
+public class RegisterAction implements Register
+{
+ @In
+ private User user;
+
+ @PersistenceContext
+ private EntityManager em;
+
+ @In
+ private FacesMessages facesMessages;
+
+ private String verify;
+
+ private boolean registered;
+
+ public void register()
+ {
+ if ( user.getPassword().equals(verify) )
+ {
+ List existing = em.createQuery("select u.username from User u where u.username=#{user.username}")
+ .getResultList();
+ if (existing.size()==0)
+ {
+ em.persist(user);
+ facesMessages.add("Successfully registered as #{user.username}");
+ registered = true;
+ }
+ else
+ {
+ facesMessages.addToControl("username", "Username #{user.username} already exists");
+ }
+ }
+ else
+ {
+ facesMessages.addToControl("verify", "Re-enter your password");
+ verify=null;
+ }
+ }
+
+ public void invalid()
+ {
+ facesMessages.add("Please try again");
+ }
+
+ public boolean isRegistered()
+ {
+ return registered;
+ }
+ public String getVerify()
+ {
+ return verify;
+ }
+ public void setVerify(String verify)
+ {
+ this.verify = verify;
+ }
+
+ @Destroy @Remove
+ public void destroy() {}
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Room.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Room.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/Room.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,83 @@
+package org.jboss.seam.example.booking;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Transient;
+
+import javax.validation.constraints.Size;
+
+import org.jboss.seam.annotations.Name;
+
+@Entity
+@Name("room")
+public class Room implements Serializable {
+
+ private Long id;
+ private String name;
+ private String description;
+ private boolean included;
+ private BigDecimal price;
+
+ @Id @GeneratedValue
+ public Long getId()
+ {
+ return id;
+ }
+
+ public void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ @Size(max=64)
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ @Size(max=1024)
+ public String getDescription()
+ {
+ return description;
+ }
+
+ public void setDescription(String description)
+ {
+ this.description = description;
+ }
+
+ public boolean isIncluded()
+ {
+ return included;
+ }
+
+ public void setIncluded(boolean included)
+ {
+ this.included = included;
+ }
+
+ public BigDecimal getPrice()
+ {
+ return price;
+ }
+
+ public void setPrice(BigDecimal price)
+ {
+ this.price = price;
+ }
+
+ @Transient
+ public BigDecimal getPrice(int numNights)
+ {
+ return price.multiply(new BigDecimal(numNights));
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomHome.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomHome.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomHome.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,36 @@
+package org.jboss.seam.example.booking;
+
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Begin;
+import org.jboss.seam.annotations.web.RequestParameter;
+import org.jboss.seam.framework.EntityHome;
+
+import org.jboss.seam.example.booking.Room;
+
+@Name("roomHome")
+public class RoomHome extends EntityHome<Room>
+{
+
+ @RequestParameter
+ private Long roomId;
+
+ @Override
+ public Object getId()
+ {
+ if (roomId==null)
+ {
+ return super.getId();
+ }
+ else
+ {
+ return roomId;
+ }
+ }
+
+ @Override @Begin
+ public void create()
+ {
+ super.create();
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomList.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomList.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomList.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,14 @@
+package org.jboss.seam.example.booking;
+
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.framework.EntityQuery;
+
+@Name("roomList")
+public class RoomList extends EntityQuery
+{
+ @Override
+ public String getEjbql()
+ {
+ return "select room from Room room";
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomPreference.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomPreference.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomPreference.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,23 @@
+package org.jboss.seam.example.booking;
+
+import java.math.BigDecimal;
+
+import javax.ejb.Local;
+
+@Local
+public interface RoomPreference
+{
+
+ public void loadAvailableRooms();
+
+ public String selectPreference();
+
+ public BigDecimal getExpectedPrice();
+
+ public String requestConfirmation();
+
+ public String cancel();
+
+ public void destroy();
+
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomPreferenceAction.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomPreferenceAction.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/RoomPreferenceAction.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,90 @@
+package org.jboss.seam.example.booking;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import javax.ejb.Remove;
+import javax.ejb.Stateful;
+
+import org.jboss.seam.annotations.Begin;
+import org.jboss.seam.annotations.Factory;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.End;
+import org.jboss.seam.annotations.Destroy;
+import org.jboss.seam.annotations.Logger;
+import org.jboss.seam.annotations.Out;
+import org.jboss.seam.annotations.datamodel.DataModel;
+import org.jboss.seam.annotations.datamodel.DataModelSelection;
+import org.jboss.seam.annotations.security.Restrict;
+import org.jboss.seam.log.Log;
+
+import org.jboss.seam.example.booking.Room;
+
+@Stateful
+@Name("roomPreference")
+@Restrict("#{identity.loggedIn}")
+public class RoomPreferenceAction implements RoomPreference
+{
+
+ @Logger
+ private Log log;
+
+ @In private Hotel hotel;
+
+ @In private Booking booking;
+
+ @DataModel(value="availableRooms")
+ private List<Room> availableRooms;
+
+ @DataModelSelection(value="availableRooms")
+ private Room roomSelection;
+
+ @In(required=false, value="roomSelection")
+ @Out(required=false, value="roomSelection")
+ private Room room;
+
+ @Factory("availableRooms")
+ public void loadAvailableRooms()
+ {
+ availableRooms = hotel.getAvailableRooms(booking.getCheckinDate(), booking.getCheckoutDate());
+ log.info("Retrieved #0 available rooms", availableRooms.size());
+ }
+
+ public BigDecimal getExpectedPrice()
+ {
+ log.info("Retrieving price for room #0", roomSelection.getName());
+
+ return booking.getTotal(roomSelection);
+ }
+
+ @Begin(nested=true)
+ public String selectPreference()
+ {
+ log.info("Room selected");
+
+ this.room = this.roomSelection;
+
+ return "payment";
+ }
+
+ public String requestConfirmation()
+ {
+ // all validations are performed through the s:validateAll, so checks are already
+ // performed
+ log.info("Request confirmation from user");
+
+ return "confirm";
+ }
+
+ @End(beforeRedirect=true)
+ public String cancel()
+ {
+ log.info("ending conversation");
+
+ return "cancel";
+ }
+
+ @Destroy @Remove
+ public void destroy() {}
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/User.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/User.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/java/org/jboss/seam/example/booking/User.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,77 @@
+//$Id: User.java 6826 2007-11-25 13:12:07Z pmuir $
+package org.jboss.seam.example.booking;
+
+import static org.jboss.seam.ScopeType.SESSION;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+
+@Entity
+@Name("user")
+@Scope(SESSION)
+@Table(name="Customer")
+public class User implements Serializable
+{
+ private String username;
+ private String password;
+ private String name;
+
+ public User(String name, String password, String username)
+ {
+ this.name = name;
+ this.password = password;
+ this.username = username;
+ }
+
+ public User() {}
+
+ @NotNull
+ @Size(max=100)
+ public String getName()
+ {
+ return name;
+ }
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ @NotNull
+ @Size(min=4, max=15)
+ public String getPassword()
+ {
+ return password;
+ }
+ public void setPassword(String password)
+ {
+ this.password = password;
+ }
+
+ @Id
+ @Size(min=4, max=15)
+ @Pattern(regexp="^\\w*$", message="not a valid username")
+ public String getUsername()
+ {
+ return username;
+ }
+ public void setUsername(String username)
+ {
+ this.username = username;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "User(" + username + ")";
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/META-INF/ejb-jar.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/META-INF/ejb-jar.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/META-INF/ejb-jar.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -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/nestedbooking/nestedbooking-ejb/src/main/resources/META-INF/persistence.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/META-INF/persistence.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/META-INF/persistence.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,17 @@
+<?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="bookingDatabase">
+ <provider>org.hibernate.ejb.HibernatePersistence</provider>
+ <jta-data-source>java:/nestedBookingDatasource</jta-data-source>
+ <properties>
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ <property name="hibernate.show_sql" value="true"/>
+ <!-- These are the default for JBoss EJB3, but not for HEM: -->
+ <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
+ <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
+ </properties>
+ </persistence-unit>
+</persistence>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/import.sql
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/import.sql (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/import.sql 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,45 @@
+insert into Customer (username, password, name) values ('gavin', 'foobar', 'Gavin King')
+insert into Customer (username, password, name) values ('demo', 'demo', 'Demo User')
+
+insert into Hotel (id, name, address, city, state, zip, country) values (1, 'Marriott Courtyard', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA')
+insert into Room (id, hotel_id, name, description, price, included) values (1, 1, 'King Room', 'One king bed. Table with chairs. Complimentary high-speed Internet access. TV with premium cable and pay movies. Direct-dial speakerphone with voice mail. Coffee/tea maker. Hair dryer. Iron/ironing board.', 120, true)
+insert into Room (id, hotel_id, name, description, price, included) values (2, 1, 'Double Room', 'Two double beds. Table with chairs. Complimentary high-speed Internet access. TV with premium cable and pay movies. Direct-dial speakerphone with voice mail. Coffee/tea maker. Hair dryer. Iron/ironing board.', 120, false)
+
+insert into Hotel (id, name, address, city, state, zip, country) values (2, 'Doubletree', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA')
+insert into Room (id, hotel_id, name, description, price, included) values (3, 2, 'Standard 1 King', 'One king bed. Wireless Internet access (surcharge). TV with video games. Marble bathroom. Complimentary newspaper. Air conditioning.', 180, true)
+insert into Room (id, hotel_id, name, description, price, included) values (4, 2, 'Deluxe King w/sofabed', 'One king Sweet Dreams bed and one sofa bed. Business-district view. Located on floors 36. 315 square feet. Contemporary furnishings. Ergonomic work center with dual-line phone and wireless Internet access (surcharge). Video games. Marble bathroom. Complimentary newspaper. Air conditioning.', 250, false)
+insert into Room (id, hotel_id, name, description, price, included) values (5, 2, 'Standard 1 King (smoking)', 'One king bed. Wireless Internet access (surcharge). TV with video games. Marble bathroom. Complimentary newspaper. Air conditioning. Smoking.', 180, false)
+insert into Room (id, hotel_id, name, description, price, included) values (6, 2, 'Standard 2 Doubles', 'Two double beds. Contemporary furnishings. Ergonomic work center with dual-line phone and wireless Internet access (surcharge). Video games. Marble bathroom. Complimentary newspaper. Air conditioning.', 180, false)
+insert into Room (id, hotel_id, name, description, price, included) values (7, 2, 'Standard 2 Dbls (smoking)', 'Two double beds. Contemporary furnishings. Ergonomic work center with dual-line phone and wireless Internet access (surcharge). Video games. Marble bathroom. Complimentary newspaper. Air conditioning. Smoking.', 180, false)
+
+insert into Hotel (id, name, address, city, state, zip, country) values (3, 'W Hotel', 'Union Square, Manhattan', 'NY', 'NY', '10011', 'USA')
+insert into Room (id, hotel_id, name, description, price, included) values (8, 3, 'Cozy Room', 'One queen featherbed with pillowtop mattress, 350-thread-count linens, and goose-down comforter and pillows. Located on floors 3-14. 170-180 square feet. Decorated in earth tones, leaf motifs, and hand-painted fabrics. CD and DVD players, minibar, multi-line cordless phone, and high-speed Internet access (surcharge). Bathroom has shower only or shower/tub combination, makeup mirror, terry/pique spa robes, and Bliss bath products.', 450, true)
+insert into Room (id, hotel_id, name, description, price, included) values (9, 3, 'Spectacular Room', 'No description', 600, false)
+
+insert into Hotel (id, name, address, city, state, zip, country) values (4, 'W Hotel', 'Lexington Ave, Manhattan', 'NY', 'NY', '10011', 'USA')
+insert into Room (id, hotel_id, name, description, price, included) values (10, 4, 'Wonderful Room', 'One king bed. Desk. Cable/satellite TV with pay movies and DVD player. CD player. Coffee/tea maker and minibar. Hair dryer. Iron/ironing board. In-room safe. Complimentary newspaper.', 450, false)
+insert into Room (id, hotel_id, name, description, price, included) values (11, 4, 'Spectacular Room', 'One king bed. Desk. Cable/satellite TV with pay movies and DVD player. CD player. Coffee/tea maker and minibar. Hair dryer. Iron/ironing board. In-room safe. Complimentary newspaper.', 600, true)
+insert into Room (id, hotel_id, name, description, price, included) values (12, 4, 'Fantastic Suite', 'One king bed. Desk. Cable/satellite TV with pay movies and DVD player. CD player. Coffee/tea maker and minibar. Hair dryer. Iron/ironing board. In-room safe. Complimentary newspaper.', 1000, false)
+
+insert into Hotel (id, name, address, city, state, zip, country) values (5, 'Hotel Rouge', '1315 16th Street NW', 'Washington', 'DC', '20036', 'USA')
+insert into Room (id, hotel_id, name, description, price, included) values (13, 5, 'Deluxe room with two queen beds', 'Two queen beds with triple-sheeted Frette-brand Italian linens and piped comforters (bedspreads). Floor-to-ceiling windows overlooking city. 260 square feet. Two armchairs and round hassock, 10-foot desk with chair. Sony flat-screen TV with premium channels. Sony CD player. Complimentary wireless and wired high-speed Internet access. Tall bureau/minibar. Foyer closet with two bathrobes. Bathroom with marble vanity, massaging showerhead, and Aveda toiletries. Nonsmoking. Handheld shower and sewing kit available upon request.', 500, true)
+insert into Room (id, hotel_id, name, description, price, included) values (14, 5, 'Chill suite', 'One king bed with triple-sheeted Frette-brand Italian linens and piped comforter (bedspread). Floor-to-ceiling windows overlooking city. 260 square feet. Lounge area with extra TV and either a Sony PlayStation 3 or a Nintendo Wii. Two armchairs and round hassock, 10-foot desk with chair. Sony flat-screen TV with premium channels. Sony CD player. Complimentary wireless and wired high-speed Internet access. Tall bureau/minibar. Foyer closet with two bathrobes. Bathroom with marble vanity, massaging showerhead, and Aveda toiletries. Nonsmoking. Handheld shower and sewing kit available upon request.', 800, false)
+insert into Room (id, hotel_id, name, description, price, included) values (15, 5, 'Deluxe room with king bed', 'One king bed with triple-sheeted Frette-brand Italian linens and piped comforter (bedspread). Floor-to-ceiling windows overlooking city. 260 square feet. Two armchairs and round hassock, 10-foot desk with chair. Sony flat-screen TV with premium channels. Sony CD player. Complimentary wireless and wired high-speed Internet access. Tall bureau/minibar. Foyer closet with two bathrobes. Bathroom with marble vanity, massaging showerhead, and Aveda toiletries. Nonsmoking. Handheld shower and sewing kit available upon request.', 500, false)
+
+insert into Hotel (id, name, address, city, state, zip, country) values (6, '70 Park Avenue Hotel', '70 Park Avenue', 'NY', 'NY', '10011', 'USA')
+insert into Room (id, hotel_id, name, description, price, included) values (16, 6, 'Queen Standard Room', 'One queen bed with thick, plush-top mattress; goose-down duvet and pillows. Approximately 250-300 square feet. May have city view (not guaranteed). 42-inch plasma-screen HDTV. Surround-sound DVD/CD player. Wireless and wired high-speed Internet access (surcharges). iHome clock radio. Bedside Candela candle lamps. LOccitane bath products, waffle-weave robes. Minibar, in-room safe, complimentary newspaper delivery.', 300, true)
+insert into Room (id, hotel_id, name, description, price, included) values (17, 6, 'Deluxe King Room', 'One king bed with thick, plush-top mattress; goose-down duvet and pillows. Approximately 280-325 square feet. May have city view (not guaranteed). 42-inch plasma-screen HDTV. Surround-sound DVD/CD player. Wireless and wired high-speed Internet access (surcharges). iHome clock radio. Bedside Candela candle lamps. LOccitane bath products, waffle-weave robes. Minibar, in-room safe, complimentary newspaper delivery.', 350, false)
+insert into Room (id, hotel_id, name, description, price, included) values (18, 6, 'Deluxe double double', 'Two double beds with thick, plush-top mattresses, goose-down duvets and pillows. Approximately 280-325 square feet. May have city view (not guaranteed). 42-inch plasma-screen HDTV. Surround-sound DVD/CD player. Wireless and wired high-speed Internet access (surcharges). iHome clock radio. Bedside Candela candle lamps. LOccitane bath products, waffle-weave robes. Minibar, in-room safe, complimentary newspaper delivery.', 350, false)
+insert into Room (id, hotel_id, name, description, price, included) values (19, 6, 'King Premier Room', 'One king bed with thick, plush-top mattress; goose-down duvet and pillows. Approximately 350-375 square feet. View of Park Avenue and Murray Hill neighborhood. Separate sitting area with sofa, coffee table. 42-inch plasma-screen HDTV. Surround-sound DVD/CD player. Wireless and wired high-speed Internet access (surcharges). iHome clock radio Bedside Candela candle lamps. Jetted tub for two, LOccitane bath products, waffle-weave robes. Minibar, in-room safe, complimentary newspaper delivery.', 400, false)
+
+insert into Hotel (id, name, address, city, state, zip, country) values (8, 'Conrad Miami', '1395 Brickell Ave', 'Miami', 'FL', '33131', 'USA')
+insert into Room (id, hotel_id, name, description, price, included) values (20, 8, 'Standard room with view', 'Two double beds with 300-thread-count Anachini linens and down comforters (bedspreads). Biscayne Bay view. Located on floors 16-22 of main building. 470 square feet. Contemporary, minimalist-style decor. Wireless Internet access (surcharge). Premium cable channels with pay movies. DVD/CD player. Multi-line phone. Voice mail and complimentary local calls. Minibar and coffee/tea maker. Complimentary bottled water. Bathrobe. Hair dryer. Makeup/shaving mirror. Complimentary newspaper. Turndown service.', 300, true)
+insert into Room (id, hotel_id, name, description, price, included) values (21, 8, '1 Bedroom Condo Residence', 'One king bed with 300-thread-count Anachini linens and down comforter (bedspread) in separate bedroom. Located on floors 26-34 of main building. 850 square feet. Contemporary, minimalist-style decor. Wireless Internet access (surcharge). Premium cable channels with pay movies. DVD/CD player. Multi-line phone. Voice mail and complimentary local calls. Full kitchen with range, dishwasher, refrigerator, and coffee/tea maker. Minibar. Complimentary bottled water. Bathrobe. Hair dryer. Makeup/shaving mirror. Complimentary newspaper. Turndown service.', 350, false)
+
+insert into Hotel (id, name, address, city, state, zip, country) values (9, 'Sea Horse Inn', '2106 N Clairemont Ave', 'Eau Claire', 'WI', '54703', 'USA')
+insert into Room (id, hotel_id, name, description, price, included) values (22, 9, 'Standard room', 'No description', 80, true)
+
+insert into Hotel (id, name, address, city, state, zip, country) values (10, 'Super 8 Eau Claire Campus Area', '1151 W Macarthur Ave', 'Eau Claire', 'WI', '54701', 'USA')
+insert into Room (id, hotel_id, name, description, price, included) values (23, 10, 'One Queen', 'One queen bed. Desk. Complimentary wireless Internet access. Premium cable TV with free HBO. Free local calls.', 90, false)
+insert into Room (id, hotel_id, name, description, price, included) values (24, 10, 'One Queen Non Smoking', 'One queen bed. Desk. Complimentary wireless Internet access. Premium cable TV with free HBO. Free local calls.', 90, true)
+insert into Room (id, hotel_id, name, description, price, included) values (25, 10, 'Two Queens Non Smoking', 'Two queen beds. Desk. Complimentary wireless Internet access. Premium cable TV with free HBO. Free local calls.', 110, false)
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-ejb/src/main/resources/seam.properties
===================================================================
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/pom.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,109 @@
+<?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>nestedbooking</artifactId>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.nestedbooking</groupId>
+ <artifactId>nestedbooking-tests</artifactId>
+ <name>Nested Booking Integration Tests Module (EE6)</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.nestedbooking</groupId>
+ <artifactId>nestedbooking-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>com.sun.faces</groupId>
+ <artifactId>jsf-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.testng</groupId>
+ <artifactId>testng</artifactId>
+ <classifier>jdk15</classifier>
+ </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> <!-- this takes datasource nestedbooking-ds.xml -->
+ <directory>${basedir}/../nestedbooking-ear/src/main/resources</directory>
+ <filtering>true</filtering>
+ </testResource>
+ <testResource> <!-- this takes themes aka *.properties -->
+ <directory>${basedir}/../nestedbooking-web/src/main/resources</directory>
+ <filtering>true</filtering>
+ </testResource>
+ </testResources>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>ftest-jbossas</id>
+ <properties>
+ <example.context.path>seam-nestedbooking</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/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/BookingTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/BookingTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/BookingTest.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,361 @@
+//$Id: BookingTest.java 6896 2007-12-04 15:45:49Z pmuir $
+package org.jboss.seam.example.nestedbooking.test;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Iterator;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.context.FacesContext;
+import javax.faces.model.DataModel;
+import javax.faces.model.ListDataModel;
+
+import org.jboss.seam.contexts.Contexts;
+import org.jboss.seam.core.Manager;
+import org.jboss.seam.example.booking.Booking;
+import org.jboss.seam.example.booking.Hotel;
+import org.jboss.seam.example.booking.HotelBooking;
+import org.jboss.seam.example.booking.User;
+import org.jboss.seam.mock.SeamTest;
+import org.testng.annotations.Test;
+
+public class BookingTest extends SeamTest
+{
+
+ @Test
+ public void testBookHotel() throws Exception
+ {
+
+ new FacesRequest() {
+
+ @Override
+ protected void invokeApplication()
+ {
+ Contexts.getSessionContext().set("user", new User("Gavin King", "foobar", "gavin"));
+ setValue("#{identity.username}", "gavin");
+ setValue("#{identity.password}", "foobar");
+ invokeMethod("#{identity.login}");
+ }
+
+ }.run();
+
+ new FacesRequest("/main.xhtml") {
+
+ @Override
+ protected void updateModelValues()
+ {
+ setValue("#{hotelSearch.searchString}", "Union Square");
+ }
+
+ @Override
+ protected void invokeApplication()
+ {
+ assert invokeMethod("#{hotelSearch.find}")==null;
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ DataModel hotels = (DataModel) Contexts.getSessionContext().get("hotels");
+ assert hotels.getRowCount()==1;
+ assert ( (Hotel) hotels.getRowData() ).getCity().equals("NY");
+ assert getValue("#{hotelSearch.searchString}").equals("Union Square");
+ assert !Manager.instance().isLongRunningConversation();
+ }
+
+ }.run();
+
+ final String id = new FacesRequest("/main.xhtml") {
+
+ @Override
+ protected void invokeApplication()
+ {
+ HotelBooking hotelBooking = (HotelBooking) getInstance("hotelBooking");
+ DataModel hotels = (DataModel) Contexts.getSessionContext().get("hotels");
+ assert hotels.getRowCount()==1;
+ hotelBooking.selectHotel( (Hotel) hotels.getRowData() );
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ Hotel hotel = (Hotel) Contexts.getConversationContext().get("hotel");
+ assert hotel.getCity().equals("NY");
+ assert hotel.getZip().equals("10011");
+ assert Manager.instance().isLongRunningConversation();
+ }
+
+ }.run();
+
+ new FacesRequest("/hotel.xhtml", id) {
+
+ @Override
+ protected void invokeApplication()
+ {
+ invokeMethod("#{hotelBooking.bookHotel}");
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ assert getValue("#{booking.user}")!=null;
+ assert getValue("#{booking.hotel}")!=null;
+ assert getValue("#{booking.creditCard}")==null;
+ assert getValue("#{booking.creditCardName}")==null;
+ Booking booking = (Booking) Contexts.getConversationContext().get("booking");
+ assert booking.getHotel()==Contexts.getConversationContext().get("hotel");
+ assert booking.getUser()==Contexts.getSessionContext().get("user");
+ assert Manager.instance().isLongRunningConversation();
+ }
+
+ }.run();
+
+
+ new FacesRequest("/book.xhtml", id) {
+
+ @Override @SuppressWarnings("deprecation")
+ protected void updateModelValues()
+ {
+ Date now = new Date();
+ setValue("#{booking.checkinDate}", now);
+ setValue("#{booking.checkoutDate}", now);
+ }
+
+ @Override
+ protected void invokeApplication()
+ {
+ assert invokeMethod("#{hotelBooking.setBookingDates}")==null;
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ Iterator messages = FacesContext.getCurrentInstance().getMessages();
+ assert messages.hasNext();
+ FacesMessage message = (FacesMessage) messages.next();
+ assert message.getSummary().equals("Check out date must be later than check in date");
+ assert !messages.hasNext();
+ assert Manager.instance().isLongRunningConversation();
+ }
+
+ }.run();
+
+ new FacesRequest("/book.xhtml", id) {
+
+ @Override @SuppressWarnings("deprecation")
+ protected void updateModelValues()
+ {
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.DAY_OF_MONTH, 2);
+ setValue("#{booking.checkoutDate}", cal.getTime() );
+ }
+
+ @Override
+ protected void invokeApplication()
+ {
+ assert "rooms".equals(invokeMethod("#{hotelBooking.setBookingDates}"));
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ assert Manager.instance().isLongRunningConversation();
+ }
+
+ }.run();
+
+ new FacesRequest("/rooms.xhtml", id)
+ {
+
+ @Override
+ protected void renderResponse()
+ {
+ assert getValue("#{booking.user}")!=null;
+ assert getValue("#{booking.hotel}")!=null;
+ assert getValue("#{booking.checkinDate}")!=null;
+ assert getValue("#{booking.checkoutDate}")!=null;
+ assert getValue("#{booking.roomPreference}").equals(getValue("#{hotel.standardRoom}"));
+ assert getValue("#{booking.creditCard}")==null;
+ assert getValue("#{booking.creditCardName}")==null;
+
+ assert getValue("#{availableRooms.rowCount}").equals(new Integer(2));
+ DataModel availableRooms = (DataModel) getValue("#{availableRooms}");
+ availableRooms.setRowIndex(0);
+ assert "Cozy Room".equals(getValue("#{availableRooms.rowData.name}"));
+ availableRooms.setRowIndex(1);
+ assert "Spectacular Room".equals(getValue("#{availableRooms.rowData.name}"));
+ }
+
+ }.run();
+
+ final String nestedId = new FacesRequest("/rooms.xhtml", id)
+ {
+
+ @Override
+ protected void applyRequestValues()
+ {
+ DataModel availableRooms = (DataModel) getValue("#{availableRooms}");
+ availableRooms.setRowIndex(0);
+ }
+
+ @Override
+ protected void invokeApplication()
+ {
+ assert getValue("#{booking.roomPreference}")!=null;
+ assert "Cozy Room".equals(getValue("#{booking.roomPreference.name}"));
+ assert "payment".equals(invokeAction("#{roomPreference.selectPreference}"));
+ System.out.println("here");
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ assert Manager.instance().isLongRunningConversation();
+ assert Manager.instance().isNestedConversation();
+ }
+
+ }.run();
+
+ System.out.println(id + "/" + nestedId);
+ // Hmm, need this to move to the new, nested, conversation
+ // TODO This is probably a bug in SeamTest, not sure where
+ new NonFacesRequest("/payment.xhtml", nestedId)
+ {
+
+ @Override
+ protected void renderResponse()
+ {
+ System.out.println("here");
+ assert Manager.instance().isLongRunningConversation();
+ assert Manager.instance().isNestedConversation();
+
+ assert getValue("#{booking.user}")!=null;
+ assert getValue("#{booking.hotel}")!=null;
+ assert getValue("#{booking.checkinDate}")!=null;
+ assert getValue("#{booking.checkoutDate}")!=null;
+ assert getValue("#{booking.roomPreference}")!=null;
+ assert getValue("#{booking.creditCard}")==null;
+ assert getValue("#{booking.creditCardName}")==null;
+ }
+
+ }.run();
+
+ new FacesRequest("/payment.xhtml", nestedId)
+ {
+
+ @Override
+ protected void processValidations()
+ {
+ validateValue("#{booking.creditCard}", "123");
+ assert isValidationFailure();
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ Iterator messages = FacesContext.getCurrentInstance().getMessages();
+ assert messages.hasNext();
+ assert ( (FacesMessage) messages.next() ).getSummary().equals("Credit card number must 16 digits long");
+ assert !messages.hasNext();
+ assert Manager.instance().isLongRunningConversation();
+ assert Manager.instance().isNestedConversation();
+ }
+
+ }.run();
+
+ new FacesRequest("/payment.xhtml", nestedId)
+ {
+
+ @Override
+ protected void processValidations()
+ {
+ validateValue("#{booking.creditCardName}", "");
+ assert isValidationFailure();
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ Iterator messages = FacesContext.getCurrentInstance().getMessages();
+ assert messages.hasNext();
+ assert ( (FacesMessage) messages.next() ).getSummary().equals("Credit card name is required");
+ assert !messages.hasNext();
+ assert Manager.instance().isLongRunningConversation();
+ assert Manager.instance().isNestedConversation();
+ }
+
+ }.run();
+
+ new FacesRequest("/payment.xhtml", nestedId)
+ {
+ @Override
+ protected void updateModelValues()
+ {
+ setValue("#{booking.creditCard}", "1234567891021234");
+ setValue("#{booking.creditCardName}", "GAVIN KING");
+ }
+
+ @Override
+ protected void invokeApplication()
+ {
+ assert "confirm".equals(invokeAction("#{roomPreference.requestConfirmation}"));
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ assert Manager.instance().isLongRunningConversation();
+ assert Manager.instance().isNestedConversation();
+ }
+
+ }.run();
+
+ new FacesRequest("/confirm.xhtml", nestedId) {
+
+ @Override
+ protected void invokeApplication()
+ {
+ invokeMethod("#{hotelBooking.confirm}");
+ }
+
+ }.run();
+
+ new NonFacesRequest("/main.xhtml") {
+
+ @Override
+ protected void renderResponse()
+ {
+ ListDataModel bookings = (ListDataModel) getInstance("bookings");
+ assert bookings.getRowCount()==1;
+ bookings.setRowIndex(0);
+ Booking booking = (Booking) bookings.getRowData();
+ assert booking.getHotel().getCity().equals("NY");
+ assert booking.getUser().getUsername().equals("gavin");
+ assert !Manager.instance().isLongRunningConversation();
+ }
+
+ }.run();
+
+ new FacesRequest("/main.xhtml") {
+
+ @Override
+ protected void invokeApplication()
+ {
+ ListDataModel bookings = (ListDataModel) Contexts.getSessionContext().get("bookings");
+ bookings.setRowIndex(0);
+ invokeMethod("#{bookingList.cancel}");
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ ListDataModel bookings = (ListDataModel) Contexts.getSessionContext().get("bookings");
+ assert bookings.getRowCount()==0;
+ assert !Manager.instance().isLongRunningConversation();
+ }
+
+ }.run();
+
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/ChangePasswordTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/ChangePasswordTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/ChangePasswordTest.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,138 @@
+//$Id: ChangePasswordTest.java 6826 2007-11-25 13:12:07Z pmuir $
+package org.jboss.seam.example.nestedbooking.test;
+
+import org.jboss.seam.contexts.Contexts;
+import org.jboss.seam.core.Manager;
+import org.jboss.seam.example.booking.User;
+import org.jboss.seam.mock.SeamTest;
+import org.testng.annotations.Test;
+
+public class ChangePasswordTest extends SeamTest
+{
+
+ @Test
+ public void testChangePassword() throws Exception
+ {
+
+ new FacesRequest() {
+
+ @Override
+ protected void invokeApplication() throws Exception
+ {
+ Contexts.getSessionContext().set("user", new User("Gavin King", "foobar", "gavin"));
+ setValue("#{identity.username}", "gavin");
+ setValue("#{identity.password}", "foobar");
+ invokeMethod("#{identity.login}");
+ }
+
+ }.run();
+
+ new FacesRequest() {
+
+ @Override
+ protected void processValidations() throws Exception
+ {
+ validateValue("#{user.password}", "xxx");
+ assert isValidationFailure();
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ assert getValue("#{user.name}").equals("Gavin King");
+ assert getValue("#{user.username}").equals("gavin");
+ assert getValue("#{user.password}").equals("foobar");
+ assert !Manager.instance().isLongRunningConversation();
+ assert getValue("#{identity.loggedIn}").equals(true);
+
+ }
+
+ }.run();
+
+ new FacesRequest() {
+
+ @Override
+ protected void updateModelValues() throws Exception
+ {
+ setValue("#{user.password}", "xxxyyy");
+ setValue("#{changePassword.verify}", "xxyyyx");
+ }
+
+ @Override
+ protected void invokeApplication()
+ {
+ assert invokeMethod("#{changePassword.changePassword}")==null;
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ assert getValue("#{user.name}").equals("Gavin King");
+ assert getValue("#{user.username}").equals("gavin");
+ assert getValue("#{user.password}").equals("foobar");
+ assert !Manager.instance().isLongRunningConversation();
+ assert getValue("#{identity.loggedIn}").equals(true);
+ }
+
+ }.run();
+
+ new FacesRequest() {
+
+ @Override
+ protected void updateModelValues() throws Exception
+ {
+ setValue("#{user.password}", "xxxyyy");
+ setValue("#{changePassword.verify}", "xxxyyy");
+ }
+
+ @Override
+ protected void invokeApplication()
+ {
+ invokeMethod("#{changePassword.changePassword}");
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ assert getValue("#{user.name}").equals("Gavin King");
+ assert getValue("#{user.username}").equals("gavin");
+ assert getValue("#{user.password}").equals("xxxyyy");
+ assert !Manager.instance().isLongRunningConversation();
+ assert getValue("#{identity.loggedIn}").equals(true);
+
+ }
+
+ }.run();
+
+ new FacesRequest() {
+
+ @Override
+ protected void updateModelValues() throws Exception
+ {
+ assert getValue("#{user.password}").equals("xxxyyy");
+ setValue("#{user.password}", "foobar");
+ setValue("#{changePassword.verify}", "foobar");
+ }
+
+ @Override
+ protected void invokeApplication()
+ {
+ invokeMethod("#{changePassword.changePassword}");
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ assert getValue("#{user.name}").equals("Gavin King");
+ assert getValue("#{user.username}").equals("gavin");
+ assert getValue("#{user.password}").equals("foobar");
+ assert !Manager.instance().isLongRunningConversation();
+ assert getValue("#{identity.loggedIn}").equals(true);
+
+ }
+
+ }.run();
+
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/LoginTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/LoginTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/LoginTest.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,88 @@
+//$Id: LoginTest.java 6826 2007-11-25 13:12:07Z pmuir $
+package org.jboss.seam.example.nestedbooking.test;
+
+import org.jboss.seam.Seam;
+import org.jboss.seam.core.Manager;
+import org.jboss.seam.mock.SeamTest;
+import org.testng.annotations.Test;
+
+public class LoginTest extends SeamTest
+{
+
+ @Test
+ public void testLogin() throws Exception
+ {
+
+ new FacesRequest() {
+
+ @Override
+ protected void invokeApplication()
+ {
+ assert !isSessionInvalid();
+ assert getValue("#{identity.loggedIn}").equals(false);
+ }
+
+ }.run();
+
+ new FacesRequest() {
+
+ @Override
+ protected void updateModelValues() throws Exception
+ {
+ assert !isSessionInvalid();
+ setValue("#{identity.username}", "gavin");
+ setValue("#{identity.password}", "foobar");
+ }
+
+ @Override
+ protected void invokeApplication()
+ {
+ invokeMethod("#{identity.login}");
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ assert getValue("#{user.name}").equals("Gavin King");
+ assert getValue("#{user.username}").equals("gavin");
+ assert getValue("#{user.password}").equals("foobar");
+ assert !Manager.instance().isLongRunningConversation();
+ assert getValue("#{identity.loggedIn}").equals(true);
+ }
+
+ }.run();
+
+ new FacesRequest() {
+
+ @Override
+ protected void invokeApplication()
+ {
+ assert !isSessionInvalid();
+ assert getValue("#{identity.loggedIn}").equals(true);
+ }
+
+ }.run();
+
+ new FacesRequest() {
+
+ @Override
+ protected void invokeApplication()
+ {
+ assert !Manager.instance().isLongRunningConversation();
+ assert !isSessionInvalid();
+ invokeMethod("#{identity.logout}");
+ assert Seam.isSessionInvalid();
+ }
+
+ @Override
+ protected void renderResponse()
+ {
+ assert getValue("#{identity.loggedIn}").equals(false);
+ assert Seam.isSessionInvalid();
+ }
+
+ }.run();
+
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/selenium/NestedConversationTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/selenium/NestedConversationTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/selenium/NestedConversationTest.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,124 @@
+/*
+ * 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.nestedbooking.test.selenium;
+
+import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.AssertJUnit.assertFalse;
+import org.jboss.seam.example.common.test.selenium.SeamSeleniumTest;
+import org.jboss.seam.example.common.test.booking.selenium.SeleniumBookingTest;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ * This class tests only nested conversations
+ *
+ * @author mgencur
+ */
+public class NestedConversationTest extends SeamSeleniumTest
+{
+ protected final int timeout = 5000;
+ protected final String CREDIT_CARD = "0123456789012345";
+ protected final String CREDIT_CARD_NAME = "visa";
+
+ @BeforeMethod
+ public void setUp()
+ {
+ super.setUp();
+ }
+
+ @AfterMethod
+ public void tearDown()
+ {
+ super.tearDown();
+ }
+
+ @Test
+ public void nestedConversationTest()
+ {
+ browser.open(CONTEXT_PATH + getProperty("MAIN_PAGE"));
+ pause(timeout);
+ browser.openWindow(CONTEXT_PATH + getProperty("MAIN_PAGE"), "0");
+ pause(timeout);
+ browser.selectWindow("0");
+ login("demo", "demo");
+ SeleniumBookingTest t = new SeleniumBookingTest();
+ t.enterSearchQuery("W Hotel");
+ browser.click(getProperty("SEARCH_RESULT_TABLE_SECOND_ROW_LINK"));
+ pause(timeout);
+
+ //open the url in a second window
+ String url = browser.getLocation();
+ browser.openWindow(url, "1");
+
+ //go next to confirm button in browser 1
+ browser.selectWindow("0");
+ browser.clickAndWait(getProperty("BOOKING_BOOK"));
+ browser.clickAndWait(getProperty("SELECT_ROOM_BUTTON"));
+ browser.clickAndWait(getProperty("SELECT_WONDERFUL_ROOM"));
+ browser.type(getProperty("PAYMENT_CREDIT_CARD"), CREDIT_CARD);
+ browser.type(getProperty("PAYMENT_CREDIT_CARD_NAME"), CREDIT_CARD_NAME);
+ browser.click(getProperty("PAYMENT_PROCEED"));
+
+ //go next to confirm button in browser 2
+ browser.selectWindow("1");
+ browser.clickAndWait(getProperty("BOOKING_BOOK"));
+ browser.clickAndWait(getProperty("SELECT_ROOM_BUTTON"));
+ browser.clickAndWait(getProperty("SELECT_FANTASTIC_ROOM"));
+ browser.type(getProperty("PAYMENT_CREDIT_CARD"), CREDIT_CARD);
+ browser.type(getProperty("PAYMENT_CREDIT_CARD_NAME"), CREDIT_CARD_NAME);
+ browser.click(getProperty("PAYMENT_PROCEED"));
+
+ //confirm in browser 1 (WONDERFUL room should be selected)
+ browser.selectWindow("0");
+ browser.clickAndWait(getProperty("CONFIRM_CONFIRM"));
+ assertTrue(browser.isTextPresent("$450.00") && browser.isTextPresent("Wonderful Room"));
+ assertFalse(browser.isTextPresent("$1,000.00") || browser.isTextPresent("Fantastic Suite"));
+ logout();
+ }
+
+ public void login(String username, String password)
+ {
+ //browser.waitForPageToLoad(TIMEOUT);
+ browser.type(getProperty("LOGIN_USERNAME_FIELD"), username);
+ browser.type(getProperty("LOGIN_PASSWORD_FIELD"), password);
+ browser.click(getProperty("LOGIN_SUBMIT"));
+ browser.waitForPageToLoad(TIMEOUT);
+ }
+
+ private void pause(int millis)
+ {
+ try
+ {
+ Thread.sleep(millis);
+ }
+ catch (InterruptedException e)
+ {
+ }
+ }
+
+ public void logout()
+ {
+ browser.click(getProperty("LOGOUT"));
+ browser.waitForPageToLoad(TIMEOUT);
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/selenium/NestedSimpleBookingTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/selenium/NestedSimpleBookingTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/java/org/jboss/seam/example/nestedbooking/test/selenium/NestedSimpleBookingTest.java 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,84 @@
+/*
+ * 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.nestedbooking.test.selenium;
+
+import java.text.MessageFormat;
+
+import org.jboss.seam.example.common.test.booking.selenium.SimpleBookingTest;
+
+/**
+ * This class alters behaviour of SimpleBookingTest to match nestedbooking example
+ *
+ * @author jharting
+ */
+public class NestedSimpleBookingTest extends SimpleBookingTest {
+
+ @Override
+ protected int bookHotel(String hotelName) {
+ return bookHotel(hotelName, 0, CREDIT_CARD, CREDIT_CARD_NAME);
+ }
+
+ protected int bookHotel(String hotelName, int room, String creditCard, String creditCardName) {
+ if (!isLoggedIn()) {
+ return -1;
+ }
+
+ if (!browser.isElementPresent(getProperty("SEARCH_SUBMIT"))) {
+ browser.open(CONTEXT_PATH + getProperty("MAIN_PAGE"));
+ browser.waitForPageToLoad(TIMEOUT);
+ }
+
+ enterSearchQuery(hotelName);
+ browser.click(getProperty("SEARCH_RESULT_TABLE_FIRST_ROW_LINK"));
+ browser.waitForPageToLoad(TIMEOUT);
+ // hotel page
+ browser.click(getProperty("BOOKING_BOOK"));
+ browser.waitForPageToLoad(TIMEOUT);
+ // book page
+ browser.click(getProperty("BOOKING_SELECT_ROOM"));
+ browser.waitForPageToLoad(TIMEOUT);
+ // room select page
+ browser.click(MessageFormat.format(getProperty("ROOM_LINK"), room));
+ browser.waitForPageToLoad(TIMEOUT);
+ // payment page
+ browser.type(getProperty("PAYMENT_CREDIT_CARD"), creditCard);
+ browser.type(getProperty("PAYMENT_CREDIT_CARD_NAME"), creditCardName);
+ browser.click(getProperty("PAYMENT_PROCEED"));
+ browser.waitForPageToLoad(TIMEOUT);
+ // confirm page
+ browser.click(getProperty("CONFIRM_CONFIRM"));
+ browser.waitForPageToLoad(TIMEOUT);
+ // main page
+ String message = browser.getText(getProperty("HOTEL_MESSAGE"));
+ if (message.matches(MessageFormat.format(
+ getProperty("BOOKING_CONFIRMATION_MESSAGE"), EXPECTED_NAME, hotelName))) {
+ String[] messageParts = message.split(" ");
+ int confirmationNumber = Integer.parseInt(messageParts[messageParts.length - 1]);
+ return confirmationNumber;
+ } else {
+ return -1;
+ }
+ }
+
+ @Override
+ protected void populateBookingFields() {}
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/WEB-INF/components.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/WEB-INF/components.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/WEB-INF/components.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,21 @@
+<?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:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation=
+ "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/security http://jboss.com/products/seam/security-2.3.xsd
+ http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.3.xsd">
+
+ <core:init jndi-pattern="#{ejbName}/local" debug="true"/>
+
+ <core:manager conversation-timeout="120000"
+ concurrent-request-timeout="500"
+ conversation-id-parameter="cid"/>
+
+ <security:identity authenticate-method="#{authenticator.authenticate}"/>
+
+</components>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/nestedbooking.properties
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/nestedbooking.properties (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/nestedbooking.properties 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,92 @@
+ #
+ # 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.
+ #
+HOME_PAGE /home.seam
+MAIN_PAGE /main.seam
+PAGE_TITLE JBoss Suites: Seam Framework
+LOGIN_USERNAME_FIELD id=login:username
+LOGIN_PASSWORD_FIELD id=login:password
+LOGIN_SUBMIT id=login:login
+LOGOUT id=logout
+PASSWORD_UPDATED_MESSAGE Password updated
+PASSWORD_REENTER_MESSAGE Re-enter new password
+PASSWORD_VALUE_REQUIRED_MESSAGE //*[@id='setpassword:PasswordDecorate:message' or @id='setpassword:VerifyDecorate:message']
+PASSWORD_LENGTH_MESSAGE size must be between
+PASSWORD_PASSWORD id=setpassword:PasswordDecorate:password
+PASSWORD_VERIFY id=setpassword:VerifyDecorate:verify
+PASSWORD_SUBMIT id=setpassword:change
+SETTINGS id=settings
+SEARCH_STRING_FIELD id=main:searchString
+SEARCH_SUBMIT id=main:findHotels
+NO_HOTELS_FOUND id=NoHotelsFoundMessage
+SEARCH_RESULT_TABLE xpath=//table[@id = 'hotels']/tbody
+SEARCH_RESULT_TABLE_FIRST_ROW_LINK id=hotels:0:viewHotel
+SEARCH_RESULT_TABLE_SECOND_ROW_LINK id=hotels:1:viewHotel
+BOOKING_BOOK id=hotel:bookHotel
+BOOKING_CANCEL id=hotel:cancel
+BOOKING_SELECT_ROOM id=booking:room_preference
+HOTEL_BED_FIELD id=booking:bedsDecorate:beds
+HOTEL_BED_FIELD_SELECT_CRITERIA value=
+HOTEL_CHECKIN_DATE_FIELD id=booking:checkinDateDecorate:checkinDateInputDate
+HOTEL_CHECKIN_DATE_MESSAGE id=booking:checkinDateDecorate:message
+HOTEL_CHECKOUT_DATE_FIELD id=booking:checkoutDateDecorate:checkoutDateInputDate
+HOTEL_CHECKOUT_DATE_MESSAGE id=booking:checkoutDateDecorate:message
+HOTEL_SMOKING id=booking:smokingDecorate:smoking:
+HOTEL_PROCEED id=booking:room_preference
+HOTEL_CANCEL id=booking:cancel
+HOTEL_CONFIRM id=confirm:confirm
+HOTEL_MESSAGE xpath=//ul[@id='main:messages']/li
+ROOM_LINK id=room_selections_form:rooms:{0}:selectRoomPreference
+PAYMENT_CREDIT_CARD id=payment:creditCardDecorate:creditCard
+PAYMENT_CREDIT_CARD_NAME id=payment:creditCardNameDecorate:creditCardName
+PAYMENT_PROCEED id=payment:proceed
+CONFIRM_CONFIRM id=confirm:buttonDecorate:confirm
+REGISTRATION id=login:register
+REGISTRATION_USERNAME id=register:usernameDecorate:username
+REGISTRATION_USERNAME_MESSAGE id=register:usernameDecorate:message
+REGISTRATION_NAME id=register:nameDecorate:name
+REGISTRATION_NAME_MESSAGE id=register:nameDecorate:message
+REGISTRATION_PASSWORD id=register:passwordDecorate:password
+REGISTRATION_PASSWORD_MESSAGE id=register:passwordDecorate:message
+REGISTRATION_VERIFY id=register:verifyDecorate:verify
+REGISTRATION_VERIFY_MESSAGE id=register:verifyDecorate:message
+REGISTRATION_SUBMIT id=register:register
+REGISTRATION_REENTER_MESSAGE Re-enter your password
+REGISTRATION_LENGTH_MESSAGE size must be between
+REGISTRATION_SUCCESSFUL_MESSAGE
+REGISTRATION_USER_EXISTS_MESSAGE Username {0} already exists
+NOT_LOGGED_IN_MESSAGE Please log in first
+CONVERSATION_TIMEOUT_MESSAGE The conversation ended, timed out or was processing another request
+BOOKING_TABLE_ITEM xpath\=//table[@id\="bookings\:bookings"]/tbody/tr[normalize-space(td[6]/text()) \= "{0}"][normalize-space(td[1]/text()) \= "{1}"]
+BOOKING_TABLE_ITEM_LINK xpath\=//table[@id\="bookings\:bookings"]/tbody/tr[normalize-space(td[6]/text()) \= "{0}"][normalize-space(td[1]/text()) \= "{1}"]/td[7]/a
+BOOKING_CANCELLED_MESSAGE Booking cancelled for confirmation number {0}
+BOOKING_CONFIRMATION_MESSAGE Thank you, {0}, your confimation number for {1} is \\d+
+BOOKING_INVALID_DATE_MESSAGE1 Check out date must be later than check in date
+BOOKING_INVALID_DATE_MESSAGE2 Check in date must be a future date
+WORKSPACE_BOOKING_TEXT Book hotel: {0}
+WORKSPACE_VIEW_TEXT View hotel: {0}
+WORKSPACE_TABLE_LINK_BY_ID id=ConversationListForm:ConversationListDataTable:{0}:EntryDescriptionLink
+WORKSPACE_TABLE_ROW_COUNT = //table[@id\='ConversationListForm\:ConversationListDataTable']/tbody/tr
+SPINNER id\=main\:SpinnerGif
+SELECT_ROOM_BUTTON id=booking:room_preference
+SELECT_WONDERFUL_ROOM id=room_selections_form:rooms:0:selectRoomPreference
+SELECT_FANTASTIC_ROOM id=room_selections_form:rooms:2:selectRoomPreference
+
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/nestedbooking.properties
___________________________________________________________________
Added: svn:executable
+ *
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/seam.properties
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/seam.properties (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources/seam.properties 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,3 @@
+#debug is explicitly disabled in test to avoid JBIDE-3623
+#Thu Dec 31 16:24:37 CET 2009
+org.jboss.seam.core.init.debug=false
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources-ftest/testng.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources-ftest/testng.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources-ftest/testng.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,36 @@
+
+ <!--
+ 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="Nested booking example" verbose="2" parallel="false">
+ <test name="nestedbooking_tests">
+ <parameter name="PROPERTY_FILE"
+ value="/nestedbooking.properties" />
+ <classes>
+ <class
+ name="org.jboss.seam.example.common.test.booking.selenium.RegistrationTest" />
+ <class
+ name="org.jboss.seam.example.common.test.booking.selenium.ChangePasswordTest" />
+ <class
+ name="org.jboss.seam.example.common.test.booking.selenium.BackButtonTest" />
+ <class
+ name="org.jboss.seam.example.nestedbooking.test.selenium.NestedSimpleBookingTest" />
+ <class
+ name="org.jboss.seam.example.nestedbooking.test.selenium.NestedConversationTest" />
+ </classes>
+ </test>
+</suite>
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources-ftest/testng.xml
___________________________________________________________________
Added: svn:executable
+ *
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources-integration/testng.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources-integration/testng.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-tests/src/test/resources-integration/testng.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,13 @@
+<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
+
+<suite name="Nested Hotel Booking" verbose="2" parallel="false">
+
+ <test name="Nested Hotel Booking">
+ <classes>
+ <!-- <class name="org.jboss.seam.example.nestedbooking.test.LoginTest"/>-->
+ <class name="org.jboss.seam.example.nestedbooking.test.BookingTest"/>
+ <!-- <class name="org.jboss.seam.example.nestedbooking.test.ChangePasswordTest"/>-->
+ </classes>
+ </test>
+
+</suite>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/pom.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,78 @@
+<?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>nestedbooking</artifactId>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.nestedbooking</groupId>
+ <artifactId>nestedbooking-web</artifactId>
+ <packaging>war</packaging>
+ <name>Nested Booking Web Module (EE6)</name>
+
+ <properties>
+ <!-- filtering property for components.xml -->
+ <jndiPattern>java:app/nestedbooking-ejb/#{ejbName}</jndiPattern>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.nestedbooking</groupId>
+ <artifactId>nestedbooking-ejb</artifactId>
+ <type>ejb</type>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-ui</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-jul</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-debug</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.richfaces.ui</groupId>
+ <artifactId>richfaces-components-ui</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.richfaces.core</groupId>
+ <artifactId>richfaces-core-impl</artifactId>
+ </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>
+
+</project>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/components.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/components.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/components.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,21 @@
+<?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:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation=
+ "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/security http://jboss.com/products/seam/security-2.3.xsd
+ http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.3.xsd">
+
+ <core:init jndi-pattern="@jndiPattern@" debug="true"/>
+
+ <core:manager conversation-timeout="120000"
+ concurrent-request-timeout="500"
+ conversation-id-parameter="cid"/>
+
+ <security:identity authenticate-method="#{authenticator.authenticate}"/>
+
+</components>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/faces-config.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/faces-config.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/faces-config.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<faces-config version="2.1"
+ 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-facesconfig_2_1.xsd">
+
+</faces-config>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/pages.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/pages.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/pages.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,140 @@
+<pages xmlns="http://jboss.com/products/seam/pages"
+ no-conversation-view-id="/main.xhtml"
+ login-view-id="/home.xhtml">
+
+ <page view-id="/register.xhtml">
+
+ <action if="#{validation.failed}" execute="#{register.invalid}"/>
+
+ <navigation>
+ <rule if="#{register.registered}">
+ <redirect view-id="/home.xhtml"/>
+ </rule>
+ </navigation>
+
+ </page>
+
+ <page view-id="/home.xhtml" action="#{identity.isLoggedIn}">
+
+ <navigation from-action="#{identity.isLoggedIn}">
+ <rule if-outcome="true">
+ <redirect view-id="/main.xhtml"/>
+ </rule>
+ <rule if-outcome="false">
+ <render view-id="/home.xhtml"/>
+ </rule>
+ </navigation>
+
+ </page>
+
+ <page view-id="/password.xhtml"
+ login-required="true">
+
+ <navigation>
+ <rule if="#{changePassword.changed}">
+ <redirect view-id="/main.xhtml"/>
+ </rule>
+ </navigation>
+
+ </page>
+
+ <page view-id="/main.xhtml"
+ login-required="true">
+
+ <navigation from-action="#{hotelBooking.selectHotel(hot)}">
+ <redirect view-id="/hotel.xhtml"/>
+ </navigation>
+
+ </page>
+
+ <page view-id="/hotel.xhtml"
+ conversation-required="true">
+
+ <description>View hotel: #{hotel.name}</description>
+
+ <navigation from-action="#{hotelBooking.bookHotel}">
+ <redirect view-id="/book.xhtml"/>
+ </navigation>
+
+ </page>
+
+ <page view-id="/book.xhtml"
+ conversation-required="true">
+
+ <description>Book hotel: #{hotel.name}</description>
+
+ <navigation from-action="#{hotelBooking.setBookingDates}">
+ <rule if-outcome="rooms">
+ <redirect view-id="/rooms.xhtml"/>
+ </rule>
+ </navigation>
+ </page>
+
+ <page view-id="/rooms.xhtml"
+ conversation-required="true">
+
+ <description>Room Preference: #{hotel.name}</description>
+
+ <navigation from-action="#{roomPreference.cancel}">
+ <redirect view-id="/book.xhtml"/>
+ </navigation>
+
+ <navigation from-action="#{roomPreference.selectPreference}">
+ <rule if-outcome="payment">
+ <redirect view-id="/payment.xhtml"/>
+ </rule>
+ </navigation>
+ </page>
+
+ <page view-id="/payment.xhtml"
+ conversation-required="true">
+
+ <description>Payment: #{hotel.name}, #{roomSelection.name}</description>
+
+ <navigation from-action="#{roomPreference.cancel}">
+ <redirect view-id="/rooms.xhtml"/>
+ </navigation>
+
+ <navigation from-action="#{roomPreference.requestConfirmation}">
+ <rule if-outcome="confirm">
+ <redirect view-id="/confirm.xhtml"/>
+ </rule>
+ </navigation>
+ </page>
+
+ <page view-id="/confirm.xhtml"
+ conversation-required="true">
+
+ <description>Confirm booking: #{booking.description}</description>
+
+ <navigation from-action="#{hotelBooking.confirm}">
+ <redirect view-id="/main.xhtml"/>
+ </navigation>
+
+ </page>
+
+ <page view-id="*">
+
+ <navigation from-action="#{identity.logout}">
+ <redirect view-id="/home.xhtml"/>
+ </navigation>
+
+ <navigation from-action="#{hotelBooking.cancel}">
+ <redirect view-id="/main.xhtml"/>
+ </navigation>
+
+ </page>
+
+ <exception class="org.jboss.seam.security.NotLoggedInException">
+ <redirect view-id="/home.xhtml">
+ <message severity="warn">You must be logged in to use this feature</message>
+ </redirect>
+ </exception>
+
+ <exception class="javax.faces.application.ViewExpiredException">
+ <redirect view-id="/home.xhtml">
+ <message severity="warn">Session expired, please log in again</message>
+ </redirect>
+ </exception>
+
+</pages>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/web.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/web.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/WEB-INF/web.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="3.0"
+ 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_3_0.xsd">
+
+ <display-name>Seam Booking 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/nestedbooking/nestedbooking-web/src/main/webapp/book.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/book.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/book.xhtml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,85 @@
+<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"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:a="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich"
+ template="template.xhtml">
+
+<!-- content -->
+<ui:define name="content">
+<div class="section">
+ <h1>Book Hotel</h1>
+</div>
+<div class="section">
+ <h:form id="booking">
+ <fieldset>
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Name:</ui:define>
+ #{hotel.name}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Address:</ui:define>
+ #{hotel.address}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">City, State:</ui:define>
+ #{hotel.city}, #{hotel.state}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Zip:</ui:define>
+ #{hotel.zip}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Country:</ui:define>
+ #{hotel.country}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Nightly rate:</ui:define>
+ <h:outputText value="#{hotel.minPrice}">
+ <f:convertNumber type="currency"
+ currencySymbol="$"/>
+ </h:outputText>
+ -
+ <h:outputText value="#{hotel.maxPrice}">
+ <f:convertNumber type="currency"
+ currencySymbol="$"/>
+ </h:outputText>
+ </s:decorate>
+
+ <s:decorate id="checkinDateDecorate" template="edit.xhtml">
+ <ui:define name="label">Check In Date:</ui:define>
+ <rich:calendar id="checkinDate" value="#{booking.checkinDate}" required="true" datePattern="MM/dd/yyyy" event="onblur" reRender="checkinDateDecorate" style="width: auto;"/>
+ </s:decorate>
+
+ <s:decorate id="checkoutDateDecorate" template="edit.xhtml">
+ <ui:define name="label">Check Out Date:</ui:define>
+ <rich:calendar id="checkoutDate" value="#{booking.checkoutDate}" required="true" datePattern="MM/dd/yyyy" event="onblur" reRender="checkoutDateDecorate" style="width: auto;"/>
+ </s:decorate>
+
+ <div class="entry errors">
+ <h:messages globalOnly="true"/>
+ </div>
+
+ <div class="entry">
+ <div class="label"> </div>
+ <div class="input">
+ <h:commandButton id="room_preference" value="Select Room" action="#{hotelBooking.setBookingDates}"/> 
+ <s:button id="cancel" value="Cancel" action="#{hotelBooking.cancel}"/>
+ </div>
+ </div>
+ </fieldset>
+ </h:form>
+</div>
+</ui:define>
+
+<!-- sidebar -->
+<ui:define name="sidebar"></ui:define>
+
+</ui:composition>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/confirm.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/confirm.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/confirm.xhtml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,81 @@
+<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"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ template="template.xhtml">
+
+<!-- content -->
+<ui:define name="content">
+<div class="section">
+ <h1>Confirm Hotel Booking</h1>
+</div>
+<div class="section">
+ <h:form id="confirm">
+ <fieldset>
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Name:</ui:define>
+ #{hotel.name}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Address:</ui:define>
+ #{hotel.address}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">City, State:</ui:define>
+ #{hotel.city}, #{hotel.state}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Zip:</ui:define>
+ #{hotel.zip}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Country:</ui:define>
+ #{hotel.country}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Room Preference:</ui:define>
+ #{roomSelection.name}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Total payment:</ui:define>
+ <h:outputText value="#{roomPreference.expectedPrice}">
+ <f:convertNumber type="currency"
+ currencySymbol="$"/>
+ </h:outputText>
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Check In Date:</ui:define>
+ <h:outputText value="#{booking.checkinDate}"/>
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Check Out Date:</ui:define>
+ <h:outputText value="#{booking.checkoutDate}"/>
+ </s:decorate>
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Credit Card #:</ui:define>
+ #{booking.creditCard}
+ </s:decorate>
+ <s:decorate id="buttonDecorate" template="output.xhtml">
+ <ui:define name="label"> </ui:define>
+ <h:commandButton id="confirm" value="Confirm" action="#{hotelBooking.confirm}"/> 
+ <s:button id="revise" value="Revise" view="/payment.xhtml"/> 
+ <h:commandButton id="cancel" value="Cancel" action="#{hotelBooking.cancel}"/>
+ </s:decorate>
+ </fieldset>
+ </h:form>
+</div>
+</ui:define>
+
+<!-- sidebar -->
+<ui:define name="sidebar"></ui:define>
+
+</ui:composition>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/conversations.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/conversations.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/conversations.xhtml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,33 @@
+<div xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:c="http://java.sun.com/jstl/core"
+ 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">
+
+<div class="section">
+ <h1><h:outputText rendered="#{not empty conversationList}" value="Workspaces"/></h1>
+</div>
+
+<div class="section">
+ <h:form>
+ <h:dataTable value="#{conversationList}" var="entry">
+ <h:column>
+ <h:commandLink action="#{entry.select}" value="#{entry.description}"/>
+  
+ <h:outputText value="[current]" rendered="#{entry.current}"/>
+ </h:column>
+ <h:column>
+ <h:outputText value="#{entry.startDatetime}">
+ <s:convertDateTime type="time" pattern="hh:mm"/>
+ </h:outputText>
+ -
+ <h:outputText value="#{entry.lastDatetime}">
+ <s:convertDateTime type="time" pattern="hh:mm"/>
+ </h:outputText>
+ </h:column>
+ </h:dataTable>
+ </h:form>
+</div>
+
+</div>
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/css/date.css
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/css/date.css (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/css/date.css 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,186 @@
+div.seam-date
+{
+ margin-top: 5px;
+ border: 1px solid #AAAAAA;
+ background: #fff url(../img/input.bg.gif) 0 0 repeat-x;
+ background-color: #FFFFFF;
+ color: #505050;
+ font-family: Tahoma, Arial, Helvetica, sans-serif;
+ font-size: 12px;
+}
+
+table.seam-date td {
+ font-family: Tahoma, Arial, Helvetica, sans-serif;
+ font-weight: 11px;
+ border: 0px;
+}
+
+.seam-date-monthNames
+{
+ width: 70px;
+ border: 1px solid #dddddd;
+ border-right: 3px solid #444444;
+ border-bottom: 3px solid #444444;
+ background-color: #ffffff;
+ font-size: 12px;
+ cursor: pointer;
+ font-family: Tahoma, Arial, Helvetica, sans-serif;
+ font-weight: normal;
+}
+
+a.seam-date-monthNameLink, a.seam-date-monthNameLink:visited
+{
+ text-align: center;
+ display: block;
+ color: #555555;
+}
+
+a.seam-date-monthNameLink:hover
+{
+ background-color: #CCCCCC;
+ color: red;
+}
+
+.seam-date-years
+{
+ height: 10em;
+ overflow: auto;
+ width: 60px;
+ border: 1px solid #dddddd;
+ border-right: 3px solid #444444;
+ border-bottom: 3px solid #444444;
+ background-color: #ffffff;
+ font-size: 12px;
+ cursor: pointer;
+ font-family: Tahoma, Arial, Helvetica, sans-serif;
+ font-weight: normal;
+}
+
+a.seam-date-yearLink, a.seam-date-yearLink:visited
+{
+ text-align: center;
+ display: block;
+ color: #555555;
+}
+
+a.seam-date-yearLink:hover
+{
+ background-color: #CCCCCC;
+ color: red;
+}
+
+tr.seam-date-header
+{
+ padding: 2px 0px 2px 0px;
+}
+
+td.seam-date-header
+{
+ padding: 0px 8px 0px 8px;
+ text-align: center;
+ color: gray;
+ font-family: Tahoma, Arial, Helvetica, sans-serif;
+ font-weight: bold;
+ font-size: 12px;
+}
+
+td.seam-date-header-prevMonth
+{
+ background-image: url("../img/cal-prev.png");
+ background-repeat: no-repeat;
+ background-position: center;
+ padding: 0px 2px 0px 2px;
+ width: 17px;
+ height: 16px;
+ margin-left: 2px;
+}
+
+td.seam-date-header-nextMonth
+{
+ background-image: url("../img/cal-next.png");
+ background-repeat: no-repeat;
+ background-position: center;
+ padding: 0px 2px 0px 2px;
+ width: 17px;
+ height: 16px;
+ margin-right: 2px;
+}
+
+tr.seam-date-headerDays
+{
+ color: white;
+ font-weight: normal;
+}
+
+tr.seam-date-headerDays > td
+{
+ background-color: #CCCCCC;
+ border: 1px solid #AAAAAA;
+ color: white;
+ text-align: center;
+ width: 26px;
+}
+
+tr.seam-date-footer
+{
+ background-color: white;
+ color: #505050;
+ font-weight: bold;
+}
+
+tr.seam-date-footer > td
+{
+ text-align: center;
+}
+
+td.seam-date-inMonth
+{
+ background-color: white;
+ color: black;
+ font-weight: normal;
+ cursor: pointer;
+ border: 1px solid #ece9d8;
+}
+
+td.seam-date-outMonth
+{
+ background-color: white;
+ color: #999999;
+ font-weight: normal;
+ cursor: pointer;
+ border: 1px solid #ece9d8;
+}
+
+td.seam-date-selected
+{
+ background-color: #CCCCCC;
+ border: 1px solid #AAAAAA;
+ color: black;
+ font-weight: normal;
+}
+
+td.seam-date-dayOff-inMonth
+{
+ background-color: #efefef;
+ color: black;
+ font-weight: normal;
+ cursor: pointer;
+ border: 1px solid #ece9d8;
+}
+
+td.seam-date-dayOff-outMonth
+{
+ background-color: #efefef;
+ color: #999999;
+ font-weight: normal;
+ cursor: pointer;
+ border: 1px solid #ece9d8;
+}
+
+td.seam-date-hover
+{
+ background-color: #CCCCCC;
+ border: 1px solid #AAAAAA;
+ cursor: pointer;
+ color: red;
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/css/screen.css
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/css/screen.css (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/css/screen.css 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,272 @@
+/* Setup defaults since variable in browsers
+----------------------------------------------- */
+body, div, dd, dt, dl, img, ul, ol, li, p, h1, h2, h3, h4, h5, form, hr, fieldset {
+ margin: 0;
+ padding: 0;
+}
+/* Element Defaults
+----------------------------------------------- */
+html {
+ height: 100%;
+ background-color: #DBD4C6;
+}
+img {
+ border: 0;
+}
+body {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: small;
+ line-height: 1.25em;
+ color: #362F2D;
+ position: relative;
+ width: 760px;
+ height: 100%;
+ margin-left: auto;
+ margin-right: auto;
+}
+label {
+ font-weight: bold;
+ color: #5E5147;
+}
+input {
+ border: 1px solid #C3BBB6;
+ padding: 4px;
+ margin: 5px 0;
+ background: #fff url(../img/input.bg.gif) 0 0 repeat-x;
+}
+select {
+ border: 1px solid #C3BBB6;
+ padding: 4px;
+ margin: 5px 0;
+ background: #fff url(../img/input.bg.gif) 0 0 repeat-x;
+}ol, ul {
+ margin: 10px 0px 10px 6px;
+}
+li {
+ margin: 10px 12px;
+}
+fieldset {
+ border: 0;
+}
+/* Layout
+----------------------------------------------- */
+#document {
+ padding: 0 1px;
+ background: #fff url(../img/bg.gif) 0 0 repeat-y;
+ float: left;
+ border-bottom: 1px solid #C3BBB6;
+}
+#header {
+ float: left;
+ width: 758px;
+ height: 46px;
+ background: url(../img/hdr.bg.gif) 0 0 repeat-x;
+}
+#container {
+ float: left;
+ width: 758px;
+ background: url(../img/hdr.bar.jpg) 0 0 repeat-x;
+}
+#sidebar {
+ float: left;
+ width: 190px;
+ margin-top: 96px;
+ padding: 20px 10px 0 10px;
+ background: url(../img/sdb.bg.gif) 0 0 no-repeat;
+}
+#content {
+ float: left;
+ width: 548px;
+ margin-top: 75px;
+ padding-top: 5px;
+ background: #fff url(../img/cnt.bg.gif) 0 0 repeat-x;
+}
+#footer {
+ clear: both;
+ margin-top: 40px;
+ float: left;
+ padding: 20px;
+ border-top: 1px solid #C3BBB6;
+ background-color: #fff;
+ width: 718px;
+ text-align: right;
+}
+/* General
+----------------------------------------------- */
+input[type="submit"], input[type="button"] {
+ font-weight: bold;
+ color: #fff;
+ border: 1px solid #5D1414;
+ height: 26px;
+ background: #fff url(../img/btn.bg.gif) 0 0 repeat-x;
+ border-style: none;
+}
+.center {
+ text-align: center;
+}
+.entry {
+ clear: both;
+ padding-top: 10px;
+}
+.entry .label {
+ float: left;
+ padding-top: 10px;
+ padding-right: 5px;
+ font-weight: bold;
+ width: 150px;
+ text-align: right;
+}
+.entry .output {
+ float: left;
+ width: 250px;
+ padding-top: 10px;
+ text-align: left;
+}
+.entry .input {
+ float: left;
+ width: 250px;
+ text-align: left;
+}
+/* Sidebar
+----------------------------------------------- */
+.notes {
+ text-align: center;
+ font-size: small;
+}
+.subnotes {
+ margin-top: 1em;
+ font-size: small;
+}
+.errors {
+ font-size: small;
+ font-weight: bold;
+ text-align: center;
+ color: #600;
+}
+.errors div {
+ text-align: left;
+}
+.errors input {
+ border: 1px solid #600;
+}
+.errors ul {
+ list-style: none;
+}
+.buttonBox {
+ text-align: center;
+ padding: 5px 0;
+}
+#sidebar p {
+ font-size: small;
+ color: #8B7869;
+ line-height: 150%;
+ padding-bottom: 10px;
+}
+#sidebar li {
+ font-size: small;
+ color: #8B7869;
+}
+#sidebar h1 {
+ line-height: normal;
+ font-weight: bold;
+ font-size: small;
+}
+/*
+#sidebar p:hover {
+ color: #362F2D;
+}
+*/
+/* Content
+----------------------------------------------- */
+#content .section {
+ float: left;
+ width: 518px;
+ padding: 15px 15px 0 15px;
+}
+#content .section h1 {
+ font-family: "Trebuchet MS", Arial, sans-serif;
+ line-height: normal;
+ font-weight: normal;
+ font-size: large;
+}
+#content .section p {
+ line-height: 150%;
+ padding: 10px 0;
+ font-size: small;
+}
+#content table {
+ width: 100%;
+ border: 1px solid #D2C9C4;
+ border-collapse: collapse;
+}
+#content table caption {
+ padding-bottom: 6px;
+ text-align: left;
+ font-weight: bold;
+}
+#content table thead th {
+ border-left: 1px solid #D2C9C4;
+ background: #fff url(../img/th.bg.gif) 0 100% repeat-x;
+ border-bottom: 1px solid #D2C9C4;
+ padding: 6px;
+ text-align: left;
+ font-size: small;
+}
+#content table tbody td {
+ border-left: 1px solid #E4DBD5;
+ padding: 4px;
+ border-bottom: 1px solid #D2C9C4;
+ font-size: small;
+}
+#content dt {
+ font-weight: bold;
+ float: left;
+ width: 33%;
+}
+#content dd {
+ padding-left: 10px;
+ float: left;
+ width: 66%;
+}
+#radio table {
+ border: 0px;
+}
+#radio table tr td {
+ border: 0px;
+ border-left: 0px;
+ border-bottom: 0px;
+}
+/* Header
+----------------------------------------------- */
+#title {
+ float: left;
+ padding: 1px 0 6px 15px;
+}
+#status {
+ color: #C7B299;
+ float: right;
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-weight: bold;
+ font-size: x-small;
+ text-align: right;
+ padding-top: 14px;
+ padding-right: 15px;
+}
+#status a {
+ color: #C7B299;
+ text-decoration: none;
+}
+/* Homepage Modifications
+----------------------------------------------- */
+#pgHome #container {
+ background: url(../img/hdr.ad.jpg) 0 0 repeat-x;
+}
+#pgHome #sidebar {
+ margin-top: 207px;
+}
+#pgHome #content {
+ margin-top: 183px;
+}
+#pgHome #sidebar input[type="submit"] {
+ height: 30px;
+}
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/css/trailblazer_main.css
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/css/trailblazer_main.css (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/css/trailblazer_main.css 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,148 @@
+* {
+ margin: 0px;
+ padding: 0px;
+ border: none;
+}
+
+body {
+ font: 1em verdana, arial, sans-serif;
+ background: #CCCCCC;
+}
+
+div#main {
+ margin-left: 0px;
+ width: 751px;
+ background: #ecefdf;
+}
+
+div#top,div#pictures{
+}
+
+div#pictures img {
+ float:left;
+}
+
+img#head1 {
+ margin-right: 3px;
+}
+
+img#head2 {
+ margin-right: 4px;
+}
+
+div.trail {
+ clear:both;
+ margin-left: 50px;
+ margin-top: 0px;
+ margin-right: 50px
+}
+
+div.foot {
+ margin-left: 50px;
+ margin-right: 50px;
+ margin-top: 50px;
+ text-align: center;
+ font-size: .5em;
+ height: 36px;
+}
+
+div.trail h1 {
+ margin-top: -30px;
+ margin-left: -50px;
+ font-size: 1.2em;
+ font-weight: bold;
+ padding-left: .4em;
+}
+
+div.trail h2 {
+ float: left;
+ font-size: 1em;
+ font-weight: bold;
+ padding-left: .4em;
+}
+
+div.trail h3 {
+ float: left;
+ font-size: .8em;
+ font-weight: bold;
+ margin-left: -1.4em;
+ margin-bottom: 1em;
+}
+
+
+div.trail p {
+ clear: both;
+ margin-top: 20px;
+ font-size: .8em;
+ text-decoration: none;
+}
+
+div#next_trail {
+ margin-left: 36px;
+}
+
+div.numbox {
+ border: thin solid black;
+ margin-left: -.8em;
+ float: left;
+ background: #ffffff;
+ padding: .2em .35em .3em;
+ font-style: normal;
+ font-weight: bold;
+ font-size: 1.4em;
+}
+
+div.figure {
+ text-align: center;
+ font-size: .6em;
+ margin-top: 30px;
+}
+
+div.figure img {
+ display: block;
+ margin-right: auto;
+ margin-left: auto;
+}
+
+code {
+ font: 1.1em "Courier New", Courier, mono;
+}
+
+code.block {
+ white-space: pre;
+ font: 10pt "Courier New", Courier, mono;
+ display: block;
+ border-style: dashed;
+ border-width: thin;
+ padding: .5em;
+ background: #ffffff;
+ margin: 20px;
+}
+
+div.foot_image {
+ float: left;
+ height: 86px;
+}
+
+a:active {
+ color : #666666;
+ text-decoration: none;
+}
+
+a:hover {
+ color : #000000;
+ background-color : #D6E0FE;
+ text-decoration: none;
+}
+
+a:link {
+ color : #005EB6;
+ text-decoration: none;
+}
+
+a:visited {
+ color : #888888;
+ text-decoration: none;
+}
+
+
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/edit.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/edit.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/edit.xhtml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,21 @@
+<!DOCTYPE composition 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"
+ xmlns:s="http://jboss.com/products/seam/taglib">
+
+ <div class="entry">
+ <s:label id="Label" styleClass="label #{invalid?'errors':''}">
+ <ui:insert name="label"/>
+ <s:span id="RequiredStyle" styleClass="required" rendered="#{required}">*</s:span>
+ </s:label>
+ <span class="input #{invalid?'errors':''}">
+ <s:validateAll id="ValidateAll">
+ <ui:insert/>
+ </s:validateAll>
+ </span>
+ <s:message id="message" styleClass="error errors"/>
+ </div>
+
+</ui:composition>
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/home.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/home.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/home.xhtml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html 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"
+ xmlns:s="http://jboss.com/products/seam/taglib">
+<h:head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <title>JBoss Suites: Seam Framework</title>
+ <link href="css/screen.css" rel="stylesheet" type="text/css" />
+</h:head>
+<body id="pgHome">
+<f:view>
+<div id="document">
+ <div id="header">
+ <div id="title"><img src="img/hdr.title.gif" alt="JBoss Suites: seam framework demo"/></div>
+ </div>
+ <div id="container">
+ <div id="sidebar">
+ <h:form id="login">
+ <fieldset>
+ <div>
+ <h:outputLabel for="username">Login Name</h:outputLabel>
+ <h:inputText id="username" value="#{identity.username}" style="width: 175px;"/>
+ <div class="errors"><h:message for="username"/></div>
+ </div>
+ <div>
+ <h:outputLabel for="password">Password</h:outputLabel>
+ <h:inputSecret id="password" value="#{identity.password}" style="width: 175px;"/>
+ </div>
+ <div class="errors"><h:messages globalOnly="true"/></div>
+ <div class="buttonBox"><h:commandButton id="login" action="#{identity.quietLogin}" value="Account Login"/></div>
+ <div class="notes"><s:link id="register" view="/register.xhtml" value="Register New User"/></div>
+ <div class="subnotes">
+ Or use a demo account:
+ <ul>
+ <li>gavin/foobar</li>
+ <li>demo/demo</li>
+ </ul>
+ </div>
+ </fieldset>
+ </h:form>
+ </div>
+ <div id="content">
+ </div>
+ </div>
+ <div id="footer">Created with JBoss EJB 3.0, Seam, JSF (Mojarra), and Facelets</div>
+</div>
+</f:view>
+</body>
+</html>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/hotel.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/hotel.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/hotel.xhtml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,65 @@
+<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"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ template="template.xhtml">
+
+<!-- content -->
+<ui:define name="content">
+<div class="section">
+ <h1>View Hotel</h1>
+</div>
+<div class="section">
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Name:</ui:define>
+ #{hotel.name}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Address:</ui:define>
+ #{hotel.address}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">City, State:</ui:define>
+ #{hotel.city}, #{hotel.state}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Zip:</ui:define>
+ #{hotel.zip}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Country:</ui:define>
+ #{hotel.country}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Nightly rate:</ui:define>
+ <h:outputText value="#{hotel.minPrice}">
+ <f:convertNumber type="currency"
+ currencySymbol="$"/>
+ </h:outputText>
+ -
+ <h:outputText value="#{hotel.maxPrice}">
+ <f:convertNumber type="currency"
+ currencySymbol="$"/>
+ </h:outputText>
+ </s:decorate>
+</div>
+<div class="section">
+ <h:form id="hotel">
+ <fieldset class="buttonBox">
+ <h:commandButton id="bookHotel" action="#{hotelBooking.bookHotel}" value="Book Hotel"/> 
+ <h:commandButton id="cancel" action="#{hotelBooking.cancel}" value="Back to Search"/>
+ </fieldset>
+ </h:form>
+</div>
+</ui:define>
+
+<!-- sidebar -->
+<ui:define name="sidebar"></ui:define>
+
+</ui:composition>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/bg.gif
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/bg.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/btn.bg.gif
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/btn.bg.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/cal-next.png
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/cal-next.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/cal-prev.png
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/cal-prev.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/cnt.bg.gif
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/cnt.bg.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/dtpick.gif
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/dtpick.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/hdr.ad.jpg
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/hdr.ad.jpg
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/hdr.bar.jpg
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/hdr.bar.jpg
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/hdr.bg.gif
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/hdr.bg.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/hdr.title.gif
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/hdr.title.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/header_line.gif
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/header_line.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/input.bg.gif
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/input.bg.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/sdb.bg.gif
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/sdb.bg.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/spinner.gif
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/spinner.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/th.bg.gif
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/img/th.bg.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/index.html
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/index.html (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/index.html 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,5 @@
+<html>
+<head>
+ <meta http-equiv="Refresh" content="0; URL=home.seam">
+</head>
+</html>
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/main.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/main.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/main.xhtml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,121 @@
+<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"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:a="http://richfaces.org/a4j"
+ template="template.xhtml">
+
+<!-- content -->
+<ui:define name="content">
+
+<div class="section">
+ <h:form id="main">
+
+ <span class="errors">
+ <h:messages id="messages" globalOnly="true"/>
+ </span>
+
+ <h1>Search Hotels</h1>
+ <fieldset>
+ <h:inputText id="searchString" value="#{hotelSearch.searchString}" style="width: 165px;">
+ <a:ajax event="keyup" listener="#{hotelSearch.find}" render="searchResults" />
+ </h:inputText>
+  
+ <a:commandButton id="findHotels" value="Find Hotels" actionListener="#{hotelSearch.find}" render="searchResults"/>
+  
+ <a:status>
+ <f:facet name="start">
+ <h:graphicImage id="SpinnerGif" value="/img/spinner.gif"/>
+ </f:facet>
+ </a:status>
+ <br/>
+ <h:outputLabel for="pageSize">Maximum results:</h:outputLabel> 
+ <h:selectOneMenu value="#{hotelSearch.pageSize}" id="pageSize">
+ <f:selectItem itemLabel="5" itemValue="5"/>
+ <f:selectItem itemLabel="10" itemValue="10"/>
+ <f:selectItem itemLabel="20" itemValue="20"/>
+ </h:selectOneMenu>
+ </fieldset>
+
+ </h:form>
+</div>
+
+<a:outputPanel id="searchResults">
+ <div class="section">
+ <h:outputText id="NoHotelsFoundMessage" value="No Hotels Found" rendered="#{hotels != null and hotels.rowCount==0}"/>
+ <h:dataTable id="hotels" value="#{hotels}" var="hot" rendered="#{hotels.rowCount>0}">
+ <h:column id="column1">
+ <f:facet id="NameFacet" name="header">Name</f:facet>
+ #{hot.name}
+ </h:column>
+ <h:column id="column2">
+ <f:facet id="AddressFacet" name="header">Address</f:facet>
+ #{hot.address}
+ </h:column>
+ <h:column id="column3">
+ <f:facet id="CityStateFacet" name="header">City, State</f:facet>
+ #{hot.city}, #{hot.state}, #{hot.country}
+ </h:column>
+ <h:column id="column4">
+ <f:facet id="ZipFacet" name="header">Zip</f:facet>
+ #{hot.zip}
+ </h:column>
+ <h:column id="column5">
+ <f:facet id="ActionFacet" name="header">Action</f:facet>
+ <s:link id="viewHotel" value="View Hotel" action="#{hotelBooking.selectHotel(hot)}"/>
+ </h:column>
+ </h:dataTable>
+ <s:link value="More results" action="#{hotelSearch.nextPage}" rendered="#{hotelSearch.nextPageAvailable}"/>
+ </div>
+</a:outputPanel>
+
+<div class="section">
+ <h1>Current Hotel Bookings</h1>
+</div>
+<div class="section">
+ <h:form id="bookings">
+ <h:outputText value="No Bookings Found" rendered="#{bookings.rowCount==0}"/>
+ <h:dataTable id="bookings" value="#{bookings}" var="book" rendered="#{bookings.rowCount>0}">
+ <h:column>
+ <f:facet name="header">Name</f:facet>
+ #{book.hotel.name}
+ </h:column>
+ <h:column>
+ <f:facet name="header">Address</f:facet>
+ #{book.hotel.address}<br/>
+ #{book.hotel.city}, #{book.hotel.state}
+ </h:column>
+ <h:column>
+ <f:facet name="header">Check in date<br/>Check out date</f:facet>
+ <h:outputText value="#{book.checkinDate}"/><br/>
+ <h:outputText value="#{book.checkoutDate}"/>
+ </h:column>
+ <h:column>
+ <f:facet name="header">Room Preference</f:facet>
+ #{book.roomPreference.name}
+ </h:column>
+ <h:column>
+ <f:facet name="header">Payment</f:facet>
+ <h:outputText value="#{book.total}">
+ <f:convertNumber type="currency" currencySymbol="$"/>
+ </h:outputText>
+ </h:column>
+ <h:column>
+ <f:facet name="header">Conf #</f:facet>
+ #{book.id}
+ </h:column>
+ <h:column>
+ <f:facet name="header">Action</f:facet>
+ <h:commandLink id="cancel" value="Cancel" action="#{bookingList.cancel}"/>
+ </h:column>
+ </h:dataTable>
+ </h:form>
+</div>
+
+</ui:define>
+
+<!-- sidebar -->
+<ui:define name="sidebar"></ui:define>
+
+</ui:composition>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/output.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/output.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/output.xhtml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,17 @@
+<!DOCTYPE composition 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"
+ xmlns:s="http://jboss.com/products/seam/taglib">
+
+ <div class="entry">
+ <div class="label">
+ <ui:insert name="label"/>
+ </div>
+ <div class="output">
+ <ui:insert/>
+ </div>
+ </div>
+
+</ui:composition>
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/password.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/password.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/password.xhtml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,48 @@
+<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"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ template="template.xhtml">
+
+<!-- content -->
+<ui:define name="content">
+<div class="section">
+ <h1>Change Your Password</h1>
+</div>
+<div class="section">
+ <h:form id="setpassword">
+ <fieldset>
+
+ <s:decorate id="PasswordDecorate" template="edit.xhtml">
+ <ui:define name="label">Password</ui:define>
+ <h:inputSecret id="password" value="#{user.password}" required="true" />
+ </s:decorate>
+
+ <s:decorate id="VerifyDecorate" template="edit.xhtml">
+ <ui:define name="label">Verify:</ui:define>
+ <h:inputSecret id="verify" value="#{changePassword.verify}" required="true"/>
+ </s:decorate>
+
+ <div class="entry errors">
+ <h:messages id="messages" globalOnly="true"/>
+ </div>
+
+ <div class="entry">
+ <div class="label"> </div>
+ <div class="input">
+ <h:commandButton id="change" value="Change" action="#{changePassword.changePassword}"/> 
+ <s:button id="cancel" value="Cancel" view="/main.xhtml"/>
+ </div>
+ </div>
+
+ </fieldset>
+
+ </h:form>
+</div>
+</ui:define>
+
+<!-- sidebar -->
+<ui:define name="sidebar"></ui:define>
+
+</ui:composition>
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/payment.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/payment.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/payment.xhtml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,138 @@
+<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"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:a="http://richfaces.org/a4j"
+ template="template.xhtml">
+
+<!-- content -->
+<ui:define name="content">
+
+<div class="section">
+ <h1>Payment</h1>
+</div>
+
+<div class="section">
+ <h:form id="payment">
+ <fieldset>
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Name:</ui:define>
+ #{hotel.name}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Address:</ui:define>
+ #{hotel.address}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">City, State:</ui:define>
+ #{hotel.city}, #{hotel.state}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Zip:</ui:define>
+ #{hotel.zip}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Country:</ui:define>
+ #{hotel.country}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Room Preference:</ui:define>
+ #{roomSelection.name}
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Total payment:</ui:define>
+ <h:outputText value="#{roomPreference.expectedPrice}">
+ <f:convertNumber type="currency"
+ currencySymbol="$"/>
+ </h:outputText>
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Check In Date:</ui:define>
+ <h:outputText value="#{booking.checkinDate}"/>
+ </s:decorate>
+
+ <s:decorate template="output.xhtml">
+ <ui:define name="label">Check Out Date:</ui:define>
+ <h:outputText value="#{booking.checkoutDate}"/>
+ </s:decorate>
+
+ <s:decorate template="edit.xhtml" id="creditCardDecorate">
+ <ui:define name="label">Credit Card #:</ui:define>
+ <h:inputText id="creditCard" value="#{booking.creditCard}" required="true">
+ <a:ajax event="blur" render="creditCardDecorate"/>
+ </h:inputText>
+ </s:decorate>
+
+ <s:decorate template="edit.xhtml" id="creditCardNameDecorate">
+ <ui:define name="label">Credit Card Name:</ui:define>
+ <h:inputText id="creditCardName" value="#{booking.creditCardName}" required="true">
+ <a:ajax event="blur" render="creditCardNameDecorate"/>
+ </h:inputText>
+ </s:decorate>
+
+ <s:decorate template="edit.xhtml">
+ <ui:define name="label">Credit Card Expiry:</ui:define>
+ <h:selectOneMenu id="creditCardExpiryMonth" value="#{booking.creditCardExpiryMonth}">
+ <f:selectItem itemLabel="Jan" itemValue="1"/>
+ <f:selectItem itemLabel="Feb" itemValue="2"/>
+ <f:selectItem itemLabel="Mar" itemValue="3"/>
+ <f:selectItem itemLabel="Apr" itemValue="4"/>
+ <f:selectItem itemLabel="May" itemValue="5"/>
+ <f:selectItem itemLabel="Jun" itemValue="6"/>
+ <f:selectItem itemLabel="Jul" itemValue="7"/>
+ <f:selectItem itemLabel="Aug" itemValue="8"/>
+ <f:selectItem itemLabel="Sep" itemValue="9"/>
+ <f:selectItem itemLabel="Oct" itemValue="10"/>
+ <f:selectItem itemLabel="Nov" itemValue="11"/>
+ <f:selectItem itemLabel="Dec" itemValue="12"/>
+ </h:selectOneMenu>
+ <h:selectOneMenu id="creditCardExpiryYear" value="#{booking.creditCardExpiryYear}">
+ <f:selectItem itemLabel="2005" itemValue="2005"/>
+ <f:selectItem itemLabel="2006" itemValue="2006"/>
+ <f:selectItem itemLabel="2007" itemValue="2007"/>
+ <f:selectItem itemLabel="2008" itemValue="2008"/>
+ <f:selectItem itemLabel="2009" itemValue="2009"/>
+ </h:selectOneMenu>
+ </s:decorate>
+
+ </fieldset>
+
+ <div class="entry errors">
+ <h:messages globalOnly="true"/>
+ </div>
+
+ <div class="entry">
+ <div class="label"> </div>
+ <div class="input">
+ <h:commandButton id="proceed" value="Proceed" action="#{roomPreference.requestConfirmation}"/> 
+ <s:button id="cancel" value="Revise Room" action="#{roomPreference.cancel}"/>
+ </div>
+ </div>
+ </h:form>
+</div>
+
+</ui:define>
+
+<!-- sidebar -->
+<ui:define name="sidebar">
+
+<h1>Nesting conversations</h1>
+
+<p>Nested conversations allow the application to capture a consistent continuable state at various points in a user interaction, thus insuring truly correct behavior in the face of backbuttoning and workspace management.</p>
+
+<p><b>Continuing the conversation</b></p>
+
+<p>Try going back and selecting a different room. You will notice a new nested conversation in the list of workspace entries. Each nested conversation is associated with the specific room selected ensuring consistent behavior.</p>
+
+
+</ui:define>
+
+</ui:composition>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/register.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/register.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/register.xhtml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html 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"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:a="http://richfaces.org/a4j">
+<h:head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <title>JBoss Suites: Seam Framework</title>
+ <link href="css/screen.css" rel="stylesheet" type="text/css" />
+</h:head>
+<body id="pgHome">
+<div id="document">
+ <div id="header">
+ <div id="title"><img src="img/hdr.title.gif" alt="JBoss Suites: seam framework demo"/></div>
+ </div>
+ <div id="container">
+ <div id="sidebar"></div>
+ <div id="content">
+ <div class="section">
+ <h1>Register</h1>
+ </div>
+ <div class="section">
+
+ <h:form id="register">
+ <fieldset>
+
+ <s:decorate template="edit.xhtml" id="usernameDecorate">
+ <ui:define name="label">Username:</ui:define>
+ <h:inputText id="username" value="#{user.username}" required="true">
+ <a:ajax event="blur" reRender="usernameDecorate"/>
+ </h:inputText>
+ </s:decorate>
+
+ <s:decorate template="edit.xhtml" id="nameDecorate">
+ <ui:define name="label">Real Name:</ui:define>
+ <h:inputText id="name" value="#{user.name}" required="true">
+ <a:ajax event="blur" reRender="nameDecorate"/>
+ </h:inputText>
+ </s:decorate>
+
+ <s:decorate id="passwordDecorate" template="edit.xhtml">
+ <ui:define name="label">Password:</ui:define>
+ <h:inputSecret id="password" value="#{user.password}" required="true"/>
+ </s:decorate>
+
+ <s:decorate id="verifyDecorate" template="edit.xhtml">
+ <ui:define name="label">Verify Password:</ui:define>
+ <h:inputSecret id="verify" value="#{register.verify}" required="true"/>
+ </s:decorate>
+
+ <div class="entry errors">
+ <h:messages id="messages" globalOnly="true"/>
+ </div>
+
+ <div class="entry">
+ <div class="label"> </div>
+ <div class="input">
+ <h:commandButton id="register" value="Register" action="#{register.register}"/> 
+ <s:button id="cancel" value="Cancel" view="/home.xhtml"/>
+ </div>
+ </div>
+
+ </fieldset>
+ </h:form>
+
+ </div>
+ </div>
+ </div>
+ <div id="footer">Created with JBoss EJB 3.0, Seam, JSF (Mojarra), and Facelets</div>
+</div>
+</body>
+</html>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/rooms.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/rooms.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/rooms.xhtml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,71 @@
+<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"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:a="https://ajax4jsf.dev.java.net/ajax"
+ template="template.xhtml">
+
+<!-- content -->
+<ui:define name="content">
+
+<div class="section">
+ <h1>Room Preference</h1>
+</div>
+
+<div class="section">
+ <h:form id="room_selections_form">
+ <div class="section">
+ <h:outputText styleClass="output" value="No rooms available for the dates selected: " rendered="#{availableRooms != null and availableRooms.rowCount == 0}"/>
+ <h:outputText styleClass="output" value="Rooms available for the dates selected: " rendered="#{availableRooms != null and availableRooms.rowCount > 0}"/>
+ <h:outputText styleClass="output" value="#{booking.checkinDate}"/> -
+ <h:outputText styleClass="output" value="#{booking.checkoutDate}"/>
+
+ <br/><br/>
+
+ <h:dataTable id="rooms" value="#{availableRooms}" var="room" rendered="#{availableRooms.rowCount > 0}">
+ <h:column>
+ <f:facet name="header">Name</f:facet>
+ #{room.name}
+ </h:column>
+ <h:column>
+ <f:facet name="header">Description</f:facet>
+ #{room.description}
+ </h:column>
+ <h:column>
+ <f:facet name="header">Per Night</f:facet>
+ <h:outputText value="#{room.price}">
+ <f:convertNumber type="currency" currencySymbol="$"/>
+ </h:outputText>
+ </h:column>
+ <h:column>
+ <f:facet name="header">Action</f:facet>
+ <h:commandLink id="selectRoomPreference" action="#{roomPreference.selectPreference}">Select</h:commandLink>
+ </h:column>
+ </h:dataTable>
+ </div>
+ <div class="entry">
+ <div class="label"> </div>
+ <div class="input">
+ <s:button id="cancel" value="Revise Dates" view="/book.xhtml"/>
+ </div>
+ </div>
+ </h:form>
+</div>
+
+</ui:define>
+
+<!-- sidebar -->
+<ui:define name="sidebar">
+
+<h1>Nesting conversations</h1>
+<p>Nested conversations allow the application to capture a consistent continuable state at various points in a user interaction, thus insuring truly correct behavior in the face of backbuttoning and workspace management.</p>
+
+<p><b>How Seam manages continuable state</b></p>
+
+<p>Seam provides a container for context state for each nested conversation. Any contextual variable in the outer conversations context will not be overwritten by a new value, the value will simply be stored in the new context container. This allows each nested conversation to maintain its own unique state.</p>
+
+
+</ui:define>
+
+</ui:composition>
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/template.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/template.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/nestedbooking-web/src/main/webapp/template.xhtml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:s="http://jboss.com/products/seam/taglib">
+<h:head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <title>JBoss Suites: Seam Framework</title>
+ <link href="css/screen.css" rel="stylesheet" type="text/css" />
+ <link href="css/date.css" rel="stylesheet" type="text/css" />
+</h:head>
+<body>
+
+<div id="document">
+ <div id="header">
+ <div id="title"><img src="img/hdr.title.gif" alt="JBoss Suites: seam framework demo"/></div>
+ <div id="status">
+ Welcome #{user.name}
+ | <s:link id="search" view="/main.xhtml" value="Search" propagation="none"/>
+ | <s:link id="settings" view="/password.xhtml" value="Settings" propagation="none"/>
+ | <s:link id="logout" action="#{identity.logout}" value="Logout"/>
+ </div>
+ </div>
+ <div id="container">
+ <div id="sidebar">
+ <ui:insert name="sidebar"/>
+ </div>
+ <div id="content">
+ <ui:insert name="content"/>
+ <ui:include src="conversations.xhtml" />
+ </div>
+ </div>
+ <div id="footer">Created with JBoss EJB 3.0, Seam, JSF (Mojarra), and Facelets</div>
+</div>
+</body>
+</html>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/pom.xml 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,46 @@
+<?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>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <artifactId>nestedbooking</artifactId>
+ <parent>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>examples-ee6</artifactId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ </parent>
+ <packaging>pom</packaging>
+ <name>Nested Booking Example (EE6)</name>
+
+ <properties>
+ <example.name>nestedbooking</example.name>
+ </properties>
+
+ <modules>
+ <module>nestedbooking-ear</module>
+ <module>nestedbooking-ejb</module>
+ <module>nestedbooking-web</module>
+ <module>nestedbooking-tests</module>
+ </modules>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.nestedbooking</groupId>
+ <artifactId>nestedbooking-ejb</artifactId>
+ <version>${project.version}</version>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.nestedbooking</groupId>
+ <artifactId>nestedbooking-web</artifactId>
+ <version>${project.version}</version>
+ <type>war</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.nestedbooking</groupId>
+ <artifactId>nestedbooking-ear</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+</project>
Added: branches/community/Seam_2_3/examples-ee6/nestedbooking/readme.txt
===================================================================
--- branches/community/Seam_2_3/examples-ee6/nestedbooking/readme.txt (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/nestedbooking/readme.txt 2012-04-02 10:27:17 UTC (rev 14462)
@@ -0,0 +1,20 @@
+Seam NestedBooking Example
+==========================
+
+This example demonstrates the use of Seam nested conversations and runs
+on JBoss AS as an EAR.
+
+To deploy the example to JBoss AS, follow these steps:
+
+* In the example root directory run:
+
+ mvn clean package
+
+* Set JBOSS_HOME environment property.
+
+* In the nestedbooking-ear directory run:
+
+ mvn jboss:hard-deploy
+
+* Open this URL in a web browser: http://localhost:8080/seam-nestedbooking
+
12 years, 1 month
Seam SVN: r14461 - branches/community/Seam_2_3/examples-ee6.
by seam-commits@lists.jboss.org
Author: maschmid
Date: 2012-04-02 06:19:26 -0400 (Mon, 02 Apr 2012)
New Revision: 14461
Modified:
branches/community/Seam_2_3/examples-ee6/pom.xml
Log:
enable seampay
Modified: branches/community/Seam_2_3/examples-ee6/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/pom.xml 2012-04-02 10:17:17 UTC (rev 14460)
+++ branches/community/Seam_2_3/examples-ee6/pom.xml 2012-04-02 10:19:26 UTC (rev 14461)
@@ -27,6 +27,7 @@
<module>remoting/gwt</module>
<module>remoting/helloworld</module>
<module>remoting/progressbar</module>
+ <module>seampay</module>
<module>seamspace</module>
<module>todo</module>
<module>ui</module>
12 years, 1 month
Seam SVN: r14460 - in branches/community/Seam_2_3/examples-ee6: seampay and 36 other directories.
by seam-commits@lists.jboss.org
Author: maschmid
Date: 2012-04-02 06:17:17 -0400 (Mon, 02 Apr 2012)
New Revision: 14460
Added:
branches/community/Seam_2_3/examples-ee6/seampay/
branches/community/Seam_2_3/examples-ee6/seampay/pom.xml
branches/community/Seam_2_3/examples-ee6/seampay/readme.txt
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ear/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ear/pom.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ear/src/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ear/src/main/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ear/src/main/application/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ear/src/main/application/META-INF/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ear/src/main/application/META-INF/jboss-deployment-structure.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/pom.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/Account.java
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/Payment.java
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/PaymentHome.java
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/PaymentProcessor.java
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/package-info.java
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/META-INF/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/META-INF/ejb-jar.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/META-INF/persistence.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/import.sql
branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/seam.properties
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/pom.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/org/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/org/jboss/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/org/jboss/seam/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/org/jboss/seam/example/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/org/jboss/seam/example/seampay/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/org/jboss/seam/example/seampay/test/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/org/jboss/seam/example/seampay/test/AccountTest.java
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/org/jboss/seam/example/seampay/test/PaymentProcessorTest.java
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources-ftest/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources-ftest/testng.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources-integration/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources-integration/testng.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/WEB-INF/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/WEB-INF/components.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/seam.properties
branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/seampay.properties
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/pom.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/components.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/faces-config.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/pages.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/web.xml
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/date.css
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/img/
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/img/cal-next.png
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/img/cal-prev.png
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/img/dtpick.gif
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/index.html
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/screen.css
branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/search.xhtml
Log:
add seampay example to the ee6 examples
Added: branches/community/Seam_2_3/examples-ee6/seampay/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/pom.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,46 @@
+<?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>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <artifactId>seampay</artifactId>
+ <parent>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>examples-ee6</artifactId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ </parent>
+ <packaging>pom</packaging>
+ <name>Seampay Example (EE6)</name>
+
+ <properties>
+ <example.name>seampay</example.name>
+ </properties>
+
+ <modules>
+ <module>seampay-ear</module>
+ <module>seampay-ejb</module>
+ <module>seampay-web</module>
+ <module>seampay-tests</module>
+ </modules>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.seampay</groupId>
+ <artifactId>seampay-ejb</artifactId>
+ <version>${project.version}</version>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.seampay</groupId>
+ <artifactId>seampay-web</artifactId>
+ <version>${project.version}</version>
+ <type>war</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.seampay</groupId>
+ <artifactId>seampay-ear</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+</project>
Added: branches/community/Seam_2_3/examples-ee6/seampay/readme.txt
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/readme.txt (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/readme.txt 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,29 @@
+Seam Seampay Example
+====================
+
+This example shows Seam's EJB3 timer support. It runs on JBoss AS as an EAR
+and Tomcat with Embedded JBoss as a WAR.
+
+To deploy the example to JBoss AS, follow these steps:
+
+* In the example root directory, run:
+
+ mvn clean package
+
+* Set JBOSS_HOME environment property.
+
+* In the seampay-ear directory, run:
+
+ mvn jboss:hard-deploy
+
+* Open this URL in a web browser: http://localhost:8080/seam-seampay
+
+To deploy the example to Tomcat with Embedded JBoss, follow these steps:
+
+* In the example root directory, run:
+
+ mvn clean package -Ptomcat
+
+* Deploy the resulting war from seampay-web/target directory to Tomcat manually.
+
+* Open this URL in a web browser: http://localhost:8080/jboss-seam-seampay
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-ear/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-ear/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-ear/pom.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,131 @@
+<?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>seampay</artifactId>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.seampay</groupId>
+ <artifactId>seampay-ear</artifactId>
+ <packaging>ear</packaging>
+ <name>Seampay EAR Module (EE6)</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.seampay</groupId>
+ <artifactId>seampay-web</artifactId>
+ <type>war</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.seampay</groupId>
+ <artifactId>seampay-ejb</artifactId>
+ <type>ejb</type>
+ </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>commons-digester</groupId>
+ <artifactId>commons-digester</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <finalName>seam-seampay</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.seampay</groupId>
+ <artifactId>seampay-web</artifactId>
+ <contextRoot>/seam-seampay</contextRoot>
+ <bundleFileName>seampay-web.war</bundleFileName>
+ </webModule>
+ <ejbModule>
+ <groupId>org.jboss.seam.examples-ee6.seampay</groupId>
+ <artifactId>seampay-ejb</artifactId>
+ <bundleFileName>seampay-ejb.jar</bundleFileName>
+ </ejbModule>
+ </modules>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>exploded</id>
+ <properties>
+ <example.name>seampay</example.name>
+ </properties>
+ <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.seampay</groupId>
+ <artifactId>seampay-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.seampay</groupId>
+ <artifactId>seampay-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.seampay</groupId>
+ <artifactId>seampay-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>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+</project>
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-ear/src/main/application/META-INF/jboss-deployment-structure.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-ear/src/main/application/META-INF/jboss-deployment-structure.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-ear/src/main/application/META-INF/jboss-deployment-structure.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,9 @@
+<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
+ <deployment>
+ <dependencies>
+ <module name="org.dom4j" export="true"/>
+ <module name="javax.faces.api" export="true"/>
+ <module name="com.sun.jsf-impl" export="true"/>
+ </dependencies>
+ </deployment>
+</jboss-deployment-structure>
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/pom.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,54 @@
+<?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>seampay</artifactId>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.seampay</groupId>
+ <artifactId>seampay-ejb</artifactId>
+ <packaging>ejb</packaging>
+ <name>Seampay EJB Module (EE6)</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-validator</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-entitymanager</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.ejb</groupId>
+ <artifactId>ejb-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.faces</groupId>
+ <artifactId>jsf-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+
+</project>
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/Account.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/Account.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/Account.java 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,79 @@
+package org.jboss.seam.example.seampay;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import javax.validation.constraints.NotNull;
+
+@Entity
+public class Account
+ implements Serializable
+{
+ private static final long serialVersionUID = -2246235767373372214L;
+
+ @Id @GeneratedValue
+ private Long id;
+
+ @NotNull
+ BigDecimal balance = BigDecimal.ZERO;
+
+ @NotNull
+ String accountNumber;
+ //String login;
+ //String password;
+
+ @OneToMany(mappedBy="account", cascade=CascadeType.REMOVE)
+ //@OrderBy("paymentDate")
+ private List<Payment> payments;
+
+ public Long getId()
+ {
+ return id;
+ }
+ public void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ public String getAccountNumber()
+ {
+ return accountNumber;
+ }
+ public void setAccountNumber(String accountNumber)
+ {
+ this.accountNumber = accountNumber;
+ }
+
+
+ public BigDecimal getBalance()
+ {
+ return balance;
+ }
+
+ public BigDecimal adjustBalance(BigDecimal amount) {
+ balance = balance.add(amount);
+ return balance;
+ }
+
+ public List<Payment> getPayments()
+ {
+ return payments;
+ }
+
+ public void addPayment(Payment payment) {
+ if (payments == null) {
+ payments = new ArrayList<Payment>();
+ }
+
+ payments.add(payment);
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/Payment.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/Payment.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/Payment.java 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,140 @@
+package org.jboss.seam.example.seampay;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import javax.ejb.TimerHandle;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.ManyToOne;
+
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Digits;
+
+@Entity
+public class Payment
+ implements Serializable
+{
+ private static final long serialVersionUID = 3467815268074102080L;
+
+ @Id @GeneratedValue
+ private Long id;
+
+ @NotNull
+ @Digits(integer=8, fraction=2)
+ private BigDecimal amount;
+
+ @NotNull @Size(min=1)
+ private String payee;
+
+ @NotNull @ManyToOne
+ private Account account;
+
+ @NotNull
+ private Date paymentDate;
+ @NotNull
+ private Date createdDate;
+ private Date lastPaid;
+
+ private boolean active = true;
+
+ private Frequency paymentFrequency = Frequency.DAILY;
+
+ @Lob
+ private TimerHandle timerHandle;
+
+ public Long getId() {
+ return id;
+ }
+
+ public BigDecimal getAmount() {
+ return amount;
+ }
+ public void setAmount(BigDecimal amount) {
+ this.amount = amount;
+ }
+
+ public String getPayee()
+ {
+ return payee;
+ }
+
+ public void setPayee(String payee) {
+ this.payee = payee;
+ }
+
+ public Account getAccount() {
+ return account;
+ }
+
+ public void setAccount(Account account) {
+ this.account = account;
+ account.addPayment(this);
+ }
+
+ public Date getPaymentDate() {
+ return paymentDate;
+ }
+ public void setPaymentDate(Date paymentDate) {
+ this.paymentDate = paymentDate;
+ }
+
+ public Date getCreatedDate() {
+ return createdDate;
+ }
+ public void setCreatedDate(Date createdDate) {
+ this.createdDate = createdDate;
+ }
+
+
+ public Date getLastPaid() {
+ return lastPaid;
+ }
+ public void setLastPaid(Date lastPaid) {
+ this.lastPaid = lastPaid;
+ }
+
+ public boolean getActive() {
+ return active;
+ }
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+ public Frequency getPaymentFrequency() {
+ return paymentFrequency;
+ }
+ public void setPaymentFrequency(Frequency paymentFrequency) {
+ this.paymentFrequency = paymentFrequency;
+ }
+
+ public TimerHandle getTimerHandle() {
+ return timerHandle;
+ }
+ public void setTimerHandle(TimerHandle timerHandle) {
+ this.timerHandle = timerHandle;
+ }
+
+
+ public enum Frequency {
+ ONCE(null),
+ EVERY_MINUTE(60*1000l),
+ HOURLY(60*60*1000l),
+ DAILY(24*60*60*1000l),
+ WEEKLY(7*24*60*60*1000l);
+
+ Long interval;
+
+ Frequency(Long interval) {
+ this.interval = interval;
+ }
+
+ public Long getInterval() {
+ return interval;
+ }
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/PaymentHome.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/PaymentHome.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/PaymentHome.java 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,65 @@
+package org.jboss.seam.example.seampay;
+
+import javax.ejb.NoSuchObjectLocalException;
+import javax.ejb.Timer;
+import javax.ejb.TimerHandle;
+
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Logger;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.web.RequestParameter;
+import org.jboss.seam.annotations.Transactional;
+import org.jboss.seam.faces.FacesMessages;
+import org.jboss.seam.framework.EntityHome;
+import org.jboss.seam.log.Log;
+
+@Name("paymentHome")
+public class PaymentHome
+ extends EntityHome<Payment>
+{
+ private static final long serialVersionUID = -1994187524284737182L;
+
+ @RequestParameter Long paymentId;
+ @In PaymentProcessor processor;
+
+ @Logger Log log;
+
+ public String saveAndSchedule()
+ {
+ String result = persist();
+
+ Payment payment = getInstance();
+ log.info("scheduling instance #0", payment);
+
+ Timer timer = processor.schedulePayment(payment.getPaymentDate(),
+ payment.getPaymentFrequency().getInterval(),
+ payment);
+ if (timer != null) {
+ payment.setTimerHandle(timer.getHandle());
+ }
+ return result;
+ }
+
+ @Override
+ public Object getId() {
+ return paymentId;
+ }
+
+ @Transactional
+ public void cancel() {
+ Payment payment = getInstance();
+
+ TimerHandle handle = payment.getTimerHandle();
+ payment.setTimerHandle(null);
+ payment.setActive(false);
+
+ if (handle != null) {
+ try {
+ handle.getTimer().cancel();
+ } catch (NoSuchObjectLocalException e) {
+ FacesMessages.instance().add("Payment already processed");
+ }
+ }
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/PaymentProcessor.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/PaymentProcessor.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/PaymentProcessor.java 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,53 @@
+package org.jboss.seam.example.seampay;
+
+import java.util.Date;
+
+import javax.ejb.Timer;
+import javax.persistence.EntityManager;
+
+import org.jboss.seam.annotations.async.Asynchronous;
+import org.jboss.seam.annotations.AutoCreate;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Logger;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Transactional;
+import org.jboss.seam.annotations.async.Expiration;
+import org.jboss.seam.annotations.async.IntervalDuration;
+import org.jboss.seam.example.seampay.Payment;
+import org.jboss.seam.log.Log;
+
+@Name("processor")
+@AutoCreate
+public class PaymentProcessor {
+
+ @In
+ EntityManager entityManager;
+
+ @Logger Log log;
+
+ @Asynchronous
+ @Transactional
+ public Timer schedulePayment(@Expiration Date when,
+ @IntervalDuration Long interval,
+ Payment payment)
+ {
+ payment = entityManager.merge(payment);
+
+ log.info("[#0] Processing payment #1", System.currentTimeMillis(), payment.getId());
+ processPayment(payment);
+
+ return null;
+ }
+
+ public void processPayment(Payment payment) {
+ if (payment.getActive()) {
+ payment.getAccount().adjustBalance(payment.getAmount().negate());
+
+ payment.setLastPaid(new Date());
+
+ if (payment.getPaymentFrequency().equals(Payment.Frequency.ONCE)) {
+ payment.setActive(false);
+ }
+ }
+ }
+}
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/package-info.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/package-info.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/java/org/jboss/seam/example/seampay/package-info.java 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,4 @@
+@Namespace(value="http://jboss.com/products/seam/examples/seampay")
+package org.jboss.seam.example.seampay;
+
+import org.jboss.seam.annotations.*;
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/META-INF/ejb-jar.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/META-INF/ejb-jar.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/META-INF/ejb-jar.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -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/seampay/seampay-ejb/src/main/resources/META-INF/persistence.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/META-INF/persistence.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/META-INF/persistence.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,16 @@
+<?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="userDatabase">
+ <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"/>
+ <property name="hibernate.show_sql" value="true"/>
+ <property name="jboss.entity.manager.factory.jndi.name"
+ value="java:/seampayEntityManagerFactory"/>
+ </properties>
+ </persistence-unit>
+</persistence>
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/import.sql
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/import.sql (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/import.sql 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,6 @@
+insert into Account(id, accountNumber, balance) values (1, '23001', 1001.46)
+insert into Account(id, accountNumber, balance) values (2, '23002', 1002.46)
+insert into Account(id, accountNumber, balance) values (3, '23003', 1003.46)
+insert into Account(id, accountNumber, balance) values (4, '23004', 1004.46)
+insert into Account(id, accountNumber, balance) values (5, '23005', 1005.46)
+
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-ejb/src/main/resources/seam.properties
===================================================================
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/pom.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,136 @@
+<?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>seampay</artifactId>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.seampay</groupId>
+ <artifactId>seampay-tests</artifactId>
+ <name>Seampay Integration Tests Module (EE6)</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.testng</groupId>
+ <artifactId>testng</artifactId>
+ <classifier>jdk15</classifier>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.seampay</groupId>
+ <artifactId>seampay-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>com.sun.faces</groupId>
+ <artifactId>jsf-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+ <scope>provided</scope>
+ </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> <!-- this takes datasource seampay-ds.xml -->
+ <directory>${basedir}/../seampay-ear/src/main/resources</directory>
+ <filtering>true</filtering>
+ </testResource>
+ <testResource> <!-- this takes themes aka *.properties -->
+ <directory>${basedir}/../seampay-web/src/main/resources</directory>
+ <filtering>true</filtering>
+ </testResource>
+ </testResources>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>ftest-jbossas</id>
+ <properties>
+ <example.context.path>seam-seampay</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>
+ <profile>
+ <id>ftest-tomcat</id>
+ <properties>
+ <example.context.path>jboss-seam-seampay</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/seampay/seampay-tests/src/test/java/org/jboss/seam/example/seampay/test/AccountTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/org/jboss/seam/example/seampay/test/AccountTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/org/jboss/seam/example/seampay/test/AccountTest.java 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,120 @@
+package org.jboss.seam.example.seampay.test;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import org.jboss.seam.example.seampay.Account;
+import org.jboss.seam.example.seampay.Payment;
+import org.jboss.seam.example.seampay.Payment.Frequency;
+import org.jboss.seam.mock.SeamTest;
+import org.testng.annotations.Test;
+
+/**
+ * embedded ejb3 doesn't support timer service, so we are fairly limited on what we can test.
+ */
+public class AccountTest
+ extends SeamTest
+{
+ @Test
+ public void listAccounts() throws Exception {
+ String id = new FacesRequest("/search.xhtml") {
+
+ @Override
+ @SuppressWarnings("unchecked")
+ protected void renderResponse() throws Exception {
+ List<Account> accounts = (List<Account>) getValue("#{accounts.resultList}");
+
+ assert accounts.size() == 5;
+ // check ASC?
+ }
+ }.run();
+ }
+
+ @Test
+ public void selectAccount() throws Exception {
+ String id = new FacesRequest("/search.xhtml") {
+ @Override
+ @SuppressWarnings("unchecked")
+ protected void renderResponse() throws Exception {
+ assert !((Boolean)getValue("#{accountHome.idDefined}"));
+ }
+ }.run();
+
+ new FacesRequest("/search.xhtml", id) {
+ @Override
+ protected void beforeRequest() {
+ setParameter("accountId", "1");
+ }
+
+ @Override
+ protected void renderResponse() throws Exception {
+ assert ((Boolean)getValue("#{accountHome.idDefined}"));
+
+ Account account = (Account) getValue("#{selectedAccount}");
+ assert account !=null;
+ assert account.getId() == 1;
+ assert account.getPayments().size() == 0;
+
+ Payment payment = (Payment) getValue("#{newPayment}");
+ assert payment.getPayee().equals("Somebody");
+ assert payment.getAccount() != null;
+ assert payment.getAccount().getId() == 1;
+
+ }
+ }.run();
+
+
+ new FacesRequest("/search.xhtml", id) {
+ @Override
+ protected void beforeRequest() {
+ setParameter("accountId", "1");
+ }
+
+ @Override
+ protected void applyRequestValues() throws Exception {
+ setValue("#{newPayment.payee}", "IRS");
+ setValue("#{newPayment.amount}", new BigDecimal("100.00"));
+ setValue("#{newPayment.paymentFrequency}", Frequency.ONCE);
+ }
+
+ @Override
+ protected void invokeApplication() throws Exception {
+ invokeMethod("#{paymentHome.saveAndSchedule}");
+ }
+
+ @Override
+ protected void renderResponse() throws Exception {
+ assert ((Boolean)getValue("#{accountHome.idDefined}"));
+ Account account = (Account) getValue("#{selectedAccount}");
+ assert account !=null;
+ assert account.getId() == 1;
+ assert account.getPayments().size() == 1;
+
+ Payment payment = (Payment) getValue("#{newPayment}");
+ assert payment.getPayee().equals("IRS");
+ assert payment.getAmount().equals(new BigDecimal("100.00"));
+ assert payment.getAccount() != null;
+ assert payment.getAccount().getId() == 1;
+ }
+ }.run();
+
+
+ // test that the payment is around
+ new FacesRequest("/search.xhtml") {
+ @Override
+ protected void beforeRequest() {
+ setParameter("accountId", "1");
+ }
+
+ @Override
+ protected void renderResponse() throws Exception {
+ assert ((Boolean)getValue("#{accountHome.idDefined}"));
+ Account account = (Account) getValue("#{selectedAccount}");
+ assert account !=null;
+ assert account.getId() == 1;
+ assert account.getPayments().size() == 1;
+ }
+ }.run();
+ }
+
+}
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/org/jboss/seam/example/seampay/test/PaymentProcessorTest.java
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/org/jboss/seam/example/seampay/test/PaymentProcessorTest.java (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/java/org/jboss/seam/example/seampay/test/PaymentProcessorTest.java 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,97 @@
+package org.jboss.seam.example.seampay.test;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import org.jboss.seam.example.seampay.Account;
+import org.jboss.seam.example.seampay.Payment;
+import org.jboss.seam.example.seampay.PaymentProcessor;
+import org.jboss.seam.example.seampay.Payment.Frequency;
+import org.jboss.seam.mock.SeamTest;
+import org.testng.annotations.Test;
+
+public class PaymentProcessorTest
+ extends SeamTest
+{
+ static final String ACCOUNT_NUMBER = "X12345";
+ static final BigDecimal INITIAL_BALANCE = new BigDecimal("1000");
+
+ @Test
+ public void testInactive() {
+ PaymentProcessor processor = new PaymentProcessor();
+
+ Payment payment = createTestPayment(new BigDecimal("100"), Frequency.ONCE);
+ payment.setActive(false);
+
+ assert payment.getAccount().getBalance().equals(INITIAL_BALANCE);
+
+ processor.processPayment(payment);
+
+ assert payment.getAccount().getBalance().equals(INITIAL_BALANCE);
+ assert payment.getLastPaid() == null;
+ }
+
+ @Test
+ public void testPayOnce() {
+ PaymentProcessor processor = new PaymentProcessor();
+
+ Payment payment = createTestPayment(new BigDecimal("100"), Frequency.ONCE);
+
+ assert payment.getAccount().getBalance().equals(INITIAL_BALANCE);
+
+ processor.processPayment(payment);
+
+ assert payment.getAccount().getBalance().equals(new BigDecimal("900"));
+ assert !payment.getActive();
+ assert payment.getLastPaid() != null;
+ }
+
+ @Test
+ public void testPayMultiple() {
+ PaymentProcessor processor = new PaymentProcessor();
+
+ Payment payment = createTestPayment(new BigDecimal("100"), Frequency.WEEKLY);
+
+ assert payment.getAccount().getBalance().equals(INITIAL_BALANCE);
+
+ processor.processPayment(payment);
+
+ assert payment.getAccount().getBalance().equals(new BigDecimal("900"));
+ assert payment.getActive();
+ assert payment.getLastPaid() != null;
+
+ Date firstPayment = payment.getLastPaid();
+
+ pause(); // just need to make sure we are some small time in the future
+
+ processor.processPayment(payment);
+
+ assert payment.getAccount().getBalance().equals(new BigDecimal("800"));
+ assert payment.getActive();
+ assert payment.getLastPaid().after(firstPayment);
+ }
+
+
+ private void pause() {
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+
+ }
+ }
+
+ protected Payment createTestPayment(BigDecimal amount, Frequency frequency) {
+ Account account = new Account();
+ account.setAccountNumber(ACCOUNT_NUMBER);
+ setField(account, "balance", INITIAL_BALANCE);
+
+ Payment payment = new Payment();
+ payment.setAccount(account);
+ payment.setAmount(amount);
+ payment.setPaymentFrequency(frequency);
+
+ return payment;
+ }
+
+
+}
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/WEB-INF/components.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/WEB-INF/components.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/WEB-INF/components.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,46 @@
+<components xmlns:pay="http://jboss.com/products/seam/examples/seampay"
+ xmlns:core="http://jboss.com/products/seam/core"
+ xmlns:persistence="http://jboss.com/products/seam/persistence"
+ xmlns:framework="http://jboss.com/products/seam/framework"
+ xmlns:async="http://jboss.com/products/seam/async"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation=
+ "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.3.xsd
+ http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.3.xsd
+ http://jboss.com/products/seam/async http://jboss.com/products/seam/async-2.3.xsd
+ http://jboss.com/products/seam/framework http://jboss.com/products/seam/framework-2.3.xsd" >
+
+ <pay:payment-home
+ new-instance="#{newPayment}"
+ created-message="Created a new payment to #{newPayment.payee}" />
+
+
+ <pay:payment name="newPayment"
+ payee="Somebody"
+ account="#{selectedAccount}"
+ payment-date="#{currentDatetime}"
+ created-date="#{currentDatetime}" />
+
+ <factory name="selectedAccount"
+ value="#{accountHome.instance}"/>
+
+ <framework:entity-home name="accountHome"
+ entity-class="org.jboss.seam.example.seampay.Account"
+ entity-manager="#{entityManager}" />
+
+ <framework:entity-query name="accounts"
+ ejbql="from Account"
+ order="accountNumber"
+ max-results="20"
+ entity-manager="#{entityManager}" />
+
+ <persistence:managed-persistence-context name="entityManager"
+ auto-create="true"
+ persistence-unit-jndi-name="java:/seampayEntityManagerFactory" />
+
+ <async:timer-service-dispatcher />
+ <component class="org.jboss.seam.async.ThreadPoolDispatcher" precedence="40" />
+
+ <core:init debug="true" jndi-pattern="jboss-seam-pay/#{ejbName}/local" />
+
+</components>
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/seam.properties
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/seam.properties (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/seam.properties 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,3 @@
+#debug is explicitly disabled in test to avoid JBIDE-3623
+#Thu Dec 31 16:24:37 CET 2009
+org.jboss.seam.core.init.debug=false
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/seampay.properties
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/seampay.properties (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/seampay.properties 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,32 @@
+ #
+ # 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.
+ #
+MAIN_PAGE = /search.seam
+MAIN_PAGE_TITLE = Seam Pay
+ACCOUNT_TABLE_LINK = id=accountTable:{0}:link
+ACCOUNT_TABLE_BALANCE = id=accountTable:{0}:balance
+PAYMENT_TO_FIELD = id=accountView:paymentForm:payee
+PAYMENT_AMOUNT_FIELD = id=accountView:paymentForm:amount
+PAYMENT_ONLY_ONCE_RADIO = id=accountView:paymentForm:radioList:0
+PAYMENT_EVERY_MINUTE_RADIO = id=accountView:paymentForm:radioList:1
+PAYMENT_SUBMIT = id=accountView:paymentForm:submit
+PAYMENT_CONFIRMATION_MESSAGE = Created a new payment to {0}
+PAYMENTS_COUNT =//table[@id\='payments']/tbody/tr
\ No newline at end of file
Property changes on: branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources/seampay.properties
___________________________________________________________________
Added: svn:executable
+ *
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources-ftest/testng.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources-ftest/testng.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources-ftest/testng.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -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="Seampay example" verbose="2" parallel="false">
+ <test name="seampay_tests">
+ <parameter name="PROPERTY_FILE" value="/seampay.properties" />
+ <classes>
+ <class name="org.jboss.seam.example.common.test.seampay.selenium.PaymentTest" />
+ </classes>
+ </test>
+</suite>
Property changes on: branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources-ftest/testng.xml
___________________________________________________________________
Added: svn:executable
+ *
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources-integration/testng.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources-integration/testng.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-tests/src/test/resources-integration/testng.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,12 @@
+<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
+
+<suite name="seampay" verbose="2" parallel="false">
+ <test name="seampay">
+ <classes>
+ <class
+ name="org.jboss.seam.example.seampay.test.PaymentProcessorTest" />
+ <class
+ name="org.jboss.seam.example.seampay.test.AccountTest" />
+ </classes>
+ </test>
+</suite>
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/pom.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/pom.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,154 @@
+<?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>seampay</artifactId>
+ <groupId>org.jboss.seam.examples-ee6</groupId>
+ <version>2.3.0.Beta2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.jboss.seam.examples-ee6.seampay</groupId>
+ <artifactId>seampay-web</artifactId>
+ <packaging>war</packaging>
+ <name>Seampay Web Module (EE6)</name>
+
+ <properties>
+ <!-- filtering property for components.xml -->
+ <jndiPattern>java:app/seampay-ejb/#{ejbName}</jndiPattern>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.seam.examples-ee6.seampay</groupId>
+ <artifactId>seampay-ejb</artifactId>
+ <type>ejb</type>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-ui</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-jul</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-debug</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.richfaces.ui</groupId>
+ <artifactId>richfaces-components-ui</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.richfaces.core</groupId>
+ <artifactId>richfaces-core-impl</artifactId>
+ </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.seampay</groupId>
+ <artifactId>seampay-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>
+ <dependency>
+ <groupId>commons-digester</groupId>
+ <artifactId>commons-digester</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-collections</groupId>
+ <artifactId>commons-collections</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.richfaces.framework</groupId>
+ <artifactId>richfaces-api</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-collections</groupId>
+ <artifactId>commons-collections</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>jstl</artifactId>
+ </dependency>
+ </dependencies>
+ <build>
+ <finalName>jboss-seam-seampay</finalName>
+ </build>
+ </profile>
+ </profiles>
+
+</project>
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/components.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/components.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/components.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,46 @@
+<components xmlns:pay="http://jboss.com/products/seam/examples/seampay"
+ xmlns:core="http://jboss.com/products/seam/core"
+ xmlns:persistence="http://jboss.com/products/seam/persistence"
+ xmlns:framework="http://jboss.com/products/seam/framework"
+ xmlns:async="http://jboss.com/products/seam/async"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation=
+ "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.3.xsd
+ http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.3.xsd
+ http://jboss.com/products/seam/async http://jboss.com/products/seam/async-2.3.xsd
+ http://jboss.com/products/seam/framework http://jboss.com/products/seam/framework-2.3.xsd" >
+
+ <pay:payment-home
+ new-instance="#{newPayment}"
+ created-message="Created a new payment to #{newPayment.payee}" />
+
+
+ <pay:payment name="newPayment"
+ payee="Somebody"
+ account="#{selectedAccount}"
+ payment-date="#{currentDatetime}"
+ created-date="#{currentDatetime}" />
+
+ <factory name="selectedAccount"
+ value="#{accountHome.instance}"/>
+
+ <framework:entity-home name="accountHome"
+ entity-class="org.jboss.seam.example.seampay.Account"
+ entity-manager="#{entityManager}" />
+
+ <framework:entity-query name="accounts"
+ ejbql="from Account"
+ order="accountNumber"
+ max-results="20"
+ entity-manager="#{entityManager}" />
+
+ <persistence:managed-persistence-context name="entityManager"
+ auto-create="true"
+ persistence-unit-jndi-name="java:/seampayEntityManagerFactory" />
+
+ <async:timer-service-dispatcher />
+ <component class="org.jboss.seam.async.ThreadPoolDispatcher" precedence="40" />
+
+ <core:init debug="true" jndi-pattern="@jndiPattern@" />
+
+</components>
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/faces-config.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/faces-config.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/faces-config.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faces-config version="2.1"
+ 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-facesconfig_2_1.xsd">
+
+</faces-config>
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/pages.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/pages.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/pages.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,14 @@
+<?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 http://jboss.com/products/seam/pages-2.3.xsd">
+
+ <page view-id="/search.xhtml">
+ <param name="accountId" value="#{accountHome.id}" converterId="javax.faces.Long" />
+ <navigation>
+ <rule if-outcome="persisted">
+ <render/>
+ </rule>
+ </navigation>
+ </page>
+</pages>
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/web.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/web.xml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/WEB-INF/web.xml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="3.0"
+ 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_3_0.xsd">
+
+ <listener>
+ <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
+ </listener>
+
+ <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>
+
+ <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>
+
+ <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/seampay/seampay-web/src/main/webapp/date.css
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/date.css (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/date.css 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,184 @@
+div.seam-date
+{
+ margin-top: 5px;
+ border: 1px solid #AAAAAA;
+ background-color: #FFFFFF;
+ color: #505050;
+ font-family: Tahoma, Arial, Helvetica, sans-serif;
+ font-size: 12px;
+}
+
+table.seam-date td {
+ font-family: Tahoma, Arial, Helvetica, sans-serif;
+ font-size: 11px;
+}
+
+.seam-date-monthNames
+{
+ width: 70px;
+ border: 1px solid #dddddd;
+ border-right: 3px solid #444444;
+ border-bottom: 3px solid #444444;
+ background-color: #ffffff;
+ font-size: 12px;
+ cursor: pointer;
+ font-family: Tahoma, Arial, Helvetica, sans-serif;
+ font-weight: normal;
+}
+
+a.seam-date-monthNameLink, a.seam-date-monthNameLink:visited
+{
+ text-align: center;
+ display: block;
+ color: #555555;
+}
+
+a.seam-date-monthNameLink:hover
+{
+ background-color: #CCCCCC;
+ color: red;
+}
+
+.seam-date-years
+{
+ height: 10em;
+ overflow: auto;
+ width: 60px;
+ border: 1px solid #dddddd;
+ border-right: 3px solid #444444;
+ border-bottom: 3px solid #444444;
+ background-color: #ffffff;
+ font-size: 12px;
+ cursor: pointer;
+ font-family: Tahoma, Arial, Helvetica, sans-serif;
+ font-weight: normal;
+}
+
+a.seam-date-yearLink, a.seam-date-yearLink:visited
+{
+ text-align: center;
+ display: block;
+ color: #555555;
+}
+
+a.seam-date-yearLink:hover
+{
+ background-color: #CCCCCC;
+ color: red;
+}
+
+tr.seam-date-header
+{
+ padding: 2px 0px 2px 0px;
+}
+
+td.seam-date-header
+{
+ padding: 0px 8px 0px 8px;
+ text-align: center;
+ color: gray;
+ font-family: Tahoma, Arial, Helvetica, sans-serif;
+ font-weight: bold;
+ font-size: 12px;
+}
+
+td.seam-date-header-prevMonth
+{
+ background-image: url("./img/cal-prev.png");
+ background-repeat: no-repeat;
+ background-position: center;
+ padding: 0px 2px 0px 2px;
+ width: 17px;
+ height: 16px;
+ margin-left: 2px;
+}
+
+td.seam-date-header-nextMonth
+{
+ background-image: url("./img/cal-next.png");
+ background-repeat: no-repeat;
+ background-position: center;
+ padding: 0px 2px 0px 2px;
+ width: 17px;
+ height: 16px;
+ margin-right: 2px;
+}
+
+tr.seam-date-headerDays
+{
+ color: white;
+ font-weight: normal;
+}
+
+tr.seam-date-headerDays > td
+{
+ background-color: #CCCCCC;
+ border: 1px solid #AAAAAA;
+ color: white;
+ text-align: center;
+ width: 26px;
+}
+
+tr.seam-date-footer
+{
+ background-color: white;
+ color: #505050;
+ font-weight: bold;
+}
+
+tr.seam-date-footer > td
+{
+ text-align: center;
+}
+
+td.seam-date-inMonth
+{
+ background-color: white;
+ color: black;
+ font-weight: normal;
+ cursor: pointer;
+ border: 1px solid #ece9d8;
+}
+
+td.seam-date-outMonth
+{
+ background-color: white;
+ color: #999999;
+ font-weight: normal;
+ cursor: pointer;
+ border: 1px solid #ece9d8;
+}
+
+td.seam-date-selected
+{
+ background-color: #CCCCCC;
+ border: 1px solid #AAAAAA;
+ color: black;
+ font-weight: normal;
+}
+
+td.seam-date-dayOff-inMonth
+{
+ background-color: #efefef;
+ color: black;
+ font-weight: normal;
+ cursor: pointer;
+ border: 1px solid #ece9d8;
+}
+
+td.seam-date-dayOff-outMonth
+{
+ background-color: #efefef;
+ color: #999999;
+ font-weight: normal;
+ cursor: pointer;
+ border: 1px solid #ece9d8;
+}
+
+td.seam-date-hover
+{
+ background-color: #CCCCCC;
+ border: 1px solid #AAAAAA;
+ cursor: pointer;
+ color: red;
+}
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/img/cal-next.png
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/img/cal-next.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/img/cal-prev.png
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/img/cal-prev.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/img/dtpick.gif
===================================================================
(Binary files differ)
Property changes on: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/img/dtpick.gif
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/index.html
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/index.html (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/index.html 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,5 @@
+<html>
+<head>
+ <meta http-equiv="Refresh" content="0; URL=search.seam">
+</head>
+</html>
\ No newline at end of file
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/screen.css
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/screen.css (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/screen.css 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,145 @@
+a:active, a:link, a:visited {
+ color: #0D5798;
+}
+a:hover {
+ color: #8CAFCD;
+}
+
+.menuButtons {
+ background-color: #FF6600; /*#8CAFCD*/
+ padding-top: 10px;
+ padding-bottom: 10px;
+}
+.menuButtons a {
+ font-weight: bold;
+ text-decoration: none;
+ padding-left: 25px;
+ padding-right: 25px;
+}
+.menuButtons a:active, .menuButtons a:link, .menuButtons a:visited {
+ font-family: Arial,sans-serif;
+ background-color: #FF6600; /*#8CAFCD*/
+ color: white;
+ border-right: 1px solid white;
+}
+.menuButtons a:hover {
+ font-family: Arial,sans-serif;
+ background-color: white;
+ color: #FF6600; /*#8CAFCD*/
+}
+
+.actionButtons {
+ width: 100%;
+ text-align: center;
+ padding-top: 10px;
+}
+.tableControl {
+ width: 100%;
+ text-align: right;
+ padding-top: 15px;
+}
+.actionButtons a, .tableControl a {
+ font-family: Arial,sans-serif;
+ font-weight: bold;
+ color: #578BB8;
+ border: 1px solid #578BB8;
+ text-decoration: none;
+ padding: 5px;
+ margin: 5px;
+}
+.actionButtons a:hover, .tableControl a:hover {
+ color: white;
+ background-color: #578BB8;
+ margin: 5px;
+}
+
+h1 {
+ font-family: Arial,sans-serif;
+ color: #578BB8;
+ font-size: 1.6em;
+ margin-top: 0;
+}
+
+body {
+ margin: 0px;
+ font-family: Arial,sans-serif;
+ color: #616161;
+}
+
+.body {
+ padding: 30px;
+}
+
+
+table.results {
+ width: 100%;
+}
+
+table.results th {
+ background-color: #578BB8;
+ color: white;
+ font-family: Arial,sans-serif;
+ padding: 5px;
+
+}
+
+table.results td {
+ background-color: #F0F0F0;
+ text-align: center;
+}
+
+.narrow {
+ width: 20%;
+}
+.wide {
+ width: 80%;
+}
+
+.first td {
+ background-color: #F0F0F0;
+}
+
+.second td {
+ background-color: white;
+}
+
+.dialog
+{
+ padding: 15px;
+ background-color: #F0F0F0;
+ margin: 10px;
+}
+.dialog table
+{
+ width: auto;
+}
+
+.message {
+ border: 1px solid #FFCC00;
+ padding: 5px;
+ margin-top: 5px;
+ margin-bottom: 5px;
+ background-color: #F0F0F0;
+}
+
+.prop {
+ padding: 5px;
+}
+.prop .name {
+ font-weight: bold;
+ text-align: left;
+ width: 115px;
+}
+.prop .value {
+ text-align: left;
+}
+.prop .errors {
+ color: red;
+ text-align: left;
+}
+.value input {
+ width:190px;
+}
+.errors input {
+ border: 1px solid red;
+}
Added: branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/search.xhtml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/search.xhtml (rev 0)
+++ branches/community/Seam_2_3/examples-ee6/seampay/seampay-web/src/main/webapp/search.xhtml 2012-04-02 10:17:17 UTC (rev 14460)
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html 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"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:rich="http://richfaces.org/rich"
+ template="template.xhtml">
+<h:head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <title>Seam Pay</title>
+ <link href="screen.css" rel="stylesheet" type="text/css" />
+ <link href="date.css" rel="stylesheet" type="text/css" />
+</h:head>
+<body>
+
+ <div class="menuButtons">
+ <s:link view="/search.xhtml" value="Show Accounts"/>
+ </div>
+
+ <div class="body">
+ <h1>Account</h1>
+
+ <h:messages styleClass="message"/>
+
+
+ <!-- search results -->
+ <table class="results">
+ <tr>
+ <th>Id</th>
+ <th>Account Number</th>
+ <th>Balance</th>
+ </tr>
+ <ui:repeat id="accountTable" value="#{accounts.resultList}" var="account">
+ <tr>
+ <td>
+ <s:link id="link" view="/search.xhtml" value="#{account.id}">
+ <f:param name="accountId" value="#{account.id}"/>
+ </s:link>
+ </td>
+ <td>#{account.accountNumber}</td>
+ <td>
+ <h:outputText id="balance" value="#{account.balance}">
+ <f:convertNumber type="currency" currencySymbol="$"/>
+ </h:outputText>
+ </td>
+ </tr>
+ </ui:repeat>
+ </table>
+ <h:outputText value="No accounts found" rendered="#{empty accounts.resultList}" styleClass="message"/>
+
+
+ <f:subview id="accountView" rendered="#{accountHome.idDefined}">
+ <h2>Payments from Account #{accountHome.instance.accountNumber}</h2>
+ <table id="payments" class="results">
+ <thead>
+ <tr>
+ <th>Status</th>
+ <th>Payee</th>
+ <th>Payment Amount</th>
+ <th>Created Date</th>
+ <th>Scheduled Date</th>
+ <th>Frequency</th>
+ <th>Last Paid On</th>
+ </tr>
+ </thead>
+ <tbody>
+ <ui:repeat value="#{accountHome.instance.payments}" var="payment">
+ <tr>
+ <td>
+ <s:button action="#{paymentHome.cancel}" value="Cancel" rendered="#{payment.active}">
+ <f:param name="paymentId" value="#{payment.id}"/>
+ </s:button>
+ <h:outputText value="not active" rendered="#{!payment.active}" />
+ </td>
+ <td>#{payment.payee}</td>
+ <td>
+ <h:outputText value="#{payment.amount}">
+ <f:convertNumber type="currency" currencySymbol="$"/>
+ </h:outputText>
+ </td>
+ <td>
+ <h:outputText value="#{payment.createdDate}">
+ <f:convertDateTime type="date" dateStyle="medium" />
+ </h:outputText>
+ </td>
+ <td>
+ <h:outputText value="#{payment.paymentDate}">
+ <f:convertDateTime type="date" dateStyle="medium" />
+ </h:outputText>
+ </td>
+ <td>#{payment.paymentFrequency}</td>
+ <td>
+ <h:outputText value="#{payment.lastPaid}">
+ <f:convertDateTime type="date" dateStyle="medium" />
+ </h:outputText>
+ </td>
+ </tr>
+ </ui:repeat>
+ </tbody>
+ </table>
+
+ <h2>Make a payment from account #{accountHome.instance.accountNumber}:</h2>
+ <h:form id="paymentForm">
+ <s:validateAll>
+ <table>
+ <tr>
+ <td>To:</td>
+ <td>
+ <h:inputText id="payee" value="#{newPayment.payee}" required="true"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Amount:</td>
+ <td><h:inputText id="amount" value="#{newPayment.amount}" required="true">
+ <ui:remove>
+ <f:convertNumber type="currency" currencySymbol="$"/>
+ </ui:remove>
+ </h:inputText></td>
+ </tr>
+ <tr>
+ <td>Date:</td>
+ <td>
+ <rich:calendar id="paymentDate" value="#{newPayment.paymentDate}" required="true" datePattern="MM/dd/yyyy" />
+ <h:message for="paymentDate" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>Frequency:</td>
+ <td>
+ <h:selectOneRadio id="radioList"
+ layout="lineDirection"
+ value="#{newPayment.paymentFrequency}">
+ <s:convertEnum />
+ <s:enumItem id="once" enumValue="ONCE" label="Only Once" />
+ <s:enumItem id="everyMinute" enumValue="EVERY_MINUTE" label="Every Minute (testing)" />
+ <s:enumItem id="hourly" enumValue="HOURLY" label="Every Hour (testing)" />
+ <s:enumItem id="daily" enumValue="DAILY" label="Every Day" />
+ <s:enumItem id="weekly" enumValue="WEEKLY" label="Every Week" />
+ <ui:remove>
+ <f:selectItems value="#{newPayment.frequencies}" />
+ </ui:remove>
+ </h:selectOneRadio>
+ </td>
+ </tr>
+ </table>
+ </s:validateAll>
+
+ <h:commandButton id="submit" value="Schedule"
+ action="#{paymentHome.saveAndSchedule}" />
+ </h:form>
+ </f:subview>
+
+ </div>
+
+</body>
+</html>
12 years, 1 month
Seam SVN: r14459 - branches/community/Seam_2_3/jboss-seam/src/main/java/org/jboss/seam/transaction.
by seam-commits@lists.jboss.org
Author: maschmid
Date: 2012-04-02 06:10:11 -0400 (Mon, 02 Apr 2012)
New Revision: 14459
Modified:
branches/community/Seam_2_3/jboss-seam/src/main/java/org/jboss/seam/transaction/Transaction.java
Log:
fix java.lang.ClassCastException: org.jboss.tm.usertx.client.ServerVMClientUserTransaction cannot be cast to org.jboss.seam.transaction.UserTransaction
Modified: branches/community/Seam_2_3/jboss-seam/src/main/java/org/jboss/seam/transaction/Transaction.java
===================================================================
--- branches/community/Seam_2_3/jboss-seam/src/main/java/org/jboss/seam/transaction/Transaction.java 2012-04-02 08:20:19 UTC (rev 14458)
+++ branches/community/Seam_2_3/jboss-seam/src/main/java/org/jboss/seam/transaction/Transaction.java 2012-04-02 10:10:11 UTC (rev 14459)
@@ -92,7 +92,7 @@
}
catch (NamingException nnfe2) {
// Try the other JBoss location in JBoss AS7
- return (UserTransaction) context.lookup("java:jboss/UserTransaction");
+ return (javax.transaction.UserTransaction) context.lookup("java:jboss/UserTransaction");
}
catch (Exception e)
{
12 years, 1 month
Seam SVN: r14458 - branches/community/Seam_2_3/examples-ee6.
by seam-commits@lists.jboss.org
Author: maschmid
Date: 2012-04-02 04:20:19 -0400 (Mon, 02 Apr 2012)
New Revision: 14458
Modified:
branches/community/Seam_2_3/examples-ee6/pom.xml
Log:
enable seamspace
Modified: branches/community/Seam_2_3/examples-ee6/pom.xml
===================================================================
--- branches/community/Seam_2_3/examples-ee6/pom.xml 2012-04-02 07:53:34 UTC (rev 14457)
+++ branches/community/Seam_2_3/examples-ee6/pom.xml 2012-04-02 08:20:19 UTC (rev 14458)
@@ -27,6 +27,7 @@
<module>remoting/gwt</module>
<module>remoting/helloworld</module>
<module>remoting/progressbar</module>
+ <module>seamspace</module>
<module>todo</module>
<module>ui</module>
</modules>
12 years, 1 month