You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by hu...@apache.org on 2006/08/13 02:45:15 UTC

svn commit: r431120 - in /struts/sandbox/trunk/mailreader-course/struts2/register: ./ META-INF/ src/ src/java/ src/test/ src/webapp/ src/webapp/WEB-INF/ src/webapp/WEB-INF/classes/ src/webapp/pages/

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 {@link 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 {@link #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="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

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("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));
+    }
+
+}

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("John.User@somewhere.com");
+
+        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>