package play.utils.dao;
import java.util.List;
import javax.persistence.PersistenceException;
import play.utils.cache.CachedFinder;
import com.avaje.ebean.Expression;
import com.avaje.ebean.Page;
public class CachedDAO<K, M extends BasicModel<K>> implements DAO<K, M> {
protected final CachedFinder<K, M> find;
private Listeners<K, M> listeners = new Listeners<K, M>();
public CachedDAO(Class<K> keyClass, Class<M> modelClass) {
super();
this.find = new CachedFinder<K, M>(keyClass, modelClass);
}
public List<M> all() {
return find.all();
}
public K create(M m) {
listeners.beforeCreate(m);
m.save();
final K key = m.getKey();
find.put(key, m);
listeners.afterCreate(key, m);
return key;
}
public void remove(K key) throws EntityNotFoundException {
listeners.beforeRemove(key);
M ref = find.ref(key);
if (ref == null) throw new EntityNotFoundException(key);
try {
ref.delete();
} catch (PersistenceException e) {
throw new EntityNotFoundException(key, e);
}
find.clean(key);
listeners.afterRemove(key, ref);
}
public M get(K key) {
return find.byId(key);
}
public void update(M m) {
listeners.beforeUpdate( m);
m.update();
find.put(m.getKey(), m);
listeners.afterUpdate(m);
}
protected CachedFinder<K, M> find() {
return find;
}
@Override
public void addListener(DAOListener<K, M> l) {
listeners.add(l);
}
@Override
public Page<M> page(int page, int pageSize, String orderBy) {
return find.page(page, pageSize, orderBy);
}
@Override
public <F> Page<M> page(int page, int pageSize, String orderBy,
String filterField, F filterValue) {
return find.page(page, pageSize, orderBy, filterField, filterValue);
}
public Page<M> page(int page, int pageSize, String orderBy,
String cacheKey, Expression expression) {
return find.page(page, pageSize, orderBy, cacheKey, expression);
}
@Override
public void saveAssociation(M c, String association) {
c.saveManyToManyAssociations(association);
K key = c.getKey();
find().clean(key);
}
}