Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package it.unitn.elisco.dao; import it.unitn.elisco.bean.hibernate.Administrator; import it.unitn.elisco.bean.ajax.PersonBasics; import it.unitn.elisco.bean.hibernate.Course; import it.unitn.elisco.bean.hibernate.Student; import it.unitn.elisco.utils.HibernateUtil; import it.unitn.elisco.utils.Utilities; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.transform.Transformers; /** * * @author Andrea Marcolin */ public class AdministratorDAO extends DAO<Administrator, Long> { public void saveAdministrator(String email, String password, String name, String surname, boolean isSysAdmin) { Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); if (findAdministrator(s, email) == null) { insertAdministrator(s, email, password, name, surname, isSysAdmin); } tx.commit(); s.close(); } public Administrator getAdministrator(String email) { Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); Administrator res = findAdministrator(s, email); tx.commit(); s.close(); return res; } public Administrator getAdministrator(Long id) { Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); Administrator res = getByPrimarykey(s, Administrator.class, id); tx.commit(); s.close(); return res; } public Administrator loginAdministrator(String email, String password) { Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); Administrator admin = findAdministrator(s, email); tx.commit(); s.close(); // To allow login, admin with such email should exist, and password should match return (admin != null && Utilities.checkPassword(password, admin)) ? admin : null; } public void nominateAdministrator(Student student, boolean sysAdmin) { StudentDAO sdao = new StudentDAO(); Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); // Delete course subscriptions to courses for student s.createQuery("DELETE FROM Student_Course WHERE student= :student").setEntity("student", student) .executeUpdate(); s.flush(); // Delete the student sdao.delete(s, student); s.flush(); // Then, insert the person as administrator insertAdministrator(s, student.getEmail(), student.getPassword(), student.getName(), student.getSurname(), sysAdmin); tx.commit(); s.close(); } public void nominateSysAdminFromCourseAdmin(Administrator courseAdmin) { Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); courseAdmin.setIsSysAdmin(true); s.update(courseAdmin); tx.commit(); s.close(); } public List<PersonBasics> findCourseAdmins(String emailLike) { Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); // Fetch admins: // - which are course admin (isSysAdmin is false) // - which email begins with the specified query (optional, otherwise return all admins) Criteria criteria = s.createCriteria(Administrator.class); criteria.add(Restrictions.eq("isSysAdmin", false)); if (emailLike != null && emailLike != "") { criteria.add(Restrictions.like("email", emailLike, MatchMode.START)); } // Then return results as PersonBasics objects criteria.setProjection(Projections.projectionList().add(Projections.property("name"), "name") .add(Projections.property("surname"), "surname").add(Projections.property("email"), "email")); criteria.setResultTransformer(Transformers.aliasToBean(PersonBasics.class)); List<PersonBasics> res = criteria.list(); tx.commit(); s.close(); return res; } public List<PersonBasics> findSysAdmins(String emailLike) { Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); // Fetch admins: // - which are system admin (isSysAdmin is true) // - which email begins with the specified query (optional, otherwise return all admins) Criteria criteria = s.createCriteria(Administrator.class); criteria.add(Restrictions.eq("isSysAdmin", true)); if (emailLike != null && emailLike != "") { criteria.add(Restrictions.like("email", emailLike, MatchMode.START)); } // Then return results as PersonBasics objects criteria.setProjection(Projections.projectionList().add(Projections.property("name"), "name") .add(Projections.property("surname"), "surname").add(Projections.property("email"), "email")); criteria.setResultTransformer(Transformers.aliasToBean(PersonBasics.class)); List<PersonBasics> res = criteria.list(); tx.commit(); s.close(); return res; } public List<PersonBasics> findAllAdmins(String emailLike) { Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); // Fetch admins: // - which email begins with the specified query (optional, otherwise return all admins) Criteria criteria = s.createCriteria(Administrator.class); if (emailLike != null && emailLike != "") { criteria.add(Restrictions.like("email", emailLike, MatchMode.START)); } // Then return results as PersonBasics objects criteria.setProjection(Projections.projectionList().add(Projections.property("name"), "name") .add(Projections.property("surname"), "surname").add(Projections.property("email"), "email")); criteria.setResultTransformer(Transformers.aliasToBean(PersonBasics.class)); List<PersonBasics> res = criteria.list(); tx.commit(); s.close(); return res; } public void removeSysAdmin(Administrator admin) { Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); admin.setIsSysAdmin(false); s.update(admin); tx.commit(); s.close(); } public void removeAdmin(Administrator admin) { CourseDAO cdao = new CourseDAO(); Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); // First, delete from database the admin courses, then delete admin // This needs to be done because Administrator is not the managing side of the Course_Administrator relationship, // so we have to take care of the present associations manually // Admin courses are a lazy collection, we need to reattach admin to the session to get them s.update(admin); for (Course c : admin.getCourses()) { c.getAdmins().remove(admin); } delete(s, admin); tx.commit(); s.close(); } public boolean isSysAdminRemovable() { Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); List<Administrator> sysAdmins = s.createCriteria(Administrator.class) .add(Restrictions.eq("isSysAdmin", true)).list(); boolean res = (sysAdmins.size() > 1); tx.commit(); s.close(); return res; } public List<String> getAdminsEmails() { Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); // Fetch email addresses of all admins Criteria criteria = s.createCriteria(Administrator.class); criteria.setProjection(Projections.property("email")); List<String> res = criteria.list(); tx.commit(); s.close(); return res; } // Auxiliary Methods private void insertAdministrator(Session s, String email, String password, String name, String surname, boolean isSysAdmin) { Administrator admin = new Administrator(); admin.setEmail(email); admin.setPassword(password); admin.setName(name); admin.setSurname(surname); admin.setIsSysAdmin(isSysAdmin); insert(s, admin); } private Administrator findAdministrator(Session s, String email) { Criteria criteria = s.createCriteria(Administrator.class); return (Administrator) criteria.add(Restrictions.eq("email", email)).uniqueResult(); } }