* anti-abuse upgrade: filters now stored in the database (experimental)
[mir.git] / source / mircoders / localizer / basic / MirBasicArticlePostingHandler.java
index fe50c13..8c26f8d 100755 (executable)
  * exception to your version of the file, but you are not obligated to do so.
  * If you do not wish to do so, delete this exception statement from your version.
  */
-package mircoders.localizer.basic;
 
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+package mircoders.localizer.basic;
 
 import mir.entity.Entity;
 import mir.misc.StringUtil;
-import mir.session.Request;
-import mir.session.Response;
-import mir.session.Session;
-import mir.session.SessionExc;
-import mir.session.SessionFailure;
-import mir.session.UploadedFile;
-import mir.util.ExceptionFunctions;
+import mir.session.*;
+import mir.util.EntityUtility;
 import mircoders.entity.EntityContent;
 import mircoders.global.MirGlobal;
 import mircoders.media.MediaUploadProcessor;
-import mircoders.module.ModuleContent;
-import mircoders.module.ModuleMediaType;
+import mircoders.module.ModuleArticleType;
+import mircoders.module.ModuleMediafolder;
 import mircoders.storage.DatabaseContent;
 import mircoders.storage.DatabaseContentToMedia;
 import mircoders.storage.DatabaseContentToTopics;
 
+import java.util.*;
+
 /**
- *
- * <p>Title: Experimental session handler for article postings </p>
- * <p>Description: </p>
- * <p>Copyright: Copyright (c) 2003</p>
- * <p>Company: </p>
- * @author Zapata
- * @version 1.0
+ * Extensible handler for open article postings
  */
 
 public class MirBasicArticlePostingHandler extends MirBasicPostingSessionHandler {
-  protected ModuleContent contentModule = new ModuleContent(DatabaseContent.getInstance());
   protected DatabaseContentToMedia contentToMedia = DatabaseContentToMedia.getInstance();
   protected DatabaseContent contentDatabase = DatabaseContent.getInstance();
 
+  public MirBasicArticlePostingHandler() {
+    this(false);
+  }
+
+  public MirBasicArticlePostingHandler(boolean aPersistentUploadedFiles) {
+    super(aPersistentUploadedFiles);
+
+    setResponseGenerators(
+      configuration.getString("Localizer.OpenSession.article.EditTemplate"),
+      configuration.getString("Localizer.OpenSession.article.DupeTemplate"),
+      configuration.getString("Localizer.OpenSession.article.UnsupportedMediaTemplate"),
+      configuration.getString("Localizer.OpenSession.article.DoneTemplate"));
+  }
+  /**
+   * {@inheritDoc}
+   */
   protected void initializeResponseData(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure {
     super.initializeResponseData(aRequest, aSession, aResponse);
 
-    Iterator i = DatabaseContent.getInstance().getFields().iterator();
+    Iterator i = DatabaseContent.getInstance().getFieldNames().iterator();
     while (i.hasNext()) {
       String field = (String) i.next();
       aResponse.setResponseValue(field, aRequest.getParameter(field));
@@ -79,29 +80,49 @@ public class MirBasicArticlePostingHandler extends MirBasicPostingSessionHandler
     aResponse.setResponseValue("to_topic", aRequest.getParameters("to_topic"));
   }
 
+  /**
+   * {@inheritDoc}
+   */
   public void validate(List aResults, Request aRequest, Session aSession) throws SessionExc, SessionFailure {
-    testFieldEntered(aRequest, "title", "validationerror.missing", aResults);
-    testFieldEntered(aRequest, "description", "validationerror.missing", aResults);
-    testFieldEntered(aRequest, "creator", "validationerror.missing", aResults);
-    testFieldEntered(aRequest, "content_data", "validationerror.missing", aResults);
+    super.validate(aResults, aRequest, aSession);
+
+    ValidationHelper.testFieldEntered(aRequest, "title", "validationerror.missing", aResults);
+    ValidationHelper.testFieldEntered(aRequest, "description", "validationerror.missing", aResults);
+    ValidationHelper.testFieldEntered(aRequest, "creator", "validationerror.missing", aResults);
+    ValidationHelper.testFieldEntered(aRequest, "content_data", "validationerror.missing", aResults);
   }
 
-  public void finalizeArticle(Request aRequest, Session aSession, EntityContent aContent) throws SessionExc, SessionFailure {
-    aContent.setValueForProperty("is_published", "1");
-    aContent.setValueForProperty("is_produced", "0");
-    aContent.setValueForProperty("date", StringUtil.date2webdbDate(new GregorianCalendar()));
-    aContent.setValueForProperty("is_html","0");
-    aContent.setValueForProperty("publish_path", StringUtil.webdbDate2path(aContent.getValue("date")));
-    aContent.setValueForProperty("to_article_type", "1");
-    aContent.setValueForProperty("to_publisher", "1");
+  /**
+   * Called just before the article is stored in the database.
+   * The last opportunity to alter fields.
+   */
+  public void finalizeArticle(Request aRequest, Session aSession, EntityContent anArticle) throws SessionExc, SessionFailure {
+    try {
+      anArticle.setFieldValue("is_published", "1");
+      anArticle.setFieldValue("is_produced", "0");
+      anArticle.setFieldValue("date", StringUtil.date2webdbDate(new GregorianCalendar()));
+      anArticle.setFieldValue("is_html", "0");
+      anArticle.setFieldValue("publish_path", StringUtil.webdbDate2path(anArticle. getFieldValue("date")));
+
+      ModuleArticleType module = new ModuleArticleType();
+      anArticle.setFieldValue("to_article_type", module.articleTypeIdForName(configuration.getString("Localizer.OpenSession.article.DefaultArticleType")));
+      anArticle.setFieldValue("to_publisher", "1");
+    }
+    catch (Throwable t) {
+      throw new SessionFailure(t);
+    }
   }
 
-  public void setArticleTopics(Request aRequest, Session aSession, EntityContent aContent) throws SessionExc, SessionFailure {
+  /**
+   * Extracts topics from the request and associated the
+   * article to them.
+   */
+  public void setArticleTopics(Request aRequest, Session aSession, EntityContent anArticle) throws SessionExc, SessionFailure {
     // topics:
     List topics = aRequest.getParameters("to_topic");
     if (topics.size() > 0) {
       try {
-        DatabaseContentToTopics.getInstance().setTopics(aContent.getId(), topics);
+        DatabaseContentToTopics.getInstance().setTopics(anArticle.getId(), topics);
       }
       catch (Throwable e) {
         logger.error("setting content_x_topic failed");
@@ -115,34 +136,42 @@ public class MirBasicArticlePostingHandler extends MirBasicPostingSessionHandler
       String id;
       Map values = getIntersectingValues(aRequest, DatabaseContent.getInstance());
 
-      EntityContent article = (EntityContent) contentModule.createNew();
-      article.setValues(values);
+      EntityContent article = (EntityContent) contentDatabase.createNewEntity();
+      article.setFieldValues(values);
 
       finalizeArticle(aRequest, aSession, article);
       id = article.insert();
       if (id == null) {
         logger.info("Duplicate article rejected");
-        throw new DuplicateArticleExc("Duplicate article rejected");
+        throw new DuplicatePostingExc("Duplicate article rejected");
       }
       aSession.setAttribute("content", article);
 
-
       setArticleTopics(aRequest, aSession, article);
-
     }
     catch (Throwable t) {
       throw new SessionFailure(t);
     }
   }
 
-  public void processUploadedFile(Request aRequest, Session aSession, UploadedFile aFile) throws SessionExc, SessionFailure {
+  public void processAttachmentError(Request aRequest, Session aSession, Attachment aFile, Throwable anError) {
+    EntityUtility.appendLineToField( ((EntityContent) aSession.getAttribute("content")), "comment",
+        "error with attachment: " + anError.toString());
+   ((EntityContent) aSession.getAttribute("content")).update();
+  }
+
+  public void processAttachment(Request aRequest, Session aSession, Attachment aFile) throws SessionExc, SessionFailure {
     try {
       Map values = new HashMap();
-      values.put("title", aRequest.getParameter(aFile.getFieldName()+"_title"));
+      values.put("creator", aRequest.getParameter("creator"));
+      values.putAll(aFile.getAllAttributes());
       values.put("creator", aRequest.getParameter("creator"));
       values.put("to_publisher", "0");
       values.put("is_published", "1");
       values.put("is_produced", "1");
+      ModuleMediafolder module = new ModuleMediafolder();
+      values.put("to_media_folder", module.mediaFolderIdForName(configuration.getString("Localizer.OpenSession.article.DefaultMediaFolder")));
+
       Entity mediaItem = MediaUploadProcessor.processMediaUpload(aFile, values);
       mediaItem.update();
       contentToMedia.addMedia(((EntityContent) aSession.getAttribute("content")).getId(), mediaItem.getId());
@@ -165,36 +194,4 @@ public class MirBasicArticlePostingHandler extends MirBasicPostingSessionHandler
     logger.info("article posted");
   };
 
-  protected void makeInitialResponse(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure {
-    aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.article.EditTemplate"));
-  };
-
-  protected void makeResponse(Request aRequest, Session aSession, Response aResponse, List anErrors) throws SessionExc, SessionFailure {
-    aResponse.setResponseValue("errors", anErrors);
-    aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.article.EditTemplate"));
-  };
-
-  protected void makeFinalResponse(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure {
-    aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.article.DoneTemplate"));
-  };
-
-  protected void makeErrorResponse(Request aRequest, Session aSession, Response aResponse, Throwable anError) throws SessionExc, SessionFailure {
-    anError.printStackTrace();
-    Throwable rootCause = ExceptionFunctions.traceCauseException(anError);
-
-    if (rootCause instanceof DuplicateArticleExc)
-      aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.article.DupeTemplate"));
-    if (rootCause instanceof ModuleMediaType.UnsupportedMimeTypeExc) {
-      aResponse.setResponseValue("mimetype", ((ModuleMediaType.UnsupportedMimeTypeExc) rootCause).getMimeType());
-      aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.article.UnsupportedMediaTemplate"));
-    }
-    else
-      super.makeErrorResponse(aRequest, aSession, aResponse, anError);
-  };
-
-  protected static class DuplicateArticleExc extends SessionExc {
-    public DuplicateArticleExc(String aMessage) {
-      super(aMessage);
-    }
-  }
 }