VIVO-139 Use the I18n framework wherever DisplayMessage is loaded.

This commit is contained in:
j2blake 2013-06-14 12:47:37 -04:00
parent aa7c8024d0
commit 5de5a322a2
19 changed files with 151 additions and 128 deletions

View file

@ -30,6 +30,7 @@ import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAct
import edu.cornell.mannlib.vitro.webapp.beans.DisplayMessage;
import edu.cornell.mannlib.vitro.webapp.controller.authenticate.LogoutRedirector;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
import edu.cornell.mannlib.vitro.webapp.i18n.I18n;
public class VitroHttpServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@ -63,15 +64,6 @@ public class VitroHttpServlet extends HttpServlet {
super.service(req, resp);
}
/**
* Show this to the user if they are logged in, but still not authorized to
* view the page.
*/
private static final String INSUFFICIENT_AUTHORIZATION_MESSAGE = "We're sorry, "
+ "but you are not authorized to view the page you requested. "
+ "If you think this is an error, "
+ "please contact us and we'll be happy to help.";
/**
* doGet does nothing.
*/
@ -148,7 +140,7 @@ public class VitroHttpServlet extends HttpServlet {
HttpServletRequest request, HttpServletResponse response) {
try {
DisplayMessage.setMessage(request,
INSUFFICIENT_AUTHORIZATION_MESSAGE);
I18n.bundle(request).text("insufficient_authorization"));
response.sendRedirect(request.getContextPath());
} catch (IOException e) {
log.error("Could not redirect to show insufficient authorization.");

View file

@ -171,6 +171,9 @@ public class AdminLoginController extends FreemarkerHttpServlet {
body.put("password", password);
body.put("newPassword", newPassword);
body.put("confirmPassword", confirmPassword);
body.put("minPasswordLength", MIN_PASSWORD_LENGTH);
body.put("maxPasswordLength", MAX_PASSWORD_LENGTH);
for (String code : codes) {
body.put(code, Boolean.TRUE);

View file

@ -12,6 +12,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean;
import edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.MLevel;
import edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.Message;
/**
@ -21,14 +22,15 @@ public class BaseLoginServlet extends HttpServlet {
private static final Log log = LogFactory.getLog(BaseLoginServlet.class);
/** A general purpose error message for the user to see. */
protected static final Message MESSAGE_LOGIN_FAILED = new LoginProcessBean.Message(
"External login failed.", LoginProcessBean.MLevel.ERROR);
protected static Message messageLoginFailed(HttpServletRequest req) {
return new LoginProcessBean.Message(req, MLevel.ERROR, "external_login_failed");
}
/** Tell the user that it's nothing personal, they just aren't allowed in. */
protected static final Message MESSAGE_LOGIN_DISABLED = new LoginProcessBean.Message(
"User logins are temporarily disabled while the system is being maintained.",
LoginProcessBean.MLevel.ERROR);
protected static Message messageLoginDisabled(HttpServletRequest req) {
return new LoginProcessBean.Message(req, MLevel.ERROR, "logins_temporarily_disabled");
}
protected Authenticator getAuthenticator(HttpServletRequest req) {
return Authenticator.getInstance(req);
}
@ -40,10 +42,9 @@ public class BaseLoginServlet extends HttpServlet {
*/
protected void complainAndReturnToReferrer(HttpServletRequest req,
HttpServletResponse resp, String sessionAttributeForReferrer,
Message message, Object... args) throws IOException {
log.debug(message.getMessageLevel() + ": "
+ message.formatMessage(args));
LoginProcessBean.getBean(req).setMessage(message, args);
Message message) throws IOException {
log.debug(message);
LoginProcessBean.getBean(req).setMessage(message);
String referrer = (String) req.getSession().getAttribute(
sessionAttributeForReferrer);

View file

@ -71,7 +71,7 @@ public class LoginExternalAuthReturn extends BaseLoginServlet {
if (externalAuthId == null) {
complainAndReturnToReferrer(req, resp, ATTRIBUTE_REFERRER,
MESSAGE_LOGIN_FAILED);
messageLoginFailed(req));
return;
}
@ -84,7 +84,7 @@ public class LoginExternalAuthReturn extends BaseLoginServlet {
if (!getAuthenticator(req).isUserPermittedToLogin(userAccount)) {
log.debug("Logins disabled for " + userAccount);
complainAndReturnToReferrer(req, resp, ATTRIBUTE_REFERRER,
MESSAGE_LOGIN_DISABLED);
messageLoginDisabled(req));
return;
}
@ -107,7 +107,7 @@ public class LoginExternalAuthReturn extends BaseLoginServlet {
// should have been caught by isUserPermittedToLogin()
log.debug("Logins disabled for " + userAccount);
complainAndReturnToReferrer(req, resp, ATTRIBUTE_REFERRER,
MESSAGE_LOGIN_DISABLED);
messageLoginDisabled(req));
return;
}
}
@ -115,10 +115,10 @@ public class LoginExternalAuthReturn extends BaseLoginServlet {
@Override
protected void complainAndReturnToReferrer(HttpServletRequest req,
HttpServletResponse resp, String sessionAttributeForReferrer,
Message message, Object... args) throws IOException {
DisplayMessage.setMessage(req, message.formatMessage(args));
Message message) throws IOException {
DisplayMessage.setMessage(req, message.getText());
super.complainAndReturnToReferrer(req, resp,
sessionAttributeForReferrer, message, args);
sessionAttributeForReferrer, message);
}
private void removeLoginProcessArtifacts(HttpServletRequest req) {

View file

@ -53,7 +53,7 @@ public class LoginExternalAuthSetup extends BaseLoginServlet {
if (redirectUrl == null) {
complainAndReturnToReferrer(req, resp, ATTRIBUTE_REFERRER,
MESSAGE_LOGIN_FAILED);
messageLoginFailed(req));
}
log.debug("redirecting to '" + redirectUrl + "'");

View file

@ -21,6 +21,8 @@ import edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyHelper;
import edu.cornell.mannlib.vitro.webapp.beans.DisplayMessage;
import edu.cornell.mannlib.vitro.webapp.beans.UserAccount;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
import edu.cornell.mannlib.vitro.webapp.i18n.I18n;
import edu.cornell.mannlib.vitro.webapp.i18n.I18nBundle;
/**
* A user has just completed the login process. What page do we direct them to?
@ -30,6 +32,7 @@ public class LoginRedirector {
private final HttpServletRequest request;
private final HttpSession session;
private final I18nBundle i18n;
private final String uriOfAssociatedIndividual;
private final String afterLoginPage;
@ -37,6 +40,7 @@ public class LoginRedirector {
public LoginRedirector(HttpServletRequest request, String afterLoginPage) {
this.request = request;
this.session = request.getSession();
this.i18n = I18n.bundle(request);
this.afterLoginPage = afterLoginPage;
uriOfAssociatedIndividual = getAssociatedIndividualUri();
@ -114,26 +118,23 @@ public class LoginRedirector {
public String assembleWelcomeMessage() {
if (!canSeeSiteAdminPage() && !isSelfEditorWithIndividual()) {
// A special message for unrecognized self-editors:
return "You have logged in, "
+ "but the system contains no profile for you.";
return i18n.text("logged_in_but_no_profile");
}
String backString = "";
String greeting = "";
String greeting = i18n.text("unknown_user_name");
int loginCount = 0;
UserAccount userAccount = LoginStatusBean.getCurrentUser(request);
if (userAccount != null) {
greeting = userAccount.getEmailAddress();
if (userAccount.getLoginCount() > 1) {
backString = " back";
}
String name = userAccount.getFirstName();
if (!StringUtils.isEmpty(name)) {
greeting = name;
loginCount = userAccount.getLoginCount();
if (StringUtils.isNotEmpty(userAccount.getFirstName())) {
greeting = userAccount.getFirstName();
} else if (StringUtils.isNotEmpty(userAccount.getEmailAddress())) {
greeting = userAccount.getEmailAddress();
}
}
return "Welcome" + backString + ", " + greeting;
return i18n.text("login_welcome_message", greeting, loginCount);
}
public void redirectCancellingUser(HttpServletResponse response)

View file

@ -4,6 +4,7 @@ package edu.cornell.mannlib.vitro.webapp.controller.edit;
import static edu.cornell.mannlib.vitro.webapp.beans.UserAccount.MAX_PASSWORD_LENGTH;
import static edu.cornell.mannlib.vitro.webapp.beans.UserAccount.MIN_PASSWORD_LENGTH;
import static edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.MLevel.ERROR;
import static edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.State.FORCED_PASSWORD_CHANGE;
import static edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.State.LOGGED_IN;
import static edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.State.LOGGING_IN;
@ -37,7 +38,6 @@ import edu.cornell.mannlib.vitro.webapp.controller.authenticate.Authenticator.Lo
import edu.cornell.mannlib.vitro.webapp.controller.authenticate.LoginInProcessFlag;
import edu.cornell.mannlib.vitro.webapp.controller.authenticate.LoginRedirector;
import edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean;
import edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.Message;
import edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.State;
import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.jena.LoginLogoutEvent;
@ -309,7 +309,7 @@ public class Authenticate extends VitroHttpServlet {
+ bean);
if ((username == null) || username.isEmpty()) {
bean.setMessage(Message.NO_USERNAME);
bean.setMessage(request, ERROR, "error_no_email_address");
return;
}
@ -320,22 +320,22 @@ public class Authenticate extends VitroHttpServlet {
log.trace("User is " + (user == null ? "null" : user.getUri()));
if (user == null) {
bean.setMessage(Message.UNKNOWN_USERNAME, username);
bean.setMessage(request, ERROR, "error_incorrect_credentials");
return;
}
if ((password == null) || password.isEmpty()) {
bean.setMessage(Message.NO_PASSWORD);
bean.setMessage(request, ERROR, "error_no_password");
return;
}
if (!getAuthenticator(request).isUserPermittedToLogin(user)) {
bean.setMessage(Message.LOGIN_DISABLED);
bean.setMessage(request, ERROR, "logins_disabled_for_maintenance");
return;
}
if (!getAuthenticator(request).isCurrentPassword(user, password)) {
bean.setMessage(Message.INCORRECT_PASSWORD);
bean.setMessage(request, ERROR, "error_incorrect_credentials");
return;
}
@ -347,7 +347,8 @@ public class Authenticate extends VitroHttpServlet {
transitionToLoggedIn(request, user);
} catch (LoginNotPermitted e) {
// This should have been caught by isUserPermittedToLogin()
bean.setMessage(Message.LOGIN_DISABLED);
bean.setMessage(request, ERROR,
"logins_disabled_for_maintenance");
return;
}
}
@ -379,19 +380,19 @@ public class Authenticate extends VitroHttpServlet {
+ ", bean=" + bean);
if ((newPassword == null) || newPassword.isEmpty()) {
bean.setMessage(Message.NO_NEW_PASSWORD);
bean.setMessage(request, ERROR, "error_no_new_password");
return;
}
if (!newPassword.equals(confirm)) {
bean.setMessage(Message.MISMATCH_PASSWORD);
bean.setMessage(request, ERROR, "error_passwords_dont_match");
return;
}
if ((newPassword.length() < MIN_PASSWORD_LENGTH)
|| (newPassword.length() > MAX_PASSWORD_LENGTH)) {
bean.setMessage(Message.PASSWORD_LENGTH, MIN_PASSWORD_LENGTH,
MAX_PASSWORD_LENGTH);
bean.setMessage(request, ERROR, "error_password_length",
MIN_PASSWORD_LENGTH, MAX_PASSWORD_LENGTH);
return;
}
@ -400,7 +401,7 @@ public class Authenticate extends VitroHttpServlet {
UserAccount user = getAuthenticator(request).getAccountForInternalAuth(
username);
if (getAuthenticator(request).isCurrentPassword(user, newPassword)) {
bean.setMessage(Message.USING_OLD_PASSWORD);
bean.setMessage(request, ERROR, "error_previous_password");
return;
}
@ -409,7 +410,7 @@ public class Authenticate extends VitroHttpServlet {
transitionToLoggedIn(request, user, newPassword);
} catch (LoginNotPermitted e) {
// This should have been caught by isUserPermittedToLogin()
bean.setMessage(Message.LOGIN_DISABLED);
bean.setMessage(request, ERROR, "logins_disabled_for_maintenance");
return;
}
}

View file

@ -12,6 +12,7 @@ import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.beans.DisplayMessage;
import edu.cornell.mannlib.vitro.webapp.controller.authenticate.Authenticator;
import edu.cornell.mannlib.vitro.webapp.controller.authenticate.LogoutRedirector;
import edu.cornell.mannlib.vitro.webapp.i18n.I18n;
/**
* Provide a means for programmatic logout.
@ -22,13 +23,14 @@ public class Logout extends HttpServlet {
/** This http header holds the referring page. */
private static final String HEADING_REFERRER = "referer";
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
String referrer = getReferringPage(request);
String redirectUrl = LogoutRedirector.getRedirectUrl(request, response, referrer);
Authenticator.getInstance(request).recordUserIsLoggedOut();
DisplayMessage.setMessage(request, "You have logged out.");
DisplayMessage.setMessage(request, I18n.bundle(request).text("logged_out"));
response.sendRedirect(redirectUrl);
} catch (Exception ex) {
@ -45,6 +47,7 @@ public class Logout extends HttpServlet {
return referrer;
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
doPost(request, response);
}

View file

@ -2,7 +2,6 @@
package edu.cornell.mannlib.vitro.webapp.controller.login;
import java.text.MessageFormat;
import java.util.Arrays;
import javax.servlet.http.HttpServletRequest;
@ -11,6 +10,8 @@ import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.i18n.I18n;
/**
* Where are we in the process of logging on? What message should we show to the
* user?
@ -110,60 +111,32 @@ public class LoginProcessBean {
}
public static class Message {
public static final Message NO_MESSAGE = new Message("", MLevel.NONE);
public static final Message NO_MESSAGE = new Message();
public static final Message PASSWORD_CHANGE_SAVED = new Message(
"Your password has been saved.<br/>" + "Please log in.",
MLevel.INFO);
public static final Message NO_USERNAME = new Message(
"Please enter your email address.", MLevel.ERROR);
public static final Message NO_PASSWORD = new Message(
"Please enter your password.", MLevel.ERROR);
public static final Message UNKNOWN_USERNAME = new Message(
"The email or password you entered is incorrect.", MLevel.ERROR);
public static final Message LOGIN_DISABLED = new Message(
"User logins are temporarily disabled while the system is being maintained.",
MLevel.ERROR);
public static final Message INCORRECT_PASSWORD = new Message(
"The email or password you entered is incorrect.", MLevel.ERROR);
public static final Message NO_NEW_PASSWORD = new Message(
"Please enter your new password.", MLevel.ERROR);
public static final Message MISMATCH_PASSWORD = new Message(
"The passwords entered do not match.", MLevel.ERROR);
public static final Message PASSWORD_LENGTH = new Message(
"Please enter a password between {0} and {1} characters in length.",
MLevel.ERROR);
public static final Message USING_OLD_PASSWORD = new Message(
"Your new password cannot match the current one.", MLevel.ERROR);
private final String format;
private final String text;
private final MLevel messageLevel;
public Message(String format, MLevel messageLevel) {
this.format = format;
this.messageLevel = messageLevel;
public Message() {
this.messageLevel = MLevel.NONE;
this.text = "";
}
public Message(HttpServletRequest req, MLevel messageLevel, String textKey, Object... parameters) {
this.messageLevel = messageLevel;
this.text = I18n.bundle(req).text(textKey, parameters);
}
public MLevel getMessageLevel() {
return this.messageLevel;
}
public String formatMessage(Object[] args) {
return new MessageFormat(this.format).format(args);
public String getText() {
return text;
}
@Override
public String toString() {
return "Message[" + messageLevel + ", '" + format + "']";
return "Message[" + messageLevel + ", '" + text + "']";
}
}
@ -210,10 +183,15 @@ public class LoginProcessBean {
}
}
public void setMessage(Message message, Object... args) {
public void setMessage(Message message) {
synchronized (messageSynchronizer) {
this.message = message;
this.messageArguments = args;
}
}
public void setMessage(HttpServletRequest req, MLevel level, String textKey, Object... parameters) {
synchronized (messageSynchronizer) {
this.message = new Message(req, level, textKey, parameters);
}
}
@ -221,7 +199,7 @@ public class LoginProcessBean {
synchronized (messageSynchronizer) {
String text = "";
if (message.getMessageLevel() == MLevel.INFO) {
text = message.formatMessage(messageArguments);
text = message.getText();
clearMessage();
}
return text;
@ -232,7 +210,7 @@ public class LoginProcessBean {
synchronized (messageSynchronizer) {
String text = "";
if (message.getMessageLevel() == MLevel.ERROR) {
text = message.formatMessage(messageArguments);
text = message.getText();
clearMessage();
}
return text;

View file

@ -18,6 +18,7 @@ import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.beans.DisplayMessage;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
import edu.cornell.mannlib.vitro.webapp.i18n.I18n;
/**
* Call this at /selectLocale&selection=[locale_string]
@ -75,8 +76,7 @@ public class LocaleSelectionController extends HttpServlet {
} catch (IllegalArgumentException e) {
log.error("Failed to convert the selection to a Locale", e);
DisplayMessage.setMessage(req,
"There was a problem in the system. "
+ "Your language choice was rejected.");
I18n.bundle(req).text("language_selection_failed"));
return;
}

View file

@ -12,6 +12,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vedit.beans.LoginStatusBean;
import edu.cornell.mannlib.vitro.webapp.beans.UserAccount;
import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.controller.authenticate.LoginInProcessFlag;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
@ -56,7 +57,8 @@ public class LoginWidget extends Widget {
EXTERNAL_AUTH_NAME("externalAuthName"),
EXTERNAL_AUTH_URL("externalAuthUrl"),
CANCEL_URL("cancelUrl"),
SITE_NAME("siteName");
SITE_NAME("siteName"),
MINIMUM_PASSWORD_LENGTH("minimumPasswordLength");
private final String variableName;
@ -172,6 +174,7 @@ public class LoginWidget extends Widget {
Macro.FORCE_PASSWORD_CHANGE.toString());
values.put(TemplateVariable.FORM_ACTION.toString(), getAuthenticateUrl(request));
values.put(TemplateVariable.CANCEL_URL.toString(), getCancelUrl(request));
values.put(TemplateVariable.MINIMUM_PASSWORD_LENGTH.toString(), UserAccount.MIN_PASSWORD_LENGTH);
String errorMessage = bean.getErrorMessageAndClear();
if (!errorMessage.isEmpty()) {