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/04/06 21:42:26 UTC
svn commit: r392051 [1/3] - in
/struts/sandbox/trunk/mailreader-course/action2: ./ lab-1-3/src/java/
lab-1-3/src/test/ lab-1-3/src/webapp/pages/ lab-2-1/src/java/
lab-2-1/src/test/ lab-2-1/src/webapp/pages/ lab-2-2/ lab-2-2/src/java/
lab-2-2/src/test/ ...
Author: husted
Date: Thu Apr 6 12:42:22 2006
New Revision: 392051
URL: http://svn.apache.org/viewcvs?rev=392051&view=rev
Log:
MailReader Course
* Add lab 2-2
* Add missing files from other labs.
Added:
struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/MailReaderSupport.java (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/Register.java (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/database.xml (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/test/RegisterTest.java (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/webapp/pages/Register.jsp (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/MailReaderSupport.java (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/Register-validation.xml (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/Register.java (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/database.xml (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/test/RegisterTest.java (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/webapp/pages/Register.jsp (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/
- copied from r392023, struts/sandbox/trunk/mailreader-course/action2/lab-2-1/
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/lab-2-2.iml
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/MailReaderSupport.java (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/Register-validation.xml (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/Register.java (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/database.xml (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/test/RegisterTest.java (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/webapp/WEB-INF/entities/
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/webapp/WEB-INF/entities/WebTest.dtd (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/webapp/WEB-INF/entities/config.xml (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/webapp/WEB-INF/entities/register-open.xml (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/webapp/WEB-INF/entities/register-page.xml (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/webapp/WEB-INF/entities/register-trillian.xml (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/webapp/WEB-INF/entities/save-click.xml (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/webapp/WEB-INF/entities/taskdef.xml (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/webapp/WEB-INF/entities/welcome-open.xml (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/webapp/WEB-INF/webtest.xml (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/webapp/pages/Menu.jsp (with props)
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/webapp/pages/Register.jsp (with props)
Removed:
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/lab-2-1.iml
Modified:
struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/xwork.xml
struts/sandbox/trunk/mailreader-course/action2/mailreader-course-action2.ipr
Added: struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/MailReaderSupport.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/MailReaderSupport.java?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/MailReaderSupport.java (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/MailReaderSupport.java Thu Apr 6 12:42:22 2006
@@ -0,0 +1,139 @@
+import com.opensymphony.util.BeanUtils;
+import com.opensymphony.webwork.interceptor.ApplicationAware;
+import com.opensymphony.xwork.ActionSupport;
+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 java.util.Map;
+
+public class MailReaderSupport extends ActionSupport implements ApplicationAware {
+
+ // ---- Register form properties ----
+
+ private String username = null;
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String value) {
+ username = value;
+ }
+
+ private String password = null;
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String value) {
+ password = value;
+ }
+
+ private String password2 = null;
+
+ public String getPassword2() {
+ return password2;
+ }
+
+ public void setPassword2(String value) {
+ password2 = value;
+ }
+
+ private String fullName = null;
+
+ public String getFullName() {
+ return fullName;
+ }
+
+ public void setFullName(String value) {
+ fullName = value;
+ }
+
+ private String fromAddress = null;
+
+ public String getFromAddress() {
+ return fromAddress;
+ }
+
+ public void setFromAddress(String value) {
+ fromAddress = value;
+ }
+
+ private String replyToAddress = null;
+
+ public String getReplyToAddress() {
+ return replyToAddress;
+ }
+
+ public void setReplyToAddress(String value) {
+ replyToAddress = value;
+ }
+
+ // ---- Messages ----
+
+ public static final String DATABASE_KEY = "database";
+
+ public static final String ERROR_DATABASE_MISSING =
+ "Database is missing";
+
+ public static String ERROR_USERNAME_UNIQUE =
+ "That username is already in use - please select another";
+
+ public static final String USER_KEY = "user";
+
+ // ---- ApplicationAware ----
+
+ private Map application;
+
+ public void setApplication(Map value) {
+ application = value;
+ }
+
+ public Map getApplication() {
+ return application;
+ }
+
+ // ---- Database property ----
+
+ public UserDatabase getDatabase() {
+ Object db = getApplication().get(DATABASE_KEY);
+ if (db == null) {
+ this.addActionError(ERROR_DATABASE_MISSING);
+ }
+ return (UserDatabase) db;
+ }
+
+ public void setDatabase(UserDatabase database) {
+ getApplication().put(DATABASE_KEY, database);
+ }
+
+ // ---- Database methods ----
+
+ public User findUser(String username, String password)
+ throws ExpiredPasswordException {
+ return getDatabase().findUser(username);
+ }
+
+ public User createUser(String username, String password) throws Exception {
+
+ UserDatabase database = getDatabase();
+ User user = database.findUser(username);
+
+ if (user != null) {
+ addActionError(ERROR_USERNAME_UNIQUE);
+ return null;
+ }
+
+ user = database.createUser(username);
+ BeanUtils.setValues(user, this, null);
+
+ return user;
+ }
+
+ public void saveUser() throws Exception {
+ getDatabase().save();
+ }
+
+}
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/MailReaderSupport.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/Register.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/Register.java?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/Register.java (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/Register.java Thu Apr 6 12:42:22 2006
@@ -0,0 +1,24 @@
+import com.opensymphony.xwork.Action;
+import org.apache.struts.apps.mailreader.dao.User;
+
+public class Register extends MailReaderSupport {
+
+ public String execute()
+ throws Exception {
+
+ User user = findUser(getUsername(), getPassword());
+ boolean haveUser = (user != null);
+
+ if (haveUser) {
+ addActionError(ERROR_USERNAME_UNIQUE);
+ return Action.INPUT;
+ }
+
+ createUser(getUsername(), getPassword());
+
+ saveUser();
+
+ return Action.SUCCESS;
+ }
+
+}
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/Register.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/database.xml
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/database.xml?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/database.xml (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/database.xml Thu Apr 6 12:42:22 2006
@@ -0,0 +1,13 @@
+<?xml version='1.0'?>
+<database>
+ <user username="user" fromAddress="John.User@somewhere.com"
+ fullName="John Q. User" password="pass">
+ <subscription host="mail.hotmail.com" autoConnect="false"
+ password="bar" type="pop3" username="user1234">
+ </subscription>
+ <subscription host="mail.yahoo.com" autoConnect="false" password="foo"
+ type="imap" username="jquser">
+ </subscription>
+ </user>
+</database>
+
\ No newline at end of file
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/java/database.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/test/RegisterTest.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/test/RegisterTest.java?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/test/RegisterTest.java (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/test/RegisterTest.java Thu Apr 6 12:42:22 2006
@@ -0,0 +1,34 @@
+import com.opensymphony.xwork.Action;
+import org.apache.struts.apps.mailreader.dao.User;
+
+import java.util.HashMap;
+
+public class RegisterTest extends RetainTest {
+
+ Register action = null;
+
+ public void setUp() throws Exception {
+ super.setUp();
+ action = new Register();
+ action.setApplication(new HashMap());
+ action.setDatabase(database);
+ }
+
+ public void testExecute() throws Exception {
+
+ action.setUsername("user");
+ action.setPassword("pass");
+ action.setFullName("John Q. User");
+ action.setFromAddress("John.User@somewhere.com");
+
+ String success = action.execute();
+ assertTrue("Expected SUCCESS", Action.SUCCESS.equals(success));
+
+ User user = database.findUser("user");
+ assertNotNull("Expected user", user);
+
+ String input = action.execute();
+ assertTrue("Expected INPUT", Action.INPUT.equals(input));
+ }
+
+}
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/test/RegisterTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/webapp/pages/Register.jsp
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/webapp/pages/Register.jsp?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/webapp/pages/Register.jsp (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/webapp/pages/Register.jsp Thu Apr 6 12:42:22 2006
@@ -0,0 +1,30 @@
+<%@ taglib uri="/webwork" prefix="ww" %>
+<html>
+<head>
+ <title>Register</title>
+</head>
+
+<body onLoad="self.focus();document.Register.username.focus()">
+
+<ww:actionerror/>
+<ww:form method="POST">
+
+ <ww:textfield label="UserName" name="username"/>
+
+ <ww:password label="Password" name="password"/>
+
+ <ww:password label="Confirm Password" name="password2"/>
+
+ <ww:textfield label="Full Name" name="fullName"/>
+
+ <ww:textfield label="From Address" name="fromAddress"/>
+
+ <ww:textfield label="Reply To Address" name="replyToAddress"/>
+
+ <ww:submit value="Save" name="Save"/>
+
+</ww:form>
+
+
+</body>
+</html>
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-1-3/src/webapp/pages/Register.jsp
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/MailReaderSupport.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/MailReaderSupport.java?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/MailReaderSupport.java (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/MailReaderSupport.java Thu Apr 6 12:42:22 2006
@@ -0,0 +1,139 @@
+import com.opensymphony.util.BeanUtils;
+import com.opensymphony.webwork.interceptor.ApplicationAware;
+import com.opensymphony.xwork.ActionSupport;
+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 java.util.Map;
+
+public class MailReaderSupport extends ActionSupport implements ApplicationAware {
+
+ // ---- Register form properties ----
+
+ private String username = null;
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String value) {
+ username = value;
+ }
+
+ private String password = null;
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String value) {
+ password = value;
+ }
+
+ private String password2 = null;
+
+ public String getPassword2() {
+ return password2;
+ }
+
+ public void setPassword2(String value) {
+ password2 = value;
+ }
+
+ private String fullName = null;
+
+ public String getFullName() {
+ return fullName;
+ }
+
+ public void setFullName(String value) {
+ fullName = value;
+ }
+
+ private String fromAddress = null;
+
+ public String getFromAddress() {
+ return fromAddress;
+ }
+
+ public void setFromAddress(String value) {
+ fromAddress = value;
+ }
+
+ private String replyToAddress = null;
+
+ public String getReplyToAddress() {
+ return replyToAddress;
+ }
+
+ public void setReplyToAddress(String value) {
+ replyToAddress = value;
+ }
+
+ // ---- Messages ----
+
+ public static final String DATABASE_KEY = "database";
+
+ public static final String ERROR_DATABASE_MISSING =
+ "Database is missing";
+
+ public static String ERROR_USERNAME_UNIQUE =
+ "That username is already in use - please select another";
+
+ public static final String USER_KEY = "user";
+
+ // ---- ApplicationAware ----
+
+ private Map application;
+
+ public void setApplication(Map value) {
+ application = value;
+ }
+
+ public Map getApplication() {
+ return application;
+ }
+
+ // ---- Database property ----
+
+ public UserDatabase getDatabase() {
+ Object db = getApplication().get(DATABASE_KEY);
+ if (db == null) {
+ this.addActionError(ERROR_DATABASE_MISSING);
+ }
+ return (UserDatabase) db;
+ }
+
+ public void setDatabase(UserDatabase database) {
+ getApplication().put(DATABASE_KEY, database);
+ }
+
+ // ---- Database methods ----
+
+ public User findUser(String username, String password)
+ throws ExpiredPasswordException {
+ return getDatabase().findUser(username);
+ }
+
+ public User createUser(String username, String password) throws Exception {
+
+ UserDatabase database = getDatabase();
+ User user = database.findUser(username);
+
+ if (user != null) {
+ addActionError(ERROR_USERNAME_UNIQUE);
+ return null;
+ }
+
+ user = database.createUser(username);
+ BeanUtils.setValues(user, this, null);
+
+ return user;
+ }
+
+ public void saveUser() throws Exception {
+ getDatabase().save();
+ }
+
+}
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/MailReaderSupport.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/Register-validation.xml
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/Register-validation.xml?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/Register-validation.xml (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/Register-validation.xml Thu Apr 6 12:42:22 2006
@@ -0,0 +1,55 @@
+<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+
+<validators>
+
+ <field name="username">
+ <field-validator type="requiredstring">
+ <message>Username is required</message>
+ </field-validator>
+ </field>
+
+ <field name="fullName">
+ <field-validator type="requiredstring">
+ <message>Full Name is required</message>
+ </field-validator>
+ </field>
+
+ <field name="fromAddress">
+ <field-validator type="requiredstring">
+ <message>From Address is required</message>
+ </field-validator>
+ <field-validator type="email">
+ <message>Invalid format for From Address</message>
+ </field-validator>
+ </field>
+
+ <field name="replyToAddress">
+ <field-validator type="email">
+ <message>Invalid format for Reply To Address</message>
+ </field-validator>
+ </field>
+
+ <field name="password">
+ <field-validator type="requiredstring">
+ <message>Password is required</message>
+ </field-validator>
+ <field-validator type="stringlength">
+ <param name="trim">true</param>
+ <param name="minLength">4</param>
+ <param name="maxLength">10</param>
+ <message>Password length is not in the range 4 through 10.</message>
+ </field-validator>
+ </field>
+
+ <field name="password2">
+ <field-validator type="requiredstring">
+ <message>Confirmation password is required</message>
+ </field-validator>
+ </field>
+
+ <validator type="expression">
+ <param name="expression">password eq password2</param>
+ <message>Invalid username and/or password, please try again</message>
+ </validator>
+
+</validators>
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/Register-validation.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/Register.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/Register.java?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/Register.java (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/Register.java Thu Apr 6 12:42:22 2006
@@ -0,0 +1,24 @@
+import com.opensymphony.xwork.Action;
+import org.apache.struts.apps.mailreader.dao.User;
+
+public class Register extends MailReaderSupport {
+
+ public String execute()
+ throws Exception {
+
+ User user = findUser(getUsername(), getPassword());
+ boolean haveUser = (user != null);
+
+ if (haveUser) {
+ addActionError(ERROR_USERNAME_UNIQUE);
+ return Action.INPUT;
+ }
+
+ createUser(getUsername(), getPassword());
+
+ saveUser();
+
+ return Action.SUCCESS;
+ }
+
+}
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/Register.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/database.xml
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/database.xml?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/database.xml (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/database.xml Thu Apr 6 12:42:22 2006
@@ -0,0 +1,13 @@
+<?xml version='1.0'?>
+<database>
+ <user username="user" fromAddress="John.User@somewhere.com"
+ fullName="John Q. User" password="pass">
+ <subscription host="mail.hotmail.com" autoConnect="false"
+ password="bar" type="pop3" username="user1234">
+ </subscription>
+ <subscription host="mail.yahoo.com" autoConnect="false" password="foo"
+ type="imap" username="jquser">
+ </subscription>
+ </user>
+</database>
+
\ No newline at end of file
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/java/database.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/test/RegisterTest.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/test/RegisterTest.java?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/test/RegisterTest.java (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/test/RegisterTest.java Thu Apr 6 12:42:22 2006
@@ -0,0 +1,34 @@
+import com.opensymphony.xwork.Action;
+import org.apache.struts.apps.mailreader.dao.User;
+
+import java.util.HashMap;
+
+public class RegisterTest extends RetainTest {
+
+ Register action = null;
+
+ public void setUp() throws Exception {
+ super.setUp();
+ action = new Register();
+ action.setApplication(new HashMap());
+ action.setDatabase(database);
+ }
+
+ public void testExecute() throws Exception {
+
+ action.setUsername("user");
+ action.setPassword("pass");
+ action.setFullName("John Q. User");
+ action.setFromAddress("John.User@somewhere.com");
+
+ String success = action.execute();
+ assertTrue("Expected SUCCESS", Action.SUCCESS.equals(success));
+
+ User user = database.findUser("user");
+ assertNotNull("Expected user", user);
+
+ String input = action.execute();
+ assertTrue("Expected INPUT", Action.INPUT.equals(input));
+ }
+
+}
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/test/RegisterTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/webapp/pages/Register.jsp
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/webapp/pages/Register.jsp?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/webapp/pages/Register.jsp (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/webapp/pages/Register.jsp Thu Apr 6 12:42:22 2006
@@ -0,0 +1,30 @@
+<%@ taglib uri="/webwork" prefix="ww" %>
+<html>
+<head>
+ <title>Register</title>
+</head>
+
+<body onLoad="self.focus();document.Register.username.focus()">
+
+<ww:actionerror/>
+<ww:form method="POST" validate="true">
+
+ <ww:textfield label="UserName" name="username"/>
+
+ <ww:password label="Password" name="password"/>
+
+ <ww:password label="Confirm Password" name="password2"/>
+
+ <ww:textfield label="Full Name" name="fullName"/>
+
+ <ww:textfield label="From Address" name="fromAddress"/>
+
+ <ww:textfield label="Reply To Address" name="replyToAddress"/>
+
+ <ww:submit value="Save" name="Save"/>
+
+</ww:form>
+
+
+</body>
+</html>
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-2-1/src/webapp/pages/Register.jsp
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-2-2/lab-2-2.iml
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-2-2/lab-2-2.iml?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-2-2/lab-2-2.iml (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-2-2/lab-2-2.iml Thu Apr 6 12:42:22 2006
@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module version="4" relativePaths="true" type="J2EE_WEB_MODULE" j2ee-integration="Tomcat Server">
+ <component name="ModuleRootManager" />
+ <component name="NewModuleRootManager">
+ <output url="file://C:/opt/Apache/Tomcat-5.0/webapps/lab-2-2/WEB-INF/classes" />
+ <exclude-output />
+ <exploded url="file://C:/opt/Apache/Tomcat-5.0/webapps/lab-2-2" />
+ <exclude-exploded />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/src/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test" isTestSource="true" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="library" name="Tomcat" level="application_server_libraries" />
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/spring-web.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/oscore.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/struts-mailreader-dao-1.3.0-dev.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/spring-context.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/spring-core.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/webwork-2.2.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/xwork-1.1.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/freemarker.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/commons-digester-1.6.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/rife-continuations.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/commons-collections-3.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/spring-beans.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/ognl.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/commons-logging-1.0.4.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../../lib/struts-taglib-1.3.0.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$APPLICATION_HOME_DIR$/lib/junit.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntryProperties />
+ </component>
+ <component name="WebModuleBuildComponent">
+ <setting name="EXPLODED_URL" value="file://C:/opt/Apache/Tomcat-5.0/webapps/lab-2-2" />
+ <setting name="EXPLODED_ENABLED" value="true" />
+ <setting name="JAR_URL" value="file://" />
+ <setting name="JAR_ENABLED" value="false" />
+ <setting name="SYNC_EXPLODED_DIR" value="true" />
+ <setting name="BUILD_ON_FRAME_DEACTIVATION" value="false" />
+ <setting name="RUN_JASPER_VALIDATION" value="false" />
+ </component>
+ <component name="WebModuleProperties">
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/junit.jar" />
+ <url>jar://$APPLICATION_HOME_DIR$/lib/junit.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/commons-collections-3.1.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/commons-collections-3.1.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/commons-digester-1.6.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/commons-digester-1.6.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/commons-logging-1.0.4.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/commons-logging-1.0.4.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/freemarker.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/freemarker.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/ognl.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/ognl.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/oscore.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/oscore.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/rife-continuations.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/rife-continuations.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/spring-beans.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/spring-beans.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/spring-context.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/spring-context.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/spring-core.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/spring-core.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/spring-web.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/spring-web.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/struts-mailreader-dao-1.3.0-dev.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/struts-mailreader-dao-1.3.0-dev.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/struts-taglib-1.3.0.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/struts-taglib-1.3.0.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/webwork-2.2.2.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/webwork-2.2.2.jar!/</url>
+ </containerElement>
+ <containerElement type="library" level="module">
+ <attribute name="method" value="1" />
+ <attribute name="URI" value="/WEB-INF/lib/xwork-1.1.2.jar" />
+ <url>jar://$MODULE_DIR$/../../lib/xwork-1.1.2.jar!/</url>
+ </containerElement>
+ <deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/src/webapp/WEB-INF/web.xml" optional="false" version="2.3" />
+ <deploymentDescriptor name="context.xml" url="file://$MODULE_DIR$/META-INF/context.xml" optional="false" version="5.x" />
+ <webroots>
+ <root url="file://$MODULE_DIR$/src/webapp" relative="/" />
+ <root url="file://$MODULE_DIR$/src/java" relative="/WEB-INF/src/java" />
+ <root url="file://$MODULE_DIR$/src/test" relative="/WEB-INF/src/test" />
+ </webroots>
+ </component>
+ <component name="WeblogicWebModuleProperties">
+ <option name="IS_RUN_APPC" value="false" />
+ </component>
+</module>
+
Added: struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/MailReaderSupport.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/MailReaderSupport.java?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/MailReaderSupport.java (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/MailReaderSupport.java Thu Apr 6 12:42:22 2006
@@ -0,0 +1,139 @@
+import com.opensymphony.util.BeanUtils;
+import com.opensymphony.webwork.interceptor.ApplicationAware;
+import com.opensymphony.xwork.ActionSupport;
+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 java.util.Map;
+
+public class MailReaderSupport extends ActionSupport implements ApplicationAware {
+
+ // ---- Register form properties ----
+
+ private String username = null;
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String value) {
+ username = value;
+ }
+
+ private String password = null;
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String value) {
+ password = value;
+ }
+
+ private String password2 = null;
+
+ public String getPassword2() {
+ return password2;
+ }
+
+ public void setPassword2(String value) {
+ password2 = value;
+ }
+
+ private String fullName = null;
+
+ public String getFullName() {
+ return fullName;
+ }
+
+ public void setFullName(String value) {
+ fullName = value;
+ }
+
+ private String fromAddress = null;
+
+ public String getFromAddress() {
+ return fromAddress;
+ }
+
+ public void setFromAddress(String value) {
+ fromAddress = value;
+ }
+
+ private String replyToAddress = null;
+
+ public String getReplyToAddress() {
+ return replyToAddress;
+ }
+
+ public void setReplyToAddress(String value) {
+ replyToAddress = value;
+ }
+
+ // ---- Messages ----
+
+ public static final String DATABASE_KEY = "database";
+
+ public static final String ERROR_DATABASE_MISSING =
+ "Database is missing";
+
+ public static String ERROR_USERNAME_UNIQUE =
+ "That username is already in use - please select another";
+
+ public static final String USER_KEY = "user";
+
+ // ---- ApplicationAware ----
+
+ private Map application;
+
+ public void setApplication(Map value) {
+ application = value;
+ }
+
+ public Map getApplication() {
+ return application;
+ }
+
+ // ---- Database property ----
+
+ public UserDatabase getDatabase() {
+ Object db = getApplication().get(DATABASE_KEY);
+ if (db == null) {
+ this.addActionError(ERROR_DATABASE_MISSING);
+ }
+ return (UserDatabase) db;
+ }
+
+ public void setDatabase(UserDatabase database) {
+ getApplication().put(DATABASE_KEY, database);
+ }
+
+ // ---- Database methods ----
+
+ public User findUser(String username, String password)
+ throws ExpiredPasswordException {
+ return getDatabase().findUser(username);
+ }
+
+ public User createUser(String username, String password) throws Exception {
+
+ UserDatabase database = getDatabase();
+ User user = database.findUser(username);
+
+ if (user != null) {
+ addActionError(ERROR_USERNAME_UNIQUE);
+ return null;
+ }
+
+ user = database.createUser(username);
+ BeanUtils.setValues(user, this, null);
+
+ return user;
+ }
+
+ public void saveUser() throws Exception {
+ getDatabase().save();
+ }
+
+}
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/MailReaderSupport.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/Register-validation.xml
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/Register-validation.xml?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/Register-validation.xml (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/Register-validation.xml Thu Apr 6 12:42:22 2006
@@ -0,0 +1,55 @@
+<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+
+<validators>
+
+ <field name="username">
+ <field-validator type="requiredstring">
+ <message>Username is required</message>
+ </field-validator>
+ </field>
+
+ <field name="fullName">
+ <field-validator type="requiredstring">
+ <message>Full Name is required</message>
+ </field-validator>
+ </field>
+
+ <field name="fromAddress">
+ <field-validator type="requiredstring">
+ <message>From Address is required</message>
+ </field-validator>
+ <field-validator type="email">
+ <message>Invalid format for From Address</message>
+ </field-validator>
+ </field>
+
+ <field name="replyToAddress">
+ <field-validator type="email">
+ <message>Invalid format for Reply To Address</message>
+ </field-validator>
+ </field>
+
+ <field name="password">
+ <field-validator type="requiredstring">
+ <message>Password is required</message>
+ </field-validator>
+ <field-validator type="stringlength">
+ <param name="trim">true</param>
+ <param name="minLength">4</param>
+ <param name="maxLength">10</param>
+ <message>Password length is not in the range 4 through 10.</message>
+ </field-validator>
+ </field>
+
+ <field name="password2">
+ <field-validator type="requiredstring">
+ <message>Confirmation password is required</message>
+ </field-validator>
+ </field>
+
+ <validator type="expression">
+ <param name="expression">password eq password2</param>
+ <message>Invalid username and/or password, please try again</message>
+ </validator>
+
+</validators>
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/Register-validation.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/Register.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/Register.java?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/Register.java (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/Register.java Thu Apr 6 12:42:22 2006
@@ -0,0 +1,24 @@
+import com.opensymphony.xwork.Action;
+import org.apache.struts.apps.mailreader.dao.User;
+
+public class Register extends MailReaderSupport {
+
+ public String execute()
+ throws Exception {
+
+ User user = findUser(getUsername(), getPassword());
+ boolean haveUser = (user != null);
+
+ if (haveUser) {
+ addActionError(ERROR_USERNAME_UNIQUE);
+ return Action.INPUT;
+ }
+
+ createUser(getUsername(), getPassword());
+
+ saveUser();
+
+ return Action.SUCCESS;
+ }
+
+}
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/Register.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/database.xml
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/database.xml?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/database.xml (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/database.xml Thu Apr 6 12:42:22 2006
@@ -0,0 +1,13 @@
+<?xml version='1.0'?>
+<database>
+ <user username="user" fromAddress="John.User@somewhere.com"
+ fullName="John Q. User" password="pass">
+ <subscription host="mail.hotmail.com" autoConnect="false"
+ password="bar" type="pop3" username="user1234">
+ </subscription>
+ <subscription host="mail.yahoo.com" autoConnect="false" password="foo"
+ type="imap" username="jquser">
+ </subscription>
+ </user>
+</database>
+
\ No newline at end of file
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/database.xml
------------------------------------------------------------------------------
svn:eol-style = native
Modified: struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/xwork.xml
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/xwork.xml?rev=392051&r1=392023&r2=392051&view=diff
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/xwork.xml (original)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/java/xwork.xml Thu Apr 6 12:42:22 2006
@@ -21,7 +21,7 @@
<action name="Register" class="Register">
<result name="input">/pages/Register.jsp</result>
- <result>/pages/Missing.jsp</result>
+ <result>/pages/Menu.jsp</result>
</action>
</package>
Added: struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/test/RegisterTest.java
URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/test/RegisterTest.java?rev=392051&view=auto
==============================================================================
--- struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/test/RegisterTest.java (added)
+++ struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/test/RegisterTest.java Thu Apr 6 12:42:22 2006
@@ -0,0 +1,34 @@
+import com.opensymphony.xwork.Action;
+import org.apache.struts.apps.mailreader.dao.User;
+
+import java.util.HashMap;
+
+public class RegisterTest extends RetainTest {
+
+ Register action = null;
+
+ public void setUp() throws Exception {
+ super.setUp();
+ action = new Register();
+ action.setApplication(new HashMap());
+ action.setDatabase(database);
+ }
+
+ public void testExecute() throws Exception {
+
+ action.setUsername("user");
+ action.setPassword("pass");
+ action.setFullName("John Q. User");
+ action.setFromAddress("John.User@somewhere.com");
+
+ String success = action.execute();
+ assertTrue("Expected SUCCESS", Action.SUCCESS.equals(success));
+
+ User user = database.findUser("user");
+ assertNotNull("Expected user", user);
+
+ String input = action.execute();
+ assertTrue("Expected INPUT", Action.INPUT.equals(input));
+ }
+
+}
Propchange: struts/sandbox/trunk/mailreader-course/action2/lab-2-2/src/test/RegisterTest.java
------------------------------------------------------------------------------
svn:eol-style = native
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org