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