// Last edited on 2014-12-17 02:29:46 by stolfilocal package quack; import java.util.LinkedList; import java.util.List; import java.util.Collections; import java.util.Comparator; import java.util.ListIterator; public class UserImpl implements User { private long dbIndex; private String loginName; private String password; private String fullName; private String email; private long creationTime; private List directContacts; // Arestas de saida de {this} no grafo de relacoes. private List reverseContacts; // Arestas de entrada em {this} no grafo de relacoes. private List messages; // Lista de mensagens de autoria {this}. @Override public User initialize(String loginName, String email, String fullName, String password, long creationTime, long dbIndex) { this.loginName = loginName; this.fullName = fullName; this.email = email; this.password = password; this.dbIndex = dbIndex; this.creationTime = creationTime; this.directContacts = new LinkedList(); this.reverseContacts = new LinkedList(); this.messages = new LinkedList(); return this; } @Override public String getLoginName() { return this.loginName; } public String getFullName() { return this.fullName; } @Override public String getEmail() { return this.email; } @Override public void setEmail(String newEmail) { this.email = newEmail; } @Override public boolean checkPassword(String password) { return this.password.equals(password); } @Override public void setPassword(String newPassword) { this.password = newPassword; } @Override public void setFullName(String newFullName) { this.fullName = newFullName; } @Override public long getCreationTime() { return this.creationTime; } @Override public long getDbIndex() { return this.dbIndex; } @Override public List getDirectContacts() { return this.directContacts; } @Override public List getReverseContacts() { return this.reverseContacts; } @Override public Contact getDirectContact(User target) { for (Contact c : this.directContacts) { if (c.getTarget().getLoginName().equals(target.getLoginName())) { return c; } } return null; } @Override public Contact getReverseContact(User source) { for (Contact c : this.reverseContacts) { if (c.getSource().equals(source)) { return c; } } return null; } @Override public void addDirectContact(Contact contact) { assert (this.getDirectContact(contact.getTarget()) == null); this.directContacts.add(contact); } @Override public void addReverseContact(Contact contact) { assert (this.getReverseContact(contact.getSource()) == null); this.reverseContacts.add(contact); } @Override public List getPostedMessages() { return this.messages; } @Override public List getIncomingMessages() { List list = new LinkedList(); for(Contact c : this.getDirectContacts()){ if(c.getStatus().equalsIgnoreCase("Follow")){ for(Message m : c.getTarget().getPostedMessages()){ messages.add(m); } } } sortMessages(list); return list; } @Override public List getPostedMessages(long startTime, long endTime, long maxN) { List trechoMsgs = new LinkedList(); long i = 0; if(maxN > 0) { // Pega as {maxN} primeiras mensagens ListIterator messages = this.messages.listIterator(); while(messages.hasNext() && i < maxN){ Message m = messages.next(); if (m.getPostedTime() < startTime) break; if ((m.getPostedTime() >= startTime || startTime == -1) && (endTime == -1 || m.getPostedTime() <= endTime)) { trechoMsgs.add(m); i++; } } } else { maxN = -maxN; ListIterator messages = this.messages.listIterator(this.messages.size()); while(messages.hasPrevious() && i < maxN){ Message m = messages.previous(); if (m.getPostedTime() < startTime) break; if ((m.getPostedTime() >= startTime || startTime == -1) && (endTime == -1 || m.getPostedTime() <= endTime)) { trechoMsgs.add(0, m); i++; } } } // if (startTime == null || startTime.equals("")) { // if (endTime == null || endTime.equals("")) { // messages = target.getPostedMessages(0, t.now(), maxN); // } else { // messages = target.getPostedMessages(0, // t.fromString(endTime), maxN); // } // } else { // if (endTime == null || endTime.equals("")) { // messages = target.getPostedMessages( // t.fromString(startTime), t.now(), maxN); // } else { // messages = target.getPostedMessages( // t.fromString(startTime), // t.fromString(endTime), maxN); // } // } return trechoMsgs; } @Override public void addMessage(Message message) { assert(message.getPoster() == this); this.messages.add(0, message); } @Override public String getPassword() { return password; } @Override public long followsCount() { long count = 0; for(Contact c: this.directContacts){ if(c.getStatus().equals("Follow")) count++; } return count; } @Override public long followersCount() { long count = 0; for(Contact c: this.reverseContacts){ if(c.getStatus().equals("Follow")) count++; } return count; } @Override public Message getMessageByDbIndex(long dbIndex) { for (Message m : this.messages) if (m.getDbIndex() == dbIndex) return m; return null; } @Override public Message getMessageByPostedTime(long postedTime) { for (Message m : this.messages) if (m.getPostedTime() == postedTime) return m; return null; } private static final void sortMessages(List list) // Sorts a list of messages by posting (or reposting) date, newest message first. { Comparator cmp = new Comparator() { @Override public final int compare(Message a, Message b) { boolean newestFirst = true; // !!{ Devia ser parĂ¢metro de {sortMessages} }!! long ta = a.getPostedTime(); long tb = b.getPostedTime(); int sign; if(ta > tb) { sign = +1; } else if(ta < tb) { sign = -1; } else { sign = 0; } if (newestFirst) { sign = -sign; } return sign; } }; Collections.sort(list, cmp); } }