d2425165ee19c97721403d29aa9b428f622bf40c
[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.8.2.4 2002/12/10 10:01:50 mh 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       theLog.printError("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.equals("")) 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 und ausliefern
202     try {
203       EntityList theList = mainModule.getByWhereClause(whereClause, order, (new Integer(offset)).intValue(), 10);
204       if (theList != null) {
205         mergeData.put("contentlist", theList);
206         if (theList.getOrder() != null) {
207           mergeData.put("order", theList.getOrder());
208           mergeData.put("order_encoded", URLEncoder.encode(theList.getOrder()));
209         }
210         mergeData.put("count", (new Integer(theList.getCount())).toString());
211         mergeData.put("from", (new Integer(theList.getFrom())).toString());
212         mergeData.put("to", (new Integer(theList.getTo())).toString());
213         if (theList.hasNextBatch())
214           mergeData.put("next", (new Integer(theList.getNextBatch())).toString());
215         if (theList.hasPrevBatch())
216           mergeData.put("prev", (new Integer(theList.getPrevBatch())).toString());
217       }
218       //fetch the popups
219       popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());
220       // raus damit
221       deliver(req, res, mergeData, popups, templateListString);
222     }
223     catch (ModuleException e) {
224       throw new ServletModuleException(e.toString());
225     }
226     catch (Exception e) {
227       throw new ServletModuleException(e.toString());
228     }
229   }
230
231
232   public void add(HttpServletRequest req, HttpServletResponse res)
233           throws ServletModuleException {
234     try {
235       SimpleHash mergeData = new SimpleHash();
236       mergeData.put("new", "1");
237       SimpleHash popups = new SimpleHash();
238       popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());
239       String maxMedia = MirConfig.getProp("ServletModule.OpenIndy.MaxMediaUploadItems");
240       String numOfMedia = req.getParameter("medianum");
241       if(numOfMedia==null||numOfMedia.equals("")){
242         numOfMedia="1";
243       } else if(Integer.parseInt(numOfMedia) > Integer.parseInt(maxMedia)) {
244         numOfMedia = maxMedia;
245       }
246     
247       int mediaNum = Integer.parseInt(numOfMedia);
248       SimpleList mediaFields = new SimpleList();
249       for(int i =0; i<mediaNum;i++){
250         Integer mNum = new Integer(i+1);
251         mediaFields.add(mNum.toString());
252       }
253       mergeData.put("medianum",numOfMedia);
254       mergeData.put("mediafields",mediaFields);
255       deliver(req, res, mergeData, popups, templateObjektString);
256     } catch (Exception e) {
257       throw new ServletModuleException(e.toString());
258     }
259   }
260
261   public void edit(HttpServletRequest req, HttpServletResponse res)
262           throws ServletModuleException {
263     String idParam = req.getParameter("id");
264     _edit(idParam, req, res);
265   }
266
267   private void _edit(String idParam, HttpServletRequest req, HttpServletResponse res)
268           throws ServletModuleException {
269     if (idParam != null && !idParam.equals("")) {
270       try {
271         SimpleHash popups = new SimpleHash();
272         popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());
273         deliver(req, res, mainModule.getById(idParam), popups,
274                 templateObjektString);
275       }
276       catch (ModuleException e) {
277         throw new ServletModuleException(e.toString());
278       }
279       catch (StorageObjectException e) {
280         throw new ServletModuleException(e.toString());
281       }
282     }
283     else {
284       throw new ServletModuleException("ServletmoduleUploadedMedia :: _edit without id");
285     }
286   }
287
288
289   /** @todo should be in ServletModule.java */
290   private EntityUsers _getUser(HttpServletRequest req) {
291     HttpSession session = req.getSession(false);
292     return (EntityUsers) session.getAttribute("login.uid");
293   }
294
295   public void getMedia(HttpServletRequest req, HttpServletResponse res)
296     throws ServletModuleException
297   {
298     String idParam = req.getParameter("id");
299     if (idParam!=null && !idParam.equals("")) {
300       try {
301         EntityUploadedMedia ent = (EntityUploadedMedia)mainModule.getById(idParam);
302         Entity mediaType = ent.getMediaType();
303         MirMedia mediaHandler;
304
305         ServletContext ctx =
306                     (ServletContext)MirConfig.getPropAsObject("ServletContext");
307         String fName = ent.getId()+"."+mediaType.getValue("name");
308
309         mediaHandler = MediaHelper.getHandler(mediaType);
310         InputStream in = mediaHandler.getMedia(ent, mediaType);
311
312         res.setContentType(ctx.getMimeType(fName));
313         //important that before calling this res.getWriter was not called first
314         ServletOutputStream out = res.getOutputStream();
315  
316         int read ;
317         byte[] buf = new byte[8 * 1024];
318         while((read = in.read(buf)) != -1) {
319           out.write(buf, 0, read);
320         }
321         in.close();
322         out.close();
323       }
324
325       catch (IOException e) {
326         throw new ServletModuleException(e.toString());
327       }
328       catch (ModuleException e) {
329         throw new ServletModuleException(e.toString());
330       }
331       catch (Exception e) {
332         throw new ServletModuleException(e.toString());
333       }
334     }
335     else theLog.printDebugInfo("id nicht angeben.");
336     // darf keine exception werfen
337   }
338
339   public void getIcon(HttpServletRequest req, HttpServletResponse res)
340     throws ServletModuleException
341   {
342     String idParam = req.getParameter("id");
343     if (idParam!=null && !idParam.equals("")) {
344       try {
345         EntityUploadedMedia ent = (EntityUploadedMedia)mainModule.getById(idParam);
346         Entity mediaType = ent.getMediaType();
347         MirMedia mediaHandler;
348
349         ServletContext ctx =
350                     (ServletContext)MirConfig.getPropAsObject("ServletContext");
351         String fName = ent.getId()+"."+mediaType.getValue("name");
352
353         mediaHandler = MediaHelper.getHandler(mediaType);
354         InputStream in = mediaHandler.getIcon(ent);
355  
356         res.setContentType(ctx.getMimeType(fName));
357         //important that before calling this res.getWriter was not called first
358         ServletOutputStream out = res.getOutputStream();
359
360         int read ;
361         byte[] buf = new byte[8 * 1024];
362         while((read = in.read(buf)) != -1) {
363           out.write(buf, 0, read);
364         }
365         in.close();
366         out.close();
367       }
368
369       catch (IOException e) {
370         throw new ServletModuleException(e.toString());
371       }
372       catch (ModuleException e) {
373         throw new ServletModuleException(e.toString());
374       }
375       catch (Exception e) {
376         throw new ServletModuleException(e.toString());
377       }
378     }
379     else theLog.printDebugInfo("id nicht angeben.");
380     // darf keine exception werfen
381   }
382
383 }
384
385