/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.web.user;
import java.net.URI;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.apache.shiro.authc.credential.PasswordService;
import org.joda.beans.impl.flexi.FlexiBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opengamma.master.user.ManageableUser;
import com.opengamma.master.user.UserForm;
import com.opengamma.master.user.UserFormError;
import com.opengamma.master.user.UserFormException;
import com.opengamma.master.user.UserMaster;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.auth.AuthUtils;
import com.opengamma.web.AbstractSingletonWebResource;
import com.opengamma.web.WebHomeUris;
/**
* RESTful resource for the profile page.
*/
@Path("/profile")
public class WebProfileResource extends AbstractSingletonWebResource {
/** Logger. */
private static final Logger s_logger = LoggerFactory.getLogger(WebProfileResource.class);
/**
* The ftl file.
*/
private static final String PROFILE_GREEN = "users/html/profile.ftl";
/**
* The user master.
*/
private final UserMaster _userMaster;
/**
* The password service.
*/
private final PasswordService _pwService;
/**
* Creates the resource.
*
* @param userMaster the user master, not null
* @param pwService the password service, not null
*/
public WebProfileResource(UserMaster userMaster, PasswordService pwService) {
_userMaster = ArgumentChecker.notNull(userMaster, "userMaster");
_pwService = ArgumentChecker.notNull(pwService, "pwService");
}
//-------------------------------------------------------------------------
@GET
@Produces(MediaType.TEXT_HTML)
public String getGreen(
@Context HttpServletRequest request,
@Context ServletContext servletContext,
@Context UriInfo uriInfo) {
FlexiBean out = createStandardRootData(uriInfo);
return getFreemarker(servletContext).build(PROFILE_GREEN, out);
}
//-------------------------------------------------------------------------
@POST
@Produces(MediaType.TEXT_HTML)
public Response updateProfile(
@Context ServletContext servletContext,
@Context UriInfo uriInfo,
@FormParam("email") String email,
@FormParam("displayname") String displayName,
@FormParam("locale") String locale,
@FormParam("timezone") String zone,
@FormParam("datestyle") String dateStyle,
@FormParam("timestyle") String timeStyle) {
try {
String userName = AuthUtils.getUserName();
ManageableUser user = _userMaster.getByName(userName);
UserForm form = new UserForm(user, email, displayName, locale, zone, dateStyle, timeStyle);
form.update(_userMaster, _pwService);
return Response.seeOther(new WebHomeUris(uriInfo).home()).build();
} catch (UserFormException ex) {
ex.logUnexpected(s_logger);
FlexiBean out = createRootData(uriInfo);
out.put("email", email);
out.put("displayname", displayName);
out.put("locale", locale);
out.put("timezone", zone);
out.put("datestyle", dateStyle);
out.put("timestyle", timeStyle);
out.put("err", ex.getErrors().size() > 0);
for (UserFormError error : ex.getErrors()) {
out.put("err_" + error.toLowerCamel(), true);
}
return Response.ok(getFreemarker(servletContext).build(PROFILE_GREEN, out)).build();
}
}
@POST
@Path("password")
@Produces(MediaType.TEXT_HTML)
public Response changePassword(
@Context ServletContext servletContext,
@Context UriInfo uriInfo,
@FormParam("password") String password) {
try {
String userName = AuthUtils.getUserName();
ManageableUser user = _userMaster.getByName(userName);
UserForm form = new UserForm(user, password);
form.update(_userMaster, _pwService);
return Response.seeOther(new WebHomeUris(uriInfo).home()).build();
} catch (UserFormException ex) {
ex.logUnexpected(s_logger);
FlexiBean out = createStandardRootData(uriInfo);
out.put("err", ex.getErrors().size() > 0);
for (UserFormError error : ex.getErrors()) {
out.put("err_" + error.toLowerCamel(), true);
}
return Response.ok(getFreemarker(servletContext).build(PROFILE_GREEN, out)).build();
}
}
private FlexiBean createStandardRootData(UriInfo uriInfo) {
String userName = AuthUtils.getUserName();
ManageableUser user = _userMaster.getByName(userName);
FlexiBean out = createRootData(uriInfo);
out.put("username", user.getUserName());
out.put("email", user.getEmailAddress());
out.put("displayname", user.getProfile().getDisplayName());
out.put("locale", user.getProfile().getLocale().toString());
out.put("timezone", user.getProfile().getZone().toString());
out.put("datestyle", user.getProfile().getDateStyle().name());
out.put("timestyle", user.getProfile().getTimeStyle().name());
return out;
}
//-------------------------------------------------------------------------
/**
* Builds a URI for this page.
*
* @param uriInfo the uriInfo, not null
* @return the URI, not null
*/
public static URI uri(UriInfo uriInfo) {
return uriInfo.getBaseUriBuilder().path(WebProfileResource.class).build();
}
}