/** * 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 java.util.HashSet; import java.util.Set; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.commons.lang.StringUtils; import org.joda.beans.impl.flexi.FlexiBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.core.id.ExternalSchemes; import com.opengamma.core.user.UserAccountStatus; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.master.user.ManageableUser; import com.opengamma.master.user.UserEventHistoryRequest; import com.opengamma.master.user.UserEventHistoryResult; import com.opengamma.master.user.UserForm; import com.opengamma.master.user.UserFormError; import com.opengamma.master.user.UserFormException; /** * RESTful resource for a user. */ @Path("/users/name/{userName}") public class WebUserResource extends AbstractWebUserResource { /** Logger. */ private static final Logger s_logger = LoggerFactory.getLogger(WebUserResource.class); /** * The ftl file. */ private static final String USER_PAGE = HTML_DIR + "user.ftl"; /** * The ftl file. */ private static final String USER_UPDATE_PAGE = HTML_DIR + "user-update.ftl"; /** * The ftl file. */ private static final String USER_PW_RESET_PAGE = HTML_DIR + "user-pwreset.ftl"; /** * Creates the resource. * @param parent the parent resource, not null */ public WebUserResource(final AbstractWebUserResource parent) { super(parent); } //------------------------------------------------------------------------- @GET @Produces(MediaType.TEXT_HTML) public String getHTML() { final FlexiBean out = createRootData(); return getFreemarker().build(USER_PAGE, out); } //------------------------------------------------------------------------- @PUT @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.TEXT_HTML) public Response putHTML( @FormParam("username") String userName, @FormParam("email") String email, @FormParam("displayname") String displayName, @FormParam("idBloombergEmrs") String idBloomberg, @FormParam("idWindows") String idWindows) { idBloomberg = StringUtils.trimToNull(idBloomberg); idWindows = StringUtils.trimToNull(idWindows); Set<ExternalId> externalIds = new HashSet<>(); if (idBloomberg != null) { externalIds.add(ExternalSchemes.bloombergEmrsUserId(idBloomberg)); } if (idWindows != null) { externalIds.add(ExternalSchemes.windowsUserId(idWindows)); } ExternalIdBundle bundle = ExternalIdBundle.of(externalIds); try { UserForm form = new UserForm(data().getUser()); form.getBaseUser().setAlternateIds(bundle); form.setUserName(userName); form.setEmailAddress(email); form.setDisplayName(displayName); form.update(data().getUserMaster(), data().getPasswordService()); return Response.seeOther(uri(data())).build(); } catch (UserFormException ex) { ex.logUnexpected(s_logger); FlexiBean out = createRootData(); out.put("username", userName); out.put("email", email); out.put("displayname", displayName); out.put("idBloombergEmrs", idBloomberg); out.put("idWindows", idWindows); for (UserFormError error : ex.getErrors()) { out.put("err_" + error.toLowerCamel(), true); } return Response.ok(getFreemarker().build(USER_UPDATE_PAGE, out)).build(); } } @POST @Path("resetpassword") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.TEXT_HTML) public Response postResetPwHTML( @FormParam("password") String password) { password = StringUtils.trimToNull(password); try { UserForm form = new UserForm(data().getUser(), password); form.update(data().getUserMaster(), data().getPasswordService()); return Response.seeOther(uri(data())).build(); } catch (UserFormException ex) { ex.logUnexpected(s_logger); FlexiBean out = createRootData(); for (UserFormError error : ex.getErrors()) { out.put("err_" + error.toLowerCamel(), true); } return Response.ok(getFreemarker().build(USER_PW_RESET_PAGE, out)).build(); } } @POST @Path("status") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.TEXT_HTML) public Response postStatusHTML( @FormParam("status") String status) { status = StringUtils.trimToNull(status); ManageableUser user = data().getUser(); user.setStatus("ENABLED".equals(status) ? UserAccountStatus.ENABLED : UserAccountStatus.DISABLED); data().getUserMaster().update(user); return Response.seeOther(uri(data())).build(); } //------------------------------------------------------------------------- @DELETE @Produces(MediaType.TEXT_HTML) public Response deleteHTML() { ManageableUser user = data().getUser(); data().getUserMaster().removeById(user.getUniqueId().getObjectId()); URI uri = WebUserResource.uri(data()); return Response.seeOther(uri).build(); } //------------------------------------------------------------------------- /** * Creates the output root data. * @return the output root data, not null */ @Override protected FlexiBean createRootData() { FlexiBean out = super.createRootData(); ManageableUser user = data().getUser(); out.put("user", user); out.put("deleted", user.getObjectId() == null); ExternalId emrsId = user.getAlternateIds().getExternalId(ExternalSchemes.BLOOMBERG_EMRSID); out.put("idBloombergEmrs", emrsId != null ? emrsId.getValue() : null); ExternalId windowsId = user.getAlternateIds().getExternalId(ExternalSchemes.WINDOWS_USER_ID); out.put("idWindows", windowsId != null ? windowsId.getValue() : null); UserEventHistoryRequest historyRequest = new UserEventHistoryRequest(data().getUser().getUserName()); UserEventHistoryResult history = data().getUserMaster().eventHistory(historyRequest); out.put("eventHistory", history); return out; } //------------------------------------------------------------------------- /** * Builds a URI for this resource. * @param data the data, not null * @return the URI, not null */ public static URI uriResetPassword(final WebUserData data) { String userName = data.getBestUserUriName(null); return data.getUriInfo().getBaseUriBuilder().path(WebUserResource.class).path("resetpassword").build(userName); } /** * Builds a URI for this resource. * @param data the data, not null * @return the URI, not null */ public static URI uriStatus(final WebUserData data) { String userName = data.getBestUserUriName(null); return data.getUriInfo().getBaseUriBuilder().path(WebUserResource.class).path("status").build(userName); } /** * Builds a URI for this resource. * @param data the data, not null * @return the URI, not null */ public static URI uri(final WebUserData data) { return uri(data, null); } /** * Builds a URI for this resource. * @param data the data, not null * @param overrideUserName the override user name, null uses information from data * @return the URI, not null */ public static URI uri(final WebUserData data, final String overrideUserName) { String userName = data.getBestUserUriName(overrideUserName); return data.getUriInfo().getBaseUriBuilder().path(WebUserResource.class).build(userName); } }