package com.anjlab.ping.services.dao.impl;
import static com.google.appengine.api.datastore.KeyFactory.createKey;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.anjlab.ping.entities.Job;
import com.anjlab.ping.services.dao.JobDAO;
import com.google.appengine.api.datastore.Key;
@SuppressWarnings("unchecked")
public class JobDAOImpl implements JobDAO {
private static final Logger logger = LoggerFactory.getLogger(JobDAOImpl.class);
@Inject
public EntityManager em;
@Override
public void setEntityManager(EntityManager em) {
this.em = em;
}
public List<Key> getJobsByCronString(String cronString) {
Query q = em.createQuery("SELECT j.key FROM Job j WHERE j.cronString = :cronString");
q.setParameter("cronString", cronString);
return q.getResultList();
}
public void update(Job job, boolean commitAfter) {
if (!em.getTransaction().isActive()){
// see Application#internalUpdateJob(Job)
logger.debug("Transaction is not active. Begin new one...");
// XXX Rewrite this to handle transactions more gracefully
em.getTransaction().begin();
}
em.merge(job);
if (commitAfter) {
em.getTransaction().commit();
}
}
public Job delete(Long id) {
Job job = internalGetJob(id);
if (job != null) {
em.remove(job);
}
return job;
}
private Job internalGetJob(Long id) {
Key jobKey = createKey(Job.class.getSimpleName(), id);
return em.find(Job.class, jobKey);
}
@Override
public Job find(Long id) {
return internalGetJob(id);
}
@Override
public Job find(Key jobKey) {
return em.find(Job.class, jobKey);
}
@Override
public List<Job> getAll() {
Query q = em.createQuery("SELECT FROM Job");
return q.getResultList();
}
@Override
public List<Job> findByScheduleName(String scheduleName) {
Query q = em.createQuery("SELECT FROM Job j WHERE j.scheduleName = :scheduleName").
setParameter("scheduleName", scheduleName);
return q.getResultList();
}
@Override
public Job createJob(Job job) {
em.persist(job);
return job;
}
@Override
public List<Job> findByPingURL(String pingURL) {
Query q = em.createQuery("SELECT FROM Job j WHERE j.pingURL = :pingURL").
setParameter("pingURL", pingURL);
return q.getResultList();
}
@Override
public void onAfterCommitNewJob(Job job) {
}
}