Index: service/src/main/java/org/appfuse/service/UserService.java
===================================================================
--- service/src/main/java/org/appfuse/service/UserService.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/UserService.java	(working copy)
@@ -17,7 +17,7 @@
      * @param userId the identifier for the user
      * @return User
      */
-    public User getUser(String userId);
+    User getUser(String userId);
 
     /**
      * Finds a user by their username.
@@ -26,14 +26,14 @@
      * @throws org.acegisecurity.userdetails.UsernameNotFoundException
      *         exception thrown when user not found
      */
-    public User getUserByUsername(String username) throws UsernameNotFoundException;
+    User getUserByUsername(String username) throws UsernameNotFoundException;
 
     /**
      * Retrieves a list of users, filtering with parameters on a user object
      * @param user parameters to filter on
      * @return List
      */
-    public List<User> getUsers(User user);
+    List<User> getUsers(User user);
 
     /**
      * Saves a user's information
@@ -42,12 +42,12 @@
      * @throws UserExistsException thrown when user already exists
      * @return updated user
      */
-    public User saveUser(User user) throws UserExistsException;
+    User saveUser(User user) throws UserExistsException;
 
     /**
      * Removes a user from the database by their userId
      *
      * @param userId the user's id
      */
-    public void removeUser(String userId);
+    void removeUser(String userId);
 }
Index: service/src/main/java/org/appfuse/service/impl/UniversalManagerImpl.java
===================================================================
--- service/src/main/java/org/appfuse/service/impl/UniversalManagerImpl.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/impl/UniversalManagerImpl.java	(working copy)
@@ -11,42 +11,47 @@
 /**
  * Base class for Business Services - use this class for utility methods and
  * generic CRUD methods.
- * 
- * <p><a href="UniversalManagerImpl.java.html"><i>View Source</i></a></p>
  *
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
 public class UniversalManagerImpl implements UniversalManager {
+    /**
+     * Log instance for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging
+     */
     protected final Log log = LogFactory.getLog(getClass());
-    protected UniversalDao dao = null;
+
+    /**
+     * UniversalDao instance, ready to charge forward and persist to the database
+     */
+    protected UniversalDao dao;
  
     public void setDao(UniversalDao dao) {
         this.dao = dao;
     }
-    
+
     /**
-     * @see org.appfuse.service.UniversalManager#get(java.lang.Class, java.io.Serializable)
+     * {@inheritDoc}
      */
     public Object get(Class clazz, Serializable id) {
         return dao.get(clazz, id);
     }
-    
+
     /**
-     * @see org.appfuse.service.UniversalManager#getAll(java.lang.Class)
+     * {@inheritDoc}
      */
     public List getAll(Class clazz) {
         return dao.getAll(clazz);
     }
-    
+
     /**
-     * @see org.appfuse.service.UniversalManager#remove(java.lang.Class, java.io.Serializable)
+     * {@inheritDoc}
      */
     public void remove(Class clazz, Serializable id) {
         dao.remove(clazz, id);
     }
-    
+
     /**
-     * @see org.appfuse.service.UniversalManager#save(java.lang.Object)
+     * {@inheritDoc}
      */
     public Object save(Object o) {
         return dao.save(o);
Index: service/src/main/java/org/appfuse/service/impl/LookupManagerImpl.java
===================================================================
--- service/src/main/java/org/appfuse/service/impl/LookupManagerImpl.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/impl/LookupManagerImpl.java	(working copy)
@@ -17,13 +17,17 @@
 public class LookupManagerImpl extends UniversalManagerImpl implements LookupManager {
     private LookupDao dao;
 
+    /**
+     * Method that allows setting the DAO to talk to the data store with.
+     * @param dao the dao implementation
+     */
     public void setLookupDao(LookupDao dao) {
         super.dao = dao;
         this.dao = dao;
     }
-    
+
     /**
-     * @see org.appfuse.service.LookupManager#getAllRoles()
+     * {@inheritDoc}
      */
     public List<LabelValue> getAllRoles() {
         List<Role> roles = dao.getRoles();
Index: service/src/main/java/org/appfuse/service/impl/GenericManagerImpl.java
===================================================================
--- service/src/main/java/org/appfuse/service/impl/GenericManagerImpl.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/impl/GenericManagerImpl.java	(working copy)
@@ -39,31 +39,59 @@
  * </pre>
  *
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
+ * @param <T> a type variable
+ * @param <PK> the primary key for that type
  */
 public class GenericManagerImpl<T, PK extends Serializable> implements GenericManager<T, PK> {
+    /**
+     * Log variable for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging
+     */
     protected final Log log = LogFactory.getLog(getClass());
+
+    /**
+     * GenericDao instance, set by constructor of this class
+     */
     protected GenericDao<T, PK> genericDao;
 
-    public GenericManagerImpl(GenericDao<T, PK> genericDao) {
+    /**
+     * Public constructor for creating a new GenericManagerImpl.
+     * @param genericDao the GenericDao to use for persistence
+     */
+    public GenericManagerImpl(final GenericDao<T, PK> genericDao) {
         this.genericDao = genericDao;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public List<T> getAll() {
         return genericDao.getAll();
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public T get(PK id) {
         return genericDao.get(id);
     }
-    
+
+    /**
+     * {@inheritDoc}
+     */
     public boolean exists(PK id) {
         return genericDao.exists(id);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public T save(T object) {
         return genericDao.save(object);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public void remove(PK id) {
         genericDao.remove(id);
     }
Index: service/src/main/java/org/appfuse/service/impl/UserManagerImpl.java
===================================================================
--- service/src/main/java/org/appfuse/service/impl/UserManagerImpl.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/impl/UserManagerImpl.java	(working copy)
@@ -14,7 +14,7 @@
 
 
 /**
- * Implementation of UserManager interface.</p>
+ * Implementation of UserManager interface.
  *
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
@@ -31,28 +31,28 @@
     }
 
     /**
-     * @see org.appfuse.service.UserManager#getUser(java.lang.String)
+     * {@inheritDoc}
      */
     public User getUser(String userId) {
         return dao.get(new Long(userId));
     }
 
     /**
-     * @see org.appfuse.service.UserManager#getUsers(org.appfuse.model.User)
+     * {@inheritDoc}
      */
     public List<User> getUsers(User user) {
         return dao.getUsers();
     }
 
     /**
-     * @see org.appfuse.service.UserManager#saveUser(org.appfuse.model.User)
+     * {@inheritDoc}
      */
     public User saveUser(User user) throws UserExistsException {
         // if new user, lowercase userId
         if (user.getVersion() == null) {
             user.setUsername(user.getUsername().toLowerCase());
         }
-        
+
         try {
             return dao.saveUser(user);
         } catch (DataIntegrityViolationException e) {
@@ -67,13 +67,19 @@
     }
 
     /**
-     * @see org.appfuse.service.UserManager#removeUser(java.lang.String)
+     * {@inheritDoc}
      */
     public void removeUser(String userId) {
         log.debug("removing user: " + userId);
         dao.remove(new Long(userId));
     }
 
+    /**
+     * {@inheritDoc}
+     * @param username the login name of the human
+     * @return User the populated user object
+     * @throws UsernameNotFoundException thrown when username not found
+     */
     public User getUserByUsername(String username) throws UsernameNotFoundException {
         return (User) dao.loadUserByUsername(username);
     }
Index: service/src/main/java/org/appfuse/service/impl/RoleManagerImpl.java
===================================================================
--- service/src/main/java/org/appfuse/service/impl/RoleManagerImpl.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/impl/RoleManagerImpl.java	(working copy)
@@ -18,18 +18,30 @@
         this.dao = dao;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public List<Role> getRoles(Role role) {
         return dao.getAll();
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public Role getRole(String rolename) {
         return dao.getRoleByName(rolename);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public Role saveRole(Role role) {
         return dao.save(role);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public void removeRole(String rolename) {
         dao.removeRole(rolename);
     }
Index: service/src/main/java/org/appfuse/service/UserSecurityAdvice.java
===================================================================
--- service/src/main/java/org/appfuse/service/UserSecurityAdvice.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/UserSecurityAdvice.java	(working copy)
@@ -22,13 +22,27 @@
 import java.util.HashSet;
 import java.util.Set;
 
+/**
+ * This advice is responsible for enforcing security and only allowing administrators
+ * to modify users. Users are allowed to modify themselves.
+ *
+ * @author mraible
+ */
 public class UserSecurityAdvice implements MethodBeforeAdvice, AfterReturningAdvice {
-    public final static String ACCESS_DENIED = "Access Denied: Only administrators are allowed to modify other users.";
-    protected final Log log = LogFactory.getLog(UserSecurityAdvice.class);
+    /**
+     * Default "Access Denied" error message (not i18n-ized).
+     */
+    public static final String ACCESS_DENIED = "Access Denied: Only administrators are allowed to modify other users.";
+    private final Log log = LogFactory.getLog(UserSecurityAdvice.class);
 
     /**
      * Method to enforce security and only allow administrators to modify users. Regular
      * users are allowed to modify themselves.
+     *
+     * @param method the name of the method executed
+     * @param args the arguments to the method
+     * @param target the target class
+     * @throws Throwable thrown when args[0] is null or not a User object
      */
     public void before(Method method, Object[] args, Object target) throws Throwable {
         SecurityContext ctx = SecurityContextHolder.getContext();
@@ -87,6 +101,14 @@
         }
     }
 
+    /**
+     * After returning, grab the user, check if they've been modified and reset the SecurityContext if they have.
+     * @param returnValue the user object
+     * @param method the name of the method executed
+     * @param args the arguments to the method
+     * @param target the target class
+     * @throws Throwable thrown when args[0] is null or not a User object
+     */
     public void afterReturning(Object returnValue, Method method, Object[] args, Object target)
     throws Throwable {
         User user = (User) args[0];
@@ -97,7 +119,7 @@
             AuthenticationTrustResolver resolver = new AuthenticationTrustResolverImpl();
             // allow new users to signup - this is OK b/c Signup doesn't allow setting of roles
             boolean signupUser = resolver.isAnonymous(auth);
-            if (auth != null && !signupUser) { 
+            if (auth != null && !signupUser) {
                 User currentUser = getCurrentUser(auth);
                 if (currentUser.getId().equals(user.getId())) {
                     auth = new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities());
Index: service/src/main/java/org/appfuse/service/UniversalManager.java
===================================================================
--- service/src/main/java/org/appfuse/service/UniversalManager.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/UniversalManager.java	(working copy)
@@ -3,14 +3,34 @@
 import java.io.Serializable;
 import java.util.List;
 
+/**
+ * Business Facade interface. 
+ *
+ * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
+ *
+ * Modifications and comments by <a href="mailto:bwnoll@gmail.com">Bryan Noll</a>
+ * This thing used to be named simply 'GenericManager' in versions of AppFuse prior to 2.0.
+ * It was renamed in an attempt to distinguish and describe it as something
+ * different than GenericManager.  GenericManager is intended for subclassing, and was
+ * named Generic because 1) it has very general functionality and 2) is
+ * 'generic' in the Java 5 sense of the word... aka... it uses Generics.
+ *
+ * Implementations of this class are not intended for subclassing. You most
+ * likely would want to subclass GenericManager.  The only real difference is that
+ * instances of java.lang.Class are passed into the methods in this class, and
+ * they are part of the constructor in the GenericManager, hence you'll have to do
+ * some casting if you use this one.
+ *
+ * @see com.einvite.service.GenericManager
+ */
 public interface UniversalManager {
     /**
      * Generic method used to get a all objects of a particular type. 
      * @param clazz the type of objects 
      * @return List of populated objects
      */
-    public List getAll(Class clazz);
-    
+    List getAll(Class clazz);
+
     /**
      * Generic method to get an object based on class and identifier. 
      * 
@@ -19,18 +39,19 @@
      * @return a populated object 
      * @see org.springframework.orm.ObjectRetrievalFailureException
      */
-    public Object get(Class clazz, Serializable id);
+    Object get(Class clazz, Serializable id);
 
     /**
      * Generic method to save an object.
      * @param o the object to save
+     * @return a populated object
      */
-    public Object save(Object o);
+    Object save(Object o);
 
     /**
      * Generic method to delete an object based on class and id
      * @param clazz model class to lookup
      * @param id the identifier of the class
      */
-    public void remove(Class clazz, Serializable id);
+    void remove(Class clazz, Serializable id);
 }
Index: service/src/main/java/org/appfuse/service/LookupManager.java
===================================================================
--- service/src/main/java/org/appfuse/service/LookupManager.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/LookupManager.java	(working copy)
@@ -15,5 +15,5 @@
      * Retrieves all possible roles from persistence layer
      * @return List of LabelValue objects
      */
-    public List<LabelValue> getAllRoles();
+    List<LabelValue> getAllRoles();
 }
Index: service/src/main/java/org/appfuse/service/GenericManager.java
===================================================================
--- service/src/main/java/org/appfuse/service/GenericManager.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/GenericManager.java	(working copy)
@@ -10,6 +10,8 @@
  * for your domain objects.
  *
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
+ * @param <T> a type variable
+ * @param <PK> the primary key for that type
  */
 public interface GenericManager<T, PK extends Serializable> {
 
@@ -18,7 +20,7 @@
      * is the same as lookup up all rows in a table.
      * @return List of populated objects
      */
-    public List<T> getAll();
+    List<T> getAll();
 
     /**
      * Generic method to get an object based on class and identifier. An
@@ -29,24 +31,25 @@
      * @return a populated object
      * @see org.springframework.orm.ObjectRetrievalFailureException
      */
-    public T get(PK id);
-    
+    T get(PK id);
+
     /**
      * Checks for existence of an object of type T using the id arg.
-     * @param id
+     * @param id the identifier (primary key) of the object to get
      * @return - true if it exists, false if it doesn't
      */
-    public boolean exists(PK id);
+    boolean exists(PK id);
 
     /**
      * Generic method to save an object - handles both update and insert.
      * @param object the object to save
+     * @return the updated object
      */
-    public T save(T object);
+    T save(T object);
 
     /**
      * Generic method to delete an object based on class and id
      * @param id the identifier (primary key) of the object to remove
      */
-    public void remove(PK id);
+    void remove(PK id);
 }
Index: service/src/main/java/org/appfuse/service/MailEngine.java
===================================================================
--- service/src/main/java/org/appfuse/service/MailEngine.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/MailEngine.java	(working copy)
@@ -25,7 +25,7 @@
  * @author Matt Raible
  */
 public class MailEngine {
-    protected static final Log log = LogFactory.getLog(MailEngine.class);
+    private final Log log = LogFactory.getLog(MailEngine.class);
     private MailSender mailSender;
     private VelocityEngine velocityEngine;
 
@@ -39,12 +39,11 @@
 
     /**
      * Send a simple message based on a Velocity template.
-     * @param msg
-     * @param templateName
-     * @param model
+     * @param msg the message to populate
+     * @param templateName the Velocity template to use (relative to classpath)
+     * @param model a map containing key/value pairs
      */
-    public void sendMessage(SimpleMailMessage msg, String templateName,
-                            Map model) {
+    public void sendMessage(SimpleMailMessage msg, String templateName, Map model) {
         String result = null;
 
         try {
@@ -62,7 +61,7 @@
 
     /**
      * Send a simple message with pre-populated values.
-     * @param msg
+     * @param msg the message to send
      */
     public void send(SimpleMailMessage msg) {
         try {
@@ -76,13 +75,13 @@
     /**
      * Convenience method for sending messages with attachments.
      * 
-     * @param recipients
-     * @param sender
-     * @param resource
-     * @param bodyText
-     * @param subject
-     * @param attachmentName
-     * @throws MessagingException
+     * @param recipients array of e-mail addresses
+     * @param sender e-mail address of sender
+     * @param resource attachment from classpath
+     * @param bodyText text in e-mail
+     * @param subject subject of e-mail
+     * @param attachmentName name for attachment
+     * @throws MessagingException thrown when can't communicate with SMTP server
      * @author Ben Gill
      */
     public void sendMessage(String[] recipients, String sender, 
Index: service/src/main/java/org/appfuse/service/UserManager.java
===================================================================
--- service/src/main/java/org/appfuse/service/UserManager.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/UserManager.java	(working copy)
@@ -16,7 +16,11 @@
  */
 public interface UserManager extends UniversalManager {
 
-    public void setUserDao(UserDao userDao);
+    /**
+     * Convenience method for testing - allows you to mock the DAO and set it on an interface.
+     * @param userDao the UserDao implementation to use
+     */
+    void setUserDao(UserDao userDao);
 
     /**
      * Retrieves a user by userId.  An exception is thrown if user not found
@@ -24,8 +28,8 @@
      * @param userId the identifier for the user
      * @return User
      */
-    public User getUser(String userId);
-    
+    User getUser(String userId);
+
     /**
      * Finds a user by their username.
      * @param username the user's username used to login
@@ -33,28 +37,28 @@
      * @throws org.acegisecurity.userdetails.UsernameNotFoundException
      *         exception thrown when user not found
      */
-    public User getUserByUsername(String username) throws UsernameNotFoundException;
+    User getUserByUsername(String username) throws UsernameNotFoundException;
 
     /**
      * Retrieves a list of users, filtering with parameters on a user object
      * @param user parameters to filter on
      * @return List
      */
-    public List<User> getUsers(User user);
+    List getUsers(User user);
 
     /**
      * Saves a user's information
      *
      * @param user the user's information
      * @throws UserExistsException thrown when user already exists
-     * @return updated user
+     * @return user the updated user object
      */
-    public User saveUser(User user) throws UserExistsException;
+    User saveUser(User user) throws UserExistsException;
 
     /**
      * Removes a user from the database by their userId
      *
      * @param userId the user's id
      */
-    public void removeUser(String userId);
+    void removeUser(String userId);
 }
Index: service/src/main/java/org/appfuse/service/RoleManager.java
===================================================================
--- service/src/main/java/org/appfuse/service/RoleManager.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/RoleManager.java	(working copy)
@@ -11,8 +11,23 @@
  * @author <a href="mailto:dan@getrolling.com">Dan Kibler </a>
  */
 public interface RoleManager extends UniversalManager {
-    public List getRoles(Role role);
-    public Role getRole(String rolename);
-    public Role saveRole(Role role);
-    public void removeRole(String rolename);
+    /**
+     * {@inheritDoc}
+     */
+    List getRoles(Role role);
+
+    /**
+     * {@inheritDoc}
+     */
+    Role getRole(String rolename);
+
+    /**
+     * {@inheritDoc}
+     */
+    Role saveRole(Role role);
+
+    /**
+     * {@inheritDoc}
+     */
+    void removeRole(String rolename);
 }
Index: service/src/main/java/org/appfuse/service/UserExistsException.java
===================================================================
--- service/src/main/java/org/appfuse/service/UserExistsException.java	(revision 2862)
+++ service/src/main/java/org/appfuse/service/UserExistsException.java	(working copy)
@@ -16,7 +16,7 @@
      *
      * @param message exception message
      */
-    public UserExistsException(String message) {
+    public UserExistsException(final String message) {
         super(message);
     }
 }
Index: service/src/main/java/org/appfuse/util/CurrencyConverter.java
===================================================================
--- service/src/main/java/org/appfuse/util/CurrencyConverter.java	(revision 2862)
+++ service/src/main/java/org/appfuse/util/CurrencyConverter.java	(working copy)
@@ -16,9 +16,13 @@
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
 public class CurrencyConverter implements Converter {
-    protected final Log log = LogFactory.getLog(CurrencyConverter.class);
-    protected final DecimalFormat formatter = new DecimalFormat("###,###.00");
+    private final Log log = LogFactory.getLog(CurrencyConverter.class);
+    private DecimalFormat formatter = new DecimalFormat("###,###.00");
 
+    public void setDecimalFormatter(DecimalFormat df) {
+        this.formatter = df;
+    }
+
     /**
      * Convert a String to a Double and a Double to a String
      *
@@ -62,7 +66,6 @@
             }
         }
 
-        throw new ConversionException("Could not convert " + value + " to " +
-                                      type.getName() + "!");
+        throw new ConversionException("Could not convert " + value + " to " + type.getName() + "!");
     }
 }
Index: service/src/main/java/org/appfuse/util/StringUtil.java
===================================================================
--- service/src/main/java/org/appfuse/util/StringUtil.java	(revision 2862)
+++ service/src/main/java/org/appfuse/util/StringUtil.java	(working copy)
@@ -13,11 +13,14 @@
  * 
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
-public class StringUtil {
-    //~ Static fields/initializers =============================================
+public final class StringUtil {
+    private static final Log log = LogFactory.getLog(StringUtil.class);
 
-    private final static Log log = LogFactory.getLog(StringUtil.class);
-
+    /**
+     * Checkstyle rule: utility classes should not have public constructor
+     */
+    private StringUtil() {
+    }
     //~ Methods ================================================================
 
     /**
@@ -74,8 +77,8 @@
      * This is weak encoding in that anyone can use the decodeString
      * routine to reverse the encoding.
      *
-     * @param str
-     * @return String
+     * @param str the string to encode
+     * @return the encoded string
      */
     public static String encodeString(String str)  {
         Base64 encoder = new Base64();
@@ -85,8 +88,8 @@
     /**
      * Decode a string using Base64 encoding.
      *
-     * @param str
-     * @return String
+     * @param str the string to decode
+     * @return the decoded string
      */
     public static String decodeString(String str) {
         Base64 dec = new Base64();
Index: service/src/main/java/org/appfuse/util/DateConverter.java
===================================================================
--- service/src/main/java/org/appfuse/util/DateConverter.java	(revision 2862)
+++ service/src/main/java/org/appfuse/util/DateConverter.java	(working copy)
@@ -19,6 +19,12 @@
  */
 public class DateConverter implements Converter {
 
+    /**
+     * Convert a date to a String and a String to a Date
+     * @param type String, Date or Timestamp
+     * @param value value to convert
+     * @return Converted value for property population
+     */
     public Object convert(Class type, Object value) {
         if (value == null) {
             return null;
@@ -30,11 +36,17 @@
             return convertToString(type, value);
         }
 
-        throw new ConversionException("Could not convert " +
-                                      value.getClass().getName() + " to " +
-                                      type.getName());
+        throw new ConversionException(
+                "Could not convert " + value.getClass().getName() + " to " + type.getName());
     }
 
+    /**
+     * Convert a String to a Date with the specified pattern.
+     * @param type String
+     * @param value value of String
+     * @param pattern date pattern to parse with
+     * @return Converted value for property population
+     */
     protected Object convertToDate(Class type, Object value, String pattern) {
         DateFormat df = new SimpleDateFormat(pattern);
         if (value instanceof String) {
@@ -54,19 +66,24 @@
             }
         }
 
-        throw new ConversionException("Could not convert " +
-                                      value.getClass().getName() + " to " +
-                                      type.getName());
+        throw new ConversionException(
+                "Could not convert " + value.getClass().getName() + " to " + type.getName());
     }
 
-    protected Object convertToString(Class type, Object value) {        
+    /**
+     * Convert a java.util.Date to a String
+     * @param type Date or Timestamp
+     * @param value value to convert
+     * @return Converted value for property population
+     */
+    protected Object convertToString(Class type, Object value) {
 
         if (value instanceof Date) {
             DateFormat df = new SimpleDateFormat(DateUtil.getDatePattern());
             if (value instanceof Timestamp) {
                 df = new SimpleDateFormat(DateUtil.getDateTimePattern());
             } 
-    
+
             try {
                 return df.format(value);
             } catch (Exception e) {
Index: service/src/main/java/org/appfuse/util/DateUtil.java
===================================================================
--- service/src/main/java/org/appfuse/util/DateUtil.java	(revision 2862)
+++ service/src/main/java/org/appfuse/util/DateUtil.java	(working copy)
@@ -18,12 +18,14 @@
  *  to correct time pattern. Minutes should be mm not MM (MM is month). 
  */
 public class DateUtil {
-    //~ Static fields/initializers =============================================
-
     private static Log log = LogFactory.getLog(DateUtil.class);
-    private static String timePattern = "HH:mm";
+    private static final String TIME_PATTERN = "HH:mm";
 
-    //~ Methods ================================================================
+    /**
+     * Checkstyle rule: utility classes should not have public constructor
+     */
+    private DateUtil() {
+    }
 
     /**
      * Return default datePattern (MM/dd/yyyy)
@@ -38,10 +40,10 @@
         } catch (MissingResourceException mse) {
             defaultDatePattern = "MM/dd/yyyy";
         }
-        
+
         return defaultDatePattern;
     }
-    
+
     public static String getDateTimePattern() {
         return DateUtil.getDatePattern() + " HH:mm:ss.S";
     }
@@ -73,7 +75,7 @@
      * @param strDate a string representation of a date
      * @return a converted Date object
      * @see java.text.SimpleDateFormat
-     * @throws ParseException
+     * @throws ParseException when String doesn't match the expected format
      */
     public static Date convertStringToDate(String aMask, String strDate)
       throws ParseException {
@@ -82,8 +84,7 @@
         df = new SimpleDateFormat(aMask);
 
         if (log.isDebugEnabled()) {
-            log.debug("converting '" + strDate + "' to date with mask '"
-                      + aMask + "'");
+            log.debug("converting '" + strDate + "' to date with mask '" + aMask + "'");
         }
 
         try {
@@ -104,14 +105,14 @@
      * @return the current date/time
      */
     public static String getTimeNow(Date theTime) {
-        return getDateTime(timePattern, theTime);
+        return getDateTime(TIME_PATTERN, theTime);
     }
 
     /**
      * This method returns the current date in the format: MM/dd/yyyy
      * 
      * @return the current date
-     * @throws ParseException
+     * @throws ParseException when String doesn't match the expected format
      */
     public static Calendar getToday() throws ParseException {
         Date today = new Date();
@@ -167,8 +168,7 @@
      * 
      * @param strDate the date to convert (in format MM/dd/yyyy)
      * @return a date object
-     * 
-     * @throws ParseException
+     * @throws ParseException when String doesn't match the expected format
      */
     public static Date convertStringToDate(String strDate)
       throws ParseException {
@@ -181,12 +181,10 @@
 
             aDate = convertStringToDate(getDatePattern(), strDate);
         } catch (ParseException pe) {
-            log.error("Could not convert '" + strDate
-                      + "' to a date, throwing exception");
+            log.error("Could not convert '" + strDate + "' to a date, throwing exception");
             pe.printStackTrace();
             throw new ParseException(pe.getMessage(),
                                      pe.getErrorOffset());
-                    
         }
 
         return aDate;
Index: service/src/main/java/org/appfuse/util/TimestampConverter.java
===================================================================
--- service/src/main/java/org/appfuse/util/TimestampConverter.java	(revision 2862)
+++ service/src/main/java/org/appfuse/util/TimestampConverter.java	(working copy)
@@ -15,8 +15,17 @@
  * @author <a href="mailto:dan@getrolling.com">Dan Kibler</a>
  */
 public class TimestampConverter extends DateConverter {
+    /**
+     * i18n-ized timestamp format - based on values in ApplicationResources.properties
+     */
     public static final String TS_FORMAT = DateUtil.getDatePattern() + " HH:mm:ss.S";
 
+    /**
+     * Convert a String to a date
+     * @param type java.util.Date
+     * @param value the String value
+     * @return a converted date
+     */
     protected Object convertToDate(Class type, Object value) {
         DateFormat df = new SimpleDateFormat(TS_FORMAT);
         if (value instanceof String) {
@@ -35,6 +44,12 @@
                 + value.getClass().getName() + " to " + type.getName());
     }
 
+    /**
+     * Convert from a java.util.Date to a String
+     * @param type java.lang.String
+     * @param value the date instance
+     * @return string version of date using default date pattern
+     */
     protected Object convertToString(Class type, Object value) {
         DateFormat df = new SimpleDateFormat(TS_FORMAT);
         if (value instanceof Date) {
Index: service/src/main/java/org/appfuse/util/ConvertUtil.java
===================================================================
--- service/src/main/java/org/appfuse/util/ConvertUtil.java	(revision 2862)
+++ service/src/main/java/org/appfuse/util/ConvertUtil.java	(working copy)
@@ -20,35 +20,43 @@
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
 public final class ConvertUtil {
-    //~ Static fields/initializers =============================================
+    private static final Log log = LogFactory.getLog(ConvertUtil.class);
 
-    private static Log log = LogFactory.getLog(ConvertUtil.class);
+    /**
+     * Checkstyle rule: utility classes should not have public constructor
+     */
+    private ConvertUtil() {
+    }
 
-    //~ Methods ================================================================
-
     /**
      * Method to convert a ResourceBundle to a Map object.
      * @param rb a given resource bundle
      * @return Map a populated map
      */
-    public static Map<String,String> convertBundleToMap(ResourceBundle rb) {
-        Map<String,String> map = new HashMap<String, String>();
+    public static Map<String, String> convertBundleToMap(ResourceBundle rb) {
+        Map<String, String> map = new HashMap<String, String>();
 
-        for (Enumeration<String> keys = rb.getKeys(); keys.hasMoreElements();) {
+        Enumeration<String> keys = rb.getKeys();
+        while (keys.hasMoreElements()) {
             String key = keys.nextElement();
             map.put(key, rb.getString(key));
         }
 
         return map;
     }
-    
-    public static Map<String,String> convertListToMap(List<LabelValue> list) {
-        Map<String,String> map = new LinkedHashMap<String, String>();
 
+    /**
+     * Convert a java.util.List of LabelValue objects to a LinkedHashMap.
+     * @param list the list to convert
+     * @return the populated map with the label as the key
+     */
+    public static Map<String, String> convertListToMap(List<LabelValue> list) {
+        Map<String, String> map = new LinkedHashMap<String, String>();
+
         for (LabelValue option : list) {
             map.put(option.getLabel(), option.getValue());
         }
-        
+
         return map;
     }
 
@@ -77,7 +85,7 @@
      */
     public static Object populateObject(Object obj, ResourceBundle rb) {
         try {
-            Map<String,String> map = convertBundleToMap(rb);
+            Map<String, String> map = convertBundleToMap(rb);
             BeanUtils.copyProperties(obj, map);
         } catch (Exception e) {
             e.printStackTrace();
Index: plugins/appfuse-maven-plugin/pom.xml
===================================================================
--- plugins/appfuse-maven-plugin/pom.xml	(revision 2864)
+++ plugins/appfuse-maven-plugin/pom.xml	(working copy)
@@ -272,6 +272,9 @@
         <plugins>
             <plugin>
                 <artifactId>maven-checkstyle-plugin</artifactId>
+                <configuration>
+                    <configLocation>https://appfuse.dev.java.net/checkstyle.xml</configLocation>
+                </configuration>
             </plugin>
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
Index: data/hibernate/src/main/java/org/appfuse/dao/GenericDao.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/GenericDao.java	(revision 2862)
+++ data/hibernate/src/main/java/org/appfuse/dao/GenericDao.java	(working copy)
@@ -11,6 +11,8 @@
  * domain objects.
  *
  * @author <a href="mailto:bwnoll@gmail.com">Bryan Noll</a>
+ * @param <T> a type variable
+ * @param <PK> the primary key for that type
  */
 public interface GenericDao <T, PK extends Serializable> {
 
@@ -19,7 +21,7 @@
      * is the same as lookup up all rows in a table.
      * @return List of populated objects
      */
-    public List<T> getAll();
+    List<T> getAll();
 
     /**
      * Generic method to get an object based on class and identifier. An
@@ -30,24 +32,25 @@
      * @return a populated object
      * @see org.springframework.orm.ObjectRetrievalFailureException
      */
-    public T get(PK id);
-    
+    T get(PK id);
+
     /**
      * Checks for existence of an object of type T using the id arg.
-     * @param id
+     * @param id the id of the entity
      * @return - true if it exists, false if it doesn't
      */
-    public boolean exists(PK id);
+    boolean exists(PK id);
 
     /**
      * Generic method to save an object - handles both update and insert.
      * @param object the object to save
+     * @return the persisted object
      */
-    public T save(T object);
+    T save(T object);
 
     /**
      * Generic method to delete an object based on class and id
      * @param id the identifier (primary key) of the object to remove
      */
-    public void remove(PK id);
+    void remove(PK id);
 }
\ No newline at end of file
Index: data/hibernate/src/main/java/org/appfuse/dao/hibernate/LookupDaoHibernate.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/hibernate/LookupDaoHibernate.java	(revision 2862)
+++ data/hibernate/src/main/java/org/appfuse/dao/hibernate/LookupDaoHibernate.java	(working copy)
@@ -13,7 +13,7 @@
 public class LookupDaoHibernate extends UniversalDaoHibernate implements LookupDao {
 
     /**
-     * @see org.appfuse.dao.LookupDao#getRoles()
+     * {@inheritDoc}
      */
     @SuppressWarnings("unchecked")
     public List<Role> getRoles() {
Index: data/hibernate/src/main/java/org/appfuse/dao/hibernate/GenericDaoHibernate.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/hibernate/GenericDaoHibernate.java	(revision 2862)
+++ data/hibernate/src/main/java/org/appfuse/dao/hibernate/GenericDaoHibernate.java	(working copy)
@@ -1,14 +1,14 @@
 package org.appfuse.dao.hibernate;
 
-import java.io.Serializable;
-import java.util.List;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.appfuse.dao.GenericDao;
 import org.springframework.orm.ObjectRetrievalFailureException;
 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
 
+import java.io.Serializable;
+import java.util.List;
+
 /**
  * This class serves as the Base class for all other DAOs - namely to hold
  * common CRUD methods that they might all use. You should only need to extend
@@ -23,20 +23,35 @@
  * </pre>
  *
  * @author <a href="mailto:bwnoll@gmail.com">Bryan Noll</a>
+ * @param <T> a type variable
+ * @param <PK> the primary key for that type
  */
 public class GenericDaoHibernate<T, PK extends Serializable> extends HibernateDaoSupport implements GenericDao<T, PK> {
+    /**
+     * Log variable for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging
+     */
     protected final Log log = LogFactory.getLog(getClass());
     private Class<T> persistentClass;
 
-    public GenericDaoHibernate(Class<T> persistentClass) {
+    /**
+     * Constructor that takes in a class to see which type of entity to persist
+     * @param persistentClass the class type you'd like to persist
+     */
+    public GenericDaoHibernate(final Class<T> persistentClass) {
         this.persistentClass = persistentClass;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @SuppressWarnings("unchecked")
     public List<T> getAll() {
         return super.getHibernateTemplate().loadAll(this.persistentClass);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @SuppressWarnings("unchecked")
     public T get(PK id) {
         T entity = (T) super.getHibernateTemplate().get(this.persistentClass, id);
@@ -48,22 +63,27 @@
 
         return entity;
     }
-    
+
+    /**
+     * {@inheritDoc}
+     */
     @SuppressWarnings("unchecked")
     public boolean exists(PK id) {
         T entity = (T) super.getHibernateTemplate().get(this.persistentClass, id);
-        if (entity == null) {
-            return false;
-        } else {
-            return true;
-        }
+        return entity != null;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @SuppressWarnings("unchecked")
     public T save(T object) {
         return (T) super.getHibernateTemplate().merge(object);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public void remove(PK id) {
         super.getHibernateTemplate().delete(this.get(id));
     }
Index: data/hibernate/src/main/java/org/appfuse/dao/hibernate/UserDaoHibernate.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/hibernate/UserDaoHibernate.java	(revision 2862)
+++ data/hibernate/src/main/java/org/appfuse/dao/hibernate/UserDaoHibernate.java	(working copy)
@@ -1,13 +1,13 @@
 package org.appfuse.dao.hibernate;
 
-import java.util.List;
-
 import org.acegisecurity.userdetails.UserDetails;
 import org.acegisecurity.userdetails.UserDetailsService;
 import org.acegisecurity.userdetails.UsernameNotFoundException;
 import org.appfuse.dao.UserDao;
 import org.appfuse.model.User;
 
+import java.util.List;
+
 /**
  * This class interacts with Spring's HibernateTemplate to save/delete and
  * retrieve User objects.
@@ -20,12 +20,15 @@
 */
 public class UserDaoHibernate extends GenericDaoHibernate<User, Long> implements UserDao, UserDetailsService {
 
+    /**
+     * Constructor that sets the entity to User.class.
+     */
     public UserDaoHibernate() {
         super(User.class);
     }
 
     /**
-     * @see org.appfuse.dao.UserDao#getUsers()
+     * {@inheritDoc}
      */
     @SuppressWarnings("unchecked")
     public List<User> getUsers() {
@@ -33,7 +36,7 @@
     }
 
     /**
-     * @see org.appfuse.dao.UserDao#saveUser(org.appfuse.model.User)
+     * {@inheritDoc}
      */
     public User saveUser(User user) {
         log.debug("user's id: " + user.getId());
@@ -42,11 +45,14 @@
         getHibernateTemplate().flush();
         return user;
     }
-    
+
     /**
      * Overridden simply to call the saveUser method. This is happenening 
      * because saveUser flushes the session and saveObject of BaseDaoHibernate 
      * does not.
+     *
+     * @param user the user to save
+     * @return the modified user (with a primary key set if they're new)
      */
     @Override
     public User save(User user) {
@@ -54,7 +60,7 @@
     }
 
     /** 
-    * @see org.acegisecurity.userdetails.UserDetailsService#loadUserByUsername(java.lang.String)
+     * {@inheritDoc}
     */
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
         List users = getHibernateTemplate().find("from User where username=?", username);
Index: data/hibernate/src/main/java/org/appfuse/dao/hibernate/RoleDaoHibernate.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/hibernate/RoleDaoHibernate.java	(revision 2862)
+++ data/hibernate/src/main/java/org/appfuse/dao/hibernate/RoleDaoHibernate.java	(working copy)
@@ -14,10 +14,16 @@
  */
 public class RoleDaoHibernate extends GenericDaoHibernate<Role, Long> implements RoleDao {
 
+    /**
+     * Constructor to create a Generics-based version using Role as the entity
+     */
     public RoleDaoHibernate() {
         super(Role.class);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public Role getRoleByName(String rolename) {
         List roles = getHibernateTemplate().find("from Role where name=?", rolename);
         if (roles.isEmpty()) {
@@ -26,7 +32,10 @@
             return (Role) roles.get(0);
         }
     }
-    
+
+    /**
+     * {@inheritDoc}
+     */
     public void removeRole(String rolename) {
         Object role = getRoleByName(rolename);
         getHibernateTemplate().delete(role);
Index: data/hibernate/src/main/java/org/appfuse/dao/hibernate/UniversalDaoHibernate.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/hibernate/UniversalDaoHibernate.java	(revision 2862)
+++ data/hibernate/src/main/java/org/appfuse/dao/hibernate/UniversalDaoHibernate.java	(working copy)
@@ -17,17 +17,20 @@
  * @author Bryan Noll
  */
 public class UniversalDaoHibernate extends HibernateDaoSupport implements UniversalDao {
+    /**
+     * Log variable for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging
+     */
     protected final Log log = LogFactory.getLog(getClass());
 
     /**
-     * @see org.appfuse.dao.UniversalDao#save(java.lang.Object)
+     * {@inheritDoc}
      */
     public Object save(Object o) {
         return getHibernateTemplate().merge(o);
     }
 
     /**
-     * @see org.appfuse.dao.UniversalDao#get(java.lang.Class, java.io.Serializable)
+     * {@inheritDoc}
      */
     public Object get(Class clazz, Serializable id) {
         Object o = getHibernateTemplate().get(clazz, id);
@@ -40,14 +43,14 @@
     }
 
     /**
-     * @see org.appfuse.dao.UniversalDao#getAll(java.lang.Class)
+     * {@inheritDoc}
      */
     public List getAll(Class clazz) {
         return getHibernateTemplate().loadAll(clazz);
     }
 
     /**
-     * @see org.appfuse.dao.UniversalDao#remove(java.lang.Class, java.io.Serializable)
+     * {@inheritDoc}
      */
     public void remove(Class clazz, Serializable id) {
         getHibernateTemplate().delete(get(clazz, id));
Index: data/hibernate/src/main/java/org/appfuse/dao/spring/HibernateExtensionPostProcessor.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/spring/HibernateExtensionPostProcessor.java	(revision 2862)
+++ data/hibernate/src/main/java/org/appfuse/dao/spring/HibernateExtensionPostProcessor.java	(working copy)
@@ -1,10 +1,5 @@
 package org.appfuse.dao.spring;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
-import org.springframework.beans.BeansException;
 import org.springframework.beans.MutablePropertyValues;
 import org.springframework.beans.PropertyValue;
 import org.springframework.beans.factory.NoSuchBeanDefinitionException;
@@ -12,11 +7,15 @@
 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
 /**
  * <p>Adds Hibernate persistent class definitions to an existing Spring Session Factory bean, possibly defined
- * within a seperate Spring configuration file in a seperate jar file. By using this extension factory developers can add
- * persistent classes to an AppFuse application without modifying any of the existing AppFuse Spring configuration or
- * jar distribution files.
+ * within a seperate Spring configuration file in a seperate jar file. By using this extension factory developers can
+ * add persistent classes to an AppFuse application without modifying any of the existing AppFuse Spring configuration
+ * or jar distribution files.
  * 
  * <p>As an example consider the following Spring bean configuration:
  * 
@@ -36,12 +35,12 @@
  * </pre>
  * 
  * <p>The snippet will add two persistent classes to an existing Session Factory bean called &quot;sessionFactory&quot;.
- * Note that the extension can handle both annotated classes and the more traditional .hbm.xml files. Assuming that these
- * persistent classes are packaged in a jar called extension.jar which contains the Spring configuration file
- * applicationContext-dao.xml at the root level, then the standard AppFuse configuration will automatically pick up the new
- * Spring configuration file and the new persistent classes will be added to the list already defined for the session factory
- * bean configured within the standard appfuse-hibernate.jar file. And all this without needing to touch the original AppFuse
- * configuration files!
+ * Note that the extension can handle both annotated classes and the more traditional .hbm.xml files. Assuming that
+ * these persistent classes are packaged in a jar called extension.jar which contains the Spring configuration file
+ * applicationContext-dao.xml at the root level, then the standard AppFuse configuration will automatically pick up the
+ * new Spring configuration file and the new persistent classes will be added to the list already defined for the
+ * session factory bean configured within the standard appfuse-hibernate.jar file. And all this without needing to
+ * touch the original AppFuse configuration files!
  *
  * @author Michael Horwitz
  */
@@ -54,11 +53,13 @@
 
     /**
      * Adds the annotated classes and the mapping resources to the existing Session Factory configuration.
+     * @param configurableListableBeanFactory the good ol' bean factory
      */
     @SuppressWarnings("unchecked")
-    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory)  {
         if (configurableListableBeanFactory.containsBean(sessionFactoryBeanName)) {
-            BeanDefinition sessionFactoryBeanDefinition = configurableListableBeanFactory.getBeanDefinition(sessionFactoryBeanName);
+            BeanDefinition sessionFactoryBeanDefinition =
+                    configurableListableBeanFactory.getBeanDefinition(sessionFactoryBeanName);
             MutablePropertyValues propertyValues = sessionFactoryBeanDefinition.getPropertyValues();
 
             if (mappingResources != null) {
@@ -109,8 +110,9 @@
                 existingHibernateProperties.putAll(hibernateProperties);
             }
         } else {
-            throw new NoSuchBeanDefinitionException("No bean named [" + sessionFactoryBeanName + "] exists within the bean factory. " +
-                    "Cannot post process session factory to add Hibernate resource definitions.");
+            throw new NoSuchBeanDefinitionException("No bean named [" + sessionFactoryBeanName
+                    + "] exists within the bean factory. "
+                    + "Cannot post process session factory to add Hibernate resource definitions.");
         }
     }
 
Index: data/hibernate/src/main/java/org/appfuse/dao/UserDao.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/UserDao.java	(revision 2862)
+++ data/hibernate/src/main/java/org/appfuse/dao/UserDao.java	(working copy)
@@ -21,19 +21,19 @@
      * @throws org.acegisecurity.userdetails.UsernameNotFoundException thrown when user not found in database
      */
     @Transactional
-    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
-    
+    UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
+
     /**
      * Gets a list of users ordered by the uppercase version of their username.
      *
      * @return List populated list of users
      */
-    public List<User> getUsers();
+    List<User> getUsers();
 
     /**
      * Saves a user's information.
      * @param user the object to be saved
+     * @return the persisted User object
      */
-    public User saveUser(User user);
-    
+    User saveUser(User user);
 }
Index: data/hibernate/src/main/java/org/appfuse/dao/RoleDao.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/RoleDao.java	(revision 2862)
+++ data/hibernate/src/main/java/org/appfuse/dao/RoleDao.java	(working copy)
@@ -13,11 +13,11 @@
      * @param rolename the rolename
      * @return populated role object
      */
-    public Role getRoleByName(String rolename);
+    Role getRoleByName(String rolename);
 
     /**
      * Removes a role from the database by name
      * @param rolename the role's rolename
      */
-    public void removeRole(String rolename);
+    void removeRole(String rolename);
 }
Index: data/hibernate/src/main/java/org/appfuse/dao/BaseDaoTestCase.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/BaseDaoTestCase.java	(revision 2862)
+++ data/hibernate/src/main/java/org/appfuse/dao/BaseDaoTestCase.java	(working copy)
@@ -1,26 +1,36 @@
 package org.appfuse.dao;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.orm.hibernate3.HibernateTemplate;
+import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
+
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.beans.BeanUtils;
-import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
-import org.springframework.orm.hibernate3.HibernateTemplate;
-import org.hibernate.SessionFactory;
-
 /**
  * Base class for running DAO tests.
  * @author mraible
  */
 public abstract class BaseDaoTestCase extends AbstractTransactionalDataSourceSpringContextTests {
+    /**
+     * Log variable for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging
+     */
     protected final Log log = LogFactory.getLog(getClass());
+    /**
+     * ResourceBundle loaded from src/test/resources/${package.name}/ClassName.properties (if exists)
+     */
     protected ResourceBundle rb;
 
+    /**
+     * Sets AutowireMode to AUTOWIRE_BY_NAME and configures all context files needed to tests DAOs.
+     * @return String array of Spring context files.
+     */
     protected String[] getConfigLocations() {
         setAutowireMode(AUTOWIRE_BY_NAME);
         return new String[] {
@@ -30,7 +40,11 @@
                 "classpath:**/applicationContext*.xml" // for web projects
             };
     }
-    
+
+    /**
+     * Default constructor - populates "rb" variable if properties file exists for the class in
+     * src/test/resources.
+     */
     public BaseDaoTestCase() {
         // Since a ResourceBundle is not required for each class, just
         // do a simple check to see if one exists
@@ -51,8 +65,7 @@
      * @throws Exception if BeanUtils fails to copy properly
      */
     protected Object populate(Object obj) throws Exception {
-        // loop through all the beans methods and set its properties from
-        // its .properties file
+        // loop through all the beans methods and set its properties from its .properties file
         Map<String, String> map = new HashMap<String, String>();
 
         for (Enumeration<String> keys = rb.getKeys(); keys.hasMoreElements();) {
Index: data/hibernate/src/main/java/org/appfuse/dao/UniversalDao.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/UniversalDao.java	(revision 2862)
+++ data/hibernate/src/main/java/org/appfuse/dao/UniversalDao.java	(working copy)
@@ -32,8 +32,8 @@
      * @param clazz the type of objects (a.k.a. while table) to get data from
      * @return List of populated objects
      */
-    public List getAll(Class clazz);
-    
+    List getAll(Class clazz);
+
     /**
      * Generic method to get an object based on class and identifier. An 
      * ObjectRetrievalFailureException Runtime Exception is thrown if 
@@ -44,18 +44,19 @@
      * @return a populated object
      * @see org.springframework.orm.ObjectRetrievalFailureException
      */
-    public Object get(Class clazz, Serializable id);
+    Object get(Class clazz, Serializable id);
 
     /**
      * Generic method to save an object - handles both update and insert.
      * @param o the object to save
+     * @return a populated object
      */
-    public Object save(Object o);
+    Object save(Object o);
 
     /**
      * Generic method to delete an object based on class and id
      * @param clazz model class to lookup
      * @param id the identifier (primary key) of the class
      */
-    public void remove(Class clazz, Serializable id);
+    void remove(Class clazz, Serializable id);
 }
\ No newline at end of file
Index: data/hibernate/src/main/java/org/appfuse/dao/LookupDao.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/LookupDao.java	(revision 2862)
+++ data/hibernate/src/main/java/org/appfuse/dao/LookupDao.java	(working copy)
@@ -4,7 +4,6 @@
 
 import java.util.List;
 
-
 /**
  * Lookup Data Access Object (GenericDao) interface.  This is used to lookup values in
  * the database (i.e. for drop-downs).
@@ -16,6 +15,7 @@
 
     /**
      * Returns all Roles ordered by name
+     * @return populated list of roles
      */
-    public List<Role> getRoles();
+    List<Role> getRoles();
 }
Index: data/common/src/main/java/org/appfuse/model/Role.java
===================================================================
--- data/common/src/main/java/org/appfuse/model/Role.java	(revision 2862)
+++ data/common/src/main/java/org/appfuse/model/Role.java	(working copy)
@@ -30,10 +30,17 @@
     private String name;
     private String description;
 
+    /**
+     * Default constructor - creates a new instance with no values set.
+     */
     public Role() {
     }
 
-    public Role(String name) {
+    /**
+     * Create a new instance and set the name.
+     * @param name name of the role.
+     */
+    public Role(final String name) {
         this.name = name;
     }
 
@@ -44,6 +51,7 @@
 
     /**
      * @see org.acegisecurity.GrantedAuthority#getAuthority()
+     * @return the name property (getAuthority required by Acegi's GrantedAuthority interface)
      */
     @Transient
     public String getAuthority() {
@@ -72,9 +80,16 @@
         this.description = description;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof Role)) return false;
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof Role)) {
+            return false;
+        }
 
         final Role role = (Role) o;
 
@@ -82,10 +97,16 @@
 
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public int hashCode() {
         return (name != null ? name.hashCode() : 0);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.SIMPLE_STYLE)
                 .append(this.name)
Index: data/common/src/main/java/org/appfuse/model/BaseObject.java
===================================================================
--- data/common/src/main/java/org/appfuse/model/BaseObject.java	(revision 2862)
+++ data/common/src/main/java/org/appfuse/model/BaseObject.java	(working copy)
@@ -4,13 +4,32 @@
 
 
 /**
- * Base class for Model objects.  Child objects should implement toString(), 
- * equals() and hashCode();
+ * Base class for Model objects. Child objects should implement toString(),
+ * equals() and hashCode().
  * 
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
 public abstract class BaseObject implements Serializable {    
+
+    /**
+     * Returns a multi-line String with key=value pairs.
+     * @return a String representation of this class.
+     */
     public abstract String toString();
+
+    /**
+     * Compares object equality. When using Hibernate, the primary key should
+     * not be a part of this comparison.
+     * @param o object to compare to
+     * @return true/false based on equality tests
+     */
     public abstract boolean equals(Object o);
+
+    /**
+     * When you override equals, you should override hashCode. See "Why are
+     * equals() and hashCode() importation" for more information:
+     * http://www.hibernate.org/109.html
+     * @return hashCode
+     */
     public abstract int hashCode();
 }
Index: data/common/src/main/java/org/appfuse/model/Address.java
===================================================================
--- data/common/src/main/java/org/appfuse/model/Address.java	(revision 2862)
+++ data/common/src/main/java/org/appfuse/model/Address.java	(working copy)
@@ -17,11 +17,11 @@
 @Embeddable
 public class Address extends BaseObject implements Serializable {
     private static final long serialVersionUID = 3617859655330969141L;
-    protected String address;
-    protected String city;
-    protected String province;
-    protected String country;
-    protected String postalCode;
+    private String address;
+    private String city;
+    private String province;
+    private String country;
+    private String postalCode;
 
     @Column(length=150)
     public String getAddress() {
@@ -68,15 +68,28 @@
         this.province = province;
     }
 
+    /**
+     * Overridden equals method for object comparison. Compares based on hashCode.
+     * @param o Object to compare
+     * @return true/false based on hashCode
+     */
     public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof Address)) return false;
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof Address)) {
+            return false;
+        }
 
         final Address address1 = (Address) o;
 
         return this.hashCode() == address1.hashCode();
     }
 
+    /**
+     * Overridden hashCode method - compares on address, city, province, country and postal code.
+     * @return hashCode
+     */
     public int hashCode() {
         int result;
         result = (address != null ? address.hashCode() : 0);
@@ -87,11 +100,16 @@
         return result;
     }
 
+    /**
+     * Returns a multi-line String with key=value pairs.
+     * @return a String representation of this class.
+     */
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
                 .append("country", this.country)
-                .append("address", this.address).append("province",
-                        this.province).append("postalCode", this.postalCode)
+                .append("address", this.address)
+                .append("province", this.province)
+                .append("postalCode", this.postalCode)
                 .append("city", this.city).toString();
     }
 }
Index: data/common/src/main/java/org/appfuse/model/LabelValue.java
===================================================================
--- data/common/src/main/java/org/appfuse/model/LabelValue.java	(revision 2862)
+++ data/common/src/main/java/org/appfuse/model/LabelValue.java	(working copy)
@@ -14,6 +14,7 @@
  * @see org.apache.struts.util.LabelValueBean
  */
 public class LabelValue implements Comparable, Serializable {
+
     private static final long serialVersionUID = 3689355407466181430L;
 
     /**
@@ -28,7 +29,6 @@
         }
     };
 
-
     // ----------------------------------------------------------- Constructors
 
 
@@ -45,19 +45,18 @@
      * @param label The label to be displayed to the user.
      * @param value The value to be returned to the server.
      */
-    public LabelValue(String label, String value) {
+    public LabelValue(final String label, final String value) {
         this.label = label;
         this.value = value;
     }
 
-
     // ------------------------------------------------------------- Properties
 
 
     /**
      * The property which supplies the option label visible to the end user.
      */
-    private String label = null;
+    private String label;
 
     public String getLabel() {
         return this.label;
@@ -71,7 +70,7 @@
     /**
      * The property which supplies the value returned to the server.
      */
-    private String value = null;
+    private String value;
 
     public String getValue() {
         return this.value;
@@ -89,6 +88,8 @@
      * viewable part of the object.
      *
      * @see Comparable
+     * @param o LabelValue object to compare to
+     * @return 0 if labels match for compared objects
      */
     public int compareTo(Object o) {
         // Implicitly tests for the correct type, throwing
@@ -100,6 +101,7 @@
 
     /**
      * Return a string representation of this object.
+     * @return object as a string
      */
     public String toString() {
         StringBuffer sb = new StringBuffer("LabelValue[");
@@ -114,6 +116,8 @@
      * LabelValueBeans are equal if their values are both null or equal.
      *
      * @see java.lang.Object#equals(java.lang.Object)
+     * @param obj object to compare to
+     * @return true/false based on whether values match or not
      */
     public boolean equals(Object obj) {
         if (obj == this) {
@@ -142,6 +146,7 @@
      * The hash code is based on the object's value.
      *
      * @see java.lang.Object#hashCode()
+     * @return hashCode
      */
     public int hashCode() {
         return (this.getValue() == null) ? 17 : this.getValue().hashCode();
Index: data/common/src/main/java/org/appfuse/model/User.java
===================================================================
--- data/common/src/main/java/org/appfuse/model/User.java	(revision 2862)
+++ data/common/src/main/java/org/appfuse/model/User.java	(working copy)
@@ -5,61 +5,55 @@
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
 
+import javax.persistence.*;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-import javax.persistence.Version;
-
 /**
  * This class represents the basic "user" object in AppFuse that allows for authentication
  * and user management.  It implements Acegi Security's UserDetails interface.
  *
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  *         Updated by Dan Kibler (dan@getrolling.com)
- *  Extended to implement Acegi UserDetails interface
- *      by David Carter david@carter.net
+ *         Extended to implement Acegi UserDetails interface
+ *         by David Carter david@carter.net
  */
 @Entity
 @Table(name="app_user")
 public class User extends BaseObject implements Serializable, UserDetails {
     private static final long serialVersionUID = 3832626162173359411L;
 
-    protected Long id;
-    protected String username;                    // required
-    protected String password;                    // required
-    protected String confirmPassword;
-    protected String passwordHint;
-    protected String firstName;                   // required
-    protected String lastName;                    // required
-    protected String email;                       // required; unique
-    protected String phoneNumber;
-    protected String website;
-    protected Address address = new Address();
-    protected Integer version;
-    protected Set<Role> roles = new HashSet<Role>();
-    protected boolean enabled;
-    protected boolean accountExpired;
-    protected boolean accountLocked;
-    protected boolean credentialsExpired;
+    private Long id;
+    private String username;                    // required
+    private String password;                    // required
+    private String confirmPassword;
+    private String passwordHint;
+    private String firstName;                   // required
+    private String lastName;                    // required
+    private String email;                       // required; unique
+    private String phoneNumber;
+    private String website;
+    private Address address = new Address();
+    private Integer version;
+    private Set<Role> roles = new HashSet<Role>();
+    private boolean enabled;
+    private boolean accountExpired;
+    private boolean accountLocked;
+    private boolean credentialsExpired;
 
+    /**
+     * Default constructor - creates a new instance with no values set.
+     */
     public User() {}
 
-    public User(String username) {
+    /**
+     * Create a new instance and set the username.
+     * @param username login name for user.
+     */
+    public User(final String username) {
         this.username = username;
     }
 
@@ -164,6 +158,7 @@
     
     /**
      * @see org.acegisecurity.userdetails.UserDetails#getAuthorities()
+     * @return GrantedAuthority[] an array of roles.
      */
     @Transient
     public GrantedAuthority[] getAuthorities() {
@@ -287,9 +282,16 @@
         this.credentialsExpired = credentialsExpired;
     }
     
+    /**
+     * {@inheritDoc}
+     */
     public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof User)) return false;
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof User)) {
+            return false;
+        }
 
         final User user = (User) o;
 
@@ -297,17 +299,23 @@
 
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public int hashCode() {
         return (username != null ? username.hashCode() : 0);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public String toString() {
-        ToStringBuilder sb = new ToStringBuilder(this,
-                ToStringStyle.DEFAULT_STYLE).append("username", this.username)
+        ToStringBuilder sb = new ToStringBuilder(this, ToStringStyle.DEFAULT_STYLE)
+                .append("username", this.username)
                 .append("enabled", this.enabled)
-                .append("accountExpired",this.accountExpired)
-                .append("credentialsExpired",this.credentialsExpired)
-                .append("accountLocked",this.accountLocked);
+                .append("accountExpired", this.accountExpired)
+                .append("credentialsExpired", this.credentialsExpired)
+                .append("accountLocked", this.accountLocked);
 
         GrantedAuthority[] auths = this.getAuthorities();
         if (auths != null) {
Index: data/common/src/main/java/org/appfuse/Constants.java
===================================================================
--- data/common/src/main/java/org/appfuse/Constants.java	(revision 2862)
+++ data/common/src/main/java/org/appfuse/Constants.java	(working copy)
@@ -3,32 +3,41 @@
 
 /**
  * Constant values used throughout the application.
+ * 
  *
- * <p>
- * <a href="Constants.java.html"><i>View Source</i></a>
- * </p>
- *
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
 public class Constants {
     //~ Static fields/initializers =============================================
-   
-    /** The name of the ResourceBundle used in this application */
+
+    /**
+     * The name of the ResourceBundle used in this application
+     */
     public static final String BUNDLE_KEY = "ApplicationResources";
 
-    /** The encryption algorithm key to be used for passwords */
+    /**
+     * The encryption algorithm key to be used for passwords
+     */
     public static final String ENC_ALGORITHM = "algorithm";
 
-    /** A flag to indicate if passwords should be encrypted */
+    /**
+     * A flag to indicate if passwords should be encrypted
+     */
     public static final String ENCRYPT_PASSWORD = "encryptPassword";
 
-    /** File separator from System properties */
+    /**
+     * File separator from System properties
+     */
     public static final String FILE_SEP = System.getProperty("file.separator");
 
-    /** User home from System properties */
+    /**
+     * User home from System properties
+     */
     public static final String USER_HOME = System.getProperty("user.home") + FILE_SEP;
 
-    /** The name of the configuration hashmap stored in application scope. */
+    /**
+     * The name of the configuration hashmap stored in application scope.
+     */
     public static final String CONFIG = "appConfig";
 
     /**
@@ -37,7 +46,7 @@
      * to do extra work or have two session-level variables.
      */
     public static final String PREFERRED_LOCALE_KEY = "org.apache.struts2.action.LOCALE";
-    
+
     /**
      * The request scope attribute under which an editable user form is stored
      */
@@ -74,7 +83,7 @@
      * when adding/editing a user.
      */
     public static final String AVAILABLE_ROLES = "availableRoles";
-    
+
     /**
      * The name of the CSS Theme setting.
      */
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/GenericDao.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/GenericDao.java	(revision 2862)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/GenericDao.java	(working copy)
@@ -11,6 +11,8 @@
  * domain objects.
  *
  * @author <a href="mailto:bwnoll@gmail.com">Bryan Noll</a>
+ * @param <T> a type variable
+ * @param <PK> the primary key for that type
  */
 public interface GenericDao <T, PK extends Serializable> {
 
@@ -19,7 +21,7 @@
      * is the same as lookup up all rows in a table.
      * @return List of populated objects
      */
-    public List<T> getAll();
+    List<T> getAll();
 
     /**
      * Generic method to get an object based on class and identifier. An
@@ -30,24 +32,25 @@
      * @return a populated object
      * @see org.springframework.orm.ObjectRetrievalFailureException
      */
-    public T get(PK id);
-    
+    T get(PK id);
+
     /**
      * Checks for existence of an object of type T using the id arg.
-     * @param id
+     * @param id the id of the entity
      * @return - true if it exists, false if it doesn't
      */
-    public boolean exists(PK id);
+    boolean exists(PK id);
 
     /**
      * Generic method to save an object - handles both update and insert.
      * @param object the object to save
+     * @return the persisted object
      */
-    public T save(T object);
+    T save(T object);
 
     /**
      * Generic method to delete an object based on class and id
      * @param id the identifier (primary key) of the object to remove
      */
-    public void remove(PK id);
+    void remove(PK id);
 }
\ No newline at end of file
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/UserDao.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/UserDao.java	(revision 2862)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/UserDao.java	(working copy)
@@ -18,21 +18,22 @@
      * Gets users information based on login name.
      * @param username the user's username
      * @return userDetails populated userDetails object
+     * @throws org.acegisecurity.userdetails.UsernameNotFoundException thrown when user not found in database
      */
     @Transactional
-    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
-    
+    UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
+
     /**
      * Gets a list of users ordered by the uppercase version of their username.
      *
      * @return List populated list of users
      */
-    public List<User> getUsers();
+    List<User> getUsers();
 
     /**
      * Saves a user's information.
      * @param user the object to be saved
+     * @return the persisted User object
      */
-    public User saveUser(User user);
-    
+    User saveUser(User user);
 }
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/RoleDao.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/RoleDao.java	(revision 2862)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/RoleDao.java	(working copy)
@@ -7,17 +7,17 @@
  *
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
-public interface RoleDao extends GenericDao<org.appfuse.model.Role, Long> {
+public interface RoleDao extends GenericDao<Role, Long> {
     /**
      * Gets role information based on rolename
      * @param rolename the rolename
-     * @return role populated role object
+     * @return populated role object
      */
-    public Role getRoleByName(String rolename);
+    Role getRoleByName(String rolename);
 
     /**
      * Removes a role from the database by name
      * @param rolename the role's rolename
      */
-    public void removeRole(String rolename);
+    void removeRole(String rolename);
 }
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/BaseDaoTestCase.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/BaseDaoTestCase.java	(revision 2862)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/BaseDaoTestCase.java	(working copy)
@@ -16,9 +16,19 @@
  * @author mraible
  */
 public abstract class BaseDaoTestCase extends AbstractJpaTests {
+    /**
+     * Log variable for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging
+     */
     protected final Log log = LogFactory.getLog(getClass());
+    /**
+     * ResourceBundle loaded from src/test/resources/${package.name}/ClassName.properties (if exists)
+     */
     protected ResourceBundle rb;
 
+    /**
+     * Sets AutowireMode to AUTOWIRE_BY_NAME and configures all context files needed to tests DAOs.
+     * @return String array of Spring context files.
+     */
     protected String[] getConfigLocations() {
         setAutowireMode(AUTOWIRE_BY_NAME);
         return new String[] {
@@ -28,7 +38,11 @@
                 "classpath:**/applicationContext*.xml" // for web projects
             };
     }
-    
+
+    /**
+     * Default constructor - populates "rb" variable if properties file exists for the class in
+     * src/test/resources.
+     */
     public BaseDaoTestCase() {
         // Since a ResourceBundle is not required for each class, just
         // do a simple check to see if one exists
@@ -49,8 +63,7 @@
      * @throws Exception if BeanUtils fails to copy properly
      */
     protected Object populate(Object obj) throws Exception {
-        // loop through all the beans methods and set its properties from
-        // its .properties file
+        // loop through all the beans methods and set its properties from its .properties file
         Map<String, String> map = new HashMap<String, String>();
 
         for (Enumeration<String> keys = rb.getKeys(); keys.hasMoreElements();) {
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/RoleDaoJpa.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/RoleDaoJpa.java	(revision 2862)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/RoleDaoJpa.java	(working copy)
@@ -16,22 +16,31 @@
  */
 public class RoleDaoJpa extends GenericDaoJpa<Role, Long> implements RoleDao {
 
+    /**
+     * Constructor to create a Generics-based version using Role as the entity
+     */
     public RoleDaoJpa() {
         super(Role.class);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public Role getRoleByName(String rolename) {
         Query q = super.entityManager.createQuery("select r from Role r where r.name = ?");
         q.setParameter(1, rolename);
         List roles = q.getResultList();
-        
+
         if (roles.isEmpty()) {
             return null;
         } else {
             return (Role) roles.get(0);
         }
     }
-    
+
+    /**
+     * {@inheritDoc}
+     */
     public void removeRole(String rolename) {
         Object role = getRoleByName(rolename);
         super.entityManager.remove(role);
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UniversalDaoJpa.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UniversalDaoJpa.java	(revision 2862)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UniversalDaoJpa.java	(working copy)
@@ -1,16 +1,15 @@
 package org.appfuse.dao.jpa;
 
-import java.io.Serializable;
-import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.appfuse.dao.UniversalDao;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityNotFoundException;
 import javax.persistence.PersistenceContext;
+import java.io.Serializable;
+import java.util.List;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.appfuse.dao.UniversalDao;
-
 /**
  * This class serves as the a class that can CRUD any object witout any
  * Spring configuration. The only downside is it does require casting
@@ -19,23 +18,29 @@
  * @author Bryan Noll
  */
 public class UniversalDaoJpa implements UniversalDao {
+    /**
+     * Log variable for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging
+     */
     protected final Log log = LogFactory.getLog(getClass());
+    /**
+     * Entity manager, injected by Spring using @PersistenceContext annotation on setEntityManager()
+     */
     protected EntityManager entityManager;
-    
+
     @PersistenceContext(unitName="ApplicationEntityManager")
     public void setEntityManager(EntityManager entityManager) {
         this.entityManager = entityManager;
     }
 
     /**
-     * @see org.appfuse.dao.UniversalDao#save(java.lang.Object)
+     * {@inheritDoc}
      */
     public Object save(Object o) {
         return this.entityManager.merge(o);
     }
 
     /**
-     * @see org.appfuse.dao.UniversalDao#get(java.lang.Class, java.io.Serializable)
+     * {@inheritDoc}
      */
     @SuppressWarnings("unchecked")
     public Object get(Class clazz, Serializable id) {
@@ -51,14 +56,14 @@
     }
 
     /**
-     * @see org.appfuse.dao.UniversalDao#getAll(java.lang.Class)
+     * {@inheritDoc}
      */
     public List getAll(Class clazz) {
         return this.entityManager.createQuery("select obj from " + clazz + " obj").getResultList();
     }
 
     /**
-     * @see org.appfuse.dao.UniversalDao#remove(java.lang.Class, java.io.Serializable)
+     * {@inheritDoc}
      */
     public void remove(Class clazz, Serializable id) {
         this.entityManager.remove(this.get(clazz, id));
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/LookupDaoJpa.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/LookupDaoJpa.java	(revision 2862)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/LookupDaoJpa.java	(working copy)
@@ -13,7 +13,7 @@
 public class LookupDaoJpa extends UniversalDaoJpa implements LookupDao {
 
     /**
-     * @see org.appfuse.dao.LookupDao#getRoles()
+     * {@inheritDoc}
      */
     @SuppressWarnings("unchecked")
     public List<Role> getRoles() {
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/GenericDaoJpa.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/GenericDaoJpa.java	(revision 2862)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/GenericDaoJpa.java	(working copy)
@@ -1,16 +1,15 @@
 package org.appfuse.dao.jpa;
 
-import java.io.Serializable;
-import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.appfuse.dao.GenericDao;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityNotFoundException;
 import javax.persistence.PersistenceContext;
+import java.io.Serializable;
+import java.util.List;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.appfuse.dao.GenericDao;
-
 /**
  * This class serves as the Base class for all other DAOs - namely to hold
  * common CRUD methods that they might all use. You should only need to extend
@@ -25,21 +24,36 @@
  * </pre>
  *
  * @author <a href="mailto:bwnoll@gmail.com">Bryan Noll</a>
+ * @param <T> a type variable
+ * @param <PK> the primary key for that type
  */
 public class GenericDaoJpa<T, PK extends Serializable> implements GenericDao<T, PK> {
+    /**
+     * Log variable for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging
+     */
     protected final Log log = LogFactory.getLog(getClass());
+    /**
+     * Entity manager, injected by Spring using @PersistenceContext annotation on setEntityManager()
+     */
     protected EntityManager entityManager;
     private Class<T> persistentClass;
-    
-    public GenericDaoJpa(Class<T> persistentClass) {
+
+    /**
+     * Constructor that takes in a class to see which type of entity to persist
+     * @param persistentClass the class type you'd like to persist
+     */
+    public GenericDaoJpa(final Class<T> persistentClass) {
         this.persistentClass = persistentClass;
     }
-    
+
     @PersistenceContext(unitName="ApplicationEntityManager")
     public void setEntityManager(EntityManager entityManager) {
         this.entityManager = entityManager;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @SuppressWarnings("unchecked")
     public List<T> getAll() {
         return this.entityManager.createQuery(
@@ -47,7 +61,10 @@
                 .getResultList();
     }
 
-    public T get(PK id) {        
+    /**
+     * {@inheritDoc}
+     */
+    public T get(PK id) {
         T entity = (T) this.entityManager.find(this.persistentClass, id);
 
         if (entity == null) {
@@ -58,21 +75,25 @@
 
         return entity;
     }
-    
+
+    /**
+     * {@inheritDoc}
+     */
     public boolean exists(PK id) {
-        T entity = (T) this.entityManager.find(this.persistentClass, id);
-        
-        if (entity == null) {
-            return false;
-        } else {
-            return true;
-        }
+        T entity = this.entityManager.find(this.persistentClass, id);
+        return entity != null;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public T save(T object) {
         return this.entityManager.merge(object);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public void remove(PK id) {
         this.entityManager.remove(this.get(id));
     }
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UserDaoJpa.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UserDaoJpa.java	(revision 2862)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UserDaoJpa.java	(working copy)
@@ -23,12 +23,15 @@
 */
 public class UserDaoJpa extends GenericDaoJpa<User, Long> implements UserDao, UserDetailsService {
 
+    /**
+     * Constructor that sets the entity to User.class.
+     */
     public UserDaoJpa() {
         super(User.class);
     }
 
     /**
-     * @see org.appfuse.dao.UserDao#getUsers()
+     * {@inheritDoc}
      */
     @SuppressWarnings("unchecked")
     public List<User> getUsers() {
@@ -36,9 +39,9 @@
         return q.getResultList();
     }
 
-    /** 
-    * @see org.acegisecurity.userdetails.UserDetailsService#loadUserByUsername(java.lang.String)
-    */
+    /**
+     * {@inheritDoc}
+     */
     @SuppressWarnings("unchecked")
     @Transactional
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
@@ -51,7 +54,12 @@
             return users.get(0);
         }
     }
-    
+
+    /**
+     * Save user and flush entityManager
+     * @param user the user to save
+     * @return the updated user
+     */
     public User saveUser(User user) {
         User u = super.save(user);
         entityManager.flush();
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/UniversalDao.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/UniversalDao.java	(revision 2862)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/UniversalDao.java	(working copy)
@@ -32,8 +32,8 @@
      * @param clazz the type of objects (a.k.a. while table) to get data from
      * @return List of populated objects
      */
-    public List getAll(Class clazz);
-    
+    List getAll(Class clazz);
+
     /**
      * Generic method to get an object based on class and identifier. An 
      * ObjectRetrievalFailureException Runtime Exception is thrown if 
@@ -44,18 +44,19 @@
      * @return a populated object
      * @see org.springframework.orm.ObjectRetrievalFailureException
      */
-    public Object get(Class clazz, Serializable id);
+    Object get(Class clazz, Serializable id);
 
     /**
      * Generic method to save an object - handles both update and insert.
      * @param o the object to save
+     * @return a populated object
      */
-    public Object save(Object o);
+    Object save(Object o);
 
     /**
      * Generic method to delete an object based on class and id
      * @param clazz model class to lookup
      * @param id the identifier (primary key) of the class
      */
-    public void remove(Class clazz, Serializable id);
+    void remove(Class clazz, Serializable id);
 }
\ No newline at end of file
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/LookupDao.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/LookupDao.java	(revision 2862)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/LookupDao.java	(working copy)
@@ -4,7 +4,6 @@
 
 import java.util.List;
 
-
 /**
  * Lookup Data Access Object (GenericDao) interface.  This is used to lookup values in
  * the database (i.e. for drop-downs).
@@ -16,6 +15,7 @@
 
     /**
      * Returns all Roles ordered by name
+     * @return populated list of roles
      */
-    public List<Role> getRoles();
+    List<Role> getRoles();
 }
Index: data/ibatis/src/test/java/org/appfuse/dao/RoleDaoTest.java
===================================================================
--- data/ibatis/src/test/java/org/appfuse/dao/RoleDaoTest.java	(revision 2862)
+++ data/ibatis/src/test/java/org/appfuse/dao/RoleDaoTest.java	(working copy)
@@ -26,6 +26,8 @@
         role.setDescription("test descr");
 
         role = dao.save(role);
+
+        role = dao.getRoleByName("ROLE_USER");
         assertEquals(role.getDescription(), "test descr");
     }
 
Index: data/ibatis/src/main/java/org/appfuse/dao/GenericDao.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/GenericDao.java	(revision 2862)
+++ data/ibatis/src/main/java/org/appfuse/dao/GenericDao.java	(working copy)
@@ -11,6 +11,8 @@
  * domain objects.
  *
  * @author <a href="mailto:bwnoll@gmail.com">Bryan Noll</a>
+ * @param <T> a type variable
+ * @param <PK> the primary key for that type
  */
 public interface GenericDao <T, PK extends Serializable> {
 
@@ -19,7 +21,7 @@
      * is the same as lookup up all rows in a table.
      * @return List of populated objects
      */
-    public List<T> getAll();
+    List<T> getAll();
 
     /**
      * Generic method to get an object based on class and identifier. An
@@ -30,24 +32,25 @@
      * @return a populated object
      * @see org.springframework.orm.ObjectRetrievalFailureException
      */
-    public T get(PK id);
-    
+    T get(PK id);
+
     /**
      * Checks for existence of an object of type T using the id arg.
-     * @param id
+     * @param id the id of the entity
      * @return - true if it exists, false if it doesn't
      */
-    public boolean exists(PK id);
+    boolean exists(PK id);
 
     /**
      * Generic method to save an object - handles both update and insert.
      * @param object the object to save
+     * @return the persisted object
      */
-    public T save(T object);
+    T save(T object);
 
     /**
      * Generic method to delete an object based on class and id
      * @param id the identifier (primary key) of the object to remove
      */
-    public void remove(PK id);
+    void remove(PK id);
 }
\ No newline at end of file
Index: data/ibatis/src/main/java/org/appfuse/dao/UserDao.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/UserDao.java	(revision 2862)
+++ data/ibatis/src/main/java/org/appfuse/dao/UserDao.java	(working copy)
@@ -12,27 +12,28 @@
  *
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
-public interface UserDao extends GenericDao<org.appfuse.model.User, Long> {
+public interface UserDao extends GenericDao<User, Long> {
 
     /**
      * Gets users information based on login name.
      * @param username the user's username
      * @return userDetails populated userDetails object
+     * @throws org.acegisecurity.userdetails.UsernameNotFoundException thrown when user not found in database
      */
     @Transactional
-    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
-    
+    UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
+
     /**
      * Gets a list of users ordered by the uppercase version of their username.
      *
      * @return List populated list of users
      */
-    public List<User> getUsers();
+    List<User> getUsers();
 
     /**
      * Saves a user's information.
      * @param user the object to be saved
+     * @return the persisted User object
      */
-    public User saveUser(User user);
-    
+    User saveUser(User user);
 }
Index: data/ibatis/src/main/java/org/appfuse/dao/RoleDao.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/RoleDao.java	(revision 2862)
+++ data/ibatis/src/main/java/org/appfuse/dao/RoleDao.java	(working copy)
@@ -7,17 +7,17 @@
  *
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
-public interface RoleDao extends GenericDao<org.appfuse.model.Role, Long> {
+public interface RoleDao extends GenericDao<Role, Long> {
     /**
      * Gets role information based on rolename
      * @param rolename the rolename
-     * @return role populated role object
+     * @return populated role object
      */
-    public Role getRoleByName(String rolename);
+    Role getRoleByName(String rolename);
 
     /**
      * Removes a role from the database by name
      * @param rolename the role's rolename
      */
-    public void removeRole(String rolename);
+    void removeRole(String rolename);
 }
Index: data/ibatis/src/main/java/org/appfuse/dao/BaseDaoTestCase.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/BaseDaoTestCase.java	(revision 2862)
+++ data/ibatis/src/main/java/org/appfuse/dao/BaseDaoTestCase.java	(working copy)
@@ -1,24 +1,34 @@
 package org.appfuse.dao;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
+
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.beans.BeanUtils;
-import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
-
 /**
  * Base class for running DAO tests.
  * @author mraible
  */
 public abstract class BaseDaoTestCase extends AbstractTransactionalDataSourceSpringContextTests {
+    /**
+     * Log variable for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging
+     */
     protected final Log log = LogFactory.getLog(getClass());
+    /**
+     * ResourceBundle loaded from src/test/resources/${package.name}/ClassName.properties (if exists)
+     */
     protected ResourceBundle rb;
 
+    /**
+     * Sets AutowireMode to AUTOWIRE_BY_NAME and configures all context files needed to tests DAOs.
+     * @return String array of Spring context files.
+     */
     protected String[] getConfigLocations() {
         setAutowireMode(AUTOWIRE_BY_NAME);
         return new String[] {
@@ -28,7 +38,11 @@
                 "classpath:**/applicationContext*.xml" // for web projects
             };
     }
-    
+
+    /**
+     * Default constructor - populates "rb" variable if properties file exists for the class in
+     * src/test/resources.
+     */
     public BaseDaoTestCase() {
         // Since a ResourceBundle is not required for each class, just
         // do a simple check to see if one exists
@@ -49,8 +63,7 @@
      * @throws Exception if BeanUtils fails to copy properly
      */
     protected Object populate(Object obj) throws Exception {
-        // loop through all the beans methods and set its properties from
-        // its .properties file
+        // loop through all the beans methods and set its properties from its .properties file
         Map<String, String> map = new HashMap<String, String>();
 
         for (Enumeration<String> keys = rb.getKeys(); keys.hasMoreElements();) {
Index: data/ibatis/src/main/java/org/appfuse/dao/ibatis/iBatisDaoUtils.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/ibatis/iBatisDaoUtils.java	(revision 2862)
+++ data/ibatis/src/main/java/org/appfuse/dao/ibatis/iBatisDaoUtils.java	(working copy)
@@ -14,12 +14,25 @@
  *
  * @author Bobby Diaz, Bryan Noll
  */
-public class iBatisDaoUtils {
-    
+public final class iBatisDaoUtils {
+    /**
+     * Log variable for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging
+     */
     protected static final Log log = LogFactory.getLog(iBatisDaoUtils.class);
-    
+
+    /**
+     * Checkstyle rule: utility classes should not have public constructor
+     */
+    private iBatisDaoUtils() {
+    }
+
+    /**
+     * Get primary key field name from object. Looks for "id", "Id" and "version".
+     * @param o the object to examine
+     * @return the fieldName
+     */
     protected static String getPrimaryKeyFieldName(Object o) {
-        Field fieldlist[] = o.getClass().getDeclaredFields();
+        Field[] fieldlist = o.getClass().getDeclaredFields();
         String fieldName = null;
         for (Field fld : fieldlist) {
             if (fld.getName().equals("id") || fld.getName().indexOf("Id") > -1 || fld.getName().equals("version")) {
@@ -30,8 +43,13 @@
         return fieldName;
     }
 
+    /**
+     * Get the object type of the primary key
+     * @param o the object to examine
+     * @return the class type
+     */
     protected static Class getPrimaryKeyFieldType(Object o) {
-        Field fieldlist[] = o.getClass().getDeclaredFields();
+        Field[] fieldlist = o.getClass().getDeclaredFields();
         Class fieldType = null;
         for (Field fld : fieldlist) {
             if (fld.getName().equals("id") || fld.getName().indexOf("Id") > -1 || fld.getName().equals("version")) {
@@ -42,11 +60,16 @@
         return fieldType;
     }
 
+    /**
+     * Get the value of the primary key using reflection.
+     * @param o the object to examine
+     * @return the value as an Object
+     */
     protected static Object getPrimaryKeyValue(Object o) {
         // Use reflection to find the first property that has the name "id" or "Id"
         String fieldName = getPrimaryKeyFieldName(o);
         String getterMethod = "get" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1); 
-        
+
         try {
             Method getMethod = o.getClass().getMethod(getterMethod, (Class[]) null);
             return getMethod.invoke(o, (Object[]) null);
@@ -56,10 +79,15 @@
         }
         return null;
     }
-    
+
+    /**
+     * Prepare object for save or update by looking for a "version" field and incrementing it if it exists.
+     * This should probably be changed to look for the @Version annotation instead.
+     * @param o the object to examine
+     */
     protected static void prepareObjectForSaveOrUpdate(Object o) {
         try {
-            Field fieldlist[] = o.getClass().getDeclaredFields();
+            Field[] fieldlist = o.getClass().getDeclaredFields();
             for (Field fld : fieldlist) {
                 String fieldName = fld.getName();
                 if (fieldName.equals("version")) {
@@ -78,6 +106,12 @@
         }
     }
 
+    /**
+     * Sets the primary key's value
+     * @param o the object to examine
+     * @param clazz the class type of the primary key
+     * @param value the value of the new primary key
+     */
     protected static void setPrimaryKey(Object o, Class clazz, Object value) {
         String fieldName = getPrimaryKeyFieldName(o);
         String setMethodName = "set" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);
Index: data/ibatis/src/main/java/org/appfuse/dao/ibatis/RoleDaoiBatis.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/ibatis/RoleDaoiBatis.java	(revision 2862)
+++ data/ibatis/src/main/java/org/appfuse/dao/ibatis/RoleDaoiBatis.java	(working copy)
@@ -1,10 +1,10 @@
 package org.appfuse.dao.ibatis;
 
-import java.util.List;
-
 import org.appfuse.dao.RoleDao;
 import org.appfuse.model.Role;
 
+import java.util.List;
+
 /**
  * This class interacts with iBatis's SQL Maps to save/delete and
  * retrieve Role objects.
@@ -12,20 +12,32 @@
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
 public class RoleDaoiBatis extends GenericDaoiBatis<Role, Long> implements RoleDao {
-    
+
+    /**
+     * Constructor to create a Generics-based version using Role as the entity
+     */
     public RoleDaoiBatis() {
         super(Role.class);
     }
 
-    @Override @SuppressWarnings("unchecked") 
+    /**
+     * {@inheritDoc}
+     */
+    @Override @SuppressWarnings("unchecked")
     public List<Role> getAll() {
         return getSqlMapClientTemplate().queryForList("getRoles", null);
     }
-    
+
+    /**
+     * {@inheritDoc}
+     */
     public Role getRoleByName(String name) {
         return (Role) getSqlMapClientTemplate().queryForObject("getRoleByName", name);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public Role save(final Role role) {
         if (role.getId() == null) {
@@ -36,6 +48,9 @@
         return role;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public void removeRole(String rolename) {
         getSqlMapClientTemplate().update("deleteRole", rolename);
     }
Index: data/ibatis/src/main/java/org/appfuse/dao/ibatis/UniversalDaoiBatis.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/ibatis/UniversalDaoiBatis.java	(revision 2862)
+++ data/ibatis/src/main/java/org/appfuse/dao/ibatis/UniversalDaoiBatis.java	(working copy)
@@ -1,8 +1,5 @@
 package org.appfuse.dao.ibatis;
 
-import java.io.Serializable;
-import java.util.List;
-
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -11,6 +8,9 @@
 import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
 import org.springframework.util.ClassUtils;
 
+import java.io.Serializable;
+import java.util.List;
+
 /**
  * This class serves as the a class that can CRUD any object witout any
  * Spring configuration. The only downside is it does require casting
@@ -19,20 +19,34 @@
  * @author Bobby Diaz, Bryan Noll
  */
 public class UniversalDaoiBatis extends SqlMapClientDaoSupport implements UniversalDao {
+    /**
+     * Log variable for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging
+     */
     protected final Log log = LogFactory.getLog(getClass());
 
+    /**
+     * {@inheritDoc}
+     */
     public List getAll(Class clazz) {
-        return getSqlMapClientTemplate().queryForList(iBatisDaoUtils.getSelectQuery(ClassUtils.getShortName(clazz)), null);
+        return getSqlMapClientTemplate().queryForList(
+                iBatisDaoUtils.getSelectQuery(ClassUtils.getShortName(clazz)), null);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public Object get(Class clazz, Serializable primaryKey) {
-        Object object = getSqlMapClientTemplate().queryForObject(iBatisDaoUtils.getFindQuery(ClassUtils.getShortName(clazz)), primaryKey);
+        Object object = getSqlMapClientTemplate().queryForObject(
+                iBatisDaoUtils.getFindQuery(ClassUtils.getShortName(clazz)), primaryKey);
         if (object == null) {
             throw new ObjectRetrievalFailureException(ClassUtils.getShortName(clazz), primaryKey);
         }
         return object;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public Object save(final Object object) {
         String className = ClassUtils.getShortName(object.getClass());
         Object primaryKey = iBatisDaoUtils.getPrimaryKeyValue(object);
@@ -44,7 +58,7 @@
         }
 
         // check for new record
-        if (StringUtils.isBlank(keyId)) {  
+        if (StringUtils.isBlank(keyId)) {
             iBatisDaoUtils.prepareObjectForSaveOrUpdate(object);
             primaryKey = getSqlMapClientTemplate().insert(iBatisDaoUtils.getInsertQuery(className), object);
 
@@ -66,6 +80,9 @@
         }
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public void remove(Class clazz, Serializable primaryKey) {
         getSqlMapClientTemplate().update(iBatisDaoUtils.getDeleteQuery(ClassUtils.getShortName(clazz)), primaryKey);
     }
Index: data/ibatis/src/main/java/org/appfuse/dao/ibatis/LookupDaoiBatis.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/ibatis/LookupDaoiBatis.java	(revision 2862)
+++ data/ibatis/src/main/java/org/appfuse/dao/ibatis/LookupDaoiBatis.java	(working copy)
@@ -13,11 +13,11 @@
 public class LookupDaoiBatis extends UniversalDaoiBatis implements LookupDao {
 
     /**
-     * @see org.appfuse.dao.LookupDao#getRoles()
+     * {@inheritDoc}
      */
     @SuppressWarnings("unchecked")
     public List<Role> getRoles() {
-        logger.debug("retrieving all role names...");
+        log.debug("retrieving all role names...");
 
         return getSqlMapClientTemplate().queryForList("getRoles", null);
     }
Index: data/ibatis/src/main/java/org/appfuse/dao/ibatis/GenericDaoiBatis.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/ibatis/GenericDaoiBatis.java	(revision 2862)
+++ data/ibatis/src/main/java/org/appfuse/dao/ibatis/GenericDaoiBatis.java	(working copy)
@@ -1,8 +1,5 @@
 package org.appfuse.dao.ibatis;
 
-import java.io.Serializable;
-import java.util.List;
-
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -11,6 +8,9 @@
 import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
 import org.springframework.util.ClassUtils;
 
+import java.io.Serializable;
+import java.util.List;
+
 /**
  * This class serves as the Base class for all other DAOs - namely to hold
  * common CRUD methods that they might all use. You should only need to extend
@@ -25,40 +25,61 @@
  * </pre>
  *
  * @author Bobby Diaz, Bryan Noll
+ * @param <T> a type variable
+ * @param <PK> the primary key for that type
  */
 public class GenericDaoiBatis<T, PK extends Serializable> extends SqlMapClientDaoSupport implements GenericDao<T, PK> {
+    /**
+     * Log variable for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging
+     */
     protected final Log log = LogFactory.getLog(getClass());
     private Class<T> persistentClass;
 
-    public GenericDaoiBatis(Class<T> persistentClass) {
+    /**
+     * Constructor that takes in a class to see which type of entity to persist
+     * @param persistentClass the class type you'd like to persist
+     */
+    public GenericDaoiBatis(final Class<T> persistentClass) {
         this.persistentClass = persistentClass;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @SuppressWarnings("unchecked")
     public List<T> getAll() {
-        return getSqlMapClientTemplate().queryForList(iBatisDaoUtils.getSelectQuery(ClassUtils.getShortName(this.persistentClass)), null);
+        return getSqlMapClientTemplate().queryForList(
+                iBatisDaoUtils.getSelectQuery(ClassUtils.getShortName(this.persistentClass)), null);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @SuppressWarnings("unchecked")
     public T get(PK id) {
-        T object = (T) getSqlMapClientTemplate().queryForObject(iBatisDaoUtils.getFindQuery(ClassUtils.getShortName(this.persistentClass)), id);
+        T object = (T) getSqlMapClientTemplate().queryForObject(
+                iBatisDaoUtils.getFindQuery(ClassUtils.getShortName(this.persistentClass)), id);
         if (object == null) {
             log.warn("Uh oh, '" + this.persistentClass + "' object with id '" + id + "' not found...");
             throw new ObjectRetrievalFailureException(ClassUtils.getShortName(this.persistentClass), id);
         }
         return object;
     }
-    
+
+    /**
+     * {@inheritDoc}
+     */
     @SuppressWarnings("unchecked")
     public boolean exists(PK id) {
-        T object = (T) getSqlMapClientTemplate().queryForObject(iBatisDaoUtils.getFindQuery(ClassUtils.getShortName(this.persistentClass)), id);
-        if (object == null) {
-            return false;
-        } else {
-            return true;
-        }
+        T object = (T) getSqlMapClientTemplate().queryForObject(
+                iBatisDaoUtils.getFindQuery(ClassUtils.getShortName(this.persistentClass)), id);
+        return object != null;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
     public T save(final T object) {
         String className = ClassUtils.getShortName(object.getClass());
         Object primaryKey = iBatisDaoUtils.getPrimaryKeyValue(object);
@@ -88,7 +109,11 @@
         }
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public void remove(PK id) {
-        getSqlMapClientTemplate().update(iBatisDaoUtils.getDeleteQuery(ClassUtils.getShortName(this.persistentClass)), id);
+        getSqlMapClientTemplate().update(
+                iBatisDaoUtils.getDeleteQuery(ClassUtils.getShortName(this.persistentClass)), id);
     }
 }
Index: data/ibatis/src/main/java/org/appfuse/dao/ibatis/UserDaoiBatis.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/ibatis/UserDaoiBatis.java	(revision 2862)
+++ data/ibatis/src/main/java/org/appfuse/dao/ibatis/UserDaoiBatis.java	(working copy)
@@ -1,10 +1,5 @@
 package org.appfuse.dao.ibatis;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
 import org.acegisecurity.userdetails.UserDetails;
 import org.acegisecurity.userdetails.UserDetailsService;
 import org.acegisecurity.userdetails.UsernameNotFoundException;
@@ -13,6 +8,11 @@
 import org.appfuse.model.User;
 import org.springframework.orm.ObjectRetrievalFailureException;
 
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
 /**
  * This class interacts with iBatis's SQL Maps to save and retrieve User
  * related objects.
@@ -20,11 +20,14 @@
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
 public class UserDaoiBatis extends GenericDaoiBatis<User, Long>implements UserDao, UserDetailsService {
-    
+
+    /**
+     * Constructor that sets the entity to User.class.
+     */
     public UserDaoiBatis() {
         super(org.appfuse.model.User.class);
     }
-    
+
     /**
      * Get user by id.
      *
@@ -48,7 +51,7 @@
     }
 
     /**
-     * @see org.appfuse.dao.UserDao#getUsers()
+     * {@inheritDoc}
      */
     @SuppressWarnings("unchecked")
     public List<User> getUsers() {
@@ -90,11 +93,11 @@
     }
 
     /**
-     * @see org.appfuse.dao.UserDao#saveUser(org.appfuse.model.User)
+     * {@inheritDoc}
      */
     public User saveUser(final User user) {
         iBatisDaoUtils.prepareObjectForSaveOrUpdate(user);
-        
+
         if (user.getId() == null) {
             Long id = (Long) getSqlMapClientTemplate().insert("addUser", user);
             user.setId(id);
@@ -108,14 +111,17 @@
     }
 
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public void remove(Long userId) {
         deleteUserRoles(userId);
         getSqlMapClientTemplate().update("deleteUser", userId);
     }
-    
-    /** 
-     * @see org.acegisecurity.userdetails.UserDetailsService#loadUserByUsername(java.lang.String)
+
+    /**
+     * {@inheritDoc}
      */
      @SuppressWarnings("unchecked")
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Index: data/ibatis/src/main/java/org/appfuse/dao/UniversalDao.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/UniversalDao.java	(revision 2862)
+++ data/ibatis/src/main/java/org/appfuse/dao/UniversalDao.java	(working copy)
@@ -32,8 +32,8 @@
      * @param clazz the type of objects (a.k.a. while table) to get data from
      * @return List of populated objects
      */
-    public List getAll(Class clazz);
-    
+    List getAll(Class clazz);
+
     /**
      * Generic method to get an object based on class and identifier. An 
      * ObjectRetrievalFailureException Runtime Exception is thrown if 
@@ -44,18 +44,19 @@
      * @return a populated object
      * @see org.springframework.orm.ObjectRetrievalFailureException
      */
-    public Object get(Class clazz, Serializable id);
+    Object get(Class clazz, Serializable id);
 
     /**
      * Generic method to save an object - handles both update and insert.
      * @param o the object to save
+     * @return a populated object
      */
-    public Object save(Object o);
+    Object save(Object o);
 
     /**
      * Generic method to delete an object based on class and id
      * @param clazz model class to lookup
      * @param id the identifier (primary key) of the class
      */
-    public void remove(Class clazz, Serializable id);
+    void remove(Class clazz, Serializable id);
 }
\ No newline at end of file
Index: data/ibatis/src/main/java/org/appfuse/dao/LookupDao.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/LookupDao.java	(revision 2862)
+++ data/ibatis/src/main/java/org/appfuse/dao/LookupDao.java	(working copy)
@@ -4,7 +4,6 @@
 
 import java.util.List;
 
-
 /**
  * Lookup Data Access Object (GenericDao) interface.  This is used to lookup values in
  * the database (i.e. for drop-downs).
@@ -16,6 +15,7 @@
 
     /**
      * Returns all Roles ordered by name
+     * @return populated list of roles
      */
-    public List<Role> getRoles();
+    List<Role> getRoles();
 }
Index: web/struts/src/main/java/org/appfuse/webapp/taglib/CountryTag.java
===================================================================
--- web/struts/src/main/java/org/appfuse/webapp/taglib/CountryTag.java	(revision 2862)
+++ web/struts/src/main/java/org/appfuse/webapp/taglib/CountryTag.java	(working copy)
@@ -28,8 +28,6 @@
  *
  * @author Jens Fischer, Matt Raible
  * @version $Revision: 1.4.2.1 $ $Date: 2006-06-10 08:00:48 -0600 (Sat, 10 Jun 2006) $
- *
- * @jsp.tag name="country" bodycontent="empty"
  */
 public class CountryTag extends TagSupport {
     private static final long serialVersionUID = 3905528206810167095L;
@@ -38,39 +36,18 @@
     private String scope;
     private String selected;
 
-    /**
-     * @param name The name to set.
-     *
-     * @jsp.attribute required="false" rtexprvalue="true"
-     */
     public void setName(String name) {
         this.name = name;
     }
 
-    /**
-     * @param prompt The prompt to set.
-     * @jsp.attribute required="false" rtexprvalue="true"
-     */
     public void setPrompt(String prompt) {
         this.prompt = prompt;
     }
 
-    /**
-     * @param selected The selected option.
-     * @jsp.attribute required="false" rtexprvalue="true"
-     */
     public void setDefault(String selected) {
         this.selected = selected;
     }
 
-    /**
-     * Property used to simply stuff the list of countries into a
-     * specified scope.
-     *
-     * @param scope
-     *
-     * @jsp.attribute required="false" rtexprvalue="true"
-     */
     public void setToScope(String scope) {
         this.scope = scope;
     }
@@ -79,9 +56,7 @@
      * Process the start of this tag.
      *
      * @return int status
-     *
      * @exception JspException if a JSP exception has occurred
-     *
      * @see javax.servlet.jsp.tagext.Tag#doStartTag()
      */
     public int doStartTag() throws JspException {
@@ -108,22 +83,22 @@
             }
         } else {
             StringBuffer sb = new StringBuffer();
-            sb.append("<select name=\"" + name + "\" id=\"" + name + "\" class=\"select\">\n");
+            sb.append("<select name=\"").append(name).append("\" id=\"").append(name).append("\" class=\"select\">\n");
 
             if (prompt != null) {
                 sb.append("    <option value=\"\" selected=\"selected\">");
-                sb.append(eval.evalString("prompt", prompt) + "</option>\n");
+                sb.append(eval.evalString("prompt", prompt)).append("</option>\n");
             }
 
-            for (Iterator i = countries.iterator(); i.hasNext();) {
-                LabelValue country = (LabelValue) i.next();
-                sb.append("    <option value=\"" + country.getValue() + "\"");
+            for (Object country1 : countries) {
+                LabelValue country = (LabelValue) country1;
+                sb.append("    <option value=\"").append(country.getValue()).append("\"");
 
                 if ((selected != null) && selected.equals(country.getValue())) {
                     sb.append(" selected=\"selected\"");
                 }
 
-                sb.append(">" + country.getLabel() + "</option>\n");
+                sb.append(">").append(country.getLabel()).append("</option>\n");
             }
 
             sb.append("</select>");
@@ -158,16 +133,15 @@
      */
     @SuppressWarnings("unchecked")
     protected List<LabelValue> buildCountryList(Locale locale) {
-        final String EMPTY = "";
         final Locale[] available = Locale.getAvailableLocales();
 
         List<LabelValue> countries = new ArrayList<LabelValue>();
 
-        for (int i = 0; i < available.length; i++) {
-            final String iso = available[i].getCountry();
-            final String name = available[i].getDisplayCountry(locale);
+        for (Locale anAvailable : available) {
+            final String iso = anAvailable.getCountry();
+            final String name = anAvailable.getDisplayCountry(locale);
 
-            if (!EMPTY.equals(iso) && !EMPTY.equals(name)) {
+            if (!"".equals(iso) && !"".equals(name)) {
                 LabelValue country = new LabelValue(name, iso);
 
                 if (!countries.contains(country)) {
@@ -193,7 +167,7 @@
          *
          * @param locale The Locale used for localized String comparison.
          */
-        public LabelValueComparator(Locale locale) {
+        public LabelValueComparator(final Locale locale) {
             c = Collator.getInstance(locale);
         }
 
Index: web/struts/src/main/java/org/appfuse/webapp/action/FileUploadAction.java
===================================================================
--- web/struts/src/main/java/org/appfuse/webapp/action/FileUploadAction.java	(revision 2862)
+++ web/struts/src/main/java/org/appfuse/webapp/action/FileUploadAction.java	(working copy)
@@ -9,6 +9,9 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 
+/**
+ * Sample action that shows how to do file upload with Struts 2.
+ */
 public class FileUploadAction extends BaseAction {
     private static final long serialVersionUID = -9208910183310010569L;
     private File file;
@@ -16,14 +19,19 @@
     private String fileFileName;
     private String name;
 
+    /**
+     * Upload the file
+     * @return String with result (cancel, input or sucess)
+     * @throws Exception if something goes wrong
+     */
     public String upload() throws Exception {
         if (this.cancel != null) {
             return "cancel";
         }
 
         // the directory to upload to
-        String uploadDir =
-            ServletActionContext.getServletContext().getRealPath("/resources") + "/" + getRequest().getRemoteUser() + "/";
+        String uploadDir = ServletActionContext.getServletContext().getRealPath("/resources")
+                + "/" + getRequest().getRemoteUser() + "/";
 
         // write the file to the file specified
         File dirPath = new File(uploadDir);
@@ -37,25 +45,32 @@
 
         //write the file to the file specified
         OutputStream bos = new FileOutputStream(uploadDir + fileFileName);
-        int bytesRead = 0;
+        int bytesRead;
         byte[] buffer = new byte[8192];
 
         while ((bytesRead = stream.read(buffer, 0, 8192)) != -1) {
             bos.write(buffer, 0, bytesRead);
         }
 
-        bos.close();        
+        bos.close();
         stream.close();
 
         // place the data into the request for retrieval on next page
-        getRequest().setAttribute("location", dirPath.getAbsolutePath()  + Constants.FILE_SEP + fileFileName);
-        
-        String link = getRequest().getContextPath() + "/resources" + "/" + getRequest().getRemoteUser() + "/";
+        getRequest().setAttribute("location", dirPath.getAbsolutePath()
+                + Constants.FILE_SEP + fileFileName);
+
+        String link = getRequest().getContextPath() + "/resources" + "/"
+                + getRequest().getRemoteUser() + "/";
+
         getRequest().setAttribute("link", link + fileFileName);
-        
+
         return SUCCESS;
     }
 
+    /**
+     * Default method - returns "input"
+     * @return "input"
+     */
     public String execute() {
         return INPUT;
     }
@@ -92,6 +107,7 @@
         return fileFileName;
     }
 
+    @Override
     public void validate() {
         if (getRequest().getMethod().equalsIgnoreCase("post")) {
             getFieldErrors().clear();
Index: web/struts/src/main/java/org/appfuse/webapp/action/PasswordHintAction.java
===================================================================
--- web/struts/src/main/java/org/appfuse/webapp/action/PasswordHintAction.java	(revision 2862)
+++ web/struts/src/main/java/org/appfuse/webapp/action/PasswordHintAction.java	(working copy)
@@ -9,16 +9,12 @@
 /**
  * Action class to send password hints to registered users.
  *
- * <p>
- * <a href="PasswordHintAction.java.html"><i>View Source</i></a>
- * </p>
- *
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
 public class PasswordHintAction extends BaseAction {
     private static final long serialVersionUID = -4037514607101222025L;
     private String username;
-    
+
     /**
      * @param username The username to set.
      */
@@ -26,28 +22,41 @@
         this.username = username;
     }
 
+    /**
+     * Execute sending the password hint via e-mail.
+     *
+     * @return success if username works, input if not
+     */
     public String execute() {
         List<String> args = new ArrayList<String>();
-        
+
         // ensure that the username has been sent
         if (username == null) {
             log.warn("Username not specified, notifying user that it's a required field.");
 
             args.add(getText("user.username"));
-            addActionError(getText("errors.required", args));
+            addActionError(getText("errors.requiredField", args));
             return INPUT;
         }
+
         if (log.isDebugEnabled()) {
             log.debug("Processing Password Hint...");
         }
-        
+
         // look up the user's information
         try {
             User user = userManager.getUserByUsername(username);
+            String hint = user.getPasswordHint();
 
+            if (hint == null || hint.trim().equals("")) {
+                log.warn("User '" + username + "' found, but no password hint exists.");
+                addActionError(getText("login.passwordHint.missing"));
+                return INPUT;
+            }
+
             StringBuffer msg = new StringBuffer();
-            msg.append("Your password hint is: " + user.getPasswordHint());
-            msg.append("\n\nLogin at: " + RequestUtil.getAppURL(getRequest()));
+            msg.append("Your password hint is: ").append(hint);
+            msg.append("\n\nLogin at: ").append(RequestUtil.getAppURL(getRequest()));
 
             mailMessage.setTo(user.getEmail());
             String subject = '[' + getText("webapp.name") + "] " + getText("user.passwordHint");
@@ -61,8 +70,8 @@
             saveMessage(getText("login.passwordHint.sent", args));
             
         } catch (Exception e) {
-            e.printStackTrace();
-            // If exception is expected do not rethrow
+            log.warn("Username '" + username + "' not found in database.");
+            args.add(username);
             addActionError(getText("login.passwordHint.error", args));
             return INPUT;
         }
Index: web/struts/src/main/java/org/appfuse/webapp/action/SignupAction.java
===================================================================
--- web/struts/src/main/java/org/appfuse/webapp/action/SignupAction.java	(revision 2862)
+++ web/struts/src/main/java/org/appfuse/webapp/action/SignupAction.java	(working copy)
@@ -15,6 +15,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
+/**
+ * Action to allow new users to sign up.
+ */
 public class SignupAction extends BaseAction {
     private static final long serialVersionUID = 6558317334878272308L;
     private User user;
@@ -28,10 +31,18 @@
         this.user = user;
     }
 
+    /**
+     * Return an instance of the user - to display when validation errors occur
+     * @return a populated user
+     */
     public User getUser() {
         return user;
     }
 
+    /**
+     * When method=GET, "input" is returned. Otherwise, "success" is returned.
+     * @return cancel, input or success
+     */
     public String execute() {
         if (cancel != null) {
             return CANCEL;
@@ -42,10 +53,19 @@
         return SUCCESS;
     }
 
+    /**
+     * Returns "input"
+     * @return "input" by default
+     */
     public String doDefault() {
         return INPUT;
     }
 
+    /**
+     * Save the user, encrypting their passwords if necessary
+     * @return success when good things happen
+     * @throws Exception when bad things happen
+     */
     public String save() throws Exception {
         Boolean encrypt = (Boolean) getConfiguration().get(Constants.ENCRYPT_PASSWORD);
 
Index: web/struts/src/main/java/org/appfuse/webapp/action/ReloadAction.java
===================================================================
--- web/struts/src/main/java/org/appfuse/webapp/action/ReloadAction.java	(revision 2862)
+++ web/struts/src/main/java/org/appfuse/webapp/action/ReloadAction.java	(working copy)
@@ -12,24 +12,26 @@
 /**
  * This class is used to reload the drop-downs initialized in the
  * StartupListener.
- *
- * <p>
- * <a href="ReloadAction.java.html"><i>View Source</i></a>
- * </p>
- *
+
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
 public class ReloadAction extends BaseAction {
     private static final long serialVersionUID = 295460450224891051L;
 
+    /**
+     * Method that calls StartupListener.setContext() and returns user to
+     * referrer location (or does a popup if none found).
+     * @return sucess when everything goes right
+     * @throws IOException when response.sendRedirect fails
+     */
     public String execute() throws IOException {
         StartupListener.setupContext(getSession().getServletContext());
 
         String referer = getRequest().getHeader("Referer");
         HttpServletResponse response = ServletActionContext.getResponse();
-        
+
         if (referer != null) {
-            log.info("reload complete, reloading user back to: " + referer);     
+            log.info("reload complete, reloading user back to: " + referer);
             saveMessage(getText("reload.succeeded"));
             response.sendRedirect(response.encodeRedirectURL(referer));
             return SUCCESS;
Index: web/struts/src/main/java/org/appfuse/webapp/action/BaseAction.java
===================================================================
--- web/struts/src/main/java/org/appfuse/webapp/action/BaseAction.java	(revision 2862)
+++ web/struts/src/main/java/org/appfuse/webapp/action/BaseAction.java	(working copy)
@@ -27,31 +27,79 @@
  * convenience methods for subclasses.  For example, getting the current
  * user and saving messages/errors. This class is intended to
  * be a base class for all Action classes.
- *
- * <p>
- * <a href="BaseAction.java.html"><i>View Source</i></a>
- * </p>
- *
+ * 
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
 public class BaseAction extends ActionSupport {
     private static final long serialVersionUID = 3525445612504421307L;
+
+    /**
+     * Constant for cancel result String
+     */
     public static final String CANCEL = "cancel";
+
+    /**
+     * Transient log to prevent session synchronization issues - children can use instance for logging.
+     */
     protected transient final Log log = LogFactory.getLog(getClass());
-    protected UserManager userManager = null;
-    protected RoleManager roleManager = null;
-    protected String from = null;
-    protected String cancel = null;
-    protected String delete = null;
-    protected String save = null;
-    protected MailEngine mailEngine = null;
-    protected SimpleMailMessage mailMessage = null;
-    protected String templateName = null; 
 
+    /**
+     * The UserManager
+     */
+    protected UserManager userManager;
+
+    /**
+     * The RoleManager
+     */
+    protected RoleManager roleManager;
+
+    /**
+     * Indicator if the user clicked cancel
+     */
+    protected String cancel;
+
+    /**
+     * Indicator for the page the user came from.
+     */
+    protected String from;
+
+    /**
+     * Set to "delete" when a "delete" request parameter is passed in
+     */
+    protected String delete;
+
+    /**
+     * Set to "save" when a "save" request parameter is passed in
+     */
+    protected String save;
+
+    /**
+     * MailEngine for sending e-mail
+     */
+    protected MailEngine mailEngine;
+
+    /**
+     * A message pre-populated with default data
+     */
+    protected SimpleMailMessage mailMessage;
+
+    /**
+     * Velocity template to use for e-mailing
+     */
+    protected String templateName;
+
+    /**
+     * Simple method that returns "cancel" result
+     * @return "cancel"
+     */
     public String cancel() {
         return CANCEL;
     }
-    
+
+    /**
+     * Save the message in the session, appending if messages already exist
+     * @param msg the message to put in the session
+     */
     @SuppressWarnings("unchecked")
     protected void saveMessage(String msg) {
         List messages = (List) getRequest().getSession().getAttribute("messages");
@@ -61,7 +109,7 @@
         messages.add(msg);
         getRequest().getSession().setAttribute("messages", messages);
     }
-    
+
     /**
      * Convenience method to get the Configuration HashMap
      * from the servlet context.
@@ -76,15 +124,15 @@
         }
         return config;
     }
-    
+
     /**
      * Convenience method to get the request
      * @return current request
      */
     protected HttpServletRequest getRequest() {
-        return ServletActionContext.getRequest();  
+        return ServletActionContext.getRequest();
     }
-    
+
     /**
      * Convenience method to get the response
      * @return current response
@@ -92,7 +140,7 @@
     protected HttpServletResponse getResponse() {
         return ServletActionContext.getResponse();
     }
-    
+
     /**
      * Convenience method to get the session. This will create a session if one doesn't exist.
      * @return the session from the request (request.getSession()).
@@ -100,7 +148,13 @@
     protected HttpSession getSession() {
         return getRequest().getSession();
     }
-    
+
+    /**
+     * Convenience method to send e-mail to users
+     * @param user the user to send to
+     * @param msg the message to send
+     * @param url the URL to the application (or where ever you'd like to send them)
+     */
     protected void sendUserMessage(User user, String msg, String url) {
         if (log.isDebugEnabled()) {
             log.debug("sending e-mail to user [" + user.getEmail() + "]...");
@@ -110,7 +164,7 @@
 
         Map<String, Object> model = new HashMap<String, Object>();
         model.put("user", user);
-        // TODO: figure out how to get bundle specified in webwork.properties
+        // TODO: figure out how to get bundle specified in struts.xml
         // model.put("bundle", getTexts());
         model.put("message", msg);
         model.put("applicationURL", url);
@@ -120,23 +174,23 @@
     public void setUserManager(UserManager userManager) {
         this.userManager = userManager;
     }
-    
+
     public void setRoleManager(RoleManager roleManager) {
         this.roleManager = roleManager;
     }
-    
+
     public void setMailEngine(MailEngine mailEngine) {
         this.mailEngine = mailEngine;
     }
-    
+
     public void setMailMessage(SimpleMailMessage mailMessage) {
         this.mailMessage = mailMessage;
     }
-    
+
     public void setTemplateName(String templateName) {
         this.templateName = templateName;
     }
-    
+
     /**
      * Convenience method for setting a "from" parameter to indicate the previous page.
      * @param from indicator for the originating page
@@ -144,7 +198,7 @@
     public void setFrom(String from) {
         this.from = from;
     }
-    
+
     public void setDelete(String delete) {
         this.delete = delete;
     }
Index: web/struts/src/main/java/org/appfuse/webapp/action/UserAction.java
===================================================================
--- web/struts/src/main/java/org/appfuse/webapp/action/UserAction.java	(revision 2862)
+++ web/struts/src/main/java/org/appfuse/webapp/action/UserAction.java	(working copy)
@@ -21,21 +21,32 @@
 import java.util.ArrayList;
 import java.util.List;
 
+/**
+ * Action for facilitating User Management feature.
+ */
 public class UserAction extends BaseAction implements Preparable {
     private static final long serialVersionUID = 6776558938712115191L;
     private List users;
     private User user;
     private String id;
 
-    public void prepare() throws Exception {
+
+    /**
+     * Grab the entity from the database before populating with request parameters
+     */
+    public void prepare() {
         if (getRequest().getMethod().equalsIgnoreCase("post")) {
+            // prevent failures on new
             if (!"".equals(getRequest().getParameter("user.id"))) {
-                // prevent failures on new
                 user = userManager.getUser(getRequest().getParameter("user.id"));
             }
         }
     }
-    
+
+    /**
+     * Holder for users to display on list screen
+     * @return list of users
+     */
     public List getUsers() {
         return users;
     }
@@ -52,7 +63,11 @@
         this.user = user;
     }
 
-    public String delete() throws IOException {       
+    /**
+     * Delete the user passed in.
+     * @return success
+     */
+    public String delete() {
         userManager.removeUser(user.getId().toString());
         List<String> args = new ArrayList<String>();
         args.add(user.getFullName());
@@ -61,6 +76,11 @@
         return SUCCESS;
     }
 
+    /**
+     * Grab the user from the database based on the "id" passed in.
+     * @return success if user found
+     * @throws IOException can happen when sending a "forbidden" from response.sendError()
+     */
     public String edit() throws IOException {
         HttpServletRequest request = getRequest();
         boolean editProfile = (request.getRequestURI().indexOf("editProfile") > -1);
@@ -72,8 +92,8 @@
             // but it's a legitimate bug, so I'll fix it. ;-)
             if ((request.getParameter("id") != null) || (request.getParameter("from") != null)) {
                 ServletActionContext.getResponse().sendError(HttpServletResponse.SC_FORBIDDEN);
-                log.warn("User '" + request.getRemoteUser() + "' is trying to edit user '" +
-                         request.getParameter("id") + "'");
+                log.warn("User '" + request.getRemoteUser() + "' is trying to edit user '" 
+                         + request.getParameter("id") + "'");
 
                 return null;
             }
@@ -108,14 +128,22 @@
                 }
             }
         }
-       
+
         return SUCCESS;
     }
 
-    public String execute() {        
+    /**
+     * Default: just returns "success"
+     * @return "success"
+     */
+    public String execute() {
         return SUCCESS;
     }
 
+    /**
+     * Sends users to "mainMenu" when !from.equals("list"). Sends everyone else to "cancel"
+     * @return "mainMenu" or "cancel"
+     */
     public String cancel() {
         if (!"list".equals(from)) {
             return "mainMenu";
@@ -123,7 +151,12 @@
         return "cancel";
     }
 
-    public String save() throws Exception {
+    /**
+     * Save user
+     * @return success if everything worked, otherwise input
+     * @throws IOException when setting "access denied" fails on response
+     */
+    public String save() throws IOException {
         Boolean encrypt = (Boolean) getConfiguration().get(Constants.ENCRYPT_PASSWORD);
 
         if ("true".equals(getRequest().getParameter("encryptPass")) && (encrypt != null && encrypt)) {
@@ -194,6 +227,10 @@
         }
     }
 
+    /**
+     * Fetch all users from database and put into local "users" variable for retrieval in the UI.
+     * @return "success" if no exceptions thrown
+     */
     public String list() {
         users = userManager.getUsers(new User());
         return SUCCESS;
Index: web/struts/src/main/java/org/appfuse/webapp/interceptor/UserRoleAuthorizationInterceptor.java
===================================================================
--- web/struts/src/main/java/org/appfuse/webapp/interceptor/UserRoleAuthorizationInterceptor.java	(revision 2862)
+++ web/struts/src/main/java/org/appfuse/webapp/interceptor/UserRoleAuthorizationInterceptor.java	(working copy)
@@ -14,10 +14,6 @@
  * Security interceptor checks to see if users are in the specified roles
  * before proceeding.  Similar to Spring's UserRoleAuthorizationInterceptor.
  *
- * <p>
- * <a href="UserRoleAuthorizationInterceptor.java.html"><i>View Source</i></a>
- * </p>
- *
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  * @see org.springframework.web.servlet.handler.UserRoleAuthorizationInterceptor
  */
@@ -25,12 +21,18 @@
     private static final long serialVersionUID = 5067790608840427509L;
     private String[] authorizedRoles;
 
+    /**
+     * Intercept the action invocation and check to see if the user has the proper role.
+     * @param invocation the current action invocation
+     * @return the method's return value, or null after setting HttpServletResponse.SC_FORBIDDEN
+     * @throws Exception when setting the error on the response fails
+     */
     public String intercept(ActionInvocation invocation) throws Exception {
         HttpServletRequest request = ServletActionContext.getRequest();
 
         if (this.authorizedRoles != null) {
-            for (int i = 0; i < this.authorizedRoles.length; i++) {
-                if (request.isUserInRole(this.authorizedRoles[i])) {
+            for (String authorizedRole : this.authorizedRoles) {
+                if (request.isUserInRole(authorizedRole)) {
                     return invocation.invoke();
                 }
             }
@@ -52,11 +54,12 @@
     /**
      * Handle a request that is not authorized according to this interceptor.
      * Default implementation sends HTTP status code 403 ("forbidden").
+     *
      * <p>This method can be overridden to write a custom message, forward or
      * redirect to some error page or login page, or throw a ServletException.
+     * 
      * @param request current HTTP request
      * @param response current HTTP response
-     * @param handler chosen handler to execute, for type and/or instance evaluation
      * @throws javax.servlet.ServletException if there is an internal error
      * @throws java.io.IOException in case of an I/O error when writing the response
      */
@@ -65,10 +68,16 @@
     throws ServletException, IOException {
         response.sendError(HttpServletResponse.SC_FORBIDDEN);
     }
-    
+
+    /**
+     * This method currently does nothing.
+     */
     public void destroy() {
     }
 
+    /**
+     * This method currently does nothing.
+     */
     public void init() {
     }
 }
Index: web/common/src/main/java/org/appfuse/webapp/taglib/ConstantsTag.java
===================================================================
--- web/common/src/main/java/org/appfuse/webapp/taglib/ConstantsTag.java	(revision 2862)
+++ web/common/src/main/java/org/appfuse/webapp/taglib/ConstantsTag.java	(working copy)
@@ -30,29 +30,32 @@
  * </p>
  *
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
- *
- * @jsp.tag name="constants" bodycontent="empty"
- *  tei-class="org.appfuse.webapp.taglib.ConstantsTei"
  */
 public class ConstantsTag extends TagSupport {
     private static final long serialVersionUID = 3258417209566116146L;
     private final Log log = LogFactory.getLog(ConstantsTag.class);
-    
+
     /**
      * The class to expose the variables from.
      */
-    public String clazz = Constants.class.getName();
+    private String clazz = Constants.class.getName();
 
     /**
      * The scope to be put the variable in.
      */
-    protected String scope = null;
+    protected String scope;
 
     /**
      * The single variable to expose.
      */
-    protected String var = null;
+    protected String var;
 
+    /**
+     * Main method that does processing and exposes Constants in specified scope 
+     * @return int
+     * @throws JspException if processing fails
+     */
+    @Override
     public int doStartTag() throws JspException {
         // Using reflection, get the available field names in the class
         Class c = null;
@@ -76,20 +79,13 @@
 
                 AccessibleObject.setAccessible(fields, true);
 
-                for (int i = 0; i < fields.length; i++) {
-                    /*if (log.isDebugEnabled()) {
-                       log.debug("putting '" + fields[i].getName() + "=" +
-                                 fields[i].get(this) + "' into " + scope +
-                                 " scope");
-                       }*/
-                    pageContext.setAttribute(fields[i].getName(),
-                                             fields[i].get(this), toScope);
+                for (Field field : fields) {
+                    pageContext.setAttribute(field.getName(), field.get(this), toScope);
                 }
             } else {
                 try {
                     Object value = c.getField(var).get(this);
-                    pageContext.setAttribute(c.getField(var).getName(), value,
-                                             toScope);
+                    pageContext.setAttribute(c.getField(var).getName(), value, toScope);
                 } catch (NoSuchFieldException nsf) {
                     log.error(nsf.getMessage());
                     throw new JspException(nsf);
@@ -104,9 +100,6 @@
         return (SKIP_BODY);
     }
 
-    /**
-     * @jsp.attribute
-     */
     public void setClassName(String clazz) {
         this.clazz = clazz;
     }
@@ -115,9 +108,6 @@
         return this.clazz;
     }
 
-    /**
-     * @jsp.attribute
-     */
     public void setScope(String scope) {
         this.scope = scope;
     }
@@ -126,9 +116,6 @@
         return (this.scope);
     }
 
-    /**
-     * @jsp.attribute
-     */
     public void setVar(String var) {
         this.var = var;
     }
@@ -145,24 +132,21 @@
         clazz = null;
         scope = Constants.class.getName();
     }
-    
-    // ~========== From Struts' TagUtils class =====================
 
     /**
      * Maps lowercase JSP scope names to their PageContext integer constant
      * values.
      */
-    private static final Map scopes = new HashMap();
+    private static final Map<String, Integer> SCOPES = new HashMap<String, Integer>();
 
     /**
-     * Initialize the scope names map and the encode variable with the 
-     * Java 1.4 method if available.
+     * Initialize the scope names map and the encode variable
      */
     static {
-        scopes.put("page", new Integer(PageContext.PAGE_SCOPE));
-        scopes.put("request", new Integer(PageContext.REQUEST_SCOPE));
-        scopes.put("session", new Integer(PageContext.SESSION_SCOPE));
-        scopes.put("application", new Integer(PageContext.APPLICATION_SCOPE));
+        SCOPES.put("page", PageContext.PAGE_SCOPE);
+        SCOPES.put("request", PageContext.REQUEST_SCOPE);
+        SCOPES.put("session", PageContext.SESSION_SCOPE);
+        SCOPES.put("application", PageContext.APPLICATION_SCOPE);
     }
     
     /**
@@ -173,12 +157,12 @@
      * @throws JspException if the scopeName is not a valid name.
      */
     public int getScope(String scopeName) throws JspException {
-        Integer scope = (Integer) scopes.get(scopeName.toLowerCase());
+        Integer scope = (Integer) SCOPES.get(scopeName.toLowerCase());
 
         if (scope == null) {
             throw new JspException("Scope '" + scopeName + "' not a valid option");
         }
 
-        return scope.intValue();
+        return scope;
     }
 }
Index: web/common/src/main/java/org/appfuse/webapp/taglib/ConstantsTei.java
===================================================================
--- web/common/src/main/java/org/appfuse/webapp/taglib/ConstantsTei.java	(revision 2862)
+++ web/common/src/main/java/org/appfuse/webapp/taglib/ConstantsTei.java	(working copy)
@@ -25,10 +25,12 @@
 
     /**
      * Return information about the scripting variables to be created.
+     * @param data the input data
+     * @return VariableInfo array of variable information
      */
     public VariableInfo[] getVariableInfo(TagData data) {
         // loop through and expose all attributes
-        List vars = new ArrayList();
+        List<VariableInfo> vars = new ArrayList<VariableInfo>();
 
         try {
             String clazz = data.getAttributeString("className");
@@ -45,17 +47,17 @@
 
                 AccessibleObject.setAccessible(fields, true);
 
-                for (int i = 0; i < fields.length; i++) {
-                    String type = fields[i].getType().getName();
-                    vars.add(new VariableInfo(fields[i].getName(),
-                             ((fields[i].getType().isArray()) ? type.substring(2, type.length()-1) + "[]" : type),
-                             true, VariableInfo.AT_END));
+                for (Field field : fields) {
+                    String type = field.getType().getName();
+                    vars.add(new VariableInfo(field.getName(),
+                            ((field.getType().isArray()) ? type.substring(2, type.length() - 1) + "[]" : type),
+                            true, VariableInfo.AT_END));
                 }
             } else {
                 String var = data.getAttributeString("var");
                 String type = c.getField(var).getType().getName();
                 vars.add(new VariableInfo(c.getField(var).getName(),
-                         ((c.getField(var).getType().isArray()) ? type.substring(2, type.length()-1) + "[]" : type),
+                         ((c.getField(var).getType().isArray()) ? type.substring(2, type.length() - 1) + "[]" : type),
                          true, VariableInfo.AT_END));
             }
         } catch (Exception cnf) {
@@ -63,6 +65,6 @@
             cnf.printStackTrace();
         }
 
-        return (VariableInfo[]) vars.toArray(new VariableInfo[] {  });
+        return vars.toArray(new VariableInfo[] {});
     }
 }
Index: web/common/src/main/java/org/appfuse/webapp/listener/UserCounterListener.java
===================================================================
--- web/common/src/main/java/org/appfuse/webapp/listener/UserCounterListener.java	(revision 2862)
+++ web/common/src/main/java/org/appfuse/webapp/listener/UserCounterListener.java	(working copy)
@@ -28,18 +28,35 @@
  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
  */
 public class UserCounterListener implements ServletContextListener, HttpSessionAttributeListener {
+    /**
+     * Name of user counter variable
+     */
     public static final String COUNT_KEY = "userCounter";
+    /**
+     * Name of users Set in the ServletContext
+     */
     public static final String USERS_KEY = "userNames";
+    /**
+     * The default event we're looking to trap.
+     */
     public static final String EVENT_KEY = HttpSessionContextIntegrationFilter.ACEGI_SECURITY_CONTEXT_KEY;
     private transient ServletContext servletContext;
     private int counter;
     private Set users;
 
+    /**
+     * Initialize the context
+     * @param sce the event
+     */
     public synchronized void contextInitialized(ServletContextEvent sce) {
         servletContext = sce.getServletContext();
         servletContext.setAttribute((COUNT_KEY), Integer.toString(counter));
     }
 
+    /**
+     * Set the servletContext, users and counter to null
+     * @param event The servletContextEvent
+     */
     public synchronized void contextDestroyed(ServletContextEvent event) {
         servletContext = null;
         users = null;
@@ -50,7 +67,6 @@
         counter = Integer.parseInt((String) servletContext.getAttribute(COUNT_KEY));
         counter++;
         servletContext.setAttribute(COUNT_KEY, Integer.toString(counter));
-        //log.debug("User Count: " + counter);
     }
 
     synchronized void decrementUserCounter() {
@@ -62,7 +78,6 @@
         }
 
         servletContext.setAttribute(COUNT_KEY, Integer.toString(counter));
-        //log.debug("User Count: " + counter);
     }
 
     @SuppressWarnings("unchecked")
@@ -94,6 +109,7 @@
     /**
      * This method is designed to catch when user's login and record their name
      * @see javax.servlet.http.HttpSessionAttributeListener#attributeAdded(javax.servlet.http.HttpSessionBindingEvent)
+     * @param event the event to process
      */
     public void attributeAdded(HttpSessionBindingEvent event) {
         if (event.getName().equals(EVENT_KEY) && !isAnonymous()) {
@@ -123,6 +139,7 @@
     /**
      * When user's logout, remove their name from the hashMap
      * @see javax.servlet.http.HttpSessionAttributeListener#attributeRemoved(javax.servlet.http.HttpSessionBindingEvent)
+     * @param event the session binding event
      */
     public void attributeRemoved(HttpSessionBindingEvent event) {
         if (event.getName().equals(EVENT_KEY) && !isAnonymous()) {
@@ -139,6 +156,7 @@
      * Needed for Acegi Security 1.0, as it adds an anonymous user to the session and
      * then replaces it after authentication. http://forum.springframework.org/showthread.php?p=63593
      * @see javax.servlet.http.HttpSessionAttributeListener#attributeReplaced(javax.servlet.http.HttpSessionBindingEvent)
+     * @param event the session binding event
      */
     public void attributeReplaced(HttpSessionBindingEvent event) {
         if (event.getName().equals(EVENT_KEY) && !isAnonymous()) {
Index: web/common/src/main/java/org/appfuse/webapp/listener/StartupListener.java
===================================================================
--- web/common/src/main/java/org/appfuse/webapp/listener/StartupListener.java	(revision 2862)
+++ web/common/src/main/java/org/appfuse/webapp/listener/StartupListener.java	(working copy)
@@ -21,9 +21,9 @@
 /**
  * <p>StartupListener class used to initialize and database settings
  * and populate any application-wide drop-downs.
- * 
+ * <p/>
  * <p>Keep in mind that this listener is executed outside of OpenSessionInViewFilter,
- * so if you're using Hibernate you'll have to explicitly initialize all loaded data at the 
+ * so if you're using Hibernate you'll have to explicitly initialize all loaded data at the
  * GenericDao or service level to avoid LazyInitializationException. Hibernate.initialize() works
  * well for doing this.
  *
@@ -32,6 +32,7 @@
 public class StartupListener implements ServletContextListener {
     private static final Log log = LogFactory.getLog(StartupListener.class);
 
+    @SuppressWarnings({"unchecked"})
     public void contextInitialized(ServletContextEvent event) {
         log.debug("initializing context...");
 
@@ -72,6 +73,7 @@
                 config.put(Constants.ENC_ALGORITHM, algorithm);
             }
         } catch (NoSuchBeanDefinitionException n) {
+            log.debug("authenticationManager bean not found, assuming test and ignoring...");
             // ignore, should only happen when testing
         }
 
@@ -105,8 +107,10 @@
 
     /**
      * This is a no-op method.
+     *
      * @param servletContextEvent The servlet context event
      */
     public void contextDestroyed(ServletContextEvent servletContextEvent) {
+        // nothing to see here, just trying to make checkstyle happy
     }
 }
Index: web/common/src/main/java/org/appfuse/webapp/filter/LocaleFilter.java
===================================================================
--- web/common/src/main/java/org/appfuse/webapp/filter/LocaleFilter.java	(revision 2862)
+++ web/common/src/main/java/org/appfuse/webapp/filter/LocaleFilter.java	(working copy)
@@ -20,6 +20,16 @@
  */
 public class LocaleFilter extends OncePerRequestFilter {
 
+    /**
+     * This method looks for a "locale" request parameter. If it finds one, it sets it as the preferred locale
+     * and also configures it to work with JSTL.
+     * 
+     * @param request the current request
+     * @param response the current response
+     * @param chain the chain
+     * @throws IOException when something goes wrong
+     * @throws ServletException when a communication failure happens
+     */
     @SuppressWarnings("unchecked")
     public void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
                                  FilterChain chain)
Index: web/common/src/main/java/org/appfuse/webapp/filter/LocaleRequestWrapper.java
===================================================================
--- web/common/src/main/java/org/appfuse/webapp/filter/LocaleRequestWrapper.java	(revision 2862)
+++ web/common/src/main/java/org/appfuse/webapp/filter/LocaleRequestWrapper.java	(working copy)
@@ -19,7 +19,12 @@
     private final transient Log log = LogFactory.getLog(LocaleRequestWrapper.class);
     private final Locale preferredLocale;
 
-    public LocaleRequestWrapper(HttpServletRequest decorated, Locale userLocale) {
+    /**
+     * Sets preferred local to user's locale
+     * @param decorated the current decorated request
+     * @param userLocale the user's locale
+     */
+    public LocaleRequestWrapper(final HttpServletRequest decorated, final Locale userLocale) {
         super(decorated);
         preferredLocale = userLocale;
         if (null == preferredLocale) {
@@ -28,7 +33,7 @@
     }
 
     /**
-     * @see javax.servlet.ServletRequestWrapper#getLocale()
+     * {@inheritDoc}
      */
     public Locale getLocale() {
         if (null != preferredLocale) {
@@ -39,14 +44,13 @@
     }
 
     /**
-     * @see javax.servlet.ServletRequestWrapper#getLocales()
+     * {@inheritDoc}
      */
     @SuppressWarnings("unchecked")
     public Enumeration<Locale> getLocales() {
         if (null != preferredLocale) {
             List<Locale> l = Collections.list(super.getLocales());
-            if(l.contains(preferredLocale))
-            {
+            if (l.contains(preferredLocale)) {
                 l.remove(preferredLocale);
             }
             l.add(0, preferredLocale);
Index: web/common/src/main/java/org/appfuse/webapp/filter/StaticFilter.java
===================================================================
--- web/common/src/main/java/org/appfuse/webapp/filter/StaticFilter.java	(revision 2862)
+++ web/common/src/main/java/org/appfuse/webapp/filter/StaticFilter.java	(working copy)
@@ -72,8 +72,8 @@
      * @param request the current request
      * @param response the current response
      * @param chain the filter chain
-     * @throws IOException
-     * @throws ServletException
+     * @throws ServletException when something goes wrong
+     * @throws IOException when something goes terribly wrong
      */
     public void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
                                  FilterChain chain) throws IOException, ServletException {
@@ -102,7 +102,7 @@
             rd.forward(request, response);
             return;
         }
-        
+
         chain.doFilter(request, response);
     }
 }
\ No newline at end of file
Index: web/common/src/main/java/org/appfuse/webapp/util/RequestUtil.java
===================================================================
--- web/common/src/main/java/org/appfuse/webapp/util/RequestUtil.java	(revision 2862)
+++ web/common/src/main/java/org/appfuse/webapp/util/RequestUtil.java	(working copy)
@@ -10,16 +10,22 @@
 /**
  * Convenience class for setting and retrieving cookies.
  */
-public class RequestUtil {
-    private transient static Log log = LogFactory.getLog(RequestUtil.class);
+public final class RequestUtil {
+    private static final Log log = LogFactory.getLog(RequestUtil.class);
 
     /**
+     * Checkstyle rule: utility classes should not have public constructor
+     */
+    private RequestUtil() {
+    }
+
+    /**
      * Convenience method to set a cookie
      *
-     * @param response
-     * @param name
-     * @param value
-     * @param path
+     * @param response the current response
+     * @param name the name of the cookie
+     * @param value the value of the cookie
+     * @param path the path to set it on
      */
     public static void setCookie(HttpServletResponse response, String name,
                                  String value, String path) {
@@ -51,9 +57,7 @@
             return returnCookie;
         }
 
-        for (int i = 0; i < cookies.length; i++) {
-            Cookie thisCookie = cookies[i];
-
+        for (Cookie thisCookie : cookies) {
             if (thisCookie.getName().equals(name)) {
                 // cookies with no value do me no good!
                 if (!thisCookie.getValue().equals("")) {
@@ -83,10 +87,13 @@
             response.addCookie(cookie);
         }
     }
-    
+
     /**
      * Convenience method to get the application's URL based on request
      * variables.
+     * 
+     * @param request the current request
+     * @return URL to application
      */
     public static String getAppURL(HttpServletRequest request) {
         StringBuffer url = new StringBuffer();
