You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jg...@apache.org on 2017/11/28 20:52:24 UTC
[06/11] tomee git commit: TOMEE-2151 Use correct classloader for
creating application resources specified in resources.xml. Added examples and
arquillian tests
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-business-logic/pom.xml
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-business-logic/pom.xml b/examples/simple-ear/moviefun-business-logic/pom.xml
new file mode 100644
index 0000000..441a338
--- /dev/null
+++ b/examples/simple-ear/moviefun-business-logic/pom.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- $Rev: 638272 $ $Date: 2008-03-18 01:59:59 -0700 (Tue, 18 Mar 2008) $ -->
+
+<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">
+ <parent>
+ <groupId>org.superbiz</groupId>
+ <artifactId>moviefun-ear-parent</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>moviefun-business-logic</artifactId>
+ <packaging>jar</packaging>
+ <name>OpenEJB :: Examples :: Simple EAR :: Business Logic</name>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+ <repositories>
+ <repository>
+ <id>apache-m2-snapshot</id>
+ <name>Apache Snapshot Repository</name>
+ <url>https://repository.apache.org/content/groups/snapshots/</url>
+ </repository>
+ </repositories>
+ <build>
+ <defaultGoal>install</defaultGoal>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>org.superbiz</groupId>
+ <artifactId>moviefun-business-model</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tomee</groupId>
+ <artifactId>javaee-api</artifactId>
+ <version>7.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.12</version>
+ <scope>test</scope>
+ </dependency>
+ <!--
+ The <scope>test</scope> guarantees that non of your runtime
+ code is dependent on any OpenEJB classes.
+ -->
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>openejb-core</artifactId>
+ <version>4.7.5-SNAPSHOT</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-business-logic/src/main/java/org/superbiz/logic/MoviesBean.java
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-business-logic/src/main/java/org/superbiz/logic/MoviesBean.java b/examples/simple-ear/moviefun-business-logic/src/main/java/org/superbiz/logic/MoviesBean.java
new file mode 100644
index 0000000..6a7bcf6
--- /dev/null
+++ b/examples/simple-ear/moviefun-business-logic/src/main/java/org/superbiz/logic/MoviesBean.java
@@ -0,0 +1,120 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.superbiz.logic;
+
+import org.superbiz.model.Movie;
+import org.superbiz.model.Movies;
+
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.TypedQuery;
+import javax.persistence.criteria.*;
+import javax.persistence.metamodel.EntityType;
+import java.util.List;
+
+@Stateless
+public class MoviesBean implements Movies {
+
+ @PersistenceContext(unitName = "movie-unit")
+ private EntityManager entityManager;
+
+ @Override
+ public Movie find(Long id) {
+ return entityManager.find(Movie.class, id);
+ }
+
+ @Override
+ public void addMovie(Movie movie) {
+ entityManager.persist(movie);
+ }
+
+ @Override
+ public void editMovie(Movie movie) {
+ entityManager.merge(movie);
+ }
+
+ @Override
+ public void deleteMovieId(long id) {
+ Movie movie = entityManager.find(Movie.class, id);
+ entityManager.remove(movie);
+ }
+
+ @Override
+ public List<Movie> getMovies() {
+ CriteriaQuery<Movie> cq = entityManager.getCriteriaBuilder().createQuery(Movie.class);
+ cq.select(cq.from(Movie.class));
+ return entityManager.createQuery(cq).getResultList();
+ }
+
+ @Override
+ public List<Movie> findAll(int firstResult, int maxResults) {
+ CriteriaQuery<Movie> cq = entityManager.getCriteriaBuilder().createQuery(Movie.class);
+ cq.select(cq.from(Movie.class));
+ TypedQuery<Movie> q = entityManager.createQuery(cq);
+ q.setMaxResults(maxResults);
+ q.setFirstResult(firstResult);
+ return q.getResultList();
+ }
+
+ @Override
+ public int countAll() {
+ CriteriaQuery<Long> cq = entityManager.getCriteriaBuilder().createQuery(Long.class);
+ Root<Movie> rt = cq.from(Movie.class);
+ cq.select(entityManager.getCriteriaBuilder().count(rt));
+ TypedQuery<Long> q = entityManager.createQuery(cq);
+ return (q.getSingleResult()).intValue();
+ }
+
+ @Override
+ public int count(String field, String searchTerm) {
+ CriteriaBuilder qb = entityManager.getCriteriaBuilder();
+ CriteriaQuery<Long> cq = qb.createQuery(Long.class);
+ Root<Movie> root = cq.from(Movie.class);
+ EntityType<Movie> type = entityManager.getMetamodel().entity(Movie.class);
+
+ Path<String> path = root.get(type.getDeclaredSingularAttribute(field, String.class));
+ Predicate condition = qb.like(path, "%" + searchTerm + "%");
+
+ cq.select(qb.count(root));
+ cq.where(condition);
+
+ return entityManager.createQuery(cq).getSingleResult().intValue();
+ }
+
+ @Override
+ public List<Movie> findRange(String field, String searchTerm, int firstResult, int maxResults) {
+ CriteriaBuilder qb = entityManager.getCriteriaBuilder();
+ CriteriaQuery<Movie> cq = qb.createQuery(Movie.class);
+ Root<Movie> root = cq.from(Movie.class);
+ EntityType<Movie> type = entityManager.getMetamodel().entity(Movie.class);
+
+ Path<String> path = root.get(type.getDeclaredSingularAttribute(field, String.class));
+ Predicate condition = qb.like(path, "%" + searchTerm + "%");
+
+ cq.where(condition);
+ TypedQuery<Movie> q = entityManager.createQuery(cq);
+ q.setMaxResults(maxResults);
+ q.setFirstResult(firstResult);
+ return q.getResultList();
+ }
+
+ @Override
+ public void clean() {
+ entityManager.createQuery("delete from Movie").executeUpdate();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-business-logic/src/main/resources/META-INF/ejb-jar.xml
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-business-logic/src/main/resources/META-INF/ejb-jar.xml b/examples/simple-ear/moviefun-business-logic/src/main/resources/META-INF/ejb-jar.xml
new file mode 100644
index 0000000..91be4f8
--- /dev/null
+++ b/examples/simple-ear/moviefun-business-logic/src/main/resources/META-INF/ejb-jar.xml
@@ -0,0 +1 @@
+<ejb-jar/>
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-business-logic/src/test/java/org/superbiz/logic/MoviesTest.java
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-business-logic/src/test/java/org/superbiz/logic/MoviesTest.java b/examples/simple-ear/moviefun-business-logic/src/test/java/org/superbiz/logic/MoviesTest.java
new file mode 100644
index 0000000..6dd1827
--- /dev/null
+++ b/examples/simple-ear/moviefun-business-logic/src/test/java/org/superbiz/logic/MoviesTest.java
@@ -0,0 +1,65 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.superbiz.logic;
+
+import junit.framework.TestCase;
+import org.superbiz.model.Movie;
+import org.superbiz.model.Movies;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import java.util.List;
+import java.util.Properties;
+
+//START SNIPPET: code
+
+public class MoviesTest extends TestCase {
+
+ public void test() throws Exception {
+ Properties p = new Properties();
+ p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.core.LocalInitialContextFactory");
+
+ p.put("openejb.deployments.classpath.ear", "true");
+
+ p.put("movieDatabase", "new://Resource?type=DataSource");
+ p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
+ p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb");
+
+ p.put("movieDatabaseUnmanaged", "new://Resource?type=DataSource");
+ p.put("movieDatabaseUnmanaged.JdbcDriver", "org.hsqldb.jdbcDriver");
+ p.put("movieDatabaseUnmanaged.JdbcUrl", "jdbc:hsqldb:mem:moviedb");
+ p.put("movieDatabaseUnmanaged.JtaManaged", "false");
+
+ Context context = new InitialContext(p);
+
+ Movies movies = (Movies) context.lookup("MoviesBeanLocal");
+
+ movies.addMovie(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992));
+ movies.addMovie(new Movie("Joel Coen", "Fargo", 1996));
+ movies.addMovie(new Movie("Joel Coen", "The Big Lebowski", 1998));
+
+ List<Movie> list = movies.getMovies();
+ assertEquals("List.size()", 3, list.size());
+
+ for (Movie movie : list) {
+ movies.deleteMovieId(movie.getId());
+ }
+
+ assertEquals("Movies.getMovies()", 0, movies.getMovies().size());
+ }
+}
+//END SNIPPET: code
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-business-model/pom.xml
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-business-model/pom.xml b/examples/simple-ear/moviefun-business-model/pom.xml
new file mode 100644
index 0000000..810d5c2
--- /dev/null
+++ b/examples/simple-ear/moviefun-business-model/pom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- $Rev: 638272 $ $Date: 2008-03-18 01:59:59 -0700 (Tue, 18 Mar 2008) $ -->
+
+<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">
+ <parent>
+ <groupId>org.superbiz</groupId>
+ <artifactId>moviefun-ear-parent</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>moviefun-business-model</artifactId>
+ <packaging>jar</packaging>
+ <name>OpenEJB :: Examples :: Simple EAR :: Business Model</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>javaee-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+</project>
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-business-model/src/main/java/org/superbiz/model/Movie.java
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-business-model/src/main/java/org/superbiz/model/Movie.java b/examples/simple-ear/moviefun-business-model/src/main/java/org/superbiz/model/Movie.java
new file mode 100644
index 0000000..f3fe9d2
--- /dev/null
+++ b/examples/simple-ear/moviefun-business-model/src/main/java/org/superbiz/model/Movie.java
@@ -0,0 +1,104 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.superbiz.model;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+@Entity
+public class Movie implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private long id;
+
+ private String director;
+ private String title;
+ private int year;
+ private String genre;
+ private int rating;
+
+ public Movie() {
+ }
+
+ public Movie(String title, String director, String genre, int rating, int year) {
+ this.director = director;
+ this.title = title;
+ this.year = year;
+ this.genre = genre;
+ this.rating = rating;
+ }
+
+ public Movie(String director, String title, int year) {
+ this.director = director;
+ this.title = title;
+ this.year = year;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public int getYear() {
+ return year;
+ }
+
+ public void setYear(int year) {
+ this.year = year;
+ }
+
+ public String getGenre() {
+ return genre;
+ }
+
+ public void setGenre(String genre) {
+ this.genre = genre;
+ }
+
+ public int getRating() {
+ return rating;
+ }
+
+ public void setRating(int rating) {
+ this.rating = rating;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-business-model/src/main/java/org/superbiz/model/Movies.java
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-business-model/src/main/java/org/superbiz/model/Movies.java b/examples/simple-ear/moviefun-business-model/src/main/java/org/superbiz/model/Movies.java
new file mode 100644
index 0000000..b5efb95
--- /dev/null
+++ b/examples/simple-ear/moviefun-business-model/src/main/java/org/superbiz/model/Movies.java
@@ -0,0 +1,27 @@
+package org.superbiz.model;
+
+import javax.ejb.Local;
+import java.util.List;
+
+@Local
+public interface Movies {
+ Movie find(Long id);
+
+ void addMovie(Movie movie);
+
+ void editMovie(Movie movie);
+
+ void deleteMovieId(long id);
+
+ List<Movie> getMovies();
+
+ List<Movie> findAll(int firstResult, int maxResults);
+
+ int countAll();
+
+ int count(String field, String searchTerm);
+
+ List<Movie> findRange(String field, String searchTerm, int firstResult, int maxResults);
+
+ void clean();
+}
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-business-model/src/main/resources/META-INF/persistence.xml
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-business-model/src/main/resources/META-INF/persistence.xml b/examples/simple-ear/moviefun-business-model/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..a92d490
--- /dev/null
+++ b/examples/simple-ear/moviefun-business-model/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- START SNIPPET: code -->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
+
+ <persistence-unit name="movie-unit">
+ <jta-data-source>movieDatabase</jta-data-source>
+ <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source>
+ <class>org.superbiz.model.Movie</class>
+
+ <properties>
+ <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
+ </properties>
+ </persistence-unit>
+</persistence>
+ <!-- END SNIPPET: code -->
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-ear/pom.xml
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-ear/pom.xml b/examples/simple-ear/moviefun-ear/pom.xml
new file mode 100644
index 0000000..8adbaa1
--- /dev/null
+++ b/examples/simple-ear/moviefun-ear/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<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">
+
+ <parent>
+ <groupId>org.superbiz</groupId>
+ <artifactId>moviefun-ear-parent</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>moviefun-ear</artifactId>
+ <packaging>ear</packaging>
+ <name>OpenEJB :: Examples :: Simple EAR :: EAR Packaging</name>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.superbiz</groupId>
+ <artifactId>moviefun-business-logic</artifactId>
+ <version>${project.version}</version>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>org.superbiz</groupId>
+ <artifactId>moviefun-webapp</artifactId>
+ <type>war</type>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-ear-plugin</artifactId>
+ <version>2.10.1</version>
+ <configuration>
+ <version>6</version>
+ <generateApplicationXml>true</generateApplicationXml>
+ <defaultLibBundleDir>lib</defaultLibBundleDir>
+ <modules>
+ <webModule>
+ <groupId>org.superbiz</groupId>
+ <artifactId>moviefun-webapp</artifactId>
+ <contextRoot>/moviefun</contextRoot>
+ </webModule>
+ <ejbModule>
+ <groupId>org.superbiz</groupId>
+ <artifactId>moviefun-business-logic</artifactId>
+ </ejbModule>
+ </modules>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-functional-tests/pom.xml
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-functional-tests/pom.xml b/examples/simple-ear/moviefun-functional-tests/pom.xml
new file mode 100644
index 0000000..03a7c85
--- /dev/null
+++ b/examples/simple-ear/moviefun-functional-tests/pom.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- $Rev: 638272 $ $Date: 2008-03-18 01:59:59 -0700 (Tue, 18 Mar 2008) $ -->
+
+<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">
+ <parent>
+ <groupId>org.superbiz</groupId>
+ <artifactId>moviefun-ear-parent</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>moviefun-functional-test</artifactId>
+ <packaging>jar</packaging>
+ <name>OpenEJB :: Examples :: Simple EAR :: Functional Tests</name>
+
+ <properties>
+ <version.shrinkwrap.resolver>2.0.0</version.shrinkwrap.resolver>
+ </properties>
+
+ <dependencyManagement>
+ <dependencies>
+ <!-- Override dependency resolver with test version. This must go *BEFORE*
+ the Arquillian BOM. -->
+ <dependency>
+ <groupId>org.jboss.shrinkwrap.resolver</groupId>
+ <artifactId>shrinkwrap-resolver-bom</artifactId>
+ <version>${version.shrinkwrap.resolver}</version>
+ <scope>import</scope>
+ <type>pom</type>
+ </dependency>
+ <!-- Now pull in our server-based unit testing framework -->
+ <dependency>
+ <groupId>org.jboss.arquillian</groupId>
+ <artifactId>arquillian-bom</artifactId>
+ <version>1.1.10.Final</version>
+ <scope>import</scope>
+ <type>pom</type>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>javaee-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.superbiz</groupId>
+ <artifactId>moviefun-ear</artifactId>
+ <version>${project.version}</version>
+ <type>ear</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.12</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>jstl</artifactId>
+ <version>1.2</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>openejb-core</artifactId>
+ <version>4.7.5-SNAPSHOT</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>taglibs</groupId>
+ <artifactId>standard</artifactId>
+ <version>1.1.2</version>
+ </dependency>
+ <dependency>
+ <groupId>net.sourceforge.htmlunit</groupId>
+ <artifactId>htmlunit</artifactId>
+ <version>2.8</version>
+ <type>jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>tomee-embedded</artifactId>
+ <version>1.7.5-SNAPSHOT</version>
+ <!--<classifier>uber</classifier> -->
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.4</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.arquillian.junit</groupId>
+ <artifactId>arquillian-junit-container</artifactId>
+ <version>1.1.10.Final</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.shrinkwrap.resolver</groupId>
+ <artifactId>shrinkwrap-resolver-depchain</artifactId>
+ <type>pom</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.shrinkwrap.resolver</groupId>
+ <artifactId>shrinkwrap-resolver-impl-maven</artifactId>
+ <version>${version.shrinkwrap.resolver}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>arquillian-tomee-remote</artifactId>
+ <version>1.7.5-SNAPSHOT</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-functional-tests/src/test/java/org/superbiz/moviefun/DeployInWebAppsDirectoryTest.java
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-functional-tests/src/test/java/org/superbiz/moviefun/DeployInWebAppsDirectoryTest.java b/examples/simple-ear/moviefun-functional-tests/src/test/java/org/superbiz/moviefun/DeployInWebAppsDirectoryTest.java
new file mode 100644
index 0000000..754281a
--- /dev/null
+++ b/examples/simple-ear/moviefun-functional-tests/src/test/java/org/superbiz/moviefun/DeployInWebAppsDirectoryTest.java
@@ -0,0 +1,130 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.superbiz.moviefun;
+
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import org.apache.openejb.loader.IO;
+import org.apache.tomee.arquillian.remote.RemoteTomEEConfiguration;
+import org.apache.tomee.arquillian.remote.RemoteTomEEContainer;
+import org.jboss.shrinkwrap.resolver.api.maven.Maven;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.concurrent.Callable;
+
+import static org.junit.Assert.assertTrue;
+
+@Ignore("Not implemented yet")
+/*
+ * This test deploys the ear in a manual fashion. Normally the remote adapter deploys using the deployer.
+ * Here we'll use the arquillian adapter to control the lifecycle of the server, but we'll do the deploy
+ * by hand into the webapps directory directly. The EAR deployment was fixed in TOMEE-2145.
+ *
+ */
+public class DeployInWebAppsDirectoryTest {
+
+ @Test
+ public void test() throws Exception {
+ final RemoteTomEEConfiguration configuration = new RemoteTomEEConfiguration();
+ configuration.setGroupId("org.apache.openejb");
+ configuration.setArtifactId("apache-tomee");
+ configuration.setClassifier("plus");
+ configuration.setVersion("1.7.5-SNAPSHOT");
+ configuration.setHttpPort(-1);
+
+ final RemoteTomEEContainer container = new RemoteTomEEContainer();
+ container.setup(configuration);
+
+ try {
+ container.start();
+
+ final File webapps = new File(configuration.getDir(), "apache-tomee-" + configuration.getClassifier() + "-" + configuration.getVersion() + "/webapps");
+ webapps.mkdirs();
+
+ final File enterpriseArchive = Maven.resolver().resolve("org.superbiz:moviefun-ear:ear:1.1.0-SNAPSHOT")
+ .withoutTransitivity().asSingleFile();
+
+ IO.copy(enterpriseArchive, new File(webapps, "moviefun-ear.ear"));
+ final String appUrl = "http://localhost:" + configuration.getHttpPort() + "/moviefun";
+
+ runTests(appUrl);
+
+ container.stop();
+
+ // restart the container, make sure all is still well
+ container.start();
+
+ } finally {
+ container.stop();
+ }
+ }
+
+ private void runTests(final String appUrl) throws IOException {
+ final WebClient webClient = new WebClient();
+
+ HtmlPage page = attempt(new Callable<HtmlPage>() {
+
+ @Override
+ public HtmlPage call() throws Exception {
+ return getPage(webClient, appUrl);
+ }
+ }, 30);
+
+ assertMoviesPresent(page);
+
+ page = webClient.getPage(appUrl + "/moviefun");
+
+ assertMoviesPresent(page);
+ webClient.closeAllWindows();
+ }
+
+ private <T> T attempt(final Callable<T> callable, int numberOfAttempts) {
+ int tries = 0;
+
+ while (tries < numberOfAttempts) {
+ try {
+ return callable.call();
+ } catch (final Exception e) {
+ // ignore the exception and try again
+ tries++;
+ try {
+ Thread.sleep(1000);
+ } catch (final InterruptedException ie) {
+ // ignore
+ }
+ }
+ }
+
+ throw new IllegalStateException("Unable to invoke callable successfully after " + numberOfAttempts + " attempts");
+ }
+
+ private HtmlPage getPage(final WebClient webClient, final String url) throws IOException {
+ return webClient.getPage(url + "/setup.jsp");
+ }
+
+ private void assertMoviesPresent(HtmlPage page) {
+ String pageAsText = page.asText();
+ assertTrue(pageAsText.contains("Wedding Crashers"));
+ assertTrue(pageAsText.contains("Starsky & Hutch"));
+ assertTrue(pageAsText.contains("Shanghai Knights"));
+ assertTrue(pageAsText.contains("I-Spy"));
+ assertTrue(pageAsText.contains("The Royal Tenenbaums"));
+ }
+}
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-functional-tests/src/test/java/org/superbiz/moviefun/MoviesArquillianHtmlUnitTest.java
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-functional-tests/src/test/java/org/superbiz/moviefun/MoviesArquillianHtmlUnitTest.java b/examples/simple-ear/moviefun-functional-tests/src/test/java/org/superbiz/moviefun/MoviesArquillianHtmlUnitTest.java
new file mode 100644
index 0000000..5066f5d
--- /dev/null
+++ b/examples/simple-ear/moviefun-functional-tests/src/test/java/org/superbiz/moviefun/MoviesArquillianHtmlUnitTest.java
@@ -0,0 +1,75 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.superbiz.moviefun;
+
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.container.test.api.RunAsClient;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.jboss.shrinkwrap.api.spec.EnterpriseArchive;
+import org.jboss.shrinkwrap.resolver.api.maven.Maven;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.net.URL;
+
+import static org.junit.Assert.assertTrue;
+
+@RunWith(Arquillian.class)
+@RunAsClient
+public class MoviesArquillianHtmlUnitTest {
+
+ @Deployment
+ public static EnterpriseArchive createDeployment() {
+ final EnterpriseArchive enterpriseArchive = Maven.resolver().resolve("org.superbiz:moviefun-ear:ear:1.1.0-SNAPSHOT")
+ .withoutTransitivity().asSingle(EnterpriseArchive.class);
+
+ System.out.println(enterpriseArchive.toString(true));
+
+ return enterpriseArchive;
+ }
+
+ @ArquillianResource
+ private URL deploymentUrl;
+
+ @Test
+ public void testShouldMakeSureWebappIsWorking() throws Exception {
+ final String url = "http://" + deploymentUrl.getHost() + ":" + deploymentUrl.getPort() + "/moviefun";
+
+ WebClient webClient = new WebClient();
+ HtmlPage page = webClient.getPage(url + "/setup.jsp");
+
+ assertMoviesPresent(page);
+
+ page = webClient.getPage(url + "/moviefun");
+
+ assertMoviesPresent(page);
+ webClient.closeAllWindows();
+ }
+
+ private void assertMoviesPresent(HtmlPage page) {
+ String pageAsText = page.asText();
+ assertTrue(pageAsText.contains("Wedding Crashers"));
+ assertTrue(pageAsText.contains("Starsky & Hutch"));
+ assertTrue(pageAsText.contains("Shanghai Knights"));
+ assertTrue(pageAsText.contains("I-Spy"));
+ assertTrue(pageAsText.contains("The Royal Tenenbaums"));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-functional-tests/src/test/resources/META-INF/application-client.xml
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-functional-tests/src/test/resources/META-INF/application-client.xml b/examples/simple-ear/moviefun-functional-tests/src/test/resources/META-INF/application-client.xml
new file mode 100644
index 0000000..1e91dca
--- /dev/null
+++ b/examples/simple-ear/moviefun-functional-tests/src/test/resources/META-INF/application-client.xml
@@ -0,0 +1 @@
+<application-client/>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-functional-tests/src/test/resources/arquillian.xml
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-functional-tests/src/test/resources/arquillian.xml b/examples/simple-ear/moviefun-functional-tests/src/test/resources/arquillian.xml
new file mode 100644
index 0000000..c726dce
--- /dev/null
+++ b/examples/simple-ear/moviefun-functional-tests/src/test/resources/arquillian.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<arquillian
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ >
+
+ <container qualifier="tomee" default="true">
+ <configuration>
+ <property name="httpPort">-1</property>
+ <property name="stopPort">-1</property>
+ <property name="tomcatVersion"></property>
+ <property name="dßßir">target/apache-tomee-remote</property>
+ <property name="appWorkingDir">target/arquillian-test-working-dir</property>
+ </configuration>
+ </container>
+</arquillian>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-webapp/pom.xml
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-webapp/pom.xml b/examples/simple-ear/moviefun-webapp/pom.xml
new file mode 100644
index 0000000..133dbf9
--- /dev/null
+++ b/examples/simple-ear/moviefun-webapp/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<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>
+ <groupId>org.superbiz</groupId>
+ <artifactId>moviefun-ear-parent</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>moviefun-webapp</artifactId>
+ <packaging>war</packaging>
+ <name>OpenEJB :: Examples :: Simple EAR :: Webapp</name>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.superbiz</groupId>
+ <artifactId>moviefun-business-model</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>javaee-api</artifactId>
+ <version>6.0-6</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.12</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>jstl</artifactId>
+ <version>1.2</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>openejb-core</artifactId>
+ <version>4.7.5-SNAPSHOT</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>taglibs</groupId>
+ <artifactId>standard</artifactId>
+ <version>1.1.2</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>net.sourceforge.htmlunit</groupId>
+ <artifactId>htmlunit</artifactId>
+ <version>2.8</version>
+ <type>jar</type>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-webapp/src/main/java/org/superbiz/moviefun/ActionServlet.java
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-webapp/src/main/java/org/superbiz/moviefun/ActionServlet.java b/examples/simple-ear/moviefun-webapp/src/main/java/org/superbiz/moviefun/ActionServlet.java
new file mode 100644
index 0000000..bf467bf
--- /dev/null
+++ b/examples/simple-ear/moviefun-webapp/src/main/java/org/superbiz/moviefun/ActionServlet.java
@@ -0,0 +1,143 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.superbiz.moviefun;
+
+import org.superbiz.model.Movie;
+import org.superbiz.model.Movies;
+
+import javax.ejb.EJB;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @version $Revision$ $Date$
+ */
+@WebServlet("/moviefun/*")
+public class ActionServlet extends HttpServlet {
+
+ private static final long serialVersionUID = -5832176047021911038L;
+
+ public static int PAGE_SIZE = 5;
+
+ @EJB
+ private Movies moviesBean;
+
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ process(request, response);
+ }
+
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ process(request, response);
+ }
+
+ private void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ String action = request.getParameter("action");
+
+ if ("Add".equals(action)) {
+
+ String title = request.getParameter("title");
+ String director = request.getParameter("director");
+ String genre = request.getParameter("genre");
+ int rating = Integer.parseInt(request.getParameter("rating"));
+ int year = Integer.parseInt(request.getParameter("year"));
+
+ Movie movie = new Movie(title, director, genre, rating, year);
+
+ moviesBean.addMovie(movie);
+ response.sendRedirect("moviefun");
+ return;
+
+ } else if ("Remove".equals(action)) {
+
+ String[] ids = request.getParameterValues("id");
+ for (String id : ids) {
+ moviesBean.deleteMovieId(new Long(id));
+ }
+
+ response.sendRedirect("moviefun");
+ return;
+
+ } else {
+ String key = request.getParameter("key");
+ String field = request.getParameter("field");
+
+ int count = 0;
+
+ if (isEmpty(key) || isEmpty(field)) {
+ count = moviesBean.countAll();
+ key = "";
+ field = "";
+ } else {
+ count = moviesBean.count(field, key);
+ }
+
+ int page = 1;
+
+ try {
+ page = Integer.parseInt(request.getParameter("page"));
+ } catch (Exception e) {
+ }
+
+ int pageCount = (count / PAGE_SIZE);
+ if (pageCount == 0 || count % PAGE_SIZE != 0) {
+ pageCount++;
+ }
+
+ if (page < 1) {
+ page = 1;
+ }
+
+ if (page > pageCount) {
+ page = pageCount;
+ }
+
+ int start = (page - 1) * PAGE_SIZE;
+ List<Movie> range;
+
+ if (isEmpty(key) || isEmpty(field)) {
+ range = moviesBean.findAll(start, PAGE_SIZE);
+ } else {
+ range = moviesBean.findRange(field, key, start, PAGE_SIZE);
+ }
+
+ int end = start + range.size();
+
+ request.setAttribute("count", count);
+ request.setAttribute("start", start + 1);
+ request.setAttribute("end", end);
+ request.setAttribute("page", page);
+ request.setAttribute("pageCount", pageCount);
+ request.setAttribute("movies", range);
+ request.setAttribute("key", key);
+ request.setAttribute("field", field);
+ }
+
+ request.getRequestDispatcher("WEB-INF/moviefun.jsp").forward(request, response);
+ }
+
+ private static boolean isEmpty(final String input) {
+ return input == null || input.trim().length() == 0;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-webapp/src/main/webapp/WEB-INF/moviefun.jsp
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-webapp/src/main/webapp/WEB-INF/moviefun.jsp b/examples/simple-ear/moviefun-webapp/src/main/webapp/WEB-INF/moviefun.jsp
new file mode 100644
index 0000000..4c2a241
--- /dev/null
+++ b/examples/simple-ear/moviefun-webapp/src/main/webapp/WEB-INF/moviefun.jsp
@@ -0,0 +1,124 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c' %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<c:set var="language" value="${pageContext.request.locale}"/>
+<fmt:setLocale value="${language}"/>
+
+<!DOCTYPE html>
+<html lang="${language}">
+<head>
+ <meta charset="utf-8">
+ <title>Moviefun</title>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="">
+
+ <!-- Le styles -->
+ <link href="assets/css/bootstrap.css" rel="stylesheet">
+ <link href="assets/css/movie.css" rel="stylesheet">
+ <style>
+ body {
+ padding-top: 60px;
+ /* 60px to make the container go all the way to the bottom of the topbar */
+ }
+ </style>
+ <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
+
+</head>
+
+<body>
+
+<div class="navbar navbar-inverse navbar-fixed-top">
+ <div class="navbar-inner">
+ <div class="container">
+ <a class="btn btn-navbar" data-toggle="collapse"
+ data-target=".nav-collapse"> <span class="icon-bar"></span> <span
+ class="icon-bar"></span> <span class="icon-bar"></span>
+ </a> <a class="brand" href="#">Moviefun</a>
+
+ <form class="navbar-form pull-right">
+ <select name="field">
+ <option value="title">Title</option>
+ <option value="director">Director</option>
+ <option value="genre">Genre</option>
+ </select> <input type="text" name="key" size="20">
+ <button type="submit" class="btn">Search</button>
+ </form>
+
+ <!--/.nav-collapse -->
+ </div>
+ </div>
+</div>
+
+<div class="container">
+
+ <h1>Moviefun</h1>
+
+ <form class="movie-input-form form-inline" action="moviefun"
+ method="post">
+ <p>Add Movie</p>
+ <input type="text" name="title" placeholder="Title" size="29"/> <input
+ type="text" name="director" placeholder="Director" size="17"/> <input
+ type="text" name="genre" placeholder="Genre" size="14"/> <input
+ type="text" name="rating" placeholder="Rating" size="7"/> <input
+ type="text" name="year" placeholder="Year" size="4"
+ style="width: 110px;"/> <input type="submit" name="action"
+ class="btn btn-primary" value="Add"/>
+ </form>
+
+ <table class="table table-striped table-bordered">
+ <thead>
+ <tr>
+ <th>Title</th>
+ <th>Director</th>
+ <th>Genre</th>
+ <th>Rating</th>
+ <th>Year</th>
+ <th> </th>
+ </tr>
+ </thead>
+ <tbody>
+ <c:forEach items="${movies}" var="movie">
+ <tr>
+ <td><c:out value="${movie.title}"/></td>
+ <td><c:out value="${movie.director}"/></td>
+ <td><c:out value="${movie.genre}"/></td>
+ <td><c:out value="${movie.rating}"/></td>
+ <td><c:out value="${movie.year}"/></td>
+ <td><a href="?action=Remove&id=${movie.id}"><i
+ class="icon-trash"></i></a></td>
+ </tr>
+ </c:forEach>
+ </tbody>
+ </table>
+ <c:if test="${count > 0}">
+ <c:if test="${page > 1}">
+ <a href="<c:url value="moviefun"><c:param name="page" value="${page - 1}"/><c:param name="field" value="${field}"/><c:param name="key" value="${key}"/></c:url>">< Prev</a>
+ </c:if>
+ Showing records ${start} to ${end} of ${count}
+ <c:if test="${page < pageCount}">
+ <a href="<c:url value="moviefun"><c:param name="page" value="${page + 1}"/><c:param name="field" value="${field}"/><c:param name="key"
+ value="${key}"/></c:url>">Next ></a>
+ </c:if>
+ </c:if>
+</div>
+<!-- /container -->
+</body>
+</html>
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-webapp/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-webapp/src/main/webapp/WEB-INF/web.xml b/examples/simple-ear/moviefun-webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..c2b6882
--- /dev/null
+++ b/examples/simple-ear/moviefun-webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<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">
+ <welcome-file-list>
+ <welcome-file>index.jsp</welcome-file>
+ </welcome-file-list>
+</web-app>
+
http://git-wip-us.apache.org/repos/asf/tomee/blob/d362df28/examples/simple-ear/moviefun-webapp/src/main/webapp/assets/css/bootstrap-responsive.css
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-webapp/src/main/webapp/assets/css/bootstrap-responsive.css b/examples/simple-ear/moviefun-webapp/src/main/webapp/assets/css/bootstrap-responsive.css
new file mode 100644
index 0000000..bfbd2c7
--- /dev/null
+++ b/examples/simple-ear/moviefun-webapp/src/main/webapp/assets/css/bootstrap-responsive.css
@@ -0,0 +1,1285 @@
+/*!
+ * Bootstrap Responsive v2.1.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+ *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.clearfix:after {
+ clear: both;
+}
+
+.hide-text {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.input-block-level {
+ display: block;
+ width: 100%;
+ min-height: 30px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.hidden {
+ display: none;
+ visibility: hidden;
+}
+
+.visible-phone {
+ display: none !important;
+}
+
+.visible-tablet {
+ display: none !important;
+}
+
+.hidden-desktop {
+ display: none !important;
+}
+
+.visible-desktop {
+ display: inherit !important;
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+ .hidden-desktop {
+ display: inherit !important;
+ }
+
+ .visible-desktop {
+ display: none !important;
+ }
+
+ .visible-tablet {
+ display: inherit !important;
+ }
+
+ .hidden-tablet {
+ display: none !important;
+ }
+}
+
+@media (max-width: 767px) {
+ .hidden-desktop {
+ display: inherit !important;
+ }
+
+ .visible-desktop {
+ display: none !important;
+ }
+
+ .visible-phone {
+ display: inherit !important;
+ }
+
+ .hidden-phone {
+ display: none !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .row {
+ margin-left: -30px;
+ *zoom: 1;
+ }
+
+ .row:before,
+ .row:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+
+ .row:after {
+ clear: both;
+ }
+
+ [class*="span"] {
+ float: left;
+ min-height: 1px;
+ margin-left: 30px;
+ }
+
+ .container,
+ .navbar-static-top .container,
+ .navbar-fixed-top .container,
+ .navbar-fixed-bottom .container {
+ width: 1170px;
+ }
+
+ .span12 {
+ width: 1170px;
+ }
+
+ .span11 {
+ width: 1070px;
+ }
+
+ .span10 {
+ width: 970px;
+ }
+
+ .span9 {
+ width: 870px;
+ }
+
+ .span8 {
+ width: 770px;
+ }
+
+ .span7 {
+ width: 670px;
+ }
+
+ .span6 {
+ width: 570px;
+ }
+
+ .span5 {
+ width: 470px;
+ }
+
+ .span4 {
+ width: 370px;
+ }
+
+ .span3 {
+ width: 270px;
+ }
+
+ .span2 {
+ width: 170px;
+ }
+
+ .span1 {
+ width: 70px;
+ }
+
+ .offset12 {
+ margin-left: 1230px;
+ }
+
+ .offset11 {
+ margin-left: 1130px;
+ }
+
+ .offset10 {
+ margin-left: 1030px;
+ }
+
+ .offset9 {
+ margin-left: 930px;
+ }
+
+ .offset8 {
+ margin-left: 830px;
+ }
+
+ .offset7 {
+ margin-left: 730px;
+ }
+
+ .offset6 {
+ margin-left: 630px;
+ }
+
+ .offset5 {
+ margin-left: 530px;
+ }
+
+ .offset4 {
+ margin-left: 430px;
+ }
+
+ .offset3 {
+ margin-left: 330px;
+ }
+
+ .offset2 {
+ margin-left: 230px;
+ }
+
+ .offset1 {
+ margin-left: 130px;
+ }
+
+ .row-fluid {
+ width: 100%;
+ *zoom: 1;
+ }
+
+ .row-fluid:before,
+ .row-fluid:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+
+ .row-fluid:after {
+ clear: both;
+ }
+
+ .row-fluid [class*="span"] {
+ display: block;
+ float: left;
+ width: 100%;
+ min-height: 30px;
+ margin-left: 2.564102564102564%;
+ *margin-left: 2.5109110747408616%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+
+ .row-fluid [class*="span"]:first-child {
+ margin-left: 0;
+ }
+
+ .row-fluid .span12 {
+ width: 100%;
+ *width: 99.94680851063829%;
+ }
+
+ .row-fluid .span11 {
+ width: 91.45299145299145%;
+ *width: 91.39979996362975%;
+ }
+
+ .row-fluid .span10 {
+ width: 82.90598290598291%;
+ *width: 82.8527914166212%;
+ }
+
+ .row-fluid .span9 {
+ width: 74.35897435897436%;
+ *width: 74.30578286961266%;
+ }
+
+ .row-fluid .span8 {
+ width: 65.81196581196582%;
+ *width: 65.75877432260411%;
+ }
+
+ .row-fluid .span7 {
+ width: 57.26495726495726%;
+ *width: 57.21176577559556%;
+ }
+
+ .row-fluid .span6 {
+ width: 48.717948717948715%;
+ *width: 48.664757228587014%;
+ }
+
+ .row-fluid .span5 {
+ width: 40.17094017094017%;
+ *width: 40.11774868157847%;
+ }
+
+ .row-fluid .span4 {
+ width: 31.623931623931625%;
+ *width: 31.570740134569924%;
+ }
+
+ .row-fluid .span3 {
+ width: 23.076923076923077%;
+ *width: 23.023731587561375%;
+ }
+
+ .row-fluid .span2 {
+ width: 14.52991452991453%;
+ *width: 14.476723040552828%;
+ }
+
+ .row-fluid .span1 {
+ width: 5.982905982905983%;
+ *width: 5.929714493544281%;
+ }
+
+ .row-fluid .offset12 {
+ margin-left: 105.12820512820512%;
+ *margin-left: 105.02182214948171%;
+ }
+
+ .row-fluid .offset12:first-child {
+ margin-left: 102.56410256410257%;
+ *margin-left: 102.45771958537915%;
+ }
+
+ .row-fluid .offset11 {
+ margin-left: 96.58119658119658%;
+ *margin-left: 96.47481360247316%;
+ }
+
+ .row-fluid .offset11:first-child {
+ margin-left: 94.01709401709402%;
+ *margin-left: 93.91071103837061%;
+ }
+
+ .row-fluid .offset10 {
+ margin-left: 88.03418803418803%;
+ *margin-left: 87.92780505546462%;
+ }
+
+ .row-fluid .offset10:first-child {
+ margin-left: 85.47008547008548%;
+ *margin-left: 85.36370249136206%;
+ }
+
+ .row-fluid .offset9 {
+ margin-left: 79.48717948717949%;
+ *margin-left: 79.38079650845607%;
+ }
+
+ .row-fluid .offset9:first-child {
+ margin-left: 76.92307692307693%;
+ *margin-left: 76.81669394435352%;
+ }
+
+ .row-fluid .offset8 {
+ margin-left: 70.94017094017094%;
+ *margin-left: 70.83378796144753%;
+ }
+
+ .row-fluid .offset8:first-child {
+ margin-left: 68.37606837606839%;
+ *margin-left: 68.26968539734497%;
+ }
+
+ .row-fluid .offset7 {
+ margin-left: 62.393162393162385%;
+ *margin-left: 62.28677941443899%;
+ }
+
+ .row-fluid .offset7:first-child {
+ margin-left: 59.82905982905982%;
+ *margin-left: 59.72267685033642%;
+ }
+
+ .row-fluid .offset6 {
+ margin-left: 53.84615384615384%;
+ *margin-left: 53.739770867430444%;
+ }
+
+ .row-fluid .offset6:first-child {
+ margin-left: 51.28205128205128%;
+ *margin-left: 51.175668303327875%;
+ }
+
+ .row-fluid .offset5 {
+ margin-left: 45.299145299145295%;
+ *margin-left: 45.1927623204219%;
+ }
+
+ .row-fluid .offset5:first-child {
+ margin-left: 42.73504273504273%;
+ *margin-left: 42.62865975631933%;
+ }
+
+ .row-fluid .offset4 {
+ margin-left: 36.75213675213675%;
+ *margin-left: 36.645753773413354%;
+ }
+
+ .row-fluid .offset4:first-child {
+ margin-left: 34.18803418803419%;
+ *margin-left: 34.081651209310785%;
+ }
+
+ .row-fluid .offset3 {
+ margin-left: 28.205128205128204%;
+ *margin-left: 28.0987452264048%;
+ }
+
+ .row-fluid .offset3:first-child {
+ margin-left: 25.641025641025642%;
+ *margin-left: 25.53464266230224%;
+ }
+
+ .row-fluid .offset2 {
+ margin-left: 19.65811965811966%;
+ *margin-left: 19.551736679396257%;
+ }
+
+ .row-fluid .offset2:first-child {
+ margin-left: 17.094017094017094%;
+ *margin-left: 16.98763411529369%;
+ }
+
+ .row-fluid .offset1 {
+ margin-left: 11.11111111111111%;
+ *margin-left: 11.004728132387708%;
+ }
+
+ .row-fluid .offset1:first-child {
+ margin-left: 8.547008547008547%;
+ *margin-left: 8.440625568285142%;
+ }
+
+ input,
+ textarea,
+ .uneditable-input {
+ margin-left: 0;
+ }
+
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 30px;
+ }
+
+ input.span12,
+ textarea.span12,
+ .uneditable-input.span12 {
+ width: 1156px;
+ }
+
+ input.span11,
+ textarea.span11,
+ .uneditable-input.span11 {
+ width: 1056px;
+ }
+
+ input.span10,
+ textarea.span10,
+ .uneditable-input.span10 {
+ width: 956px;
+ }
+
+ input.span9,
+ textarea.span9,
+ .uneditable-input.span9 {
+ width: 856px;
+ }
+
+ input.span8,
+ textarea.span8,
+ .uneditable-input.span8 {
+ width: 756px;
+ }
+
+ input.span7,
+ textarea.span7,
+ .uneditable-input.span7 {
+ width: 656px;
+ }
+
+ input.span6,
+ textarea.span6,
+ .uneditable-input.span6 {
+ width: 556px;
+ }
+
+ input.span5,
+ textarea.span5,
+ .uneditable-input.span5 {
+ width: 456px;
+ }
+
+ input.span4,
+ textarea.span4,
+ .uneditable-input.span4 {
+ width: 356px;
+ }
+
+ input.span3,
+ textarea.span3,
+ .uneditable-input.span3 {
+ width: 256px;
+ }
+
+ input.span2,
+ textarea.span2,
+ .uneditable-input.span2 {
+ width: 156px;
+ }
+
+ input.span1,
+ textarea.span1,
+ .uneditable-input.span1 {
+ width: 56px;
+ }
+
+ .thumbnails {
+ margin-left: -30px;
+ }
+
+ .thumbnails > li {
+ margin-left: 30px;
+ }
+
+ .row-fluid .thumbnails {
+ margin-left: 0;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+ .row {
+ margin-left: -20px;
+ *zoom: 1;
+ }
+
+ .row:before,
+ .row:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+
+ .row:after {
+ clear: both;
+ }
+
+ [class*="span"] {
+ float: left;
+ min-height: 1px;
+ margin-left: 20px;
+ }
+
+ .container,
+ .navbar-static-top .container,
+ .navbar-fixed-top .container,
+ .navbar-fixed-bottom .container {
+ width: 724px;
+ }
+
+ .span12 {
+ width: 724px;
+ }
+
+ .span11 {
+ width: 662px;
+ }
+
+ .span10 {
+ width: 600px;
+ }
+
+ .span9 {
+ width: 538px;
+ }
+
+ .span8 {
+ width: 476px;
+ }
+
+ .span7 {
+ width: 414px;
+ }
+
+ .span6 {
+ width: 352px;
+ }
+
+ .span5 {
+ width: 290px;
+ }
+
+ .span4 {
+ width: 228px;
+ }
+
+ .span3 {
+ width: 166px;
+ }
+
+ .span2 {
+ width: 104px;
+ }
+
+ .span1 {
+ width: 42px;
+ }
+
+ .offset12 {
+ margin-left: 764px;
+ }
+
+ .offset11 {
+ margin-left: 702px;
+ }
+
+ .offset10 {
+ margin-left: 640px;
+ }
+
+ .offset9 {
+ margin-left: 578px;
+ }
+
+ .offset8 {
+ margin-left: 516px;
+ }
+
+ .offset7 {
+ margin-left: 454px;
+ }
+
+ .offset6 {
+ margin-left: 392px;
+ }
+
+ .offset5 {
+ margin-left: 330px;
+ }
+
+ .offset4 {
+ margin-left: 268px;
+ }
+
+ .offset3 {
+ margin-left: 206px;
+ }
+
+ .offset2 {
+ margin-left: 144px;
+ }
+
+ .offset1 {
+ margin-left: 82px;
+ }
+
+ .row-fluid {
+ width: 100%;
+ *zoom: 1;
+ }
+
+ .row-fluid:before,
+ .row-fluid:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+
+ .row-fluid:after {
+ clear: both;
+ }
+
+ .row-fluid [class*="span"] {
+ display: block;
+ float: left;
+ width: 100%;
+ min-height: 30px;
+ margin-left: 2.7624309392265194%;
+ *margin-left: 2.709239449864817%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+
+ .row-fluid [class*="span"]:first-child {
+ margin-left: 0;
+ }
+
+ .row-fluid .span12 {
+ width: 100%;
+ *width: 99.94680851063829%;
+ }
+
+ .row-fluid .span11 {
+ width: 91.43646408839778%;
+ *width: 91.38327259903608%;
+ }
+
+ .row-fluid .span10 {
+ width: 82.87292817679558%;
+ *width: 82.81973668743387%;
+ }
+
+ .row-fluid .span9 {
+ width: 74.30939226519337%;
+ *width: 74.25620077583166%;
+ }
+
+ .row-fluid .span8 {
+ width: 65.74585635359117%;
+ *width: 65.69266486422946%;
+ }
+
+ .row-fluid .span7 {
+ width: 57.18232044198895%;
+ *width: 57.12912895262725%;
+ }
+
+ .row-fluid .span6 {
+ width: 48.61878453038674%;
+ *width: 48.56559304102504%;
+ }
+
+ .row-fluid .span5 {
+ width: 40.05524861878453%;
+ *width: 40.00205712942283%;
+ }
+
+ .row-fluid .span4 {
+ width: 31.491712707182323%;
+ *width: 31.43852121782062%;
+ }
+
+ .row-fluid .span3 {
+ width: 22.92817679558011%;
+ *width: 22.87498530621841%;
+ }
+
+ .row-fluid .span2 {
+ width: 14.3646408839779%;
+ *width: 14.311449394616199%;
+ }
+
+ .row-fluid .span1 {
+ width: 5.801104972375691%;
+ *width: 5.747913483013988%;
+ }
+
+ .row-fluid .offset12 {
+ margin-left: 105.52486187845304%;
+ *margin-left: 105.41847889972962%;
+ }
+
+ .row-fluid .offset12:first-child {
+ margin-left: 102.76243093922652%;
+ *margin-left: 102.6560479605031%;
+ }
+
+ .row-fluid .offset11 {
+ margin-left: 96.96132596685082%;
+ *margin-left: 96.8549429881274%;
+ }
+
+ .row-fluid .offset11:first-child {
+ margin-left: 94.1988950276243%;
+ *margin-left: 94.09251204890089%;
+ }
+
+ .row-fluid .offset10 {
+ margin-left: 88.39779005524862%;
+ *margin-left: 88.2914070765252%;
+ }
+
+ .row-fluid .offset10:first-child {
+ margin-left: 85.6353591160221%;
+ *margin-left: 85.52897613729868%;
+ }
+
+ .row-fluid .offset9 {
+ margin-left: 79.8342541436464%;
+ *margin-left: 79.72787116492299%;
+ }
+
+ .row-fluid .offset9:first-child {
+ margin-left: 77.07182320441989%;
+ *margin-left: 76.96544022569647%;
+ }
+
+ .row-fluid .offset8 {
+ margin-left: 71.2707182320442%;
+ *margin-left: 71.16433525332079%;
+ }
+
+ .row-fluid .offset8:first-child {
+ margin-left: 68.50828729281768%;
+ *margin-left: 68.40190431409427%;
+ }
+
+ .row-fluid .offset7 {
+ margin-left: 62.70718232044199%;
+ *margin-left: 62.600799341718584%;
+ }
+
+ .row-fluid .offset7:first-child {
+ margin-left: 59.94475138121547%;
+ *margin-left: 59.838368402492065%;
+ }
+
+ .row-fluid .offset6 {
+ margin-left: 54.14364640883978%;
+ *margin-left: 54.037263430116376%;
+ }
+
+ .row-fluid .offset6:first-child {
+ margin-left: 51.38121546961326%;
+ *margin-left: 51.27483249088986%;
+ }
+
+ .row-fluid .offset5 {
+ margin-left: 45.58011049723757%;
+ *margin-left: 45.47372751851417%;
+ }
+
+ .row-fluid .offset5:first-child {
+ margin-left: 42.81767955801105%;
+ *margin-left: 42.71129657928765%;
+ }
+
+ .row-fluid .offset4 {
+ margin-left: 37.01657458563536%;
+ *margin-left: 36.91019160691196%;
+ }
+
+ .row-fluid .offset4:first-child {
+ margin-left: 34.25414364640884%;
+ *margin-left: 34.14776066768544%;
+ }
+
+ .row-fluid .offset3 {
+ margin-left: 28.45303867403315%;
+ *margin-left: 28.346655695309746%;
+ }
+
+ .row-fluid .offset3:first-child {
+ margin-left: 25.69060773480663%;
+ *margin-left: 25.584224756083227%;
+ }
+
+ .row-fluid .offset2 {
+ margin-left: 19.88950276243094%;
+ *margin-left: 19.783119783707537%;
+ }
+
+ .row-fluid .offset2:first-child {
+ margin-left: 17.12707182320442%;
+ *margin-left: 17.02068884448102%;
+ }
+
+ .row-fluid .offset1 {
+ margin-left: 11.32596685082873%;
+ *margin-left: 11.219583872105325%;
+ }
+
+ .row-fluid .offset1:first-child {
+ margin-left: 8.56353591160221%;
+ *margin-left: 8.457152932878806%;
+ }
+
+ input,
+ textarea,
+ .uneditable-input {
+ margin-left: 0;
+ }
+
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 20px;
+ }
+
+ input.span12,
+ textarea.span12,
+ .uneditable-input.span12 {
+ width: 710px;
+ }
+
+ input.span11,
+ textarea.span11,
+ .uneditable-input.span11 {
+ width: 648px;
+ }
+
+ input.span10,
+ textarea.span10,
+ .uneditable-input.span10 {
+ width: 586px;
+ }
+
+ input.span9,
+ textarea.span9,
+ .uneditable-input.span9 {
+ width: 524px;
+ }
+
+ input.span8,
+ textarea.span8,
+ .uneditable-input.span8 {
+ width: 462px;
+ }
+
+ input.span7,
+ textarea.span7,
+ .uneditable-input.span7 {
+ width: 400px;
+ }
+
+ input.span6,
+ textarea.span6,
+ .uneditable-input.span6 {
+ width: 338px;
+ }
+
+ input.span5,
+ textarea.span5,
+ .uneditable-input.span5 {
+ width: 276px;
+ }
+
+ input.span4,
+ textarea.span4,
+ .uneditable-input.span4 {
+ width: 214px;
+ }
+
+ input.span3,
+ textarea.span3,
+ .uneditable-input.span3 {
+ width: 152px;
+ }
+
+ input.span2,
+ textarea.span2,
+ .uneditable-input.span2 {
+ width: 90px;
+ }
+
+ input.span1,
+ textarea.span1,
+ .uneditable-input.span1 {
+ width: 28px;
+ }
+}
+
+@media (max-width: 767px) {
+ body {
+ padding-right: 20px;
+ padding-left: 20px;
+ }
+
+ .navbar-fixed-top,
+ .navbar-fixed-bottom,
+ .navbar-static-top {
+ margin-right: -20px;
+ margin-left: -20px;
+ }
+
+ .container-fluid {
+ padding: 0;
+ }
+
+ .dl-horizontal dt {
+ float: none;
+ width: auto;
+ clear: none;
+ text-align: left;
+ }
+
+ .dl-horizontal dd {
+ margin-left: 0;
+ }
+
+ .container {
+ width: auto;
+ }
+
+ .row-fluid {
+ width: 100%;
+ }
+
+ .row,
+ .thumbnails {
+ margin-left: 0;
+ }
+
+ .thumbnails > li {
+ float: none;
+ margin-left: 0;
+ }
+
+ [class*="span"],
+ .row-fluid [class*="span"] {
+ display: block;
+ float: none;
+ width: 100%;
+ margin-left: 0;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+
+ .span12,
+ .row-fluid .span12 {
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+
+ .input-large,
+ .input-xlarge,
+ .input-xxlarge,
+ input[class*="span"],
+ select[class*="span"],
+ textarea[class*="span"],
+ .uneditable-input {
+ display: block;
+ width: 100%;
+ min-height: 30px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+
+ .input-prepend input,
+ .input-append input,
+ .input-prepend input[class*="span"],
+ .input-append input[class*="span"] {
+ display: inline-block;
+ width: auto;
+ }
+
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 0;
+ }
+
+ .modal {
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ left: 20px;
+ width: auto;
+ margin: 0;
+ }
+
+ .modal.fade.in {
+ top: auto;
+ }
+}
+
+@media (max-width: 480px) {
+ .nav-collapse {
+ -webkit-transform: translate3d(0, 0, 0);
+ }
+
+ .page-header h1 small {
+ display: block;
+ line-height: 20px;
+ }
+
+ input[type="checkbox"],
+ input[type="radio"] {
+ border: 1px solid #ccc;
+ }
+
+ .form-horizontal .control-label {
+ float: none;
+ width: auto;
+ padding-top: 0;
+ text-align: left;
+ }
+
+ .form-horizontal .controls {
+ margin-left: 0;
+ }
+
+ .form-horizontal .control-list {
+ padding-top: 0;
+ }
+
+ .form-horizontal .form-actions {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+
+ .modal {
+ top: 10px;
+ right: 10px;
+ left: 10px;
+ }
+
+ .modal-header .close {
+ padding: 10px;
+ margin: -10px;
+ }
+
+ .carousel-caption {
+ position: static;
+ }
+}
+
+@media (max-width: 979px) {
+ body {
+ padding-top: 0;
+ }
+
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ position: static;
+ }
+
+ .navbar-fixed-top {
+ margin-bottom: 20px;
+ }
+
+ .navbar-fixed-bottom {
+ margin-top: 20px;
+ }
+
+ .navbar-fixed-top .navbar-inner,
+ .navbar-fixed-bottom .navbar-inner {
+ padding: 5px;
+ }
+
+ .navbar .container {
+ width: auto;
+ padding: 0;
+ }
+
+ .navbar .brand {
+ padding-right: 10px;
+ padding-left: 10px;
+ margin: 0 0 0 -5px;
+ }
+
+ .nav-collapse {
+ clear: both;
+ }
+
+ .nav-collapse .nav {
+ float: none;
+ margin: 0 0 10px;
+ }
+
+ .nav-collapse .nav > li {
+ float: none;
+ }
+
+ .nav-collapse .nav > li > a {
+ margin-bottom: 2px;
+ }
+
+ .nav-collapse .nav > .divider-vertical {
+ display: none;
+ }
+
+ .nav-collapse .nav .nav-header {
+ color: #777777;
+ text-shadow: none;
+ }
+
+ .nav-collapse .nav > li > a,
+ .nav-collapse .dropdown-menu a {
+ padding: 9px 15px;
+ font-weight: bold;
+ color: #777777;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ }
+
+ .nav-collapse .btn {
+ padding: 4px 10px 4px;
+ font-weight: normal;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ }
+
+ .nav-collapse .dropdown-menu li + li a {
+ margin-bottom: 2px;
+ }
+
+ .nav-collapse .nav > li > a:hover,
+ .nav-collapse .dropdown-menu a:hover {
+ background-color: #f2f2f2;
+ }
+
+ .navbar-inverse .nav-collapse .nav > li > a:hover,
+ .navbar-inverse .nav-collapse .dropdown-menu a:hover {
+ background-color: #111111;
+ }
+
+ .nav-collapse.in .btn-group {
+ padding: 0;
+ margin-top: 5px;
+ }
+
+ .nav-collapse .dropdown-menu {
+ position: static;
+ top: auto;
+ left: auto;
+ display: block;
+ float: none;
+ max-width: none;
+ padding: 0;
+ margin: 0 15px;
+ background-color: transparent;
+ border: none;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ }
+
+ .nav-collapse .dropdown-menu:before,
+ .nav-collapse .dropdown-menu:after {
+ display: none;
+ }
+
+ .nav-collapse .dropdown-menu .divider {
+ display: none;
+ }
+
+ .nav-collapse .nav > li > .dropdown-menu:before,
+ .nav-collapse .nav > li > .dropdown-menu:after {
+ display: none;
+ }
+
+ .nav-collapse .navbar-form,
+ .nav-collapse .navbar-search {
+ float: none;
+ padding: 10px 15px;
+ margin: 10px 0;
+ border-top: 1px solid #f2f2f2;
+ border-bottom: 1px solid #f2f2f2;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ }
+
+ .navbar-inverse .nav-collapse .navbar-form,
+ .navbar-inverse .nav-collapse .navbar-search {
+ border-top-color: #111111;
+ border-bottom-color: #111111;
+ }
+
+ .navbar .nav-collapse .nav.pull-right {
+ float: none;
+ margin-left: 0;
+ }
+
+ .nav-collapse,
+ .nav-collapse.collapse {
+ height: 0;
+ overflow: hidden;
+ }
+
+ .navbar .btn-navbar {
+ display: block;
+ }
+
+ .navbar-static .navbar-inner {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .nav-collapse.collapse {
+ height: auto !important;
+ overflow: visible !important;
+ }
+}