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 com.anjlab.ping.entities.Account;
import com.anjlab.ping.entities.Ref;
import com.anjlab.ping.services.dao.RefDAO;
import com.google.appengine.api.datastore.Key;
@SuppressWarnings("unchecked")
public class RefDAOImpl implements RefDAO {
@Inject
private EntityManager em;
@Override
public Ref addRef(Account account, String scheduleName, int accessType) {
Ref ref = find(account, scheduleName);
if (ref != null) {
return ref;
}
ref = new Ref();
ref.setAccountKey(createKey(Account.class.getSimpleName(), account.getId()));
ref.setScheduleName(scheduleName);
ref.setAccessType(accessType);
em.persist(ref);
return ref;
}
@Override
public void removeRef(Long id) {
Query q = em.createQuery("SELECT r FROM Ref r WHERE r.id = :id").setParameter("id", id);
List<Ref> refs = q.getResultList();
if (! refs.isEmpty()) {
em.remove(refs.get(0));
}
}
@Override
public List<Ref> getRefs(String scheduleName) {
Query q = em.createQuery("SELECT r FROM Ref r WHERE r.scheduleName = :scheduleName");
q.setParameter("scheduleName", scheduleName);
return q.getResultList();
}
@Override
public List<Ref> getRefs(Account account) {
Query q = em.createQuery("SELECT r FROM Ref r WHERE r.accountKey = :key");
q.setParameter("key", createKey(Account.class.getSimpleName(), account.getId()));
return q.getResultList();
}
@Override
public Ref find(Account account, String scheduleName) {
Query q = em.createQuery("SELECT r FROM Ref r WHERE r.scheduleName = :scheduleName AND r.accountKey = :accountKey");
q.setParameter("scheduleName", scheduleName);
q.setParameter("accountKey", createKey(Account.class.getSimpleName(), account.getId()));
List<Ref> refs = q.getResultList();
return refs.isEmpty() ? null : refs.get(0);
}
public Ref find(Long id) {
Key key = createKey(Ref.class.getSimpleName(), id);
return em.find(Ref.class, key);
}
@Override
public List<Ref> getAll() {
return em.createQuery("SELECT FROM Ref").getResultList();
}
@Override
public void update(Ref ref) {
em.merge(ref);
}
}