Subversion Repositories bacoAlunos

Rev

Rev 205 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.domain.dao.impl;

import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoUtils;
import pt.estgp.estgweb.services.common.ISearchResults;
import pt.estgp.estgweb.services.common.SearchTypeEnum;

import java.util.List;
import java.util.ArrayList;
import java.util.Date;

import static org.hibernate.criterion.Restrictions.*;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.Criteria;
import jomm.dao.impl.AbstractDao;
import jomm.utils.MyCalendar;


/**
 * @author Jorge Machado
 * @date 28/Fev/2008
 * @time 2:51:06
 * @see pt.estgp.estgweb.domain.dao.impl
 */

public class AnnouncementDaoImpl extends AnnouncementDao
{
    public static AnnouncementDaoImpl getInstance()
    {
        if (myInstance == null)
            myInstance = new AnnouncementDaoImpl();
        return (AnnouncementDaoImpl) myInstance;
    }

    public List<Announcement> findAnnouncements(int maxAnnouncements, List<String> roles, 1.5.0/docs/api/java/lang/String.html">String subTarget, boolean internal)
    {
        if (roles == null)
        {
            roles = new ArrayList<String>();
            roles.add("all");
        }
        Criteria criteria = createCriteria();
        Criterion co = null;
        for (1.5.0/docs/api/java/lang/String.html">String role : roles)
        {
            Criterion cor = like("targetRoles", "%" + role + "%");
            if (co == null)
                co = cor;
            else
                co = or(co, cor);
        }
        Criterion coSubTargets = null;

        if (subTarget == null)
        {
            coSubTargets = isNull("subTargets");
        }
        else
        {
            coSubTargets = eq("subTargets", subTarget);
        }
        if (!internal)
            criteria.add(eq("internal", false));
        MyCalendar cNow = new MyCalendar();
        MyCalendar calendarWithOutTime = new MyCalendar(cNow.getYear(), cNow.getMonth(), cNow.getDay());
        5+0%2Fdocs%2Fapi+Date">Date now = calendarWithOutTime.getTime();
        criteria.add(co)
                .add(or(or(lt("startDate", now), eq("startDate", now)), isNull("startDate")))
                .add(or(or(gt("expireDate", now), eq("expireDate", now)), isNull("expireDate")))
                .add(eq("status", true))
                .add(coSubTargets)
                .setMaxResults(maxAnnouncements)
                .addOrder(Order.desc("saveDate"));
        return criteria.list();
    }

    public List<Announcement> findAnnouncements(int maxAnnouncements, List<String> roles, 1.5.0/docs/api/java/lang/String.html">String type, 1.5.0/docs/api/java/lang/String.html">String subTarget, boolean internal)
    {
        return findAnnouncements(0, maxAnnouncements, roles, type, subTarget, internal);
    }

    public List<Announcement> findAnnouncements(int startPage, int maxAnnouncements, List<String> roles, 1.5.0/docs/api/java/lang/String.html">String type, 1.5.0/docs/api/java/lang/String.html">String subTarget, boolean internal)
    {
        Criteria criteria = createMaxAnnouncementsRolesTypeCriteria(maxAnnouncements, roles, type, subTarget, internal);
        return criteria.setFirstResult(maxAnnouncements * startPage).list();
    }

    public int countAnnouncements(int maxAnnouncements, List<String> roles, 1.5.0/docs/api/java/lang/String.html">String type, 1.5.0/docs/api/java/lang/String.html">String subTarget, boolean internal)
    {
        Criteria criteria = createMaxAnnouncementsRolesTypeCriteria(1.5.0/docs/api/java/lang/Integer.html">Integer.MAX_VALUE, roles, type, subTarget, internal);
        return criteria.list().size();
    }

    private Criteria createMaxAnnouncementsRolesTypeCriteria(int maxAnnouncements, List<String> roles, 1.5.0/docs/api/java/lang/String.html">String type, 1.5.0/docs/api/java/lang/String.html">String subTarget, boolean internal)
    {
        return createMaxAnnouncementsPageRolesTypeCriteria(0, maxAnnouncements, roles, type, subTarget, internal);
    }

    private Criteria createMaxAnnouncementsPageRolesTypeCriteria(int page, int maxAnnouncements, List<String> roles, 1.5.0/docs/api/java/lang/String.html">String type, 1.5.0/docs/api/java/lang/String.html">String subTarget, boolean internal)
    {
        return createRolesTypeCriteria(roles, type, subTarget, internal)
                .setFirstResult(page * maxAnnouncements)
                .setMaxResults(maxAnnouncements);
    }

    private Criteria createRolesTypeCriteria(List<String> roles, 1.5.0/docs/api/java/lang/String.html">String type, 1.5.0/docs/api/java/lang/String.html">String subTarget, boolean internal)
    {
        if (roles == null)
        {
            roles = new ArrayList<String>();
        }
        roles.add("all");
        Criteria criteria = createCriteria();
        Criterion coRole = null;
        for (1.5.0/docs/api/java/lang/String.html">String role : roles)
        {
            Criterion cor = like("targetRoles", "%" + role + "%");
            if (coRole == null)
                coRole = cor;
            else
                coRole = or(coRole, cor);
        }
        Criterion coSubTargets = null;

        if (subTarget == null)
        {
            coSubTargets = isNull("subTargets");
        }
        else
        {
            coSubTargets = eq("subTargets", subTarget);
        }
        if (type != null)
            criteria.add(eq("type", type));

        if (!internal)
            criteria.add(eq("internal", false));

        MyCalendar cNow = new MyCalendar();
        MyCalendar calendarWithOutTime = new MyCalendar(cNow.getYear(), cNow.getMonth(), cNow.getDay());
        5+0%2Fdocs%2Fapi+Date">Date now = calendarWithOutTime.getTime();
        criteria.add(coRole)
                .add(or(or(lt("startDate", now), eq("startDate", now)), isNull("startDate")))
                .add(or(or(gt("expireDate", now), eq("expireDate", now)), isNull("expireDate")))
                .add(eq("status", true))
                .add(coSubTargets)
                .addOrder(Order.desc("saveDate"));
        return criteria;
    }

    /* public static void main(String[] args)
    {
        AbstractDao.getCurrentSession().beginTransaction();
        List<String> roles = new ArrayList<String>();
        roles.add("student");
        roles.add("teacher");
        String typeNews="news";
        List<Announcement> as =  new AnnouncementDaoImpl().findAnnouncements(5,roles,typeNews);

        for(Announcement a : as)
        {
            GenericUser us = a.getOwner();
            List<String> userRoles=us.getOwnerRoles();
            for(String role:userRoles){
                System.out.println("--->"+role);
            }
            System.out.println(a.getSaveDate() + ":" + a.getTitle() + " " + a.getOwner().getName() );
        }
        AbstractDao.getCurrentSession().beginTransaction().commit();
    }*/


    public List<Announcement> searchAnnouncements(1.5.0/docs/api/java/lang/String.html">String query, SearchTypeEnum searchTypeEnum, int maxAnnouncements, int page, List<String> roles, 1.5.0/docs/api/java/lang/String.html">String subTarget, boolean internal)
    {
        Criterion c = createSearchQuery(query, searchTypeEnum);
        Criteria criteria = createMaxAnnouncementsPageRolesTypeCriteria(page, maxAnnouncements, roles, null, null, internal);
        criteria.add(c);
        return criteria.list();
    }

    public int countAnnouncements(1.5.0/docs/api/java/lang/String.html">String query, SearchTypeEnum searchTypeEnum, List<String> roles, 1.5.0/docs/api/java/lang/String.html">String subTarget, boolean internal)
    {

        Criterion c = createSearchQuery(query, searchTypeEnum);
        Criteria criteria = createRolesTypeCriteria(roles, null, null, internal);
        criteria.add(c);
        return criteria.list().size();
    }

    public Criterion createSearchQuery(1.5.0/docs/api/java/lang/String.html">String query, SearchTypeEnum searchTypeEnum)
    {
        return DaoUtils.createSearchQuery(query,searchTypeEnum,"text","title");
    }

    public List<AnnouncementImpl> loadOwnedAnnouncements(long ownerId)
    {
        return createCriteria().add(eq("owner.id", ownerId)).addOrder(Order.desc("updateDate")).list();
    }

   

    public List<Announcement> loadInvalidAnnouncements()
    {
        return createCriteria()
                .add(eq("status",false))
                .add(isNull("subTargets"))
                .addOrder(Order.asc("id")).list();
    }

}