package com.game.cloudymon.dal;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Logger;
import com.game.cloudymon.entity.AbstractEntity;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.api.memcache.MemcacheService;
import com.google.appengine.api.memcache.MemcacheServiceFactory;
public class EntityDAO
{
public static Logger logger = Logger.getLogger("EntityDAO");
public static FetchOptions fetchOptions = FetchOptions.Builder.withLimit(1000);
public static void addEntities(List<Entity> entities)
{
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
datastore.put(entities);
}
public static void addEntity(Entity entity)
{
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
datastore.put(entity);
}
public static void deleteEntity(Key key)
{
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
datastore.delete(key);
}
public static void deleteEntities(List<Key> keys)
{
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
datastore.delete(keys);
}
public static Entity getEntity(Query query)
{
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
PreparedQuery pq = ds.prepare(query);
if (pq.countEntities(fetchOptions) == 1)
{
return pq.asSingleEntity();
}
else
{
return pq.asList(fetchOptions).get(0);
}
}
public static List<Entity> getEntities(Query query)
{
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
PreparedQuery pq = ds.prepare(query);
return pq.asList(FetchOptions.Builder.withDefaults());
}
public static int deleteAllEntityKind(String simpleClassName)
{
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Query query = new Query(simpleClassName);
query.setKeysOnly();
PreparedQuery pq = datastore.prepare(query);
List<Key> keys = new ArrayList<Key>();
int deletedCount = 0;
while (true)
{
Iterator<Entity> items = pq.asIterator(FetchOptions.Builder.withLimit(1000));
if (!items.hasNext())
break;
keys.clear();
while (items.hasNext())
{
keys.add(items.next().getKey());
}
datastore.delete(keys);
deletedCount = deletedCount + keys.size();
}
return deletedCount;
}
@SuppressWarnings("rawtypes")
public static Object getObjByQuery(Class cls, Query query, String msNamespace, String msName)
{
Object obj = null;
if (msNamespace == null)
msNamespace = "EntityDAO";
if (msName == null)
msName = cls.getSimpleName() + query.toString();
MemcacheService ms = MemcacheServiceFactory.getMemcacheService(msNamespace);
if (ms.get(msName) != null)
{
obj = ms.get(msName);
}
else
{
try
{
Class<?> classDef = Class.forName(cls.getName());
obj = classDef.newInstance();
Method method = classDef.getMethod("fromEntity", com.google.appengine.api.datastore.Entity.class);
Entity entity = EntityDAO.getEntity(query);
method.invoke(obj, entity);
ms.put(msName, obj);
}
catch (Exception e)
{
e.printStackTrace();
}
}
return obj;
}
@SuppressWarnings("rawtypes")
public static Object getObjByName(Class cls, String name, String msNamespace, String msName)
{
Object obj = null;
if (msNamespace == null)
msNamespace = "EntityDAO";
if (msName == null)
msName = cls.getSimpleName() + name;
MemcacheService ms = MemcacheServiceFactory.getMemcacheService(msNamespace);
if (ms.get(msName) != null)
{
obj = ms.get(msName);
}
else
{
try
{
Query query = new Query(cls.getSimpleName());
query.addFilter("name", FilterOperator.EQUAL, name);
Class<?> classDef = Class.forName(cls.getName());
obj = classDef.newInstance();
Method method = classDef.getMethod("fromEntity", com.google.appengine.api.datastore.Entity.class);
Entity entity = EntityDAO.getEntity(query);
method.invoke(obj, entity);
ms.put(msName, obj);
}
catch (Exception e)
{
e.printStackTrace();
}
}
return obj;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List getAllObj(Class cls, String msNamespace, String msName)
{
List objs = null;
if (msNamespace == null)
msNamespace = "EntityDAO";
if (msName == null)
msName = "All" + cls.getSimpleName();
MemcacheService ms = MemcacheServiceFactory.getMemcacheService(msNamespace);
if (ms.get(msName) != null)
{
objs = (List)ms.get(msName);
}
else
{
try
{
Query query = new Query(cls.getSimpleName());
Class<?> classDef = Class.forName(cls.getName());
Method method = classDef.getMethod("fromEntity", com.google.appengine.api.datastore.Entity.class);
List<Entity> entities = EntityDAO.getEntities(query);
objs = new ArrayList();
for (Entity entity : entities)
{
Object obj = classDef.newInstance();
method.invoke(obj, entity);
objs.add(cls.cast(obj));
}
ms.put(msName, objs);
}
catch (Exception e)
{
e.printStackTrace();
}
}
return objs;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List getObjsByQuery(Class cls, Query query, String msNamespace, String msName)
{
List objs = null;
if (msNamespace == null)
msNamespace = "EntityDAO";
if (msName == null)
msName = "List" + cls.getSimpleName() + query.toString();
MemcacheService ms = MemcacheServiceFactory.getMemcacheService(msNamespace);
if (ms.get(msName) != null)
{
objs = (List)ms.get(msName);
}
else
{
try
{
Class<?> classDef = Class.forName(cls.getName());
Method method = classDef.getMethod("fromEntity", com.google.appengine.api.datastore.Entity.class);
List<Entity> entities = EntityDAO.getEntities(query);
objs = new ArrayList();
for (Entity entity : entities)
{
Object obj = classDef.newInstance();
method.invoke(obj, entity);
objs.add(cls.cast(obj));
}
ms.put(msName, objs);
}
catch (Exception e)
{
e.printStackTrace();
}
}
return objs;
}
public static void addAbstractEntity(AbstractEntity abstractEntity)
{
Entity entity = abstractEntity.toEntity();
addEntity(entity);
}
@SuppressWarnings("rawtypes")
public static void addAbstractEntities(List abstractEntities)
{
List<Entity> entities = new ArrayList<Entity>();
int len = abstractEntities.size();
for (int i = 0; i < len; i++)
{
AbstractEntity abstractEntity = (AbstractEntity)abstractEntities.get(i);
entities.add(abstractEntity.toEntity());
}
addEntities(entities);
}
}