/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.intel.mtwilson.ms.rest; import com.intel.mtwilson.My; import com.intel.mtwilson.datatypes.PortalUserLocale; import com.intel.mtwilson.launcher.ws.ext.V1; import com.intel.mtwilson.ms.controller.exceptions.MSDataException; import com.intel.mtwilson.ms.controller.exceptions.NonexistentEntityException; import com.intel.mtwilson.shiro.ShiroUtil; import com.intel.mtwilson.shiro.jdbi.LoginDAO; import com.intel.mtwilson.shiro.jdbi.MyJdbi; import com.intel.mtwilson.user.management.rest.v2.model.User; import java.io.IOException; import java.sql.SQLException; import java.util.Arrays; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * REST Web Service * * @author rksavinx */ @V1 @Path("/ManagementService/resources/i18n") public class I18n { private Logger log = LoggerFactory.getLogger(getClass()); public I18n() { } /** * Returns locale for specified user. * * @param username * @return * @throws IOException */ @GET @Consumes("application/json") @Produces(MediaType.TEXT_PLAIN) @Path("/locale") public String getLocaleForUser( @QueryParam("username") String username) throws IOException, SQLException { if( username == null || ShiroUtil.subjectUsernameEquals(username)) { // allow any user to access own data return getLocaleForCurrentUser(); // notice we don't pass in any argument, it will use the current logged in user } else { // permission is required to access any other user's data return getLocaleForAnyUser(username); } } // does not require any permission - anyone is allowed to get their own locale protected String getLocaleForCurrentUser() throws IOException, SQLException { String username = ShiroUtil.subjectUsername(); // MwPortalUserJpaController mwPortalUserJpaController = My.jpa().mwPortalUser(); //new MwPortalUserJpaController(getMSEntityManagerFactory()); // MwPortalUser portalUser = mwPortalUserJpaController.findMwPortalUserByUserName(username); // if( portalUser == null ) { throw new WebApplicationException(Response.Status.NOT_FOUND); } try(LoginDAO loginDAO = MyJdbi.authz()) { User user = loginDAO.findUserByName(username); if( user == null ) { throw new WebApplicationException(Response.Status.NOT_FOUND); } log.debug("Retrieved locale for current user {}: {}", user.getUsername(), user.getLocale()); if(user.getLocale() != null) { return user.getLocale().toLanguageTag(); } else { return My.configuration().getAvailableLocales()[0];// "en-US"; // getAvailableLocales() guarantees to return at least one element. } } } @RequiresPermissions("users:retrieve") protected String getLocaleForAnyUser(String username) throws IOException, SQLException { log.debug("Retrieving information from database for portal user: {}", username); // MwPortalUserJpaController mwPortalUserJpaController = My.jpa().mwPortalUser(); //new MwPortalUserJpaController(getMSEntityManagerFactory()); // MwPortalUser portalUser = mwPortalUserJpaController.findMwPortalUserByUserName(username); // if( portalUser == null ) { throw new WebApplicationException(Response.Status.NOT_FOUND); } try(LoginDAO loginDAO = MyJdbi.authz()) { User user = loginDAO.findUserByName(username); if( user == null ) { throw new WebApplicationException(Response.Status.NOT_FOUND); } log.debug("Retrieved locale for current user {}: {}", user.getUsername(), user.getLocale()); if(user.getLocale() != null) { return user.getLocale().toLanguageTag(); } else { return My.configuration().getAvailableLocales()[0];// "en-US"; // getAvailableLocales() guarantees to return at least one element. } } } /** * Sets the user defined locale. * * @param username * @param locale * @return * @throws IOException * @throws NonexistentEntityException * @throws MSDataException */ @POST @Produces(MediaType.TEXT_PLAIN) @Path("/locale") public String setLocaleForUser(PortalUserLocale pul) throws IOException, NonexistentEntityException, MSDataException, SQLException { if( pul.getUser() == null || ShiroUtil.subjectUsernameEquals(pul.getUser())) { setLocaleForCurrentUser(pul.getLocale()); } else { setLocaleForAnyUser(pul.getUser(), pul.getLocale()); } return "OK"; } protected void setLocaleForCurrentUser(String locale) throws IOException, NonexistentEntityException, MSDataException, SQLException { String username = ShiroUtil.subjectUsername(); log.debug("Retrieving current portal user [{}] from database.", username); //MwPortalUserJpaController mwPortalUserJpaController = My.jpa().mwPortalUser(); //new MwPortalUserJpaController(getMSEntityManagerFactory()); //MwPortalUser portalUser = mwPortalUserJpaController.findMwPortalUserByUserName(username); //if( portalUser == null ) { throw new WebApplicationException(Response.Status.NOT_FOUND); } try(LoginDAO loginDAO = MyJdbi.authz()) { User user = loginDAO.findUserByName(username); if( user == null ) { throw new WebApplicationException(Response.Status.NOT_FOUND); } log.debug("Retrieved current user {}", user.getUsername()); loginDAO.updateUser(user.getId(), locale, user.getComment()); } //log.debug("Retrieved portal user [{}] from database.", portalUser.getUsername()); //log.debug("Setting locale [{}] for portal user [{}] in database.", locale, portalUser.getUsername()); //portalUser.setLocale(locale); //mwPortalUserJpaController.edit(portalUser); } @RequiresPermissions("users:store") protected void setLocaleForAnyUser(String username, String locale) throws IOException, NonexistentEntityException, MSDataException, SQLException { log.debug("Retrieving portal user [{}] from database.", username); //MwPortalUserJpaController mwPortalUserJpaController = My.jpa().mwPortalUser(); //new MwPortalUserJpaController(getMSEntityManagerFactory()); //MwPortalUser portalUser = mwPortalUserJpaController.findMwPortalUserByUserName(username); //if( portalUser == null ) { throw new WebApplicationException(Response.Status.NOT_FOUND); } //log.debug("Retrieved portal user [{}] from database.", portalUser.getUsername()); //log.debug("Setting locale [{}] for portal user [{}] in database.", locale, portalUser.getUsername()); //portalUser.setLocale(locale); //mwPortalUserJpaController.edit(portalUser); try(LoginDAO loginDAO = MyJdbi.authz()) { User user = loginDAO.findUserByName(username); if( user == null ) { throw new WebApplicationException(Response.Status.NOT_FOUND); } log.debug("Retrieved current user {}", user.getUsername()); loginDAO.updateUser(user.getId(), locale, user.getComment()); } } /** * Retrieves list of available locales * * @return * @throws IOException */ @GET @Produces(MediaType.TEXT_PLAIN) @Path("/locales") //@RolesAllowed({"Security"}) //@RequiresPermissions("users:retrieve") public String getLocales() throws IOException { log.debug("Retrieving available locales: {}", Arrays.toString(My.configuration().getAvailableLocales())); return Arrays.toString(My.configuration().getAvailableLocales()); } }