WW-1349 MailReader: Move the current mailreader example to the sandbox, as an alternative example, 'mailreader-wildone' (one execute method per class with wildcards), and replace it with the wilcard-version of 'mailreader-bang', which uses multiple methods per Action class (per the usual practice).

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@438499 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Ted Nathan Husted
2006-08-30 14:36:31 +00:00
parent 15fd576795
commit b795568985
52 changed files with 0 additions and 4954 deletions
-60
View File
@@ -1,60 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-apps</artifactId>
<version>2.0.0-SNAPSHOT</version>
</parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-mailreader</artifactId>
<packaging>war</packaging>
<name>MailReader Example Application</name>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.4</version>
</dependency>
<dependency>
<groupId>com.ibatis</groupId>
<artifactId>ibatis2-sqlmap</artifactId>
<version>2.1.7.597</version>
</dependency>
<dependency>
<groupId>${pom.groupId}</groupId>
<artifactId>struts-mailreader-dao</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty6-plugin</artifactId>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-j2ee_1.4_spec</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
@@ -1,231 +0,0 @@
/*
* 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 $
*/
package mailreader2;
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 Support 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 ApplicationListener 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());
}
}
@@ -1,33 +0,0 @@
package mailreader2;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import org.apache.struts.apps.mailreader.dao.User;
import java.util.Map;
public class AuthenticationInterceptor implements Interceptor {
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation actionInvocation) throws Exception {
Map session = actionInvocation.getInvocationContext().getSession();
User user = (User) session.get(Constants.USER_KEY);
boolean isAuthenticated = (null != user) && (null != user.getDatabase());
if (!isAuthenticated) {
return Action.LOGIN;
} else {
return actionInvocation.invoke();
}
}
}
@@ -1,10 +0,0 @@
package mailreader2;
/**
* <p>
* When implemented, allow guest to change password,
* given correct credentials.
* </p>
*/
public class ChangePassword extends MailreaderSupport {
}
@@ -1,150 +0,0 @@
/*
* $Id: Constants.java 360442 2005-12-31 20:10:04Z husted $
*
* Copyright 1999-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.
*/
package mailreader2;
/**
* <p> Manifest constants for the MailReader application. </p>
*/
public final class Constants {
// -- Statements --
public static final Integer DB_FALSE = 0;
public static final Integer DB_TRUE = 1;
public static final String LOCALE_LIST = "LOCALE_LIST";
public static final String REGISTRATION_INSERT_ASSERT = "REGISTRATION_INSERT_ASSERT";
public static final String REGISTRATION_INSERT = "REGISTRATION_INSERT";
public static final String REGISTRATION_PASSWORD = "REGISTRATION_PASSWORD";
public static final String REGISTRATION_FULLNAME = "REGISTRATION_FULLNAME";
public static final String REGISTRATION_EDIT = "REGISTRATION_EDIT";
public static final String REGISTRATION_UPDATE = "REGISTRATION_UPDATE";
public static final String SUBSCRIPTION_INSERT_ASSERT = "SUBSCRIPTION_INSERT_ASSERT";
public static final String SUBSCRIPTION_INSERT = "SUBSCRIPTION_INSERT";
public static final String SUBSCRIPTION_LIST = "SUBSCRIPTION_LIST";
public static final String SUBSCRIPTION_EDIT = "SUBSCRIPTION_EDIT";
public static final String SUBSCRIPTION_UPDATE = "SUBSCRIPTION_UPDATE";
// -- Tokens --
/**
* <p> The token representing a "cancel" request. </p>
*/
public static final String CANCEL = "cancel";
/**
* <p> The token representing a "create" task. </p>
*/
public static final String CREATE = "Create";
/**
* <p> The application scope attribute under which our user database is
* stored. </p>
*/
public static final String DATABASE_KEY = "database";
/**
* <p> The token representing a "edit" task. </p>
*/
public static final String DELETE = "Delete";
/**
* <p> The token representing a "edit" task. </p>
*/
public static final String EDIT = "Edit";
/**
* <p> The package name for this application. </p>
*/
public static final String PACKAGE = "org.apache.struts.apps.mailreader";
/**
* <p> The session scope attribute under which the Support object
* currently selected by our logged-in User is stored. </p>
*/
public static final String SUBSCRIPTION_KEY = "subscription";
/**
* <p> The session scope attribute under which the User object for the
* currently logged in user is stored. </p>
*/
public static final String USER_KEY = "user";
/**
* <p>The token representing the "Host" property.
*/
public static final String HOST = "host";
// ---- Error Messages ----
/**
* <p/>
* A static message in case message resource is not loaded.
* </p>
*/
public static final String ERROR_MESSAGES_NOT_LOADED =
"ERROR: Message resources not loaded -- check servlet container logs for error messages.";
/**
* <p/>
* A static message in case database resource is not loaded.
* <p/>
*/
public static final String ERROR_DATABASE_NOT_LOADED =
"ERROR: User database not loaded -- check servlet container logs for error messages.";
/**
* <p/>
* A standard key from the message resources file, to test if it is available.
* <p/>
*/
public static final String ERROR_DATABASE_MISSING = "error.database.missing";
/**
* <p/>
* A "magic" username to trigger an ExpiredPasswordException for testing.
* </p>
*/
public static final String EXPIRED_PASSWORD_EXCEPTION = "ExpiredPasswordException";
/**
* <p/>
* Name of field to associate with authentification errors.
* <p/>
*/
public static final String PASSWORD_MISMATCH_FIELD = "password";
/**
* <p/>
* A static message in case message resource is not loaded.
* </p>
*/
public static final String ERROR_INVALID_WORKFLOW =
"ERROR: Action is being executed out of sequence!";
// ---- Log Messages ----
/**
* <p> Message to log if saving a user fails. </p>
*/
public static final String LOG_DATABASE_SAVE_ERROR =
" Unexpected error when saving User: ";
}
@@ -1,30 +0,0 @@
/*
* $Id: LogonAction.java 360442 2005-12-31 20:10:04Z husted $
*
* Copyright 2000-2004 Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package mailreader2;
/**
* <p> Log user out of the current session. </p>
*/
public class Logoff extends MailreaderSupport {
public String execute() {
setUser(null);
return SUCCESS;
}
}
@@ -1,558 +0,0 @@
/*
* $Id: BaseAction.java 360442 2005-12-31 20:10:04Z husted $
*
* Copyright 1999-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.
*/
package mailreader2;
import com.opensymphony.util.BeanUtils;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.apps.mailreader.dao.ExpiredPasswordException;
import org.apache.struts.apps.mailreader.dao.Subscription;
import org.apache.struts.apps.mailreader.dao.User;
import org.apache.struts.apps.mailreader.dao.UserDatabase;
import org.apache.struts.apps.mailreader.dao.impl.memory.MemorySubscription;
import org.apache.struts.apps.mailreader.dao.impl.memory.MemoryUser;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.SessionAware;
import java.util.Map;
/**
* <p> Base Action for MailreaderSupport application. </p>
* <p/>
* <p> Note that this class does NOT implement model driven because of the way
* the pre-existing model is designed. The MailReader DAO includes immutable
* fields that can only be set on construction, and some objects do not have a
* default construction. One approach would be to mirror all the DAO
* properties on the Actions. As an alternative, this implementations uses the
* DAO properties where possible, and uses local Action properties only as
* needed. To create new objects, a blank temporary object is constructed, and
* the page uses a mix of local Action properties and DAO properties. When the
* new object is to be saved, the local Action properties are used to create
* the object using the DAO factory methods, the input values are copied from
* the temporary object, and the new object is saved. It's kludge, but it
* avoids creating unnecessary local properties. Pick your poison.</p>
*/
public class MailreaderSupport extends ActionSupport
implements SessionAware, ApplicationAware {
/**
* Return CANCEL so apropriate result can be selected.
*
* @return "cancel" so apropriate result can be selected.
*/
public String cancel() {
return Constants.CANCEL;
}
// ---- ApplicationAware ----
/**
* <p>Field to store application context or its proxy.</p>
* <p/>
* <p>The application context lasts for the life of the application. A
* reference to the database is stored in the application context at
* startup.</p>
*/
private Map application;
/**
* <p>Store a new application context.</p>
*
* @param value A Map representing application state
*/
public void setApplication(Map value) {
application = value;
}
/**
* <p>Provide application context.</p>
*/
public Map getApplication() {
return application;
}
// ---- SessionAware ----
/**
* <p>Field to store session context, or its proxy.</p>
*/
private Map session;
/**
* <p>Store a new session context.</p>
*
* @param value A Map representing session state
*/
public void setSession(Map value) {
session = value;
}
/**
* <p>Provide session context.</p>
*
* @return session context
*/
public Map getSession() {
return session;
}
// ---- Task property (utilized by UI) ----
/**
* <p>Field to store workflow task.</p>
* <p/>
* <p>The Task is used to track the state of the CRUD workflows. It can be
* set to Constant.CREATE, Constant.EDIT, or Constant.DELETE as
* needed.</p>
*/
private String task = null;
/**
* <p>Provide worklow task.</p>
*
* @return Returns the task.
*/
public String getTask() {
return task;
}
/**
* <p>Store new workflow task.</p>
*
* @param value The task to set.
*/
public void setTask(String value) {
task = value;
}
// ---- Token property (utilized by UI) ----
/**
* <p>Field to store double-submit guard.</p>
*/
private String token = null;
/**
* <p>Provide Token.</p>
*
* @return Returns the token.
*/
public String getToken() {
return token;
}
/**
* <p>Store new Token.</p>
*
* @param value The token to set.
*/
public void setToken(String value) {
token = value;
}
// ---- Host property ----
/**
* <p>Field to store Support host.</p>
* <p/>
* <p> The host is an immutable property of the Subscrtion DAP object, so
* we need to store it locally until we are ready to create the
* Support. </p>
*/
private String host;
/**
* <p>Provide tSubscription host.</p>
*
* @return host property
*/
public String getHost() {
return host;
}
/**
* <p>Store new Support host.</p>
*
* @param value
*/
public void setHost(String value) {
host = value;
}
// ---- Password property ----
/**
* <p>Field to store User password property.</p>
* <p/>
* <p>The User DAO object password proerty is immutable, so we store it
* locally until we are ready to create the object.</p>
*/
private String password = null;
/**
* <p>Provide User password</p>
*
* @return Returns the password.
*/
public String getPassword() {
return password;
}
/**
* <p>Store new User Password</p>
*
* @param value The password to set.
*/
public void setPassword(String value) {
password = value;
}
// ---- Password2 property (confirmation) ----
/**
* <p>Field to store the User password confirmation.</p>
* <p/>
* <p>When a User object is created, we ask the client to enter the
* password twice, to help ensure the password is being typed
* correctly.</p>
*/
private String password2 = null;
/**
* <p>Provide the User password confirmation.</p>
*
* @return Returns the confirmationpassword.
*/
public String getPassword2() {
return password2;
}
/**
* <p>Store a new User password confirmation.</p>
*
* @param value The confirmation password to set.
*/
public void setPassword2(String value) {
password2 = value;
}
// ---- Username property ----
/**
* <p>Field to store User username.</p>
* <p/>
* <p>The User DAO object password proerty is immutable, so we store it
* locally until we are ready to create the object.</p>
*/
private String username = null;
/**
* <p>Provide User username.</p>
*
* @return Returns the User username.
*/
public String getUsername() {
return username;
}
/**
* <p>Store new User username</p>
*
* @param value The username to set.
*/
public void setUsername(String value) {
username = value;
}
// ---- Database property ----
/**
* <p>Provide reference to UserDatabase, or null if the database is not
* available. </p>
*
* @return a reference to the UserDatabase or null if the database is not
* available
*/
public UserDatabase getDatabase() {
Object db = getApplication().get(Constants.DATABASE_KEY);
if (db == null) {
this.addActionError(getText("error.database.missing"));
}
return (UserDatabase) db;
}
/**
* <p>Store a new reference to UserDatabase</p>
*
* @param database
*/
public void setDatabase(UserDatabase database) {
getApplication().put(Constants.DATABASE_KEY, database);
}
// ---- User property ----
/**
* <p>Provide reference to User object for authenticated user.</p>
*
* @return User object for authenticated user.
*/
public User getUser() {
return (User) getSession().get(Constants.USER_KEY);
}
/**
* <p>Store new reference to User Object.</p>
*
* @param user User object for authenticated user
*/
public void setUser(User user) {
getSession().put(Constants.USER_KEY, user);
}
/**
* <p>Obtain User object from database, or return null if the credentials
* are not found or invalid.</p>
*
* @param username User username
* @param password User password
* @return User object or null if not found
* @throws ExpiredPasswordException
*/
public User findUser(String username, String password)
throws ExpiredPasswordException {
// FIXME: Stupid testing hack to compensate for inadequate DAO layer
if (Constants.EXPIRED_PASSWORD_EXCEPTION.equals(username)) {
throw new ExpiredPasswordException(Constants.EXPIRED_PASSWORD_EXCEPTION);
}
User user = getDatabase().findUser(username);
if ((user != null) && !user.getPassword().equals(password)) {
user = null;
}
if (user == null) {
this.addFieldError(Constants.PASSWORD_MISMATCH_FIELD,
getText("error.password.mismatch"));
}
return user;
}
/**
* <p><code>Log</code> instance for this application. </p>
*/
protected Log log = LogFactory.getLog(Constants.PACKAGE);
/**
* <p> Persist the User object, including subscriptions, to the database.
* </p>
*
* @throws java.lang.Exception on database error
*/
public void saveUser() throws Exception {
try {
getDatabase().save();
} catch (Exception e) {
String message = Constants.LOG_DATABASE_SAVE_ERROR + getUser()
.getUsername();
log.error(message, e);
throw new Exception(message, e);
}
}
public void createInputUser() {
User user = new MemoryUser(null, null);
setUser(user);
}
/**
* <p> Verify input for creating a new user, create the user, and process
* the login. </p>
*
* @return A new User and empty Errors if create succeeds, or null and
* Errors if create fails
*/
public User createUser(String username, String password) {
UserDatabase database = getDatabase();
User user;
try {
user = database.findUser(username);
}
catch (ExpiredPasswordException e) {
user = getUser(); // Just so that it is not null
}
if (user != null) {
this.addFieldError("username", "error.username.unique");
return null;
}
return database.createUser(username);
}
// Since user.username is immutable, we have to use some local properties
/**
* <p>Use the current User object to create a new User object, and make
* the new User object the authenticated user.</p>
* <p/>
* <p>The "current" User object is usually a temporary object being used
* to capture input.</p>
*
* @param _username User username
* @param _password User password
*/
public void copyUser(String _username, String _password) {
User input = getUser();
input.setPassword(_password);
User user = createUser(_username, _password);
if (null != user) {
BeanUtils.setValues(user, input, null);
setUser(user);
}
}
// ---- Support property ----
/**
* <p>Obtain the cached Support object, if any. </p>
*
* @return Cached Support object or null
*/
public Subscription getSubscription() {
return (Subscription) getSession().get(Constants.SUBSCRIPTION_KEY);
}
/**
* <p>Store new User Support.</p>
*
* @param subscription
*/
public void setSubscription(Subscription subscription) {
getSession().put(Constants.SUBSCRIPTION_KEY, subscription);
}
/**
* <p> Obtain User Support object for the given host, or return null
* if not found. </p>
* <p/>
* <p>It would be possible for this code to throw a NullPointerException,
* but the ExceptionHandler in the xwork.xml will catch that for us.</p>
*
* @return The matching Support or null
*/
public Subscription findSubscription(String host) {
Subscription subscription;
subscription = getUser().findSubscription(host);
return subscription;
}
/**
* <p>Obtain uSER Support for the local Host property.</p>
* <p/>
* <p>Usually, the host property will be set from the client request,
* because it was embedded in a link to the Subcription action.
*
* @return Support or null if not found
*/
public Subscription findSubscription() {
return findSubscription(getHost());
}
/**
* <p>Provide a "temporary" User Support object that can be used to
* capture input values.</p>
*/
public void createInputSubscription() {
Subscription sub = new MemorySubscription(getUser(), null);
setSubscription(sub);
setHost(sub.getHost());
}
/**
* <p>Provide new User Support object for the given host, or null if
* the host is not unique.</p>
*
* @param host
* @return New User Support object or null
*/
public Subscription createSubscription(String host) {
Subscription sub;
sub = findSubscription(host);
if (null != sub) {
// FIXME - localization - "error.host.unique")
addFieldError(Constants.HOST, "That hostname is already defined");
return null;
}
return getUser().createSubscription(host);
}
/**
* <p>Create a new Support from the current Support object,
* making the new Support the current Support. </p>
* <p/>
* <p>Usually, the "current" Support is a temporary object being used
* to capture input values.</p>
*
* @param host
*/
public void copySubscription(String host) {
Subscription input = getSubscription();
Subscription sub = createSubscription(host);
if (null != sub) {
BeanUtils.setValues(sub, input, null);
setSubscription(sub);
setHost(sub.getHost());
}
}
/**
* <p>Delete the current Support object from the database.</p>
*/
public void removeSubscription() {
getUser().removeSubscription(getSubscription());
getSession().remove(Constants.SUBSCRIPTION_KEY);
}
/**
* <p>Provide MailServer Host for current User Support.</p>
*
* @return MailServer Host for current User Support
*/
public String getSubscriptionHost() {
Subscription sub = getSubscription();
if (null == sub) {
return null;
}
return sub.getHost();
}
}
@@ -1,93 +0,0 @@
button.cancel=Cancel
button.confirm=Confirm
button.doSubmit=DO_SUBMIT
button.doReset=DO_RESULT
button.doCancel=org.apache.struts.taglib.html.CANCEL
button.reset=Reset
button.save=Save
change.message=Your password has expired. Please ask the system administrator to change it.
change.try=Try Again
change.title=Password Has Expired
database.load=Cannot load database from {0}
error.database.missing=User database is missing, cannot validate logon credentials
error.fromAddress.format=Invalid format for From Address
error.fromAddress.required=From Address is required
error.fullName.required=Full Name is required
error.host.required=Mail Server is required
error.noSubscription=No Subscription bean in user session
error.password.expired=Your password has expired for username {0}
error.password.required=Password is required
error.password2.required=Confirmation password is required
error.password.match=Password and confirmation password must match
error.password.mismatch=Invalid username and/or password, please try again
error.replyToAddress.format=Invalid format for Reply To Address
struts.messages.invalid.token=Cannot submit this form out of order
error.type.invalid=Server Type must be 'imap' or 'pop3'
error.type.required=Server Type is required
error.username.required=Username is required
error.username.unique=That username is already in use - please select another
errors.footer=</ul><hr>
errors.header=<h3><font color="red">Validation Error</font></h3><p>You must correct the following error(s) before proceeding:</p><ul>
errors.prefix=<li>
errors.suffix=</li>
errors.ioException=I/O exception rendering error messages: {0}
expired.password=User Password has expired for {0}
heading.autoConnect=Auto
heading.subscriptions=Current Subscriptions
heading.host=Host Name
heading.user=User Name
heading.type=Server Type
heading.action=Action
index.heading=MailReader Demonstration Application Options
index.logon=Log on to the MailReader Demonstration Application
index.registration=Register with the MailReader Demonstration Application
index.title=MailReader Demonstration Application
index.tour=A Walking Tour of the MailReader Demonstration Application
linkSubscription.io=I/O Error: {0}
linkSubscription.noSubscription=No subscription under attribute {0}
linkUser.io=I/O Error: {0}
linkUser.noUser=No user under attribute {0}
logon.title=MailReader Demonstration Application - Logon
mainMenu.heading=Main Menu Options for
mainMenu.logoff=Log off MailReader Demonstration Application
mainMenu.registration=Edit your user registration profile
mainMenu.title=MailReader Demonstration Application - Main Menu
option.imap=IMAP Protocol
option.pop3=POP3 Protocol
# prompt.
autoConnect=Auto Connect
fromAddress=From Address
fullName=Full Name
mailHostname=Mail Server
mailPassword=Mail Password
mailServerType=Server Type
mailUsername=Mail Username
password=Password
password2=(Repeat) Password
replyToAddress=Reply To Address
username=Username
registration.addSubscription=Add
registration.deleteSubscription=Delete
registration.editSubscription=Edit
registration.title.create=Register for the MailReader Demonstration Application
registration.title.edit=Edit Registration for the MailReader Demonstration Application
subscription.title.create=Create New Mail Subscription
subscription.title.delete=Delete Existing Mail Subscription
subscription.title.edit=Edit Existing Mail Subscription
# Standard error messages for validator framework checks
errors.required=${getText(fieldName)} is required.
errors.minlength=${getText(fieldName)} cannot be less than {1} characters.
errors.maxlength=${getText(fieldName)} cannot be greater than {1} characters.
errors.invalid=${getText(fieldName)} is invalid.
errors.byte=${getText(fieldName)} must be an byte.
errors.short=${getText(fieldName)} must be an short.
errors.integer=${getText(fieldName)} must be an integer.
errors.long=${getText(fieldName)} must be an long.
errors.float=${getText(fieldName)} must be an float.
errors.double=${getText(fieldName)} must be an double.
errors.date=${getText(fieldName)} is not a date.
errors.range=${getText(fieldName)} is not in the range ${minLength} through ${maxLength}.
errors.creditcard=${getText(fieldName)} is not a valid credit card number.
errors.email=${getText(fieldName)} is an invalid e-mail address.
errors.literal=${getText(fieldName)}
@@ -1,89 +0,0 @@
button.cancel=\u30ad\u30e3\u30f3\u30bb\u30eb
button.confirm=\u78ba\u8a8d
button.reset=\u30ea\u30bb\u30c3\u30c8
button.save=\u4fdd\u5b58
change.message=\u30D1\u30B9\u30EF\u30FC\u30C9\u306E\u6709\u52B9\u671F\u9650\u304C\u904E\u304E\u307E\u3057\u305F\u3002\u30B7\u30B9\u30C6\u30E0\u7BA1\u7406\u8005\u306B\u304A\u554F\u3044\u5408\u308F\u305B\u4E0B\u3055\u3044
change.try=\u518D\u8A66\u884C
change.title=\u30d1\u30b9\u30ef\u30fc\u30c9\u671f\u9650\u5207\u308c
database.load= {0} \u304B\u3089\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u30ED\u30FC\u30C9\u3067\u304D\u307E\u305B\u3093
error.database.missing=\u30E6\u30FC\u30B6\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u30ED\u30B0\u30AA\u30F3\u306E\u8A8D\u8A3C\u304C\u51FA\u6765\u307E\u305B\u3093
error.fromAddress.format=From\u30A2\u30C9\u30EC\u30B9\u306E\u66F8\u5F0F\u304C\u6B63\u3057\u304F\u3042\u308A\u307E\u305B\u3093
error.fromAddress.required=From\u30A2\u30C9\u30EC\u30B9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044
error.fullName.required=\u30D5\u30EB\u30CD\u30FC\u30E0\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044
error.host.required=\u30E1\u30FC\u30EB\u30B5\u30FC\u30D0\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044
error.noSubscription=Subscription bean \u304c\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4e2d\u306b\u3042\u308a\u307e\u305b\u3093
error.password.expired=\u30E6\u30FC\u30B6 {0} \u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u306E\u6709\u52B9\u671F\u9650\u304C\u904E\u304E\u307E\u3057\u305F
error.password.required=\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u5FC5\u8981\u3067\u3059
error.password2.required=\u30D1\u30B9\u30EF\u30FC\u30C9(\u78BA\u8A8D\u7528)\u304C\u5FC5\u8981\u3067\u3059
error.password.match=\u30D1\u30B9\u30EF\u30FC\u30C9\u3068\u78BA\u8A8D\u7528\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u4E00\u81F4\u3057\u3066\u3044\u307E\u305B\u3093
error.password.mismatch=\u30E6\u30FC\u30B6\u540D\u307E\u305F\u306F\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u4E0D\u6B63\u3067\u3059\u3002\u518D\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044
error.replyToAddress.format=\u8FD4\u4FE1\u30A2\u30C9\u30EC\u30B9\u306E\u66F8\u5F0F\u304C\u6B63\u3057\u304F\u3042\u308A\u307E\u305B\u3093
struts.messages.invalid.token=\u3053\u306E\u30D5\u30A9\u30FC\u30E0\u306E\u5185\u5BB9\u304C\u6B63\u3057\u304F\u306A\u3044\u305F\u3081\u9001\u4FE1\u3059\u308B\u3053\u3068\u304C\u51FA\u6765\u307E\u305B\u3093
error.type.invalid=\u30B5\u30FC\u30D0\u30BF\u30A4\u30D7\u306F 'imap' \u304B 'pop3'\u306E\u3069\u3061\u3089\u304B\u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093
error.type.required=\u30B5\u30FC\u30D0\u30BF\u30A4\u30D7\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044
error.username.required=\u30E6\u30FC\u30B6\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044
error.username.unique=\u305D\u306E\u30E6\u30FC\u30B6\u540D\u306F\u65E2\u306B\u4F7F\u7528\u3055\u308C\u3066\u3044\u307E\u3059\u3002 \u5225\u306E\u30E6\u30FC\u30B6\u540D\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044
errors.footer=</ul><hr>
errors.header=<h3><font color="red">\u5165\u529b\u30c1\u30a7\u30c3\u30af\u30a8\u30e9\u30fc</font></h3><p>\u4ee5\u4e0b\u306e\u30a8\u30e9\u30fc\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044:</p><ul>
errors.prefix=<li>
errors.suffix=</li>
errors.ioException=I/O\u4f8b\u5916\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {0}
expired.password=\u30E6\u30FC\u30B6 {0} \u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u306E\u6709\u52B9\u671F\u9650\u304C\u904E\u304E\u307E\u3057\u305F
heading.autoConnect=\u81ea\u52d5\u63a5\u7d9a
heading.subscriptions=\u73fe\u5728\u306e\u8cfc\u8aad\u60c5\u5831
heading.host=\u30db\u30b9\u30c8\u540d
heading.user=\u30e6\u30fc\u30b6\u540d
heading.type=\u30b5\u30fc\u30d0\u30bf\u30a4\u30d7
heading.action=\u64cd\u4f5c
index.heading=MailReader\u30c7\u30e2\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30aa\u30d7\u30b7\u30e7\u30f3
index.logon=MailReader\u30c7\u30e2\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 - \u30ed\u30b0\u30aa\u30f3
index.registration=MailReader\u30c7\u30e2\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 - \u30e6\u30fc\u30b6\u767b\u9332
index.title=MailReader\u30c7\u30e2\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3(Struts 1.1-dev)
index.tour=\u30b5\u30f3\u30d7\u30eb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u6563\u7b56\u3059\u308b
linkSubscription.io=I/O\u30a8\u30e9\u30fc: {0}
linkSubscription.noSubscription=\u5c5e\u6027 {0} \u306b\u8cfc\u8aad\u60c5\u5831\u304c\u5b58\u5728\u3057\u307e\u305b\u3093
linkUser.io=I/O\u30a8\u30e9\u30fc: {0}
linkUser.noUser=\u5c5e\u6027 {0} \u306b\u30e6\u30fc\u30b6\u60c5\u5831\u304c\u5b58\u5728\u3057\u307e\u305b\u3093
logon.title=MailReader\u30c7\u30e2\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 - \u30ed\u30b0\u30aa\u30f3
mainMenu.heading=\u30e1\u30a4\u30f3\u30e1\u30cb\u30e5\u30fc
mainMenu.logoff=MailReader \u30c7\u30e2\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30ed\u30b0\u30aa\u30d5
mainMenu.registration=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u306e\u7de8\u96c6
mainMenu.title=MailReader\u30c7\u30e2\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 - \u30e1\u30a4\u30f3\u30e1\u30cb\u30e5\u30fc
option.imap=IMAP \u30d7\u30ed\u30c8\u30b3\u30eb
option.pop3=POP3 \u30d7\u30ed\u30c8\u30b3\u30eb
# prompt.
autoConnect=\u81ea\u52d5\u63a5\u7d9a
fromAddress=From\u30a2\u30c9\u30ec\u30b9
fullName=\u30d5\u30eb\u30cd\u30fc\u30e0
mailHostname=\u30e1\u30fc\u30eb\u30b5\u30fc\u30d0
mailPassword=\u30e1\u30fc\u30eb\u30d1\u30b9\u30ef\u30fc\u30c9
mailServerType=\u30b5\u30fc\u30d0\u30bf\u30a4\u30d7
mailUsername=\u30e1\u30fc\u30eb\u30e6\u30fc\u30b6\u540d
.password=\u30d1\u30b9\u30ef\u30fc\u30c9
password2=\u30d1\u30b9\u30ef\u30fc\u30c9(\u78ba\u8a8d\u7528)
replyToAddress=\u8fd4\u4fe1\u30a2\u30c9\u30ec\u30b9
username=\u30e6\u30fc\u30b6\u540d
registration.addSubscription=\u65b0\u898f\u4f5c\u6210
registration.deleteSubscription=\u524a\u9664
registration.editSubscription=\u7de8\u96c6
registration.title.create=MailReader\u30c7\u30e2\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 - \u30e6\u30fc\u30b6\u767b\u9332
registration.title.edit=MailReader\u30c7\u30e2\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 - \u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u7de8\u96c6
subscription.title.create=\u30e1\u30fc\u30eb\u8cfc\u8aad\u60c5\u5831\u306e\u65b0\u898f\u4f5c\u6210
subscription.title.delete=\u30e1\u30fc\u30eb\u8cfc\u8aad\u60c5\u5831\u306e\u524a\u9664
subscription.title.edit=\u30e1\u30fc\u30eb\u8cfc\u8aad\u60c5\u5831\u306e\u7de8\u96c6
# Standard error messages for validator framework checks
errors.required=${getText(fieldName)} \u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
errors.minlength=${getText(fieldName)} \u306f {1} \u6587\u5b57\u4ee5\u4e0a\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
errors.maxlength=${getText(fieldName)} \u306f {2} \u6587\u5b57\u4ee5\u4e0b\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
errors.invalid=${getText(fieldName)} \u306f\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002
errors.byte=${getText(fieldName)} \u306fbyte\u578b\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
errors.short=${getText(fieldName)} \u306fshort\u578b\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
errors.integer=${getText(fieldName)} \u306finteger\u578b\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
errors.long=${getText(fieldName)} \u306flong\u578b\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
errors.float=${getText(fieldName)} \u306ffloat\u578b\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
errors.double=${getText(fieldName)} \u306fdouble\u578b\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
errors.date=${getText(fieldName)} \u306f\u65e5\u4ed8\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002
errors.range=${getText(fieldName)} \u306f {1} \u304b\u3089 {2} \u306e\u9593\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
errors.creditcard=${getText(fieldName)} \u306f\u6b63\u3057\u3044\u30af\u30ec\u30b8\u30c3\u30c8\u30ab\u30fc\u30c9\u756a\u53f7\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002
errors.email=${getText(fieldName)} \u306f\u6b63\u3057\u3044\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002
@@ -1,89 +0,0 @@
button.cancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
button.confirm=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c
button.reset=\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c
button.save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c
change.message=Your password has expired. Please ask the system administrator to change it.
change.try=Try Again
change.title=Password Has Expired
database.load=\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u0438\u0437 {0}
error.database.missing=\u041d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f - \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e.
error.fromAddress.format=\u0412 \u043f\u043e\u043b\u0435 '\u0410\u0434\u0440\u0435\u0441 \u041e\u0442:' \u0443\u043a\u0430\u0437\u0430\u043d \u0430\u0434\u0440\u0435\u0441 \u0432 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435.
error.fromAddress.required=\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u0432 \u043f\u043e\u043b\u0435 '\u0410\u0434\u0440\u0435\u0441 \u041e\u0442:'.
error.fullName.required=\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0435 \u0438\u043c\u044f.
error.host.required=\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440.
error.noSubscription=\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
error.password.expired=Your password has expired for username {0}
error.password.required=\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c.
error.password2.required=\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f.
error.password.match=\u041f\u0430\u0440\u043e\u043b\u044c \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442.
error.password.mismatch=\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0438\u043c\u044f \u0438/\u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c - \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043d\u043e\u0432\u0430.
error.replyToAddress.format=\u0412 \u043f\u043e\u043b\u0435 '\u0410\u0434\u0440\u0435\u0441 \u041e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430:' \u0443\u043a\u0430\u0437\u0430\u043d \u0430\u0434\u0440\u0435\u0441 \u0432 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435.
struts.messages.invalid.token=\u042d\u0442\u0430 \u0444\u043e\u0440\u043c\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 - \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0437\u0430\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445.
error.type.invalid=\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0438\u043f\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043b\u0438\u0448\u044c 'imap' \u0438\u043b\u0438 'pop3'
error.type.required=\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0438\u043f \u0441\u0435\u0440\u0432\u0435\u0440\u0430
error.username.required=\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
error.username.unique=\u0423\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f - \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f.
errors.footer=</ul><hr>
errors.header=<h3><font color="red">\u041e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u0437\u0430\u043d\u0435\u0441\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445</font></h3><p>\u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435 \u043e\u0448\u0438\u0431\u043a\u0438:</p><ul>
errors.prefix=<li>
errors.suffix=</li>
errors.ioException=\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0432\u043e\u0434\u0430/\u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445: {0}
expired.password=User Password has expired for {0}
heading.autoConnect=\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438
heading.subscriptions=\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438
heading.host=\u0421\u0435\u0440\u0432\u0435\u0440
heading.user=\u0418\u043c\u044f
heading.type=\u0422\u0438\u043f \u0441\u0435\u0440\u0432\u0435\u0440\u0430
heading.action=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435
index.heading=\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 '\u0427\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u044b'
index.logon=\u0412\u043e\u0439\u0442\u0438 \u043a\u0430\u043a \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c
index.registration=\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f
index.title=\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 '\u0427\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u044b' (Struts 1.1-dev)
index.tour=\u041e\u0431\u0437\u043e\u0440 \u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f '\u0427\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u044b'
linkSubscription.io=\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0432\u043e\u0434\u0430/\u0432\u044b\u0432\u043e\u0434\u0430 (\u0434\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438): {0}
linkSubscription.noSubscription=\u0410\u0442\u0440\u0438\u0431\u0443\u0442 {0} \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.
linkUser.io=\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0432\u043e\u0434\u0430/\u0432\u044b\u0432\u043e\u0434\u0430 (\u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f): {0}
linkUser.noUser=\u0410\u0442\u0440\u0438\u0431\u0443\u0442 {0} \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 \u0438\u043b\u0438 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.
logon.title=\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0427\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u044b - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u043c\u0435\u043d\u0438 \u0438 \u043f\u0430\u0440\u043e\u043b\u044f.
mainMenu.heading=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u0434\u043b\u044f
mainMenu.logoff=\u0412\u044b\u0439\u0442\u0438
mainMenu.registration=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438
mainMenu.title=\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 '\u0427\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u044b' - \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e
option.imap=\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b IMAP
option.pop3=\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b POP3
# prompt.
autoConnect=\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435:
fromAddress=\u0410\u0434\u0440\u0435\u0441 \u041e\u0442:
fullName=\u041f\u043e\u043b\u043d\u043e\u0435 \u0438\u043c\u044f:
mailHostname=\u041f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440:
mailPassword=\u041f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430:
mailServerType=\u0422\u0438\u043f \u0441\u0435\u0440\u0432\u0435\u0440\u0430:
mailUsername=\u0418\u043c\u044f \u0434\u043b\u044f \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430:
password=\u041f\u0430\u0440\u043e\u043b\u044c:
password2=(\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435) \u041f\u0430\u0440\u043e\u043b\u044c:
replyToAddress=\u0410\u0434\u0440\u0435\u0441 \u041e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430:
username=\u0418\u043c\u044f:
registration.addSubscription=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c
registration.deleteSubscription=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
registration.editSubscription=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
registration.title.create=\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f
registration.title.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0441\u0432\u043e\u0435\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438
subscription.title.create=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443
subscription.title.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443
subscription.title.edit=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443
# Standard error messages for validator framework checks
errors.required=${getText(fieldName)} is required.
errors.minlength=${getText(fieldName)} cannot be less than {1} characters.
errors.maxlength=${getText(fieldName)} cannot be greater than {2} characters.
errors.invalid=${getText(fieldName)} is invalid.
errors.byte=${getText(fieldName)} must be an byte.
errors.short=${getText(fieldName)} must be an short.
errors.integer=${getText(fieldName)} must be an integer.
errors.long=${getText(fieldName)} must be an long.
errors.float=${getText(fieldName)} must be an float.
errors.double=${getText(fieldName)} must be an double.
errors.date=${getText(fieldName)} is not a date.
errors.range=${getText(fieldName)} is not in the range {1} through {2}.
errors.creditcard=${getText(fieldName)} is not a valid credit card number.
errors.email=${getText(fieldName)} is an invalid e-mail address.
@@ -1,9 +0,0 @@
package mailreader2;
/**
* <p>
* Provide access to MailreaderSupport properties.
* </p>
*/
public class MainMenu extends MailreaderSupport {
}
@@ -1,15 +0,0 @@
<?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>
<package name="Welcome" namespace="/" extends="MailreaderSupport">
<action name="Welcome" class="mailreader2.Welcome">
<result>/pages/Welcome.jsp</result>
<interceptor-ref name="guest"/>
</action>
</package>
</struts>
@@ -1,31 +0,0 @@
package mailreader2;
import com.opensymphony.xwork2.Preparable;
import com.opensymphony.xwork2.ModelDriven;
import java.util.List;
/**
* Verify that essential resources are available.
*/
public class Welcome extends MailreaderSupport {
public String execute() {
// Confirm message resources loaded
String message = getText(Constants.ERROR_DATABASE_MISSING);
if (Constants.ERROR_DATABASE_MISSING.equals(message)) {
addActionError(Constants.ERROR_MESSAGES_NOT_LOADED);
}
// Confirm database loaded
if (null == getDatabase()) {
addActionError(Constants.ERROR_DATABASE_NOT_LOADED);
}
if (hasErrors()) {
return ERROR;
} else {
return SUCCESS;
}
}
}
@@ -1,9 +0,0 @@
package mailreader2.logon;
import mailreader2.MailreaderSupport;
/**
* <p>Stub class for login/Input.</p>
*/
public class Input extends MailreaderSupport {
}
@@ -1,14 +0,0 @@
<!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 key="error.username.required"/>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message key="error.password.required"/>
</field-validator>
</field>
</validators>
@@ -1,46 +0,0 @@
/*
* $Id: LogonAction.java 360442 2005-12-31 20:10:04Z husted $
*
* Copyright 2000-2004 Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package mailreader2.logon;
import mailreader2.MailreaderSupport;
import org.apache.struts.apps.mailreader.dao.ExpiredPasswordException;
import org.apache.struts.apps.mailreader.dao.User;
/**
* <p> Validate a user logon. </p>
*/
public final class Retrieve extends MailreaderSupport {
public String execute() throws ExpiredPasswordException {
User user = findUser(getUsername(), getPassword());
if (user != null) {
setUser(user);
}
if (hasErrors()) {
return INPUT;
}
return SUCCESS;
}
}
@@ -1,28 +0,0 @@
<!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="password">
<field-validator type="requiredstring">
<message key="error.password.required"/>
</field-validator>
<field-validator type="stringlength">
<param name="trim">true</param>
<param name="minLength">4</param>
<param name="maxLength">10</param>
<message key="errors.range"/>
</field-validator>
</field>
<field name="password2">
<field-validator type="requiredstring">
<message key="error.password2.required"/>
</field-validator>
</field>
<validator type="expression">
<param name="expression">password eq password2</param>
<message key="error.password.match"/>
</validator>
</validators>
@@ -1,37 +0,0 @@
package mailreader2.registration;
import mailreader2.Constants;
import org.apache.struts.apps.mailreader.dao.User;
/**
* <p>Insert new user, providing extra validation.</p>
* <p/>
* <p>(On an update, the password change is optional.)</p>
*/
public final class Create extends Update {
public String execute()
throws Exception {
// trust but verify
boolean creating = Constants.CREATE.equals(getTask());
creating = creating && isCreating();
if (!creating) {
addActionError("registration/Create: ");
addActionError(Constants.ERROR_INVALID_WORKFLOW);
return ERROR;
}
User user = findUser(getUsername(), getPassword());
boolean haveUser = (user != null);
if (haveUser) {
addActionError(getText("error.username.unique"));
return INPUT;
}
copyUser(getUsername(), getPassword());
return SUCCESS;
}
}
@@ -1,31 +0,0 @@
package mailreader2.registration;
import mailreader2.Constants;
/**
* <p> Retrieve User object to edit or null if User does not exist. </p>
*/
public class Input extends Support {
/**
* <p> Retrieve User object to edit or null if User does not exist. </p>
*
* @return The "Success" result for this mapping
* @throws Exception on any error
*/
public String execute() throws Exception {
if (isCreating()) {
createInputUser();
setTask(Constants.CREATE);
} else {
setTask(Constants.EDIT);
setUsername(getUser().getUsername());
setPassword(getUser().getPassword());
setPassword2(getUser().getPassword());
}
return SUCCESS;
}
}
@@ -1,20 +0,0 @@
package mailreader2.registration;
import mailreader2.MailreaderSupport;
import org.apache.struts.apps.mailreader.dao.User;
/**
* <p>Base class to store shared methods.</p>
*/
public class Support extends MailreaderSupport {
/**
* <p>Double check that there is not a valid User logon. </p>
*
* @return True if there is not a valid User logon
*/
protected boolean isCreating() {
User user = getUser();
return (null == user) || (null == user.getDatabase());
}
}
@@ -1,32 +0,0 @@
<!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 key="error.username.required"/>
</field-validator>
</field>
<field name="user.fullName">
<field-validator type="requiredstring">
<message key="error.fullName.required"/>
</field-validator>
</field>
<field name="user.fromAddress">
<field-validator type="requiredstring">
<message key="error.fromAddress.required"/>
</field-validator>
<field-validator type="email">
<message key="errors.email"/>
</field-validator>
</field>
<field name="user.replyToAddress">
<field-validator type="email">
<message key="errors.email"/>
</field-validator>
</field>
</validators>
@@ -1,45 +0,0 @@
package mailreader2.registration;
import mailreader2.Constants;
/**
* <p> Update Registration object to the persistent store. </p>
*/
public class Update extends Support {
private String fixNull(String value) {
if (value == null) return null;
String buffer = value.trim();
if (buffer.length() == 0) return null;
return buffer;
}
public String execute()
throws Exception {
boolean creating = Constants.CREATE.equals(getTask());
creating = creating && isCreating(); // trust but verify
if (creating) {
addActionError("registration/Update: ");
addActionError(Constants.ERROR_INVALID_WORKFLOW);
return ERROR;
}
// FIXME: Any way to call the Update validators from here?
String newPassword = fixNull(getPassword());
String confirmPassword = fixNull(getPassword2());
if (newPassword != null) {
boolean matches = ((confirmPassword != null)
&& (confirmPassword.equals(newPassword)));
if (matches) {
getUser().setPassword(newPassword);
} else {
addActionError(getText("error.password.match"));
return INPUT;
}
}
saveUser();
return SUCCESS;
}
}
@@ -1,15 +0,0 @@
package mailreader2.subscription;
import mailreader2.Constants;
/**
* <p>Prepare to present a confirmation page before removing
* subscription.</p>
*/
public class Delete extends Edit {
public String execute() throws Exception {
setTask(Constants.DELETE);
return find();
}
}
@@ -1,11 +0,0 @@
<!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="host">
<field-validator type="requiredstring">
<message key="error.host.required"/>
</field-validator>
</field>
</validators>
@@ -1,16 +0,0 @@
package mailreader2.subscription;
import mailreader2.Constants;
/**
* <p>Prepare to edit User Support.</p>
*/
public class Edit extends Support {
public String execute() throws Exception {
setTask(Constants.EDIT);
return find();
}
}
@@ -1,17 +0,0 @@
package mailreader2.subscription;
import mailreader2.Constants;
/**
* <p>Setup a temporary User Support object to capture input
* values.</p>
*/
public class Input extends Support {
public String execute() {
createInputSubscription();
setTask(Constants.CREATE);
return SUCCESS;
}
}
@@ -1,69 +0,0 @@
package mailreader2.subscription;
import com.opensymphony.xwork2.Preparable;
import mailreader2.MailreaderSupport;
import mailreader2.Constants;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* <p> Provide an Edit method for retrieving an existing subscription, and a
* Update method for updating or inserting a subscription. </p>
*/
public class Support extends MailreaderSupport
implements Preparable {
/**
* <p>Field to store list of MailServer types</p>
*/
private Map types = null;
/**
* <p>Provide the list of MailServer types.</p>
*
* @return List of MailServer types
*/
public Map getTypes() {
return types;
}
/**
* <p>Setup the MailerServer types and set the local Host property from
* the User Support (if any). </p>
*/
public void prepare() {
Map m = new LinkedHashMap();
m.put("imap", "IMAP Protocol");
m.put("pop3", "POP3 Protocol");
types = m;
setHost(getSubscriptionHost());
}
/**
* <p>Load User Support for the local Host property.</p>
* <p/>
* <p>Usually, the Host is being set from the request by a link to an Edit
* or Delete task.</p>
*
* @return INPUT or Error, if Support is not found
*/
public String find() {
org.apache.struts.apps.mailreader.dao.Subscription
sub = findSubscription();
if (sub == null) {
addActionError("find (Subscription): ");
addActionError(Constants.ERROR_INVALID_WORKFLOW);
return ERROR;
}
setSubscription(sub);
return SUCCESS;
}
}
@@ -1,23 +0,0 @@
<!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="subscription.username">
<field-validator type="requiredstring">
<message key="error.username.required"/>
</field-validator>
</field>
<field name="subscription.password">
<field-validator type="requiredstring">
<message key="error.password.required"/>
</field-validator>
</field>
<field name="subscription.type">
<field-validator type="requiredstring">
<message key="error.type.invalid"/>
</field-validator>
</field>
</validators>
@@ -1,38 +0,0 @@
package mailreader2.subscription;
import mailreader2.Constants;
/**
* <p> Workaround class. Submitting to an alias doesn't seem to work. </p>
*/
public final class Update extends Edit {
public void prepare() {
super.prepare();
// checkbox workaround
getSubscription().setAutoConnect(false);
}
/**
* <p> Examine the Task property and DELETE, CREATE, or save the User
* Support, as appropriate. </p>
*
* @return SUCCESS
* @throws Exception on a database error
*/
public String execute() throws Exception {
if (Constants.DELETE.equals(getTask())) {
removeSubscription();
}
if (Constants.CREATE.equals(getTask())) {
copySubscription(getHost());
}
if (hasErrors()) return INPUT;
saveUser();
return SUCCESS;
}
}
@@ -1,3 +0,0 @@
struts.objectFactory = spring
struts.devMode = true
struts.enable.DynamicMethodInvocation = false
-54
View File
@@ -1,54 +0,0 @@
<?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" namespace="" extends="struts-default">
<global-results>
<result name="error">/pages/Error.jsp</result>
<result name="invalid.token">/pages/Error.jsp</result>
<result name="success" type="redirect-action">MainMenu</result>
<result name="expired" type="chain">ChangePassword</result>
</global-results>
<global-exception-mappings>
<exception-mapping
result="error"
exception="java.lang.Throwable"/>
<exception-mapping
exception="org.apache.struts.apps.mailreader.dao.ExpiredPasswordException"
result="expired"/>
</global-exception-mappings>
<!-- goto actions: Exit to another workflow -->
<action name="subscription/Save" class="mailreader2.subscription.Update">
<result name="input">/pages/subscription.jsp</result>
<result type="redirect-action">registration/+Input</result>
</action>
<!-- display actions: Welcome, Logoff, MainMenu -->
<action name="*" class="mailreader2.{1}">
<result>/pages/{1}.jsp</result>
</action>
<!-- prepare actions: Confirm/Delete, Edit, Input -->
<action name="*/+*" class="mailreader2.{1}.{2}">
<result>/pages/{1}.jsp</result>
</action>
<!-- execute actions: Create, Retrieve, Update, Update -->
<action name="*/*" class="mailreader2.{1}.{2}">
<result name="input">/pages/{1}.jsp</result>
</action>
</package>
</struts>
@@ -1,3 +0,0 @@
password=Enter your Password here ==>
struts.logo.path=/struts-power.gif
struts.logo.alt=Powered by Struts
@@ -1 +0,0 @@
.password=\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b==>
@@ -1,6 +0,0 @@
<?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>
@@ -1,13 +0,0 @@
<?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>
@@ -1,3 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/">
</Context>
@@ -1,41 +0,0 @@
<?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>
mailreader2.ApplicationListener
</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
@@ -1,46 +0,0 @@
/**
* Mailreader stylesheet
*/
body {
background-color: #FFFFFF;
color: #000000;
link: 000066;
visited: #660066;
active: #33CCCC;
}
A:hover {
color: #FF0000;
}
h1 {
font-family: Arial, Helvetica, sans-serif;
}
h2 {
font-family: Arial, Helvetica, sans-serif;
}
h3 {
font-family: Arial, Helvetica, sans-serif;
}
h4 {
font-family: Arial, Helvetica, sans-serif;
}
h5 {
font-family: Arial, Helvetica, sans-serif;
}
h6 {
font-family: Arial, Helvetica, sans-serif;
}
font.hint {
font-style: italic;
font-size: 80%;
font-family: Arial, Helvetica, sans-serif;
text-align: left;
}
@@ -1,10 +0,0 @@
<!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>
@@ -1,25 +0,0 @@
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title><s:text name="change.title"/></title>
<link href="<s:url value="/css/mailreader.css"/>" rel="stylesheet"
type="text/css"/>
</head>
<body>
<p>
<s:text name="change.message"/>
</p>
<p>
<a href="<s:url action="Logon"/>">
<s:text name="change.try"/>
</a>
</p>
</body>
</html>
@@ -1,40 +0,0 @@
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Unexpected Error</title>
</head>
<body>
<h2>An unexpected error has occured</h2>
<p>
Please report this error to your system administrator
or appropriate technical support personnel.
Thank you for your cooperation.
</p>
<hr/>
<h3>Error Message</h3>
<s:actionerror/>
<p>
<s:property value="%{exception.message}"/>
</p>
<hr/>
<h3>Technical Details</h3>
<p>
<s:property value="%{exceptionStack}"/>
</p>
<jsp:include page="Footer.jsp"/>
</body>
</html>
@@ -1,6 +0,0 @@
<%@ taglib prefix="s" uri="/struts-tags" %>
<hr/>
<p>
<a href="<s:url action="Welcome" />"><s:text name="index.title"/></a>
</p>
@@ -1 +0,0 @@
<% response.sendRedirect("Welcome.action"); %>
@@ -1,33 +0,0 @@
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title><s:text name="mainMenu.title"/></title>
<link href="<s:url value="/css/mailreader.css"/>" rel="stylesheet"
type="text/css"/>
</head>
<body>
<h3><s:text name="mainMenu.heading"/> <s:property
value="user.fullName"/></h3>
<ul>
<li>
<s:url id="Input" action="registration/+Input" />
<s:a href="%{Input}">
<s:text name="mainMenu.registration"/>
</s:a>
</li>
<li>
<s:url id="Logoff" action="Logoff"/>
<s:a href="%{Logoff}">
<s:text name="mainMenu.logoff"/>
</s:a>
</li>
</ul>
<jsp:include page="Footer.jsp"/>
</body>
</html>
@@ -1,64 +0,0 @@
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title><s:text name="index.title"/></title>
<link href="<s:url value="/css/mailreader.css"/>" rel="stylesheet"
type="text/css"/>
</head>
<body>
<h3><s:text name="index.heading"/></h3>
<ul>
<li>
<s:url id="registration" action="registration/+Input" />
<s:a href="%{registration}"><s:text name="index.registration"/></s:a>
</li>
<li>
<s:url id="logon" action="logon/+Input"/>
<s:a href="%{logon}"><s:text name="index.logon"/></s:a>
</li>
</ul>
<h3>Language Options</h3>
<ul>
<li>
<s:url id="en" action="Welcome">
<s:param name="request_locale">en</s:param>
</s:url>
<s:a href="%{en}">English</s:a>
</li>
<li>
<s:url id="ja" action="Welcome">
<s:param name="request_locale">ja</s:param>
</s:url>
<s:a href="%{ja}">Japanese</s:a>
</li>
<li>
<s:url id="ru" action="Welcome">
<s:param name="request_locale">ru</s:param>
</s:url>
<s:a href="%{ru}">Russian</s:a>
</li>
</ul>
<hr/>
<p>
<s:i18n name="alternate">
<img src="<s:text name="struts.logo.path"/>"
alt="<s:text name="struts.logo.alt"/>"/>
</s:i18n>
</p>
<p>
<s:url id="Tour" action="Tour"/><s:a href="%{Tour}"><s:text name="index.tour"/></s:a>
</p>
</body>
</html>
@@ -1,30 +0,0 @@
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title><s:text name="logon.title"/></title>
<link href="<s:url value="/css/mailreader.css"/>" rel="stylesheet"
type="text/css"/>
</head>
<body onLoad="self.focus();document.logon_Retrieve.logon_Retrieve_username.focus()">
<s:actionerror/>
<s:form id="logon_Retrieve" action="logon/Retrieve" validate="true">
<s:textfield label="%{getText('username')}" name="username"/>
<s:password label="%{getText('password')}" name="password" showPassword="true"/>
<s:submit value="%{getText('button.save')}"/>
<s:reset value="%{getText('button.reset')}"/>
<s:submit action="Welcome" value="%{getText('button.cancel')}"
onclick="form.onsubmit=null"/>
</s:form>
<jsp:include page="Footer.jsp"/>
</body>
</html>
@@ -1,130 +0,0 @@
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<s:if test="task=='Create'">
<title><s:text name="registration.title.create"/></title>
</s:if>
<s:if test="task=='Edit'">
<title><s:text name="registration.title.edit"/></title>
</s:if>
<link href="<s:url value="/css/mailreader.css"/>" rel="stylesheet"
type="text/css"/>
</head>
<body onLoad="self.focus();document.registration_Update.registration_Update_username.focus()">
<s:actionerror/>
<s:form id="registration_Update" action="registration/Update" validate="true">
<s:token/>
<s:hidden name="task"/>
<s:if test="task == 'Create'">
<s:textfield label="%{getText('username')}" name="username"/>
</s:if>
<s:else>
<s:label label="%{getText('username')}" name="username"/>
<s:hidden name="username"/>
</s:else>
<s:password label="%{getText('password')}" name="password"/>
<s:password label="%{getText('password2')}" name="password2"/>
<s:textfield label="%{getText('fullName')}"
name="user.fullName"/>
<s:textfield label="%{getText('fromAddress')}"
name="user.fromAddress"/>
<s:textfield label="%{getText('replyToAddress')}"
name="user.replyToAddress"/>
<s:if test="task == 'Create'">
<s:submit value="%{getText('button.save')}" action="registration/Create"/>
<s:reset value="%{getText('button.reset')}"/>
<s:submit action="Welcome" value="%{getText('button.cancel')}"
onclick="form.onsubmit=null"/>
</s:if>
<s:else>
<s:submit value="%{getText('button.save')}"/>
<s:reset value="%{getText('button.reset')}"/>
<s:submit value="%{getText('button.cancel')}"
action="MainMenu" onclick="form.onsubmit=null"/>
</s:else>
</s:form>
<s:if test="task == 'Edit'">
<div align="center">
<h3><s:text name="heading.subscriptions"/></h3>
</div>
<table border="1" width="100%">
<tr>
<th align="center" width="30%">
<s:text name="heading.host"/>
</th>
<th align="center" width="25%">
<s:text name="heading.user"/>
</th>
<th align="center" width="10%">
<s:text name="heading.type"/>
</th>
<th align="center" width="10%">
<s:text name="heading.autoConnect"/>
</th>
<th align="center" width="15%">
<s:text name="heading.action"/>
</th>
</tr>
<s:iterator value="user.subscriptions">
<tr>
<td align="left">
<s:property value="host"/>
</td>
<td align="left">
<s:property value="username"/>
</td>
<td align="center">
<s:property value="type"/>
</td>
<td align="center">
<s:property value="autoConnect"/>
</td>
<td align="center">
<s:url id="Delete" action="subscription/+Delete" >
<s:param name="host" value="host"/>
</s:url>
<s:a href="%{Delete}">
<s:text name="registration.deleteSubscription"/>
</s:a>
&nbsp;
<s:url id="Edit" action="subscription/+Edit">
<s:param name="host" value="host"/>
</s:url>
<s:a href="%{Edit}">
<s:text name="registration.editSubscription"/>
</s:a>
</td>
</tr>
</s:iterator>
</table>
<s:url id="Input" action="subscription/+Input" />
<s:a href="%{Input}"><s:text name="registration.addSubscription"/></s:a>
</s:if>
<jsp:include page="Footer.jsp"/>
</body>
</html>
@@ -1,31 +0,0 @@
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title><s:text name="logon.title"/></title>
<link href="<s:url value="/css/mailreader.css"/>" rel="stylesheet"
type="text/css"/>
</head>
<body onLoad="self.focus();document.registration/Retrieve.username.focus()">
<s:actionerror/>
<s:url id="Retrieve" action="registration/Retrieve" />
<s:form action="registration/Retrieve" validate="true">
<s:textfield label="%{getText('username')}" name="username"/>
<s:password label="%{getText('password')}" name="password" showPassword="true"/>
<s:submit value="%{getText('button.save')}"/>
<s:reset value="%{getText('button.reset')}"/>
<s:submit action="Welcome" value="%{getText('button.cancel')}"
onclick="form.onsubmit=null"/>
</s:form>
<jsp:include page="../Footer.jsp"/>
</body>
</html>
@@ -1,68 +0,0 @@
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<s:if test="task=='Create'">
<title><s:text name="subscription.title.create"/></title>
</s:if>
<s:if test="task=='Edit'">
<title><s:text name="subscription.title.edit"/></title>
</s:if>
<s:if test="task=='Delete'">
<title><s:text name="subscription.title.delete"/></title>
</s:if>
<link href="<s:url value="/css/mailreader.css"/>" rel="stylesheet"
type="text/css"/>
</head>
<body onLoad="self.focus();document.subscription_Update.subscription_Update_username.focus()">
<s:actionerror/>
<s:form id="subscription_Update" action="subscription/Update" validate="true">
<s:token/>
<s:hidden name="task"/>
<s:label label="%{getText('username')}" name="user.username"/>
<s:if test="task == 'Create'">
<s:textfield label="%{getText('mailHostname')}" name="host"/>
</s:if>
<s:else>
<s:label label="%{getText('mailHostname')}" name="host"/>
<s:hidden name="host"/>
</s:else>
<s:if test="task == 'Delete'">
<s:label label="%{getText('mailUsername')}"
name="subscription.username"/>
<s:label label="%{getText('mailPassword')}"
name="subscription.password"/>
<s:label label="%{getText('mailServerType')}"
name="subscription.type"/>
<s:label label="%{getText('autoConnect')}"
name="subscription.autoConnect"/>
<s:submit value="%{getText('button.confirm')}"/>
</s:if>
<s:else>
<s:textfield label="%{getText('mailUsername')}"
name="subscription.username"/>
<s:textfield label="%{getText('mailPassword')}"
name="subscription.password"/>
<s:select label="%{getText('mailServerType')}"
name="subscription.type" list="types"/>
<s:checkbox label="%{getText('autoConnect')}"
name="subscription.autoConnect"/>
<s:submit value="%{getText('button.save')}"/>
<s:reset value="%{getText('button.reset')}"/>
</s:else>
<s:submit action="registration/+Input"
value="%{getText('button.cancel')}"
onclick="form.onsubmit=null"/>
</s:form>
<jsp:include page="Footer.jsp"/>
</body>
</html>
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

@@ -1,66 +0,0 @@
package mailreader2;
import com.opensymphony.xwork2.XWorkTestCase;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.config.RuntimeConfiguration;
import com.opensymphony.xwork2.config.entities.ActionConfig;
import com.opensymphony.xwork2.config.entities.ResultConfig;
import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider;
import java.util.Map;
public class ConfigTest extends XWorkTestCase {
protected void setUp() throws Exception {
super.setUp();
XmlConfigurationProvider c = new XmlConfigurationProvider("struts.xml");
configurationManager.addConfigurationProvider(c);
configurationManager.reload();
}
private ActionConfig assertClass(String action_name, String class_name) {
RuntimeConfiguration configuration = configurationManager.getConfiguration().getRuntimeConfiguration();
ActionConfig config = configuration.getActionConfig("", action_name);
assertNotNull(config);
assertTrue("Wrong class name: [" + config.getClassName() + "]",
class_name.equals(config.getClassName()));
return config;
}
private void assertResult(ActionConfig config, String result_name, String result_value) {
Map results = config.getResults();
ResultConfig result = (ResultConfig) results.get(result_name);
Map params = result.getParams();
String value = (String) params.get("actionName");
if (value==null)
value = (String) params.get("location");
assertTrue("Wrong result value: [" + value + "]",
result_value.equals(value));
}
public void testSubscriptionSave() throws Exception {
ActionConfig config = assertClass("subscription/Update", "mailreader2.subscription.Update");
assertResult(config, ActionSupport.SUCCESS, "registration/+Input");
assertResult(config, ActionSupport.INPUT, "/pages/subscription.jsp");
}
// */!*
public void testPrepareWildcard() throws Exception {
ActionConfig config = assertClass("logon/+Input", "mailreader2.logon.Input");
assertResult(config, ActionSupport.SUCCESS, "/pages/logon.jsp");
}
// */*
public void testExecuteWildcard() throws Exception {
ActionConfig config = assertClass("registration/Update", "mailreader2.registration.Update");
assertResult(config, ActionSupport.INPUT, "/pages/registration.jsp");
ActionConfig config2 = assertClass("logon/Retrieve", "mailreader2.logon.Retrieve");
assertResult(config2, ActionSupport.INPUT, "/pages/logon.jsp");
}
// single wildcard
public void testDisplayWildcard() throws Exception {
assertClass("Welcome", "mailreader2.Welcome");
}
}