package assemblers; import java.util.ArrayList; import java.util.List; import org.joda.time.DateTime; import models.Attendee; import models.Meeting; import models.User; import results.RenderCustomJson; import utils.GsonFactory; import DTO.MeetingDTO; import com.google.gson.*; /** * Assembler for the MeetingDTO and Meeting classes. * * @see MeetingDTO * @see Meeting * @author Alex Jarvis axj7@aber.ac.uk */ public class MeetingAssembler { /** * Writes a MeetingDTO from a Meeting object. * @param meeting * @return */ public static MeetingDTO writeDTO(Meeting meeting) { MeetingDTO meetingDTO = new MeetingDTO(); meetingDTO.id = meeting.id; meetingDTO.time = new DateTime(meeting.time); meetingDTO.place = CoordinateAssembler.writeDTO(meeting.place); meetingDTO.attendees = AttendeeAssembler.writeDTOs(meeting.attendees); meetingDTO.owner = UserSummaryAssembler.writeDTO(meeting.owner); meetingDTO.title = meeting.title; meetingDTO.description = meeting.description; return meetingDTO; } /** * Writes a List of MeetingDTOs from the meetings that a User is related to * (where they have an Attendee object). * @param user * @return */ public static List<MeetingDTO> writeDTOs(User user) { ArrayList<MeetingDTO> meetings = new ArrayList<MeetingDTO>(); for (Attendee attendee : user.meetingsRelated) { meetings.add(writeDTO(attendee.meeting)); } return meetings; } /** * Creates a Meeting for the specified User and returns a MeetingDTO that * represents this newly created Meeting. * * Also creates the attendees for the meeting based on the data inside the * MeetingDTO. * @param meetingDTO * @param user * @return */ public static MeetingDTO createMeeting(MeetingDTO meetingDTO, User user) { Meeting meeting = new Meeting(); meeting.time = meetingDTO.time.toDate(); if (meetingDTO.place != null) { meeting.place = CoordinateAssembler.createCoordinate(meetingDTO.place); } meeting.owner = user; meeting.title = meetingDTO.title; meeting.description = meetingDTO.description; // The Attendee is the owning side of the relationship, so the meeting must be saved first. meeting.create(); if (meetingDTO.attendees != null) { AttendeeAssembler.createAttendees(meetingDTO.attendees, meeting); } return writeDTO(meeting); } /** * Updates a Meeting, using the data from a MeetingDTO * @param meetingDTO * @return */ public static MeetingDTO updateMeeting(MeetingDTO meetingDTO) { Meeting meeting = Meeting.findById(meetingDTO.id); if (meeting != null) { if (meetingDTO.time != null) { meeting.time = meetingDTO.time.toDate(); } if (meetingDTO.place != null) { meeting.place = CoordinateAssembler.updateCoordinate(meetingDTO.place); } if (meetingDTO.title != null) { meeting.title = meetingDTO.title; } if (meetingDTO.description != null) { meeting.description = meetingDTO.description; } if (meetingDTO.attendees != null) { AttendeeAssembler.updateAttendees(meeting, meetingDTO.attendees); } return writeDTO(meeting); } return null; } /** * Updates the meeting with a JsonObject * @param jsonObject * @return */ public static MeetingDTO updateMeetingWithJsonObject(JsonObject jsonObject) { MeetingDTO meetingDTO = meetingDTOWithJsonObject(jsonObject); meetingDTO = updateMeeting(meetingDTO); return meetingDTO; } /** * Returns a MeetingDTO object from a JsonObject * @param jsonObject * @return */ public static MeetingDTO meetingDTOWithJsonObject(JsonObject jsonObject) { GsonBuilder gsonBuilder = GsonFactory.gsonBuilder(); MeetingDTO meetingDTO = gsonBuilder.create().fromJson(jsonObject, MeetingDTO.class); return meetingDTO; } /** * Returns a MeetingDTO object from a Json string * @param jsonString * @return */ public static MeetingDTO meetingDTOWithJsonString(String jsonString) { GsonBuilder gsonBuilder = GsonFactory.gsonBuilder(); MeetingDTO meetingDTO = gsonBuilder.create().fromJson(jsonString, MeetingDTO.class); return meetingDTO; } }