package org.sakaiproject.component.app.scheduler.events.hibernate; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.sakaiproject.scheduler.events.hibernate.TriggerEventHibernateImpl; import org.sakaiproject.api.app.scheduler.events.TriggerEvent; import org.sakaiproject.api.app.scheduler.events.TriggerEventManager; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import java.util.Date; import java.util.List; /** * Created by IntelliJ IDEA. * User: duffy * Date: Aug 26, 2010 * Time: 5:24:51 PM * To change this template use File | Settings | File Templates. */ public class TriggerEventManagerHibernateImpl extends HibernateDaoSupport implements TriggerEventManager { /* (non-Javadoc) * @see org.sakaiproject.api.app.scheduler.events.TriggerEventManager#createTriggerEvent(org.sakaiproject.api.app.scheduler.events.TriggerEvent.TRIGGER_EVENT_TYPE, java.lang.String, java.lang.String, java.util.Date, java.lang.String) */ public TriggerEvent createTriggerEvent(TriggerEvent.TRIGGER_EVENT_TYPE type, String jobName, String triggerName, Date time, String message) { return createTriggerEvent(type, jobName, triggerName, time, message, null); } /* (non-Javadoc) * @see org.sakaiproject.api.app.scheduler.events.TriggerEventManager#createTriggerEvent(org.sakaiproject.api.app.scheduler.events.TriggerEvent.TRIGGER_EVENT_TYPE, java.lang.String, java.lang.String, java.util.Date, java.lang.String, java.lang.String) */ public TriggerEvent createTriggerEvent(TriggerEvent.TRIGGER_EVENT_TYPE type, String jobName, String triggerName, Date time, String message, String serverId) { TriggerEventHibernateImpl event = new TriggerEventHibernateImpl(); event.setEventType(type); event.setJobName(jobName); event.setTriggerName(triggerName); event.setTime(time); event.setMessage(message); event.setServerId(serverId); getHibernateTemplate().save(event); return event; } public List<TriggerEvent> getTriggerEvents() { return getTriggerEvents(null, null, null, null, null); } public List<TriggerEvent> getTriggerEvents(int first, int size) { return getTriggerEvents(null, null, null, null, null, first, size); } public int getTriggerEventsSize() { return getTriggerEventsSize(null, null, null, null, null); } public int getTriggerEventsSize(Date after, Date before, List<String> jobs, String triggerName, TriggerEvent.TRIGGER_EVENT_TYPE[] types) { final Criteria criteria = buildCriteria(after, before, jobs, triggerName, types); criteria.setProjection(Projections.rowCount()); return (Integer) criteria.list().get(0); } public List<TriggerEvent> getTriggerEvents(Date after, Date before, List<String> jobs, String triggerName, TriggerEvent.TRIGGER_EVENT_TYPE[] types) { return getTriggerEvents(after, before, jobs, triggerName, types, null, null); } public List<TriggerEvent> getTriggerEvents(Date after, Date before, List<String> jobs, String triggerName, TriggerEvent.TRIGGER_EVENT_TYPE[] types, int first, int size) { return getTriggerEvents(after, before, jobs, triggerName, types, Integer.valueOf(first), Integer.valueOf(size)); } /** * Internal search for events. Applies the sort and optionally the limit/offset. */ protected List<TriggerEvent> getTriggerEvents(Date after, Date before, List<String> jobs, String triggerName, TriggerEvent.TRIGGER_EVENT_TYPE[] types, Integer first, Integer size) { final Criteria criteria = buildCriteria(after, before, jobs, triggerName, types); // We put the newest items first as generally that's what people are most interested in. criteria.addOrder(Order.desc("time")); if (first != null && size != null) { criteria.setFirstResult(first).setMaxResults(size); } return criteria.list(); } /** * Creates a criteria with all restrictions applied. */ protected Criteria buildCriteria(Date after, Date before, List<String> jobs, String triggerName, TriggerEvent.TRIGGER_EVENT_TYPE[] types) { final Session session = this.getSession(); final Criteria criteria = session.createCriteria(TriggerEventHibernateImpl.class); if (after != null) { criteria.add(Restrictions.ge("time", after)); } if (before != null) { criteria.add(Restrictions.le("time", before)); } if (jobs != null && !jobs.isEmpty()) { criteria.add(Restrictions.in("jobName", jobs)); } if (triggerName != null) { criteria.add(Restrictions.eq("triggerName", triggerName)); } if (types != null) { criteria.add(Restrictions.in("eventType", types)); } return criteria; } public void purgeEvents(Date before) { Query q = getSession().getNamedQuery("purgeEventsBefore"); q.setTimestamp(0, before); q.executeUpdate(); } }