1 29 30 package echo2example.chatserver; 31 32 35 public class MessageStore { 36 37 private static final int MAX_MESSAGES = 1000; 38 private static final int RECENT_MESSAGES = 15; 39 40 private long[] messageIds = new long[MAX_MESSAGES]; 41 private Message[] messages = new Message[MAX_MESSAGES]; 42 private int firstMessageIndex = 0; 43 private int messageCount = 0; 44 45 48 public MessageStore() { 49 super(); 50 } 51 52 58 private Message getMessage(int index) { 59 return messages[(firstMessageIndex + index) % MAX_MESSAGES]; 60 } 61 62 68 public Message[] getMessages(long lastRetrievedId) { 69 int startIndex = 0; 70 while (startIndex < messageCount) { 71 Message message = getMessage(startIndex); 72 if (message.getId() > lastRetrievedId) { 73 break; 74 } 75 ++startIndex; 76 } 77 Message[] matchingMessages = new Message[messageCount - startIndex]; 78 for (int i = startIndex; i < messageCount; ++i) { 79 matchingMessages[i - startIndex] = getMessage(i); 80 } 81 return matchingMessages; 82 } 83 84 91 public Message[] getRecentMessages() { 92 Message[] matchingMessages = new Message[messageCount < RECENT_MESSAGES ? messageCount : RECENT_MESSAGES]; 93 for (int i = 0; i < matchingMessages.length; ++i) { 94 matchingMessages[i] = getMessage(messageCount - matchingMessages.length + i); 95 } 96 return matchingMessages; 97 } 98 99 105 public synchronized void post(String userName, String messageContent) { 106 int messageIndex = (firstMessageIndex + messageCount) % MAX_MESSAGES; 107 108 Message message = new Message(userName, messageContent); 109 messages[messageIndex] = message; 110 messageIds[messageIndex] = message.getId(); 111 112 if (messageCount < MAX_MESSAGES) { 113 ++messageCount; 114 } else { 115 firstMessageIndex = (firstMessageIndex + 1) % MAX_MESSAGES; 116 } 117 } 118 } 119 | Popular Tags |