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 00:16:11 UTC
svn commit: r388856 - in /struts/sandbox/trunk/action2: ./
apps/mailreader/src/java/ apps/mailreader/src/java/mailreader2/
apps/mailreader/src/webapp/pages/
Author: husted
Date: Sat Mar 25 15:16:07 2006
New Revision: 388856
URL: http://svn.apache.org/viewcvs?rev=388856&view=rev
Log:
Action2 Apps
* Mailreader - Work in progress
** Complete critical path
** Still issues to resolve, but the core logic and workflow are in.
Modified:
struts/sandbox/trunk/action2/README.txt
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/pages/Registration.jsp
struts/sandbox/trunk/action2/apps/mailreader/src/webapp/pages/Subscription.jsp
Modified: struts/sandbox/trunk/action2/README.txt
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/action2/README.txt?rev=388856&r1=388855&r2=388856&view=diff
==============================================================================
--- struts/sandbox/trunk/action2/README.txt (original)
+++ struts/sandbox/trunk/action2/README.txt Sat Mar 25 15:16:07 2006
@@ -1,18 +1,17 @@
-This directory is a whiteboard area for working on new material
-related to the adoption of WebWork2 as Action2.
+This directory is a whiteboard area for working on new material related to
+the adoption of WebWork2 as Action2.
-Until a stable release of Action2 is available, this material
-is being based on OS WebWork 2.2.
+While WebWork2/Action2 is passing through the incubator, this material is
+being based on OS WebWork 2.2.2.
-Note this area is intended for *NEW* material only. Existing
-WebWork material will enter Apache Struts through the incubation
-process.
+Note this area is intended for *NEW* material only. Existing material must
+enter Apache Struts through the incubation process.
-At this time, the material is being built directly with IDEA,
-and a standard build file is not yet available.
+At this time, the material is being built directly with IDEA, and a standard
+build file is not yet available.
-For the time being, the dependencies required to build this
-material may be downloaded here:
+For the time being, the dependencies required to build this material may be
+downloaded here:
* http://people.apache.org/~husted/sandbox-action2-lib.zip
@@ -20,5 +19,173 @@
* http://www.StrutsUniversity.org/Application+Use+Cases
-###
+----------------------------------------------------------------------------
+APPS
+
+Under the apps folder, two applications are now being constructed
+
+ * Cookbook, and
+ * Mailreader
+
+The goal of the Cookbook is to combine the WebWork 2.2.2 Showcase with the
+Struts 1.3 Examples and the Struts 1.3 Cookbook.
+
+The Cookbook demonstrates working code and provides links to display the
+code for each example.
+
+The goal of the Mailreader is to provide a simple application that
+demonstrates best practices.
+
+The Mailreader is a simple parent/child workflow, where visitors can register
+with the application and the create child records related to the user's
+master account.
+
+Other new applications may include the iBATIS JPetstore example,
+which was based on Struts Action 1.
+
+Other WebWork example applications, like the shopping cart, could also be
+kept here.
+
+----------------------------------------------------------------------------
+
+STATUS - COOKBOOK
+
+* Several examples have been added.
+
+* The "Select" example could be streamlined to use one example of each
+Select control.
+
+* Other examples can be added at will.
+
+----------------------------------------------------------------------------
+
+STATUS - MAILREADER
+
+* Work in progress.
+
+----
+
+Welcome
+
+Nominal
++ Logon - Cancel
++ Register - Cancel
+
+Issues
+* Powered image not displaying.
+
+----
+
+Logon
+
+Nominal
++ Cancel
++ Reset
+- Submit (invalid) (*)
++ Submit (incorrect)
++ Submit
+
+Issues
+* Submit (invalid)
+** The "errors.password.mismatch" is not being resolved as message
+
+----
+
+Registraton Edit
+
+Nominal
++ Cancel
++ Reset
+- Submit (no change) (*)
+- Submit (change) (*)
+- Submit (invalid change) (*)
+
+Issues
+* Submit - no change
+** Password is displayed in plain text
+** Is there a WW way to set the focus?
+* Edit - Submit (change)
+** Password doesn't change when edited
+** Password Confirmation message not displayed
+* Edit = Submit (invalid change) (*)
+** When client-side validation is enabled, messages stack up on multiple invalid submits. Sever-side only OK.
+*** This doesn't happen with Logon page
+
+----
+
+Subscription Edit
+
+Nominal
++ Cancel (*)
++ Save (no changes)
++ Save (changes)
+
+Issues
+* Cancel
+** Goes to MainMenu rather than (back to) Registration
+
+----
+
+Subscription Delete
+
+Norminal
+ Cancel
+ Confirm
+
+----
+
+Subscription Add
+
+----
+
+Logoff
+
+Nominal
+* Logoff - Refresh
+* Logoff - Skip to Registeration page (*)
+
+Issues
+* Skip to Registration - Displays blank Main Menu; Edit defaults to Create
+
+----
+
+Registration Create
+
+Nominal
++ Cancel
++ Reset
+- Submit (no data) (*)
++ Submit (invalid data)
++ Submit (data)
+- Submit (duplicate data) (*)
+
+Issues (*)
+* Submit
+** Not parsing message variables: {0} in the range {1}
+* Submit (duplidate data)
+** Fails silently for duplicate user name
+** Password Confirmation message not displayed
+* Submit (invalid data)
+** When client-side validation is enabled, messages stack up on multiple invalid submits. Sever-side only OK.
+
+----
+
+Locale change
+* TODO
+
+----
+
+Tour
+* TODO
+
+----
+
+Error
+* Need to log and present unexpected exceptions
+
+----
+
+
+
+====
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=388856&r1=388855&r2=388856&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 15:16:07 2006
@@ -18,6 +18,7 @@
package mailreader2;
+import com.opensymphony.util.BeanUtils;
import com.opensymphony.webwork.interceptor.ApplicationAware;
import com.opensymphony.webwork.interceptor.SessionAware;
import com.opensymphony.xwork.ActionSupport;
@@ -27,6 +28,8 @@
import org.apache.struts.apps.mailreader.dao.Subscription;
import org.apache.struts.apps.mailreader.dao.User;
import org.apache.struts.apps.mailreader.dao.UserDatabase;
+import org.apache.struts.apps.mailreader.dao.impl.memory.MemorySubscription;
+import org.apache.struts.apps.mailreader.dao.impl.memory.MemoryUser;
import java.util.Map;
@@ -231,6 +234,49 @@
}
}
+ public void createInputUser() {
+ User user = new MemoryUser(null, null);
+ setUser(user);
+ }
+
+ /**
+ * <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
+ */
+ public User createUser(String username, String password) {
+
+ UserDatabase database = getDatabase();
+ User user;
+
+ try {
+
+ user = findUser(username, password);
+ }
+
+ catch (ExpiredPasswordException e) {
+ user = getUser(); // Just so that it is not null
+ }
+
+ if (user != null) {
+ this.addFieldError("username", "error.username.unique");
+ return null;
+ }
+
+ return database.createUser(username);
+ }
+
+ // Since user.username is immutable, we have to use some local properties
+ public void copyUser(String _username, String _password) {
+ User input = getUser();
+ input.setPassword(_password);
+ User user = createUser(_username, _password);
+ if (null != user) {
+ BeanUtils.setValues(user, input, null);
+ setUser(user);
+ }
+ }
+
// ---- Subscription property ----
/**
@@ -251,12 +297,12 @@
*
* @return The matching Subscription or null
*/
- public Subscription findSubscription() {
+ public Subscription findSubscription(String host) {
Subscription subscription;
try {
- subscription = getUser().findSubscription(getHost());
+ subscription = getUser().findSubscription(host);
}
catch (NullPointerException e) {
subscription = null;
@@ -265,11 +311,45 @@
return subscription;
}
+ public Subscription findSubscription() {
+
+ return findSubscription(getHost());
+ }
+
+ public void createInputSubscription() {
+ Subscription sub = new MemorySubscription(getUser(), null);
+ setSubscription(sub);
+ setHost(sub.getHost());
+ }
+
+ public Subscription createSubscription(String host) {
+
+ Subscription sub;
+
+ sub = findSubscription(host);
+
+ if (null != sub) {
+ this.addFieldError("host", "error.host.unique");
+ return null;
+ }
+
+ return getUser().createSubscription(host);
+ }
+
+ public void copySubscription(String host) {
+ Subscription input = getSubscription();
+ Subscription sub = createSubscription(host);
+ if (null != sub) {
+ BeanUtils.setValues(sub, input, null);
+ setSubscription(sub);
+ setHost(sub.getHost());
+ }
+ }
+
public void removeSubscription() throws Exception {
getUser().removeSubscription(getSubscription());
getSession().remove(Constants.SUBSCRIPTION_KEY);
}
-
public String getSubscriptionHost() {
Subscription sub = getSubscription();
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=388856&r1=388855&r2=388856&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 15:16:07 2006
@@ -1,10 +1,6 @@
package mailreader2;
-import com.opensymphony.util.BeanUtils;
-import org.apache.struts.apps.mailreader.dao.ExpiredPasswordException;
import org.apache.struts.apps.mailreader.dao.User;
-import org.apache.struts.apps.mailreader.dao.UserDatabase;
-import org.apache.struts.apps.mailreader.dao.impl.memory.MemoryUser;
/**
@@ -14,37 +10,6 @@
*/
public final class Registration extends MailreaderSupport {
- // ---- Private Methods ----
-
- /**
- * <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
- */
- private User createUser(String username, String password) {
-
- UserDatabase database = getDatabase();
- User user;
-
- try {
-
- user = findUser(username, password);
- }
-
- catch (ExpiredPasswordException e) {
- user = getUser(); // Just so that it is not null
- }
-
- if (user != null) {
- this.addFieldError("username", "error.username.unique");
- return null;
- }
-
- return database.createUser(username);
- }
-
- // ----- Public Methods ----
-
private boolean isCreating() {
User user = getUser();
return (null == user) || (null == user.getDatabase());
@@ -60,8 +25,7 @@
public String input() throws Exception {
if (isCreating()) {
- User user = new MemoryUser(null, null);
- setUser(user);
+ createInputUser();
setTask(Constants.CREATE);
} else {
setTask(Constants.EDIT);
@@ -86,14 +50,8 @@
boolean creating = Constants.CREATE.equals(getTask());
creating = creating && isCreating(); // trust but verify
- User user;
if (creating) {
- User input = getUser();
- // Since user.username is immutable, we have to use some local properties
- user = createUser(getUsername(), getPassword());
- input.setPassword(getPassword());
- BeanUtils.setValues(user, input, null);
- setUser(user);
+ copyUser(getUsername(), getPassword());
}
saveUser();
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=388856&r1=388855&r2=388856&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 15:16:07 2006
@@ -34,20 +34,12 @@
}
public String input() {
-
+ createInputSubscription();
setTask(Constants.CREATE);
return INPUT;
}
- public String delete() {
-
- setTask(Constants.DELETE);
- return INPUT;
- }
-
- public String edit() {
-
- setTask(Constants.EDIT);
+ public String find() {
org.apache.struts.apps.mailreader.dao.Subscription
sub = findSubscription();
@@ -59,12 +51,29 @@
setSubscription(sub);
return INPUT;
+
+ }
+
+ public String delete() {
+
+ setTask(Constants.DELETE);
+ return find();
+ }
+
+ public String edit() {
+
+ setTask(Constants.EDIT);
+ return find();
}
public String execute() throws Exception {
if (Constants.DELETE.equals(getTask())) {
removeSubscription();
+ }
+
+ if (Constants.CREATE.equals(getTask())) {
+ copySubscription(getHost());
}
saveUser();
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=388856&r1=388855&r2=388856&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 15:16:07 2006
@@ -7,18 +7,6 @@
<!-- default-action-ref name="Welcome"/ -->
- <global-results>
- <result name="error">/pages/Error.jsp</result>
- </global-results>
-
- <global-exception-mappings>
-
- <exception-mapping
- result="error"
- exception="java.lang.Exception"/>
-
- </global-exception-mappings>
-
<action name="Welcome">
<result>/pages/Welcome.jsp</result>
</action>
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=388856&r1=388855&r2=388856&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 15:16:07 2006
@@ -9,6 +9,7 @@
<a2:if test="task=='Edit'">
<title><a2:text name="registration.title.edit"/></title>
</a2:if>
+ <link href="<a2:url value="/css/mailreader.css"/>" rel="stylesheet" type="text/css"/>
</head>
<body>
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=388856&r1=388855&r2=388856&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 15:16:07 2006
@@ -12,6 +12,7 @@
<ui:if test="task=='Delete'">
<title><ui:text name="subscription.title.delete"/></title>
</ui:if>
+ <link href="<ui:url value="/css/mailreader.css"/>" rel="stylesheet" type="text/css"/>
</head>
<body>
@@ -20,31 +21,30 @@
<ui:label label="%{getText('prompt.username')}" name="user.username"/>
<ui:if test="task == 'Create'">
- <ui:textfield label="%{getText('prompt.mailHostname')}" name="subscription.host"/>
+ <ui:textfield label="%{getText('prompt.mailHostname')}" name="host"/>
</ui:if>
<ui:else>
<ui:label label="%{getText('prompt.mailHostname')}" name="host"/>
<ui:hidden name="host"/>
</ui:else>
- <ui:textfield label="%{getText('prompt.mailUsername')}" name="subscription.username"/>
-
- <ui:textfield label="%{getText('prompt.mailPassword')}" name="subscription.password"/>
-
- <ui:select label="%{getText('prompt.mailServerType')}" name="subscription.type"
- list="types"/>
-
- <ui:checkbox label="%{getText('prompt.autoConnect')}" name="subscription.autoConnect"/>
-
<ui:if test="task == 'Delete'">
+ <ui:label label="%{getText('prompt.mailUsername')}" name="subscription.username"/>
+ <ui:label label="%{getText('prompt.mailPassword')}" name="subscription.password"/>
+ <ui:label label="%{getText('prompt.mailServerType')}" name="subscription.type"/>
+ <ui:label label="%{getText('prompt.autoConnect')}" name="subscription.autoConnect"/>
<ui:submit value="%{getText('button.confirm')}"/>
- <ui:reset value="%{getText('button.reset')}"/>
</ui:if>
<ui:else>
+ <ui:textfield label="%{getText('prompt.mailUsername')}" name="subscription.username"/>
+ <ui:textfield label="%{getText('prompt.mailPassword')}" name="subscription.password"/>
+ <ui:select label="%{getText('prompt.mailServerType')}" name="subscription.type" list="types"/>
+ <ui:checkbox label="%{getText('prompt.autoConnect')}" name="subscription.autoConnect"/>
<ui:submit value="%{getText('button.save')}"/>
+ <ui:reset value="%{getText('button.reset')}"/>
</ui:else>
- <ui:submit action="MainMenu" value="%{getText('button.cancel')}" onclick="form.onsubmit=null"/>
+ <ui:submit action="Registration!input" value="%{getText('button.cancel')}" onclick="form.onsubmit=null"/>
</ui:form>
<jsp:include page="Footer.jsp"/>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org