/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package controllers;
import java.util.Map.Entry;
import org.apache.commons.lang.StringUtils;
import play.Logger;
import play.data.validation.Required;
import play.data.validation.Validation;
import play.mvc.Controller;
import play.mvc.Http.Header;
import play.mvc.With;
import util.MessagesUtils;
import util.UserPreferencesUtils;
import com.emc.vipr.model.catalog.UserPreferencesRestRep;
import com.emc.vipr.model.catalog.UserPreferencesUpdateParam;
import controllers.security.Security;
@With(Common.class)
public class Preferences extends Controller {
protected static final String SAVED = "user.saved";
private static final String FLASH_REFERER = "flash.userPreferences.referer.url";
public static void update() {
PreferencesForm user = new PreferencesForm(UserPreferencesUtils.getUserPreferences());
storeReferer(user);
render(user);
}
public static void save(PreferencesForm user) {
storeReferer(user);
user.validate("user");
if (Validation.hasErrors()) {
params.flash();
Validation.keep();
update();
}
else {
user.save();
update();
}
}
public static void cancel() {
update();
}
private static void storeReferer(PreferencesForm user) {
final String referer = getRefererUrl();
flash.put(FLASH_REFERER, referer);
user.referer = referer;
Logger.debug("Referer stored in Flash: %s", referer);
}
private static String getRefererUrl() {
// if there is a referer URL stored in the flash we should use that
final String flashReferer = flash.get(FLASH_REFERER);
if (StringUtils.isNotBlank(flashReferer)) {
return flashReferer;
}
// otherwise look for the referer in the request headers
final String requestHeaderReferer = getRefererRequestHeader();
if (StringUtils.isNotBlank(requestHeaderReferer)) {
return requestHeaderReferer;
}
// otherwise we didn't find a referer
return "/";
}
private static String getRefererRequestHeader() {
for (Entry<String, Header> keys : request.headers.entrySet()) {
if (StringUtils.equals(keys.getKey(), "referer")) {
return keys.getValue().toString();
}
}
return null;
}
public static class PreferencesForm {
public static final String EMAIL_REQUIRED = "user.email.required";
public String userId;
@Required
public Boolean notifyByEmail = Boolean.FALSE;
public String email;
public String referer;
public PreferencesForm(UserPreferencesRestRep userPrefs) {
doReadFrom(userPrefs);
}
protected void doReadFrom(UserPreferencesRestRep model) {
this.userId = model.getUsername();
this.notifyByEmail = model.getNotifyByEmail();
this.email = model.getEmail();
}
public void save() {
UserPreferencesUpdateParam updateParam = new UserPreferencesUpdateParam();
updateParam.setNotifyByEmail(this.notifyByEmail);
updateParam.setEmail(this.email);
updateParam.setUsername(Security.getUserInfo().getCommonName());
UserPreferencesUtils.updateUserPreferences(updateParam);
}
public void validate(String formName) {
String emailFieldName = formName + ".email";
if (notifyByEmail) {
Validation.required(emailFieldName, email).message(MessagesUtils.get(EMAIL_REQUIRED));
}
if (StringUtils.isNotBlank(email)) {
Validation.email(emailFieldName, email);
}
}
}
}