1 package mircoders.localizer.basic;
\r
4 import mir.log.LoggerWrapper;
\r
5 import mir.session.*;
\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
18 * <p>Title: Experimental session handler for comment postings </p>
\r
19 * <p>Description: </p>
\r
20 * <p>Copyright: Copyright (c) 2003</p>
\r
22 * @author not attributable
\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
33 public MirBasicCommentPostingSessionHandler() {
\r
34 logger = new LoggerWrapper("Localizer.OpenPosting.Comment");
\r
36 configuration = MirPropertiesConfiguration.instance();
\r
38 catch (Throwable t) {
\r
39 logger.fatal("Cannont load configuration: " + t.toString());
\r
41 throw new RuntimeException("Cannont load configuration: " + t.toString());
\r
43 initialRequest= true;
\r
44 commentModule= new ModuleComment(DatabaseComment.getInstance());
\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
53 subsequentRequest(aRequest, aSession, aResponse);
\r
57 public String generateOnetimePassword() {
\r
58 Random r = new Random();
\r
59 int random = r.nextInt();
\r
61 long l = System.currentTimeMillis();
\r
63 l = (l*l*l*l)/random;
\r
67 String returnString = ""+l;
\r
69 return returnString.substring(5);
\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
79 aResponse.setResponseValue("password", password);
\r
82 aResponse.setResponseValue("password", null);
\r
83 aSession.deleteAttribute("password");
\r
86 aResponse.setResponseValue("errors", null);
\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
95 String articleId = aRequest.getParameter("to_media");
\r
97 if (articleId == null)
\r
98 throw new SessionExc("MirBasicCommentPostingSessionHandler.initialRequest: article id not set!");
\r
100 aSession.setAttribute("to_media", articleId);
\r
102 initializeResponseData(aRequest, aSession, aResponse);
\r
105 aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.EditTemplate"));
\r
107 catch (Throwable e) {
\r
108 throw new SessionFailure("Can't get configuration: " + e.getMessage(), e);
\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
124 public boolean testFieldIsNumeric(Request aRequest, String aFieldName, String anErrorMessageResource, List aValidationResults) {
\r
125 Object value = aRequest.getParameter(aFieldName);
\r
128 Integer.parseInt((String) value);
\r
131 catch (Throwable t) {
\r
132 logger.debug(" field not numeric: " + aFieldName + " value = " + value);
\r
133 aValidationResults.add(new ValidationError(aFieldName, anErrorMessageResource));
\r
141 public List validate(Request aRequest, Session aSession) throws SessionExc, SessionFailure {
\r
142 List result = new Vector();
\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
151 public void subsequentRequest(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure {
\r
153 Map commentFields = new HashMap();
\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
164 initializeResponseData(aRequest, aSession, aResponse);
\r
166 List validationErrors = validate(aRequest, aSession);
\r
168 if (validationErrors != null && validationErrors.size()>0) {
\r
169 returnValidationErrors(aRequest, aSession, aResponse, validationErrors);
\r
172 EntityComment comment = (EntityComment) commentModule.createNew ();
\r
173 comment.setValues(commentFields);
\r
175 finishComment(aRequest, aSession, comment);
\r
177 String id = comment.insert();
\r
179 afterDuplicateCommentPosting(aRequest, aSession, aResponse, comment);
\r
180 logger.info("Dupe comment rejected");
\r
181 aSession.terminate();
\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
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
198 catch (Throwable t) {
\r
199 ExceptionFunctions.traceCauseException(t).printStackTrace();
\r
201 throw new SessionFailure("MirBasicCommentPostingSessionHandler.subsequentRequest: " + t.getMessage(), t);
\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
210 if (articleId==null)
\r
211 throw new SessionExc("initializeCommentPosting: article id not set!");
\r
213 aSession.setAttribute("to_media", articleId);
\r
214 processCommentPosting(aRequest, aSession, aResponse);
\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
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
230 aResponse.setResponseValue("password", null);
\r
233 aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.EditTemplate"));
\r
236 public void processMediaFile(Request aRequest, Session aSession, EntityComment aComment, UploadedFile aFile) throws SessionExc, SessionFailure {
\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
243 catch (Throwable t) {
\r
244 throw new SessionFailure(t);
\r
248 public void finishMedia(Request aRequest, Session aSession, UploadedFile aFile, Entity aMedia) throws SessionExc, SessionFailure {
\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
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
261 public void addMedia(Request aRequest, Session aSession, EntityComment aComment) throws SessionExc, SessionFailure {
\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
269 public void afterDuplicateCommentPosting(Request aRequest, Session aSession, Response aResponse, EntityComment aComment) {
\r
270 aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.DupeTemplate"));
\r
273 public class ValidationError {
\r
274 private String field;
\r
275 private String message;
\r
276 private List parameters;
\r
278 public ValidationError(String aField, String aMessage) {
\r
279 this (aField, aMessage, new String[] {});
\r
282 public ValidationError(String aField, String aMessage, Object aParameter) {
\r
283 this (aField, aMessage, new Object[] {aParameter});
\r
286 public ValidationError(String aField, String aMessage, Object[] aParameters) {
\r
288 message = aMessage;
\r
289 parameters = Arrays.asList(aParameters);
\r
292 public String getMessage() {
\r
296 public String getField() {
\r
300 public List getParameters() {
\r