- experimental opensessions
[mir.git] / source / mircoders / localizer / basic / MirBasicCommentPostingSessionHandler.java
1 package mircoders.localizer.basic;\r
2 \r
3 import java.util.*;\r
4 import mir.log.LoggerWrapper;\r
5 import mir.session.*;\r
6 import mir.config.*;\r
7 import mir.util.*;\r
8 import mir.entity.*;\r
9 import mircoders.storage.*;\r
10 import mircoders.global.*;\r
11 import mircoders.localizer.*;\r
12 import mircoders.entity.*;\r
13 import mircoders.module.*;\r
14 import mircoders.media.*;\r
15 \r
16 /**\r
17  *\r
18  * <p>Title: Experimental session handler for comment postings </p>\r
19  * <p>Description: </p>\r
20  * <p>Copyright: Copyright (c) 2003</p>\r
21  * <p>Company: </p>\r
22  * @author not attributable\r
23  * @version 1.0\r
24  */\r
25 \r
26 public class MirBasicCommentPostingSessionHandler implements SessionHandler {\r
27   protected LoggerWrapper logger;\r
28   protected MirPropertiesConfiguration configuration;\r
29   protected boolean initialRequest;\r
30   protected ModuleComment commentModule;\r
31   protected DatabaseCommentToMedia commentToMedia = DatabaseCommentToMedia.getInstance();\r
32 \r
33   public MirBasicCommentPostingSessionHandler() {\r
34     logger = new LoggerWrapper("Localizer.OpenPosting.Comment");\r
35     try {\r
36       configuration = MirPropertiesConfiguration.instance();\r
37     }\r
38     catch (Throwable t) {\r
39       logger.fatal("Cannont load configuration: " + t.toString());\r
40 \r
41       throw new RuntimeException("Cannont load configuration: " + t.toString());\r
42     }\r
43     initialRequest= true;\r
44     commentModule= new ModuleComment(DatabaseComment.getInstance());\r
45   }\r
46 \r
47   public void processRequest(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure {\r
48     if (aSession.getAttribute("initialRequest")==null) {\r
49       initialRequest(aRequest, aSession, aResponse);\r
50       aSession.setAttribute("initialRequest", "no");\r
51     }\r
52     else {\r
53       subsequentRequest(aRequest, aSession, aResponse);\r
54     }\r
55   };\r
56 \r
57   public String generateOnetimePassword() {\r
58     Random r = new Random();\r
59     int random = r.nextInt();\r
60 \r
61     long l = System.currentTimeMillis();\r
62 \r
63     l = (l*l*l*l)/random;\r
64     if (l<0)\r
65       l = l * -1;\r
66 \r
67     String returnString = ""+l;\r
68 \r
69     return returnString.substring(5);\r
70   }\r
71 \r
72   public void initializeResponseData(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure {\r
73     if (MirGlobal.abuse().getOpenPostingPassword()) {\r
74       String password = (String) aSession.getAttribute("password");\r
75       if (password==null) {\r
76         password = generateOnetimePassword();\r
77         aSession.setAttribute("password", password);\r
78       }\r
79       aResponse.setResponseValue("password", password);\r
80     }\r
81     else {\r
82       aResponse.setResponseValue("password", null);\r
83       aSession.deleteAttribute("password");\r
84     }\r
85 \r
86     aResponse.setResponseValue("errors", null);\r
87   };\r
88 \r
89   public void initialRequest(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure{\r
90     Iterator i = DatabaseContent.getInstance().getFields().iterator();\r
91     while (i.hasNext()) {\r
92       aResponse.setResponseValue( (String) i.next(), null);\r
93     }\r
94 \r
95     String articleId = aRequest.getParameter("to_media");\r
96 \r
97     if (articleId == null)\r
98       throw new SessionExc("MirBasicCommentPostingSessionHandler.initialRequest: article id not set!");\r
99 \r
100     aSession.setAttribute("to_media", articleId);\r
101 \r
102     initializeResponseData(aRequest, aSession, aResponse);\r
103 \r
104     try {\r
105       aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.EditTemplate"));\r
106     }\r
107     catch (Throwable e) {\r
108       throw new SessionFailure("Can't get configuration: " + e.getMessage(), e);\r
109     }\r
110 \r
111   }\r
112 \r
113   public boolean testFieldExists(Request aRequest, String aFieldName, String anErrorMessageResource, List aValidationResults) {\r
114     Object value = aRequest.getParameter(aFieldName);\r
115     if (value==null || !(value instanceof String) || ((String) value).trim().length()==0) {\r
116       logger.debug("  missing field " + aFieldName + " value = " + value);\r
117       aValidationResults.add(new ValidationError(aFieldName, anErrorMessageResource));\r
118       return false;\r
119     }\r
120     else\r
121       return true;\r
122   }\r
123 \r
124   public boolean testFieldIsNumeric(Request aRequest, String aFieldName, String anErrorMessageResource, List aValidationResults) {\r
125     Object value = aRequest.getParameter(aFieldName);\r
126     if (value!=null) {\r
127       try {\r
128         Integer.parseInt((String) value);\r
129         return true;\r
130       }\r
131       catch (Throwable t) {\r
132         logger.debug("  field not numeric: " + aFieldName + " value = " + value);\r
133         aValidationResults.add(new ValidationError(aFieldName, anErrorMessageResource));\r
134         return false;\r
135       }\r
136     }\r
137     return true;\r
138   }\r
139 \r
140 \r
141   public List validate(Request aRequest, Session aSession) throws SessionExc, SessionFailure {\r
142     List result = new Vector();\r
143 \r
144     testFieldExists(aRequest, "title", "validationerror.missing", result);\r
145     testFieldExists(aRequest, "description", "validationerror.missing", result);\r
146     testFieldExists(aRequest, "creator", "validationerror.missing", result);\r
147 \r
148     return result;\r
149   }\r
150 \r
151   public void subsequentRequest(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure {\r
152     try {\r
153       Map commentFields = new HashMap();\r
154 \r
155       Iterator i = DatabaseContent.getInstance().getFields().iterator();\r
156       while (i.hasNext()) {\r
157         String field = (String) i.next();\r
158         aResponse.setResponseValue(field, aRequest.getParameter(field));\r
159         if (aRequest.getParameter(field)!=null) {\r
160           commentFields.put(field, aRequest.getParameter(field));\r
161         }\r
162       }\r
163 \r
164       initializeResponseData(aRequest, aSession, aResponse);\r
165 \r
166       List validationErrors = validate(aRequest, aSession);\r
167 \r
168       if (validationErrors != null && validationErrors.size()>0) {\r
169         returnValidationErrors(aRequest, aSession, aResponse, validationErrors);\r
170       }\r
171       else {\r
172         EntityComment comment = (EntityComment) commentModule.createNew ();\r
173         comment.setValues(commentFields);\r
174 \r
175         finishComment(aRequest, aSession, comment);\r
176 \r
177         String id = comment.insert();\r
178         if(id==null){\r
179           afterDuplicateCommentPosting(aRequest, aSession, aResponse, comment);\r
180           logger.info("Dupe comment rejected");\r
181           aSession.terminate();\r
182         }\r
183         else {\r
184           i = aRequest.getUploadedFiles().iterator();\r
185           while (i.hasNext()) {\r
186             UploadedFile file = (UploadedFile) i.next();\r
187             processMediaFile(aRequest, aSession, comment, file);\r
188           }\r
189 \r
190           afterCommentPosting(aRequest, aSession, aResponse, comment);\r
191           MirGlobal.abuse().checkComment(comment, aRequest, null);\r
192           MirGlobal.localizer().openPostings().afterCommentPosting(comment);\r
193           logger.info("Comment posted");\r
194           aSession.terminate();\r
195         }\r
196       }\r
197     }\r
198     catch (Throwable t) {\r
199       ExceptionFunctions.traceCauseException(t).printStackTrace();\r
200 \r
201       throw new SessionFailure("MirBasicCommentPostingSessionHandler.subsequentRequest: " + t.getMessage(), t);\r
202     }\r
203   }\r
204 \r
205   public void initializeCommentPosting(Request aRequest, Session aSession, Response aResponse) throws SessionFailure, SessionExc {\r
206     String articleId = aRequest.getParameter("to_media");\r
207     if (articleId==null)\r
208       articleId = aRequest.getParameter("aid");\r
209 \r
210     if (articleId==null)\r
211       throw new SessionExc("initializeCommentPosting: article id not set!");\r
212 \r
213     aSession.setAttribute("to_media", articleId);\r
214     processCommentPosting(aRequest, aSession, aResponse);\r
215   };\r
216 \r
217   public void returnValidationErrors(Request aRequest, Session aSession, Response aResponse, List aValidationErrors) throws SessionFailure, SessionExc {\r
218     aResponse.setResponseValue("errors", aValidationErrors);\r
219     aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.EditTemplate"));\r
220   };\r
221 \r
222   public void processCommentPosting(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure {\r
223     if (MirGlobal.abuse().getOpenPostingPassword()) {\r
224       String password = generateOnetimePassword();\r
225       aSession.setAttribute("password", password);\r
226       aResponse.setResponseValue("password", password);\r
227       aResponse.setResponseValue("passwd", password);\r
228     }\r
229     else {\r
230       aResponse.setResponseValue("password", null);\r
231     }\r
232 \r
233     aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.EditTemplate"));\r
234   };\r
235 \r
236   public void processMediaFile(Request aRequest, Session aSession, EntityComment aComment, UploadedFile aFile) throws SessionExc, SessionFailure {\r
237     try {\r
238       Entity mediaItem = MediaUploadProcessor.processMediaUpload(aFile);\r
239       finishMedia(aRequest, aSession, aFile, mediaItem);\r
240       mediaItem.update();\r
241       commentToMedia.addMedia(aComment.getId(), mediaItem.getId());\r
242     }\r
243     catch (Throwable t) {\r
244       throw new SessionFailure(t);\r
245     }\r
246   }\r
247 \r
248   public void finishMedia(Request aRequest, Session aSession, UploadedFile aFile, Entity aMedia) throws SessionExc, SessionFailure {\r
249   }\r
250 \r
251   public void finishComment(Request aRequest, Session aSession, EntityComment aComment) throws SessionExc, SessionFailure {\r
252     if (aSession.getAttribute("to_media") == null)\r
253       throw new SessionExc("missing to_media");\r
254 \r
255     aComment.setValueForProperty("is_published", "1");\r
256     aComment.setValueForProperty("to_comment_status", "1");\r
257     aComment.setValueForProperty("is_html","0");\r
258     aComment.setValueForProperty("to_media", (String) aSession.getAttribute("to_media"));\r
259   };\r
260 \r
261   public void addMedia(Request aRequest, Session aSession, EntityComment aComment)  throws SessionExc, SessionFailure {\r
262   }\r
263 \r
264   public void afterCommentPosting(Request aRequest, Session aSession, Response aResponse, EntityComment aComment) {\r
265     DatabaseContent.getInstance().setUnproduced("id=" + aComment.getValue("to_media"));\r
266     aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.DoneTemplate"));\r
267   };\r
268 \r
269   public void afterDuplicateCommentPosting(Request aRequest, Session aSession, Response aResponse, EntityComment aComment) {\r
270     aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.DupeTemplate"));\r
271   };\r
272 \r
273   public class ValidationError {\r
274     private String field;\r
275     private String message;\r
276     private List parameters;\r
277 \r
278     public ValidationError(String aField, String aMessage) {\r
279       this (aField, aMessage, new String[] {});\r
280     }\r
281 \r
282     public ValidationError(String aField, String aMessage, Object aParameter) {\r
283       this (aField, aMessage, new Object[] {aParameter});\r
284     }\r
285 \r
286     public ValidationError(String aField, String aMessage, Object[] aParameters) {\r
287       field = aField;\r
288       message = aMessage;\r
289       parameters = Arrays.asList(aParameters);\r
290     }\r
291 \r
292     public String getMessage() {\r
293       return message;\r
294     }\r
295 \r
296     public String getField() {\r
297       return field;\r
298     }\r
299 \r
300     public List getParameters() {\r
301       return parameters;\r
302     }\r
303   }\r
304 \r
305 \r
306 \r
307 }