package com.iambookmaster.server.dao;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.users.User;
import com.iambookmaster.server.beans.JPAUser;
public class UsersDAO {
private static final Logger log = Logger.getLogger(UsersDAO.class.getName());
private static final String SELECT_USERS="SELECT from "+JPAUser.class.getName();
private static final String SELECT_USERS_WHERE=SELECT_USERS+" WHERE ";
@SuppressWarnings("unchecked")
public JPAUser findUserByEmail(PersistenceManager em, String email) {
Query query = em.newQuery(Query.JDOQL,"SELECT from "+JPAUser.class.getName()+" WHERE email==_email");
query.declareParameters("String _email");
List<JPAUser> list = (List<JPAUser>)query.execute(email);
if (list.size()>0) {
return list.get(0);
} else {
return null;
}
}
public JPAUser findOrCreateUser(PersistenceManager em, User usr) {
JPAUser user = findUserByEmail(em, usr.getEmail());
if (user==null) {
em.currentTransaction().begin();
user = em.newInstance(JPAUser.class);
user.setEmail(usr.getEmail());
user.setNick(usr.getNickname());
em.makePersistent(user);
em.currentTransaction().commit();
em.flush();
log.log(Level.INFO,"New user "+usr.getEmail());
}
return user;
}
@SuppressWarnings("unchecked")
public List<JPAUser> selectUsers(PersistenceManager em, UserCriteria criteria) {
StringBuffer buffer = new StringBuffer(SELECT_USERS_WHERE);
Query query;
int par= applyCriteria(criteria,buffer,null,null);
if (par>0) {
Object[] params= new Object[par];
query = em.newQuery(Query.JDOQL,buffer.toString());
applyCriteria(criteria,null,query,params);
return (List<JPAUser>)query.executeWithArray(params);
} else {
return (List<JPAUser>)em.newQuery(Query.JDOQL,SELECT_USERS).execute();
}
}
private int applyCriteria(UserCriteria criteria, StringBuffer buffer,Query query,Object[] params) {
StringBuffer importStr=null;
StringBuffer paramStr=null;
if (query != null) {
importStr = new StringBuffer();
paramStr = new StringBuffer();
}
int param=0;
if (criteria.getEmail() != null) {
if (buffer != null) {
buffer.append("email==_email");
}
if (query != null) {
//append import and parameters
paramStr.append("String _email");
params[param]=criteria.getEmail();
}
param++;
}
if (criteria.getName() != null) {
if (buffer != null) {
if (param>0) {
buffer.append(" && ");
}
buffer.append("nick==_nick");
}
if (query != null) {
//append import and parameters
if (paramStr.length()>0) {
paramStr.append(',');
}
paramStr.append("String _nick");
params[param]=criteria.getName();
}
param++;
}
if (criteria.getId() != null) {
if (buffer != null) {
if (param>0) {
buffer.append(" && ");
}
buffer.append("id==_id");
}
if (query != null) {
//append import and parameters
if (paramStr.length()>0) {
paramStr.append(',');
}
paramStr.append("Key _id");
if (importStr.length()>0) {
importStr.append(',');
}
importStr.append(Key.class.getName());
params[param]=criteria.getId();
}
param++;
}
if (param>0 && query != null) {
if (importStr.length()>0) {
importStr.insert(0,"import ");
query.declareImports(importStr.toString());
}
query.declareParameters(paramStr.toString());
}
return param;
}
public void remove(PersistenceManager em, JPAUser user) {
em.currentTransaction().begin();
DAO.getBookDAO().removeAllUserBooks(em, user);
em.deletePersistent(user);
em.currentTransaction().commit();
em.flush();
}
public void lock(PersistenceManager em, JPAUser user, boolean lock) {
user.setLocked(lock);
}
}