KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > echo2example > chatserver > MessageStore


1 /*
2  * This file is part of the Echo Web Application Framework (hereinafter "Echo").
3  * Copyright (C) 2002-2005 NextApp, Inc.
4  *
5  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
6  *
7  * The contents of this file are subject to the Mozilla Public License Version
8  * 1.1 (the "License"); you may not use this file except in compliance with
9  * the License. You may obtain a copy of the License at
10  * http://www.mozilla.org/MPL/
11  *
12  * Software distributed under the License is distributed on an "AS IS" basis,
13  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14  * for the specific language governing rights and limitations under the
15  * License.
16  *
17  * Alternatively, the contents of this file may be used under the terms of
18  * either the GNU General Public License Version 2 or later (the "GPL"), or
19  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
20  * in which case the provisions of the GPL or the LGPL are applicable instead
21  * of those above. If you wish to allow use of your version of this file only
22  * under the terms of either the GPL or the LGPL, and not to allow others to
23  * use your version of this file under the terms of the MPL, indicate your
24  * decision by deleting the provisions above and replace them with the notice
25  * and other provisions required by the GPL or the LGPL. If you do not delete
26  * the provisions above, a recipient may use your version of this file under
27  * the terms of any one of the MPL, the GPL or the LGPL.
28  */

29
30 package echo2example.chatserver;
31
32 /**
33  * A store for posted <code>Message</code>s.
34  */

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     /**
46      * Creates a new <code>MessageStore</code>.
47      */

48     public MessageStore() {
49         super();
50     }
51     
52     /**
53      * Returns the message at the specified index.
54      *
55      * @param index the index
56      * @return the message
57      */

58     private Message getMessage(int index) {
59         return messages[(firstMessageIndex + index) % MAX_MESSAGES];
60     }
61     
62     /**
63      * Retrieves all messages with ids greater than the specified id.
64      *
65      * @param lastRetrievedId the id of the last message retrieved
66      * @return an array containing messages posted after the message identified
67      */

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     /**
85      * Returns an array of recently posted messages.
86      * This method is queried by clients that have just joined the chat room
87      * to retrieve context on the chat.
88      *
89      * @return the recently posted messages
90      */

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     /**
100      * Posts a message.
101      *
102      * @param userName the name of the user
103      * @param messageContent the message content to post
104      */

105     public synchronized void post(String JavaDoc userName, String JavaDoc 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