package no.ntnu.fp.model; import java.beans.PropertyChangeSupport; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.jws.soap.SOAPBinding.ParameterStyle; public class Meeting extends CalendarEntry implements Serializable { private static final long serialVersionUID = 3423853302160071085L; public static final String STATE_PROPERTY = "State"; public static final String PARTICIPANTS_PROPERTY = "Participants"; public enum State { Accepted, Rejected, Pending; public static State getState(String state) { if (state.equals("Accepted")) return Accepted; else if (state.equals("Rejected")) return Rejected; else if (state.equals("Pending")) return Pending; else { assert(false); // only valid input should be provided return null; } } } private Map<User, State> participants = new HashMap<User, State>(); public Meeting() { this(-1); } public Meeting(int id) { super(id); } public Map<User, State> getParticipantsMap() { return participants; } public Meeting(String description){ super(description); } public Meeting(Date start, Date end, String description, int id) { super(description, start, end, id); } public Meeting(Date start, Date end, String description, int id, Location location) { super(description, start, end, id, location); } public void addParticipant(User user, State state){ participants.put(user, state); pcs.firePropertyChange(PARTICIPANTS_PROPERTY, null, null); } public void addParticipants(Map<User, State> participants) { if (participants != null) { for(User key : participants.keySet()) { State state = participants.get(key); addParticipant(key, state); } } } public int getNumParticipants() { return participants.size(); } public Set<User> getParticipants() { return participants.keySet(); } public List getParticipantsSorted() { List list = new ArrayList(getParticipants()); Collections.sort(list); return list; } public State getState(User user) { return participants.get(user); } public void setState(User user, State state) { State oldValue = participants.get(user); if (oldValue != state) { participants.put(user, state); pcs.firePropertyChange(STATE_PROPERTY, oldValue, state); pcs.firePropertyChange(PARTICIPANTS_PROPERTY, null, null); } } public boolean removeParticipant(User user){ if (participants.containsKey(user)) { participants.remove(user); pcs.firePropertyChange(PARTICIPANTS_PROPERTY, user, null); return true; } else { return false; } } public boolean removeAllParticipants() { participants.clear(); return true; } public void updateWith(Meeting meeting) { } public Meeting shallowCopy() { Meeting meeting = new Meeting(startDate, endDate, description, id, location); meeting.setOwner(new User(getOwner().getUsername())); for (User user : getParticipants()) { meeting.addParticipant(new User(user.getUsername()), getState(user)); } return meeting; } public String toString() { StringBuilder builder = new StringBuilder(); if (description != null) builder.append("Description: " + getDescription() + "\n"); else builder.append("Description is null\n"); if (startDate != null) builder.append("Start: " + getStartDate() + "\n"); else builder.append("Start is null\n"); if (endDate != null) builder.append("End: " + getEndDate() + "\n"); else builder.append("End is null\n"); if (location != null) builder.append("Sted: " + getLocation() + "\n"); else builder.append("Location is null\n"); if (owner != null) builder.append("Owner: " + getOwner().getName() + "\n"); else builder.append("Owner is null\n"); builder.append("Participants: \n"); for (User user : getParticipants()) { builder.append("\t" + user.getName() + ": " + (user) + "\n"); } return builder.toString(); } }