media in comments, part 1: the admin side
[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 the com.oreilly.servlet library, any library\r
22  * licensed under the Apache Software License, The Sun (tm) Java Advanced\r
23  * Imaging library (JAI), The Sun JIMI library (or with modified versions of\r
24  * the above that use the same license as the above), and distribute linked\r
25  * combinations including the two.  You must obey the GNU General Public\r
26  * License in all respects for all of the code used other than the above\r
27  * mentioned libraries.  If you modify this file, you may extend this exception\r
28  * to your version of the file, but you are not obligated to do so.  If you do\r
29  * not wish to do so, delete this exception statement from your version.\r
30  */\r
31 \r
32 package mircoders.servlet;\r
33 \r
34 import java.io.InputStream;\r
35 import java.net.URLEncoder;\r
36 import java.util.Map;\r
37 import javax.servlet.ServletContext;\r
38 import javax.servlet.ServletOutputStream;\r
39 import javax.servlet.http.HttpServletRequest;\r
40 import javax.servlet.http.HttpServletResponse;\r
41 import javax.servlet.http.HttpSession;\r
42 \r
43 import freemarker.template.SimpleHash;\r
44 import freemarker.template.SimpleList;\r
45 import mir.config.MirPropertiesConfiguration;\r
46 import mir.entity.Entity;\r
47 import mir.entity.EntityList;\r
48 import mir.log.LoggerWrapper;\r
49 import mir.media.MediaHelper;\r
50 import mir.media.MirMedia;\r
51 import mir.misc.FileHandler;\r
52 import mir.misc.WebdbMultipartRequest;\r
53 import mir.servlet.ServletModule;\r
54 import mir.servlet.ServletModuleExc;\r
55 import mir.servlet.ServletModuleFailure;\r
56 import mir.servlet.ServletModuleUserExc;\r
57 import mir.util.ExceptionFunctions;\r
58 import mircoders.entity.EntityComment;\r
59 import mircoders.entity.EntityContent;\r
60 import mircoders.entity.EntityUploadedMedia;\r
61 import mircoders.entity.EntityUsers;\r
62 import mircoders.media.MediaRequest;\r
63 import mircoders.media.UnsupportedMediaFormatExc;\r
64 import mircoders.storage.DatabaseComment;\r
65 import mircoders.storage.DatabaseContent;\r
66 import mircoders.storage.DatabaseMediafolder;\r
67 \r
68 /*\r
69  *  ServletModuleBilder -\r
70  *  liefert HTML fuer Bilder\r
71  *\r
72  * @version $Id: ServletModuleUploadedMedia.java,v 1.24 2003/04/10 03:31:47 zapata Exp $\r
73  * @author RK, the mir-coders group\r
74  */\r
75 \r
76 public abstract class ServletModuleUploadedMedia\r
77         extends mir.servlet.ServletModule {\r
78 \r
79   //private static DatabaseRights dbRights;\r
80 \r
81   public static ServletModule getInstance() {\r
82     return null;\r
83   }\r
84 \r
85   public ServletModuleUploadedMedia() {\r
86     super();\r
87     logger = new LoggerWrapper("ServletModule.UploadedMedia");\r
88   }\r
89 \r
90   public void insert(HttpServletRequest req, HttpServletResponse res)\r
91           throws ServletModuleExc, ServletModuleUserExc {\r
92     try {\r
93       EntityUsers user = _getUser(req);\r
94       MediaRequest mediaReq =  new MediaRequest(user.getId(), false);\r
95       WebdbMultipartRequest mp = new WebdbMultipartRequest(req, (FileHandler)mediaReq);\r
96       EntityList mediaList = mediaReq.getEntityList();\r
97       String articleid = (String) mp.getParameters().get("articleid");\r
98       String commentid = (String) mp.getParameters().get("commentid");\r
99 \r
100       if (articleid!=null) {\r
101         EntityContent entContent = (EntityContent) DatabaseContent.getInstance().selectById(articleid);\r
102 \r
103         mediaList.rewind();\r
104 \r
105         while (mediaList.hasNext()) {\r
106           entContent.attach( ( (EntityUploadedMedia) mediaList.next()).getId());\r
107         }\r
108         mediaList.rewind();\r
109 \r
110         ((ServletModuleContent) ServletModuleContent.getInstance())._showObject(articleid, req, res);\r
111 \r
112         return;\r
113       }\r
114 \r
115       if (commentid!=null) {\r
116         EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(commentid);\r
117 \r
118         mediaList.rewind();\r
119 \r
120         while (mediaList.hasNext()) {\r
121           comment.attach( ( (EntityUploadedMedia) mediaList.next()).getId());\r
122         }\r
123         mediaList.rewind();\r
124 \r
125         ((ServletModuleComment) ServletModuleComment.getInstance()).showComment(commentid, req, res);\r
126 \r
127         return;\r
128       }\r
129 \r
130       SimpleHash mergeData = new SimpleHash();\r
131       SimpleHash popups = new SimpleHash();\r
132       mergeData.put("contentlist", mediaList);\r
133       if (mediaList.getOrder() != null) {\r
134         mergeData.put("order", mediaList.getOrder());\r
135         mergeData.put("order_encoded", URLEncoder.encode(mediaList.getOrder()));\r
136       }\r
137       mergeData.put("count", (new Integer(mediaList.getCount())).toString());\r
138       mergeData.put("from", (new Integer(mediaList.getFrom())).toString());\r
139       mergeData.put("to", (new Integer(mediaList.getTo())).toString());\r
140       if (mediaList.hasNextBatch())\r
141         mergeData.put("next", (new Integer(mediaList.getNextBatch())).toString());\r
142       if (mediaList.hasPrevBatch())\r
143         mergeData.put("prev", (new Integer(mediaList.getPrevBatch())).toString());\r
144       //fetch the popups\r
145       popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());\r
146       // raus damit\r
147       deliver(req, res, mergeData, popups, templateListString);\r
148     }\r
149     catch (Throwable t) {\r
150       Throwable cause = ExceptionFunctions.traceCauseException(t);\r
151 \r
152       if (cause instanceof UnsupportedMediaFormatExc) {\r
153         throw new ServletModuleUserExc("media.error.unsupportedformat", new String[] {});\r
154       }\r
155       throw new ServletModuleFailure("ServletModuleUploadedMedia.insert: " + t.toString(), t);\r
156     }\r
157   }\r
158 \r
159   public void update(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {\r
160 \r
161     try {\r
162       EntityUsers user = _getUser(req);\r
163       WebdbMultipartRequest mp = new WebdbMultipartRequest(req, null);\r
164       Map parameters = mp.getParameters();\r
165 \r
166       parameters.put("to_publisher", user.getId());\r
167       parameters.put("is_produced", "0");\r
168       if (!parameters.containsKey("is_published"))\r
169         parameters.put("is_published", "0");\r
170 \r
171       String id = mainModule.set(parameters);\r
172       logger.debug("update: media ID = " + id);\r
173       _edit(id, req, res);\r
174     }\r
175     catch (Throwable e) {\r
176       throw new ServletModuleFailure("upload -- exception " + e.toString(), e);\r
177     }\r
178 \r
179   }\r
180 \r
181 \r
182   public void list(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {\r
183     // Parameter auswerten\r
184     SimpleHash mergeData = new SimpleHash();\r
185     SimpleHash popups = new SimpleHash();\r
186 \r
187     String query_text = req.getParameter("query_text");\r
188     mergeData.put("query_text", query_text);\r
189     if (query_text != null) mergeData.put("query_text_encoded", URLEncoder.encode(query_text));\r
190     String query_field = req.getParameter("query_field");\r
191     mergeData.put("query_field", query_field);\r
192     String query_is_published = req.getParameter("query_is_published");\r
193     mergeData.put("query_is_published", query_is_published);\r
194     String query_media_folder = req.getParameter("query_media_folder");\r
195     mergeData.put("query_media_folder", query_media_folder);\r
196     String offset = req.getParameter("offset");\r
197     if (offset == null || offset.equals("")) offset = "0";\r
198     mergeData.put("offset", offset);\r
199 \r
200     String order = req.getParameter("order");\r
201     if (order == null || order.equals("")) order = "webdb_lastchange desc";\r
202 \r
203     // if in connection mode to content\r
204     mergeData.put("articleid", req.getParameter("articleid"));\r
205     mergeData.put("commentid", req.getParameter("commentid"));\r
206 \r
207 \r
208     // sql basteln\r
209     String whereClause = "";\r
210     boolean isFirst = true;\r
211     if (query_text != null && !query_text.equalsIgnoreCase("")) {\r
212       whereClause += "lower(" + query_field + ") like lower('%" + query_text + "%')";\r
213       isFirst = false;\r
214     }\r
215     if (query_is_published != null && !query_is_published.equals("")) {\r
216       if (isFirst == false) whereClause += " and ";\r
217       whereClause += "is_published='" + query_is_published + "'";\r
218       isFirst = false;\r
219     }\r
220     if (query_media_folder != null && !query_media_folder.equals("")) {\r
221       if (isFirst == false) whereClause += " and ";\r
222       whereClause += "to_media_folder='" + query_media_folder + "'";\r
223     }\r
224     //theLog.printDebugInfo("sql-whereclause: " + whereClause + " order: " + order + " offset: " + offset);\r
225 \r
226     // fetch and deliver\r
227     try {\r
228       if (query_text != null || query_is_published != null || query_media_folder != null) {\r
229         EntityList theList = mainModule.getByWhereClause(whereClause, order, (new Integer(offset)).intValue(), 10);\r
230         if (theList != null) {\r
231           mergeData.put("contentlist", theList);\r
232           if (theList.getOrder() != null) {\r
233             mergeData.put("order", theList.getOrder());\r
234             mergeData.put("order_encoded", URLEncoder.encode(theList.getOrder()));\r
235           }\r
236           mergeData.put("count", (new Integer(theList.getCount())).toString());\r
237           mergeData.put("from", (new Integer(theList.getFrom())).toString());\r
238           mergeData.put("to", (new Integer(theList.getTo())).toString());\r
239           if (theList.hasNextBatch())\r
240             mergeData.put("next", (new Integer(theList.getNextBatch())).toString());\r
241           if (theList.hasPrevBatch())\r
242             mergeData.put("prev", (new Integer(theList.getPrevBatch())).toString());\r
243         }\r
244       }\r
245       popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());\r
246 \r
247       deliver(req, res, mergeData, popups, templateListString);\r
248     }\r
249     catch (Throwable e) {\r
250       throw new ServletModuleFailure(e);\r
251     }\r
252   }\r
253 \r
254 \r
255   public void add(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {\r
256     try {\r
257       SimpleHash mergeData = new SimpleHash();\r
258       SimpleHash popups = new SimpleHash();\r
259       String maxMedia = MirPropertiesConfiguration.instance().getString("ServletModule.OpenIndy.MaxMediaUploadItems");\r
260       String numOfMedia = req.getParameter("medianum");\r
261 \r
262       mergeData.put("new", "1");\r
263       mergeData.put("articleid", req.getParameter("articleid"));\r
264       mergeData.put("commentid", req.getParameter("commentid"));\r
265 \r
266       popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());\r
267 \r
268       if (numOfMedia==null || numOfMedia.equals("")) {\r
269         numOfMedia="1";\r
270       }\r
271       else if(Integer.parseInt(numOfMedia) > Integer.parseInt(maxMedia)) {\r
272         numOfMedia = maxMedia;\r
273       }\r
274 \r
275       int mediaNum = Integer.parseInt(numOfMedia);\r
276       SimpleList mediaFields = new SimpleList();\r
277       for(int i =0; i<mediaNum;i++){\r
278         Integer mNum = new Integer(i+1);\r
279         mediaFields.add(mNum.toString());\r
280       }\r
281       mergeData.put("medianum",numOfMedia);\r
282       mergeData.put("mediafields",mediaFields);\r
283       deliver(req, res, mergeData, popups, templateObjektString);\r
284     }\r
285     catch (Exception e) {\r
286       throw new ServletModuleFailure(e);\r
287     }\r
288   }\r
289 \r
290   public void edit(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {\r
291     String idParam = req.getParameter("id");\r
292     _edit(idParam, req, res);\r
293   }\r
294 \r
295   private void _edit(String idParam, HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {\r
296     if (idParam != null && !idParam.equals("")) {\r
297       try {\r
298         SimpleHash popups = new SimpleHash();\r
299         popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());\r
300         deliver(req, res, mainModule.getById(idParam), popups,\r
301                 templateObjektString);\r
302       }\r
303       catch (Throwable e) {\r
304         throw new ServletModuleFailure(e);\r
305       }\r
306     }\r
307     else {\r
308       throw new ServletModuleExc("ServletmoduleUploadedMedia :: _edit without id");\r
309     }\r
310   }\r
311 \r
312 \r
313   /** @todo should be in ServletModule.java */\r
314   private EntityUsers _getUser(HttpServletRequest req) {\r
315     HttpSession session = req.getSession(false);\r
316     return (EntityUsers) session.getAttribute("login.uid");\r
317   }\r
318 \r
319   public void getMedia(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {\r
320     String idParam = req.getParameter("id");\r
321     if (idParam!=null && !idParam.equals("")) {\r
322       try {\r
323         EntityUploadedMedia ent = (EntityUploadedMedia)mainModule.getById(idParam);\r
324         Entity mediaType = ent.getMediaType();\r
325         MirMedia mediaHandler;\r
326 \r
327         ServletContext ctx = MirPropertiesConfiguration.getContext();\r
328         String fName = ent.getId()+"."+mediaType.getValue("name");\r
329 \r
330         mediaHandler = MediaHelper.getHandler(mediaType);\r
331         InputStream in = mediaHandler.getMedia(ent, mediaType);\r
332 \r
333         res.setContentType(ctx.getMimeType(fName));\r
334         //important that before calling this res.getWriter was not called first\r
335         ServletOutputStream out = res.getOutputStream();\r
336 \r
337         int read ;\r
338         byte[] buf = new byte[8 * 1024];\r
339         while((read = in.read(buf)) != -1) {\r
340           out.write(buf, 0, read);\r
341         }\r
342         in.close();\r
343         out.close();\r
344       }\r
345       catch (Throwable e) {\r
346         throw new ServletModuleFailure(e);\r
347       }\r
348     }\r
349     else logger.error("id not specified.");\r
350     // no exception allowed\r
351   }\r
352 \r
353   public void getIcon(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc\r
354   {\r
355     String idParam = req.getParameter("id");\r
356     if (idParam!=null && !idParam.equals("")) {\r
357       try {\r
358         EntityUploadedMedia ent = (EntityUploadedMedia)mainModule.getById(idParam);\r
359         Entity mediaType = ent.getMediaType();\r
360         MirMedia mediaHandler;\r
361 \r
362         ServletContext ctx = MirPropertiesConfiguration.getContext();\r
363         String fName = ent.getId()+"."+mediaType.getValue("name");\r
364 \r
365         mediaHandler = MediaHelper.getHandler(mediaType);\r
366         InputStream in = mediaHandler.getIcon(ent);\r
367 \r
368         res.setContentType(ctx.getMimeType(fName));\r
369         //important that before calling this res.getWriter was not called first\r
370         ServletOutputStream out = res.getOutputStream();\r
371 \r
372         int read ;\r
373         byte[] buf = new byte[8 * 1024];\r
374         while((read = in.read(buf)) != -1) {\r
375           out.write(buf, 0, read);\r
376         }\r
377         in.close();\r
378         out.close();\r
379       }\r
380 \r
381       catch (Throwable e) {\r
382         throw new ServletModuleFailure(e);\r
383       }\r
384     }\r
385     else logger.error("getIcon: id not specified.");\r
386     // no exception allowed\r
387   }\r
388 \r
389 }\r
390 \r
391 \r