package play.utils.dao; import java.util.List; import com.avaje.ebean.Expression; import com.avaje.ebean.Page; import play.db.ebean.Model.Finder; public class BasicDAO<K, M extends BasicModel<K>> implements DAO<K, M> { protected final Finder<K, M> find; private Listeners<K, M> listeners = new Listeners<K, M>(); public BasicDAO(Finder<K, M> finder) { super(); this.find = finder; } public BasicDAO(Class<K> keyClass, Class<M> modelClass) { this(new Finder<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(); 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); ref.delete(); listeners.afterRemove(key, ref); } public M get(K key) { return find.byId(key); } public void update( M m) { listeners.beforeUpdate( m); m.update(); listeners.afterUpdate( m); } protected Finder<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.where().orderBy(orderBy).findPagingList(pageSize) .getPage(page); } @Override public <F> Page<M> page(int page, int pageSize, String orderBy, String filterField, F filterValue) { return find.where().eq(filterField, filterValue) .orderBy(orderBy).findPagingList(pageSize) .getPage(page); } public Page<M> page(int page, int pageSize, String orderBy, String cacheKey, Expression expression) { return find.where().add(expression) .orderBy(orderBy).findPagingList(pageSize) .getPage(page); } @Override public void saveAssociation(M c, String association) { c.saveManyToManyAssociations(association); } }