public org.apache.struts.action.ActionForward | execute(org.apache.struts.action.ActionMapping mapping, org.apache.struts.action.ActionForm form, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)Process the specified HTTP request, and create the corresponding HTTP
response (or forward to another web component that will create it).
Return an ActionForward instance describing where and how
control should be forwarded, or null if the response has
already been completed.
// --------------------------------------------------------- Public Methods
// Extract attributes and parameters we will need
Locale locale = getLocale(request);
MessageResources messages = getResources(request);
HttpSession session = request.getSession();
RegistrationForm regform = (RegistrationForm) form;
String action = regform.getAction();
if (action == null) {
action = "Create";
}
UserDatabase database = (UserDatabase)
servlet.getServletContext().getAttribute(Constants.DATABASE_KEY);
if (log.isDebugEnabled()) {
log.debug("SaveRegistrationAction: Processing " + action +
" action");
}
// Is there a currently logged on user (unless creating)?
User user = (User) session.getAttribute(Constants.USER_KEY);
if (!"Create".equals(action) && (user == null)) {
if (log.isTraceEnabled()) {
log.trace(" User is not logged on in session "
+ session.getId());
}
return (mapping.findForward("logon"));
}
// Was this transaction cancelled?
if (isCancelled(request)) {
if (log.isTraceEnabled()) {
log.trace(" Transaction '" + action +
"' was cancelled");
}
session.removeAttribute(Constants.SUBSCRIPTION_KEY);
return (mapping.findForward("success"));
}
// Validate the transactional control token
ActionErrors errors = new ActionErrors();
if (log.isTraceEnabled()) {
log.trace(" Checking transactional control token");
}
if (!isTokenValid(request)) {
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError("error.transaction.token"));
}
resetToken(request);
// Validate the request parameters specified by the user
if (log.isTraceEnabled()) {
log.trace(" Performing extra validations");
}
String value = null;
value = regform.getUsername();
if (("Create".equals(action)) &&
(database.findUser(value) != null)) {
errors.add("username",
new ActionError("error.username.unique",
regform.getUsername()));
}
if ("Create".equals(action)) {
value = regform.getPassword();
if ((value == null) || (value.length() <1)) {
errors.add("password",
new ActionError("error.password.required"));
}
value = regform.getPassword2();
if ((value == null) || (value.length() < 1)) {
errors.add("password2",
new ActionError("error.password2.required"));
}
}
// Report any errors we have discovered back to the original form
if (!errors.isEmpty()) {
saveErrors(request, errors);
saveToken(request);
return (mapping.getInputForward());
}
// Update the user's persistent profile information
try {
if ("Create".equals(action)) {
user = database.createUser(regform.getUsername());
}
String oldPassword = user.getPassword();
PropertyUtils.copyProperties(user, regform);
if ((regform.getPassword() == null) ||
(regform.getPassword().length() < 1)) {
user.setPassword(oldPassword);
}
} catch (InvocationTargetException e) {
Throwable t = e.getTargetException();
if (t == null) {
t = e;
}
log.error("Registration.populate", t);
throw new ServletException("Registration.populate", t);
} catch (Throwable t) {
log.error("Registration.populate", t);
throw new ServletException("Subscription.populate", t);
}
try {
database.save();
} catch (Exception e) {
log.error("Database save", e);
}
// Log the user in if appropriate
if ("Create".equals(action)) {
session.setAttribute(Constants.USER_KEY, user);
if (log.isTraceEnabled()) {
log.trace(" User '" + user.getUsername() +
"' logged on in session " + session.getId());
}
}
// Remove the obsolete form bean
if (mapping.getAttribute() != null) {
if ("request".equals(mapping.getScope()))
request.removeAttribute(mapping.getAttribute());
else
session.removeAttribute(mapping.getAttribute());
}
// Forward control to the specified success URI
if (log.isTraceEnabled()) {
log.trace(" Forwarding to success page");
}
return (mapping.findForward("success"));
|