19 package cz.vutbr.fit.knot.annotations.comet;
21 import com.sun.grizzly.comet.CometContext;
22 import com.sun.grizzly.comet.CometEngine;
23 import com.sun.grizzly.comet.CometEvent;
24 import com.sun.grizzly.comet.CometHandler;
28 import java.io.BufferedReader;
29 import java.io.IOException;
30 import java.io.PrintWriter;
31 import java.io.StringWriter;
32 import java.util.ArrayList;
33 import java.util.Iterator;
34 import java.util.logging.Level;
35 import java.util.logging.Logger;
36 import javax.servlet.ServletConfig;
37 import javax.servlet.ServletContext;
38 import javax.servlet.ServletException;
39 import javax.servlet.http.HttpServlet;
40 import javax.servlet.http.HttpServletRequest;
41 import javax.servlet.http.HttpServletResponse;
65 public class AnnotHandler implements CometHandler<HttpServletResponse> {
70 private ArrayList<EditorSession>
edSessionList =
new ArrayList<EditorSession>();
82 public void onEvent(CometEvent event)
throws IOException {
88 if (CometEvent.NOTIFY == event.getType()) {
89 PrintWriter writer = response.getWriter();
92 String responseString = null;
95 sessionWithMes = edSessionList.get(0);
96 for (
int i = 0; i < edSessionList.size(); i++) {
98 sessionWithMes = edSessionList.get(i);
99 responseString = sessionWithMes.getAndCleanMessages();
100 edSessionList.remove(i);
101 edSessionList.add(sessionWithMes);
108 int version = sessionWithMes.getNamespacesLOD();
110 String sessAtt =
" sessionID=\"" + sessionWithMes.getSessionId() +
"\"";
115 StringBuilder sb =
new StringBuilder(
"<?xml version=\"1.0\" encoding=\"utf-8\" ?><messages ");
118 for (
int i = 0; i < Constants.nameSpaces[version].length; i++) {
119 sb.append(Constants.nameSpaces[version][i]);
122 if (responseString != null && !responseString.isEmpty()) {
123 sb.append(sessAtt).append(
">").append(responseString).append(
"</messages>");
125 sb.append(sessAtt).append(
"><ok/></messages>");
130 writer.write(sb.toString());
134 event.getCometContext().resumeCometHandler(
this);
147 Iterator<EditorSession> edSessIt = edSessionList.iterator();
148 while(edSessIt.hasNext()){
150 es.setCometHandler(
this);
172 int version = sess.getNamespacesLOD();
174 StringBuilder sb =
new StringBuilder(
"<?xml version=\"1.0\" encoding=\"utf-8\" ?><messages ");
176 String sessAtt =
" sessionID=\"" + sess.getSessionId() +
"\"";
181 for (
int i = 0; i < Constants.nameSpaces[version].length; i++) {
182 sb.append(Constants.nameSpaces[version][i]);
184 sb.append(sessAtt).append(
"><ok/></messages>");
186 PrintWriter writer = response.getWriter();
187 writer.write(sb.toString());
190 event.getCometContext().resumeCometHandler(
this);
211 public void attach(HttpServletResponse attachment) {
212 this.response = attachment;
219 response.getWriter().close();
220 CometContext context =
221 CometEngine.getEngine().getCometContext(
contextPath);
222 context.removeCometHandler(
this);
251 first = edSessionList.get(0);
252 edSessionList.remove(0);
253 edSessionList.add(first);
265 this.edSessionList.add(session);
276 public void init(ServletConfig config)
throws ServletException {
279 ServletContext context = config.getServletContext();
282 CometEngine engine = CometEngine.getEngine();
283 CometContext cometContext = engine.register(
contextPath);
284 cometContext.setExpirationDelay(Constants.COMET_TIMEOUT_SEC * 1000);
298 protected void doGet(HttpServletRequest request, HttpServletResponse response)
299 throws ServletException, IOException {
301 response.setContentType(
"text/xml;charset=UTF-8");
304 String sessionStr = request.getParameter(
"session");
305 if(sessionStr == null || sessionStr.isEmpty()){
306 sessionStr = request.getParameter(
"sessionID");
309 Long sessionId = null;
311 sessionId = Long.decode(sessionStr);
312 }
catch (NumberFormatException numberFormatException) {
314 Logger.getLogger(AnnotCometServlet.class.getName()).log(Level.ALL,
"Bad session id: " + sessionStr);
317 }
catch (Exception e) {
319 Logger.getLogger(AnnotCometServlet.class.getName()).log(Level.ALL,
"Bad session id", e);
325 if (sessionId != null) {
326 session = AppBean.getSession(sessionId);
328 if (session == null) {
330 Logger.getLogger(AnnotCometServlet.class.getName()).log(Level.ALL,
"Session not found");
332 PrintWriter writer = response.getWriter();
334 String err =
"<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"
343 AppBean.getSessionsCleaner().setSessionConfirm(session.
getSessionId());
345 String resStr = session.getAndCleanMessages();
346 if (!resStr.isEmpty()) {
348 int version = session.getNamespacesLOD();
349 StringBuilder sb =
new StringBuilder(
"<?xml version=\"1.0\" encoding=\"utf-8\" ?><messages ");
351 String sessAtt =
" sessionID=\"" + session.getSessionId() +
"\"";
356 for(
int i = 0; i < Constants.nameSpaces[version].length; i++){
357 sb.append(Constants.nameSpaces[version][i]);
360 sb.append(sessAtt).append(
">").append(resStr).append(
"</messages>");
363 PrintWriter resWriter = response.getWriter();
364 resWriter.write(sb.toString());
371 handler.addSessionInSessionList(session);
372 handler.attach(response);
375 CometEngine engine = CometEngine.getEngine();
376 CometContext context = engine.getCometContext(
contextPath);
377 context.addCometHandler(handler);
391 protected void doPost(HttpServletRequest request, HttpServletResponse response)
392 throws ServletException, IOException {
394 response.setContentType(
"text/xml;charset=UTF-8");
396 BufferedReader bufReader = request.getReader();
399 StringWriter writer =
new StringWriter();
401 while ((nextChar = bufReader.read()) != -1) {
402 writer.write(nextChar);
404 String messagesStr = writer.toString();
407 RequestInfo requestInfo = MessageProcessor.processXML(messagesStr);
408 if (requestInfo == null) {
409 PrintWriter resWriter = response.getWriter();
411 String err =
"<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"
415 resWriter.write(err);
424 if (session == null){
425 PrintWriter resWriter = response.getWriter();
427 String err =
"<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"
431 resWriter.write(err);
438 if (requestInfo.getCometSessionList() != null && !requestInfo.getCometSessionList().isEmpty()
439 && requestInfo.isSessionOnly()) {
441 Iterator<EditorSession> edSessIt = requestInfo.getCometSessionList().iterator();
442 while (edSessIt.hasNext()) {
443 AppBean.getSessionsCleaner().setSessionConfirm(edSessIt.next().getSessionId());
446 String responseString = null;
448 ArrayList<EditorSession> edSessionList = requestInfo.getCometSessionList();
450 synchronized (edSessionList) {
451 sessionWithMes = edSessionList.get(0);
452 for (
int i = 0; i < edSessionList.size(); i++) {
453 if (edSessionList.get(i).hasMessagesTSVC()) {
454 sessionWithMes = edSessionList.get(i);
455 responseString = sessionWithMes.getAndCleanMessages();
456 edSessionList.remove(i);
457 edSessionList.add(sessionWithMes);
463 if(responseString != null && !responseString.isEmpty()){
464 StringBuilder sb =
new StringBuilder(
"<?xml version=\"1.0\" encoding=\"utf-8\" ?><messages ");
466 int version = sessionWithMes.getNamespacesLOD();
469 String sessAtt =
" sessionID=\"" + sessionWithMes.getSessionId() +
"\"";
474 for(
int i = 0; i < Constants.nameSpaces[version].length; i++){
475 sb.append(Constants.nameSpaces[version][i]);
478 sb.append(sessAtt).append(
">").append(responseString).append(
"</messages>");
481 PrintWriter resWriter = response.getWriter();
482 resWriter.write(sb.toString());
489 handler.setEdSessionList(edSessionList);
490 handler.attach(response);
493 CometEngine engine = CometEngine.getEngine();
494 CometContext context = engine.getCometContext(
contextPath);
495 context.addCometHandler(handler);
498 }
else if (requestInfo.getSession() != null && requestInfo.isSessionOnly()) {
499 AppBean.getSessionsCleaner().setSessionConfirm(requestInfo.getSession().getSessionId());
502 String resStr = requestInfo.getSession().getAndCleanMessages();
503 if (!resStr.isEmpty()) {
505 int version = session.getNamespacesLOD();
506 StringBuilder sb =
new StringBuilder(
"<?xml version=\"1.0\" encoding=\"utf-8\" ?><messages ");
508 String sessAtt =
" sessionID=\"" + session.getSessionId() +
"\"";
513 for(
int i = 0; i < Constants.nameSpaces[version].length; i++){
514 sb.append(Constants.nameSpaces[version][i]);
516 sb.append(sessAtt).append(
">").append(resStr).append(
"</messages>");
519 PrintWriter resWriter = response.getWriter();
520 resWriter.write(sb.toString());
527 handler.addSessionInSessionList(requestInfo.getSession());
528 handler.attach(response);
531 CometEngine engine = CometEngine.getEngine();
532 CometContext context = engine.getCometContext(
contextPath);
533 context.addCometHandler(handler);
537 if (requestInfo.getSession() != null) {
538 AppBean.getSessionsCleaner().setSessionConfirm(requestInfo.getSession().getSessionId());
541 if (requestInfo.getCometSessionList() != null && !requestInfo.getCometSessionList().isEmpty()){
542 Iterator<EditorSession> edSessIt = requestInfo.getCometSessionList().iterator();
544 while(edSessIt.hasNext()){
545 AppBean.getSessionsCleaner().setSessionConfirm(edSessIt.next().getSessionId());
551 String responseMessages = requestInfo.getReplyText();
552 responseMessages = responseMessages + AppBean.getResponseCreator().createPostResponse(requestInfo);
553 responseMessages = responseMessages + requestInfo.getWarnings();
554 responseMessages = responseMessages + requestInfo.getErrors();
555 if (responseMessages.isEmpty()) {
556 responseMessages =
"<ok/>";
561 PrintWriter resWriter = response.getWriter();
563 int version = session.getNamespacesLOD();
564 StringBuilder sb =
new StringBuilder(
"<?xml version=\"1.0\" encoding=\"utf-8\" ?><messages ");
566 for(
int i = 0; i < Constants.nameSpaces[version].length; i++){
567 sb.append(Constants.nameSpaces[version][i]);
569 sb.append(
">").append(responseMessages).append(
"</messages>");
572 resWriter.write(sb.toString());
579 if (requestInfo.getCanNotify() && requestInfo.getFlier() != null) {
581 synchronized(AppBean.getSessions()){
582 Iterator<EditorSession> sesIt = AppBean.getSessions().iterator();
583 while (sesIt.hasNext()) {
585 es.addMessageTS(rc.createCometResponse(requestInfo.getFlier(), es));
590 CometEngine engine = CometEngine.getEngine();
591 CometContext<?> context = engine.getCometContext(
contextPath);
592 context.notify(requestInfo.getFlier());
604 return "Servlet for communication with annotation editors.";
static final int LOG_LEVEL_ALL_ERRORS
void onEvent(CometEvent event)
static final String COMET_CONTEXT_PATH
Singleton for storing global variables.
void doPost(HttpServletRequest request, HttpServletResponse response)
HttpServletResponse response
static final int ERROR_31_SESSION_EXPIRED
static final int PROTOCOL_LOD_V1
void onInitialize(CometEvent event)
void onInterrupt(CometEvent event)
void onTerminate(CometEvent event)
ArrayList< EditorSession > getEdSessionList()
static final int LOG_LEVEL
ArrayList< EditorSession > edSessionList
static final int LOG_LEVEL_ALL
void addSessionInSessionList(EditorSession session)
void removeThisFromContext()
static final int LANGUAGE_ENG
Class that creates responses and persists data.
Servlet for communication with clients (annotation editors)
void doGet(HttpServletRequest request, HttpServletResponse response)
EditorSession getFirstSessionAndRotate()
static final int PROTOCOL_LOD_V2
void setEdSessionList(ArrayList< EditorSession > edSessionList)
Processed informations about client request.
static final int ERROR_32_BAD_REQUEST
Class responsible for localised strings.
Informations about client session.
void init(ServletConfig config)
void attach(HttpServletResponse attachment)