Author: dan.j.allen
Date: 2010-08-20 17:35:21 -0400 (Fri, 20 Aug 2010)
New Revision: 7002
Added:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/controller/
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/controller/MemberRegistration.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/MemberListProducer.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/MemberRepository.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/MemberRepositoryProducer.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/SeedDataImporter.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/model/
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/model/Member.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/rest/
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/rest/JaxRsActivator.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/rest/MemberResourceRESTService.java
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/test/
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/test/MavenArtifactResolver.java
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/test/MemberRegistrationTest.java
Removed:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/JaxRsActivator.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/Member.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberListProducer.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRegistration.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRepository.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRepositoryProducer.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberResourceRESTService.java
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/SeedDataImporter.java
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/MavenArtifactResolver.java
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/MemberRegistrationTest.java
Modified:
archetypes/javaee6-webapp/trunk/pom.xml
Log:
introduce package structure
Modified: archetypes/javaee6-webapp/trunk/pom.xml
===================================================================
--- archetypes/javaee6-webapp/trunk/pom.xml 2010-08-20 21:31:58 UTC (rev 7001)
+++ archetypes/javaee6-webapp/trunk/pom.xml 2010-08-20 21:35:21 UTC (rev 7002)
@@ -149,11 +149,9 @@
<configuration>
<compilerArgument>-proc:only</compilerArgument>
<!-- If your app has multiple packages, use this include filter
to execute the processor only on the package containing your entities -->
- <!--
<includes>
<include>**/model/*.java</include>
</includes>
- -->
</configuration>
<goals>
<goal>compile</goal>
Deleted: archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/JaxRsActivator.java
===================================================================
---
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/JaxRsActivator.java 2010-08-20
21:31:58 UTC (rev 7001)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/JaxRsActivator.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -1,41 +0,0 @@
-package com.mycompany;
-
-import javax.ws.rs.ApplicationPath;
-import javax.ws.rs.core.Application;
-
-/**
- * A class extending {@link Application} and annotated with @ApplicationPath
- * is the Java EE 6 "no XML" approach to activating JAX-RS.
- *
- * <p>Resources are served relative to the servlet path specified in the {@link
- * ApplicationPath} annotation.</p>
- *
- * <p><strong>NOTE</strong><br/>The following modifications are
required to get
- * JAX-RS working on JBoss AS 6.0.0.M4:</p>
- *
- * <ol>
- * <li>Remove (or comment out) the <code>extends Application</code>
clause on this class</li>
- * <li>Remove (or comment out) the <code>@ApplicationPath</code>
annotation on this class</li>
- * <li>Open up web.xml and add the following XML snippet:
- * <pre>
- * <context-param>
- * <param-name>resteasy.scan</param-name>
- * <param-value>true</param-value>
- * </context-param>
-
- * <context-param>
- *
<param-name>resteasy.servlet.mapping.prefix</param-name>
- * <param-value>/rest</param-value>
- * </context-param>
- * </pre>
- * <p>The mapping prefix should match the value that was in the
- * <code>@ApplicationPath</code> annotation, prepended with a forward slash
(/)
- * if not already present.</p>
- * </li>
- * </ol>
- */
-@ApplicationPath("/rest")
-public class JaxRsActivator extends Application
-{
- /* class body intentionally left blank */
-}
Deleted: archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/Member.java
===================================================================
--- archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/Member.java 2010-08-20
21:31:58 UTC (rev 7001)
+++ archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/Member.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -1,83 +0,0 @@
-package com.mycompany;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-import javax.validation.constraints.Digits;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
-import javax.validation.constraints.Size;
-import javax.xml.bind.annotation.XmlRootElement;
-import org.hibernate.validator.constraints.Email;
-import org.hibernate.validator.constraints.NotEmpty;
-
-@Entity
-@XmlRootElement
-@Table(uniqueConstraints = @UniqueConstraint(columnNames = "email"))
-public class Member implements Serializable
-{
- private Long id;
- private String name;
- private String email;
- private String phoneNumber;
-
- @Id
- @GeneratedValue
- public Long getId()
- {
- return id;
- }
-
- public void setId(Long id)
- {
- this.id = id;
- }
-
- @NotNull
- @Size(min = 1, max = 25)
- @Pattern(regexp = "[A-Za-z ]*", message = "must contain only letters
and spaces")
- public String getName()
- {
- return name;
- }
-
- public void setName(String name)
- {
- this.name = name;
- }
-
- @NotNull
- @NotEmpty
- @Email
- public String getEmail()
- {
- return email;
- }
-
- public void setEmail(String email)
- {
- this.email = email;
- }
-
- @NotNull
- @Size(min = 10, max = 12)
- @Digits(fraction = 0, integer = 12)
- @Column(name = "phone_number")
- public String getPhoneNumber()
- {
- return phoneNumber;
- }
-
- public void setPhoneNumber(String phoneNumber)
- {
- this.phoneNumber = phoneNumber;
- }
-
- /** Default value included to remove warning. Remove or modify at will. */
- private static final long serialVersionUID = 1L;
-}
\ No newline at end of file
Deleted:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberListProducer.java
===================================================================
---
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberListProducer.java 2010-08-20
21:31:58 UTC (rev 7001)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberListProducer.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -1,50 +0,0 @@
-package com.mycompany;
-
-import java.util.List;
-import javax.annotation.PostConstruct;
-import javax.enterprise.context.RequestScoped;
-import javax.enterprise.event.Observes;
-import javax.enterprise.event.Reception;
-
-import javax.enterprise.inject.Produces;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.persistence.EntityManager;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
-
-@RequestScoped
-public class MemberListProducer
-{
- @Inject
- @MemberRepository
- private EntityManager em;
-
- private List<Member> members;
-
- // The @Named annotation allows us to access the return value via the EL variable name
"member" in the UI (e.g., Facelets or JSP view)
- @Produces
- @Named
- public List<Member> getMembers()
- {
- return members;
- }
-
- public void onMemberListChanged(@Observes(notifyObserver = Reception.IF_EXISTS) final
Member member)
- {
- retrieveAllMembersOrderedByName();
- }
-
- @PostConstruct
- public void retrieveAllMembersOrderedByName()
- {
- CriteriaBuilder cb = em.getCriteriaBuilder();
- CriteriaQuery<Member> criteria = cb.createQuery(Member.class);
- Root<Member> member = criteria.from(Member.class);
- // Uncomment if you would like to try out typesafe criteria queries, a new feature
in JPA 2.0
- // criteria.select(member).orderBy(cb.asc(member.get(Member_.name)));
- criteria.select(member).orderBy(cb.asc(member.get("name")));
- members = em.createQuery(criteria).getResultList();
- }
-}
Deleted:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRegistration.java
===================================================================
---
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRegistration.java 2010-08-20
21:31:58 UTC (rev 7001)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRegistration.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -1,59 +0,0 @@
-package com.mycompany;
-
-import javax.annotation.PostConstruct;
-import javax.enterprise.event.Event;
-import javax.enterprise.inject.Model;
-import javax.enterprise.inject.Produces;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.persistence.EntityManager;
-import javax.transaction.UserTransaction;
-import org.slf4j.Logger;
-
-// Adding the @Stateful annotation eliminates need for manual transaction demarcation
-// @javax.ejb.Stateful
-// The @Model stereotype is a convenience mechanism to make this a request-scoped bean
that has an EL name
-// Read more about the @Model stereotype in this FAQ:
http://seamframework.org/Documentation/WhatIsThePurposeOfTheModelAnnotation
-@Model
-public class MemberRegistration
-{
- @Inject
- private Logger log;
-
- @Inject
- @MemberRepository
- private EntityManager em;
-
- @Inject
- private UserTransaction utx;
-
- @Inject
- private Event<Member> memberEventSrc;
-
- private Member newMember;
-
- @Produces
- @Named
- public Member getNewMember()
- {
- return newMember;
- }
-
- public void register() throws Exception
- {
- log.info("Registering " + newMember.getName());
- // UserTransaction only needed when bean is not an EJB
- utx.begin();
- em.joinTransaction();
- em.persist(newMember);
- utx.commit();
- memberEventSrc.fire(newMember);
- initNewMember();
- }
-
- @PostConstruct
- public void initNewMember()
- {
- newMember = new Member();
- }
-}
Deleted:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRepository.java
===================================================================
---
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRepository.java 2010-08-20
21:31:58 UTC (rev 7001)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRepository.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -1,21 +0,0 @@
-package com.mycompany;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import javax.inject.Qualifier;
-
-/**
- * A qualifier used to differentiate between multiple data repositories.
- *
- * If you only have 1 EntityManager, this annotation is optional
- */
-@Qualifier
-@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
-(a)Retention(RetentionPolicy.RUNTIME)
-public @interface MemberRepository
-{
- /* class body intentionally left blank */
-}
Deleted:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRepositoryProducer.java
===================================================================
---
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRepositoryProducer.java 2010-08-20
21:31:58 UTC (rev 7001)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRepositoryProducer.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -1,20 +0,0 @@
-package com.mycompany;
-
-import javax.enterprise.inject.Produces;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-
-/**
- * This class uses CDI to produce EntityManager instances qualified that are
- * qualified as @MemberRepository. Therefore, to inject an instance, @Inject
- * must be followed by @MemberRepository.
- */
-public class MemberRepositoryProducer
-{
- // use @SuppressWarnings to tell IDE to ignore warnings about field not being
referenced directly
- @SuppressWarnings("unused")
- @Produces
- @MemberRepository
- @PersistenceContext
- private EntityManager em;
-}
Deleted:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberResourceRESTService.java
===================================================================
---
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberResourceRESTService.java 2010-08-20
21:31:58 UTC (rev 7001)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberResourceRESTService.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -1,41 +0,0 @@
-package com.mycompany;
-
-import java.util.List;
-import javax.enterprise.context.RequestScoped;
-import javax.inject.Inject;
-import javax.persistence.EntityManager;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-
-/**
- * JAX-RS Example
- *
- * This class produces a RESTful service to read the contents of the members table.
- */
-@Path("/members")
-@RequestScoped
-public class MemberResourceRESTService
-{
- @Inject
- @MemberRepository
- private EntityManager em;
-
- @GET
- public List<Member> listAllMembers()
- {
- // Use @SupressWarnings to force IDE to ignore warnings about
"genericizing" the results of this query
- @SuppressWarnings("unchecked")
- // We recommend centralizing inline queries such as this one into @NamedQuery
annotations on the @Entity class
- // as described in the named query blueprint:
https://blueprints.dev.java.net/bpcatalog/ee5/persistence/namedquery.html
- final List<Member> results = em.createQuery("select m from Member m
order by m.name").getResultList();
- return results;
- }
-
- @GET
- @Path("/{id:[1-9][0-9]*}")
- public Member lookupMemberById(@PathParam("id") long id)
- {
- return em.find(Member.class, id);
- }
-}
Deleted:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/SeedDataImporter.java
===================================================================
---
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/SeedDataImporter.java 2010-08-20
21:31:58 UTC (rev 7001)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/SeedDataImporter.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -1,60 +0,0 @@
-package com.mycompany;
-
-import javax.annotation.PostConstruct;
-import javax.ejb.Singleton;
-import javax.ejb.Startup;
-import javax.inject.Inject;
-import javax.persistence.EntityManager;
-import javax.persistence.TransactionRequiredException;
-import javax.transaction.UserTransaction;
-import org.slf4j.Logger;
-
-/**
- * Import seed data into the database on application startup using
- * a startup singleton EJB.
- *
- * @author Dan Allen
- */
-@Startup
-@Singleton
-public class SeedDataImporter
-{
- @Inject
- private Logger log;
-
- @Inject
- @MemberRepository
- private EntityManager em;
-
- @Inject
- private UserTransaction tx;
-
- @PostConstruct
- public void importData()
- {
- Member member1 = new Member();
- member1.setName("John Smith");
- member1.setEmail("john.smith(a)mailinator.com");
- member1.setPhoneNumber("2125551212");
- try
- {
- try
- {
- em.persist(member1);
- }
- catch (TransactionRequiredException e)
- {
- // manual transaction control required in @PostConstruct method
- // only use if enforced by JPA provider (due to bug in GlassFish)
- tx.begin();
- em.persist(member1);
- tx.commit();
- }
- log.info("Successfully imported seed data.");
- }
- catch (Exception e)
- {
- log.warn("Seed data import failed.", e);
- }
- }
-}
Copied:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/controller/MemberRegistration.java
(from rev 6888,
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRegistration.java)
===================================================================
---
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/controller/MemberRegistration.java
(rev 0)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/controller/MemberRegistration.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -0,0 +1,61 @@
+package com.mycompany.controller;
+
+import com.mycompany.data.MemberRepository;
+import com.mycompany.model.Member;
+import javax.annotation.PostConstruct;
+import javax.enterprise.event.Event;
+import javax.enterprise.inject.Model;
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.persistence.EntityManager;
+import javax.transaction.UserTransaction;
+import org.slf4j.Logger;
+
+// Adding the @Stateful annotation eliminates need for manual transaction demarcation
+// @javax.ejb.Stateful
+// The @Model stereotype is a convenience mechanism to make this a request-scoped bean
that has an EL name
+// Read more about the @Model stereotype in this FAQ:
http://seamframework.org/Documentation/WhatIsThePurposeOfTheModelAnnotation
+@Model
+public class MemberRegistration
+{
+ @Inject
+ private Logger log;
+
+ @Inject
+ @MemberRepository
+ private EntityManager em;
+
+ @Inject
+ private UserTransaction utx;
+
+ @Inject
+ private Event<Member> memberEventSrc;
+
+ private Member newMember;
+
+ @Produces
+ @Named
+ public Member getNewMember()
+ {
+ return newMember;
+ }
+
+ public void register() throws Exception
+ {
+ log.info("Registering " + newMember.getName());
+ // UserTransaction only needed when bean is not an EJB
+ utx.begin();
+ em.joinTransaction();
+ em.persist(newMember);
+ utx.commit();
+ memberEventSrc.fire(newMember);
+ initNewMember();
+ }
+
+ @PostConstruct
+ public void initNewMember()
+ {
+ newMember = new Member();
+ }
+}
Copied:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/MemberListProducer.java
(from rev 6886,
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberListProducer.java)
===================================================================
---
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/MemberListProducer.java
(rev 0)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/MemberListProducer.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -0,0 +1,51 @@
+package com.mycompany.data;
+
+import com.mycompany.model.Member;
+import java.util.List;
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.event.Observes;
+import javax.enterprise.event.Reception;
+
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
+
+@RequestScoped
+public class MemberListProducer
+{
+ @Inject
+ @MemberRepository
+ private EntityManager em;
+
+ private List<Member> members;
+
+ // The @Named annotation allows us to access the return value via the EL variable name
"member" in the UI (e.g., Facelets or JSP view)
+ @Produces
+ @Named
+ public List<Member> getMembers()
+ {
+ return members;
+ }
+
+ public void onMemberListChanged(@Observes(notifyObserver = Reception.IF_EXISTS) final
Member member)
+ {
+ retrieveAllMembersOrderedByName();
+ }
+
+ @PostConstruct
+ public void retrieveAllMembersOrderedByName()
+ {
+ CriteriaBuilder cb = em.getCriteriaBuilder();
+ CriteriaQuery<Member> criteria = cb.createQuery(Member.class);
+ Root<Member> member = criteria.from(Member.class);
+ // Uncomment if you would like to try out typesafe criteria queries, a new feature
in JPA 2.0
+ // criteria.select(member).orderBy(cb.asc(member.get(Member_.name)));
+ criteria.select(member).orderBy(cb.asc(member.get("name")));
+ members = em.createQuery(criteria).getResultList();
+ }
+}
Copied:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/MemberRepository.java
(from rev 6882,
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRepository.java)
===================================================================
---
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/MemberRepository.java
(rev 0)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/MemberRepository.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -0,0 +1,21 @@
+package com.mycompany.data;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.inject.Qualifier;
+
+/**
+ * A qualifier used to differentiate between multiple data repositories.
+ *
+ * If you only have 1 EntityManager, this annotation is optional
+ */
+@Qualifier
+@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
+(a)Retention(RetentionPolicy.RUNTIME)
+public @interface MemberRepository
+{
+ /* class body intentionally left blank */
+}
Copied:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/MemberRepositoryProducer.java
(from rev 6885,
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberRepositoryProducer.java)
===================================================================
---
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/MemberRepositoryProducer.java
(rev 0)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/MemberRepositoryProducer.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -0,0 +1,20 @@
+package com.mycompany.data;
+
+import javax.enterprise.inject.Produces;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+/**
+ * This class uses CDI to produce EntityManager instances qualified that are
+ * qualified as @MemberRepository. Therefore, to inject an instance, @Inject
+ * must be followed by @MemberRepository.
+ */
+public class MemberRepositoryProducer
+{
+ // use @SuppressWarnings to tell IDE to ignore warnings about field not being
referenced directly
+ @SuppressWarnings("unused")
+ @Produces
+ @MemberRepository
+ @PersistenceContext
+ private EntityManager em;
+}
Copied:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/SeedDataImporter.java
(from rev 6998,
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/SeedDataImporter.java)
===================================================================
---
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/SeedDataImporter.java
(rev 0)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/data/SeedDataImporter.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -0,0 +1,61 @@
+package com.mycompany.data;
+
+import com.mycompany.model.Member;
+import javax.annotation.PostConstruct;
+import javax.ejb.Singleton;
+import javax.ejb.Startup;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.TransactionRequiredException;
+import javax.transaction.UserTransaction;
+import org.slf4j.Logger;
+
+/**
+ * Import seed data into the database on application startup using
+ * a startup singleton EJB.
+ *
+ * @author Dan Allen
+ */
+@Startup
+@Singleton
+public class SeedDataImporter
+{
+ @Inject
+ private Logger log;
+
+ @Inject
+ @MemberRepository
+ private EntityManager em;
+
+ @Inject
+ private UserTransaction tx;
+
+ @PostConstruct
+ public void importData()
+ {
+ Member member1 = new Member();
+ member1.setName("John Smith");
+ member1.setEmail("john.smith(a)mailinator.com");
+ member1.setPhoneNumber("2125551212");
+ try
+ {
+ try
+ {
+ em.persist(member1);
+ }
+ catch (TransactionRequiredException e)
+ {
+ // manual transaction control required in @PostConstruct method
+ // only use if enforced by JPA provider (due to bug in GlassFish)
+ tx.begin();
+ em.persist(member1);
+ tx.commit();
+ }
+ log.info("Successfully imported seed data.");
+ }
+ catch (Exception e)
+ {
+ log.warn("Seed data import failed.", e);
+ }
+ }
+}
Copied: archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/model/Member.java
(from rev 6882, archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/Member.java)
===================================================================
--- archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/model/Member.java
(rev 0)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/model/Member.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -0,0 +1,83 @@
+package com.mycompany.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+import javax.validation.constraints.Digits;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import javax.xml.bind.annotation.XmlRootElement;
+import org.hibernate.validator.constraints.Email;
+import org.hibernate.validator.constraints.NotEmpty;
+
+@Entity
+@XmlRootElement
+@Table(uniqueConstraints = @UniqueConstraint(columnNames = "email"))
+public class Member implements Serializable
+{
+ private Long id;
+ private String name;
+ private String email;
+ private String phoneNumber;
+
+ @Id
+ @GeneratedValue
+ public Long getId()
+ {
+ return id;
+ }
+
+ public void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ @NotNull
+ @Size(min = 1, max = 25)
+ @Pattern(regexp = "[A-Za-z ]*", message = "must contain only letters
and spaces")
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ @NotNull
+ @NotEmpty
+ @Email
+ public String getEmail()
+ {
+ return email;
+ }
+
+ public void setEmail(String email)
+ {
+ this.email = email;
+ }
+
+ @NotNull
+ @Size(min = 10, max = 12)
+ @Digits(fraction = 0, integer = 12)
+ @Column(name = "phone_number")
+ public String getPhoneNumber()
+ {
+ return phoneNumber;
+ }
+
+ public void setPhoneNumber(String phoneNumber)
+ {
+ this.phoneNumber = phoneNumber;
+ }
+
+ /** Default value included to remove warning. Remove or modify at will. */
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
Copied:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/rest/JaxRsActivator.java (from
rev 7000,
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/JaxRsActivator.java)
===================================================================
--- archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/rest/JaxRsActivator.java
(rev 0)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/rest/JaxRsActivator.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -0,0 +1,41 @@
+package com.mycompany.rest;
+
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+/**
+ * A class extending {@link Application} and annotated with @ApplicationPath
+ * is the Java EE 6 "no XML" approach to activating JAX-RS.
+ *
+ * <p>Resources are served relative to the servlet path specified in the {@link
+ * ApplicationPath} annotation.</p>
+ *
+ * <p><strong>NOTE</strong><br/>The following modifications are
required to get
+ * JAX-RS working on JBoss AS 6.0.0.M4:</p>
+ *
+ * <ol>
+ * <li>Remove (or comment out) the <code>extends Application</code>
clause on this class</li>
+ * <li>Remove (or comment out) the <code>@ApplicationPath</code>
annotation on this class</li>
+ * <li>Open up web.xml and add the following XML snippet:
+ * <pre>
+ * <context-param>
+ * <param-name>resteasy.scan</param-name>
+ * <param-value>true</param-value>
+ * </context-param>
+
+ * <context-param>
+ *
<param-name>resteasy.servlet.mapping.prefix</param-name>
+ * <param-value>/rest</param-value>
+ * </context-param>
+ * </pre>
+ * <p>The mapping prefix should match the value that was in the
+ * <code>@ApplicationPath</code> annotation, prepended with a forward slash
(/)
+ * if not already present.</p>
+ * </li>
+ * </ol>
+ */
+@ApplicationPath("/rest")
+public class JaxRsActivator extends Application
+{
+ /* class body intentionally left blank */
+}
Copied:
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/rest/MemberResourceRESTService.java
(from rev 6990,
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/MemberResourceRESTService.java)
===================================================================
---
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/rest/MemberResourceRESTService.java
(rev 0)
+++
archetypes/javaee6-webapp/trunk/src/main/java/com/mycompany/rest/MemberResourceRESTService.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -0,0 +1,43 @@
+package com.mycompany.rest;
+
+import com.mycompany.model.Member;
+import com.mycompany.data.MemberRepository;
+import java.util.List;
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+
+/**
+ * JAX-RS Example
+ *
+ * This class produces a RESTful service to read the contents of the members table.
+ */
+@Path("/members")
+@RequestScoped
+public class MemberResourceRESTService
+{
+ @Inject
+ @MemberRepository
+ private EntityManager em;
+
+ @GET
+ public List<Member> listAllMembers()
+ {
+ // Use @SupressWarnings to force IDE to ignore warnings about
"genericizing" the results of this query
+ @SuppressWarnings("unchecked")
+ // We recommend centralizing inline queries such as this one into @NamedQuery
annotations on the @Entity class
+ // as described in the named query blueprint:
https://blueprints.dev.java.net/bpcatalog/ee5/persistence/namedquery.html
+ final List<Member> results = em.createQuery("select m from Member m
order by m.name").getResultList();
+ return results;
+ }
+
+ @GET
+ @Path("/{id:[1-9][0-9]*}")
+ public Member lookupMemberById(@PathParam("id") long id)
+ {
+ return em.find(Member.class, id);
+ }
+}
Deleted:
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/MavenArtifactResolver.java
===================================================================
---
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/MavenArtifactResolver.java 2010-08-20
21:31:58 UTC (rev 7001)
+++
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/MavenArtifactResolver.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -1,64 +0,0 @@
-package com.mycompany;
-
-import java.io.File;
-
-/**
- * A temporary resolver that converts a Maven artifact reference
- * into a {@link java.io.File} object.
- *
- * <p>This approach is an interim solution for Maven projects
- * until the open feature request to add formally add artifacts
- * to a test (<a
href="https://jira.jboss.org/browse/ARQ-66">ARQ-66</a>) is
implementated.</p>
- *
- * <p>The testCompile goal will resolve any test dependencies and
- * put them in your local Maven repository. By the time the test
- * executes, you can be sure that the JAR files you need will be
- * in your local repository.</p>
- *
- * <p>Example usage:</p>
- *
- * <pre>
- * WebArchive war = ShrinkWrap.create("test.war", WebArchive.class)
- *
.addLibrary(MavenArtifactResolver.resolve("commons-lang:commons-lang:2.5"));
- * </pre>
-
- * <p>If you are using an alternate local Maven repository, you need to pass it
- * to the Maven surefire plugin using the following stanza in the plugin
- * configuration element:</p>
- *
- * <pre>
- * <systemProperties>
- * <property>
- * <name>maven.repo.local</name>
- * <value>${maven.repo.local}</value>
- * </property>
- * </systemProperties>
- * </pre>
- *
- * <p>Another approach to pull in a library is to add packages recursively from
the
- * root library package.</p>
- *
- * @author Dan Allen
- */
-public class MavenArtifactResolver
-{
- private static final String LOCAL_MAVEN_REPO =
- System.getProperty("maven.repo.local") != null ?
System.getProperty("maven.repo.local") :
- (System.getProperty("user.home") + File.separatorChar +
- ".m2" + File.separatorChar + "repository");
-
- public static File resolve(String groupId, String artifactId, String version)
- {
- return new File(LOCAL_MAVEN_REPO + File.separatorChar +
- groupId.replace(".", File.separator) + File.separatorChar +
- artifactId + File.separatorChar +
- version + File.separatorChar +
- artifactId + "-" + version + ".jar");
- }
-
- public static File resolve(String qualifiedArtifactId)
- {
- String[] segments = qualifiedArtifactId.split(":");
- return resolve(segments[0], segments[1], segments[2]);
- }
-}
Deleted:
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/MemberRegistrationTest.java
===================================================================
---
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/MemberRegistrationTest.java 2010-08-20
21:31:58 UTC (rev 7001)
+++
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/MemberRegistrationTest.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -1,55 +0,0 @@
-package com.mycompany;
-
-import javax.enterprise.inject.Produces;
-import javax.enterprise.inject.spi.InjectionPoint;
-import static org.junit.Assert.*;
-import javax.inject.Inject;
-import org.jboss.arquillian.api.Deployment;
-import org.jboss.arquillian.junit.Arquillian;
-import org.jboss.shrinkwrap.api.ShrinkWrap;
-import org.jboss.shrinkwrap.api.Archive;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
-import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-(a)RunWith(Arquillian.class)
-public class MemberRegistrationTest
-{
- @Deployment
- public static Archive<?> createTestArchive() {
- return ShrinkWrap.create(WebArchive.class, "test.war")
- .addClasses(Member.class, MemberRegistration.class, MemberRepository.class,
MemberRepositoryProducer.class)
- // SLF4J libraries required only if not available on the container classpath
-// .addLibraries(
-// MavenArtifactResolver.resolve("org.slf4j:slf4j-api:1.5.10"),
-// MavenArtifactResolver.resolve("org.slf4j:slf4j-jdk14:1.5.10")
-// )
- .addWebResource("test-persistence.xml",
"classes/META-INF/persistence.xml")
- .addWebResource(new ByteArrayAsset(new byte[0]), "beans.xml");
- }
-
- @Inject MemberRegistration memberRegistration;
-
- @Inject Logger log;
-
- @Test
- public void testRegister() throws Exception
- {
- Member newMember = memberRegistration.getNewMember();
- newMember.setName("Jane Doe");
- newMember.setEmail("jane(a)mailinator.com");
- newMember.setPhoneNumber("2125551234");
- memberRegistration.register();
- assertNotNull(newMember.getId());
- log.info(newMember.getName() + " was persisted with id " +
newMember.getId());
- }
-
- @Produces
- public Logger produceLog(InjectionPoint injectionPoint)
- {
- return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass());
- }
-}
Copied:
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/test/MavenArtifactResolver.java
(from rev 6882,
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/MavenArtifactResolver.java)
===================================================================
---
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/test/MavenArtifactResolver.java
(rev 0)
+++
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/test/MavenArtifactResolver.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -0,0 +1,64 @@
+package com.mycompany.test;
+
+import java.io.File;
+
+/**
+ * A temporary resolver that converts a Maven artifact reference
+ * into a {@link java.io.File} object.
+ *
+ * <p>This approach is an interim solution for Maven projects
+ * until the open feature request to add formally add artifacts
+ * to a test (<a
href="https://jira.jboss.org/browse/ARQ-66">ARQ-66</a>) is
implementated.</p>
+ *
+ * <p>The testCompile goal will resolve any test dependencies and
+ * put them in your local Maven repository. By the time the test
+ * executes, you can be sure that the JAR files you need will be
+ * in your local repository.</p>
+ *
+ * <p>Example usage:</p>
+ *
+ * <pre>
+ * WebArchive war = ShrinkWrap.create("test.war", WebArchive.class)
+ *
.addLibrary(MavenArtifactResolver.resolve("commons-lang:commons-lang:2.5"));
+ * </pre>
+
+ * <p>If you are using an alternate local Maven repository, you need to pass it
+ * to the Maven surefire plugin using the following stanza in the plugin
+ * configuration element:</p>
+ *
+ * <pre>
+ * <systemProperties>
+ * <property>
+ * <name>maven.repo.local</name>
+ * <value>${maven.repo.local}</value>
+ * </property>
+ * </systemProperties>
+ * </pre>
+ *
+ * <p>Another approach to pull in a library is to add packages recursively from
the
+ * root library package.</p>
+ *
+ * @author Dan Allen
+ */
+public class MavenArtifactResolver
+{
+ private static final String LOCAL_MAVEN_REPO =
+ System.getProperty("maven.repo.local") != null ?
System.getProperty("maven.repo.local") :
+ (System.getProperty("user.home") + File.separatorChar +
+ ".m2" + File.separatorChar + "repository");
+
+ public static File resolve(String groupId, String artifactId, String version)
+ {
+ return new File(LOCAL_MAVEN_REPO + File.separatorChar +
+ groupId.replace(".", File.separator) + File.separatorChar +
+ artifactId + File.separatorChar +
+ version + File.separatorChar +
+ artifactId + "-" + version + ".jar");
+ }
+
+ public static File resolve(String qualifiedArtifactId)
+ {
+ String[] segments = qualifiedArtifactId.split(":");
+ return resolve(segments[0], segments[1], segments[2]);
+ }
+}
Copied:
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/test/MemberRegistrationTest.java
(from rev 6883,
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/MemberRegistrationTest.java)
===================================================================
---
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/test/MemberRegistrationTest.java
(rev 0)
+++
archetypes/javaee6-webapp/trunk/src/test/java/com/mycompany/test/MemberRegistrationTest.java 2010-08-20
21:35:21 UTC (rev 7002)
@@ -0,0 +1,59 @@
+package com.mycompany.test;
+
+import com.mycompany.controller.MemberRegistration;
+import com.mycompany.data.MemberRepository;
+import com.mycompany.data.MemberRepositoryProducer;
+import com.mycompany.model.Member;
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.InjectionPoint;
+import static org.junit.Assert.*;
+import javax.inject.Inject;
+import org.jboss.arquillian.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+(a)RunWith(Arquillian.class)
+public class MemberRegistrationTest
+{
+ @Deployment
+ public static Archive<?> createTestArchive() {
+ return ShrinkWrap.create(WebArchive.class, "test.war")
+ .addClasses(Member.class, MemberRegistration.class, MemberRepository.class,
MemberRepositoryProducer.class)
+ // SLF4J libraries required only if not available on the container classpath
+// .addLibraries(
+// MavenArtifactResolver.resolve("org.slf4j:slf4j-api:1.5.10"),
+// MavenArtifactResolver.resolve("org.slf4j:slf4j-jdk14:1.5.10")
+// )
+ .addWebResource("test-persistence.xml",
"classes/META-INF/persistence.xml")
+ .addWebResource(new ByteArrayAsset(new byte[0]), "beans.xml");
+ }
+
+ @Inject MemberRegistration memberRegistration;
+
+ @Inject Logger log;
+
+ @Test
+ public void testRegister() throws Exception
+ {
+ Member newMember = memberRegistration.getNewMember();
+ newMember.setName("Jane Doe");
+ newMember.setEmail("jane(a)mailinator.com");
+ newMember.setPhoneNumber("2125551234");
+ memberRegistration.register();
+ assertNotNull(newMember.getId());
+ log.info(newMember.getName() + " was persisted with id " +
newMember.getId());
+ }
+
+ @Produces
+ public Logger produceLog(InjectionPoint injectionPoint)
+ {
+ return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass());
+ }
+}