/******************************************************************************* * 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.training; 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.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.RoutineModel; import com.delect.motiver.shared.WorkoutModel; @PersistenceCapable(identityType = IdentityType.APPLICATION) public class Routine implements Serializable, Cloneable, Comparable<Routine> { /** * Converts server object to client side object * @param model : server side model * @return Client side model */ public static RoutineModel getClientModel(Routine model) { if(model == null) { return null; } RoutineModel modelClient = new RoutineModel(model.getName()); modelClient.setId(model.getId()); modelClient.setDate(model.getDate()); modelClient.setDays(model.getDays()); modelClient.setInfo(model.getInfo()); modelClient.setCount(model.getCount()); //workouts if(model.getWorkouts() != null) { List<WorkoutModel> workouts = new ArrayList<WorkoutModel>(); for(Workout m : model.getWorkouts()) { workouts.add(Workout.getClientModel(m)); } modelClient.setWorkouts(workouts); } //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 Routine getServerModel(RoutineModel model) { if(model == null) { return null; } Routine modelServer = new Routine(model.getName()); modelServer.setId(model.getId()); modelServer.setDate(model.getDate()); modelServer.setDays(model.getDays()); modelServer.setInfo(model.getInfo()); if(model.getUser() != null) modelServer.setUid(model.getUser().getUid()); return modelServer; } public Object clone() throws CloneNotSupportedException { Routine clone = new Routine(); clone.setDate(getDate()); clone.setDays(getDays()); clone.setInfo(getInfo()); clone.setName(getName()); clone.setUid(getUid()); // List<Workout> workouts = new ArrayList<Workout>(); // for(Workout e : getWorkouts()) { // workouts.add((Workout) e.clone()); // } // clone.setWorkouts(workouts); return clone; } @Persistent public Date date; /** * How many times this have been copied */ @Persistent private Integer copyCount = 0; @Persistent private Integer days = 7; @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key id; @Persistent private String info; @Persistent private String name; @Persistent private Long uid; @Persistent public String openId; @NotPersistent public List<Workout> workouts; @NotPersistent private UserOpenid user; public Routine() { } public Routine(String name) { super(); this.name = name; } @Override public int compareTo(Routine compare) { return getName().toLowerCase().compareTo(compare.getName().toLowerCase()); } public Date getDate() { if(date != null) { return date; } else { return null; } } public Integer getDays() { if(days != null) { return days; } else { return 7; } } public Long getId() { if(id != null) { return id.getId(); } else { return 0L; } } public String getInfo() { if(info != null) { return info; } else { return ""; } } public String getName() { if(name != null) { return name; } else { return ""; } } public String getUid() { if(openId != null) { return openId; } else { return ""; } } public List<Workout> getWorkouts() { return workouts; } /** * Adds one to copy count */ public void incrementCopyCount() { copyCount++; } public void setDate(Date date) { this.date = date; } public void setDays(Integer days) { this.days = days; } public void setId(Long id) { Key k = null; if(id != null && id != 0) { k = KeyFactory.createKey(Routine.class.getSimpleName(), id); } this.id = k; } public void setInfo(String info) { this.info = info; } public void setName(String name) { this.name = name; } public void setUid(String openId) { this.openId = openId; } public Long getUidOld() { return uid; } public void setWorkouts(List<Workout> workouts) { this.workouts = workouts; } 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; } /** * Updates routine from given model * @param model */ public void update(Routine model, boolean includeId) { if(includeId) { setId(model.getId()); } setDate(model.getDate()); setDays(model.getDays()); setInfo(model.getInfo()); setName(model.getName()); setCount(model.getCount()); // if(getWorkouts() != null && model.getWorkouts() != null) { // //if workouts removed -> check which was removed // if(getWorkouts().size() > model.getWorkouts().size()) { // for(Workout f : getWorkouts()) { // if(!model.getWorkouts().contains(f)) { // getWorkouts().remove(f); // } // } // } // //new workout added // else { // for(Workout f : model.getWorkouts()) { // int i = getWorkouts().indexOf(f); // if(i != -1) { // Workout fOld = getWorkouts().get(i); // fOld.update(f, includeId); // } // else { // getWorkouts().add(f); // } // } // } // } } @Override public String toString() { return "Routine: [id: "+getId()+", '"+getName()+"', workouts: "+((getWorkouts() != null)? getWorkouts().size() : "")+"" + ", '"+getUid()+"']"; } @SuppressWarnings("unchecked") public JSONObject getJson() { JSONObject obj=new JSONObject(); obj.put("date",(getDate() != null)? getDate().toString() : null); obj.put("days",getDays()); obj.put("id",getId()); obj.put("info",getInfo()); obj.put("name",getName()); obj.put("openId",getUid()); return obj; } }