You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by hu...@apache.org on 2006/03/26 04:17:17 UTC

svn commit: r388869 - in /struts/sandbox/trunk/action2: ./ apps/mailreader/src/java/ apps/mailreader/src/java/mailreader2/ apps/mailreader/src/webapp/WEB-INF/ apps/mailreader/src/webapp/pages/

Author: husted
Date: Sat Mar 25 18:17:14 2006
New Revision: 388869

URL: http://svn.apache.org/viewcvs?rev=388869&view=rev
Log:
Action2 Apps
* Mailreader - Work in progress
** JavaDoc pass 

Modified:
    struts/sandbox/trunk/action2/README.txt
    struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/ApplicationListener.java
    struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Constants.java
    struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Logoff.java
    struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Logon.java
    struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/MailreaderSupport.java
    struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Registration.java
    struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Subscription.java
    struts/sandbox/trunk/action2/apps/mailreader/src/java/xwork.xml
    struts/sandbox/trunk/action2/apps/mailreader/src/webapp/WEB-INF/web.xml
    struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/ChangePassword.jsp
    struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Logon.jsp
    struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/MainMenu.jsp
    struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Registration.jsp
    struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Subscription.jsp
    struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Welcome.jsp

Modified: struts/sandbox/trunk/action2/README.txt
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/README.txt?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/README.txt (original)
+++ struts/sandbox/trunk/action2/README.txt Sat Mar 25 18:17:14 2006
@@ -134,7 +134,8 @@
 Subscription Add
 + Cancel 
 + Submit 
-  Submit (bad data)
++ Submit (bad data)
+  Double submit
 
 ----
 
@@ -158,6 +159,7 @@
 + Submit (invalid data)
 + Submit (data)
 - Submit (duplicate data) (*)
+  Double submit
 
 Issues (*)
 * Submit

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/ApplicationListener.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/ApplicationListener.java?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/ApplicationListener.java (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/ApplicationListener.java Sat Mar 25 18:17:14 2006
@@ -32,14 +32,18 @@
 import java.io.InputStream;
 
 /**
- * <p><code>ServletContextListener</code> that initializes and finalizes the persistent storage of User and Subscription
- * information for the Struts Demonstration Application, using an in-memory database backed by an XML file.</p>
- *
- * <p><strong>IMPLEMENTATION WARNING</strong> - If this web application is run from a WAR file, or in another
- * environment where reading and writing of the web application resource is impossible, the initial contents will be
- * copied to a file in the web application temporary directory provided by the container.  This is for demonstration
- * purposes only - you should <strong>NOT</strong> assume that files written here will survive a restart of your servlet
- * container.</p>
+ * <p><code>ServletContextListener</code> that initializes and finalizes the
+ * persistent storage of User and Subscription information for the Struts
+ * Demonstration Application, using an in-memory database backed by an XML
+ * file.</p>
+ *
+ * <p><strong>IMPLEMENTATION WARNING</strong> - If this web application is run
+ * from a WAR file, or in another environment where reading and writing of the
+ * web application resource is impossible, the initial contents will be copied
+ * to a file in the web application temporary directory provided by the
+ * container.  This is for demonstration purposes only - you should
+ * <strong>NOT</strong> assume that files written here will survive a restart
+ * of your servlet container.</p>
  *
  * <p>This class was borrowed from the Shale Mailreader. Changes were:</p>
  *
@@ -58,14 +62,15 @@
 
 
     /**
-     * <p>Appication scope attribute key under which the in-memory version of our database is stored.</p>
+     * <p>Appication scope attribute key under which the in-memory version of
+     * our database is stored.</p>
      */
     public static final String DATABASE_KEY = "database";
 
 
     /**
-     * <p>Application scope attribute key under which the valid selection items for the protocol property is
-     * stored.</p>
+     * <p>Application scope attribute key under which the valid selection
+     * items for the protocol property is stored.</p>
      */
     public static final String PROTOCOLS_KEY = "protocols";
 
@@ -85,7 +90,7 @@
 
 
     /**
-     * Logging output for this plug in instance.
+     * <p>Logging output for this plug in instance.</p>
      */
     private Log log = LogFactory.getLog(this.getClass());
 
@@ -93,14 +98,25 @@
 
 
     /**
-     * The web application resource path of our persistent database storage file.
+     * <p>The web application resource path of our persistent database storage
+     * file.</p>
      */
     private String pathname = "/WEB-INF/classes/database.xml";
 
+    /**
+     * <p>Return the application resource path to the database.</p>
+     *
+     * @return application resource path path to the database
+     */
     public String getPathname() {
         return (this.pathname);
     }
 
+    /**
+     * <p>Set the application resource path to the database.</p>
+     *
+     * @param pathname to the database
+     */
     public void setPathname(String pathname) {
         this.pathname = pathname;
     }
@@ -109,7 +125,8 @@
 
 
     /**
-     * <p>Gracefully shut down this database, releasing any resources that were allocated at initialization.</p>
+     * <p>Gracefully shut down this database, releasing any resources that
+     * were allocated at initialization.</p>
      *
      * @param event ServletContextEvent to process
      */
@@ -134,7 +151,8 @@
 
 
     /**
-     * <p>Initialize and load our initial database from persistent storage.</p>
+     * <p>Initialize and load our initial database from persistent
+     * storage.</p>
      *
      * @param event The context initialization event
      */
@@ -168,7 +186,8 @@
 
 
     /**
-     * Calculate and return an absolute pathname to the XML file to contain our persistent storage information.
+     * <p>Calculate and return an absolute pathname to the XML file to contain
+     * our persistent storage information.</p>
      *
      * @throws Exception if an input/output error occurs
      */

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Constants.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Constants.java?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Constants.java (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Constants.java Sat Mar 25 18:17:14 2006
@@ -20,10 +20,7 @@
 
 /**
  * <p> Manifest constants for the MailReader application. </p>
- *
- * @version $Rev: 360442 $ $Date: 2005-12-31 15:10:04 -0500 (Sat, 31 Dec 2005) $
  */
-
 public final class Constants {
 
     // --- Tokens ----
@@ -34,7 +31,8 @@
     public static final String CREATE = "Create";
 
     /**
-     * <p> The application scope attribute under which our user database is stored. </p>
+     * <p> The application scope attribute under which our user database is
+     * stored. </p>
      */
     public static final String DATABASE_KEY = "database";
 
@@ -49,13 +47,8 @@
     public static final String EDIT = "Edit";
 
     /**
-     * <p> The request attributes key under the WelcomeAction stores an ArrayList of error messages, if required
-     * resources are missing. </p>
-     */
-    public static final String ERROR_KEY = "ERROR";
-
-    /**
-     * <p> The token representing a "failure" result for this application. </p>
+     * <p> The token representing a "failure" result for this application.
+     * </p>
      */
     public static final String FAILURE = "Failure";
 
@@ -70,108 +63,30 @@
     public static final String PACKAGE = "org.apache.struts.apps.mailreader";
 
     /**
-     * <p> The token representing a "save" task. </p>
-     */
-    public static final String SAVE = "Save";
-
-    /**
-     * <p> The session scope attribute under which the Subscription object currently selected by our logged-in User is
-     * stored. </p>
+     * <p> The session scope attribute under which the Subscription object
+     * currently selected by our logged-in User is stored. </p>
      */
     public static final String SUBSCRIPTION_KEY = "subscription";
 
     /**
-     * <p> The token representing a "success" result for this application. </p>
+     * <p> The token representing a "success" result for this application.
+     * </p>
      */
     public static final String SUCCESS = "Success";
 
     /**
-     * <p> The session scope attribute under which the User object for the currently logged in user is stored. </p>
+     * <p> The session scope attribute under which the User object for the
+     * currently logged in user is stored. </p>
      */
     public static final String USER_KEY = "user";
 
-    // ---- Error Messages ----
-
-    /**
-     * <p> A static message in case database resource is not loaded. <p>
-     */
-    public static final String ERROR_DATABASE_NOT_LOADED =
-            "ERROR:  User database not loaded -- check servlet container logs for error messages.";
-
-    /**
-     * <p> A static message in case message resource is not loaded. </p>
-     */
-    public static final String ERROR_MESSAGES_NOT_LOADED =
-            "ERROR:  Message resources not loaded -- check servlet container logs for error messages.";
-
-    // ---- Error Tokens ----
-
-    /**
-     * <p> The resource key for an error with the transactional token. </p>
-     */
-    public static final String MSG_TRANSACTION_TOKEN = "error.transaction.token";
-
     // ---- Log Messages ----
 
     /**
-     * <p> The message to log when cancelling a transaction. </p>
-     */
-    public static final String LOG_CANCEL = " Transaction cancelled: ";
-
-    /**
-     * <p> The message to log when forwarding to a result. </p>
-     */
-    public static final String LOG_RESULT = " Forwarding to result: ";
-
-    /**
-     * <p> The message to log when forwarding to a 'failure' result. <p>
-     */
-    public static final String LOG_FAILURE = LOG_RESULT + FAILURE;
-
-    /**
-     * <p> The message to log when forwarding to a 'logon' result. </p>
-     */
-    public static final String LOG_LOGON = LOG_RESULT + LOGON;
-
-    /**
-     * <p> The message to log when populating a form. </p>
-     */
-    public static final String LOG_POPULATE_FORM = " Populating form from: ";
-
-    /**
-     * <p> The message to log when populating a subscription. </p>
-     */
-    public static final String LOG_POPULATE_SUBSCRIPTION = " Populating subscription: ";
-
-    /**
-     * <p> The message to log when populating a user. </p>
-     */
-    public static final String LOG_POPULATE_USER = " Populating user: ";
-
-    /**
-     * <p> The message to log when forwarding to a 'success' result. </p>
-     */
-    public static final String LOG_PROCESSING = " Processing: ";
-
-    /**
-     * <p> The message to log when forwarding to a 'success' result. </p>
-     */
-    public static final String LOG_SUCCESS = LOG_RESULT + SUCCESS;
-
-    /**
-     * <p> The message to log when setting a transactional token. </p>
-     */
-    public static final String LOG_TOKEN = " Setting transactional control token";
-
-    /**
-     * <p> The message to log when checking a transactional token. </p>
-     */
-    public static final String LOG_TOKEN_CHECK = " Checking transactional control token";
-
-    /**
      * <p> Message to log if saving a user fails. </p>
      */
-    public static final String LOG_DATABASE_SAVE_ERROR = " Unexpected error when saving User: ";
+    public static final String LOG_DATABASE_SAVE_ERROR =
+            " Unexpected error when saving User: ";
 
 
 }

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Logoff.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Logoff.java?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Logoff.java (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Logoff.java Sat Mar 25 18:17:14 2006
@@ -1,5 +1,26 @@
+/*
+ * $Id: LogonAction.java 360442 2005-12-31 20:10:04Z husted $
+ *
+ * Copyright 2000-2004 Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package mailreader2;
 
+/**
+ * <p> Log user out of the current session. </p>
+ */
 public class Logoff extends MailreaderSupport {
 
     public String execute() {

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Logon.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Logon.java?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Logon.java (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Logon.java Sat Mar 25 18:17:14 2006
@@ -15,6 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package mailreader2;
 
 import org.apache.struts.apps.mailreader.dao.ExpiredPasswordException;
@@ -22,14 +23,13 @@
 
 /**
  * <p> Validate a user logon. </p>
- *
- * @version $Rev: 360442 $ $Date: 2005-12-31 15:10:04 -0500 (Sat, 31 Dec 2005) $
  */
 public final class Logon extends MailreaderSupport {
 
     /**
-     * <p> Use "username" and "password" fields to retrieve a User object from the database. If credentials are not
-     * valid, or database has disappeared, post error messages and forward to input. </p>
+     * <p> Use "username" and "password" fields to retrieve a User object from
+     * the database. If credentials are not valid, or database has
+     * disappeared, post error messages and forward to input. </p>
      */
     public String execute() throws ExpiredPasswordException {
 

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/MailreaderSupport.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/MailreaderSupport.java?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/MailreaderSupport.java (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/MailreaderSupport.java Sat Mar 25 18:17:14 2006
@@ -36,35 +36,70 @@
 /**
  * <p> Base Action for MailreaderSupport application. </p>
  *
- * <p> Note that this class does NOT implement model driven because of issues with the pre-existing model. The
- * MailReader DAO does not provide a setter for username and does not provide a default constructor, making it difficult
- * to use as a POJO or to extend. As an alternative, the username and password properties are provided on the Action and
- * then passed to the user class as needed. </p>
- *
- * @version $Rev: 360442 $ $Date: 2005-12-31 15:10:04 -0500 (Sat, 31 Dec 2005) $
+ * <p> Note that this class does NOT implement model driven because of the way
+ * the pre-existing model is designed. The MailReader DAO includes immutable
+ * fields that can only be set on construction, and some objects do not have a
+ * default construction. One approach would be to mirror all the DAO
+ * properties on the Actions. As an alternative, this implementations uses the
+ * DAO properties where possible, and uses local Action properties only as
+ * needed. To create new objects, a blank temporary object is constructed, and
+ * the page uses a mix of local Action properties and DAO properties. When the
+ * new object is to be saved, the local Action properties are used to create
+ * the object using the DAO factory methods, the input values are copied from
+ * the temporary object, and the new object is saved. It's kludge, but it
+ * avoids creating unnecessary local properties. Pick your poison.</p>
  */
-public class MailreaderSupport extends ActionSupport implements SessionAware, ApplicationAware {
+public class MailreaderSupport extends ActionSupport
+        implements SessionAware, ApplicationAware {
 
     // ---- ApplicationAware ----
 
+    /**
+     * <p>Field to store application context or its proxy.</p>
+     *
+     * <p>The application context lasts for the life of the application. A
+     * reference to the database is stored in the application context at
+     * startup.</p>
+     */
     private Map application;
 
+    /**
+     * <p>Store a new application context.</p>
+     *
+     * @param application
+     */
     public void setApplication(Map application) {
         this.application = application;
     }
 
+    /**
+     * <p>Provide application context.</p>
+     */
     public Map getApplication() {
         return this.application;
     }
 
     // ---- SessionAware ----
 
+    /**
+     * <p>Field to store session context, or its proxy.</p>
+     */
     private Map session;
 
+    /**
+     * <p>Store a new session context.</p>
+     *
+     * @param session
+     */
     public void setSession(Map session) {
         this.session = session;
     }
 
+    /**
+     * <p>Provide session context.</p>
+     *
+     * @return session context
+     */
     public Map getSession() {
         return session;
     }
@@ -72,12 +107,18 @@
     // ---- Task property (utilized by UI) ----
 
     /**
-     * <p>The task input field.</p>
+     * <p>Field to store workflow task.</p>
+     *
+     * <p>The Task is used to track the state of the CRUD workflows. It can be
+     * set to Constant.CREATE, Constant.EDIT, or Constant.DELETE as
+     * needed.</p>
      */
     private String task = null;
 
 
     /**
+     * <p>Provide worklow task.</p>
+     *
      * @return Returns the task.
      */
     public String getTask() {
@@ -85,6 +126,8 @@
     }
 
     /**
+     * <p>Store new workflow task.</p>
+     *
      * @param task The task to set.
      */
     public void setTask(String task) {
@@ -93,12 +136,29 @@
 
     // ---- Host property ----
 
+    /**
+     * <p>Field to store Subscription host.</p>
+     *
+     * <p> The host is an immutable property of the Subscrtion DAP object, so
+     * we need to store it locally until we are ready to create the
+     * Subscription. </p>
+     */
     private String host;
 
+    /**
+     * <p>Provide tSubscription host.</p>
+     *
+     * @return host property
+     */
     public String getHost() {
         return host;
     }
 
+    /**
+     * <p>Store new Subscription host.</p>
+     *
+     * @param value
+     */
     public void setHost(String value) {
         host = value;
     }
@@ -106,12 +166,17 @@
     // ---- Password property ----
 
     /**
-     * <p>The password input field.</p>
+     * <p>Field to store User password property.</p>
+     *
+     * <p>The User DAO object password proerty is immutable, so we store it
+     * locally until we are ready to create the object.</p>
      */
     private String password = null;
 
 
     /**
+     * <p>Provide User password</p>
+     *
      * @return Returns the password.
      */
     public String getPassword() {
@@ -119,6 +184,8 @@
     }
 
     /**
+     * <p>Store new User Password</p>
+     *
      * @param password The password to set.
      */
     public void setPassword(String password) {
@@ -128,12 +195,18 @@
     // ---- Password2 property (confirmation) ----
 
     /**
-     * <p>The confirmation password input field.</p>
+     * <p>Field to store the User password confirmation.</p>
+     *
+     * <p>When a User object is created, we ask the client to enter the
+     * password twice, to help ensure the password is being typed
+     * correctly.</p>
      */
     private String password2 = null;
 
 
     /**
+     * <p>Provide the User password confirmation.</p>
+     *
      * @return Returns the confirmationpassword.
      */
     public String getPassword2() {
@@ -141,6 +214,8 @@
     }
 
     /**
+     * <p>Store a new User password confirmation.</p>
+     *
      * @param password2 The confirmation password to set.
      */
     public void setPassword2(String password2) {
@@ -150,19 +225,26 @@
     // ---- Username property ----
 
     /**
-     * <p>The username input field.</p>
+     * <p>Field to store User username.</p>
+     *
+     * <p>The User DAO object password proerty is immutable, so we store it
+     * locally until we are ready to create the object.</p>
      */
     private String username = null;
 
 
     /**
-     * @return Returns the username.
+     * <p>Provide User username.</p>
+     *
+     * @return Returns the User username.
      */
     public String getUsername() {
         return this.username;
     }
 
     /**
+     * <p>Store new User username</p>
+     *
      * @param username The username to set.
      */
     public void setUsername(String username) {
@@ -172,9 +254,11 @@
     // ---- Database property ----
 
     /**
-     * <p> Return a reference to the UserDatabase or null if the database is not available. </p>
+     * <p>Provide reference to UserDatabase, or null if the database is not
+     * available. </p>
      *
-     * @return a reference to the UserDatabase or null if the database is not available
+     * @return a reference to the UserDatabase or null if the database is not
+     *         available
      */
     public UserDatabase getDatabase() {
         Object db = getApplication().get(Constants.DATABASE_KEY);
@@ -184,22 +268,47 @@
         return (UserDatabase) db;
     }
 
+    /**
+     * <p>Store a new reference to UserDatabase</p>
+     *
+     * @param database
+     */
     public void setDatabase(UserDatabase database) {
         getApplication().put(Constants.DATABASE_KEY, database);
     }
 
     // ---- User property ----
 
+    /**
+     * <p>Provide reference to User object for authenticated user.</p>
+     *
+     * @return User object for authenticated user.
+     */
     public User getUser() {
         return (User) getSession().get(Constants.USER_KEY);
     }
 
+    /**
+     * <p>Store new reference to User Object.</p>
+     *
+     * @param user User object for authenticated user
+     */
     public void setUser(User user) {
         getSession().put(Constants.USER_KEY, user);
     }
 
-    public User findUser(String username, String password) throws ExpiredPasswordException {
-        // FIXME: Stupid hack to compensate for inadequate DAO layer
+    /**
+     * <p>Obtain User object from database, or return null if the credentials
+     * are not found or invalid.</p>
+     *
+     * @param username User username
+     * @param password User password
+     * @return User object or null if not found
+     * @throws ExpiredPasswordException
+     */
+    public User findUser(String username, String password)
+            throws ExpiredPasswordException {
+        // FIXME: Stupid testing hack to compensate for inadequate DAO layer
         if ("Hermes".equals(username)) {
             throw new ExpiredPasswordException("Hermes");
         }
@@ -215,12 +324,13 @@
     }
 
     /**
-     * <p> The <code>Log</code> instance for this application. </p>
+     * <p><code>Log</code> instance for this application. </p>
      */
     protected Log log = LogFactory.getLog(Constants.PACKAGE);
 
     /**
-     * <p> Persist the User object, including subscriptions, to the database. </p>
+     * <p> Persist the User object, including subscriptions, to the database.
+     * </p>
      *
      * @throws javax.servlet.ServletException On any error
      */
@@ -228,7 +338,8 @@
         try {
             getDatabase().save();
         } catch (Exception e) {
-            String message = Constants.LOG_DATABASE_SAVE_ERROR + getUser().getUsername();
+            String message = Constants.LOG_DATABASE_SAVE_ERROR + getUser()
+                    .getUsername();
             log.error(message, e);
             throw new Exception(message, e);
         }
@@ -240,9 +351,11 @@
     }
 
     /**
-     * <p> Verify input for creating a new user, create the user, and process the login. </p>
+     * <p> Verify input for creating a new user, create the user, and process
+     * the login. </p>
      *
-     * @return A new User and empty Errors if create succeeds, or null and Errors if create fails
+     * @return A new User and empty Errors if create succeeds, or null and
+     *         Errors if create fails
      */
     public User createUser(String username, String password) {
 
@@ -267,6 +380,17 @@
     }
 
     // Since user.username is immutable, we have to use some local properties
+
+    /**
+     * <p>Use the current User object to create a new User object, and make
+     * the new User object the authenticated user.</p>
+     *
+     * <p>The "current" User object is usually a temporary object being used
+     * to capture input.</p>
+     *
+     * @param _username User username
+     * @param _password User password
+     */
     public void copyUser(String _username, String _password) {
         User input = getUser();
         input.setPassword(_password);
@@ -280,7 +404,7 @@
     // ---- Subscription property ----
 
     /**
-     * <p> Obtain the cached Subscription object, if any. </p>
+     * <p>Obtain the cached Subscription object, if any. </p>
      *
      * @return Cached Subscription object or null
      */
@@ -288,12 +412,18 @@
         return (Subscription) getSession().get(Constants.SUBSCRIPTION_KEY);
     }
 
+    /**
+     * <p>Store new User Subscription.</p>
+     *
+     * @param subscription
+     */
     public void setSubscription(Subscription subscription) {
         getSession().put(Constants.SUBSCRIPTION_KEY, subscription);
     }
 
     /**
-     * <p> Obtain subscription matching host for our User, or return null if not found. </p>
+     * <p> Obtain User Subscription object for the given host, or return null
+     * if not found. </p>
      *
      * @return The matching Subscription or null
      */
@@ -311,17 +441,36 @@
         return subscription;
     }
 
+    /**
+     * <p>Obtain uSER Subscription for the local Host property.</p>
+     *
+     * <p>Usually, the host property will be set from the client request,
+     * because it was embedded in a link to the Subcription action.
+     *
+     * @return Subscription or null if not found
+     */
     public Subscription findSubscription() {
 
         return findSubscription(getHost());
     }
 
+    /**
+     * <p>Provide a "temporary" User Subscription object that can be used to
+     * capture input values.</p>
+     */
     public void createInputSubscription() {
         Subscription sub = new MemorySubscription(getUser(), null);
         setSubscription(sub);
         setHost(sub.getHost());
     }
 
+    /**
+     * <p>Provide new User Subscription object for the given host, or null if
+     * the host is not unique.</p>
+     *
+     * @param host
+     * @return New User Subscription object or null
+     */
     public Subscription createSubscription(String host) {
 
         Subscription sub;
@@ -336,6 +485,15 @@
         return getUser().createSubscription(host);
     }
 
+    /**
+     * <p>Create a new Subscription from the current Subscription object,
+     * making the new Subscription the current Subscription. </p>
+     *
+     * <p>Usually, the "current" Subscription is a temporary object being used
+     * to capture input values.</p>
+     *
+     * @param host
+     */
     public void copySubscription(String host) {
         Subscription input = getSubscription();
         Subscription sub = createSubscription(host);
@@ -346,11 +504,21 @@
         }
     }
 
+    /**
+     * <p>Delete the current Subscription object from the database.</p>
+     *
+     * @throws Exception
+     */
     public void removeSubscription() throws Exception {
         getUser().removeSubscription(getSubscription());
         getSession().remove(Constants.SUBSCRIPTION_KEY);
     }
 
+    /**
+     * <p>Provide MailServer Host for current User Subscription.</p>
+     *
+     * @return MailServer Host for current User Subscription
+     */
     public String getSubscriptionHost() {
         Subscription sub = getSubscription();
         if (null == sub) {

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Registration.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Registration.java?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Registration.java (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Registration.java Sat Mar 25 18:17:14 2006
@@ -4,20 +4,23 @@
 
 
 /**
- * <p> Provide an Edit method for retrieving an existing user, and a Save method for updating or inserting a user.
- * </p><p> Both methods utilize a RegistrationForm to obtain or expose User details. If Save is used to create a user,
- * additional validations ensure input is nominal. When a user is created, Save also handles the initial logon. </p>
+ * <p> Provide an Edit method for retrieving an existing user, and a Save
+ * method for updating or inserting a user. </p>
  */
 public final class Registration extends MailreaderSupport {
 
+    /**
+     * <p>Double check that there is not a valid User logon. </p>
+     *
+     * @return True if there is not a valid User logon
+     */
     private boolean isCreating() {
         User user = getUser();
         return (null == user) || (null == user.getDatabase());
     }
 
     /**
-     * <p> Retrieve the User object to edit or null if the User does not exist, and set an transactional token to later
-     * detect multiple Save commands. </p>
+     * <p> Retrieve User object to edit or null if User does not exist. </p>
      *
      * @return The "Success" result for this mapping
      * @throws Exception on any error
@@ -38,8 +41,10 @@
     }
 
     /**
-     * <p> Insert or update a User object to the persistent store. </p><p> If a User is not logged in, then a new User
-     * is created and automatically logged in. Otherwise, the existing User is updated. </p>
+     * <p> Insert or update a User object to the persistent store. </p>
+     *
+     * <p> If a User is not logged in, then a new User is created and
+     * automatically logged in. Otherwise, the existing User is updated. </p>
      *
      * @return The "Success" result for this mapping
      * @throws Exception on any error

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Subscription.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Subscription.java?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Subscription.java (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/java/mailreader2/Subscription.java Sat Mar 25 18:17:14 2006
@@ -5,24 +5,31 @@
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-public final class Subscription extends MailreaderSupport implements Preparable {
-
+/**
+ * <p> Provide an Edit method for retrieving an existing subscription, and a
+ * Save method for updating or inserting a subscription. </p>
+ */
+public final class Subscription extends MailreaderSupport
+        implements Preparable {
+
+    /**
+     * <p>Field to store list of MailServer types</p>
+     */
     private Map types = null;
 
+    /**
+     * <p>Provide the list of MailServer types.</p>
+     *
+     * @return List of MailServer types
+     */
     public Map getTypes() {
         return types;
     }
 
-    private String host;
-
-    public String getHost() {
-        return host;
-    }
-
-    public void setHost(String value) {
-        host = value;
-    }
-
+    /**
+     * <p>Setup the MailerServer types and set the local Host property from
+     * the User Subscription (if any). </p>
+     */
     public void prepare() {
 
         Map m = new LinkedHashMap();
@@ -33,12 +40,26 @@
         setHost(getSubscriptionHost());
     }
 
+    /**
+     * <p>Setup a temporary User Subscription object to capture input
+     * values.</p>
+     *
+     * @return INPUT
+     */
     public String input() {
         createInputSubscription();
         setTask(Constants.CREATE);
         return INPUT;
     }
 
+    /**
+     * <p>Load User Subscription for the local Host property.</p>
+     *
+     * <p>Usually, the Host is being set from the request by a link to an Edit
+     * or Delete task.</p>
+     *
+     * @return INPUT or Error, if Subscription is not found
+     */
     public String find() {
 
         org.apache.struts.apps.mailreader.dao.Subscription
@@ -54,18 +75,36 @@
 
     }
 
+    /**
+     * <p>Prepare to present a confirmation page before removing
+     * Subscription.</p>
+     *
+     * @return INPUT or Error, if Subscription is not found
+     */
     public String delete() {
 
         setTask(Constants.DELETE);
         return find();
     }
 
+    /**
+     * <p>Prepare to edit User Subscription.</p>
+     *
+     * @return INPUT or Error, if Subscription is not found
+     */
     public String edit() {
 
         setTask(Constants.EDIT);
         return find();
     }
 
+    /**
+     * <p> Examine the Task property and DELETE, CREATE, or save the User
+     * Subscription, as appropriate. </p>
+     *
+     * @return SUCCESS
+     * @throws Exception on a database error
+     */
     public String execute() throws Exception {
 
         if (Constants.DELETE.equals(getTask())) {
@@ -78,36 +117,6 @@
 
         saveUser();
         return SUCCESS;
-    }
-
-    public static class KeyValue {
-        String key;
-        String value;
-
-        public KeyValue(String key, String value) {
-            this.key = key;
-            this.value = value;
-        }
-
-        public String getKey() {
-            return this.key;
-        }
-
-        public String getValue() {
-            return this.value;
-        }
-
-        public boolean equals(Object obj) {
-            if (! (obj instanceof KeyValue)) {
-                return false;
-            } else {
-                return key.equals(((KeyValue) obj).getKey());
-            }
-        }
-
-        public int hashCode() {
-            return key.hashCode();
-        }
     }
 
 }

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/java/xwork.xml
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/java/xwork.xml?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/java/xwork.xml (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/java/xwork.xml Sat Mar 25 18:17:14 2006
@@ -21,6 +21,16 @@
             <result name="expired" type="chain">ChangePassword</result>
         </action>
 
+        <action name="Something"
+                class="mailreader2.Logon">
+            <exception-mapping
+                    exception="org.apache.struts.apps.mailreader.dao.ExpiredPasswordException"
+                    result="expired"/>
+            <result>/pages/MainMenu.jsp</result>
+            <result name="input">/pages/Logon.jsp</result>
+            <result name="expired" type="chain">ChangePassword</result>
+        </action>
+
         <action name="ChangePassword">
             <result>/pages/ChangePassword.jsp</result>
         </action>

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/webapp/WEB-INF/web.xml?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/webapp/WEB-INF/web.xml (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/webapp/WEB-INF/web.xml Sat Mar 25 18:17:14 2006
@@ -6,7 +6,8 @@
 
     <filter>
         <filter-name>webwork</filter-name>
-        <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
+        <filter-class>
+            com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
     </filter>
 
     <filter-mapping>
@@ -15,7 +16,8 @@
     </filter-mapping>
 
     <listener>
-        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+        <listener-class>
+            org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>
 
     <!-- Application Listener for Mailreader database -->

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/ChangePassword.jsp
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/ChangePassword.jsp?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/ChangePassword.jsp (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/ChangePassword.jsp Sat Mar 25 18:17:14 2006
@@ -4,7 +4,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
     <title><saf:text name="change.title"/></title>
-    <link href="<saf:url value="/css/mailreader.css"/>" rel="stylesheet" type="text/css"/>
+    <link href="<saf:url value="/css/mailreader.css"/>" rel="stylesheet"
+          type="text/css"/>
 </head>
 
 <body>

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Logon.jsp
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Logon.jsp?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Logon.jsp (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Logon.jsp Sat Mar 25 18:17:14 2006
@@ -4,22 +4,24 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
     <title><saf:text name="logon.title"/></title>
-    <link href="<saf:url value="/css/mailreader.css"/>" rel="stylesheet" type="text/css"/>
+    <link href="<saf:url value="/css/mailreader.css"/>" rel="stylesheet"
+          type="text/css"/>
 </head>
 
 <body>
 
-<a2:form method="POST" validate="true">
-    <a2:textfield label="%{getText('prompt.username')}" name="username"/>
+<saf:form method="POST" validate="true">
+    <saf:textfield label="%{getText('prompt.username')}" name="username"/>
 
-    <a2:textfield label="%{getText('prompt.password')}" name="password"/>
+    <saf:textfield label="%{getText('prompt.password')}" name="password"/>
 
-    <a2:submit/>
+    <saf:submit/>
 
-    <a2:reset/>
+    <saf:reset/>
 
-    <a2:submit action="Welcome" value="%{getText('button.cancel')}" onclick="form.onsubmit=null"/>
-</a2:form>
+    <saf:submit action="Welcome" value="%{getText('button.cancel')}"
+               onclick="form.onsubmit=null"/>
+</saf:form>
 
 <jsp:include page="Footer.jsp"/>
 </body>

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/MainMenu.jsp
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/MainMenu.jsp?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/MainMenu.jsp (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/MainMenu.jsp Sat Mar 25 18:17:14 2006
@@ -4,11 +4,13 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
     <title><saf:text name="mainMenu.title"/></title>
-    <link href="<saf:url value="/css/mailreader.css"/>" rel="stylesheet" type="text/css"/>
+    <link href="<saf:url value="/css/mailreader.css"/>" rel="stylesheet"
+          type="text/css"/>
 </head>
 
 <body>
-<h3><saf:text name="mainMenu.heading"/> <saf:property value="user.fullName"/></h3>
+<h3><saf:text name="mainMenu.heading"/> <saf:property
+        value="user.fullName"/></h3>
 <ul>
     <li><a href="<saf:url action="Registration!input" />">
         <saf:text name="mainMenu.registration"/>

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Registration.jsp
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Registration.jsp?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Registration.jsp (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Registration.jsp Sat Mar 25 18:17:14 2006
@@ -9,7 +9,8 @@
     <saf:if test="task=='Edit'">
         <title><saf:text name="registration.title.edit"/></title>
     </saf:if>
-    <link href="<saf:url value="/css/mailreader.css"/>" rel="stylesheet" type="text/css"/>
+    <link href="<saf:url value="/css/mailreader.css"/>" rel="stylesheet"
+          type="text/css"/>
 </head>
 
 <body>
@@ -28,21 +29,26 @@
 
     <saf:textfield label="%{getText('prompt.password2')}" name="password2"/>
 
-    <saf:textfield label="%{getText('prompt.fullName')}" name="user.fullName"/>
+    <saf:textfield label="%{getText('prompt.fullName')}"
+                   name="user.fullName"/>
 
-    <saf:textfield label="%{getText('prompt.fromAddress')}" name="user.fromAddress"/>
+    <saf:textfield label="%{getText('prompt.fromAddress')}"
+                   name="user.fromAddress"/>
 
-    <saf:textfield label="%{getText('prompt.replyToAddress')}" name="user.replyToAddress"/>
+    <saf:textfield label="%{getText('prompt.replyToAddress')}"
+                   name="user.replyToAddress"/>
 
     <saf:submit/>
 
     <saf:reset/>
 
     <saf:if test="task == 'Create'">
-        <saf:submit action="Welcome" value="%{getText('button.cancel')}" onclick="form.onsubmit=null"/>
+        <saf:submit action="Welcome" value="%{getText('button.cancel')}"
+                    onclick="form.onsubmit=null"/>
     </saf:if>
     <saf:else>
-        <saf:submit action="MainMenu" value="%{getText('button.cancel')}" onclick="form.onsubmit=null"/>
+        <saf:submit action="MainMenu" value="%{getText('button.cancel')}"
+                    onclick="form.onsubmit=null"/>
     </saf:else>
 
 </saf:form>
@@ -102,7 +108,8 @@
 
     </table>
 
-    <a href="<saf:url action="Subscription!input"/>"><saf:text name="registration.addSubscription"/></a>
+    <a href="<saf:url action="Subscription!input"/>"><saf:text
+            name="registration.addSubscription"/></a>
 
 </saf:if>
 

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Subscription.jsp
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Subscription.jsp?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Subscription.jsp (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Subscription.jsp Sat Mar 25 18:17:14 2006
@@ -12,7 +12,8 @@
     <saf:if test="task=='Delete'">
         <title><saf:text name="subscription.title.delete"/></title>
     </saf:if>
-    <link href="<saf:url value="/css/mailreader.css"/>" rel="stylesheet" type="text/css"/>
+    <link href="<saf:url value="/css/mailreader.css"/>" rel="stylesheet"
+          type="text/css"/>
 </head>
 
 <body>
@@ -29,22 +30,32 @@
     </saf:else>
 
     <saf:if test="task == 'Delete'">
-        <saf:label label="%{getText('prompt.mailUsername')}" name="subscription.username"/>
-        <saf:label label="%{getText('prompt.mailPassword')}" name="subscription.password"/>
-        <saf:label label="%{getText('prompt.mailServerType')}" name="subscription.type"/>
-        <saf:label label="%{getText('prompt.autoConnect')}" name="subscription.autoConnect"/>
+        <saf:label label="%{getText('prompt.mailUsername')}"
+                   name="subscription.username"/>
+        <saf:label label="%{getText('prompt.mailPassword')}"
+                   name="subscription.password"/>
+        <saf:label label="%{getText('prompt.mailServerType')}"
+                   name="subscription.type"/>
+        <saf:label label="%{getText('prompt.autoConnect')}"
+                   name="subscription.autoConnect"/>
         <saf:submit value="%{getText('button.confirm')}"/>
     </saf:if>
     <saf:else>
-        <saf:textfield label="%{getText('prompt.mailUsername')}" name="subscription.username"/>
-        <saf:textfield label="%{getText('prompt.mailPassword')}" name="subscription.password"/>
-        <saf:select label="%{getText('prompt.mailServerType')}" name="subscription.type" list="types"/>
-        <saf:checkbox label="%{getText('prompt.autoConnect')}" name="subscription.autoConnect"/>
+        <saf:textfield label="%{getText('prompt.mailUsername')}"
+                       name="subscription.username"/>
+        <saf:textfield label="%{getText('prompt.mailPassword')}"
+                       name="subscription.password"/>
+        <saf:select label="%{getText('prompt.mailServerType')}"
+                    name="subscription.type" list="types"/>
+        <saf:checkbox label="%{getText('prompt.autoConnect')}"
+                      name="subscription.autoConnect"/>
         <saf:submit value="%{getText('button.save')}"/>
         <saf:reset value="%{getText('button.reset')}"/>
     </saf:else>
 
-    <saf:submit action="Registration!input" value="%{getText('button.cancel')}" onclick="form.onsubmit=null"/>
+    <saf:submit action="Registration!input"
+                value="%{getText('button.cancel')}"
+                onclick="form.onsubmit=null"/>
 </saf:form>
 
 <jsp:include page="Footer.jsp"/>

Modified: struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Welcome.jsp
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Welcome.jsp?rev=388869&r1=388868&r2=388869&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Welcome.jsp (original)
+++ struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Welcome.jsp Sat Mar 25 18:17:14 2006
@@ -5,15 +5,18 @@
 <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <title><saf:text name="index.title"/></title>
-    <link href="<saf:url value="/css/mailreader.css"/>" rel="stylesheet" type="text/css"/>
+    <link href="<saf:url value="/css/mailreader.css"/>" rel="stylesheet"
+          type="text/css"/>
 </head>
 
 <body>
 <h3><saf:text name="index.heading"/></h3>
 
 <ul>
-    <li><a href="<saf:url action="Registration!input"/>"><saf:text name="index.registration"/></a></li>
-    <li><a href="<saf:url action="Logon!input"/>"><saf:text name="index.logon"/></a></li>
+    <li><a href="<saf:url action="Registration!input"/>"><saf:text
+            name="index.registration"/></a></li>
+    <li><a href="<saf:url action="Logon!input"/>"><saf:text
+            name="index.logon"/></a></li>
 </ul>
 
 <h3>Language Options</h3>
@@ -27,7 +30,8 @@
 </ul>
 
 <p><saf:i18n name="alternate">
-    <img src="<saf:url><saf:text name="struts.logo.path"/></saf:url>" alt="<saf:text name="struts.logo.alt"/>"/>
+    <img src="<saf:url><saf:text name="struts.logo.path"/></saf:url>"
+         alt="<saf:text name="struts.logo.alt"/>"/>
 </saf:i18n></p>
 
 <p><a href="<saf:url action="Tour" />"><saf:text name="index.tour"/></a></p>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org