it.unitn.elisco.dao.AdministratorDAO.java Source code

Java tutorial

Introduction

Here is the source code for it.unitn.elisco.dao.AdministratorDAO.java

Source

/*
 * 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();
    }
}