- multiple "producer" shortcuts possible
[mir.git] / source / mircoders / servlet / ServletModuleContent.java
index 0300a58..c9ef69f 100755 (executable)
@@ -1,5 +1,5 @@
 /*\r
- * Copyright (C) 2001, 2002  The Mir-coders group\r
+ * Copyright (C) 2001, 2002 The Mir-coders group\r
  *\r
  * This file is part of Mir.\r
  *\r
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
  *\r
  * In addition, as a special exception, The Mir-coders gives permission to link\r
- * the code of this program with the com.oreilly.servlet library, any library\r
- * licensed under the Apache Software License, The Sun (tm) Java Advanced\r
- * Imaging library (JAI), The Sun JIMI library (or with modified versions of\r
- * the above that use the same license as the above), and distribute linked\r
- * combinations including the two.  You must obey the GNU General Public\r
- * License in all respects for all of the code used other than the above\r
- * mentioned libraries.  If you modify this file, you may extend this exception\r
- * to your version of the file, but you are not obligated to do so.  If you do\r
- * not wish to do so, delete this exception statement from your version.\r
+ * the code of this program with  any library licensed under the Apache Software License,\r
+ * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library\r
+ * (or with modified versions of the above that use the same license as the above),\r
+ * and distribute linked combinations including the two.  You must obey the\r
+ * GNU General Public License in all respects for all of the code used other than\r
+ * the above mentioned libraries.  If you modify this file, you may extend this\r
+ * exception to your version of the file, but you are not obligated to do so.\r
+ * If you do not wish to do so, delete this exception statement from your version.\r
  */\r
 \r
 package mircoders.servlet;\r
 \r
-import java.io.IOException;\r
 import java.util.GregorianCalendar;\r
 import java.util.HashMap;\r
 import java.util.Iterator;\r
-import java.util.List;\r
+import java.util.*;\r
+import java.util.Locale;\r
 import java.util.Map;\r
-\r
 import javax.servlet.http.HttpServletRequest;\r
 import javax.servlet.http.HttpServletResponse;\r
-import javax.servlet.http.HttpSession;\r
 \r
 import mir.entity.adapter.EntityAdapterModel;\r
 import mir.entity.adapter.EntityIteratorAdapter;\r
 import mir.log.LoggerWrapper;\r
 import mir.misc.StringUtil;\r
-import mir.module.ModuleException;\r
 import mir.servlet.ServletModule;\r
 import mir.servlet.ServletModuleExc;\r
-import mir.servlet.ServletModuleUserExc;\r
 import mir.servlet.ServletModuleFailure;\r
-import mir.storage.StorageObjectFailure;\r
 import mir.util.CachingRewindableIterator;\r
 import mir.util.HTTPRequestParser;\r
 import mir.util.JDBCStringRoutines;\r
 import mir.util.SQLQueryBuilder;\r
-import mir.util.URLBuilder;\r
+import mir.util.*;\r
 import mircoders.entity.EntityContent;\r
-import mircoders.entity.EntityUsers;\r
 import mircoders.global.MirGlobal;\r
 import mircoders.module.ModuleContent;\r
-import mircoders.search.IndexUtil;\r
-import mircoders.storage.DatabaseComment;\r
 import mircoders.storage.DatabaseContent;\r
 import mircoders.storage.DatabaseContentToTopics;\r
 \r
-import org.apache.lucene.index.IndexReader;\r
-\r
-import freemarker.template.SimpleHash;\r
-\r
 /*\r
  *  ServletModuleContent -\r
  *  deliver html for the article admin form.\r
  *\r
- * @version $Id: ServletModuleContent.java,v 1.40 2003/03/06 05:40:40 zapata Exp $\r
+ * @version $Id: ServletModuleContent.java,v 1.52.2.11 2003/09/24 02:08:04 zapata Exp $\r
  * @author rk, mir-coders\r
  *\r
  */\r
 \r
 public class ServletModuleContent extends ServletModule\r
 {\r
-  private String editTemplate = configuration.getString("ServletModule.Content.ObjektTemplate");;\r
-  private String listTemplate = configuration.getString("ServletModule.Content.ListTemplate");\r
-\r
   private static ServletModuleContent instance = new ServletModuleContent();\r
   public static ServletModule getInstance() { return instance; }\r
 \r
   private ServletModuleContent() {\r
     super();\r
-    logger = new LoggerWrapper("ServletModule.Content");\r
-    try {\r
 \r
-      templateListString = configuration.getString("ServletModule.Content.ListTemplate");\r
-      templateObjektString = configuration.getString("ServletModule.Content.ObjektTemplate");\r
-      templateConfirmString = configuration.getString("ServletModule.Content.ConfirmTemplate");\r
+    logger = new LoggerWrapper("ServletModule.Content");\r
 \r
+    try {\r
       mainModule = new ModuleContent(DatabaseContent.getInstance());\r
     }\r
-    catch (StorageObjectFailure e) {\r
-      logger.error("servletmodulecontent konnte nicht initialisiert werden");\r
+    catch (Throwable e) {\r
+      logger.fatal("ServletModuleContent could not be initialized: " + e.toString());\r
     }\r
   }\r
 \r
@@ -112,7 +93,7 @@ public class ServletModuleContent extends ServletModule
     int offset = requestParser.getIntegerWithDefault("offset", 0);\r
     String selectArticleUrl = requestParser.getParameter("selectarticleurl");\r
 \r
-    returnArticleList(aRequest, aResponse, where, order, offset, selectArticleUrl);\r
+    returnList(aRequest, aResponse, where, order, offset, selectArticleUrl);\r
   }\r
 \r
   public void search(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc, ServletModuleFailure {\r
@@ -127,7 +108,10 @@ public class ServletModuleContent extends ServletModule
       String selectArticleUrl = requestParser.getParameter("selectarticleurl");\r
 \r
       if (searchValue.length()>0) {\r
-        if (searchField.equals("contents"))\r
+        if (searchField.equals("id"))\r
+          queryBuilder.appendAndCondition(\r
+            "id='"+JDBCStringRoutines.escapeStringLiteral(searchValue)+"'");\r
+        else if (searchField.equals("contents"))\r
           queryBuilder.appendAndCondition(\r
             "(lower(content_data) like " + "'%" + JDBCStringRoutines.escapeStringLiteral(searchValue.toLowerCase()) + "%')"+\r
             " or (lower(description) like " + "'%" + JDBCStringRoutines.escapeStringLiteral(searchValue.toLowerCase()) + "%')");\r
@@ -150,158 +134,111 @@ public class ServletModuleContent extends ServletModule
 \r
       if (searchOrder.length()>0) {\r
         if (searchOrder.equals("datedesc"))\r
-          queryBuilder.appendAscendingOrder("webdb_create");\r
-        else if (searchOrder.equals("dateasc"))\r
           queryBuilder.appendDescendingOrder("webdb_create");\r
+        else if (searchOrder.equals("dateasc"))\r
+          queryBuilder.appendAscendingOrder("webdb_create");\r
         else if (searchOrder.equals("title"))\r
-          queryBuilder.appendDescendingOrder("title");\r
+          queryBuilder.appendAscendingOrder("title");\r
         else if (searchOrder.equals("creator"))\r
-          queryBuilder.appendDescendingOrder("creator");\r
+          queryBuilder.appendAscendingOrder("creator");\r
       }\r
 \r
-      returnArticleList(aRequest, aResponse, queryBuilder.getWhereClause(), queryBuilder.getOrderByClause(), 0, selectArticleUrl);\r
+      returnList(aRequest, aResponse, queryBuilder.getWhereClause(), queryBuilder.getOrderByClause(), 0, selectArticleUrl);\r
     }\r
     catch (Throwable e) {\r
       throw new ServletModuleFailure(e);\r
     }\r
   }\r
 \r
-  public void add(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {\r
-    _showObject(null, req, res);\r
+  public void add(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
+    editObject(aRequest, aResponse, null);\r
   }\r
 \r
 \r
-  public void insert(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc\r
+  public void insert(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
   {\r
 //theLog.printDebugInfo(":: content :: trying to insert");\r
     try {\r
-      EntityUsers   user = _getUser(req);\r
-      Map withValues = getIntersectingValues(req, DatabaseContent.getInstance());\r
+      Map withValues = getIntersectingValues(aRequest, DatabaseContent.getInstance());\r
 \r
       String now = StringUtil.date2webdbDate(new GregorianCalendar());\r
       withValues.put("date", now);\r
       withValues.put("publish_path", StringUtil.webdbDate2path(now));\r
-      withValues.put("to_publisher", user.getId());\r
+      withValues.put("to_publisher", ServletHelper.getUser(aRequest).getId());\r
       withValues.put("is_produced", "0");\r
       if (!withValues.containsKey("is_published"))\r
         withValues.put("is_published","0");\r
       if (!withValues.containsKey("is_html"))\r
         withValues.put("is_html","0");\r
 \r
-      String id = mainModule.add(withValues);\r
-      DatabaseContentToTopics.getInstance().setTopics(id,req.getParameterValues("to_topic"));\r
+      String webdbCreate = (String) withValues.get("webdb_create");\r
+      if (webdbCreate==null || webdbCreate.trim().length()==0)\r
+        withValues.remove("webdb_create");\r
 \r
-      _showObject(id, req, res);\r
-    }\r
-    catch (Throwable e) {\r
-      throw new ServletModuleFailure(e);\r
-    }\r
-  }\r
-\r
-  public void delete(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc\r
-  {\r
-    EntityUsers   user = _getUser(req);\r
-\r
-    String idParam = req.getParameter("id");\r
-    if (idParam == null) throw new ServletModuleExc("Invalid call: id missing");\r
-\r
-    String confirmParam = req.getParameter("confirm");\r
-    String cancelParam = req.getParameter("cancel");\r
+      String id = mainModule.add(withValues);\r
+      logAdminUsage(aRequest, id, "object added");\r
 \r
-    logger.info("where = " + req.getParameter("where"));\r
+      List topics;\r
 \r
-    if (confirmParam == null && cancelParam == null) {\r
+      DatabaseContentToTopics.getInstance().setTopics(id, aRequest.getParameterValues("to_topic"));\r
 \r
-      SimpleHash mergeData = new SimpleHash();\r
-      mergeData.put("module", "Content");\r
-      mergeData.put("infoString", "Content: " + idParam);\r
-      mergeData.put("id", idParam);\r
-      mergeData.put("where", req.getParameter("where"));\r
-      mergeData.put("order", req.getParameter("order"));\r
-      mergeData.put("offset", req.getParameter("offset"));\r
-      deliver(req, res, mergeData, templateConfirmString);\r
+      editObject(aRequest, aResponse, id);\r
     }\r
-    else {\r
-      if (confirmParam!= null && !confirmParam.equals("")) {\r
-        try {\r
-          mainModule.deleteById(idParam);\r
-\r
-          /** @todo the following two should be implied in\r
-           *  DatabaseContent */\r
-\r
-          //delete rows in the content_x_topic-table\r
-          DatabaseContentToTopics.getInstance().deleteByContentId(idParam);\r
-          //delete rows in the comment-table\r
-          DatabaseComment.getInstance().deleteByContentId(idParam);\r
-          //delete from lucene index, if any\r
-          String index = configuration.getString("IndexPath");\r
-          if (IndexReader.indexExists(index)){\r
-            IndexUtil.unindexID(idParam,index);\r
-          }\r
-\r
-        }\r
-        catch (Throwable e) {\r
-          throw new ServletModuleFailure(e);\r
-        }\r
-        list(req,res);\r
-      }\r
-      else {\r
-        // Datensatz anzeigen\r
-        _showObject(idParam, req, res);\r
-      }\r
+    catch (Throwable e) {\r
+      throw new ServletModuleFailure(e);\r
     }\r
   }\r
 \r
-  public void edit(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc\r
+  public void edit(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
   {\r
-    String idParam = req.getParameter("id");\r
+    String idParam = aRequest.getParameter("id");\r
     if (idParam == null)\r
       throw new ServletModuleExc("Invalid call: id not supplied ");\r
-    _showObject(idParam, req, res);\r
+    editObject(aRequest, aResponse, idParam);\r
   }\r
 \r
 // methods for attaching media file\r
-  public void attach(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc\r
+  public void attach(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
   {\r
-    String  mediaIdParam = req.getParameter("mid");\r
-    String  idParam = req.getParameter("cid");\r
-    if (idParam == null||mediaIdParam==null) throw new ServletModuleExc("smod content :: attach :: cid/mid missing");\r
+    String  mediaIdParam = aRequest.getParameter("mid");\r
+    String  articleId = aRequest.getParameter("articleid");\r
+\r
+    if (articleId == null || mediaIdParam==null)\r
+      throw new ServletModuleExc("smod content :: attach :: articleid/mid missing");\r
 \r
     try {\r
-      EntityContent entContent = (EntityContent)mainModule.getById(idParam);\r
+      EntityContent entContent = (EntityContent) mainModule.getById(articleId);\r
       entContent.attach(mediaIdParam);\r
     }\r
-    catch(ModuleException e) {\r
-      logger.error("smod content :: attach :: could not get entityContent");\r
-    }\r
-    catch(StorageObjectFailure e) {\r
-      logger.error("smod content :: attach :: could not get entityContent");\r
+    catch(Throwable e) {\r
+      throw new ServletModuleFailure(e);\r
     }\r
 \r
-    _showObject(idParam, req, res);\r
+    logAdminUsage(aRequest, articleId, "media " + mediaIdParam + " attached");\r
+\r
+    editObject(aRequest, aResponse, articleId);\r
   }\r
 \r
-  public void dettach(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc\r
+  public void dettach(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
   {\r
-    String  cidParam = req.getParameter("cid");\r
-    String  midParam = req.getParameter("mid");\r
-    if (cidParam == null)\r
-      throw new ServletModuleExc("smod content :: dettach :: cid missing");\r
+    String  articleId = aRequest.getParameter("articleid");\r
+    String  midParam = aRequest.getParameter("mid");\r
+    if (articleId == null)\r
+      throw new ServletModuleExc("smod content :: dettach :: articleid missing");\r
     if (midParam == null)\r
       throw new ServletModuleExc("smod content :: dettach :: mid missing");\r
 \r
     try {\r
-      EntityContent entContent = (EntityContent)mainModule.getById(cidParam);\r
-      entContent.dettach(cidParam,midParam);\r
-    }\r
-    catch(ModuleException e) {\r
-      logger.error("smod content :: dettach :: could not get entityContent");\r
+      EntityContent entContent = (EntityContent)mainModule.getById(articleId);\r
+      entContent.dettach(articleId, midParam);\r
     }\r
-    catch(StorageObjectFailure e) {\r
-      logger.error("smod content :: dettach :: could not get entityContent");\r
+    catch(Throwable e) {\r
+      throw new ServletModuleFailure(e);\r
     }\r
 \r
-    _showObject(cidParam, req, res);\r
+    logAdminUsage(aRequest, articleId, "media " + midParam + " deattached");\r
+\r
+    editObject(aRequest, aResponse, articleId);\r
   }\r
 \r
   public void update(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
@@ -316,7 +253,7 @@ public class ServletModuleContent extends ServletModule
         throw new ServletModuleExc("Wrong call: (id) is missing");\r
 \r
       Map withValues = getIntersectingValues(aRequest, DatabaseContent.getInstance());\r
-      String[] topic_id = aRequest.getParameterValues("to_topic");\r
+\r
       String content_id = aRequest.getParameter("id");\r
 \r
       withValues.put("is_produced", "0");\r
@@ -325,34 +262,44 @@ public class ServletModuleContent extends ServletModule
       if (!withValues.containsKey("is_html"))\r
         withValues.put("is_html","0");\r
 \r
+      String webdbCreate = (String) withValues.get("webdb_create");\r
+      if (webdbCreate==null || webdbCreate.trim().length()==0)\r
+        withValues.remove("webdb_create");\r
+\r
       String id = mainModule.set(withValues);\r
-      DatabaseContentToTopics.getInstance().setTopics(aRequest.getParameter("id"),topic_id);\r
 \r
-      String whereParam = aRequest.getParameter("where");\r
-      String orderParam = aRequest.getParameter("order");\r
+      logAdminUsage(aRequest, id, "object modified");\r
+\r
+      DatabaseContentToTopics.getInstance().setTopics(aRequest.getParameter("id"), aRequest.getParameterValues("to_topic"));\r
 \r
-      if (returnUrl!=null){\r
+      if (returnUrl!=null && !returnUrl.equals("")){\r
         redirect(aResponse, returnUrl);\r
       }\r
       else\r
-        _showObject(idParam, aRequest, aResponse);\r
+        editObject(aRequest, aResponse, idParam);\r
     }\r
     catch (Throwable e) {\r
       throw new ServletModuleFailure(e);\r
     }\r
   }\r
 \r
-/*\r
-  * HelperMethod shows the basic article editing form.\r
-  *\r
-  * if the "id" parameter is null, it means show an empty form to add a new\r
-  * article.\r
-*/\r
-  public void _showObject(String id, HttpServletRequest aRequest, HttpServletResponse aResponse)\r
+\r
+  /**\r
+   * HelperMethod shows the basic article editing form.\r
+   *\r
+   * if the "id" parameter is null, it means show an empty form to add a new\r
+   * article.\r
+   *\r
+   * @param id\r
+   * @param aRequest\r
+   * @param aResponse\r
+   * @throws ServletModuleExc\r
+   */\r
+  public void editObject(HttpServletRequest aRequest, HttpServletResponse aResponse, String id)\r
       throws ServletModuleExc {\r
     try {\r
       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
-      Map responseData = ServletHelper.makeGenerationData(getLocale(aRequest));\r
+      Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});\r
       EntityAdapterModel model = MirGlobal.localizer().dataModel().adapterModel();\r
       Map article;\r
       URLBuilder urlBuilder = new URLBuilder();\r
@@ -381,17 +328,78 @@ public class ServletModuleContent extends ServletModule
       }\r
       responseData.put("article", article);\r
 \r
+      List topicsList = new Vector();\r
+\r
+      String[] topicCategories = configuration.getStringArray("Mir.Localizer.Admin.TopicLists");\r
+\r
+      if (topicCategories.length==0 ) {\r
+        Map categoryMap = new HashMap();\r
+        categoryMap.put("key", "topic");\r
+        categoryMap.put("listtype", "0");\r
+        categoryMap.put("listparameter", "3");\r
+        categoryMap.put("items",\r
+                        new EntityIteratorAdapter("", "title",\r
+            20, MirGlobal.localizer().dataModel().adapterModel(), "topic"));\r
+        topicsList.add(categoryMap);\r
+      }\r
+      else\r
+      {\r
+\r
+        for (int i = 0; i < topicCategories.length; i++) {\r
+          try {\r
+            Map categoryMap = new HashMap();\r
+            List parts = StringRoutines.splitString(topicCategories[i], ":");\r
+            String key = null;\r
+            String listtype = "0";\r
+            String listparameter = "5";\r
+            String where = "";\r
+            String order = "";\r
+\r
+            if (parts.size() > 0)\r
+              key = (String) parts.get(0);\r
+            if (parts.size() > 1)\r
+              listtype = (String) parts.get(1);\r
+            if (parts.size() > 2)\r
+              listparameter = (String) parts.get(2);\r
+            if (parts.size() > 3)\r
+              where = (String) parts.get(3);\r
+            if (parts.size() > 4)\r
+              order = (String) parts.get(4);\r
+\r
+            if (key != null) {\r
+              categoryMap.put("key", key);\r
+              categoryMap.put("listtype", listtype);\r
+              categoryMap.put("listparameter", listparameter);\r
+              categoryMap.put("items",\r
+                              new EntityIteratorAdapter(where, order,\r
+                  20, MirGlobal.localizer().dataModel().adapterModel(), "topic"));\r
+              topicsList.add(categoryMap);\r
+            }\r
+          }\r
+          catch (Throwable t) {\r
+            logger.error("error while preparing topics: " + t.toString());\r
+          }\r
+        }\r
+      }\r
+\r
+      responseData.put("topics", topicsList);\r
+\r
       responseData.put("returnurl", requestParser.getParameter("returnurl"));\r
       responseData.put("thisurl", urlBuilder.getQuery());\r
 \r
-      ServletHelper.generateResponse(aResponse.getWriter(), responseData, editTemplate);\r
+      ServletHelper.generateResponse(aResponse.getWriter(), responseData, editGenerator);\r
     }\r
     catch (Throwable e) {\r
       throw new ServletModuleFailure(e);\r
     }\r
   }\r
 \r
-  public void returnArticleList(\r
+  public void returnList(HttpServletRequest aRequest, HttpServletResponse aResponse,\r
+     String aWhereClause, String anOrderByClause, int anOffset) throws ServletModuleExc {\r
+    this.returnList(aRequest, aResponse, aWhereClause, anOrderByClause, anOffset, null);\r
+  }\r
+\r
+  public void returnList(\r
        HttpServletRequest aRequest,\r
        HttpServletResponse aResponse,\r
        String aWhereClause,\r
@@ -402,17 +410,16 @@ public class ServletModuleContent extends ServletModule
     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
     URLBuilder urlBuilder = new URLBuilder();\r
     EntityAdapterModel model;\r
-    int nrArticlesPerPage = 20;\r
     int count;\r
 \r
     try {\r
-      Map responseData = ServletHelper.makeGenerationData(getLocale(aRequest));\r
+      Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});\r
       model = MirGlobal.localizer().dataModel().adapterModel();\r
 \r
       Object articleList =\r
           new CachingRewindableIterator(\r
-            new EntityIteratorAdapter( aWhereClause, anOrderByClause, nrArticlesPerPage,\r
-               MirGlobal.localizer().dataModel().adapterModel(), "content", nrArticlesPerPage, anOffset)\r
+            new EntityIteratorAdapter( aWhereClause, anOrderByClause, nrEntitiesPerListPage,\r
+               MirGlobal.localizer().dataModel().adapterModel(), "content", nrEntitiesPerListPage, anOffset)\r
       );\r
 \r
       responseData.put("nexturl", null);\r
@@ -444,13 +451,13 @@ public class ServletModuleContent extends ServletModule
       responseData.put("offset" , new Integer(anOffset).toString());\r
       responseData.put("thisurl" , urlBuilder.getQuery());\r
 \r
-      if (count>=anOffset+nrArticlesPerPage) {\r
-        urlBuilder.setValue("offset", (anOffset + nrArticlesPerPage));\r
+      if (count>=anOffset+nrEntitiesPerListPage) {\r
+        urlBuilder.setValue("offset", (anOffset + nrEntitiesPerListPage));\r
         responseData.put("nexturl" , urlBuilder.getQuery());\r
       }\r
 \r
       if (anOffset>0) {\r
-        urlBuilder.setValue("offset", Math.max(anOffset - nrArticlesPerPage, 0));\r
+        urlBuilder.setValue("offset", Math.max(anOffset - nrEntitiesPerListPage, 0));\r
         responseData.put("prevurl" , urlBuilder.getQuery());\r
       }\r
 \r
@@ -458,12 +465,12 @@ public class ServletModuleContent extends ServletModule
 \r
       responseData.put("from" , Integer.toString(anOffset+1));\r
       responseData.put("count", Integer.toString(count));\r
-      responseData.put("to", Integer.toString(Math.min(anOffset+nrArticlesPerPage, count)));\r
+      responseData.put("to", Integer.toString(Math.min(anOffset+nrEntitiesPerListPage, count)));\r
       responseData.put("offset" , Integer.toString(anOffset));\r
       responseData.put("order", anOrderByClause);\r
       responseData.put("where" , aWhereClause);\r
 \r
-      ServletHelper.generateResponse(aResponse.getWriter(), responseData, listTemplate);\r
+      ServletHelper.generateResponse(aResponse.getWriter(), responseData, listGenerator);\r
     }\r
     catch (Throwable e) {\r
       throw new ServletModuleFailure(e);\r
@@ -481,7 +488,7 @@ public class ServletModuleContent extends ServletModule
       urlBuilder.setValue("childid", requestParser.getParameter("id"));\r
       urlBuilder.setValue("returnurl", requestParser.getParameter("returnurl"));\r
 \r
-      returnArticleList(aRequest, aResponse, "", "", 0, urlBuilder.getQuery());\r
+      returnList(aRequest, aResponse, "", "", 0, urlBuilder.getQuery());\r
     }\r
     catch (Throwable e) {\r
       throw new ServletModuleFailure(e);\r
@@ -497,7 +504,7 @@ public class ServletModuleContent extends ServletModule
       if (articleId == null)\r
         throw new ServletModuleExc("ServletModuleContent.listchildren: article_id not set!");\r
 \r
-      returnArticleList(aRequest, aResponse, "to_content = " + articleId, "", 0, null);\r
+      returnList(aRequest, aResponse, "to_content = " + articleId, "", 0, null);\r
     }\r
     catch (Throwable e) {\r
       throw new ServletModuleFailure(e);\r
@@ -516,6 +523,7 @@ public class ServletModuleContent extends ServletModule
       article.setValueForProperty("to_content", parentId);\r
       article.setProduced(false);\r
       article.update();\r
+      logAdminUsage(aRequest, articleId, "parent set to " + parentId);\r
     }\r
     catch(Throwable e) {\r
       logger.error("ServletModuleContent.setparent: " + e.getMessage());\r
@@ -536,6 +544,7 @@ public class ServletModuleContent extends ServletModule
       article.setValueForProperty("to_content", "");\r
       article.setProduced(false);\r
       article.update();\r
+      logAdminUsage(aRequest, articleId, "parent cleared");\r
     }\r
     catch(Throwable e) {\r
       e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE));\r
@@ -546,11 +555,4 @@ public class ServletModuleContent extends ServletModule
 \r
     redirect(aResponse, returnUrl);\r
   }\r
-\r
-  private EntityUsers _getUser(HttpServletRequest req)\r
-  {\r
-    HttpSession session=req.getSession(false);\r
-\r
-    return (EntityUsers)session.getAttribute("login.uid");\r
-  }\r
 }\r