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