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