1 29 30 package echo2example.chatclient; 31 32 import java.io.IOException ; 33 import java.util.ArrayList ; 34 import java.util.Date ; 35 import java.util.List ; 36 37 import javax.xml.parsers.DocumentBuilder ; 38 import javax.xml.parsers.DocumentBuilderFactory ; 39 import javax.xml.parsers.ParserConfigurationException ; 40 41 import nextapp.echo2.webcontainer.ContainerContext; 42 import nextapp.echo2.webrender.ClientProperties; 43 import nextapp.echo2.webrender.Connection; 44 import nextapp.echo2.webrender.WebRenderServlet; 45 46 import org.w3c.dom.Document ; 47 import org.w3c.dom.Element ; 48 import org.w3c.dom.NodeList ; 49 import org.w3c.dom.Text ; 50 51 56 public class ChatSession { 57 58 61 public static class Message { 62 63 private String content; 64 private Date date; 65 private String userName; 66 67 75 private Message(String userName, Date date, String content) { 76 super(); 77 this.userName = userName; 78 this.date = date; 79 this.content = content; 80 } 81 82 87 public String getContent() { 88 return content; 89 } 90 91 96 public Date getDate() { 97 return date; 98 } 99 100 106 public String getUserName() { 107 return userName; 108 } 109 } 110 111 118 public static ChatSession forUserName(String userName) 119 throws IOException { 120 ChatSession chatSession = new ChatSession(userName); 121 return chatSession.authToken == null ? null : chatSession; 122 } 123 124 127 private String lastRetrievedId; 128 129 134 private String authToken; 135 136 139 private String userName; 140 141 145 private List newMessages = new ArrayList (); 146 147 150 private String chatServerUri; 151 152 159 private ChatSession(String userName) 160 throws IOException { 161 super(); 162 this.userName = userName; 163 loadServerUri(); 164 165 Document requestDocument = createRequestDocument(); 166 167 Element userAddElement = requestDocument.createElement("user-add"); 168 userAddElement.setAttribute("name", userName); 169 requestDocument.getDocumentElement().appendChild(userAddElement); 170 171 Document responseDocument = XmlHttpConnection.send(this.chatServerUri, requestDocument); 172 NodeList userAuthNodes = responseDocument.getElementsByTagName("user-auth"); 173 if (userAuthNodes.getLength() != 1) { 174 throw new IOException ("Unexpected response."); 175 } 176 Element userAuthElement = (Element ) userAuthNodes.item(0); 177 if ("true".equals(userAuthElement.getAttribute("failed"))) { 178 } else { 179 authToken = userAuthElement.getAttribute("auth-token"); 180 } 181 } 182 183 186 private void loadServerUri() { 187 Connection conn = WebRenderServlet.getActiveConnection(); 188 String chatServerUri = conn.getServlet().getInitParameter("ChatServerURI"); 189 if (chatServerUri != null && chatServerUri.trim().length() > 0) { 190 this.chatServerUri = chatServerUri; 191 } else { 192 this.chatServerUri = (conn.getRequest().isSecure() ? "https" : "http") 193 + "://" + conn.getRequest().getServerName() + ":" + conn.getRequest().getServerPort() + "/ChatServer/app"; 194 } 195 } 196 197 203 private Document createRequestDocument() 204 throws IOException { 205 try { 206 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 207 factory.setNamespaceAware(true); 208 DocumentBuilder builder = factory.newDocumentBuilder(); 209 Document document = builder.newDocument(); 210 Element rootElement = document.createElement("chat-server-request"); 211 212 ChatApp chatApp = ChatApp.getApp(); 213 if (chatApp != null) { 214 ContainerContext containerContext = (ContainerContext) chatApp.getContextProperty( 215 ContainerContext.CONTEXT_PROPERTY_NAME); 216 String remoteHost = containerContext.getClientProperties().getString(ClientProperties.REMOTE_HOST); 217 rootElement.setAttribute("remote-host", remoteHost); 218 } 219 220 if (lastRetrievedId != null) { 221 rootElement.setAttribute("last-retrieved-id", lastRetrievedId); 222 } 223 document.appendChild(rootElement); 224 return document; 225 } catch (ParserConfigurationException ex) { 226 throw new IOException ("Cannot create document: " + ex); 227 } 228 } 229 230 235 public void dispose() 236 throws IOException { 237 Document requestDocument = createRequestDocument(); 238 Element userRemoveElement = requestDocument.createElement("user-remove"); 239 userRemoveElement.setAttribute("name", userName); 240 userRemoveElement.setAttribute("auth-token", authToken); 241 requestDocument.getDocumentElement().appendChild(userRemoveElement); 242 XmlHttpConnection.send(chatServerUri, requestDocument); 243 } 244 245 251 public Message[] getNewMessages() { 252 Message[] messages = (Message[]) newMessages.toArray(new Message[newMessages.size()]); 253 newMessages.clear(); 254 return messages; 255 } 256 257 262 public boolean hasNewMessages() { 263 return newMessages.size() != 0; 264 } 265 266 271 public String getUserName() { 272 return userName; 273 } 274 275 280 public void pollServer() 281 throws IOException { 282 Document requestDocument = createRequestDocument(); 283 Document responseDocument = XmlHttpConnection.send(chatServerUri, requestDocument); 284 updateLocalMessages(responseDocument); 285 } 286 287 293 public void postMessage(String content) 294 throws IOException { 295 Document requestDocument = createRequestDocument(); 296 297 Element postMessageElement = requestDocument.createElement("post-message"); 298 postMessageElement.setAttribute("user-name", userName); 299 postMessageElement.setAttribute("auth-token", authToken); 300 postMessageElement.appendChild(requestDocument.createTextNode(content)); 301 requestDocument.getDocumentElement().appendChild(postMessageElement); 302 303 Document responseDocument = XmlHttpConnection.send(chatServerUri, requestDocument); 304 updateLocalMessages(responseDocument); 305 } 306 307 313 private void updateLocalMessages(Document responseDocument) { 314 NodeList newMessageElements = responseDocument.getDocumentElement().getElementsByTagName("message"); 315 int length = newMessageElements.getLength(); 316 for (int i = 0; i < length; ++i) { 317 Element messageElement = (Element ) newMessageElements.item(i); 318 lastRetrievedId = messageElement.getAttribute("id"); 319 String userName = messageElement.hasAttribute("user-name") ? messageElement.getAttribute("user-name") : null; 320 NodeList childNodes = messageElement.getChildNodes(); 321 String content = null; 322 for (int j = 0; j < childNodes.getLength(); ++j) { 323 if (childNodes.item(j) instanceof Text ) { 324 content = childNodes.item(j).getNodeValue(); 325 break; 326 } 327 } 328 long timeMs = Long.parseLong(messageElement.getAttribute("time")); 329 Message message = new Message(userName, new Date (timeMs), content); 330 newMessages.add(message); 331 } 332 } 333 } 334 | Popular Tags |