/******************************************************************************* * Copyright 2011 Antti Havanko * * This file is part of Motiver.fi. * Motiver.fi is licensed under one open source license and one commercial license. * * Commercial license: This is the appropriate option if you want to use Motiver.fi in * commercial purposes. Contact license@motiver.fi for licensing options. * * Open source license: This is the appropriate option if you are creating an open source * application with a license compatible with the GNU GPL license v3. Although the GPLv3 has * many terms, the most important is that you must provide the source code of your application * to your users so they can be free to modify your application for their own needs. ******************************************************************************/ /** * */ package com.delect.motiver.server.servlet; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.delect.motiver.server.PMF; import com.delect.motiver.server.jdo.nutrition.MealJDO; import com.delect.motiver.server.jdo.nutrition.TimeJDO; import com.delect.motiver.server.cache.WeekCache; import com.delect.motiver.server.jdo.FoodNameCount; import com.delect.motiver.server.jdo.UserOpenid; import com.delect.motiver.server.jdo.nutrition.FoodJDO; import com.google.appengine.api.datastore.Key; import com.google.gwt.user.server.rpc.RemoteServiceServlet; public class FoodNameCountServlet extends RemoteServiceServlet { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(FoodNameCountServlet.class.getName()); private static final long serialVersionUID = 5384098111620397L; @SuppressWarnings("unchecked") @Override public void doGet(HttpServletRequest request, HttpServletResponse response) { PersistenceManager pm = PMF.get().getPersistenceManager(); WeekCache cache = new WeekCache(); response.setContentType("text/html"); try { //get users Query q = pm.newQuery(UserOpenid.class); List<UserOpenid> users = (List<UserOpenid>) q.execute(); for(UserOpenid user : users) { try { // response.getWriter().write(user.getEmail()+"<br>"); Hashtable<Long, Integer> tableFoods = new Hashtable<Long, Integer>(); //get times (in chunks) int countTimes = 0; while(true) { Query qT = pm.newQuery(TimeJDO.class); qT.setFilter("openId == openIdParam"); qT.declareParameters("java.lang.String openIdParam"); qT.setRange(countTimes, countTimes+100); List<TimeJDO> times = (List<TimeJDO>) qT.execute(user.getUid()); int s = times.size(); // response.getWriter().write("Times found: "+s+" ("+countTimes+")<br>"); if(s == 0) { break; } countTimes += s; //go through each workouts for(TimeJDO t : times) { for(FoodJDO f : t.getFoods()) { final long nameId = f.getNameId(); //if name found if(nameId > 0) { //if id found -> add one to count int count = 0; if(tableFoods.containsKey(nameId)) { count = tableFoods.get(nameId); } count++; tableFoods.put(nameId, count); } } //get foods List<Object> ids = new ArrayList<Object>(); for (Key key : t.getMealsKeys()) { ids.add(pm.newObjectIdInstance(MealJDO.class, key)); } List<MealJDO> meals = (List<MealJDO>) pm.getObjectsById(ids); for(MealJDO m : meals) { for(FoodJDO f : m.getFoods()) { final long nameId = f.getNameId(); //if name found if(nameId > 0) { //if id found -> add one to count int count = 0; if(tableFoods.containsKey(nameId)) { count = tableFoods.get(nameId); } count++; tableFoods.put(nameId, count); } } } } } //save each count to datastore List<FoodNameCount> counts = new ArrayList<FoodNameCount>(); Set<Long> set = tableFoods.keySet(); Iterator<Long> itr = set.iterator(); for(int i = 0; i < tableFoods.size(); i++) { Long nameId = itr.next(); // response.getWriter().write(" "+nameId + ": " + tableFoods.get(nameId)+"<br>"); //Create model int count = tableFoods.get(nameId); FoodNameCount model = new FoodNameCount(nameId, count, user.getUid()); counts.add(model); //update cache cache.addExerciseNameCount(nameId, user.getUid(), count); } pm.makePersistentAll(counts); pm.flush(); } catch (Exception e) { logger.log(Level.SEVERE, "Error loading data from user: "+user.getUid(), e); } } } catch (Exception e) { logger.log(Level.SEVERE, "Error loading data", e); } finally { if (!pm.isClosed()) { pm.close(); } } } }