/******************************************************************************* * 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.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.jdo.UserOpenid; import com.delect.motiver.shared.FoodModel; import com.delect.motiver.shared.MealModel; @PersistenceCapable(identityType = IdentityType.DATASTORE) public class MealJDO implements Serializable, Comparable<MealJDO>, Cloneable { /** * */ private static final long serialVersionUID = -1889245717390374201L; /** * Converts server object to client side object * @param model : server side model * @return Client side model */ public static MealModel getClientModel(MealJDO model) { if(model == null) { return null; } MealModel modelClient = new MealModel(model.getName()); modelClient.setId(model.getId()); modelClient.setCount(model.getCount()); //foods List<FoodModel> foods = new ArrayList<FoodModel>(); if(model.getFoods() != null) { for(FoodJDO m : model.getFoods()) { foods.add(FoodJDO.getClientModel(m)); } } modelClient.setFoods(foods); //user modelClient.setUser(UserOpenid.getClientModel(model.getUser())); return modelClient; } /** * Converts client object to server side object * @param model : client side model * @return Server side model */ public static MealJDO getServerModel(MealModel model) { if(model == null) { return null; } MealJDO modelServer = new MealJDO(model.getName()); if(model.getId() > 0) { modelServer.setId(model.getId()); } if(model.getUser() != null) modelServer.setUid(model.getUser().getUid()); return modelServer; } @Override public Object clone() throws CloneNotSupportedException { MealJDO clone = new MealJDO(); clone.setName(getName()); clone.setTime(getTime()); clone.setUid(getUid()); clone.setUser(getUser()); // List<Food> foods = new ArrayList<Food>(); // for(Food f : getFoods()) { // foods.add((Food) f.clone()); // } // clone.setFoods(foods); return clone; } /** * How many times this have been copied */ @Persistent private Integer copyCount = 0; @NotPersistent private List<FoodJDO> foods = new ArrayList<FoodJDO>(); @Persistent private List<Key> foodsKeys = new ArrayList<Key>(); @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key id = null; @Persistent private String name = ""; @Persistent private Long timeId; @Persistent private Long uid; @Persistent private String openId; @NotPersistent private UserOpenid user; public MealJDO() { } public MealJDO(String name) { this.setName(name); } @Override public int compareTo(MealJDO compare) { return getName().toLowerCase().compareTo(compare.getName().toLowerCase()); } public List<FoodJDO> getFoods() { return foods; } public List<Key> getFoodsKeys() { return foodsKeys; } public Long getId() { if(id != null) { return id.getId(); } else { return 0L; } } public Key getKey() { return id; } public String getName() { return name; } public Long getTime() { return timeId; } public String getUid() { if(openId != null) { return openId; } else { return ""; } } /** * Adds one to copy count */ public void incrementCopyCount() { copyCount++; } public void setFoods(List<FoodJDO> foods) { this.foods = foods; } public void setFoodsKeys(List<Key> foodsKeys) { this.foodsKeys = foodsKeys; } public void setId(Long id) { Key k = null; if(id != null && id != 0) { k = KeyFactory.createKey(MealJDO.class.getSimpleName(), id); } this.id = k; } public void setName(String name) { this.name = name; } public void setTime(Long timeId) { this.timeId = timeId; } public void setUid(String openId) { this.openId = openId; } public Long getUidOld() { return 0L; } /** * Updates meal from given model * @param model */ public void update(MealJDO model, boolean includeId, boolean updateFoods) { if(includeId) { setId(model.getId()); } setName(model.getName()); setTime(model.getTime()); setCount(model.getCount()); if(updateFoods) { //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); } } } } } public UserOpenid getUser() { return user; } public void setUser(UserOpenid user) { this.user = user; } public Integer getCount() { return copyCount; } public void setCount(Integer copyCount) { this.copyCount = copyCount; } @Override public String toString() { return "Meal: [id: "+getId()+", '"+getName()+"', foods: "+getFoods().size()+"" + ", '"+getUid()+"']"; } @SuppressWarnings("unchecked") public JSONObject getJson() { JSONObject obj=new JSONObject(); obj.put("id",getId()); obj.put("name",getName()); obj.put("openId",getUid()); obj.put("timeId",getTime()); JSONArray list = new JSONArray(); for(Key value : getFoodsKeys()) { list.add(value.getId()); } obj.put("foodsKeys", list); return obj; } }