major cleanup:
[mir.git] / source / mircoders / servlet / ServletModuleUploadedMedia.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.io.InputStream;\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 java.util.Vector;\r
40 import javax.servlet.ServletContext;\r
41 import javax.servlet.ServletOutputStream;\r
42 import javax.servlet.http.HttpServletRequest;\r
43 import javax.servlet.http.HttpServletResponse;\r
44 \r
45 import org.apache.commons.fileupload.FileItem;\r
46 import mir.config.MirPropertiesConfiguration;\r
47 import mir.entity.Entity;\r
48 import mir.entity.adapter.EntityAdapter;\r
49 import mir.entity.adapter.EntityAdapterModel;\r
50 import mir.entity.adapter.EntityIteratorAdapter;\r
51 import mir.log.LoggerWrapper;\r
52 import mir.media.MediaHelper;\r
53 import mir.media.MirMedia;\r
54 import mir.servlet.ServletModule;\r
55 import mir.servlet.ServletModuleExc;\r
56 import mir.servlet.ServletModuleFailure;\r
57 import mir.servlet.ServletModuleUserExc;\r
58 import mir.session.UploadedFile;\r
59 import mir.util.CachingRewindableIterator;\r
60 import mir.util.ExceptionFunctions;\r
61 import mir.util.HTTPParsedRequest;\r
62 import mir.util.HTTPRequestParser;\r
63 import mir.util.JDBCStringRoutines;\r
64 import mir.util.SQLQueryBuilder;\r
65 import mir.util.URLBuilder;\r
66 import mircoders.entity.EntityComment;\r
67 import mircoders.entity.EntityContent;\r
68 import mircoders.entity.EntityUploadedMedia;\r
69 import mircoders.global.MirGlobal;\r
70 import mircoders.media.MediaUploadProcessor;\r
71 import mircoders.module.ModuleMediaType;\r
72 import mircoders.storage.DatabaseComment;\r
73 import mircoders.storage.DatabaseContent;\r
74 \r
75 /**\r
76  *\r
77  * <p>Title: </p>\r
78  * <p>Description: </p>\r
79  * <p>Copyright: Copyright (c) 2003</p>\r
80  * <p>Company: </p>\r
81  * @author the mir coders\r
82  * @version 1.0\r
83  */\r
84 \r
85 public abstract class ServletModuleUploadedMedia extends ServletModule {\r
86   protected String moduleName = "UploadedMedia";\r
87 \r
88   public static ServletModule getInstance() {\r
89     return null;\r
90   }\r
91 \r
92   public ServletModuleUploadedMedia() {\r
93     super();\r
94 \r
95     definition = "uploadedMedia";\r
96     logger = new LoggerWrapper("ServletModule.UploadedMedia");\r
97     try {\r
98       model = MirGlobal.localizer().dataModel().adapterModel();\r
99     }\r
100     catch (Throwable t) {\r
101       throw new ServletModuleFailure(t);\r
102     }\r
103   }\r
104 \r
105   public void insert(HttpServletRequest aRequest, HttpServletResponse aResponse)\r
106           throws ServletModuleExc, ServletModuleUserExc {\r
107     try {\r
108       HTTPParsedRequest parsedRequest = new HTTPParsedRequest(aRequest,\r
109           configuration.getString("Mir.DefaultEncoding"),\r
110           configuration.getInt("MaxMediaUploadSize")*1024,\r
111           configuration.getString("TempDir"));\r
112 \r
113       Map mediaValues = new HashMap();\r
114 \r
115       mediaValues.put("to_publisher", ServletHelper.getUser(aRequest).getId());\r
116 \r
117       Iterator i = mainModule.getStorageObject().getFields().iterator();\r
118       while (i.hasNext()) {\r
119         String field = (String) i.next();\r
120         String value = parsedRequest.getParameter(field);\r
121         if (value!=null)\r
122           mediaValues.put(field, value);\r
123       }\r
124 \r
125       List mediaList = new Vector();\r
126 \r
127       i = parsedRequest.getFiles().iterator();\r
128       while (i.hasNext()) {\r
129         UploadedFile file = new mir.session.CommonsUploadedFileAdapter((FileItem) i.next());\r
130 \r
131         String suffix = file.getFieldName().substring(5);\r
132         mediaValues.put("title", parsedRequest.getParameter("media_title" + suffix));\r
133 \r
134         mediaList.add(MediaUploadProcessor.processMediaUpload(file, mediaValues));\r
135       }\r
136 \r
137       String articleid = parsedRequest.getParameter("articleid");\r
138       String commentid = parsedRequest.getParameter("commentid");\r
139 \r
140       if (articleid!=null) {\r
141         EntityContent entContent = (EntityContent) DatabaseContent.getInstance().selectById(articleid);\r
142 \r
143         i=mediaList.iterator();\r
144 \r
145         while (i.hasNext()) {\r
146           entContent.attach(((EntityUploadedMedia) i.next()).getId());\r
147         }\r
148 \r
149         ((ServletModuleContent) ServletModuleContent.getInstance())._showObject(articleid, aRequest, aResponse);\r
150 \r
151         return;\r
152       }\r
153 \r
154       if (commentid!=null) {\r
155         EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(commentid);\r
156 \r
157         i=mediaList.iterator();\r
158 \r
159         while (i.hasNext()) {\r
160           comment.attach( ( (EntityUploadedMedia) i.next()).getId());\r
161         }\r
162 \r
163         ((ServletModuleComment) ServletModuleComment.getInstance()).showComment(commentid, aRequest, aResponse);\r
164 \r
165         return;\r
166       }\r
167 \r
168       returnUploadedMediaList(aRequest, aResponse, mediaList, 1, mediaList.size(), mediaList.size(), "", null, null);\r
169     }\r
170     catch (Throwable t) {\r
171       Throwable cause = ExceptionFunctions.traceCauseException(t);\r
172 \r
173       if (cause instanceof ModuleMediaType.UnsupportedMimeTypeExc) {\r
174         throw new ServletModuleUserExc("media.error.unsupportedformat", new String[] {});\r
175       }\r
176       throw new ServletModuleFailure("ServletModuleUploadedMedia.insert: " + t.toString(), t);\r
177     }\r
178   }\r
179 \r
180   public void update(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
181 \r
182     try {\r
183       HTTPParsedRequest parsedRequest = new HTTPParsedRequest(aRequest,\r
184           configuration.getString("Mir.DefaultEncoding"),\r
185           configuration.getInt("MaxMediaUploadSize")*1024,\r
186           configuration.getString("TempDir"));\r
187       Map mediaValues = new HashMap();\r
188 \r
189       Iterator i = mainModule.getStorageObject().getFields().iterator();\r
190       while (i.hasNext()) {\r
191         String field = (String) i.next();\r
192         String value = parsedRequest.getParameter(field);\r
193         if (value!=null)\r
194           mediaValues.put(field, value);\r
195       }\r
196 \r
197       mediaValues.put("to_publisher", ServletHelper.getUser(aRequest).getId());\r
198       mediaValues.put("is_produced", "0");\r
199       if (!mediaValues.containsKey("is_published"))\r
200         mediaValues.put("is_published", "0");\r
201 \r
202       String id = mainModule.set(mediaValues);\r
203       logger.debug("update: media ID = " + id);\r
204 \r
205       editUploadedMediaObject(id, aRequest, aResponse);\r
206     }\r
207     catch (Throwable e) {\r
208       throw new ServletModuleFailure("upload -- exception " + e.toString(), e);\r
209     }\r
210 \r
211   }\r
212 \r
213   public void returnUploadedMediaList(HttpServletRequest aRequest, HttpServletResponse aResponse,\r
214                                       Object aList, int aFrom, int aTo, int aCount,\r
215                                       String aThisUrl, String aNextUrl, String aPreviousUrl) throws ServletModuleExc {\r
216 \r
217     try {\r
218       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
219       Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] {getLocale(aRequest), getFallbackLocale(aRequest)});\r
220 \r
221       responseData.put("searchfield", requestParser.getParameterWithDefault("searchfield", ""));\r
222       responseData.put("searchtext", requestParser.getParameterWithDefault("searchtext", ""));\r
223       responseData.put("searchispublished", requestParser.getParameterWithDefault("searchispublished", ""));\r
224       responseData.put("searchmediafolder", requestParser.getParameterWithDefault("searchmediafolder", ""));\r
225       responseData.put("articleid", requestParser.getParameter("articleid"));\r
226       responseData.put("commentid", requestParser.getParameter("commentid"));\r
227 \r
228       responseData.put("thisurl", aThisUrl);\r
229       responseData.put("nexturl", aNextUrl);\r
230       responseData.put("prevurl", aPreviousUrl);\r
231 \r
232       responseData.put("from", Integer.toString(aFrom));\r
233       responseData.put("count", Integer.toString(aCount));\r
234       responseData.put("to", Integer.toString(aTo));\r
235 \r
236       responseData.put("medialist", aList);\r
237 \r
238       addExtraData(responseData);\r
239       ServletHelper.generateResponse(aResponse.getWriter(), responseData, listGenerator);\r
240     }\r
241     catch (Throwable t) {\r
242       throw new ServletModuleFailure(t);\r
243     }\r
244   }\r
245 \r
246   public void returnUploadedMediaList(HttpServletRequest aRequest, HttpServletResponse aResponse,\r
247                                       String aWhereClause, String anOrderByClause, int anOffset) throws ServletModuleExc {\r
248 \r
249     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
250     URLBuilder urlBuilder = new URLBuilder();\r
251     EntityAdapterModel model;\r
252     String nextPageUrl = null;\r
253     String previousPageUrl = null;\r
254     String thisUrl = null;\r
255 \r
256     int count;\r
257 \r
258     try {\r
259       model = MirGlobal.localizer().dataModel().adapterModel();\r
260 \r
261       Object mediaList =\r
262           new CachingRewindableIterator(\r
263           new EntityIteratorAdapter(aWhereClause, anOrderByClause, nrEntitiesPerListPage,\r
264                    model, definition, nrEntitiesPerListPage, anOffset)\r
265           );\r
266 \r
267       count = mainModule.getSize(aWhereClause);\r
268 \r
269       urlBuilder.setValue("module", moduleName);\r
270       urlBuilder.setValue("do", "list");\r
271       urlBuilder.setValue("where", aWhereClause);\r
272       urlBuilder.setValue("order", anOrderByClause);\r
273 \r
274       urlBuilder.setValue("articleid", requestParser.getParameter("articleid"));\r
275       urlBuilder.setValue("commentid", requestParser.getParameter("commentid"));\r
276       urlBuilder.setValue("searchfield", requestParser.getParameter("searchfield"));\r
277       urlBuilder.setValue("searchtext", requestParser.getParameter("searchtext"));\r
278       urlBuilder.setValue("searchispublished", requestParser.getParameter("searchispublished"));\r
279       urlBuilder.setValue("searchmediafolder", requestParser.getParameter("searchmediafolder"));\r
280       urlBuilder.setValue("where", aWhereClause);\r
281       urlBuilder.setValue("order", anOrderByClause);\r
282 \r
283       urlBuilder.setValue("offset", anOffset);\r
284       thisUrl = urlBuilder.getQuery();\r
285 \r
286       if (count >= anOffset + nrEntitiesPerListPage) {\r
287         urlBuilder.setValue("offset", anOffset + nrEntitiesPerListPage);\r
288         nextPageUrl = urlBuilder.getQuery();\r
289       }\r
290 \r
291       if (anOffset > 0) {\r
292         urlBuilder.setValue("offset", Math.max(anOffset - nrEntitiesPerListPage, 0));\r
293         previousPageUrl = urlBuilder.getQuery();\r
294       }\r
295 \r
296       returnUploadedMediaList(aRequest, aResponse, mediaList,\r
297               anOffset+1, anOffset+nrEntitiesPerListPage, count, thisUrl,\r
298               nextPageUrl, previousPageUrl);\r
299     }\r
300     catch (Throwable e) {\r
301       throw new ServletModuleFailure(e);\r
302     }\r
303   }\r
304 \r
305   public void search(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
306     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
307 \r
308     SQLQueryBuilder queryBuilder = new SQLQueryBuilder();\r
309 \r
310     String queryField = "";\r
311     String searchField = requestParser.getParameter("searchfield");\r
312     String searchText = requestParser.getParameter("searchtext");\r
313     String searchIsPublished = requestParser.getParameter("searchispublished");\r
314     String searchMediaFolder = requestParser.getParameter("searchmediafolder");\r
315 \r
316     queryBuilder.appendDescendingOrder("webdb_create");\r
317 \r
318     if (searchIsPublished!=null)\r
319       if (searchIsPublished.equals("0")) {\r
320         queryBuilder.appendAndCondition("is_published='f'");\r
321       }\r
322       else if (searchIsPublished.equals("1")) {\r
323         queryBuilder.appendAndCondition("is_published='t'");\r
324       }\r
325 \r
326     if (searchField!=null && searchText!=null && searchText.length()>0) {\r
327         queryBuilder.appendAndCondition(\r
328           "lower(" + searchField + ") like " +\r
329           "'%" + JDBCStringRoutines.escapeStringLiteral(searchText.toLowerCase()) + "%'");\r
330     }\r
331 \r
332     if (searchMediaFolder!=null && searchMediaFolder.length()>0) {\r
333       queryBuilder.appendAndCondition("to_media_folder="+Integer.parseInt(searchMediaFolder));\r
334     }\r
335 \r
336     returnUploadedMediaList(aRequest, aResponse,\r
337             queryBuilder.getWhereClause(), queryBuilder.getOrderByClause(), requestParser.getIntegerWithDefault("offset", 0));\r
338   }\r
339 \r
340   public void list(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
341     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
342 \r
343     returnUploadedMediaList(aRequest, aResponse,\r
344        requestParser.getParameterWithDefault("where", ""),\r
345        requestParser.getParameterWithDefault("order", "webdb_create desc"),\r
346        requestParser.getIntegerWithDefault("offset", 0));\r
347   }\r
348 \r
349 \r
350   public void add(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
351     try {\r
352       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
353       Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] {getLocale(aRequest), getFallbackLocale(aRequest)});\r
354 \r
355       int nrMedia = requestParser.getIntegerWithDefault("nrmedia", 1);\r
356       int maxNrMedia=configuration.getInt("ServletModule.OpenIndy.MaxMediaUploadItems", 20);\r
357 \r
358       List fields = mainModule.getStorageObject().getFields();\r
359       Map media = new HashMap();\r
360       Iterator i = fields.iterator();\r
361       while (i.hasNext()) {\r
362         media.put(i.next(), null);\r
363       }\r
364       media.put("to_media_folder", new Integer(7));\r
365       responseData.put("uploadedmedia", media);\r
366 \r
367       responseData.put("new", Boolean.TRUE);\r
368       responseData.put("articleid", requestParser.getParameter("articleid"));\r
369       responseData.put("commentid", requestParser.getParameter("commentid"));\r
370       responseData.put("returnurl", null);\r
371 \r
372       if (nrMedia<=0)\r
373         nrMedia=1;\r
374       if (nrMedia>maxNrMedia)\r
375         nrMedia=maxNrMedia;\r
376 \r
377       List mediaFields = new Vector();\r
378       for (int j=0; j<nrMedia; j++)\r
379         mediaFields.add(new Integer(j));\r
380 \r
381       responseData.put("nrmedia", new Integer(nrMedia));\r
382       responseData.put("mediafields", mediaFields);\r
383 \r
384       responseData.put("edittemplate", editGenerator);\r
385       responseData.put("module", moduleName);\r
386 \r
387       addExtraData(responseData);\r
388 \r
389       ServletHelper.generateResponse(aResponse.getWriter(), responseData, "uploadedmedia.template");\r
390     }\r
391     catch (Exception e) {\r
392       throw new ServletModuleFailure(e);\r
393     }\r
394   }\r
395 \r
396   public void edit(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
397     editUploadedMediaObject(aRequest.getParameter("id"), aRequest, aResponse);\r
398   }\r
399 \r
400   private void editUploadedMediaObject(String idParam, HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
401     if (idParam != null && !idParam.equals("")) {\r
402       try {\r
403         Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] {getLocale(aRequest), getFallbackLocale(aRequest)});\r
404         EntityAdapter object =\r
405             model.makeEntityAdapter(definition, mainModule.getById(idParam));\r
406         responseData.put("uploadedmedia", object);\r
407         responseData.put("new", Boolean.FALSE);\r
408         responseData.put("articleid", null);\r
409         responseData.put("commentid", null);\r
410         responseData.put("returnurl", null);\r
411 \r
412         responseData.put("edittemplate", editGenerator);\r
413         responseData.put("module", moduleName);\r
414 \r
415         addExtraData(responseData);\r
416 \r
417         ServletHelper.generateResponse(aResponse.getWriter(), responseData, "uploadedmedia.template");\r
418       }\r
419       catch (Throwable e) {\r
420         throw new ServletModuleFailure(e);\r
421       }\r
422     }\r
423     else {\r
424       throw new ServletModuleExc("ServletmoduleUploadedMedia :: editUploadedMediaObject without id");\r
425     }\r
426   }\r
427 \r
428   public void getMedia(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
429     String idParam = aRequest.getParameter("id");\r
430     if (idParam!=null && !idParam.equals("")) {\r
431       try {\r
432         EntityUploadedMedia ent = (EntityUploadedMedia)mainModule.getById(idParam);\r
433         Entity mediaType = ent.getMediaType();\r
434         MirMedia mediaHandler;\r
435 \r
436         ServletContext ctx = MirPropertiesConfiguration.getContext();\r
437         String fName = ent.getId()+"."+mediaType.getValue("name");\r
438 \r
439         mediaHandler = MediaHelper.getHandler(mediaType);\r
440         InputStream in = mediaHandler.getMedia(ent, mediaType);\r
441 \r
442         aResponse.setContentType(ctx.getMimeType(fName));\r
443         //important that before calling this aResponse.getWriter was not called first\r
444         ServletOutputStream out = aResponse.getOutputStream();\r
445 \r
446         int read ;\r
447         byte[] buf = new byte[8 * 1024];\r
448         while((read = in.read(buf)) != -1) {\r
449           out.write(buf, 0, read);\r
450         }\r
451         in.close();\r
452         out.close();\r
453       }\r
454       catch (Throwable e) {\r
455         throw new ServletModuleFailure(e);\r
456       }\r
457     }\r
458     else logger.error("id not specified.");\r
459     // no exception allowed\r
460   }\r
461 \r
462   public void getIcon(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
463   {\r
464     String idParam = aRequest.getParameter("id");\r
465     if (idParam!=null && !idParam.equals("")) {\r
466       try {\r
467         EntityUploadedMedia ent = (EntityUploadedMedia) mainModule.getById(idParam);\r
468         Entity mediaType = ent.getMediaType();\r
469         MirMedia mediaHandler;\r
470 \r
471         mediaHandler = MediaHelper.getHandler(mediaType);\r
472         InputStream in = mediaHandler.getIcon(ent);\r
473 \r
474         if (in==null)\r
475           throw new ServletModuleExc("no icon available");\r
476 \r
477         aResponse.setContentType(mediaHandler.getIconMimeType(ent, mediaType));\r
478         //important that before calling this aResponse.getWriter was not called first\r
479         ServletOutputStream out = aResponse.getOutputStream();\r
480 \r
481         int read ;\r
482         byte[] buf = new byte[8 * 1024];\r
483         while((read = in.read(buf)) != -1) {\r
484           out.write(buf, 0, read);\r
485         }\r
486         in.close();\r
487         out.close();\r
488       }\r
489 \r
490       catch (Throwable e) {\r
491         logger.error("getIcon: " + e.toString());\r
492       }\r
493     }\r
494     else logger.error("getIcon: id not specified.");\r
495     // no exception allowed\r
496   }\r
497 \r
498   protected void addExtraData(Map aTarget) throws ServletModuleExc, ServletModuleFailure {\r
499     try {\r
500       aTarget.put("mediafolders",\r
501                   new EntityIteratorAdapter("", "", 20, MirGlobal.localizer().dataModel().adapterModel(), "mediaFolder"));\r
502     }\r
503     catch (Throwable t) {\r
504       throw new ServletModuleFailure(t);\r
505     }\r
506   }\r
507 }