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") [EMAIL PROTECTED]("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); } }