4A Server -  2.0
 All Classes Namespaces Files Functions Variables Enumerator
ResponseCreator.java
Go to the documentation of this file.
1 /*
2  * Project: Server for annotations sharing
3  * Author: Ing. Jaroslav Dytrych idytrych@fit.vutbr.cz
4  * File: ResponseCreator.java
5  * Description: Class that creates responses and persists data
6  */
7 
8 /**
9  * @file ResponseCreator.java
10  *
11  * @brief Class that creates responses and persists data
12  */
13 
14 package cz.vutbr.fit.knot.annotations.comet;
15 
21 import java.util.ArrayList;
22 import java.util.Iterator;
23 import java.util.List;
24 import java.util.concurrent.locks.ReentrantLock;
25 import java.util.logging.Level;
26 import java.util.logging.Logger;
27 
28 /**
29  * Class that creates responses (calls modules) and persists data
30  *
31  * @brief Class that creates responses and persists data
32  * @author idytrych
33  */
34 public class ResponseCreator {
35  ArrayList<AnnotServerModule> modules;
36 
37  /**
38  * Constructor (loads basic modules)
39  */
40  public ResponseCreator() {
41  modules = new ArrayList<AnnotServerModule>();
42 
43  // TODO: Remove this and replace with anything better.
49  // modules.add(new module());
50  // modules.add(new module());
51  }
52 
53  /**
54  * Creates response to client POST request (not to comet request).
55  * Calls modules, assembly response and persists data.
56  *
57  * @param requestInfo Informations about client POST request
58  * @return Returns string with messages for the client in XML
59  */
60  public String createPostResponse(RequestInfo requestInfo) {
61  String response = "";
62  try {
63  if (requestInfo.getSession() == null) { // if this request is not in valid session
64  requestInfo.setCanNotify(false);
65  return "";
66  }
67  // Call modules (method of module that is called before persisting data)
68  Iterator<AnnotServerModule> moduleIter = modules.iterator();
69  while (moduleIter.hasNext()) {
70  AnnotServerModule module = moduleIter.next();
71  try {
72  response = response + module.processRequestBeforePersist(requestInfo);
73  } catch (Exception e) {
74  int lNum = requestInfo.getSession().getLanguageNum();
75  int lod = requestInfo.getSession().getProtocolLOD();
76  String errInfo = "<module name=\"" + module.getModuleName(lNum) + "\"/>";
77  requestInfo.addError(lod, lNum, Localisation.ERROR_33_MODULE_ERROR, errInfo, e.toString());
79  String msg = "Exception in the server module " + module.getModuleName(lNum)
80  + " before persist";
81  Logger.getLogger(ResponseCreator.class.getName()).log(Level.SEVERE, msg, e);
82  }
83  }
84  }
85 
86  // Persist all entities
87  boolean persistFailed = Persister.persist(requestInfo);
88 
89  if (persistFailed) { // if persist failed (transaction rollback)
90  int lNum = requestInfo.getSession().getLanguageNum();
91  int lod = requestInfo.getSession().getProtocolLOD();
92  requestInfo.addError(lod, lNum, Localisation.ERROR_48_PERSISTENCE_ERROR);
93  requestInfo.setCanNotify(false); // comet handlers can't be notified
94  }
95 
96  // Call modules (method of module that is called after persisting data)
97  moduleIter = modules.iterator();
98  while (moduleIter.hasNext()) {
99  AnnotServerModule module = moduleIter.next();
100  try {
101  response = response + module.processRequestAfterPersist(requestInfo, persistFailed);
102  } catch (Exception e) {
103  int lNum = requestInfo.getSession().getLanguageNum();
104  int lod = requestInfo.getSession().getProtocolLOD();
105  String errInfo = "<module name=\"" + module.getModuleName(requestInfo.getSession().getLanguageNum()) + "\"/>";
106  requestInfo.addError(lod, lNum, Localisation.ERROR_33_MODULE_ERROR, errInfo, e.toString());
108  String msg = "Exception in the server module " + module.getModuleName(lNum)
109  + " after persist";
110  Logger.getLogger(ResponseCreator.class.getName()).log(Level.SEVERE, msg, e);
111  }
112  }
113  }
114 
115  // Add reloaded annotations
116  response = response + createReloadedAnnot(requestInfo);
117  // Add settings
118  if (requestInfo.getSession().getProtocolLOD() != Constants.PROTOCOL_LOD_V2) {
119  if ((requestInfo.getSettings() != null && !requestInfo.getSettings().isEmpty()) || requestInfo.getLoggedIn() != null) {
120  response = response + createSettings(requestInfo);
121  }
122  } else if (requestInfo.getLoggedIn() != null) {
123  // send only when user is just logged (while communicate by protocol v 2.0)
124  response = response + createSettings(requestInfo);
125  }
126  } finally {
127  synchronized (AppBean.documentURILocker) {
128  if(requestInfo.getSyncDocumentData() != null){
129  ReentrantLock lock = AppBean.documentURILocker.get(requestInfo.getSyncDocumentData().getUri());
130  if(lock.isLocked()){
131  lock.unlock();
132  }
133  }
134  }
135  }
136 
137  return response;
138  } // createPostResponse()
139 
140  /**
141  * Creates response to client's comet request (GET or special POST).
142  * Calls modules and assembly response.
143  *
144  * @param flier Flier with informations
145  * @param session Client's session
146  * @return Returns string with messages for the client in XML
147  */
148  public String createCometResponse(Flier flier, EditorSession session) {
149  String response = "";
150  // Call modules and assembly response
151  Iterator<AnnotServerModule> moduleIter = modules.iterator();
152  while (moduleIter.hasNext()) {
153  AnnotServerModule module = moduleIter.next();
154  try {
155  response = response + module.messagesFromFlier(flier,session);
156  } catch (Exception e) {
157  int lNum = session.getLanguageNum();
158  String errInfo = "<module name=\"" + module.getModuleName(session.getLanguageNum()) + "\"/>";
159  response = response + RequestInfo.createErrorMsg(session.getProtocolLOD(), lNum, Localisation.ERROR_33_MODULE_ERROR, errInfo, e.toString());
161  String msg = "Exception in the server module " + module.getModuleName(lNum)
162  + " during the creating of comet response.";
163  Logger.getLogger(ResponseCreator.class.getName()).log(Level.SEVERE, msg, e);
164  }
165  }
166  }
167 
168  return response;
169  } // createCometResponse()
170 
171  /**
172  * Creates message with user settings
173  *
174  * @param requestInfo Informations about client request
175  * @return Returns messages with user settings in XML
176  */
177  public String createSettings(RequestInfo requestInfo) {
178  String retString = "";
179  Iterator setIter = requestInfo.getSession().getSettings().iterator();
180  while (setIter.hasNext()) {
181  Settings param = (Settings) setIter.next();
182  retString = retString + param.toXMLString();
183  }
184 
185  retString = "<settings>" + retString + "</settings>";
186 
187  return retString;
188  }
189 
190  /**
191  * Creates message with reloaded annotations
192  *
193  * @param requestInfo Informations about client request
194  * @return Returns requested annotations in XML (in annotations change message)
195  */
196  public String createReloadedAnnot(RequestInfo requestInfo) {
197  String retString = "";
198  // check minimal protocol version
199  boolean proto11 = requestInfo.getSession().getProtocolLOD() > 1;
200  Iterator<Annotation> reloadedIter = requestInfo.getReloadAnnotations().iterator();
201  while (reloadedIter.hasNext()) {
202  Annotation relAnnot = reloadedIter.next();
203  Object[] params = new Object[2];
204  params[0] = "id";
205  params[1] = relAnnot.getId();
206  List rList = AppBean.getPersistenceManager().queryDB("Annotation.findById", params);
207  if (rList != null && !rList.isEmpty()) {
208  relAnnot = (Annotation) rList.get(0);
209  }
210  if(requestInfo.getSession().getProtocolLOD() == Constants.PROTOCOL_LOD_V2){
211  ArrayList<String> attFilter = requestInfo.getSession().getAttFilter();
212  int lNum = requestInfo.getSession().getLanguageNum();
213  Boolean KBRefMode = requestInfo.getSession().getKBRefMode();
214  retString = retString + relAnnot.toXMLStringV2(attFilter, lNum, KBRefMode);
215  }else{
216  retString = retString + relAnnot.toXMLString(proto11);
217  }
218  }
219  if (!retString.isEmpty()) {
220  if(requestInfo.getSession().getProtocolLOD() == Constants.PROTOCOL_LOD_V2){
221  return "<annotations><addAnnotations>" + retString + "</addAnnotations></annotations>";
222  }else{
223  return "<annotations><change>" + retString + "</change></annotations>";
224  }
225  }
226  return retString;
227  }
228 
229  /**
230  * Gets list of active server modules
231  *
232  * @return Returns list of active server modules
233  */
234  public ArrayList<AnnotServerModule> getModules() {
235  return modules;
236  }
237 
238  /**
239  * Sets list of active server modules
240  *
241  * @param modules List of active server modules
242  */
243  public void setModules(ArrayList<AnnotServerModule> modules) {
244  this.modules = modules;
245  }
246 
247  /**
248  * Adds server module to list of active modules
249  *
250  * @param module Module to be added
251  */
252  public void addModule(AnnotServerModule module) {
253  this.modules.add(module);
254  }
255 
256  /**
257  * Removes server module from list of active modules
258  *
259  * @param module Module to be removed
260  * @return If succeed, returns removed module, else returns null
261  */
262  public boolean removeModule(AnnotServerModule module) {
263  return this.modules.remove(module);
264  }
265 } // class ResponseCreator
Document, annotations and types manipulation functionality.
static HashMap< String, ReentrantLock > documentURILocker
Definition: AppBean.java:78
Singleton for storing global variables.
Definition: AppBean.java:47
Class provides connection of SEC Dictionary module with server.
Class representing parameter of user settings.
Definition: Settings.java:45
void setModules(ArrayList< AnnotServerModule > modules)
Class provides connection of Storyscope Interface module with server.
Flier with informations for comet handlers.
Definition: Flier.java:31
Operations with persons (users of this server) and with user groups.
Class that creates responses and persists data.
Processed informations about client request.
Class responsible for localised strings.
Informations about client session.
String createPostResponse(RequestInfo requestInfo)
String createCometResponse(Flier flier, EditorSession session)