예제 #1
0
  private List<ChatMessage> sanitizeMap(final SortedMap<Date, ChatMessage> aMap) {
    if (aMap.isEmpty() || aMap.size() == 1) return Lists.newArrayList(aMap.values());

    final LinkedList<ChatMessage> ret = Lists.newLinkedList(aMap.values());
    final ListIterator<ChatMessage> i = ret.listIterator();
    ChatMessage prevMsg = i.next();
    do {
      ChatMessage msg = i.next();
      if (!msg.getPreviousMessageDate().equals(prevMsg.getDate())) {
        if (msg.getPreviousMessageDate().before(prevMsg.getDate())) {
          msg.setPreviousMessageDate(prevMsg.getDate());
        } else {
          final ChatMessage tmp =
              createLostMessageBetween(
                  msg.getRoom(), prevMsg.getDate(), msg.getPreviousMessageDate());
          aMap.put(tmp.getDate(), tmp);
          i.previous();
          i.add(tmp);
          i.next();
          msg = tmp;
        }
      }
      prevMsg = msg;
    } while (i.hasNext());

    return ret;
  }
예제 #2
0
 private ChatMessage createLostMessageBetween(
     final ChatRoom aRoom, final Date aPreviousDate, final Date aDate) {
   final ChatMessage ret =
       new ChatMessage(aRoom, "[unknown message]", new SynchroUser("<unknown>"));
   ret.setPreviousMessageDate(aPreviousDate);
   ret.setDate(aDate);
   return ret;
 }
예제 #3
0
 public void recordAndUpdateNewMessage(final ChatMessage aMsg) {
   final SortedMap<Date, ChatMessage> map = getMapForRoom(aMsg.getRoom());
   synchronized (map) {
     if (!map.isEmpty()) {
       final ChatMessage lastMsg = map.get(map.lastKey());
       while (aMsg.getDate().compareTo(lastMsg.getDate()) <= 0) {
         aMsg.setDate(new Date(1 + aMsg.getDate().getTime()));
       }
       aMsg.setPreviousMessageDate(lastMsg.getDate());
     }
     map.put(aMsg.getDate(), aMsg);
     while (map.size() > MAX_ROOM_HIST) {
       map.remove(map.firstKey());
     }
   }
   SynchroCache.put("ChatCache", m_chatCache);
 }