org.sakaiproject.signup.dao.SignupMeetingDaoImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.sakaiproject.signup.dao.SignupMeetingDaoImpl.java

Source

/*
* Licensed to The Apereo Foundation under one or more contributor license
* agreements. See the NOTICE file distributed with this work for
* additional information regarding copyright ownership.
*
* The Apereo Foundation licenses this file to you under the Educational 
* Community License, Version 2.0 (the "License"); you may not use this file 
* except in compliance with the License. You may obtain a copy of the 
* License at:
*
* http://opensource.org/licenses/ecl2.txt
* 
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.sakaiproject.signup.dao;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.sakaiproject.genericdao.hibernate.HibernateGeneralGenericDao;
import org.sakaiproject.signup.model.SignupMeeting;
import org.sakaiproject.signup.model.SignupTimeslot;
import org.springframework.dao.DataAccessException;

/**
 * <p>
 * SignupMeetingServiceImpl is an implementation of SignupMeetingDao interface,
 * which provides methods to access the database storage for retrieving,
 * creating, updating and removing SignupMeeting objects.
 * 
 * @author Peter Liu
 * 
 * </p>
 */
public class SignupMeetingDaoImpl extends HibernateGeneralGenericDao implements SignupMeetingDao {

    private static Log log = LogFactory.getLog(SignupMeetingDaoImpl.class);

    public void init() {
        log.debug("init");
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    public List<SignupMeeting> getAllSignupMeetings(String siteId) {
        DetachedCriteria criteria = DetachedCriteria.forClass(SignupMeeting.class).addOrder(Order.asc("startTime"))
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).createCriteria("signupSites")
                .add(Restrictions.eq("siteId", siteId));
        return (List<SignupMeeting>) getHibernateTemplate().findByCriteria(criteria);
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    public List<SignupMeeting> getSignupMeetings(String siteId, Date searchEndDate) {
        DetachedCriteria criteria = DetachedCriteria.forClass(SignupMeeting.class)
                .add(Restrictions.le("startTime", searchEndDate)).addOrder(Order.asc("startTime"))
                .createCriteria("signupSites").add(Restrictions.eq("siteId", siteId));

        return (List<SignupMeeting>) getHibernateTemplate().findByCriteria(criteria);
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    public List<SignupMeeting> getSignupMeetings(String siteId, Date startDate, Date endDate) {
        DetachedCriteria criteria = DetachedCriteria.forClass(SignupMeeting.class)
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).add(Restrictions.ge("endTime", startDate))
                .add(Restrictions.lt("startTime", endDate)).addOrder(Order.asc("startTime"))
                .createCriteria("signupSites").add(Restrictions.eq("siteId", siteId));

        return (List<SignupMeeting>) getHibernateTemplate().findByCriteria(criteria);
    }

    @SuppressWarnings("unchecked")
    public List<SignupMeeting> getSignupMeetingsInSite(String siteId, Date startDate, Date endDate) {
        DetachedCriteria criteria = DetachedCriteria.forClass(SignupMeeting.class)
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).add(Restrictions.ge("endTime", startDate))
                .add(Restrictions.lt("startTime", endDate)).addOrder(Order.asc("startTime"))
                .createCriteria("signupSites").add(Restrictions.eq("siteId", siteId));

        return (List<SignupMeeting>) getHibernateTemplate().findByCriteria(criteria);
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    public List<SignupMeeting> getSignupMeetingsInSites(List<String> siteIds, Date startDate, Date endDate) {
        DetachedCriteria criteria = DetachedCriteria.forClass(SignupMeeting.class)
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).add(Restrictions.ge("endTime", startDate))
                .add(Restrictions.lt("startTime", endDate)).addOrder(Order.asc("startTime"))
                .createCriteria("signupSites").add(Restrictions.in("siteId", siteIds));

        return (List<SignupMeeting>) getHibernateTemplate().findByCriteria(criteria);
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    public List<SignupMeeting> getRecurringSignupMeetings(String siteId, Long recurrenceId, Date currentTime) {
        DetachedCriteria criteria = DetachedCriteria.forClass(SignupMeeting.class)
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
                .add(Restrictions.eq("recurrenceId", recurrenceId)).add(Restrictions.gt("endTime", currentTime))
                .addOrder(Order.asc("startTime")).createCriteria("signupSites")
                .add(Restrictions.eq("siteId", siteId));

        return (List<SignupMeeting>) getHibernateTemplate().findByCriteria(criteria);
    }

    /**
     * {@inheritDoc}
     */
    public Long saveMeeting(SignupMeeting signupMeeting) {
        return (Long) getHibernateTemplate().save(signupMeeting);
    }

    /**
     * {@inheritDoc}
     */
    public void saveMeetings(List<SignupMeeting> signupMeetings) {
        if (signupMeetings != null && signupMeetings.size() > 0) {
            SignupMeeting sm = (SignupMeeting) signupMeetings.get(0);
            if (sm.isRecurredMeeting()) {
                Long reRecurId = (Long) getHibernateTemplate().save(sm);
                /*
                 * use the first unique meeting id as the reRecurId for all
                 * recurring meetings
                 */
                for (SignupMeeting sMeeting : signupMeetings) {
                    sMeeting.setRecurrenceId(reRecurId);
                }

            }
            for (SignupMeeting signupMeeting : signupMeetings) {
                getHibernateTemplate().saveOrUpdate(signupMeeting);
            }
        }

    }

    /**
     * {@inheritDoc}
     */
    public SignupMeeting loadSignupMeeting(Long meetingId) {
        DetachedCriteria criteria = DetachedCriteria.forClass(SignupMeeting.class)
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).add(Restrictions.eq("id", meetingId));
        List<SignupMeeting> ls = (List<SignupMeeting>) getHibernateTemplate().findByCriteria(criteria);
        if (ls == null || ls.isEmpty())
            return null;

        return (SignupMeeting) ls.get(0);

    }

    /**
     * {@inheritDoc}
     */
    public void updateMeeting(SignupMeeting meeting) throws DataAccessException {
        getHibernateTemplate().update(meeting);

    }

    /**
     * {@inheritDoc}
     */
    public void updateMeetings(List<SignupMeeting> meetings) throws DataAccessException {
        for (SignupMeeting meeting : meetings) {
            getHibernateTemplate().saveOrUpdate(meeting);
        }
    }

    /**
     * {@inheritDoc}
     */
    public void updateModifiedMeetings(List<SignupMeeting> meetings, List<SignupTimeslot> removedTimeslots)
            throws DataAccessException {
        for (SignupMeeting meeting : meetings) {
            getHibernateTemplate().saveOrUpdate(meeting);
        }

        /*remove the deleted timeslot and related attendees/wait-list people*/
        if (removedTimeslots != null && removedTimeslots.size() > 0) {
            for (SignupTimeslot ts : removedTimeslots) {
                long tsId = ts.getId();
                SignupTimeslot sTimeslot = loadSignupTimeslot(tsId);
                getHibernateTemplate().delete(sTimeslot);
            }
        }

    }

    private SignupTimeslot loadSignupTimeslot(Long timeslotId) {
        DetachedCriteria criteria = DetachedCriteria.forClass(SignupTimeslot.class)
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).add(Restrictions.eq("id", timeslotId));
        List ls = getHibernateTemplate().findByCriteria(criteria);
        if (ls == null || ls.isEmpty())
            return null;

        return (SignupTimeslot) ls.get(0);

    }

    /**
     * {@inheritDoc}
     */
    public void removeMeetings(List<SignupMeeting> meetings) {
        getHibernateTemplate().deleteAll(meetings);

    }

    /**
     * {@inheritDoc}
     */
    public boolean isEventExisted(Long eventId) {
        //TODO need test with lazy loading
        SignupMeeting ls = loadSignupMeeting(eventId);
        if (ls == null)
            return false;

        return true;
    }

    /**
     * {@inheritDoc}
     */
    public int getAutoReminderTotalEventCounts(Date startDate, Date endDate) {
        DetachedCriteria criteria = DetachedCriteria.forClass(SignupMeeting.class)
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).add(Restrictions.eq("autoReminder", true))
                .add(Restrictions.between("startTime", startDate, endDate)).setProjection(Projections.rowCount());

        List ls = getHibernateTemplate().findByCriteria(criteria);
        if (ls == null || ls.isEmpty())
            return 0;

        Integer rowCount = (Integer) ls.get(0);

        return rowCount != null ? rowCount.intValue() : 0;
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    public List<SignupMeeting> getAutoReminderSignupMeetings(Date startDate, Date endDate) {
        DetachedCriteria criteria = DetachedCriteria.forClass(SignupMeeting.class)
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).add(Restrictions.eq("autoReminder", true))
                //.add(Restrictions.between("startTime", startDate, endDate))
                .add(Restrictions.le("startTime", endDate)).add(Restrictions.ge("endTime", startDate))
                .addOrder(Order.asc("startTime"));

        return (List<SignupMeeting>) getHibernateTemplate().findByCriteria(criteria);
    }

    @Override
    public List<String> getAllCategories(String siteId) throws DataAccessException {
        DetachedCriteria criteria = DetachedCriteria.forClass(SignupMeeting.class)
                .setProjection(Projections
                        .distinct(Projections.projectionList().add(Projections.property("category"), "category")))
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).addOrder(Order.asc("category"))
                .createCriteria("signupSites").add(Restrictions.eq("siteId", siteId));

        List<String> categorys = (List<String>) getHibernateTemplate().findByCriteria(criteria);

        if (categorys != null && !categorys.isEmpty()) {
            return categorys;
        }

        return null;
    }

    @Override
    public List<String> getAllLocations(String siteId) throws DataAccessException {
        DetachedCriteria criteria = DetachedCriteria.forClass(SignupMeeting.class)
                .setProjection(Projections
                        .distinct(Projections.projectionList().add(Projections.property("location"), "location")))
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).addOrder(Order.asc("location"))
                .createCriteria("signupSites").add(Restrictions.eq("siteId", siteId));

        List<String> locations = (List<String>) getHibernateTemplate().findByCriteria(criteria);

        if (locations != null && !locations.isEmpty()) {
            return locations;
        }

        return null;
    }

}