2 bugfixes...
[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.List;\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.URLBuilder;\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.9 2003/09/20 10:54:18 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 /*\r
332 \r
333       Map topicsMap = new HashMap();\r
334 \r
335       String[] topicCategories = configuration.getStringArray("Mir.Localizer.Admin.TopicListOrder");\r
336 \r
337       for (int i = 0; i<topicCategories; i++) {\r
338         Map categoryMap = new HashMap();\r
339 \r
340         String key="";\r
341         String listtype="";\r
342         String listparameter="";\r
343 \r
344                  topic:1:3:archiv_url='bla':title\r
345 \r
346         topicsMap.put(key, categoryMap);\r
347       }\r
348 \r
349 \r
350       responseData.put("topics", topicsMap);\r
351 \r
352 \r
353 */\r
354 \r
355 \r
356       responseData.put("topics",\r
357           new EntityIteratorAdapter("", configuration.getString("Mir.Localizer.Admin.TopicListOrder"),\r
358           20, MirGlobal.localizer().dataModel().adapterModel(), "topic"));\r
359 \r
360       responseData.put("returnurl", requestParser.getParameter("returnurl"));\r
361       responseData.put("thisurl", urlBuilder.getQuery());\r
362 \r
363       ServletHelper.generateResponse(aResponse.getWriter(), responseData, editGenerator);\r
364     }\r
365     catch (Throwable e) {\r
366       throw new ServletModuleFailure(e);\r
367     }\r
368   }\r
369 \r
370   public void returnList(HttpServletRequest aRequest, HttpServletResponse aResponse,\r
371      String aWhereClause, String anOrderByClause, int anOffset) throws ServletModuleExc {\r
372     this.returnList(aRequest, aResponse, aWhereClause, anOrderByClause, anOffset, null);\r
373   }\r
374 \r
375   public void returnList(\r
376        HttpServletRequest aRequest,\r
377        HttpServletResponse aResponse,\r
378        String aWhereClause,\r
379        String anOrderByClause,\r
380        int anOffset,\r
381        String aSelectArticleUrl) throws ServletModuleExc {\r
382 \r
383     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
384     URLBuilder urlBuilder = new URLBuilder();\r
385     EntityAdapterModel model;\r
386     int count;\r
387 \r
388     try {\r
389       Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});\r
390       model = MirGlobal.localizer().dataModel().adapterModel();\r
391 \r
392       Object articleList =\r
393           new CachingRewindableIterator(\r
394             new EntityIteratorAdapter( aWhereClause, anOrderByClause, nrEntitiesPerListPage,\r
395                MirGlobal.localizer().dataModel().adapterModel(), "content", nrEntitiesPerListPage, anOffset)\r
396       );\r
397 \r
398       responseData.put("nexturl", null);\r
399       responseData.put("prevurl", null);\r
400 \r
401       count=mainModule.getSize(aWhereClause);\r
402 \r
403       urlBuilder.setValue("module", "Content");\r
404       urlBuilder.setValue("do", "list");\r
405       urlBuilder.setValue("where", aWhereClause);\r
406       urlBuilder.setValue("order", anOrderByClause);\r
407 \r
408 \r
409       urlBuilder.setValue("searchfield", requestParser.getParameter("searchfield"));\r
410       urlBuilder.setValue("searchvalue", requestParser.getParameter("searchvalue"));\r
411       urlBuilder.setValue("searchispublished", requestParser.getParameter("searchispublished"));\r
412       urlBuilder.setValue("searchorder", requestParser.getParameter("searchorder"));\r
413       urlBuilder.setValue("searcharticletype", requestParser.getParameter("searcharticletype"));\r
414       urlBuilder.setValue("selectarticleurl", aSelectArticleUrl);\r
415 \r
416       responseData.put("searchfield", requestParser.getParameter("searchfield"));\r
417       responseData.put("searchvalue", requestParser.getParameter("searchvalue"));\r
418       responseData.put("searchispublished", requestParser.getParameter("searchispublished"));\r
419       responseData.put("searchorder", requestParser.getParameter("searchorder"));\r
420       responseData.put("searcharticletype", requestParser.getParameter("searcharticletype"));\r
421       responseData.put("selectarticleurl", aSelectArticleUrl);\r
422 \r
423       urlBuilder.setValue("offset", anOffset);\r
424       responseData.put("offset" , new Integer(anOffset).toString());\r
425       responseData.put("thisurl" , urlBuilder.getQuery());\r
426 \r
427       if (count>=anOffset+nrEntitiesPerListPage) {\r
428         urlBuilder.setValue("offset", (anOffset + nrEntitiesPerListPage));\r
429         responseData.put("nexturl" , urlBuilder.getQuery());\r
430       }\r
431 \r
432       if (anOffset>0) {\r
433         urlBuilder.setValue("offset", Math.max(anOffset - nrEntitiesPerListPage, 0));\r
434         responseData.put("prevurl" , urlBuilder.getQuery());\r
435       }\r
436 \r
437       responseData.put("articles", articleList);\r
438 \r
439       responseData.put("from" , Integer.toString(anOffset+1));\r
440       responseData.put("count", Integer.toString(count));\r
441       responseData.put("to", Integer.toString(Math.min(anOffset+nrEntitiesPerListPage, count)));\r
442       responseData.put("offset" , Integer.toString(anOffset));\r
443       responseData.put("order", anOrderByClause);\r
444       responseData.put("where" , aWhereClause);\r
445 \r
446       ServletHelper.generateResponse(aResponse.getWriter(), responseData, listGenerator);\r
447     }\r
448     catch (Throwable e) {\r
449       throw new ServletModuleFailure(e);\r
450     }\r
451   }\r
452 \r
453   public void selectparent(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
454   {\r
455     try {\r
456       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
457       URLBuilder urlBuilder = new URLBuilder();\r
458 \r
459       urlBuilder.setValue("module", "Content");\r
460       urlBuilder.setValue("do", "setparent");\r
461       urlBuilder.setValue("childid", requestParser.getParameter("id"));\r
462       urlBuilder.setValue("returnurl", requestParser.getParameter("returnurl"));\r
463 \r
464       returnList(aRequest, aResponse, "", "", 0, urlBuilder.getQuery());\r
465     }\r
466     catch (Throwable e) {\r
467       throw new ServletModuleFailure(e);\r
468     }\r
469   }\r
470 \r
471   public void listchildren(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
472   {\r
473     try {\r
474       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
475       String articleId = requestParser.getParameter("article_id");\r
476 \r
477       if (articleId == null)\r
478         throw new ServletModuleExc("ServletModuleContent.listchildren: article_id not set!");\r
479 \r
480       returnList(aRequest, aResponse, "to_content = " + articleId, "", 0, null);\r
481     }\r
482     catch (Throwable e) {\r
483       throw new ServletModuleFailure(e);\r
484     }\r
485   }\r
486 \r
487   public void setparent(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
488   {\r
489     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
490     String articleId = aRequest.getParameter("childid");\r
491     String parentId  = aRequest.getParameter("id");\r
492     String returnUrl = aRequest.getParameter("returnurl");\r
493 \r
494     try {\r
495       EntityContent article = (EntityContent) mainModule.getById(articleId);\r
496       article.setValueForProperty("to_content", parentId);\r
497       article.setProduced(false);\r
498       article.update();\r
499       logAdminUsage(aRequest, articleId, "parent set to " + parentId);\r
500     }\r
501     catch(Throwable e) {\r
502       logger.error("ServletModuleContent.setparent: " + e.getMessage());\r
503       throw new ServletModuleFailure(e);\r
504     }\r
505 \r
506     redirect(aResponse, returnUrl);\r
507   }\r
508 \r
509   public void clearparent(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
510   {\r
511     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
512     String articleId = requestParser.getParameter("id");\r
513     String returnUrl = requestParser.getParameter("returnurl");\r
514 \r
515     try {\r
516       EntityContent article = (EntityContent) mainModule.getById(articleId);\r
517       article.setValueForProperty("to_content", "");\r
518       article.setProduced(false);\r
519       article.update();\r
520       logAdminUsage(aRequest, articleId, "parent cleared");\r
521     }\r
522     catch(Throwable e) {\r
523       e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE));\r
524       logger.error("ServletModuleContent.clearparent: " + e.getMessage());\r
525 \r
526       throw new ServletModuleFailure("ServletModuleContent.clearparent: " + e.getMessage(), e);\r
527     }\r
528 \r
529     redirect(aResponse, returnUrl);\r
530   }\r
531 }\r