http://git-wip-us.apache.org/repos/asf/tomee/blob/b2d2cc08/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..b1a7e99 --- /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.tomee</groupId> + <artifactId>openejb-core</artifactId> + <version>7.0.5-SNAPSHOT</version> + <scope>test</scope> + </dependency> + </dependencies> +</project>
http://git-wip-us.apache.org/repos/asf/tomee/blob/b2d2cc08/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/b2d2cc08/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/b2d2cc08/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/b2d2cc08/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..c21a380 --- /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.tomee</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/b2d2cc08/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/b2d2cc08/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/b2d2cc08/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/b2d2cc08/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/b2d2cc08/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..414d8fa --- /dev/null +++ b/examples/simple-ear/moviefun-functional-tests/pom.xml @@ -0,0 +1,143 @@ +<?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.tomee</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> + <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.tomee</groupId> + <artifactId>openejb-core</artifactId> + <version>7.0.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.tomee</groupId> + <artifactId>tomee-embedded</artifactId> + <version>7.0.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.tomee</groupId> + <artifactId>arquillian-tomee-remote</artifactId> + <version>7.0.5-SNAPSHOT</version> + <scope>test</scope> + </dependency> + </dependencies> +</project> http://git-wip-us.apache.org/repos/asf/tomee/blob/b2d2cc08/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..1d5658e --- /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.tomee"); + configuration.setArtifactId("apache-tomee"); + configuration.setClassifier("plus"); + configuration.setVersion("7.0.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/b2d2cc08/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/b2d2cc08/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/b2d2cc08/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/b2d2cc08/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..d070c32 --- /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.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> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>jstl</artifactId> + <version>1.2</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.tomee</groupId> + <artifactId>openejb-core</artifactId> + <version>7.0.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/b2d2cc08/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/b2d2cc08/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/b2d2cc08/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/b2d2cc08/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; + } +}
