added an extensively customizable way of showing topics in articles
[mir.git] / source / mircoders / servlet / ServletModuleContent.java
1 /*\r
2  * Copyright (C) 2001, 2002 The Mir-coders group\r
3  *\r
4  * This file is part of Mir.\r
5  *\r
6  * Mir is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 2 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * Mir is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with Mir; if not, write to the Free Software\r
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
19  *\r
20  * In addition, as a special exception, The Mir-coders gives permission to link\r
21  * the code of this program with  any library licensed under the Apache Software License,\r
22  * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library\r
23  * (or with modified versions of the above that use the same license as the above),\r
24  * and distribute linked combinations including the two.  You must obey the\r
25  * GNU General Public License in all respects for all of the code used other than\r
26  * the above mentioned libraries.  If you modify this file, you may extend this\r
27  * exception to your version of the file, but you are not obligated to do so.\r
28  * If you do not wish to do so, delete this exception statement from your version.\r
29  */\r
30 \r
31 package mircoders.servlet;\r
32 \r
33 import java.util.GregorianCalendar;\r
34 import java.util.HashMap;\r
35 import java.util.Iterator;\r
36 import java.util.*;\r
37 import java.util.Locale;\r
38 import java.util.Map;\r
39 import javax.servlet.http.HttpServletRequest;\r
40 import javax.servlet.http.HttpServletResponse;\r
41 \r
42 import mir.entity.adapter.EntityAdapterModel;\r
43 import mir.entity.adapter.EntityIteratorAdapter;\r
44 import mir.log.LoggerWrapper;\r
45 import mir.misc.StringUtil;\r
46 import mir.servlet.ServletModule;\r
47 import mir.servlet.ServletModuleExc;\r
48 import mir.servlet.ServletModuleFailure;\r
49 import mir.util.CachingRewindableIterator;\r
50 import mir.util.HTTPRequestParser;\r
51 import mir.util.JDBCStringRoutines;\r
52 import mir.util.SQLQueryBuilder;\r
53 import mir.util.*;\r
54 import mircoders.entity.EntityContent;\r
55 import mircoders.global.MirGlobal;\r
56 import mircoders.module.ModuleContent;\r
57 import mircoders.storage.DatabaseContent;\r
58 import mircoders.storage.DatabaseContentToTopics;\r
59 \r
60 /*\r
61  *  ServletModuleContent -\r
62  *  deliver html for the article admin form.\r
63  *\r
64  * @version $Id: ServletModuleContent.java,v 1.52.2.10 2003/09/21 16:40:41 zapata Exp $\r
65  * @author rk, mir-coders\r
66  *\r
67  */\r
68 \r
69 public class ServletModuleContent extends ServletModule\r
70 {\r
71   private static ServletModuleContent instance = new ServletModuleContent();\r
72   public static ServletModule getInstance() { return instance; }\r
73 \r
74   private ServletModuleContent() {\r
75     super();\r
76 \r
77     logger = new LoggerWrapper("ServletModule.Content");\r
78 \r
79     try {\r
80       mainModule = new ModuleContent(DatabaseContent.getInstance());\r
81     }\r
82     catch (Throwable e) {\r
83       logger.fatal("ServletModuleContent could not be initialized: " + e.toString());\r
84     }\r
85   }\r
86 \r
87   public void list(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
88   {\r
89     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
90 \r
91     String where = requestParser.getParameter("where");\r
92     String order = requestParser.getParameterWithDefault("order", "webdb_create desc");\r
93     int offset = requestParser.getIntegerWithDefault("offset", 0);\r
94     String selectArticleUrl = requestParser.getParameter("selectarticleurl");\r
95 \r
96     returnList(aRequest, aResponse, where, order, offset, selectArticleUrl);\r
97   }\r
98 \r
99   public void search(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc, ServletModuleFailure {\r
100     try {\r
101       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
102       SQLQueryBuilder queryBuilder = new SQLQueryBuilder();\r
103       String searchField = requestParser.getParameterWithDefault("searchfield", "");\r
104       String searchValue = requestParser.getParameterWithDefault("searchvalue", "").trim();\r
105       String searchOrder = requestParser.getParameterWithDefault("searchorder", "");\r
106       String searchispublished = requestParser.getParameterWithDefault("searchispublished", "");\r
107       String searchArticleType = requestParser.getParameterWithDefault("searcharticletype", "");\r
108       String selectArticleUrl = requestParser.getParameter("selectarticleurl");\r
109 \r
110       if (searchValue.length()>0) {\r
111         if (searchField.equals("id"))\r
112           queryBuilder.appendAndCondition(\r
113             "id='"+JDBCStringRoutines.escapeStringLiteral(searchValue)+"'");\r
114         else if (searchField.equals("contents"))\r
115           queryBuilder.appendAndCondition(\r
116             "(lower(content_data) like " + "'%" + JDBCStringRoutines.escapeStringLiteral(searchValue.toLowerCase()) + "%')"+\r
117             " or (lower(description) like " + "'%" + JDBCStringRoutines.escapeStringLiteral(searchValue.toLowerCase()) + "%')");\r
118         else\r
119           queryBuilder.appendAndCondition(\r
120             "lower("+ searchField + ") like " +\r
121             "'%" + JDBCStringRoutines.escapeStringLiteral(searchValue.toLowerCase()) + "%'");\r
122       }\r
123 \r
124       if (searchispublished.length()>0) {\r
125         if (searchispublished.equals("0"))\r
126           queryBuilder.appendAndCondition("is_published='f'");\r
127         else\r
128           queryBuilder.appendAndCondition("is_published='t'");\r
129       }\r
130 \r
131       if (searchArticleType.length()>0) {\r
132         queryBuilder.appendAndCondition("to_article_type="+Integer.parseInt(searchArticleType));\r
133       }\r
134 \r
135       if (searchOrder.length()>0) {\r
136         if (searchOrder.equals("datedesc"))\r
137           queryBuilder.appendDescendingOrder("webdb_create");\r
138         else if (searchOrder.equals("dateasc"))\r
139           queryBuilder.appendAscendingOrder("webdb_create");\r
140         else if (searchOrder.equals("title"))\r
141           queryBuilder.appendAscendingOrder("title");\r
142         else if (searchOrder.equals("creator"))\r
143           queryBuilder.appendAscendingOrder("creator");\r
144       }\r
145 \r
146       returnList(aRequest, aResponse, queryBuilder.getWhereClause(), queryBuilder.getOrderByClause(), 0, selectArticleUrl);\r
147     }\r
148     catch (Throwable e) {\r
149       throw new ServletModuleFailure(e);\r
150     }\r
151   }\r
152 \r
153   public void add(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
154     editObject(aRequest, aResponse, null);\r
155   }\r
156 \r
157 \r
158   public void insert(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
159   {\r
160 //theLog.printDebugInfo(":: content :: trying to insert");\r
161     try {\r
162       Map withValues = getIntersectingValues(aRequest, DatabaseContent.getInstance());\r
163 \r
164       String now = StringUtil.date2webdbDate(new GregorianCalendar());\r
165       withValues.put("date", now);\r
166       withValues.put("publish_path", StringUtil.webdbDate2path(now));\r
167       withValues.put("to_publisher", ServletHelper.getUser(aRequest).getId());\r
168       withValues.put("is_produced", "0");\r
169       if (!withValues.containsKey("is_published"))\r
170         withValues.put("is_published","0");\r
171       if (!withValues.containsKey("is_html"))\r
172         withValues.put("is_html","0");\r
173 \r
174       String webdbCreate = (String) withValues.get("webdb_create");\r
175       if (webdbCreate==null || webdbCreate.trim().length()==0)\r
176         withValues.remove("webdb_create");\r
177 \r
178       String id = mainModule.add(withValues);\r
179       logAdminUsage(aRequest, id, "object added");\r
180 \r
181       List topics;\r
182 \r
183       DatabaseContentToTopics.getInstance().setTopics(id, aRequest.getParameterValues("to_topic"));\r
184 \r
185       editObject(aRequest, aResponse, id);\r
186     }\r
187     catch (Throwable e) {\r
188       throw new ServletModuleFailure(e);\r
189     }\r
190   }\r
191 \r
192   public void edit(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
193   {\r
194     String idParam = aRequest.getParameter("id");\r
195     if (idParam == null)\r
196       throw new ServletModuleExc("Invalid call: id not supplied ");\r
197     editObject(aRequest, aResponse, idParam);\r
198   }\r
199 \r
200 // methods for attaching media file\r
201   public void attach(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
202   {\r
203     String  mediaIdParam = aRequest.getParameter("mid");\r
204     String  articleId = aRequest.getParameter("articleid");\r
205 \r
206     if (articleId == null || mediaIdParam==null)\r
207       throw new ServletModuleExc("smod content :: attach :: articleid/mid missing");\r
208 \r
209     try {\r
210       EntityContent entContent = (EntityContent) mainModule.getById(articleId);\r
211       entContent.attach(mediaIdParam);\r
212     }\r
213     catch(Throwable e) {\r
214       throw new ServletModuleFailure(e);\r
215     }\r
216 \r
217     logAdminUsage(aRequest, articleId, "media " + mediaIdParam + " attached");\r
218 \r
219     editObject(aRequest, aResponse, articleId);\r
220   }\r
221 \r
222   public void dettach(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
223   {\r
224     String  articleId = aRequest.getParameter("articleid");\r
225     String  midParam = aRequest.getParameter("mid");\r
226     if (articleId == null)\r
227       throw new ServletModuleExc("smod content :: dettach :: articleid missing");\r
228     if (midParam == null)\r
229       throw new ServletModuleExc("smod content :: dettach :: mid missing");\r
230 \r
231     try {\r
232       EntityContent entContent = (EntityContent)mainModule.getById(articleId);\r
233       entContent.dettach(articleId, midParam);\r
234     }\r
235     catch(Throwable e) {\r
236       throw new ServletModuleFailure(e);\r
237     }\r
238 \r
239     logAdminUsage(aRequest, articleId, "media " + midParam + " deattached");\r
240 \r
241     editObject(aRequest, aResponse, articleId);\r
242   }\r
243 \r
244   public void update(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
245   {\r
246     try {\r
247       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
248 \r
249       String returnUrl = requestParser.getParameter("returnurl");\r
250 \r
251       String idParam = aRequest.getParameter("id");\r
252       if (idParam == null)\r
253         throw new ServletModuleExc("Wrong call: (id) is missing");\r
254 \r
255       Map withValues = getIntersectingValues(aRequest, DatabaseContent.getInstance());\r
256 \r
257       String content_id = aRequest.getParameter("id");\r
258 \r
259       withValues.put("is_produced", "0");\r
260       if (!withValues.containsKey("is_published"))\r
261         withValues.put("is_published","0");\r
262       if (!withValues.containsKey("is_html"))\r
263         withValues.put("is_html","0");\r
264 \r
265       String webdbCreate = (String) withValues.get("webdb_create");\r
266       if (webdbCreate==null || webdbCreate.trim().length()==0)\r
267         withValues.remove("webdb_create");\r
268 \r
269       String id = mainModule.set(withValues);\r
270 \r
271       logAdminUsage(aRequest, id, "object modified");\r
272 \r
273       DatabaseContentToTopics.getInstance().setTopics(aRequest.getParameter("id"), aRequest.getParameterValues("to_topic"));\r
274 \r
275       if (returnUrl!=null && !returnUrl.equals("")){\r
276         redirect(aResponse, returnUrl);\r
277       }\r
278       else\r
279         editObject(aRequest, aResponse, idParam);\r
280     }\r
281     catch (Throwable e) {\r
282       throw new ServletModuleFailure(e);\r
283     }\r
284   }\r
285 \r
286 \r
287   /**\r
288    * HelperMethod shows the basic article editing form.\r
289    *\r
290    * if the "id" parameter is null, it means show an empty form to add a new\r
291    * article.\r
292    *\r
293    * @param id\r
294    * @param aRequest\r
295    * @param aResponse\r
296    * @throws ServletModuleExc\r
297    */\r
298   public void editObject(HttpServletRequest aRequest, HttpServletResponse aResponse, String id)\r
299       throws ServletModuleExc {\r
300     try {\r
301       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
302       Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});\r
303       EntityAdapterModel model = MirGlobal.localizer().dataModel().adapterModel();\r
304       Map article;\r
305       URLBuilder urlBuilder = new URLBuilder();\r
306 \r
307       urlBuilder.setValue("module", "Content");\r
308       urlBuilder.setValue("do", "edit");\r
309       urlBuilder.setValue("id", id);\r
310       urlBuilder.setValue("returnurl", requestParser.getParameter("returnurl"));\r
311 \r
312       if (id!=null) {\r
313         responseData.put("new", Boolean.FALSE);\r
314         article = model.makeEntityAdapter("content", mainModule.getById(id));\r
315       }\r
316       else {\r
317         List fields = DatabaseContent.getInstance().getFields();\r
318         responseData.put("new", Boolean.TRUE);\r
319         article = new HashMap();\r
320         Iterator i = fields.iterator();\r
321         while (i.hasNext()) {\r
322           article.put(i.next(), null);\r
323         }\r
324 \r
325         article.put("to_topics", null);\r
326 \r
327         MirGlobal.localizer().adminInterface().initializeArticle(article);\r
328       }\r
329       responseData.put("article", article);\r
330 \r
331       List topicsList = new Vector();\r
332 \r
333       String[] topicCategories = configuration.getStringArray("Mir.Localizer.Admin.TopicLists");\r
334 \r
335       if (topicCategories.length==0 ) {\r
336         Map categoryMap = new HashMap();\r
337         categoryMap.put("key", "topic");\r
338         categoryMap.put("listtype", "0");\r
339         categoryMap.put("listparameter", "3");\r
340         categoryMap.put("items",\r
341                         new EntityIteratorAdapter("", "title",\r
342             20, MirGlobal.localizer().dataModel().adapterModel(), "topic"));\r
343         topicsList.add(categoryMap);\r
344       }\r
345       else\r
346       {\r
347 \r
348         for (int i = 0; i < topicCategories.length; i++) {\r
349           try {\r
350             Map categoryMap = new HashMap();\r
351             List parts = StringRoutines.splitString(topicCategories[i], ":");\r
352             String key = null;\r
353             String listtype = "0";\r
354             String listparameter = "5";\r
355             String where = "";\r
356             String order = "";\r
357 \r
358             if (parts.size() > 0)\r
359               key = (String) parts.get(0);\r
360             if (parts.size() > 1)\r
361               listtype = (String) parts.get(1);\r
362             if (parts.size() > 2)\r
363               listparameter = (String) parts.get(2);\r
364             if (parts.size() > 3)\r
365               where = (String) parts.get(3);\r
366             if (parts.size() > 4)\r
367               order = (String) parts.get(4);\r
368 \r
369             if (key != null) {\r
370               categoryMap.put("key", key);\r
371               categoryMap.put("listtype", listtype);\r
372               categoryMap.put("listparameter", listparameter);\r
373               categoryMap.put("items",\r
374                               new EntityIteratorAdapter(where, order,\r
375                   20, MirGlobal.localizer().dataModel().adapterModel(), "topic"));\r
376               topicsList.add(categoryMap);\r
377             }\r
378           }\r
379           catch (Throwable t) {\r
380             logger.error("error while preparing topics: " + t.toString());\r
381           }\r
382         }\r
383       }\r
384 \r
385       responseData.put("topics", topicsList);\r
386 \r
387 /*\r
388       responseData.put("topics",\r
389           new EntityIteratorAdapter("", configuration.getString("Mir.Localizer.Admin.TopicListOrder"),\r
390           20, MirGlobal.localizer().dataModel().adapterModel(), "topic"));\r
391 */\r
392       responseData.put("returnurl", requestParser.getParameter("returnurl"));\r
393       responseData.put("thisurl", urlBuilder.getQuery());\r
394 \r
395       ServletHelper.generateResponse(aResponse.getWriter(), responseData, editGenerator);\r
396     }\r
397     catch (Throwable e) {\r
398       throw new ServletModuleFailure(e);\r
399     }\r
400   }\r
401 \r
402   public void returnList(HttpServletRequest aRequest, HttpServletResponse aResponse,\r
403      String aWhereClause, String anOrderByClause, int anOffset) throws ServletModuleExc {\r
404     this.returnList(aRequest, aResponse, aWhereClause, anOrderByClause, anOffset, null);\r
405   }\r
406 \r
407   public void returnList(\r
408        HttpServletRequest aRequest,\r
409        HttpServletResponse aResponse,\r
410        String aWhereClause,\r
411        String anOrderByClause,\r
412        int anOffset,\r
413        String aSelectArticleUrl) throws ServletModuleExc {\r
414 \r
415     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
416     URLBuilder urlBuilder = new URLBuilder();\r
417     EntityAdapterModel model;\r
418     int count;\r
419 \r
420     try {\r
421       Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});\r
422       model = MirGlobal.localizer().dataModel().adapterModel();\r
423 \r
424       Object articleList =\r
425           new CachingRewindableIterator(\r
426             new EntityIteratorAdapter( aWhereClause, anOrderByClause, nrEntitiesPerListPage,\r
427                MirGlobal.localizer().dataModel().adapterModel(), "content", nrEntitiesPerListPage, anOffset)\r
428       );\r
429 \r
430       responseData.put("nexturl", null);\r
431       responseData.put("prevurl", null);\r
432 \r
433       count=mainModule.getSize(aWhereClause);\r
434 \r
435       urlBuilder.setValue("module", "Content");\r
436       urlBuilder.setValue("do", "list");\r
437       urlBuilder.setValue("where", aWhereClause);\r
438       urlBuilder.setValue("order", anOrderByClause);\r
439 \r
440 \r
441       urlBuilder.setValue("searchfield", requestParser.getParameter("searchfield"));\r
442       urlBuilder.setValue("searchvalue", requestParser.getParameter("searchvalue"));\r
443       urlBuilder.setValue("searchispublished", requestParser.getParameter("searchispublished"));\r
444       urlBuilder.setValue("searchorder", requestParser.getParameter("searchorder"));\r
445       urlBuilder.setValue("searcharticletype", requestParser.getParameter("searcharticletype"));\r
446       urlBuilder.setValue("selectarticleurl", aSelectArticleUrl);\r
447 \r
448       responseData.put("searchfield", requestParser.getParameter("searchfield"));\r
449       responseData.put("searchvalue", requestParser.getParameter("searchvalue"));\r
450       responseData.put("searchispublished", requestParser.getParameter("searchispublished"));\r
451       responseData.put("searchorder", requestParser.getParameter("searchorder"));\r
452       responseData.put("searcharticletype", requestParser.getParameter("searcharticletype"));\r
453       responseData.put("selectarticleurl", aSelectArticleUrl);\r
454 \r
455       urlBuilder.setValue("offset", anOffset);\r
456       responseData.put("offset" , new Integer(anOffset).toString());\r
457       responseData.put("thisurl" , urlBuilder.getQuery());\r
458 \r
459       if (count>=anOffset+nrEntitiesPerListPage) {\r
460         urlBuilder.setValue("offset", (anOffset + nrEntitiesPerListPage));\r
461         responseData.put("nexturl" , urlBuilder.getQuery());\r
462       }\r
463 \r
464       if (anOffset>0) {\r
465         urlBuilder.setValue("offset", Math.max(anOffset - nrEntitiesPerListPage, 0));\r
466         responseData.put("prevurl" , urlBuilder.getQuery());\r
467       }\r
468 \r
469       responseData.put("articles", articleList);\r
470 \r
471       responseData.put("from" , Integer.toString(anOffset+1));\r
472       responseData.put("count", Integer.toString(count));\r
473       responseData.put("to", Integer.toString(Math.min(anOffset+nrEntitiesPerListPage, count)));\r
474       responseData.put("offset" , Integer.toString(anOffset));\r
475       responseData.put("order", anOrderByClause);\r
476       responseData.put("where" , aWhereClause);\r
477 \r
478       ServletHelper.generateResponse(aResponse.getWriter(), responseData, listGenerator);\r
479     }\r
480     catch (Throwable e) {\r
481       throw new ServletModuleFailure(e);\r
482     }\r
483   }\r
484 \r
485   public void selectparent(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
486   {\r
487     try {\r
488       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
489       URLBuilder urlBuilder = new URLBuilder();\r
490 \r
491       urlBuilder.setValue("module", "Content");\r
492       urlBuilder.setValue("do", "setparent");\r
493       urlBuilder.setValue("childid", requestParser.getParameter("id"));\r
494       urlBuilder.setValue("returnurl", requestParser.getParameter("returnurl"));\r
495 \r
496       returnList(aRequest, aResponse, "", "", 0, urlBuilder.getQuery());\r
497     }\r
498     catch (Throwable e) {\r
499       throw new ServletModuleFailure(e);\r
500     }\r
501   }\r
502 \r
503   public void listchildren(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
504   {\r
505     try {\r
506       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
507       String articleId = requestParser.getParameter("article_id");\r
508 \r
509       if (articleId == null)\r
510         throw new ServletModuleExc("ServletModuleContent.listchildren: article_id not set!");\r
511 \r
512       returnList(aRequest, aResponse, "to_content = " + articleId, "", 0, null);\r
513     }\r
514     catch (Throwable e) {\r
515       throw new ServletModuleFailure(e);\r
516     }\r
517   }\r
518 \r
519   public void setparent(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
520   {\r
521     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
522     String articleId = aRequest.getParameter("childid");\r
523     String parentId  = aRequest.getParameter("id");\r
524     String returnUrl = aRequest.getParameter("returnurl");\r
525 \r
526     try {\r
527       EntityContent article = (EntityContent) mainModule.getById(articleId);\r
528       article.setValueForProperty("to_content", parentId);\r
529       article.setProduced(false);\r
530       article.update();\r
531       logAdminUsage(aRequest, articleId, "parent set to " + parentId);\r
532     }\r
533     catch(Throwable e) {\r
534       logger.error("ServletModuleContent.setparent: " + e.getMessage());\r
535       throw new ServletModuleFailure(e);\r
536     }\r
537 \r
538     redirect(aResponse, returnUrl);\r
539   }\r
540 \r
541   public void clearparent(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
542   {\r
543     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
544     String articleId = requestParser.getParameter("id");\r
545     String returnUrl = requestParser.getParameter("returnurl");\r
546 \r
547     try {\r
548       EntityContent article = (EntityContent) mainModule.getById(articleId);\r
549       article.setValueForProperty("to_content", "");\r
550       article.setProduced(false);\r
551       article.update();\r
552       logAdminUsage(aRequest, articleId, "parent cleared");\r
553     }\r
554     catch(Throwable e) {\r
555       e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE));\r
556       logger.error("ServletModuleContent.clearparent: " + e.getMessage());\r
557 \r
558       throw new ServletModuleFailure("ServletModuleContent.clearparent: " + e.getMessage(), e);\r
559     }\r
560 \r
561     redirect(aResponse, returnUrl);\r
562   }\r
563 }\r