/*******************************************************************************
* 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.jdo.nutrition;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.NotPersistent;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.delect.motiver.server.MealInTime;
import com.delect.motiver.server.jdo.UserOpenid;
import com.delect.motiver.shared.FoodModel;
import com.delect.motiver.shared.MealModel;
import com.delect.motiver.shared.TimeModel;
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class TimeJDO implements Serializable, Comparable<TimeJDO> {
/**
*
*/
private static final long serialVersionUID = 938076651175865622L;
/**
* Converts server object to client side object
* @param model : server side model
* @return Client side model
*/
public static TimeModel getClientModel(TimeJDO model) {
if(model == null) {
return null;
}
TimeModel modelClient = new TimeModel(model.getDate(), (int) model.getTime());
modelClient.setId(model.getId());
modelClient.setUser(UserOpenid.getClientModel(model.getUser()));
//meals
if(model.getMealsNew() != null) {
List<MealModel> meals = new ArrayList<MealModel>();
for(MealJDO m : model.getMealsNew()) {
meals.add(MealJDO.getClientModel(m));
}
modelClient.setMeals(meals);
}
//foods
if(model.getFoods() != null) {
List<FoodModel> foods = new ArrayList<FoodModel>();
for(FoodJDO m : model.getFoods()) {
foods.add(FoodJDO.getClientModel(m));
}
modelClient.setFoods(foods);
}
return modelClient;
}
/**
* Converts client object to server side object
* @param model : client side model
* @return Server side model
*/
public static TimeJDO getServerModel(TimeModel model) {
if(model == null) {
return null;
}
TimeJDO modelServer = new TimeJDO(model.getDate(), (long) model.getTime());
modelServer.setId(model.getId());
if(model.getUser() != null)
modelServer.setUid(model.getUser().getUid());
//meals
if(model.getMeals() != null) {
List<MealJDO> meals = new ArrayList<MealJDO>();
for(MealModel m : model.getMeals()) {
meals.add(MealJDO.getServerModel(m));
}
modelServer.setMealsNew(meals);
}
//foods
if(model.getFoods() != null) {
List<FoodJDO> foods = new ArrayList<FoodJDO>();
for(FoodModel m : model.getFoods()) {
foods.add(FoodJDO.getServerModel(m));
}
modelServer.setFoods(foods);
}
return modelServer;
}
@Persistent
private Long uid;
@Persistent
private String openId;
@Persistent
private Date date;
@NotPersistent
private List<FoodJDO> foods = new ArrayList<FoodJDO>();
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key id;
@Persistent
private List<Key> mealsKeys = new ArrayList<Key>();
@Persistent
private List<Key> foodsKeys = new ArrayList<Key>();
@Persistent
private Long time = 0L; //in seconds from midnight
@NotPersistent
private List<MealJDO> meals = new ArrayList<MealJDO>();
@NotPersistent
private UserOpenid user;
public TimeJDO() {
}
public TimeJDO(Date date, Long time) {
this.setDate(date);
this.setTime(time);
}
@Override
public int compareTo(TimeJDO compare) {
return (time.longValue() > compare.time.longValue())? 1: 0;
}
public Date getDate() {
return date;
}
public List<FoodJDO> getFoods() {
return foods;
}
public Long getId() {
if(id != null) {
return id.getId();
}
else {
return 0L;
}
}
public Key getKey() {
return id;
}
public List<MealInTime> getMeals() {
return null;
}
public List<MealJDO> getMealsNew() {
return meals;
}
public List<Key> getFoodsKeys() {
return foodsKeys;
}
public List<Key> getMealsKeys() {
return mealsKeys;
}
public long getTime() {
if(time != null) {
return time;
}
else {
return 0L;
}
}
public String getUid() {
if(openId != null) {
return openId;
}
else {
return "";
}
}
public void setDate(Date date) {
this.date = date;
}
public void setFoods(List<FoodJDO> foods) {
this.foods = foods;
}
public void setId(Long id) {
Key k = null;
if(id != null && id != 0) {
k = KeyFactory.createKey(TimeJDO.class.getSimpleName(), id);
}
this.id = k;
}
public void setMeals(List<MealInTime> meals) {
}
public void setMealsNew(List<MealJDO> meals) {
this.meals = meals;
}
public void setFoodsKeys(List<Key> foodsKeys) {
this.foodsKeys = foodsKeys;
}
public void setMealsKeys(List<Key> mealsKeys) {
this.mealsKeys = mealsKeys;
}
public void setTime(Long time) {
this.time = time;
}
public void setUid(String openId) {
this.openId = openId;
}
public Long getUidOld() {
return uid;
}
public UserOpenid getUser() {
return user;
}
public void setUser(UserOpenid user) {
this.user = user;
}
/**
* Updates time from given model
* @param model
*/
public void update(TimeJDO model, boolean includeId, boolean updateFoods) {
if(includeId) {
setId(model.getId());
}
setDate(model.getDate());
setTime(model.getTime());
if(updateFoods) {
setMealsNew(model.getMealsNew());
setMealsKeys(model.getMealsKeys());
//if foods removed -> check which was removed
if(getFoodsKeys().size() > model.getFoodsKeys().size()) {
for(Key f : getFoodsKeys()) {
if(!model.getFoodsKeys().contains(f)) {
getFoodsKeys().remove(f);
}
}
}
//new food added
else {
for(Key f : model.getFoodsKeys()) {
int i = getFoodsKeys().indexOf(f);
if(i == -1) {
getFoodsKeys().add(f);
}
}
}
}
}
@Override
public String toString() {
return "Time: [id: "+getId()+", '"+getTime()+"', meals: "+getMealsNew().size()+", meals (keys): "+getMealsKeys().size()+", foods: "+getFoods().size()+"" +
", '"+getUid()+"']";
}
@SuppressWarnings("unchecked")
public JSONObject getJson() {
JSONObject obj=new JSONObject();
obj.put("date",(getDate() != null)? getDate().toString() : null);
obj.put("id",getId());
obj.put("time",getTime());
obj.put("openId",getUid());
JSONArray list = new JSONArray();
for(Key value : getFoodsKeys()) {
list.add(value.getId());
}
obj.put("foodsKeys", list);
JSONArray list2 = new JSONArray();
for(Key value : getMealsKeys()) {
list2.add(value.getId());
}
obj.put("mealsKeys", list2);
return obj;
}
}