package assemblers;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import models.Attendee;
import models.Meeting;
import models.User;
import models.UserLocation;
import org.joda.time.DateTime;
import utils.GsonFactory;
import DTO.RecentUserLocationsDTO;
import DTO.UserDTO;
import DTO.UserLocationDTO;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.reflect.TypeToken;
/**
* Assembler for the UserLocationDTO and related classes.
*
* @see UserLocationDTO
* @author Alex Jarvis axj7@aber.ac.uk
*/
public class UserLocationAssembler {
/**
* Writes a UserLocationDTO with attributes from a UserLocation object.
*
* @param userLocation
* @return
*/
public static UserLocationDTO writeDTO(UserLocation userLocation) {
UserLocationDTO userLocationDTO = new UserLocationDTO();
userLocationDTO.time = new DateTime(userLocation.time);
userLocationDTO.coordinate = CoordinateAssembler.writeDTO(userLocation.coordinate);
userLocationDTO.speed = userLocation.speed;
userLocationDTO.altitude = userLocation.altitude;
userLocationDTO.trueHeading = userLocation.trueHeading;
userLocationDTO.horizontalAccuracy = userLocation.horizontalAccuracy;
userLocationDTO.verticalAccuracy = userLocation.verticalAccuracy;
return userLocationDTO;
}
/**
* Writes a list of UserLocationDTO objects from a list of UserLocation objects.
*
* @param userLocations
* @return
*/
public static List<UserLocationDTO> writeDTOs(List<UserLocation> userLocations) {
List<UserLocationDTO> userLocationList = new ArrayList<UserLocationDTO>();
for (UserLocation userLocation : userLocations) {
userLocationList.add(writeDTO(userLocation));
}
return userLocationList;
}
/**
* This method is private because it does not notify other users location streams and is
* always intended to be called internally by createUserLocations()
*
* @param userLocationDTO
* @param user
*/
private static UserLocation createUserLocation(UserLocationDTO userLocationDTO, User user) {
UserLocation userLocation = new UserLocation();
userLocation.user = user;
userLocation.time = userLocationDTO.time.toDate();
userLocation.coordinate = CoordinateAssembler.createCoordinate(userLocationDTO.coordinate);
userLocation.speed = userLocationDTO.speed;
userLocation.altitude = userLocationDTO.altitude;
userLocation.trueHeading = userLocationDTO.trueHeading;
userLocation.horizontalAccuracy = userLocationDTO.horizontalAccuracy;
userLocation.verticalAccuracy = userLocationDTO.verticalAccuracy;
userLocation.create();
return userLocation;
}
/**
* Persists the locations of a User when they update their location.
*
* @param userLocationDTOs
*/
public static List<UserLocationDTO> createUserLocations(List<UserLocationDTO> userLocationDTOs, UserDTO userDTO) {
User user = User.findById(userDTO.id);
List<UserLocationDTO> createdUserLocationDTOs = new ArrayList<UserLocationDTO>();
if (user != null) {
for (UserLocationDTO userLocationDTO : userLocationDTOs) {
UserLocation userLocation = createUserLocation(userLocationDTO, user);
createdUserLocationDTOs.add(writeDTO(userLocation));
}
}
return createdUserLocationDTOs;
}
/**
* Creates a list of UserLocationDTO objects from a JsonArray. Used when updating the users
* location with an array of UserLocationDTO objects in the body of a request.
*
* @param jsonObject
* @return
*/
public static List<UserLocationDTO> userLocationDTOsWithJsonArray(JsonArray jsonArray) {
GsonBuilder gsonBuilder = GsonFactory.gsonBuilder();
Type collectionType = new TypeToken<List<UserLocationDTO>>(){}.getType();
List<UserLocationDTO> userLocationDTOs = gsonBuilder.create().fromJson(jsonArray, collectionType);
return userLocationDTOs;
}
}