/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.intel.mtwilson.user.management.rest.v2.repository; import com.intel.dcsg.cpg.i18n.LocaleUtil; import com.intel.mtwilson.user.management.rest.v2.model.User; import com.intel.mtwilson.user.management.rest.v2.model.UserCollection; import com.intel.mtwilson.user.management.rest.v2.model.UserFilterCriteria; import com.intel.mtwilson.user.management.rest.v2.model.UserLocator; import com.intel.mtwilson.jaxrs2.server.resource.DocumentRepository; import com.intel.mtwilson.repository.RepositoryCreateConflictException; import com.intel.mtwilson.repository.RepositoryCreateException; import com.intel.mtwilson.repository.RepositoryDeleteException; import com.intel.mtwilson.repository.RepositoryException; import com.intel.mtwilson.repository.RepositoryRetrieveException; import com.intel.mtwilson.repository.RepositorySearchException; import com.intel.mtwilson.repository.RepositoryStoreConflictException; import com.intel.mtwilson.repository.RepositoryStoreException; import com.intel.mtwilson.shiro.jdbi.LoginDAO; import com.intel.mtwilson.shiro.jdbi.MyJdbi; import com.intel.mtwilson.user.management.rest.v2.model.UserLoginCertificateFilterCriteria; import com.intel.mtwilson.user.management.rest.v2.model.UserLoginPasswordFilterCriteria; import java.util.List; import org.apache.shiro.authz.annotation.RequiresPermissions; /** * * @author ssbangal */ public class UserRepository implements DocumentRepository<User, UserCollection, UserFilterCriteria, UserLocator> { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UserRepository.class); @Override @RequiresPermissions("users:search") public UserCollection search(UserFilterCriteria criteria) { log.debug("User:Search - Got request to search for the users. Filter criteria is {}", criteria.filter); UserCollection userCollection = new UserCollection(); try (LoginDAO loginDAO = MyJdbi.authz()) { if (criteria.filter) { if (criteria.id != null) { User user = loginDAO.findUserById(criteria.id); if (user != null) { userCollection.getUsers().add(user); } } else if (criteria.nameEqualTo != null && !criteria.nameEqualTo.isEmpty()) { User user = loginDAO.findUserByName(criteria.nameEqualTo); if (user != null) { userCollection.getUsers().add(user); } } else if (criteria.nameContains != null && !criteria.nameContains.isEmpty()) { List<User> users = loginDAO.findUserByNameLike("%"+criteria.nameContains+"%"); if (users != null && users.size() > 0) { for (User user : users) { userCollection.getUsers().add(user); } } } } else { List<User> findAllUsers = loginDAO.findAllUsers(); if (findAllUsers != null && findAllUsers.size() > 0) { for (User user : findAllUsers) { userCollection.getUsers().add(user); } } } } catch (Exception ex) { log.error("User:Search - Error during user search.", ex); throw new RepositorySearchException(ex, criteria); } log.debug("User:Search - Returning back {} of results.", userCollection.getUsers().size()); return userCollection; } @Override @RequiresPermissions("users:retrieve") public User retrieve(UserLocator locator) { if( locator == null || locator.id == null ) { return null; } log.debug("User:Retrieve - Got request to retrieve user with id {}.", locator.id); try (LoginDAO loginDAO = MyJdbi.authz()) { User user = loginDAO.findUserById(locator.id); if (user != null) { return user; } } catch (Exception ex) { log.error("User:Retrieve - Error during user search.", ex); throw new RepositoryRetrieveException(ex, locator); } return null; } @Override @RequiresPermissions("users:store") public void store(User item) { log.debug("User:Store - Got request to update user with id {}.", item.getId().toString()); UserLocator locator = new UserLocator(); // will be used if we need to throw an exception locator.id = item.getId(); try (LoginDAO loginDAO = MyJdbi.authz()) { User user = loginDAO.findUserById(item.getId()); if (user != null) { user.setComment(item.getComment()); if (item.getLocale() != null) user.setLocale(item.getLocale()); loginDAO.updateUser(user.getId(), LocaleUtil.toLanguageTag(user.getLocale()), user.getComment()); log.debug("User:Store - Updated the user {} successfully.", user.getUsername()); } else { log.error("User:Store - User will not be updated since it does not exist."); throw new RepositoryStoreConflictException(locator); } } catch(RepositoryException re) { throw re; } catch (Exception ex) { log.error("User:Store - Error during user update.", ex); throw new RepositoryStoreException(ex, locator); } } @Override public void create(User item) { log.debug("User:Create - Got request to create a new user {}.", item.getUsername()); UserLocator locator = new UserLocator(); // will be used if we need to throw an exception locator.id = item.getId(); try (LoginDAO loginDAO = MyJdbi.authz()) { User user = loginDAO.findUserByName(item.getUsername()); if (user == null) { user = new User(); user.setId(item.getId()); user.setUsername(item.getUsername()); user.setComment(item.getComment()); String localeTag = null; if (item.getLocale() != null) localeTag = LocaleUtil.toLanguageTag(item.getLocale()); loginDAO.insertUser(user.getId(), user.getUsername(), localeTag, user.getComment()); log.debug("User:Create - Created the user {} successfully.", item.getUsername()); } else { log.error("User:Create - User {} will not be created since a duplicate user already exists.", item.getUsername()); throw new RepositoryCreateConflictException(locator); } } catch (RepositoryException re) { throw re; } catch (Exception ex) { log.error("User:Create - Error during user creation.", ex); throw new RepositoryCreateException(ex, locator); } } @Override @RequiresPermissions("users:delete") public void delete(UserLocator locator) { if( locator == null || locator.id == null ) { return; } log.debug("User:Delete - Got request to delete user with id {}.", locator.id.toString()); try (LoginDAO loginDAO = MyJdbi.authz()) { User user = loginDAO.findUserById(locator.id); if (user != null ) { // First we need to delete the user's associated logins (certificate/password/hmac) UserLoginCertificateRepository certRepo = new UserLoginCertificateRepository(); UserLoginCertificateFilterCriteria certCriteria = new UserLoginCertificateFilterCriteria(); certCriteria.userUuid = user.getId(); certRepo.delete(certCriteria); log.debug("User:Delete - Deleted the user {} login certificate entries successfully.", user.getUsername()); UserLoginPasswordRepository passwordRepo = new UserLoginPasswordRepository(); UserLoginPasswordFilterCriteria passwordCriteria = new UserLoginPasswordFilterCriteria(); passwordCriteria.userUuid = user.getId(); passwordRepo.delete(passwordCriteria); log.debug("User:Delete - Deleted the user {} login password entries successfully.", user.getUsername()); loginDAO.deleteUser(locator.id); log.debug("User:Delete - Deleted the user {} successfully.", user.getUsername()); } else { log.info("User:Delete - User does not exist in the system."); } } catch (Exception ex) { log.error("User:Delete - Error during user deletion.", ex); throw new RepositoryDeleteException(ex, locator); } } @Override public void delete(UserFilterCriteria criteria) { log.debug("User:Delete - Got request to delete user by search criteria."); UserCollection objCollection = search(criteria); try { for (User obj : objCollection.getUsers()) { UserLocator locator = new UserLocator(); locator.id = obj.getId(); delete(locator); } } catch(RepositoryException re) { throw re; } catch (Exception ex) { log.error("User:Delete - Error during User deletion.", ex); throw new RepositoryDeleteException(ex); } } }