You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by hu...@apache.org on 2007/11/25 22:04:56 UTC

svn commit: r598053 - in /struts/sandbox/trunk/jpa-mailreader/src: main/java/ main/java/action/ main/java/action/user/ main/java/action/user/subscription/ main/java/entity/ main/java/entity/protocol/ main/java/entity/subscription/ main/java/entity/user...

Author: husted
Date: Sun Nov 25 13:04:53 2007
New Revision: 598053

URL: http://svn.apache.org/viewvc?rev=598053&view=rev
Log:
WW-1399 Start migration to "session per request" pattern. Implement additional tests, modeled on EntityInterceptor. EntityInterceptor itself is untested.

Added:
    struts/sandbox/trunk/jpa-mailreader/src/main/java/commons-logging.properties
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityAware.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityInterceptor.java
    struts/sandbox/trunk/jpa-mailreader/src/test/java/action/BootstrapDataTest.java
      - copied, changed from r597831, struts/sandbox/trunk/jpa-mailreader/src/test/java/action/RetainTest.java
    struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntityManagerHelperTest.java
    struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntitySuperclassTest.java
    struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntityTestCase.java
Removed:
    struts/sandbox/trunk/jpa-mailreader/src/test/java/action/RetainTest.java
Modified:
    struts/sandbox/trunk/jpa-mailreader/src/main/java/action/Index.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/Index.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Delete.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Index.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Update.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityManagerHelper.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityManagerSuperclass.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntitySuperclass.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/Protocol.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/ProtocolManager.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/ProtocolManagerInterface.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/Subscription.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/SubscriptionManager.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/SubscriptionManagerInterface.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/User.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/UserManager.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/UserManagerInterface.java
    struts/sandbox/trunk/jpa-mailreader/src/main/java/struts.xml
    struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/user/UserManagerTest.java

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/action/Index.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/action/Index.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/action/Index.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/action/Index.java Sun Nov 25 13:04:53 2007
@@ -25,6 +25,7 @@
 import com.opensymphony.xwork2.conversion.annotations.Conversion;
 import com.opensymphony.xwork2.conversion.annotations.ConversionType;
 import com.opensymphony.xwork2.conversion.annotations.TypeConversion;
+import org.apache.struts2.config.ParentPackage;
 
 /**
  * <p>
@@ -40,6 +41,7 @@
         @TypeConversion(type = ConversionType.APPLICATION, key = "entity.subscription.Subscription", converter = "entity.subscription.SubscriptionTypeConverter"),
         @TypeConversion(type = ConversionType.APPLICATION, key = "entity.user.User", converter = "entity.user.UserTypeConverter") })
 @SuppressWarnings("unchecked")
+@ParentPackage("entity-default")
 public class Index extends ActionSupport implements SessionAware {
 
     // ---- STATICS ----

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/Index.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/Index.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/Index.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/Index.java Sun Nov 25 13:04:53 2007
@@ -108,7 +108,8 @@
 
     protected void update() throws Exception {
         User result = getUser();
-        if (manager.hasId(result)) {
+        boolean exists = (null != manager.find(result.getId()));
+        if (exists) {
             manager.update(result);
         } else {
             addActionError(getText(ERROR_CREDENTIALS_MISMATCH));

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Delete.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Delete.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Delete.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Delete.java Sun Nov 25 13:04:53 2007
@@ -22,7 +22,7 @@
 
     public String input() throws Exception {
         setInput(DELETE);
-        return manager.hasId(getSubscription()) ? super.input() : ERROR;
+        return super.input();
     }
 
 }

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Index.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Index.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Index.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Index.java Sun Nov 25 13:04:53 2007
@@ -116,7 +116,8 @@
 
     protected void update() throws Exception {
         Subscription result = getSubscription();
-        if (manager.hasId(result)) {
+        boolean exists = (null != manager.find(result.getId()));
+        if (exists) {
             manager.update(result);
         } else {
             addActionError(getText(ERROR_CREDENTIALS_MISMATCH));

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Update.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Update.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Update.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/action/user/subscription/Update.java Sun Nov 25 13:04:53 2007
@@ -22,7 +22,7 @@
 
     public String input() throws Exception {
         setInput(UPDATE);
-        return manager.hasId(getSubscription()) ? super.input() : ERROR;
+        return super.input();
     }
 
 }

Added: struts/sandbox/trunk/jpa-mailreader/src/main/java/commons-logging.properties
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/commons-logging.properties?rev=598053&view=auto
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/commons-logging.properties (added)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/commons-logging.properties Sun Nov 25 13:04:53 2007
@@ -0,0 +1 @@
+org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger

Added: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityAware.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityAware.java?rev=598053&view=auto
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityAware.java (added)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityAware.java Sun Nov 25 13:04:53 2007
@@ -0,0 +1,7 @@
+package entity;
+
+import javax.persistence.EntityManager;
+
+public interface EntityAware {
+    void setManager(EntityManager value);
+}

Added: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityInterceptor.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityInterceptor.java?rev=598053&view=auto
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityInterceptor.java (added)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityInterceptor.java Sun Nov 25 13:04:53 2007
@@ -0,0 +1,45 @@
+package entity;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceException;
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
+
+public class EntityInterceptor extends AbstractInterceptor {
+
+    private String entityInvoke(ActionInvocation invocation) throws Exception {
+        String result = null;
+        EntityAware myAction;
+        EntityManager manager = EntityManagerHelper.getEntityManager();
+        EntityManagerHelper.beginTransaction();
+        myAction = (EntityAware) invocation.getAction();
+        myAction.setManager(manager);
+        try {
+            result = invocation.invoke();
+            EntityManagerHelper.commit();
+        } catch (PersistenceException e) {
+            EntityManagerHelper.logError("PersistenceException in Action: "
+                    + myAction.toString(), e);
+            try {
+                EntityManagerHelper.rollback();
+            } catch (Throwable t) {
+                EntityManagerHelper.logError("Exception during rollback", t);
+            }
+        } finally {
+            EntityManagerHelper.closeEntityManager();
+        }
+        return result;
+    }
+
+    public String intercept(ActionInvocation invocation) throws Exception {
+        String result = null;
+        Object action = invocation.getAction();
+        boolean isEntityAware = (action instanceof EntityAware);
+        if (!isEntityAware) {
+            result = invocation.invoke();
+        } else {
+            result = entityInvoke(invocation);
+        }
+        return result;
+    }
+}
\ No newline at end of file

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityManagerHelper.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityManagerHelper.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityManagerHelper.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityManagerHelper.java Sun Nov 25 13:04:53 2007
@@ -18,14 +18,14 @@
  */
 package entity;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.Persistence;
 import javax.persistence.Query;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 /**
  * <p>
  * Provide access to JPA implementation using static methods.
@@ -37,13 +37,12 @@
 
     private static final EntityManagerFactory emf;
     private static final ThreadLocal<EntityManager> threadLocal;
-    private static final Logger logger;
+    private static final Log logger;
 
     static {
         emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
         threadLocal = new ThreadLocal<EntityManager>();
-        logger = Logger.getLogger(PERSISTENCE_UNIT);
-        logger.setLevel(Level.ALL);
+        logger = LogFactory.getLog(EntityManagerHelper.class);
     }
 
     public static EntityManager getEntityManager() {
@@ -70,20 +69,20 @@
         getEntityManager().getTransaction().commit();
     }
 
-    public static void rollback() {
-        getEntityManager().getTransaction().rollback();
-    }
-
     public static Query createQuery(String query) {
         return getEntityManager().createQuery(query);
     }
 
-    public static void log(String info, Level level, Throwable ex) {
-        logger.log(level, info, ex);
+    public static void flush() {
+        getEntityManager().flush();
+    }
+
+    public static void logError(String info, Throwable ex) {
+        logger.error(info, ex);
     }
 
-    public static void log(String info, Throwable ex) {
-        logger.log(Level.INFO, info, ex);
+    public static void rollback() {
+        getEntityManager().getTransaction().rollback();
     }
 
 }

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityManagerSuperclass.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityManagerSuperclass.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityManagerSuperclass.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntityManagerSuperclass.java Sun Nov 25 13:04:53 2007
@@ -19,85 +19,34 @@
 package entity;
 
 import javax.persistence.EntityManager;
-import javax.persistence.EntityTransaction;
 import javax.persistence.NoResultException;
 import javax.persistence.PersistenceException;
 import javax.persistence.Query;
-import java.util.UUID;
 
 /**
  * <p>
  * Custom CRUD operations involving the <code>User</code> object.
  * <p>
+ * <p>
+ * This implementation delegates transaction managemetn and exception handling
+ * to another component, such as an Interceptor or Filter, or the setUp and
+ * tearDown methods of a TestCase.
+ * </p>
  * 
  */
 public class EntityManagerSuperclass {
 
-    // --- STATICS ----
-
-    /**
-     * <p>
-     * Error message to post when create fails.
-     * </p>
-     */
-    public static final String CREATE_ERROR = "Exception in create()";
-
-    /**
-     * <p>
-     * Error message to post when delete fails.
-     * </p>
-     */
-    public static final String DELETE_ERROR = "Exception in delete()";
-
-    /**
-     * <p>
-     * Error message to post when update fails.
-     * </p>
-     */
-    public static final String UPDATE_ERROR = "Exception in update()";
-
-    // --- METHODS ----
-
-    public Object createEntity(EntitySuperclass value) {
+    public void createEntity(EntitySuperclass value)
+            throws PersistenceException {
         EntityManager manager = EntityManagerHelper.getEntityManager();
-        EntityTransaction transaction = null;
-        try {
-            transaction = manager.getTransaction();
-            transaction.begin();
-            String id = UUID.randomUUID().toString();
-            value.setId(id);
-            manager.persist(value);
-            transaction.commit();
-        } catch (Exception e) {
-            EntityManagerHelper.log(CREATE_ERROR, e);
-            throw new PersistenceException(e);
-        } finally {
-            if ((transaction != null) && transaction.isActive()) {
-                transaction.rollback();
-            }
-            manager.close();
-        }
-        return value;
+        manager.persist(value);
     }
 
-    public void delete(Object value) throws Exception {
+    public void deleteEntity(EntitySuperclass value)
+            throws PersistenceException {
         EntityManager manager = EntityManagerHelper.getEntityManager();
-        EntityTransaction transaction = null;
-        try {
-            transaction = manager.getTransaction();
-            transaction.begin();
-            manager.merge(value);
-            manager.remove(value);
-            transaction.commit();
-        } catch (Exception e) {
-            EntityManagerHelper.log(DELETE_ERROR, e);
-            throw new PersistenceException(e);
-        } finally {
-            if ((transaction != null) && transaction.isActive()) {
-                transaction.rollback();
-            }
-            manager.close();
-        }
+        manager.merge(value);
+        manager.remove(value);
     }
 
     @SuppressWarnings("unchecked")
@@ -105,60 +54,29 @@
         EntityManager manager = EntityManagerHelper.getEntityManager();
         Object result = null;
         try {
-            result = manager.find(entity, id);
-            return result;
+            manager.find(entity, id);
         } catch (NoResultException e) {
-            return null;
-        } finally {
-            manager.close();
+            result = null;
         }
+        return result;
     }
 
     public Object findEntityByName(String namedQuery, String parameterName,
             String value) {
         EntityManager manager = EntityManagerHelper.getEntityManager();
         Object result = null;
+        Query query = manager.createNamedQuery(namedQuery);
+        query.setParameter(parameterName, value);
         try {
-            Query query = manager.createNamedQuery(namedQuery);
-            query.setParameter(parameterName, value);
             result = query.getSingleResult();
-            return result;
         } catch (NoResultException e) {
-            return null;
-        } finally {
-            manager.close();
+            result = null;
         }
-    }
-
-    public boolean entityHasId(EntitySuperclass value) {
-        if (value == null)
-            return false;
-        String id = value.getId();
-        boolean result = ((id != null) && (id.length() > 0));
         return result;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.IUserManager#update(entity.User)
-     */
-    public void updateEntity(Object value) throws Exception {
+    public void updateEntity(Object value) throws PersistenceException {
         EntityManager manager = EntityManagerHelper.getEntityManager();
-        EntityTransaction transaction = null;
-        try {
-            transaction = manager.getTransaction();
-            transaction.begin();
-            manager.merge(value);
-            transaction.commit();
-        } catch (Exception e) {
-            EntityManagerHelper.log(UPDATE_ERROR, e);
-            throw new PersistenceException(e);
-        } finally {
-            if ((transaction != null) && transaction.isActive()) {
-                transaction.rollback();
-            }
-            manager.close();
-        }
+        manager.merge(value);
     }
 }

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntitySuperclass.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntitySuperclass.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntitySuperclass.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/EntitySuperclass.java Sun Nov 25 13:04:53 2007
@@ -28,8 +28,6 @@
 import javax.persistence.Transient;
 import javax.persistence.Version;
 
-import entity.user.User;
-
 @MappedSuperclass
 public class EntitySuperclass implements Serializable {
 
@@ -61,7 +59,7 @@
 
     public boolean equals(Object obj) {
         if ((obj instanceof EntitySuperclass) && (getId() != null)) {
-            return getId().equals(((User) obj).getId());
+            return getId().equals(((EntitySuperclass) obj).getId());
         } else {
             return false;
         }
@@ -78,6 +76,11 @@
     }
 
     public String toString() {
-        return "entity.EntitySuperclass[id=" + getId() + "']";
+        return "entity.EntitySuperclass[id=" + getId() + "]";
+    }
+
+    public EntitySuperclass() {
+        String id = UUID.randomUUID().toString();
+        setId(id);
     }
 }

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/Protocol.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/Protocol.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/Protocol.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/Protocol.java Sun Nov 25 13:04:53 2007
@@ -30,8 +30,9 @@
  * Describes an email server protocol, such as POP or SMTP.
  * </p>
  * <p>
- * JPA entity class for the <code>APP_PROTOCOL</code> table. This class is
- * kept simple to allow for easier regeneration.
+ * JPA entity class for the <code>APP_PROTOCOL</code> table. This class
+ * contains sufficient detail to regenerate the database schema (top-down
+ * development).
  * </p>
  */
 @Entity(name = "APP_PROTOCOL")
@@ -70,6 +71,12 @@
      * </p>
      */
     public Protocol() {
+        super();
+    }
+
+    public Protocol(String description) {
+        super();
+        setDescription(description);
     }
 
 }

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/ProtocolManager.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/ProtocolManager.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/ProtocolManager.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/ProtocolManager.java Sun Nov 25 13:04:53 2007
@@ -36,41 +36,22 @@
 public class ProtocolManager extends EntityManagerSuperclass implements
         ProtocolManagerInterface {
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.IProtocolManager#find(java.lang.String)
-     */
     public Protocol find(String value) {
         Protocol result = (Protocol) findEntity(Protocol.class, value);
         return result;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.IProtocolManager#findAll()
-     */
     @SuppressWarnings("unchecked")
     public List<Protocol> findAll() {
-        EntityManager em = EntityManagerHelper.getEntityManager();
-        try {
-            List<Protocol> protocols = em.createNamedQuery(Protocol.FIND_ALL)
-                    .getResultList();
-            if (protocols == null) {
-                protocols = new ArrayList<Protocol>();
-            }
-            return protocols;
-        } finally {
-            em.close();
+        EntityManager manager = EntityManagerHelper.getEntityManager();
+        List<Protocol> protocols = manager.createNamedQuery(Protocol.FIND_ALL)
+                .getResultList();
+        if (protocols == null) {
+            protocols = new ArrayList<Protocol>();
         }
+        return protocols;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.IProtocolManager#findAllAsMap()
-     */
     public Map<String, String> findAllAsMap() {
         List<Protocol> items = findAll();
         Map<String, String> map = new LinkedHashMap<String, String>(items

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/ProtocolManagerInterface.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/ProtocolManagerInterface.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/ProtocolManagerInterface.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/protocol/ProtocolManagerInterface.java Sun Nov 25 13:04:53 2007
@@ -32,7 +32,7 @@
      * @param id
      *            Protocol id to look up
      */
-    public abstract Protocol find(String value);
+    Protocol find(String value);
 
     /**
      * <p>
@@ -41,7 +41,7 @@
      * will be returned.
      * </p>
      */
-    public abstract List<Protocol> findAll();
+    List<Protocol> findAll();
 
     /**
      * <p>
@@ -50,6 +50,6 @@
      * returned.
      * </p>
      */
-    public abstract Map<String, String> findAllAsMap();
+    Map<String, String> findAllAsMap();
 
 }

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/Subscription.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/Subscription.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/Subscription.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/Subscription.java Sun Nov 25 13:04:53 2007
@@ -37,9 +37,9 @@
  * </p>
  * 
  * <p>
- * JPA entity class for the <code>APP_SUBSCRIPTION</code> table. This class is
- * kept simple to allow for easier regeneration.
- * </p>
+ * JPA entity class for the <code>APP_SUBSCRIPTION</code> table. TThis class
+ * contains sufficient detail to regenerate the database schema (top-down
+ * development).
  */
 @Entity(name = "APP_SUBSCRIPTION")
 @NamedQueries( {
@@ -98,7 +98,7 @@
 
     @JoinColumn(name = "protocol_id")
     @OneToOne
-    private Protocol protocol_id;
+    private Protocol protocol;
 
     @JoinColumn(name = "user_id", nullable = false)
     @ManyToOne
@@ -134,11 +134,11 @@
     }
 
     public Protocol getProtocol() {
-        return protocol_id;
+        return protocol;
     }
 
     public void setProtocol(Protocol value) {
-        protocol_id = value;
+        protocol = value;
     }
 
     public User getUser() {
@@ -165,6 +165,25 @@
      * </p>
      */
     public Subscription() {
+        super();
+    }
+
+    /**
+     * <p>
+     * Instantiate a default <code>Subscription</code> object, and load
+     * values.
+     * </p>
+     * 
+     */
+    public Subscription(String host, User user, String username,
+            String password, Protocol protocol, boolean autoConnect) {
+        super();
+        setHost(host);
+        setUser(user);
+        setUsername(username);
+        setPassword(password);
+        setProtocol(protocol);
+        setAutoConnect(autoConnect);
     }
 
 }

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/SubscriptionManager.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/SubscriptionManager.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/SubscriptionManager.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/SubscriptionManager.java Sun Nov 25 13:04:53 2007
@@ -19,9 +19,6 @@
 package entity.subscription;
 
 import javax.persistence.EntityManager;
-import javax.persistence.EntityTransaction;
-import javax.persistence.PersistenceException;
-
 import entity.EntityManagerHelper;
 import entity.EntityManagerSuperclass;
 
@@ -34,80 +31,29 @@
 public class SubscriptionManager extends EntityManagerSuperclass implements
         SubscriptionManagerInterface {
 
-    // ---- METHODS ----
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.ISubscriptionManager#create(entity.Subscription)
-     */
-    public Subscription create(Subscription value) {
-        Subscription result = (Subscription) createEntity(value);
-        return result;
+    public void create(Subscription value) {
+        createEntity(value);
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.ISubscriptionManager#delete(entity.Subscription)
-     */
     public void delete(Subscription value) throws Exception {
         EntityManager manager = EntityManagerHelper.getEntityManager();
-        EntityTransaction transaction = null;
-        try {
-            transaction = manager.getTransaction();
-            transaction.begin();
-            manager.merge(value);
-            value.getUser().removeSubscription(value);
-            manager.remove(value);
-            transaction.commit();
-        } catch (Exception e) {
-            EntityManagerHelper.log(DELETE_ERROR, e);
-            throw new PersistenceException(e);
-        } finally {
-            if ((transaction != null) && transaction.isActive()) {
-                transaction.rollback();
-            }
-            manager.close();
-        }
+        manager.merge(value);
+        value.getUser().removeSubscription(value);
+        manager.remove(value);
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.ISubscriptionManager#find(java.lang.String)
-     */
     public Subscription find(String value) {
         Subscription result = (Subscription) findEntity(Subscription.class,
                 value);
         return result;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.ISubscriptionManager#findByName(java.lang.String)
-     */
     public Subscription findByName(String value) {
         Subscription result = (Subscription) findEntityByName(
                 Subscription.FIND_BY_HOST, Subscription.HOST, value);
         return result;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.ISubscriptionManager#hasId(entity.Subscription)
-     */
-    public boolean hasId(Subscription value) {
-        return entityHasId(value);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.ISubscriptionManager#update(entity.Subscription)
-     */
     public void update(Subscription value) throws Exception {
         updateEntity(value);
     }

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/SubscriptionManagerInterface.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/SubscriptionManagerInterface.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/SubscriptionManagerInterface.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/subscription/SubscriptionManagerInterface.java Sun Nov 25 13:04:53 2007
@@ -29,7 +29,7 @@
      * @param value
      *            Subscription to insert
      */
-    public abstract Subscription create(Subscription value);
+    void create(Subscription value);
 
     /**
      * <p>
@@ -40,7 +40,7 @@
      * @param value
      *            Subscription instance to delete
      */
-    public abstract void delete(Subscription value) throws Exception;
+    void delete(Subscription value) throws Exception;
 
     /**
      * <p>
@@ -51,7 +51,7 @@
      * @param value
      *            Host to match
      */
-    public abstract Subscription find(String value);
+    Subscription find(String value);
 
     /**
      * <p>
@@ -62,19 +62,7 @@
      * @param id
      *            Subscription id to match
      */
-    public abstract Subscription findByName(String value);
-
-    /**
-     * <p>
-     * Determine if the <code>Subscription</code> object has been assigned an
-     * ID value.
-     * </p>
-     * 
-     * @param value
-     *            Subscription object to examine
-     * @return True if the Subscription object has an ID value
-     */
-    public abstract boolean hasId(Subscription value);
+    Subscription findByName(String value);
 
     /**
      * <p>
@@ -85,6 +73,6 @@
      * @param user
      *            Copy of Subscription instance to match and update
      */
-    public abstract void update(Subscription value) throws Exception;
+    void update(Subscription value) throws Exception;
 
 }

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/User.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/User.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/User.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/User.java Sun Nov 25 13:04:53 2007
@@ -20,6 +20,8 @@
 
 import java.io.Serializable;
 import java.util.List;
+import java.util.ArrayList;
+import java.sql.Timestamp;
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -36,8 +38,8 @@
  * Describes an account that maintains zero or more <code>Subscription</code>s.
  * </p>
  * <p>
- * JPA entity class for the <code>APP_USER</code> table. This class is kept
- * simple to allow for easier regeneration.
+ * JPA entity class for the <code>APP_USER</code> table. This class contains
+ * sufficient detail to regenerate the database schema (top-down development).
  * </p>
  */
 @Entity(name = "APP_USER")
@@ -174,6 +176,10 @@
      */
     public void addSubscription(Subscription subscription) {
         List<Subscription> subscriptions = getSubscriptions();
+        if (subscriptions == null) {
+            subscriptions = new ArrayList<Subscription>();
+            setSubscriptions(subscriptions);
+        }
         if (!subscriptions.contains(subscription)) {
             subscription.setUser(this);
             subscriptions.add(subscription);
@@ -182,6 +188,23 @@
 
     /**
      * <p>
+     * Add the specified <code>Subscriptions</code> to the set of
+     * subscriptions associated with this <code>User</code>.
+     * </p>
+     * <p>
+     * A duplicate <code>Subscription</code> is not added but quietly ignored.
+     * </p>
+     */
+    public void addSubscriptions(List<Subscription> subscriptions) {
+        if (subscriptions == null)
+            return;
+        for (int i = 0; i < subscriptions.size(); i++) {
+            addSubscription(subscriptions.get(i));
+        }
+    }
+
+    /**
+     * <p>
      * Remove the specified <code>Subscription</code> from the set of
      * subscriptions associated with this <code>User</code>.
      * </p>
@@ -202,6 +225,38 @@
      * </p>
      */
     public User() {
+        super();
+    }
+
+    /**
+     * <p>
+     * Instantiate a <code>User</code> object with a username and password.
+     * </p>
+     * <p>
+     * This constructor does not set the ID value.
+     * </p>
+     */
+    public User(String username, String password) {
+        super();
+        setUsername(username);
+        setPassword(password);
+    }
+
+    /**
+     * <p>
+     * Instantiate a <code>User</code> object, and load values.
+     * </p>
+     */
+    public User(String username, String password, String fullName,
+            String fromAddress, String replyToAddress, Timestamp lastUpdated,
+            String id) {
+        super();
+        setUsername(username);
+        setPassword(password);
+        setFullName(fullName);
+        setReplyToAddress(replyToAddress);
+        setLastUpdate(lastUpdated);
+        setId(id);
     }
 
 }

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/UserManager.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/UserManager.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/UserManager.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/UserManager.java Sun Nov 25 13:04:53 2007
@@ -18,6 +18,7 @@
  */
 package entity.user;
 
+import javax.persistence.PersistenceException;
 import entity.EntityManagerSuperclass;
 
 /**
@@ -29,54 +30,26 @@
 public class UserManager extends EntityManagerSuperclass implements
         UserManagerInterface {
 
-    // --- METHODS ----
+    public void create(User value) throws PersistenceException {
+        createEntity(value);
+    }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.IUserManager#create(entity.User)
-     */
-    public User create(User value) {
-        User result = (User) createEntity(value);
-        return result;
+    public void delete(User value) throws PersistenceException {
+        deleteEntity(value);
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.IUserManager#find(java.lang.String)
-     */
     public User find(String value) {
         User result = (User) findEntity(User.class, value);
         return result;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.IUserManager#findByName(java.lang.String)
-     */
     public User findByName(String value) {
         User result = (User) findEntityByName(User.FIND_BY_NAME, User.NAME,
                 value);
         return result;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.IUserManager#hasId(entity.User)
-     */
-    public boolean hasId(User value) {
-        return entityHasId(value);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see entity.IUserManager#update(entity.User)
-     */
-    public void update(User value) throws Exception {
+    public void update(User value) throws PersistenceException {
         updateEntity(value);
     }
 }

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/UserManagerInterface.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/UserManagerInterface.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/UserManagerInterface.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/entity/user/UserManagerInterface.java Sun Nov 25 13:04:53 2007
@@ -18,6 +18,8 @@
  */
 package entity.user;
 
+import javax.persistence.PersistenceException;
+
 public interface UserManagerInterface {
 
     /**
@@ -29,18 +31,18 @@
      * @param value
      *            User instance to be added
      */
-    public abstract User create(User value);
+    void create(User value) throws PersistenceException;
 
     /**
      * <p>
-     * Retrieve the <code>User</code> matching the specified username, if any;
-     * otherwise, return <code>null</code>.
+     * Delete the specified <code>User</code> (and any associated child
+     * <code>Subscription</code>s) into the persistent database.
      * </p>
      * 
      * @param value
-     *            Username to match
+     *            User instance to be added
      */
-    public abstract User find(String value);
+    void delete(User value) throws PersistenceException;
 
     /**
      * <p>
@@ -51,18 +53,18 @@
      * @param value
      *            Username to match
      */
-    public abstract User findByName(String value);
+    User find(String value);
 
     /**
      * <p>
-     * Determine if the <code>User</code> object has been assigned an ID
-     * value.
+     * Retrieve the <code>User</code> matching the specified username, if any;
+     * otherwise, return <code>null</code>.
+     * </p>
      * 
      * @param value
-     *            User object to examine
-     * @return True if the User object has an ID value
+     *            Username to match
      */
-    public abstract boolean hasId(User value);
+    User findByName(String value);
 
     /**
      * <p>
@@ -73,6 +75,6 @@
      * @param value
      *            Copy of User instance to match and update
      */
-    public abstract void update(User value) throws Exception;
+    void update(User value) throws PersistenceException;
 
 }

Modified: struts/sandbox/trunk/jpa-mailreader/src/main/java/struts.xml
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/main/java/struts.xml?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/main/java/struts.xml (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/main/java/struts.xml Sun Nov 25 13:04:53 2007
@@ -14,4 +14,14 @@
     <!-- include file="" / -->
     <!-- Add packages here -->
     
+    <package name="entity-default" extends="struts-default">
+		<interceptors>
+	  		<interceptor name="entityInterceptor" class="entities.EntityInterceptor"/>
+ 			<interceptor-stack name="entityStack">
+				  <interceptor-ref name="entityInterceptor"/>
+				  <interceptor-ref name="defaultStack"/>
+  			</interceptor-stack>
+		</interceptors>
+		<default-interceptor-ref name="entityStack"/>
+	</package>        
 </struts>

Copied: struts/sandbox/trunk/jpa-mailreader/src/test/java/action/BootstrapDataTest.java (from r597831, struts/sandbox/trunk/jpa-mailreader/src/test/java/action/RetainTest.java)
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/test/java/action/BootstrapDataTest.java?p2=struts/sandbox/trunk/jpa-mailreader/src/test/java/action/BootstrapDataTest.java&p1=struts/sandbox/trunk/jpa-mailreader/src/test/java/action/RetainTest.java&r1=597831&r2=598053&rev=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/test/java/action/RetainTest.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/test/java/action/BootstrapDataTest.java Sun Nov 25 13:04:53 2007
@@ -32,7 +32,7 @@
 
 import junit.framework.TestCase;
 
-public class RetainTest extends TestCase {
+public class BootstrapDataTest extends TestCase {
 
     public void setUp() throws Exception {
         super.setUp();
@@ -40,6 +40,10 @@
 
     private String getUUID() {
         return UUID.randomUUID().toString();
+    }
+
+    public void testTrue() throws Exception {
+        assertTrue(true);
     }
 
     @SuppressWarnings("unchecked")

Added: struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntityManagerHelperTest.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntityManagerHelperTest.java?rev=598053&view=auto
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntityManagerHelperTest.java (added)
+++ struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntityManagerHelperTest.java Sun Nov 25 13:04:53 2007
@@ -0,0 +1,15 @@
+package entity;
+
+import javax.persistence.EntityManager;
+import junit.framework.TestCase;
+
+public class EntityManagerHelperTest extends TestCase {
+
+    public void testGetEntityManager() {
+        EntityManager manager = EntityManagerHelper.getEntityManager();
+        assertNotNull(manager);
+        EntityManager manager2 = EntityManagerHelper.getEntityManager();
+        assertEquals(manager, manager2);
+    }
+
+}

Added: struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntitySuperclassTest.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntitySuperclassTest.java?rev=598053&view=auto
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntitySuperclassTest.java (added)
+++ struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntitySuperclassTest.java Sun Nov 25 13:04:53 2007
@@ -0,0 +1,54 @@
+package entity;
+
+import junit.framework.TestCase;
+
+/**
+ * <p>
+ * Exercise base <code>EntitySuperclass</p> method to test implementation.
+ * </p>
+ *
+ */
+public class EntitySuperclassTest extends TestCase {
+
+    EntitySuperclass entity;
+    EntitySuperclass entity2;
+
+    public void setUp() throws Exception {
+        super.setUp();
+        entity = new EntitySuperclass();
+        entity2 = new EntitySuperclass();
+    }
+
+    public void testId() {
+        String id = entity.getId();
+        assertNotNull(id);
+        assertTrue(id.length() > 0);
+        assertFalse(id.equals(entity2.getId()));
+    }
+
+    public void testEquals() {
+        boolean equalsSelf = entity.equals(entity);
+        assertTrue(equalsSelf);
+    }
+
+    public void testEqualsNot() {
+        boolean equalsNot = entity.equals(entity2);
+        assertFalse(equalsNot);
+    }
+
+    public void testHashcode() {
+        int hashcode = entity.hashCode();
+        int hashcode2 = entity2.hashCode();
+        boolean test = hashcode != hashcode2;
+        assertTrue("Expected different hashcodes", test);
+    }
+
+    public void testToString() {
+        EntitySuperclass entity3 = new EntitySuperclass();
+        entity3.setId("55ba338a-97fa-44ce-bdad-80236d9404d0");
+        String value = entity3.toString();
+        String TO_STRING = "entity.EntitySuperclass[id=55ba338a-97fa-44ce-bdad-80236d9404d0]";
+        assertEquals(TO_STRING, value);
+    }
+
+}

Added: struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntityTestCase.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntityTestCase.java?rev=598053&view=auto
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntityTestCase.java (added)
+++ struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/EntityTestCase.java Sun Nov 25 13:04:53 2007
@@ -0,0 +1,27 @@
+package entity;
+
+import javax.persistence.EntityManager;
+
+import junit.framework.TestCase;
+
+public class EntityTestCase extends TestCase {
+
+    protected EntityManager manager;
+
+    public void setUp() throws Exception {
+        super.setUp();
+        manager = EntityManagerHelper.getEntityManager();
+        EntityManagerHelper.beginTransaction();
+    }
+
+    public void tearDown() throws Exception {
+        super.tearDown();
+        EntityManagerHelper.commit();
+        EntityManagerHelper.closeEntityManager();
+    }
+
+    public void testTrue() throws Exception {
+        assertTrue(true);
+    }
+
+}

Modified: struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/user/UserManagerTest.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/user/UserManagerTest.java?rev=598053&r1=598052&r2=598053&view=diff
==============================================================================
--- struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/user/UserManagerTest.java (original)
+++ struts/sandbox/trunk/jpa-mailreader/src/test/java/entity/user/UserManagerTest.java Sun Nov 25 13:04:53 2007
@@ -1,34 +1,85 @@
 package entity.user;
 
-import junit.framework.TestCase;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Random;
 
-public class UserManagerTest extends TestCase {
+import entity.EntityTestCase;
+import entity.protocol.Protocol;
+import entity.protocol.ProtocolManager;
+import entity.protocol.ProtocolManagerInterface;
+import entity.subscription.Subscription;
+
+public class UserManagerTest extends EntityTestCase {
 
     UserManagerInterface manager;
+    Random generator;
     String base;
 
+    private String nextBase() {
+        int r = generator.nextInt();
+        return String.valueOf(r);
+    }
+
     public void setUp() throws Exception {
         super.setUp();
         manager = new UserManager();
-        Random generator = new Random();
-        int r = generator.nextInt();
-        base = String.valueOf(r);
+        generator = new Random();
+        base = nextBase();
     }
 
     private boolean isNotEmpty(String value) {
         return (value != null) && (value.length() > 0);
     }
 
+    private User newUser() {
+        return new User("user_" + base, "pass_" + base);
+    }
+
     public void testCreate() throws Exception {
-        User user = new User();
+        User user = newUser();
         String before = user.getId();
-        assertFalse("User ID not empty on New", isNotEmpty(before));
+        assertTrue("ID not assigned on New", isNotEmpty(before));
+        manager.create(user);
+        String after = user.getId();
+        assertTrue("Initial ID changed on Create", before.equals(after));
+    }
+
+    private List<Subscription> getSubscriptions(User user) {
+        ProtocolManagerInterface protocolManager = new ProtocolManager();
+        boolean autoConnect = false;
+        List<Protocol> protocols = protocolManager.findAll();
+        int protocolMax = protocols.size();
+        List<Subscription> subscriptions = new ArrayList<Subscription>();
+
+        for (int i = 0; i < 3; i++) {
+            String base = String.valueOf(i + 1);
+            autoConnect = !autoConnect;
+            int protocolIndex = (i % protocolMax);
+            Subscription sub = new Subscription("host_" + base, user, "user_"
+                    + base, "pass_" + base, protocols.get(protocolIndex),
+                    autoConnect);
+            subscriptions.add(sub);
+        }
+        return subscriptions;
+    }
+
+    public void testCreateWithSubscriptions() {
+        User user = newUser();
+        manager.create(user);
+        List<Subscription> subscriptions = getSubscriptions(user);
+        user.addSubscriptions(subscriptions);
+        manager.update(user);
+        assertTrue("Expected ID", user.getId() != null);
+        assertTrue(user.getSubscriptions() != null);
+    }
+
+    public void testCreateDelete() throws Exception {
+        User user = new User();
         user.setUsername("user_" + base);
         user.setPassword("pass_" + base);
         manager.create(user);
-        String after = user.getId();
-        assertTrue("User ID not assigned on Create", isNotEmpty(after));
+        manager.delete(user);
     }
 
 }