package fi.otavanopisto.muikku.schooldata; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.enterprise.inject.Any; import javax.enterprise.inject.Instance; import javax.inject.Inject; import fi.otavanopisto.muikku.dao.base.SchoolDataSourceDAO; import fi.otavanopisto.muikku.dao.users.UserSchoolDataIdentifierDAO; import fi.otavanopisto.muikku.model.base.SchoolDataSource; import fi.otavanopisto.muikku.model.users.UserEntity; import fi.otavanopisto.muikku.model.users.UserSchoolDataIdentifier; import fi.otavanopisto.muikku.schooldata.entity.GroupUser; import fi.otavanopisto.muikku.schooldata.entity.GroupUserType; import fi.otavanopisto.muikku.schooldata.entity.Role; import fi.otavanopisto.muikku.schooldata.entity.User; import fi.otavanopisto.muikku.schooldata.entity.UserAddress; import fi.otavanopisto.muikku.schooldata.entity.UserEmail; import fi.otavanopisto.muikku.schooldata.entity.UserGroup; import fi.otavanopisto.muikku.schooldata.entity.UserPhoneNumber; import fi.otavanopisto.muikku.schooldata.entity.UserProperty; public class UserSchoolDataController { // TODO: Caching // TODO: Events @Inject private Logger logger; @Inject @Any private Instance<UserSchoolDataBridge> userBridges; @Inject private UserSchoolDataIdentifierDAO userSchoolDataIdentifierDAO; @Inject private SchoolDataSourceDAO schoolDataSourceDAO; /* User */ public User createUser(SchoolDataSource schoolDataSource, String firstName, String lastName) { UserSchoolDataBridge userBridge = getUserBridge(schoolDataSource); if (userBridge != null) { return userBridge.createUser(firstName, lastName); } return null; } public User findUser(SchoolDataSource schoolDataSource, String userIdentifier) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.findUser(userIdentifier); } return null; } public User findUser(String schoolDataSource, String userIdentifier) { SchoolDataSource dataSource = schoolDataSourceDAO.findByIdentifier(schoolDataSource); if (dataSource != null) { return findUser(dataSource, userIdentifier); } return null; } public User findActiveUser(SchoolDataSource schoolDataSource, String identifier) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.findActiveUser(identifier); } return null; } public List<User> listUsers() { // TODO: This method WILL cause performance problems, replace with something more sensible List<User> result = new ArrayList<User>(); for (UserSchoolDataBridge userBridge : getUserBridges()) { try { result.addAll(userBridge.listUsers()); } catch (SchoolDataBridgeInternalException e) { logger.log(Level.SEVERE, "School Data Bridge reported a problem while listing users", e); } } return result; } public List<User> listUsersByEntity(UserEntity userEntity) { List<User> result = new ArrayList<>(); List<UserSchoolDataIdentifier> identifiers = userSchoolDataIdentifierDAO.listByUserEntityAndArchived(userEntity, Boolean.FALSE); for (UserSchoolDataIdentifier identifier : identifiers) { UserSchoolDataBridge userBridge = getUserBridge(identifier.getDataSource()); User user = findUserByIdentifier(userBridge, identifier.getIdentifier()); if (user != null) { result.add(user); } } return result; } public List<User> listUsersByEmail(String email) { List<User> result = new ArrayList<User>(); for (UserSchoolDataBridge userBridge : getUserBridges()) { result.addAll(userBridge.listUsersByEmail(email)); } return result; } public List<User> listUsersByEmails(List<String> emails) { List<User> result = new ArrayList<>(); for (String email : emails) { List<User> users = listUsersByEmail(email); for (User user : users) { if (!userListContains(result, user)) { result.add(user); } } } return result; } private boolean userListContains(List<User> listUsers, User user) { for (User listUser : listUsers) { if (listUser.getSchoolDataSource().equals(user.getSchoolDataSource()) && listUser.getIdentifier().equals(user.getIdentifier())) { return true; } } return false; } /* User Entity */ public UserEntity findUserEntity(User user) { SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(user.getSchoolDataSource()); UserSchoolDataIdentifier userSchoolDataIdentifier = userSchoolDataIdentifierDAO.findByDataSourceAndIdentifierAndArchived(schoolDataSource, user.getIdentifier(), Boolean.FALSE); if (userSchoolDataIdentifier != null) { return userSchoolDataIdentifier.getUserEntity(); } return null; } public UserEntity findUserEntityByDataSourceAndIdentifier(SchoolDataSource dataSource, String identifier) { UserSchoolDataIdentifier userSchoolDataIdentifier = userSchoolDataIdentifierDAO.findByDataSourceAndIdentifierAndArchived(dataSource, identifier, Boolean.FALSE); if (userSchoolDataIdentifier != null) { return userSchoolDataIdentifier.getUserEntity(); } return null; } /* User Emails */ public List<UserEmail> listUserEmails(User user) { SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(user.getSchoolDataSource()); if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.listUserEmailsByUserIdentifier(user.getIdentifier()); } } return null; } public List<UserEmail> listUserEmails(SchoolDataIdentifier userIdentifier) { SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(userIdentifier.getDataSource()); if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.listUserEmailsByUserIdentifier(userIdentifier.getIdentifier()); } } return null; } public UserEmail findUserEmail(SchoolDataSource schoolDataSource, String identifier) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.findUserEmail(identifier); } return null; } /* User properties */ public UserProperty getUserProperty(User user, String key) { SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(user.getSchoolDataSource()); if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.getUserProperty(user.getIdentifier(), key); } } return null; } public UserProperty setUserProperty(User user, String key, String value) { SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(user.getSchoolDataSource()); if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.setUserProperty(user.getIdentifier(), key, value); } } return null; } /* Roles */ public Role findRole(SchoolDataSource schoolDataSource, String identifier) { UserSchoolDataBridge userBridge = getUserBridge(schoolDataSource); if (userBridge != null) { return userBridge.findRole(identifier); } else { logger.severe("Could not find userBridge for school data source " + schoolDataSource.getIdentifier()); } return null; } public List<Role> listRoles() { List<Role> result = new ArrayList<>(); for (UserSchoolDataBridge userBridge : getUserBridges()) { result.addAll(userBridge.listRoles()); } return result; } public Role findUserEnvironmentRole(User user) { SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(user.getSchoolDataSource()); if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.findUserEnvironmentRole(user.getIdentifier()); } } return null; } /* UserGroups */ public UserGroup findUserGroup(SchoolDataSource schoolDataSource, String identifier) { if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.findUserGroup(identifier); } } return null; } public List<UserGroup> listUserGroups(SchoolDataSource schoolDataSource) { if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.listUserGroups(); } } return null; } /* Group users */ public GroupUser findGroupUser(SchoolDataSource schoolDataSource, String groupIdentifier, String identifier) { if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.findGroupUser(groupIdentifier, identifier); } } return null; } public List<GroupUser> listGroupUsersByGroup(UserGroup userGroup){ SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(userGroup.getSchoolDataSource()); if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.listGroupUsersByGroup(userGroup.getIdentifier()); } } return null; } public List<GroupUser> listGroupUsersByGroupAndType(UserGroup userGroup, GroupUserType type){ SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(userGroup.getSchoolDataSource()); if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.listGroupUsersByGroupAndType(userGroup.getIdentifier(), type); } } return null; } public List<UserAddress> listUserAddressses(SchoolDataIdentifier userIdentifier){ SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(userIdentifier.getDataSource()); if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.listUserAddresses(userIdentifier); } } return null; } public void updateUser(User user) { SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(user.getSchoolDataSource()); if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { schoolDataBridge.updateUser(user); } } } public void updateUserAddress( SchoolDataIdentifier studentIdentifier, SchoolDataIdentifier addressIdentifier, String street, String postalCode, String city, String country ) throws SchoolDataBridgeUnauthorizedException { SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(addressIdentifier.getDataSource()); if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { schoolDataBridge.updateUserAddress( studentIdentifier, addressIdentifier, street, postalCode, city, country); } } } public List<UserPhoneNumber> listUserPhoneNumbers(SchoolDataIdentifier userIdentifier){ SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(userIdentifier.getDataSource()); if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.listUserPhoneNumbers(userIdentifier); } } return null; } private UserSchoolDataBridge getUserBridge(SchoolDataSource schoolDataSource) { Iterator<UserSchoolDataBridge> iterator = userBridges.iterator(); while (iterator.hasNext()) { UserSchoolDataBridge userSchoolDataBridge = iterator.next(); if (userSchoolDataBridge.getSchoolDataSource().equals(schoolDataSource.getIdentifier())) { return userSchoolDataBridge; } } return null; } private User findUserByIdentifier(UserSchoolDataBridge userBridge, String identifier) { return userBridge.findUser(identifier); } private List<UserSchoolDataBridge> getUserBridges() { List<UserSchoolDataBridge> result = new ArrayList<UserSchoolDataBridge>(); Iterator<UserSchoolDataBridge> iterator = userBridges.iterator(); while (iterator.hasNext()) { result.add(iterator.next()); } return Collections.unmodifiableList(result); } public String findUsername(User user) throws SchoolDataBridgeUnauthorizedException { SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(user.getSchoolDataSource()); if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.findUsername(user.getIdentifier()); } } return null; } public void updateUserCredentials(User user, String oldPassword, String newUsername, String newPassword) throws SchoolDataBridgeUnauthorizedException { SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(user.getSchoolDataSource()); if (schoolDataSource != null) { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { schoolDataBridge.updateUserCredentials(user.getIdentifier(), oldPassword, newUsername, newPassword); } } } public String requestPasswordResetByEmail(SchoolDataSource schoolDataSource, String email) throws SchoolDataBridgeUnauthorizedException { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.requestPasswordResetByEmail(email); } return null; } public boolean confirmResetPassword(SchoolDataSource schoolDataSource, String resetCode, String newPassword) throws SchoolDataBridgeUnauthorizedException { UserSchoolDataBridge schoolDataBridge = getUserBridge(schoolDataSource); if (schoolDataBridge != null) { return schoolDataBridge.confirmResetPassword(resetCode, newPassword); } return false; } }