package com.google.code.morphia.dao;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.DatastoreImpl;
import com.google.code.morphia.Key;
import com.google.code.morphia.Morphia;
import com.google.code.morphia.query.Query;
import com.google.code.morphia.query.QueryResults;
import com.google.code.morphia.query.UpdateOperations;
import com.google.code.morphia.query.UpdateResults;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import com.mongodb.WriteConcern;
import com.mongodb.WriteResult;/**
* @author Olafur Gauti Gudmundsson
* @author Scott Hernandez*/@SuppressWarnings({"unchecked", "rawtypes"})public class BasicDAO implements DAO{protected ClassentityClazz;protectedDatastoreImpl ds;public BasicDAO(ClassentityClass, Mongo mongo, Morphia morphia, String dbName) {
initDS(mongo, morphia, dbName);
initType(entityClass);
}public BasicDAO(ClassentityClass, Datastore ds) {this.ds =(DatastoreImpl) ds;
initType(entityClass);
}/**
*
Only calls this from your derived class when you explicitly declare the generic types with concrete classes
*
* {@code class MyDao extends DAO}
*
**/
protectedBasicDAO(Mongo mongo, Morphia morphia, String dbName) {
initDS(mongo, morphia, dbName);
initType(((Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]));
}protectedBasicDAO(Datastore ds) {this.ds =(DatastoreImpl) ds;
initType(((Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]));
}protected void initType(Classtype) {this.entityClazz =type;
ds.getMapper().addMappedClass(type);
}protected voidinitDS(Mongo mon, Morphia mor, String db) {
ds= newDatastoreImpl(mor, mon, db);
}/**
* Converts from a List to their id values
*
* @param keys
* @return*/
protected List> keysToIds(List>keys) {
ArrayList ids= new ArrayList(keys.size() * 2);for (Keykey : keys)
ids.add(key.getId());returnids;
}/** The underlying collection for this DAO*/
publicDBCollection getCollection() {returnds.getCollection(entityClazz);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#createQuery()*/
public QuerycreateQuery() {returnds.createQuery(entityClazz);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#createUpdateOperations()*/
public UpdateOperationscreateUpdateOperations() {returnds.createUpdateOperations(entityClazz);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#getEntityClass()*/
public ClassgetEntityClass() {returnentityClazz;
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#save(T)*/
public Keysave(T entity) {returnds.save(entity);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#save(T, com.mongodb.WriteConcern)*/
public Keysave(T entity, WriteConcern wc) {returnds.save(entity, wc);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#updateFirst(com.google.code.morphia.query.Query, com.google.code.morphia.query.UpdateOperations)*/
public UpdateResults updateFirst(Query q, UpdateOperationsops) {returnds.updateFirst(q, ops);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#update(com.google.code.morphia.query.Query, com.google.code.morphia.query.UpdateOperations)*/
public UpdateResults update(Query q, UpdateOperationsops) {returnds.update(q, ops);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#delete(T)*/
publicWriteResult delete(T entity) {returnds.delete(entity);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#delete(T, com.mongodb.WriteConcern)*/
publicWriteResult delete(T entity, WriteConcern wc) {returnds.delete(entity, wc);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#deleteById(K)*/
publicWriteResult deleteById(K id) {returnds.delete(entityClazz, id);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#deleteByQuery(com.google.code.morphia.query.Query)*/
public WriteResult deleteByQuery(Queryq) {returnds.delete(q);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#get(K)*/
public T get(K id) {return ds.get(entityClazz, id);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#findIds(java.lang.String, java.lang.Object)*/
public ListfindIds(String key, Object value) {return (List) keysToIds(ds.find(entityClazz, key, value).asKeyList());
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#findIds()*/
public ListfindIds() {return (List) keysToIds(ds.find(entityClazz).asKeyList());
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#findIds(com.google.code.morphia.query.Query)*/
public List findIds(Queryq) {return (List) keysToIds(q.asKeyList());
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#exists(java.lang.String, java.lang.Object)*/
publicboolean exists(String key, Object value) {returnexists(ds.find(entityClazz, key, value));
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#exists(com.google.code.morphia.query.Query)*/
public boolean exists(Queryq) {return ds.getCount(q) > 0;
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#count()*/
public longcount() {returnds.getCount(entityClazz);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#count(java.lang.String, java.lang.Object)*/
public longcount(String key, Object value) {returncount(ds.find(entityClazz, key, value));
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#count(com.google.code.morphia.query.Query)*/
public long count(Queryq) {returnds.getCount(q);
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#findOne(java.lang.String, java.lang.Object)*/
publicT findOne(String key, Object value) {return ds.find(entityClazz, key, value).get();
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#findOne(com.google.code.morphia.query.Query)*/
public T findOne(Queryq) {return q.get();
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#find()*/
public QueryResultsfind() {returncreateQuery();
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#find(com.google.code.morphia.query.Query)*/
public QueryResults find(Queryq) {returnq;
}/*(non-Javadoc)
* @see com.google.code.morphia.DAO#getDatastore()*/
publicDatastore getDatastore() {returnds;
}public voidensureIndexes() {
ds.ensureIndexes(entityClazz);
}
}