very basic support for localized add/edit article pages
[mir.git] / source / mircoders / servlet / ServletModuleContent.java
index 5feb152..04d04fd 100755 (executable)
 
 package mircoders.servlet;
 
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Vector;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import mir.entity.adapter.EntityAdapterModel;
-import mir.entity.adapter.EntityIteratorAdapter;
 import mir.entity.adapter.EntityAdapter;
-import mir.log.LoggerWrapper;
+import mir.entity.adapter.EntityAdapterEngine;
+import mir.entity.adapter.EntityAdapterModel;
+import mir.generator.Generator;
 import mir.misc.StringUtil;
-import mir.servlet.ServletModule;
+import mir.servlet.AdminServletModule;
 import mir.servlet.ServletModuleExc;
 import mir.servlet.ServletModuleFailure;
-import mir.util.CachingRewindableIterator;
 import mir.util.HTTPRequestParser;
 import mir.util.JDBCStringRoutines;
 import mir.util.SQLQueryBuilder;
 import mir.util.StringRoutines;
 import mir.util.URLBuilder;
-import mir.generator.Generator;
-import mircoders.entity.*;
+import mircoders.entity.EntityContent;
+import mircoders.entity.EntityUsers;
 import mircoders.global.MirGlobal;
 import mircoders.module.ModuleContent;
 import mircoders.storage.DatabaseContent;
 import mircoders.storage.DatabaseContentToTopics;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
 /**
  * Article admin interface code
  */
 
-public class ServletModuleContent extends ServletModule
-{
-  private static ServletModuleContent instance = new ServletModuleContent();
-  public static ServletModule getInstance() { return instance; }
-  private static ModuleContent contentModule;
-
-  private ServletModuleContent() {
-    super();
-
-    logger = new LoggerWrapper("ServletModule.Content");
-
-    try {
-      contentModule = new ModuleContent();
-      mainModule = contentModule;
-    }
-    catch (Throwable e) {
-      logger.fatal("ServletModuleContent could not be initialized: " + e.toString());
-    }
-  }
-
-  public void list(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
-  {
-    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
+public class ServletModuleContent extends AdminServletModule {
+  private ModuleContent contentModule = new ModuleContent();
 
-    String where = requestParser.getParameter("where");
-    String order = requestParser.getParameterWithDefault("order", "webdb_create desc");
-    int offset = requestParser.getIntegerWithDefault("offset", 0);
-    String selectArticleUrl = requestParser.getParameter("selectarticleurl");
+  public ServletModuleContent() {
+    addPropagatedParameter("selectarticleurl");
+    addPropagatedParameter("searchtopic");
+    addPropagatedParameter("searchvalue");
+    addPropagatedParameter("searcharticletype");
 
-    returnList(aRequest, aResponse, where, order, offset, selectArticleUrl);
+    definition = "content";
+    mainModule = contentModule;
   }
 
   public void search(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc, ServletModuleFailure {
     try {
+      String extraTables = "";
       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
       SQLQueryBuilder queryBuilder = new SQLQueryBuilder();
       String searchField = requestParser.getParameterWithDefault("searchfield", "");
@@ -107,27 +88,32 @@ public class ServletModuleContent extends ServletModule
       String searchOrder = requestParser.getParameterWithDefault("searchorder", "");
       String searchispublished = requestParser.getParameterWithDefault("searchispublished", "");
       String searchArticleType = requestParser.getParameterWithDefault("searcharticletype", "");
-      String selectArticleUrl = requestParser.getParameter("selectarticleurl");
+      String searchTopic = requestParser.getParameterWithDefault("searchtopic", "");
 
       if (searchValue.length()>0) {
-        if (searchField.equals("id"))
+        if ("id".equals(searchField)) {
           queryBuilder.appendAndCondition(
             "id='"+JDBCStringRoutines.escapeStringLiteral(searchValue)+"'");
-        else if (searchField.equals("contents"))
+        }
+        else if ("contents".equals(searchField)) {
           queryBuilder.appendAndCondition(
             "(lower(content_data) like " + "'%" + JDBCStringRoutines.escapeStringLiteral(searchValue.toLowerCase()) + "%')"+
             " or (lower(description) like " + "'%" + JDBCStringRoutines.escapeStringLiteral(searchValue.toLowerCase()) + "%')");
-        else
+        }
+        else {
           queryBuilder.appendAndCondition(
             "lower("+ searchField + ") like " +
             "'%" + JDBCStringRoutines.escapeStringLiteral(searchValue.toLowerCase()) + "%'");
+        }
       }
 
       if (searchispublished.length()>0) {
-        if (searchispublished.equals("0"))
+        if ("0".equals(searchispublished)) {
           queryBuilder.appendAndCondition("is_published='f'");
-        else
+        }
+        else {
           queryBuilder.appendAndCondition("is_published='t'");
+        }
       }
 
       if (searchArticleType.length()>0) {
@@ -135,17 +121,29 @@ public class ServletModuleContent extends ServletModule
       }
 
       if (searchOrder.length()>0) {
-        if (searchOrder.equals("datedesc"))
+        if ("datedesc".equals(searchOrder)) {
           queryBuilder.appendDescendingOrder("webdb_create");
-        else if (searchOrder.equals("dateasc"))
+        }
+        else if ("dateasc".equals(searchOrder)) {
           queryBuilder.appendAscendingOrder("webdb_create");
-        else if (searchOrder.equals("title"))
+        }
+        else if ("title".equals(searchOrder)) {
           queryBuilder.appendAscendingOrder("title");
-        else if (searchOrder.equals("creator"))
+        }
+        else if ("creator".equals(searchOrder)) {
           queryBuilder.appendAscendingOrder("creator");
+        }
       }
 
-      returnList(aRequest, aResponse, queryBuilder.getWhereClause(), queryBuilder.getOrderByClause(), 0, selectArticleUrl);
+      if (searchTopic.length() > 0) {
+        queryBuilder.appendAndCondition("cxt.content_id = id");
+        queryBuilder.appendAndCondition("cxt.topic_id = " + JDBCStringRoutines.escapeStringLiteral(searchTopic));
+
+        extraTables = "content_x_topic cxt";
+      }
+
+      returnList(aRequest, aResponse, queryBuilder.getWhereClause(), queryBuilder.getOrderByClause(), 0,
+          Collections.EMPTY_MAP, null, extraTables);
     }
     catch (Throwable e) {
       throw new ServletModuleFailure(e);
@@ -153,7 +151,7 @@ public class ServletModuleContent extends ServletModule
   }
 
   public void add(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
-    editObject(aRequest, aResponse, null);
+    editObject(aRequest, aResponse, null, aRequest.getParameter("template"));
   }
 
   public void insert(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
@@ -165,21 +163,24 @@ public class ServletModuleContent extends ServletModule
       withValues.put("publish_path", StringUtil.webdbDate2path(now));
       withValues.put("to_publisher", ServletHelper.getUser(aRequest).getId());
       withValues.put("is_produced", "0");
-      if (!withValues.containsKey("is_published"))
+      if (!withValues.containsKey("is_published")) {
         withValues.put("is_published","0");
-      if (!withValues.containsKey("is_html"))
+      }
+      if (!withValues.containsKey("is_html")) {
         withValues.put("is_html","0");
+      }
 
       String webdbCreate = (String) withValues.get("webdb_create");
-      if (webdbCreate==null || webdbCreate.trim().length()==0)
+      if (webdbCreate==null || webdbCreate.trim().length()==0) {
         withValues.remove("webdb_create");
+      }
 
       String id = mainModule.add(withValues);
       logAdminUsage(aRequest, id, "object added");
 
       DatabaseContentToTopics.getInstance().setTopics(id, aRequest.getParameterValues("to_topic"));
 
-      editObject(aRequest, aResponse, id);
+      editObject(aRequest, aResponse, id, aRequest.getParameter("template"));
     }
     catch (Throwable e) {
       throw new ServletModuleFailure(e);
@@ -188,24 +189,38 @@ public class ServletModuleContent extends ServletModule
 
   public void edit(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
     String idParam = aRequest.getParameter("id");
-    if (idParam == null)
+    if (idParam == null) {
       throw new ServletModuleExc("Invalid call: id not supplied ");
-    editObject(aRequest, aResponse, idParam);
+    }
+
+    editObject(aRequest, aResponse, idParam, aRequest.getParameter("template"));
   }
 
   /**
    * Attaches media to an article
-   *
+   * @param aRequest
+   * @param aResponse
+   * @throws mir.servlet.ServletModuleExc
    */
   public void attach(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
     String  mediaIdParam = aRequest.getParameter("mid");
     String  articleId = aRequest.getParameter("articleid");
-
-    if (articleId == null || mediaIdParam==null)
+    if (articleId == null || mediaIdParam==null) {
       throw new ServletModuleExc("smod content :: attach :: articleid/mid missing");
+    }
 
-    if (!MirGlobal.accessControl().article().mayEditArticle(ServletHelper.getUser(aRequest), articleId))
+    // check if mediaIdParam and articleid are correct integers
+    try {
+      Integer.parseInt(mediaIdParam);
+      Integer.parseInt(articleId);
+    }
+    catch (NumberFormatException e) {
+      throw new ServletModuleExc("smod content :: attach :: invalid articleid/mid", e);
+    }
+    
+    if (!MirGlobal.accessControl().article().mayEditArticle(ServletHelper.getUser(aRequest), articleId)) {
       throw new ServletModuleExc("Article has been locked");
+    }
 
     try {
       EntityContent entContent = (EntityContent) mainModule.getById(articleId);
@@ -217,14 +232,13 @@ public class ServletModuleContent extends ServletModule
 
     logAdminUsage(aRequest, articleId, "media " + mediaIdParam + " attached");
 
-    editObject(aRequest, aResponse, articleId);
+    editObject(aRequest, aResponse, articleId, aRequest.getParameter("template"));
   }
 
   /**
    * Deattaches media from an article
    */
-  public void dettach(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
-  {
+  public void dettach(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
     String  articleId = aRequest.getParameter("articleid");
     String  midParam = aRequest.getParameter("mid");
     if (articleId == null)
@@ -245,7 +259,7 @@ public class ServletModuleContent extends ServletModule
 
     logAdminUsage(aRequest, articleId, "media " + midParam + " deattached");
 
-    editObject(aRequest, aResponse, articleId);
+    editObject(aRequest, aResponse, articleId, aRequest.getParameter("request"));
   }
 
   /**
@@ -256,17 +270,19 @@ public class ServletModuleContent extends ServletModule
     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
 
     String idParam = requestParser.getParameter("id");
-    if (idParam == null)
+    if (idParam == null) {
       throw new ServletModuleExc("Wrong call: (id) is missing");
+    }
 
     EntityUsers user = ServletHelper.getUser(aRequest);
 
-    if (!MirGlobal.accessControl().article().mayLockArticle(user, idParam))
+    if (!MirGlobal.accessControl().article().mayLockArticle(user, idParam)) {
       throw new ServletModuleExc("Unable to lock");
+    }
 
     contentModule.lockArticle(idParam, user.getId(), false);
 
-    editObject(aRequest, aResponse, idParam);
+    editObject(aRequest, aResponse, idParam, aRequest.getParameter("template"));
   }
 
   /**
@@ -277,66 +293,73 @@ public class ServletModuleContent extends ServletModule
     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
 
     String idParam = requestParser.getParameter("id");
-    if (idParam == null)
+    if (idParam == null) {
       throw new ServletModuleExc("Wrong call: (id) is missing");
+    }
 
     EntityUsers user = ServletHelper.getUser(aRequest);
 
-    if (!MirGlobal.accessControl().article().mayUnlockArticle(user, idParam))
+    if (!MirGlobal.accessControl().article().mayUnlockArticle(user, idParam)) {
       throw new ServletModuleExc("Unable to unlock");
+    }
 
     contentModule.unlockArticle(idParam, user.getId(), false);
 
-    editObject(aRequest, aResponse, idParam);
+    editObject(aRequest, aResponse, idParam, aRequest.getParameter("template"));
   }
 
   /**
    * Forcelocks an article
    */
-  public void forcelock(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
-  {
+  public void forcelock(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
 
     String idParam = requestParser.getParameter("id");
-    if (idParam == null)
+    if (idParam == null) {
       throw new ServletModuleExc("Wrong call: (id) is missing");
+    }
 
     EntityUsers user = ServletHelper.getUser(aRequest);
 
-    if (!MirGlobal.accessControl().article().mayForceLockArticle(user, idParam))
+    if (!MirGlobal.accessControl().article().mayForceLockArticle(user, idParam)) {
       throw new ServletModuleExc("Unable to force lock");
+    }
 
     contentModule.lockArticle(idParam, user.getId(), true);
 
-    editObject(aRequest, aResponse, idParam);
+    editObject(aRequest, aResponse, idParam, aRequest.getParameter("template"));
   }
 
   /**
    * Stores an article
    */
-  public void update(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
-  {
+  public void update(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
     try {
       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
 
       String idParam = requestParser.getParameter("id");
-      if (idParam == null)
+      if (idParam == null) {
         throw new ServletModuleExc("Wrong call: (id) is missing");
+      }
 
-      if (!MirGlobal.accessControl().article().mayEditArticle(ServletHelper.getUser(aRequest), idParam))
+      if (!MirGlobal.accessControl().article().mayEditArticle(ServletHelper.getUser(aRequest), idParam)) {
         throw new ServletModuleExc("Article has been locked");
+      }
 
       Map withValues = getIntersectingValues(aRequest, DatabaseContent.getInstance());
 
       withValues.put("is_produced", "0");
-      if (!withValues.containsKey("is_published"))
+      if (!withValues.containsKey("is_published")) {
         withValues.put("is_published","0");
-      if (!withValues.containsKey("is_html"))
+      }
+      if (!withValues.containsKey("is_html")) {
         withValues.put("is_html","0");
+      }
 
       String webdbCreate = (String) withValues.get("webdb_create");
-      if (webdbCreate==null || webdbCreate.trim().length()==0)
+      if (webdbCreate==null || webdbCreate.trim().length()==0) {
         withValues.remove("webdb_create");
+      }
 
       String id = mainModule.set(withValues);
 
@@ -345,11 +368,11 @@ public class ServletModuleContent extends ServletModule
       DatabaseContentToTopics.getInstance().setTopics(aRequest.getParameter("id"), aRequest.getParameterValues("to_topic"));
 
       if (MirGlobal.accessControl().article().mayUnlockArticle(ServletHelper.getUser(aRequest), idParam) &&
-         (requestParser.getParameterWithDefault("unlock", "0").equals("1"))) {
+          requestParser.getParameterWithDefault("unlock", "0").equals("1")) {
         contentModule.unlockArticle(id, ServletHelper.getUser(aRequest).getId(), false);
       }
 
-      editObject(aRequest, aResponse, idParam);
+      editObject(aRequest, aResponse, idParam, aRequest.getParameter("template"));
     }
     catch (Throwable e) {
       throw new ServletModuleFailure(e);
@@ -360,104 +383,108 @@ public class ServletModuleContent extends ServletModule
   /**
    * Returns the basic article editing form.
    *
-   * @param id identifier of the article. <code>null</code>, means show an
-   *     empty form to add a new article.
+   * @param anId identifier of the article. <code>null</code>, means show an
+   * @param aTemplate
    */
-  public void editObject(HttpServletRequest aRequest, HttpServletResponse aResponse, String id)
-      throws ServletModuleExc {
+  public void editObject(HttpServletRequest aRequest, HttpServletResponse aResponse,
+                         String anId, String aTemplate) throws ServletModuleExc {
     try {
       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
       Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});
       EntityAdapterModel model = MirGlobal.localizer().dataModel().adapterModel();
-      Map article;
+      Object article;
       URLBuilder urlBuilder = new URLBuilder();
 
       urlBuilder.setValue("module", "Content");
       urlBuilder.setValue("do", "edit");
-      urlBuilder.setValue("id", id);
+      urlBuilder.setValue("id", anId);
+      urlBuilder.setValue("template", aTemplate);
       urlBuilder.setValue("returnurl", requestParser.getParameter("returnurl"));
 
-      if (id!=null) {
+      if (anId !=null) {
         responseData.put("new", Boolean.FALSE);
-        article = model.makeEntityAdapter("content", mainModule.getById(id));
+        article = model.makeEntityAdapter("content", mainModule.getById(anId));
 
         EntityUsers user = ServletHelper.getUser(aRequest);
 
-        responseData.put("mayEdit", new Boolean(MirGlobal.accessControl().article().mayEditArticle(user, id)));
-        responseData.put("mayLock", new Boolean(MirGlobal.accessControl().article().mayLockArticle(user, id)));
-        responseData.put("mayForceLock", new Boolean(MirGlobal.accessControl().article().mayForceLockArticle(user, id)));
-        responseData.put("mayUnlock", new Boolean(MirGlobal.accessControl().article().mayUnlockArticle(user, id)));
+        responseData.put("mayEdit",
+                Boolean.valueOf(MirGlobal.accessControl().article().mayEditArticle(user, anId)));
+        responseData.put("mayLock",
+                Boolean.valueOf(MirGlobal.accessControl().article().mayLockArticle(user, anId)));
+        responseData.put("mayForceLock",
+                Boolean.valueOf(MirGlobal.accessControl().article().mayForceLockArticle(user, anId)));
+        responseData.put("mayUnlock",
+                Boolean.valueOf(MirGlobal.accessControl().article().mayUnlockArticle(user, anId)));
       }
       else {
         List fields = DatabaseContent.getInstance().getFieldNames();
         responseData.put("new", Boolean.TRUE);
-        article = new HashMap();
+
+        Map emptyArticle = new HashMap();
+
         Iterator i = fields.iterator();
         while (i.hasNext()) {
-          article.put(i.next(), null);
+          emptyArticle.put(i.next(), null);
         }
 
-        article.put("to_topics", null);
+        emptyArticle.put("to_topics", null);
 
-        MirGlobal.localizer().adminInterface().initializeArticle(article);
+        MirGlobal.localizer().adminInterface().initializeArticle(emptyArticle);
+        article = emptyArticle;
 
         responseData.put("mayEdit", Boolean.TRUE);
         responseData.put("mayLock", Boolean.FALSE);
         responseData.put("mayForceLock", Boolean.FALSE);
         responseData.put("mayUnlock", Boolean.FALSE);
+
       }
       responseData.put("article", article);
 
-      List topicsList = new Vector();
+      List topicsList = new ArrayList();
 
-      String[] topicCategories = configuration.getStringArray("Mir.Localizer.Admin.TopicLists");
+      String[] topicCategories = getConfiguration().getStringArray("Mir.Localizer.Admin.TopicLists");
 
       if (topicCategories.length==0 ) {
         Map categoryMap = new HashMap();
         categoryMap.put("key", "topic");
         categoryMap.put("listtype", "0");
         categoryMap.put("listparameter", "3");
-        categoryMap.put("items",
-                        new EntityIteratorAdapter("", "title",
-            20, MirGlobal.localizer().dataModel().adapterModel(), "topic"));
+        categoryMap.put("items", EntityAdapterEngine.retrieveAdapterList(model, "topic", "", "title", -1, 0));
         topicsList.add(categoryMap);
       }
-      else
-      {
-
+      else {
         for (int i = 0; i < topicCategories.length; i++) {
-          try {
-            Map categoryMap = new HashMap();
-            List parts = StringRoutines.splitString(topicCategories[i], ":");
-            String key = null;
-            String listtype = "0";
-            String listparameter = "5";
-            String where = "";
-            String order = "";
-
-            if (parts.size() > 0)
-              key = (String) parts.get(0);
-            if (parts.size() > 1)
-              listtype = (String) parts.get(1);
-            if (parts.size() > 2)
-              listparameter = (String) parts.get(2);
-            if (parts.size() > 3)
-              where = (String) parts.get(3);
-            if (parts.size() > 4)
-              order = (String) parts.get(4);
-
-            if (key != null) {
-              categoryMap.put("key", key);
-              categoryMap.put("listtype", listtype);
-              categoryMap.put("listparameter", listparameter);
-              categoryMap.put("items",
-                              new EntityIteratorAdapter(where, order,
-                  20, MirGlobal.localizer().dataModel().adapterModel(), "topic"));
-              topicsList.add(categoryMap);
-            }
+          Map categoryMap = new HashMap();
+          List parts = StringRoutines.splitString(topicCategories[i], ":");
+
+          String key = null;
+
+          if (parts.size() > 0) {
+            key = (String) parts.get(0);
           }
-          catch (Throwable t) {
-            logger.error("error while preparing topics: " + t.toString());
+          String listtype = "0";
+          if (parts.size() > 1) {
+            listtype = (String) parts.get(1);
+          }
+          String listparameter = "5";
+          if (parts.size() > 2) {
+            listparameter = (String) parts.get(2);
+          }
+          String where = "";
+          if (parts.size() > 3) {
+            where = (String) parts.get(3);
+          }
+          String order = "";
+          if (parts.size() > 4) {
+            order = (String) parts.get(4);
+          }
+
+          if (key != null) {
+            categoryMap.put("key", key);
+            categoryMap.put("listtype", listtype);
+            categoryMap.put("listparameter", listparameter);
+            categoryMap.put("items", EntityAdapterEngine.retrieveAdapterList(model, "topic", where, order, -1, 0));
+            topicsList.add(categoryMap);
           }
         }
       }
@@ -467,95 +494,18 @@ public class ServletModuleContent extends ServletModule
       responseData.put("returnurl", requestParser.getParameter("returnurl"));
       responseData.put("thisurl", urlBuilder.getQuery());
 
-      ServletHelper.generateResponse(aResponse.getWriter(), responseData, editGenerator);
-    }
-    catch (Throwable e) {
-      throw new ServletModuleFailure(e);
-    }
-  }
-
-  public void returnList(HttpServletRequest aRequest, HttpServletResponse aResponse,
-     String aWhereClause, String anOrderByClause, int anOffset) throws ServletModuleExc {
-    this.returnList(aRequest, aResponse, aWhereClause, anOrderByClause, anOffset, null);
-  }
-
-  public void returnList(
-       HttpServletRequest aRequest,
-       HttpServletResponse aResponse,
-       String aWhereClause,
-       String anOrderByClause,
-       int anOffset,
-       String aSelectArticleUrl) throws ServletModuleExc {
-
-    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
-    URLBuilder urlBuilder = new URLBuilder();
-    int count;
-
-    try {
-      Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});
-      Object articleList =
-          new CachingRewindableIterator(
-            new EntityIteratorAdapter( aWhereClause, anOrderByClause, nrEntitiesPerListPage,
-               MirGlobal.localizer().dataModel().adapterModel(), "content", nrEntitiesPerListPage, anOffset)
-      );
-
-      responseData.put("nexturl", null);
-      responseData.put("prevurl", null);
-
-      count=mainModule.getSize(aWhereClause);
-
-      urlBuilder.setValue("module", "Content");
-      urlBuilder.setValue("do", "list");
-      urlBuilder.setValue("where", aWhereClause);
-      urlBuilder.setValue("order", anOrderByClause);
-
-
-      urlBuilder.setValue("searchfield", requestParser.getParameter("searchfield"));
-      urlBuilder.setValue("searchvalue", requestParser.getParameter("searchvalue"));
-      urlBuilder.setValue("searchispublished", requestParser.getParameter("searchispublished"));
-      urlBuilder.setValue("searchorder", requestParser.getParameter("searchorder"));
-      urlBuilder.setValue("searcharticletype", requestParser.getParameter("searcharticletype"));
-      urlBuilder.setValue("selectarticleurl", aSelectArticleUrl);
-
-      responseData.put("searchfield", requestParser.getParameter("searchfield"));
-      responseData.put("searchvalue", requestParser.getParameter("searchvalue"));
-      responseData.put("searchispublished", requestParser.getParameter("searchispublished"));
-      responseData.put("searchorder", requestParser.getParameter("searchorder"));
-      responseData.put("searcharticletype", requestParser.getParameter("searcharticletype"));
-      responseData.put("selectarticleurl", aSelectArticleUrl);
-
-      urlBuilder.setValue("offset", anOffset);
-      responseData.put("offset" , new Integer(anOffset).toString());
-      responseData.put("thisurl" , urlBuilder.getQuery());
-
-      if (count>=anOffset+nrEntitiesPerListPage) {
-        urlBuilder.setValue("offset", (anOffset + nrEntitiesPerListPage));
-        responseData.put("nexturl" , urlBuilder.getQuery());
-      }
-
-      if (anOffset>0) {
-        urlBuilder.setValue("offset", Math.max(anOffset - nrEntitiesPerListPage, 0));
-        responseData.put("prevurl" , urlBuilder.getQuery());
+      if (aTemplate == null) {
+        aTemplate = editGenerator;
       }
 
-      responseData.put("articles", articleList);
-
-      responseData.put("from" , Integer.toString(anOffset+1));
-      responseData.put("count", Integer.toString(count));
-      responseData.put("to", Integer.toString(Math.min(anOffset+nrEntitiesPerListPage, count)));
-      responseData.put("offset" , Integer.toString(anOffset));
-      responseData.put("order", anOrderByClause);
-      responseData.put("where" , aWhereClause);
-
-      ServletHelper.generateResponse(aResponse.getWriter(), responseData, listGenerator);
+      ServletHelper.generateResponse(aResponse.getWriter(), responseData, aTemplate);
     }
     catch (Throwable e) {
       throw new ServletModuleFailure(e);
     }
   }
 
-  public void selectparent(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
-  {
+  public void selectparent(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
     try {
       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
       URLBuilder urlBuilder = new URLBuilder();
@@ -565,7 +515,8 @@ public class ServletModuleContent extends ServletModule
       urlBuilder.setValue("childid", requestParser.getParameter("id"));
       urlBuilder.setValue("returnurl", requestParser.getParameter("returnurl"));
 
-      returnList(aRequest, aResponse, "", "", 0, urlBuilder.getQuery());
+      returnList(aRequest, aResponse, "", "", 0,
+          Collections.singletonMap("selectarticleurl", urlBuilder.getQuery()));
     }
     catch (Throwable e) {
       throw new ServletModuleFailure(e);
@@ -573,22 +524,22 @@ public class ServletModuleContent extends ServletModule
   }
 
   public void listchildren(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
-    try {
-      HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
-      String articleId = requestParser.getParameter("article_id");
+    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
+    String articleId = requestParser.getParameter("article_id");
 
-      if (articleId == null)
-        throw new ServletModuleExc("ServletModuleContent.listchildren: article_id not set!");
+    if (articleId == null) {
+      throw new ServletModuleExc("ServletModuleContent.listchildren: article_id not set!");
+    }
 
-      returnList(aRequest, aResponse, "to_content = " + articleId, "webdb_create desc", 0, null);
+    try {
+      returnList(aRequest, aResponse, "to_content = " + articleId, "webdb_create desc", 0);
     }
     catch (Throwable e) {
       throw new ServletModuleFailure(e);
     }
   }
 
-  public void setparent(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
-  {
+  public void setparent(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
     String articleId = requestParser.getParameter("childid");
     String parentId  = requestParser.getParameter("id");
@@ -605,29 +556,28 @@ public class ServletModuleContent extends ServletModule
       logAdminUsage(aRequest, articleId, "parent set to " + parentId);
     }
     catch(Throwable e) {
-      logger.error("ServletModuleContent.setparent: " + e.getMessage());
+      getLogger().error("ServletModuleContent.setparent: " + e.getMessage());
+
       throw new ServletModuleFailure(e);
     }
 
     ServletHelper.redirect(aResponse, returnUrl);
   }
 
-  public void clearparent(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
-  {
+  public void clearparent(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
     String articleId = requestParser.getParameter("id");
     String returnUrl = requestParser.getParameter("returnurl");
 
     try {
       EntityContent article = (EntityContent) mainModule.getById(articleId);
-      article.setFieldValue("to_content", "");
+      article.setFieldValue("to_content", null);
       article.setProduced(false);
       article.update();
       logAdminUsage(aRequest, articleId, "parent cleared");
     }
     catch(Throwable e) {
-      e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE));
-      logger.error("ServletModuleContent.clearparent: " + e.getMessage());
+      getLogger().error("ServletModuleContent.clearparent: " + e.getMessage(), e);
 
       throw new ServletModuleFailure("ServletModuleContent.clearparent: " + e.getMessage(), e);
     }
@@ -639,14 +589,14 @@ public class ServletModuleContent extends ServletModule
     try {
       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
       String articleId = requestParser.getParameter("id");
-      EntityAdapter article = model.makeEntityAdapter("content", mainModule.getById(articleId));
+      EntityAdapter article = getModel().makeEntityAdapter("content", mainModule.getById(articleId));
       String preview = requestParser.getParameterWithDefault("preview", "default");
 
       Map generationValues = new HashMap();
       Generator generator =
           MirGlobal.localizer().adminInterface().prepareArticlePreview(preview, article, generationValues);
 
-      generator.generate(aResponse.getWriter(), generationValues, logger);
+      generator.generate(aResponse.getWriter(), generationValues, getLogger());
     }
     catch (Exception e) {
       throw new ServletModuleFailure(e);