/*******************************************************************************
* 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.cache.WeekCache;
import com.delect.motiver.server.jdo.UserOpenid;
import com.delect.motiver.server.jdo.training.Exercise;
import com.delect.motiver.server.jdo.training.ExerciseNameCount;
import com.delect.motiver.server.jdo.training.Workout;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
public class ExerciseCountServlet extends RemoteServiceServlet {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(ExerciseCountServlet.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> tableExercises = new Hashtable<Long, Integer>();
//get times (in chunks)
int countWorkouts = 0;
while(true) {
//get workouts
Query qW = pm.newQuery(Workout.class);
qW.setFilter("openId == openIdParam");
qW.declareParameters("java.lang.String openIdParam");
qW.setRange(countWorkouts, countWorkouts+100);
List<Workout> workouts = (List<Workout>) qW.execute(user.getUid());
int s = workouts.size();
// response.getWriter().write("Workouts found: "+s+" ("+countWorkouts+")<br>");
if(s == 0) {
break;
}
countWorkouts += s;
//go through each workouts
for(Workout w : workouts) {
for(Exercise e : w.getExercises()) {
final long nameId = e.getNameId();
//if name found
if(nameId > 0) {
//if id found -> add one to count
int count = 0;
if(tableExercises.containsKey(nameId)) {
count = tableExercises.get(nameId);
}
count++;
tableExercises.put(nameId, count);
}
}
}
}
//save each count to datastore
List<ExerciseNameCount> counts = new ArrayList<ExerciseNameCount>();
Set<Long> set = tableExercises.keySet();
Iterator<Long> itr = set.iterator();
for(int i = 0; i < tableExercises.size(); i++) {
Long nameId = itr.next();
// response.getWriter().write(" "+nameId + ": " + tableExercises.get(nameId)+"<br>");
//Create model
int count = tableExercises.get(nameId);
ExerciseNameCount model = new ExerciseNameCount(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();
}
}
}
}