Author: husted Date: Sat Aug 12 17:45:14 2006 New Revision: 431120 URL: http://svn.apache.org/viewvc?rev=431120&view=rev Log: Update "register" lab for Struts 2
Added: struts/sandbox/trunk/mailreader-course/struts2/register/ struts/sandbox/trunk/mailreader-course/struts2/register/META-INF/ struts/sandbox/trunk/mailreader-course/struts2/register/META-INF/context.xml struts/sandbox/trunk/mailreader-course/struts2/register/register.iml struts/sandbox/trunk/mailreader-course/struts2/register/src/ struts/sandbox/trunk/mailreader-course/struts2/register/src/java/ struts/sandbox/trunk/mailreader-course/struts2/register/src/java/DatabaseListener.java struts/sandbox/trunk/mailreader-course/struts2/register/src/java/Hello.java struts/sandbox/trunk/mailreader-course/struts2/register/src/java/MailReaderSupport.java struts/sandbox/trunk/mailreader-course/struts2/register/src/java/Register.java struts/sandbox/trunk/mailreader-course/struts2/register/src/java/applicationContext.xml struts/sandbox/trunk/mailreader-course/struts2/register/src/java/database.xml struts/sandbox/trunk/mailreader-course/struts2/register/src/java/resources.properties struts/sandbox/trunk/mailreader-course/struts2/register/src/java/struts.properties struts/sandbox/trunk/mailreader-course/struts2/register/src/java/struts.xml struts/sandbox/trunk/mailreader-course/struts2/register/src/test/ struts/sandbox/trunk/mailreader-course/struts2/register/src/test/HelloTest.java struts/sandbox/trunk/mailreader-course/struts2/register/src/test/RegisterTest.java struts/sandbox/trunk/mailreader-course/struts2/register/src/test/RetainTest.java struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/ struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/WEB-INF/ struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/WEB-INF/classes/ struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/WEB-INF/web.xml struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/index.html struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/ struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Hello.jsp struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Missing.jsp struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Register.jsp struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Welcome.jsp Added: struts/sandbox/trunk/mailreader-course/struts2/register/META-INF/context.xml URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/META-INF/context.xml?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/META-INF/context.xml (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/META-INF/context.xml Sat Aug 12 17:45:14 2006 @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Context path="/"> +</Context> Added: struts/sandbox/trunk/mailreader-course/struts2/register/register.iml URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/register.iml?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/register.iml (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/register.iml Sat Aug 12 17:45:14 2006 @@ -0,0 +1,282 @@ +<?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.5/webapps/register/WEB-INF/classes" /> + <exclude-output /> + <exploded url="file://C:/opt/Apache/Tomcat-5.5/webapps/register" /> + <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="module-library"> + <library> + <CLASSES> + <root url="jar://$APPLICATION_HOME_DIR$/lib/junit.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://C:/opt/Apache/Tomcat-5.5/common/lib/servlet-api.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib/xwork-2.0-SNAPSHOT.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib/spring-beans-1.2.6.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib/spring-aop-1.2.6.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib/commons-collections-2.1.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/struts-mailreader-dao-1.3.5-SNAPSHOT.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib/ognl-2.6.7.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib/freemarker-2.3.4.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib/struts2-api-2.0.0-SNAPSHOT.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib/spring-core-1.2.6.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/struts2-core-2.0.0-SNAPSHOT.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib/struts2-extras-2.0.0-SNAPSHOT.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib/oscore-2.2.4.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib/spring-context-1.2.6.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib/spring-web-1.2.6.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="library" name="Tomcat 5.5" level="application_server_libraries" /> + <orderEntryProperties /> + </component> + <component name="WebModuleBuildComponent"> + <setting name="EXPLODED_URL" value="file://C:/opt/Apache/Tomcat-5.5/webapps/register" /> + <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/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-2.3.4.jar" /> + <url>jar://$MODULE_DIR$/../lib/freemarker-2.3.4.jar!/</url> + </containerElement> + <containerElement type="library" level="module"> + <attribute name="method" value="1" /> + <attribute name="URI" value="/WEB-INF/lib/ognl-2.6.7.jar" /> + <url>jar://$MODULE_DIR$/../lib/ognl-2.6.7.jar!/</url> + </containerElement> + <containerElement type="library" level="module"> + <attribute name="method" value="1" /> + <attribute name="URI" value="/WEB-INF/lib/oscore-2.2.4.jar" /> + <url>jar://$MODULE_DIR$/../lib/oscore-2.2.4.jar!/</url> + </containerElement> + <containerElement type="library" level="module"> + <attribute name="method" value="1" /> + <attribute name="URI" value="/WEB-INF/lib/spring-aop-1.2.6.jar" /> + <url>jar://$MODULE_DIR$/../lib/spring-aop-1.2.6.jar!/</url> + </containerElement> + <containerElement type="library" level="module"> + <attribute name="method" value="1" /> + <attribute name="URI" value="/WEB-INF/lib/spring-beans-1.2.6.jar" /> + <url>jar://$MODULE_DIR$/../lib/spring-beans-1.2.6.jar!/</url> + </containerElement> + <containerElement type="library" level="module"> + <attribute name="method" value="1" /> + <attribute name="URI" value="/WEB-INF/lib/spring-context-1.2.6.jar" /> + <url>jar://$MODULE_DIR$/../lib/spring-context-1.2.6.jar!/</url> + </containerElement> + <containerElement type="library" level="module"> + <attribute name="method" value="1" /> + <attribute name="URI" value="/WEB-INF/lib/spring-core-1.2.6.jar" /> + <url>jar://$MODULE_DIR$/../lib/spring-core-1.2.6.jar!/</url> + </containerElement> + <containerElement type="library" level="module"> + <attribute name="method" value="1" /> + <attribute name="URI" value="/WEB-INF/lib/spring-web-1.2.6.jar" /> + <url>jar://$MODULE_DIR$/../lib/spring-web-1.2.6.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.5-SNAPSHOT.jar" /> + <url>jar://$MODULE_DIR$/../lib/struts-mailreader-dao-1.3.5-SNAPSHOT.jar!/</url> + </containerElement> + <containerElement type="library" level="module"> + <attribute name="method" value="1" /> + <attribute name="URI" value="/WEB-INF/lib/struts2-api-2.0.0-SNAPSHOT.jar" /> + <url>jar://$MODULE_DIR$/../lib/struts2-api-2.0.0-SNAPSHOT.jar!/</url> + </containerElement> + <containerElement type="library" level="module"> + <attribute name="method" value="1" /> + <attribute name="URI" value="/WEB-INF/lib/struts2-core-2.0.0-SNAPSHOT.jar" /> + <url>jar://$MODULE_DIR$/../lib/struts2-core-2.0.0-SNAPSHOT.jar!/</url> + </containerElement> + <containerElement type="library" level="module"> + <attribute name="method" value="1" /> + <attribute name="URI" value="/WEB-INF/lib/struts2-extras-2.0.0-SNAPSHOT.jar" /> + <url>jar://$MODULE_DIR$/../lib/struts2-extras-2.0.0-SNAPSHOT.jar!/</url> + </containerElement> + <containerElement type="library" level="module"> + <attribute name="method" value="1" /> + <attribute name="URI" value="/WEB-INF/lib/xwork-2.0-SNAPSHOT.jar" /> + <url>jar://$MODULE_DIR$/../lib/xwork-2.0-SNAPSHOT.jar!/</url> + </containerElement> + <deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/src/webapp/WEB-INF/web.xml" optional="false" version="2.3" /> + <deploymentDescriptor name="" url="file://$MODULE_DIR$/META-INF/context.xml" optional="false"> + <option name="DEFAULT_DIR" value="WEB-INF" /> + <option name="NAME" value="" /> + <option name="DESCRIPTION" value="" /> + </deploymentDescriptor> + <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/struts2/register/src/java/DatabaseListener.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/java/DatabaseListener.java?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/java/DatabaseListener.java (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/java/DatabaseListener.java Sat Aug 12 17:45:14 2006 @@ -0,0 +1,229 @@ +/* + * Copyright 1999-2002,2004 The 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. + * + * $Id: ApplicationListener.java 372087 2006-01-25 03:38:42Z craigmcc $ + */ + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.struts.apps.mailreader.dao.impl.memory.MemoryUserDatabase; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import java.io.*; + +/** + * <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/> + * <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/> + * <p>This class was borrowed from the Shale Mailreader. Changes were:</p> + * <p/> + * <ul> + * <p/> + * <li>Path to database.xml (under classes here). </li> + * <p/> + * <li>Class to store protocol list (an array here). </li> + * <p/> + * </ul> + * <p/> + * DEVELOPMENT NOTE - Another approach would be to instantiate the database via Spring. + * </p> + */ + +public final class DatabaseListener implements ServletContextListener { + + // ------------------------------------------------------ Manifest Constants + + + /** + * <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> + */ + public static final String PROTOCOLS_KEY = "protocols"; + + // ------------------------------------------------------ Instance Variables + + + /** + * <p>The <code>ServletContext</code> for this web application.</p> + */ + private ServletContext context = null; + + + /** + * The [EMAIL PROTECTED] MemoryUserDatabase} object we construct and make available. + */ + private MemoryUserDatabase database = null; + + + /** + * <p>Logging output for this plug in instance.</p> + */ + private Log log = LogFactory.getLog(this.getClass()); + + // ------------------------------------------------------------- Properties + + + /** + * <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; + } + + // ------------------------------------------ ServletContextListener Methods + + + /** + * <p>Gracefully shut down this database, releasing any resources that + * were allocated at initialization.</p> + * + * @param event ServletContextEvent to process + */ + public void contextDestroyed(ServletContextEvent event) { + + log.info("Finalizing memory database plug in"); + + if (database != null) { + try { + database.close(); + } catch (Exception e) { + log.error("Closing memory database", e); + } + } + + context.removeAttribute(DATABASE_KEY); + context.removeAttribute(PROTOCOLS_KEY); + database = null; + context = null; + + } + + + /** + * <p>Initialize and load our initial database from persistent + * storage.</p> + * + * @param event The context initialization event + */ + public void contextInitialized(ServletContextEvent event) { + + log.info("Initializing memory database plug in from '" + + pathname + "'"); + + // Remember our associated ServletContext + this.context = event.getServletContext(); + + // Construct a new database and make it available + database = new MemoryUserDatabase(); + try { + String path = calculatePath(); + if (log.isDebugEnabled()) { + log.debug(" Loading database from '" + path + "'"); + } + database.setPathname(path); + database.open(); + } catch (Exception e) { + log.error("Opening memory database", e); + throw new IllegalStateException("Cannot load database from '" + + pathname + "': " + e); + } + context.setAttribute(DATABASE_KEY, database); + + } + + // -------------------------------------------------------- Private Methods + + + /** + * <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 + */ + private String calculatePath() throws Exception { + + // Can we access the database via file I/O? + String path = context.getRealPath(pathname); + if (path != null) { + return (path); + } + + // Does a copy of this file already exist in our temporary directory + File dir = (File) + context.getAttribute("javax.servlet.context.tempdir"); + File file = new File(dir, "struts-example-database.xml"); + if (file.exists()) { + return (file.getAbsolutePath()); + } + + // Copy the static resource to a temporary file and return its path + InputStream is = + context.getResourceAsStream(pathname); + BufferedInputStream bis = new BufferedInputStream(is, 1024); + FileOutputStream os = + new FileOutputStream(file); + BufferedOutputStream bos = new BufferedOutputStream(os, 1024); + byte buffer[] = new byte[1024]; + while (true) { + int n = bis.read(buffer); + if (n <= 0) { + break; + } + bos.write(buffer, 0, n); + } + bos.close(); + bis.close(); + return (file.getAbsolutePath()); + + } + + +} Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/java/Hello.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/java/Hello.java?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/java/Hello.java (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/java/Hello.java Sat Aug 12 17:45:14 2006 @@ -0,0 +1,16 @@ +import com.opensymphony.xwork2.ActionSupport; + +/** + * Example Action class. + */ +public class Hello extends ActionSupport { + + /** + * An example implementation that does nothing and returns "success". + * + * @return [EMAIL PROTECTED] #SUCCESS} + */ + public String execute() throws Exception { + return SUCCESS; + } +} Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/java/MailReaderSupport.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/java/MailReaderSupport.java?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/java/MailReaderSupport.java (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/java/MailReaderSupport.java Sat Aug 12 17:45:14 2006 @@ -0,0 +1,141 @@ +import com.opensymphony.util.BeanUtils; +import com.opensymphony.xwork2.ActionSupport; +import org.apache.struts2.interceptor.ApplicationAware; +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; + } + + // ---- Keys ---- + + public static final String DATABASE_KEY = "database"; + + public static final String USER_KEY = "user"; + + // ---- Messages ---- + + 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"; + + // ---- 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(); + } + +} Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/java/Register.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/java/Register.java?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/java/Register.java (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/java/Register.java Sat Aug 12 17:45:14 2006 @@ -0,0 +1,23 @@ +import org.apache.struts.apps.mailreader.dao.User; + +public class Register extends MailReaderSupport { + + public String save() + throws Exception { + + User user = findUser(getUsername(), getPassword()); + boolean haveUser = (user != null); + + if (haveUser) { + addActionError(ERROR_USERNAME_UNIQUE); + return INPUT; + } + + createUser(getUsername(), getPassword()); + + saveUser(); + + return SUCCESS; + } + +} Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/java/applicationContext.xml URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/java/applicationContext.xml?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/java/applicationContext.xml (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/java/applicationContext.xml Sat Aug 12 17:45:14 2006 @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> + +<beans default-autowire="autodetect"> + <!-- add your spring beans here --> +</beans> Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/java/database.xml URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/java/database.xml?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/java/database.xml (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/java/database.xml Sat Aug 12 17:45:14 2006 @@ -0,0 +1,13 @@ +<?xml version='1.0'?> +<database> + <user username="user" fromAddress="[EMAIL PROTECTED]" + 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 Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/java/resources.properties URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/java/resources.properties?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/java/resources.properties (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/java/resources.properties Sat Aug 12 17:45:14 2006 @@ -0,0 +1,2 @@ +hello.message = Congratulations! Struts is up and running ... +# Add your messages here ... Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/java/struts.properties URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/java/struts.properties?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/java/struts.properties (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/java/struts.properties Sat Aug 12 17:45:14 2006 @@ -0,0 +1,4 @@ +struts.objectFactory = spring +struts.devMode = true +struts.action.extension = action +struts.custom.i18n.resources = resources Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/java/struts.xml URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/java/struts.xml?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/java/struts.xml (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/java/struts.xml Sat Aug 12 17:45:14 2006 @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE struts PUBLIC + "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" + "http://struts.apache.org/dtds/struts-2.0.dtd"> + +<struts> + <include file="struts-default.xml"/> + + <package name="default" extends="struts-default"> + + <default-action-ref name="Missing"/> + + <action name="Hello" class="Hello"> + <result>/pages/Hello.jsp</result> + </action> + + <action name="Missing"> + <result>/pages/Missing.jsp</result> + </action> + + <action name="Welcome"> + <result>/pages/Welcome.jsp</result> + </action> + + <action name="Register" class="Register" method="input"> + <result name="input">/pages/Register.jsp</result> + </action> + + <action name="Register/save" class="Register" method="save"> + <result name="input">/pages/Register.jsp</result> + <result>/pages/Missing.jsp</result> + </action> + + </package> +</struts> Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/test/HelloTest.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/test/HelloTest.java?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/test/HelloTest.java (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/test/HelloTest.java Sat Aug 12 17:45:14 2006 @@ -0,0 +1,16 @@ +import junit.framework.TestCase; + +/** + * An example text class to verify the configuration. + */ +public class HelloTest extends TestCase { + + /** + * An example test that asserts true. + * + * @throws Exception On invalid assertions + */ + public void testHelloAction() throws Exception { + assertTrue(true); + } +} Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/test/RegisterTest.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/test/RegisterTest.java?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/test/RegisterTest.java (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/test/RegisterTest.java Sat Aug 12 17:45:14 2006 @@ -0,0 +1,34 @@ +import com.opensymphony.xwork2.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("[EMAIL PROTECTED]"); + + 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)); + } + +} Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/test/RetainTest.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/test/RetainTest.java?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/test/RetainTest.java (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/test/RetainTest.java Sat Aug 12 17:45:14 2006 @@ -0,0 +1,97 @@ +import junit.framework.TestCase; +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.MemoryUserDatabase; + +public class RetainTest extends TestCase { + + protected UserDatabase database; + protected String testName = "test-database.xml"; + + public void setUp() throws Exception { + super.setUp(); + MemoryUserDatabase memoryUserDatabase = new MemoryUserDatabase(); + memoryUserDatabase.setPathname(testName); + database = memoryUserDatabase; + } + + public void testDatabaseClean() throws Exception { + User user = database.findUser("user"); + assertNull("Expected user to be created", user); + } + + // Add your test methods here. + // The setUp method will run between each test. + + public void testCreateUser() throws Exception { + User user = database.createUser("user"); + assertNotNull(user); + } + + public void testFindUser() throws Exception { + User user1 = database.createUser("user"); + User user2 = database.findUser("user"); + assertSame("Expected users to match", user1, user2); + } + + public void testCreateSubscription() throws Exception { + Subscription sub = database.createUser("user").createSubscription("mail.yahoo.com"); + assertNotNull("Expected subscription to be created", sub); + } + + public void testFindSubscription() throws Exception { + Subscription sub1 = database.createUser("user").createSubscription("mail.yahoo.com"); + Subscription sub2 = database.findUser("user").findSubscription("mail.yahoo.com"); + assertSame("Expected Subscriptions to match", sub1, sub2); + } + + public void testDatabsaeSave() throws Exception { + + User user = database.createUser("user"); + user.setPassword("pass"); + user.setFullName("John Q. User"); + user.setFromAddress("[EMAIL PROTECTED]"); + + Subscription sub1 = user.createSubscription("mail.hotmail.com"); + sub1.setUsername("user1234"); + sub1.setAutoConnect(false); + sub1.setType("pop3"); + sub1.setPassword("bar"); + + Subscription sub2 = user.createSubscription("mail.yahoo.com"); + sub2.setUsername("jquser"); + sub2.setAutoConnect(false); + sub2.setType("imap"); + sub2.setPassword("foo"); + + database.save(); + + } + + // Extra credit + + public void testFinderUserBogus() throws Exception { + User user1 = database.findUser("bogus"); + assertNull("Expected bogus user to be not found", user1); + User user2 = database.createUser("user"); + assertNotNull("Expected user to be created", user2); + user1 = database.findUser("bogus"); + assertNull("Expected bogus user to be not found", user1); + user1 = database.findUser("user"); + assertNotNull("Expected user to be found", user1); + } + + public void testFindSubBogus() throws Exception { + User user = database.createUser("user"); + Subscription sub = user.findSubscription("mail.bogus.com"); + assertNull(sub); + sub = database.findUser("user").createSubscription("mail.hotmail.com"); + assertNotNull(sub); + Subscription sub2 = user.findSubscription("mail.bogus.com"); + assertNull(sub2); + Subscription sub3 = user.findSubscription("mail.hotmail.com"); + assertSame(sub, sub3); + } + +} \ No newline at end of file Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/WEB-INF/web.xml URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/WEB-INF/web.xml?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/WEB-INF/web.xml (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/WEB-INF/web.xml Sat Aug 12 17:45:14 2006 @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> +<web-app> + + <display-name>Struts 2 Mailreader</display-name> + + <context-param> + <param-name>contextConfigLocation</param-name> + <param-value>classpath*:applicationContext*.xml</param-value> + </context-param> + + <filter> + <filter-name>Struts2</filter-name> + <filter-class> + org.apache.struts2.dispatcher.FilterDispatcher + </filter-class> + </filter> + + <filter-mapping> + <filter-name>Struts2</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + + <listener> + <listener-class> + org.springframework.web.context.ContextLoaderListener + </listener-class> + </listener> + + <!-- Application Listener for Mailreader database --> + <listener> + <listener-class> + DatabaseListener + </listener-class> + </listener> + + <welcome-file-list> + <welcome-file>index.html</welcome-file> + </welcome-file-list> + +</web-app> Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/index.html URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/index.html?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/index.html (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/index.html Sat Aug 12 17:45:14 2006 @@ -0,0 +1,10 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <META HTTP-EQUIV="Refresh" CONTENT="0;URL=Welcome.action"> +</head> + +<body> +<p>Loading ...</p> +</body> +</html> Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Hello.jsp URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Hello.jsp?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Hello.jsp (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Hello.jsp Sat Aug 12 17:45:14 2006 @@ -0,0 +1,9 @@ +<%@ taglib prefix="s" uri="/tags" %> +<html> +<head> + <title>Hello</title> +</head> +<body> +<h2><ww:text name="hello.message"/></h2> +</body> +</html> Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Missing.jsp URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Missing.jsp?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Missing.jsp (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Missing.jsp Sat Aug 12 17:45:14 2006 @@ -0,0 +1,9 @@ +<html> +<head><title>Missing Feature</title></head> +<body> +<p> + This feature is under construction. + Please try again in the next interation. +</p> +</body> +</html> Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Register.jsp URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Register.jsp?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Register.jsp (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Register.jsp Sat Aug 12 17:45:14 2006 @@ -0,0 +1,28 @@ +<%@ taglib prefix="s" uri="/tags" %> +<html> +<head> + <title>MailReader - Register</title> +</head> + +<body onLoad="self.focus();document.Register/save.username.focus()"> + +<s:actionerror/> +<s:form action="Register/save"> + + <s:textfield label="Username" name="username"/> + + <s:password label="Password" name="password"/> + + <s:password label="(Repeat) Password" name="password2"/> + + <s:textfield label="Full Name" name="fullName"/> + + <s:textfield label="From Address" name="fromAddress"/> + + <s:textfield label="Reply To Address" name="replyToAddress"/> + + <s:submit value="Save" name="Save"/> + +</s:form> +</body> +</html> Added: struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Welcome.jsp URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Welcome.jsp?rev=431120&view=auto ============================================================================== --- struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Welcome.jsp (added) +++ struts/sandbox/trunk/mailreader-course/struts2/register/src/webapp/pages/Welcome.jsp Sat Aug 12 17:45:14 2006 @@ -0,0 +1,23 @@ +<%@ taglib prefix="s" uri="/tags" %> +<html> +<head> + <title>MailReader</title> +</head> + +<body> +<h3>MailReader Options</h3> + +<ul> + <li><a href="<s:url action="Register"/>">Register with the MailReader</a></li> + <li><a href="<s:url action="Missing"/>">Log on to the MailReader</a></li> +</ul> + +<h3>Language Options</h3> +<ul> + <li><a href="<s:url action="Missing"/>">English</a></li> + <li><a href="<s:url action="Missing"/>">Japanese</a></li> + <li><a href="<s:url action="Missing"/>">Russian</a></li> +</ul> + +</body> +</html>