1 29 30 package echo2example.chatserver; 31 32 import java.io.IOException ; 33 import java.io.InputStream ; 34 35 import javax.servlet.ServletException ; 36 import javax.servlet.http.HttpServlet ; 37 import javax.servlet.http.HttpServletRequest ; 38 import javax.servlet.http.HttpServletResponse ; 39 import javax.xml.parsers.DocumentBuilder ; 40 import javax.xml.parsers.DocumentBuilderFactory ; 41 import javax.xml.parsers.ParserConfigurationException ; 42 import javax.xml.transform.Transformer ; 43 import javax.xml.transform.TransformerException ; 44 import javax.xml.transform.TransformerFactory ; 45 import javax.xml.transform.dom.DOMSource ; 46 import javax.xml.transform.stream.StreamResult ; 47 48 import org.w3c.dom.Document ; 49 import org.w3c.dom.Element ; 50 import org.w3c.dom.NodeList ; 51 import org.w3c.dom.Text ; 52 import org.xml.sax.SAXException ; 53 54 57 public class ChatServerServlet extends HttpServlet { 58 59 private static final Server server = new Server(); 60 61 64 protected void doPost(HttpServletRequest request, HttpServletResponse response) 65 throws ServletException , IOException { 66 Document requestDocument = loadRequestDocument(request); 67 Document responseDocument = createResponseDocument(); 68 processUserAdd(requestDocument, responseDocument); 69 processUserRemove(requestDocument, responseDocument); 70 processPostMessage(requestDocument, responseDocument); 71 processGetMessages(requestDocument, responseDocument); 72 renderResponseDocument(response, responseDocument); 73 } 74 75 81 private Document createResponseDocument() 82 throws IOException { 83 try { 84 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 85 factory.setNamespaceAware(true); 86 DocumentBuilder builder = factory.newDocumentBuilder(); 87 Document document = builder.newDocument(); 88 document.appendChild(document.createElement("chat-server-response")); 89 return document; 90 } catch (ParserConfigurationException ex) { 91 throw new IOException ("Cannot create document: " + ex); 92 } 93 } 94 95 102 private Document loadRequestDocument(HttpServletRequest request) 103 throws IOException { 104 InputStream in = null; 105 try { 106 request.setCharacterEncoding("UTF-8"); 107 in = request.getInputStream(); 108 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 109 factory.setNamespaceAware(true); 110 DocumentBuilder builder = factory.newDocumentBuilder(); 111 return builder.parse(in); 112 } catch (ParserConfigurationException ex) { 113 throw new IOException ("Provided InputStream cannot be parsed: " + ex); 114 } catch (SAXException ex) { 115 throw new IOException ("Provided InputStream cannot be parsed: " + ex); 116 } catch (IOException ex) { 117 throw new IOException ("Provided InputStream cannot be parsed: " + ex); 118 } finally { 119 if (in != null) { try { in.close(); } catch (IOException ex) { } } 120 } 121 } 122 123 130 private void processGetMessages(Document requestDocument, Document responseDocument) { 131 String lastRetrievedIdString = requestDocument.getDocumentElement().getAttribute("last-retrieved-id"); 132 Message[] messages; 133 if (lastRetrievedIdString == null || lastRetrievedIdString.trim().length() == 0) { 134 messages = server.getRecentMessages(); 135 } else { 136 long lastRetrievedId = Long.parseLong(lastRetrievedIdString); 137 messages = server.getMessages(lastRetrievedId); 138 } 139 for (int i = 0; i < messages.length; ++i) { 140 Element messageElement = responseDocument.createElement("message"); 141 messageElement.setAttribute("id", Long.toString(messages[i].getId())); 142 if (messages[i].getUserName() != null) { 143 messageElement.setAttribute("user-name", messages[i].getUserName()); 144 } 145 messageElement.setAttribute("time", Long.toString(messages[i].getPostTime())); 146 messageElement.appendChild(responseDocument.createTextNode(messages[i].getContent())); 147 responseDocument.getDocumentElement().appendChild(messageElement); 148 } 149 } 150 151 158 private void processPostMessage(Document requestDocument, Document responseDocument) { 159 NodeList postMessageNodes = requestDocument.getDocumentElement().getElementsByTagName("post-message"); 160 if (postMessageNodes.getLength() == 0) { 161 return; 163 } 164 165 String remoteHost = requestDocument.getDocumentElement().getAttribute("remote-host"); 166 167 Element postMessageElement = (Element ) postMessageNodes.item(0); 168 String userName = postMessageElement.getAttribute("user-name"); 169 String authToken = postMessageElement.getAttribute("auth-token"); 170 NodeList postMessageContentNodes = postMessageElement.getChildNodes(); 171 int length = postMessageContentNodes.getLength(); 172 for (int i = 0; i < length; ++i) { 173 if (postMessageContentNodes.item(i) instanceof Text ) { 174 server.postMessage(userName, authToken, remoteHost, ((Text ) postMessageContentNodes.item(i)).getNodeValue()); 175 } 176 } 177 } 178 179 185 private void processUserAdd(Document requestDocument, Document responseDocument) { 186 NodeList userAddNodes = requestDocument.getDocumentElement().getElementsByTagName("user-add"); 187 if (userAddNodes.getLength() == 0) { 188 return; 190 } 191 192 String remoteHost = requestDocument.getDocumentElement().getAttribute("remote-host"); 193 194 Element userAddElement = (Element ) userAddNodes.item(0); 196 String userName = userAddElement.getAttribute("name"); 197 String authToken = server.addUser(userName, remoteHost); 198 199 Element userAuthElement = responseDocument.createElement("user-auth"); 200 if (authToken == null) { 201 userAuthElement.setAttribute("failed", "true"); 202 } else { 203 userAuthElement.setAttribute("auth-token", authToken); 204 } 205 responseDocument.getDocumentElement().appendChild(userAuthElement); 206 } 207 208 214 private void processUserRemove(Document requestDocument, Document responseDocument) { 215 NodeList userRemoveNodes = requestDocument.getDocumentElement().getElementsByTagName("user-remove"); 216 if (userRemoveNodes.getLength() == 0) { 217 return; 219 } 220 221 Element userRemoveElement = (Element ) userRemoveNodes.item(0); 222 String userName = userRemoveElement.getAttribute("name"); 223 String authToken = userRemoveElement.getAttribute("auth-token"); 224 225 String remoteHost = requestDocument.getDocumentElement().getAttribute("remote-host"); 226 227 server.removeUser(userName, authToken, remoteHost); 228 } 229 230 237 private void renderResponseDocument(HttpServletResponse response, Document responseDocument) 238 throws IOException { 239 response.setContentType("text/xml; charset=UTF-8"); 240 try { 241 TransformerFactory tFactory = TransformerFactory.newInstance(); 242 Transformer transformer = tFactory.newTransformer(); 243 DOMSource source = new DOMSource (responseDocument); 244 StreamResult result = new StreamResult (response.getWriter()); 245 transformer.transform(source, result); 246 } catch (TransformerException ex) { 247 throw new IOException ("Unable to write document to OutputStream: " + ex.toString()); 248 } 249 } 250 } 251
| Popular Tags
|