package fi.otavanopisto.muikku.dao.users; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.Root; import javax.persistence.criteria.Subquery; import fi.otavanopisto.muikku.dao.CoreDAO; import fi.otavanopisto.muikku.model.base.SchoolDataSource; import fi.otavanopisto.muikku.model.users.UserEntity; import fi.otavanopisto.muikku.model.users.UserGroupEntity; import fi.otavanopisto.muikku.model.users.UserGroupEntity_; import fi.otavanopisto.muikku.model.users.UserGroupUserEntity; import fi.otavanopisto.muikku.model.users.UserGroupUserEntity_; import fi.otavanopisto.muikku.model.users.UserSchoolDataIdentifier; import fi.otavanopisto.muikku.model.users.UserSchoolDataIdentifier_; public class UserGroupUserEntityDAO extends CoreDAO<UserGroupUserEntity> { private static final long serialVersionUID = -2602347893195385174L; public UserGroupUserEntity create(UserGroupEntity userGroupEntity, SchoolDataSource schoolDataSource, String identifier, UserSchoolDataIdentifier userSchoolDataIdentifier, boolean archived ) { UserGroupUserEntity userGroupUser = new UserGroupUserEntity(); userGroupUser.setArchived(archived); userGroupUser.setSchoolDataSource(schoolDataSource); userGroupUser.setIdentifier(identifier); userGroupUser.setUserGroupEntity(userGroupEntity); userGroupUser.setUserSchoolDataIdentifier(userSchoolDataIdentifier); getEntityManager().persist(userGroupUser); return userGroupUser; } public UserGroupUserEntity findByDataSourceAndIdentifier(SchoolDataSource schoolDataSource, String identifier) { EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<UserGroupUserEntity> criteria = criteriaBuilder.createQuery(UserGroupUserEntity.class); Root<UserGroupUserEntity> root = criteria.from(UserGroupUserEntity.class); criteria.select(root); criteria.where( criteriaBuilder.and( criteriaBuilder.equal(root.get(UserGroupUserEntity_.schoolDataSource), schoolDataSource), criteriaBuilder.equal(root.get(UserGroupUserEntity_.identifier), identifier) ) ); return getSingleResult(entityManager.createQuery(criteria)); } public UserGroupUserEntity findByDataSourceAndIdentifierAndArchived(SchoolDataSource schoolDataSource, String identifier, Boolean archived) { EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<UserGroupUserEntity> criteria = criteriaBuilder.createQuery(UserGroupUserEntity.class); Root<UserGroupUserEntity> root = criteria.from(UserGroupUserEntity.class); criteria.select(root); criteria.where( criteriaBuilder.and( criteriaBuilder.equal(root.get(UserGroupUserEntity_.archived), archived), criteriaBuilder.equal(root.get(UserGroupUserEntity_.schoolDataSource), schoolDataSource), criteriaBuilder.equal(root.get(UserGroupUserEntity_.identifier), identifier) ) ); return getSingleResult(entityManager.createQuery(criteria)); } public List<UserGroupUserEntity> listByUserGroupEntityAndArchived(UserGroupEntity userGroupEntity, Boolean archived) { EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<UserGroupUserEntity> criteria = criteriaBuilder.createQuery(UserGroupUserEntity.class); Root<UserGroupUserEntity> root = criteria.from(UserGroupUserEntity.class); criteria.select(root); criteria.where( criteriaBuilder.and( criteriaBuilder.equal(root.get(UserGroupUserEntity_.userGroupEntity), userGroupEntity), criteriaBuilder.equal(root.get(UserGroupUserEntity_.archived), archived) ) ); return entityManager.createQuery(criteria).getResultList(); } public List<UserGroupUserEntity> listByUserSchoolDataIdentifier(UserSchoolDataIdentifier userSchoolDataIdentifier) { EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<UserGroupUserEntity> criteria = criteriaBuilder.createQuery(UserGroupUserEntity.class); Root<UserGroupUserEntity> root = criteria.from(UserGroupUserEntity.class); criteria.select(root); criteria.where( criteriaBuilder.and( criteriaBuilder.equal(root.get(UserGroupUserEntity_.userSchoolDataIdentifier), userSchoolDataIdentifier) ) ); return entityManager.createQuery(criteria).getResultList(); } public UserGroupUserEntity updateArchived(UserGroupUserEntity userGroupUserEntity, Boolean archived) { userGroupUserEntity.setArchived(archived); return persist(userGroupUserEntity); } public UserGroupUserEntity updateUserSchoolDataIdentifier(UserGroupUserEntity userGroupUserEntity, UserSchoolDataIdentifier userSchoolDataIdentifier) { userGroupUserEntity.setUserSchoolDataIdentifier(userSchoolDataIdentifier); return persist(userGroupUserEntity); } public UserGroupUserEntity updateUserGroupEntity(UserGroupUserEntity userGroupUserEntity, UserGroupEntity userGroupEntity) { userGroupUserEntity.setUserGroupEntity(userGroupEntity); return persist(userGroupUserEntity); } public void delete(UserGroupUserEntity userGroupUserEntity) { super.delete(userGroupUserEntity); } public boolean haveSharedUserGroups(UserEntity user1, UserEntity user2) { EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<Long> criteria = criteriaBuilder.createQuery(Long.class); Root<UserGroupEntity> root = criteria.from(UserGroupEntity.class); Subquery<UserGroupEntity> user1Groups = criteria.subquery(UserGroupEntity.class); Subquery<UserGroupEntity> user2Groups = criteria.subquery(UserGroupEntity.class); Root<UserGroupUserEntity> user1Root = user1Groups.from(UserGroupUserEntity.class); Join<UserGroupUserEntity, UserSchoolDataIdentifier> user1Identifier = user1Root.join(UserGroupUserEntity_.userSchoolDataIdentifier); Root<UserGroupUserEntity> user2Root = user2Groups.from(UserGroupUserEntity.class); Join<UserGroupUserEntity, UserSchoolDataIdentifier> user2Identifier = user2Root.join(UserGroupUserEntity_.userSchoolDataIdentifier); user1Groups.select(user1Root.get(UserGroupUserEntity_.userGroupEntity)); user2Groups.select(user2Root.get(UserGroupUserEntity_.userGroupEntity)); user1Groups.where( criteriaBuilder.and( criteriaBuilder.equal(user1Identifier.get(UserSchoolDataIdentifier_.userEntity), user1), criteriaBuilder.equal(user1Root.get(UserGroupUserEntity_.archived), Boolean.FALSE) ) ); user2Groups.where( criteriaBuilder.and( criteriaBuilder.equal(user2Identifier.get(UserSchoolDataIdentifier_.userEntity), user2), criteriaBuilder.equal(user2Root.get(UserGroupUserEntity_.archived), Boolean.FALSE) ) ); criteria.select(criteriaBuilder.count(root)); criteria.where( criteriaBuilder.and( root.in(user1Groups), root.in(user2Groups), criteriaBuilder.equal(root.get(UserGroupEntity_.archived), Boolean.FALSE) ) ); return entityManager.createQuery(criteria).getSingleResult() > 0; } }