X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fservlet%2FServletModuleUploadedMedia.java;h=ba34a6392260daaab9be2c2154ee3db9b0f0942d;hb=a0e0629d9b38c2eb4eba6d9420ccbc6d1b44ab00;hp=f9ebde38fbd1b18c2e970bbf92433675253b5c34;hpb=13fd1cb27dfaaeba8590daae63e1f577e017b55c;p=mir.git diff --git a/source/mircoders/servlet/ServletModuleUploadedMedia.java b/source/mircoders/servlet/ServletModuleUploadedMedia.java index f9ebde38..ba34a639 100755 --- a/source/mircoders/servlet/ServletModuleUploadedMedia.java +++ b/source/mircoders/servlet/ServletModuleUploadedMedia.java @@ -1,40 +1,83 @@ +/* + * Copyright (C) 2001, 2002 The Mir-coders group + * + * This file is part of Mir. + * + * Mir is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Mir is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mir; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, The Mir-coders gives permission to link + * the code of this program with any library licensed under the Apache Software License, + * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library + * (or with modified versions of the above that use the same license as the above), + * and distribute linked combinations including the two. You must obey the + * GNU General Public License in all respects for all of the code used other than + * the above mentioned libraries. If you modify this file, you may extend this + * exception to your version of the file, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your version. + */ + package mircoders.servlet; -import freemarker.template.SimpleHash; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +import javax.servlet.ServletContext; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import mir.config.MirPropertiesConfiguration; import mir.entity.Entity; import mir.entity.EntityList; +import mir.log.LoggerWrapper; import mir.media.MediaHelper; import mir.media.MirMedia; -import mir.media.MirMediaException; -import mir.media.MirMediaUserException; -import mir.misc.FileUtil; -import mir.misc.MpRequest; -import mir.misc.StringUtil; -import mir.misc.WebdbMultipartRequest; -import mir.module.ModuleException; import mir.servlet.ServletModule; -import mir.servlet.ServletModuleException; -import mir.servlet.ServletModuleUserException; -import mir.storage.Database; -import mir.storage.StorageObjectException; +import mir.servlet.ServletModuleExc; +import mir.servlet.ServletModuleFailure; +import mir.servlet.ServletModuleUserExc; +import mir.session.UploadedFile; +import mir.util.ExceptionFunctions; +import mir.util.HTTPParsedRequest; +import mircoders.entity.EntityComment; +import mircoders.entity.EntityContent; +import mircoders.entity.EntityUploadedMedia; import mircoders.entity.EntityUsers; -import mircoders.storage.DatabaseMediaType; +import mircoders.media.MediaUploadProcessor; +import mircoders.module.*; +import mircoders.storage.DatabaseComment; +import mircoders.storage.DatabaseContent; import mircoders.storage.DatabaseMediafolder; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.io.IOException; -import java.net.URLEncoder; -import java.util.GregorianCalendar; -import java.util.HashMap; +import org.apache.commons.fileupload.FileItem; + +import freemarker.template.SimpleHash; +import freemarker.template.SimpleList; /* * ServletModuleBilder - * liefert HTML fuer Bilder * - * - * @author RK + * @version $Id: ServletModuleUploadedMedia.java,v 1.28 2003/04/29 02:36:51 zapata Exp $ + * @author RK, the mir-coders group */ public abstract class ServletModuleUploadedMedia @@ -46,185 +89,133 @@ public abstract class ServletModuleUploadedMedia return null; } + public ServletModuleUploadedMedia() { + super(); + logger = new LoggerWrapper("ServletModule.UploadedMedia"); + } + public void insert(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException, ServletModuleUserException { + throws ServletModuleExc, ServletModuleUserExc { try { - WebdbMultipartRequest mp = new WebdbMultipartRequest(req); - HashMap parameters = mp.getParameters(); + HTTPParsedRequest parsedRequest = new HTTPParsedRequest(req, + configuration.getString("Mir.DefaultEncoding"), + configuration.getInt("MaxMediaUploadSize")*1024, + configuration.getString("TempDir")); + EntityUsers user = _getUser(req); - String mediaId = null; - MpRequest mpReq = (MpRequest) mp.requestList.get(0); - String mediaTypeId; //= null; - MirMedia mediaHandler; - Database mediaStorage; - - // get the content-type from what the client browser - // sends us. (the "Oreilly method") - String contentType = mpReq.getContentType(); - String fileName = mpReq.getFilename(); - theLog.printInfo("CONTENT-TYPE FROM BROWSER: " + contentType); - - // if the client browser sent us unknown (text/plain is default) - // or if we got application/octet-stream, it's possible that - // the browser is in error, better check against the file extension - if (contentType.equals("text/plain") || - contentType.equals("application/octet-stream")) { - /** - * This is just a temporary way to get the content-type via - * the .extension , we could maybe use a magic method, by looking - * at the header (first few bytes) of the file. (like the file(1) - * command). - * The Oreilly method relies on the content-type that the client - * browser sends and that sometimes is application-octet stream with - * broken/mis-configured browsers. - * - * The map file should be Mir/content-types.properties, it's the - * default Sun Java file with some additional entries that it did - * not have. So if you support a new media type you have to make - * sure that it is in this file -mh - */ - contentType = FileUtil.guessContentTypeFromName(fileName); - if (contentType == null) - contentType = "text/plain"; // rfc1867 says this is the default - } - theLog.printInfo("CONTENT TYPE IS: " + contentType); + Map mediaValues = new HashMap(); - if (contentType.equals("text/plain") || - contentType.equals("application/octet-stream")) { - throw new ServletModuleUserException( - "One or more files of unrecognized types"); - } + mediaValues.put("to_publisher", _getUser(req).getId()); - parameters.put("date", StringUtil.date2webdbDate(new GregorianCalendar())); - parameters.put("to_publisher", user.getId()); - - //the where clause to find the media_type entry from the content-type. - //we use the media type entry to lookup the media Handler/Storage classes - // @todo this should probably be moved to DatabaseMediaType or - // somewhere else appropriate -mh - String[] contentTypeSplit = StringUtil.split(contentType, "/"); - String wc = " mime_type LIKE '" + contentTypeSplit[0] + "%'"; - DatabaseMediaType mediaTypeStor = DatabaseMediaType.getInstance(); - EntityList mediaTypesList = mediaTypeStor.selectByWhereClause(wc); - - // if we didn't find an entry matching the - // content-type in the table. - if (mediaTypesList.size() == 0) { - theLog.printDebugInfo("Wrong file type uploaded!: " + fileName); - throw new MirMediaUserException("One or more files of unrecognized type"); - } - Entity mediaType = null; - - // find out if we an exact content-type match if so take it. - // otherwise just use the first one. - // @todo this should probably be moved to DatabaseMediaType -mh - for (int j = 0; j < mediaTypesList.size(); j++) { - theLog.printDebugInfo("mediaTypesList: "+mediaTypesList.size()); - if (contentType.equals( - mediaTypesList.elementAt(j).getValue("mime_type"))) - mediaType = mediaTypesList.elementAt(j); + Iterator i = mainModule.getStorageObject().getFields().iterator(); + while (i.hasNext()) { + String field = (String) i.next(); + String value = parsedRequest.getParameter(field); + if (value!=null) + mediaValues.put(field, value); } - // if no exact match, whatever foo/* might match - if (mediaType == null) - mediaType = mediaTypesList.elementAt(0); + List mediaList = new Vector(); - // get the class names from the media_type table. - mediaTypeId = mediaType.getId(); - try { - // ############### @todo: merge these and the getURL call into one - // getURL helper call that just takes the Entity as a parameter - // along with media_type - mediaHandler = MediaHelper.getHandler(mediaType); - mediaStorage = MediaHelper.getStorage(mediaType, - "mircoders.storage.Database"); - } - catch (Exception e) { - theLog.printError("getting media handler failed: " + e.toString()); - throw new MirMediaException("getting media handler failed: " - + e.toString()); - } + i = parsedRequest.getFiles().iterator(); + while (i.hasNext()) { + UploadedFile file = new mir.session.CommonsUploadedFileAdapter((FileItem) i.next()); - parameters.put("to_media_type", mediaTypeId); - //load the classes via reflection - Entity mediaEnt = null; - try { - mediaEnt = (Entity) mediaStorage.getEntityClass().newInstance(); - mediaEnt.setStorage(mediaStorage); - mediaEnt.setValues(parameters); - // unfortunatly we have to insert it first because of the way - // Image setting works right now. that should change soon. -mh - mediaId = mediaEnt.insert(); - //save and store the media data/metadata - mediaHandler.set(mpReq.getMedia(), mediaEnt, mediaType); - - //were done with mpReq at this point, dereference it. - //as it contains mucho mem. -mh 01.10.2001 - mpReq = null; - - //we got this far, associate the media to the article - mediaEnt.setValueForProperty("is_published", "1"); - mediaEnt.update(); + String suffix = file.getFieldName().substring(5); + mediaValues.put("title", parsedRequest.getParameter("media_title" + suffix)); + + mediaList.add(MediaUploadProcessor.processMediaUpload(file, mediaValues)); } - catch (Exception e) { - try { - mediaStorage.delete(mediaId); + + String articleid = parsedRequest.getParameter("articleid"); + String commentid = parsedRequest.getParameter("commentid"); + + if (articleid!=null) { + EntityContent entContent = (EntityContent) DatabaseContent.getInstance().selectById(articleid); + + i=mediaList.iterator(); + + while (i.hasNext()) { + entContent.attach(((EntityUploadedMedia) i.next()).getId()); } - catch (Exception e2) { - // dont't do anything here as the error was setting the media, - // this just means that the entity may not have been inserted yet + + ((ServletModuleContent) ServletModuleContent.getInstance())._showObject(articleid, req, res); + + return; + } + + if (commentid!=null) { + EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(commentid); + + i=mediaList.iterator(); + + while (i.hasNext()) { + comment.attach( ( (EntityUploadedMedia) i.next()).getId()); } - theLog.printError("setting media failed: " + e.toString()); - throw new MirMediaException("setting media failed: " + e.toString()); + + ((ServletModuleComment) ServletModuleComment.getInstance()).showComment(commentid, req, res); + + return; } - _edit(mediaId, req, res); - } - catch (MirMediaException e) { - throw new ServletModuleException( - "upload -- media handling exception " + e.toString()); - } - catch (MirMediaUserException e) { - throw new ServletModuleUserException( - e.getMsg()); - } - catch (IOException e) { - throw new ServletModuleException("upload -- ioexception " + e.toString()); - } - catch (StorageObjectException e) { - throw new ServletModuleException("StorageObjectException" + e.toString()); + SimpleHash mergeData = new SimpleHash(); + SimpleHash popups = new SimpleHash(); + mergeData.put("contentlist", mir.generator.FreemarkerGenerator.makeAdapter(mediaList)); + + mergeData.put("count", Integer.toString(mediaList.size())); + mergeData.put("from", "1"); + mergeData.put("to", Integer.toString(mediaList.size())); + + //fetch the popups + popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData()); + // raus damit + deliver(req, res, mergeData, popups, templateListString); } + catch (Throwable t) { + Throwable cause = ExceptionFunctions.traceCauseException(t); + if (cause instanceof ModuleMediaType.UnsupportedMimeTypeExc) { + throw new ServletModuleUserExc("media.error.unsupportedformat", new String[] {}); + } + throw new ServletModuleFailure("ServletModuleUploadedMedia.insert: " + t.toString(), t); + } } - public void update(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException { + public void update(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc { try { - WebdbMultipartRequest mp = new WebdbMultipartRequest(req); - HashMap parameters = mp.getParameters(); - + HTTPParsedRequest parsedRequest = new HTTPParsedRequest(req, + configuration.getString("Mir.DefaultEncoding"), + configuration.getInt("MaxMediaUploadSize")*1024, + configuration.getString("TempDir")); EntityUsers user = _getUser(req); - parameters.put("to_publisher", user.getId()); - parameters.put("is_produced", "0"); - if (!parameters.containsKey("is_published")) - parameters.put("is_published", "0"); + Map mediaValues = new HashMap(); + + Iterator i = mainModule.getStorageObject().getFields().iterator(); + while (i.hasNext()) { + String field = (String) i.next(); + String value = parsedRequest.getParameter(field); + if (value!=null) + mediaValues.put(field, value); + } + + mediaValues.put("to_publisher", user.getId()); + mediaValues.put("is_produced", "0"); + if (!mediaValues.containsKey("is_published")) + mediaValues.put("is_published", "0"); - String id = mainModule.set(parameters); - theLog.printError("media ID" + id); + String id = mainModule.set(mediaValues); + logger.debug("update: media ID = " + id); _edit(id, req, res); } - catch (IOException e) { - throw new ServletModuleException("upload -- ioexception " + e.toString()); - } - catch (ModuleException e) { - throw new ServletModuleException("upload -- moduleexception " + e.toString()); + catch (Throwable e) { + throw new ServletModuleFailure("upload -- exception " + e.toString(), e); } } - public void list(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException { + public void list(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc { // Parameter auswerten SimpleHash mergeData = new SimpleHash(); SimpleHash popups = new SimpleHash(); @@ -243,11 +234,11 @@ public abstract class ServletModuleUploadedMedia mergeData.put("offset", offset); String order = req.getParameter("order"); - if (order == null) order = "webdb_lastchange desc"; + if (order == null || order.equals("")) order = "webdb_lastchange desc"; // if in connection mode to content - String cid = req.getParameter("cid"); - mergeData.put("cid", cid); + mergeData.put("articleid", req.getParameter("articleid")); + mergeData.put("commentid", req.getParameter("commentid")); // sql basteln @@ -268,7 +259,7 @@ public abstract class ServletModuleUploadedMedia } //theLog.printDebugInfo("sql-whereclause: " + whereClause + " order: " + order + " offset: " + offset); - // fetch und ausliefern + // fetch and deliver try { if (query_text != null || query_is_published != null || query_media_folder != null) { EntityList theList = mainModule.getByWhereClause(whereClause, order, (new Integer(offset)).intValue(), 10); @@ -287,42 +278,57 @@ public abstract class ServletModuleUploadedMedia mergeData.put("prev", (new Integer(theList.getPrevBatch())).toString()); } } - //fetch the popups popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData()); - // raus damit + deliver(req, res, mergeData, popups, templateListString); } - catch (ModuleException e) { - throw new ServletModuleException(e.toString()); - } - catch (Exception e) { - throw new ServletModuleException(e.toString()); + catch (Throwable e) { + throw new ServletModuleFailure(e); } } - public void add(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException { + public void add(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc { try { SimpleHash mergeData = new SimpleHash(); - mergeData.put("new", "1"); SimpleHash popups = new SimpleHash(); + String maxMedia = MirPropertiesConfiguration.instance().getString("ServletModule.OpenIndy.MaxMediaUploadItems"); + String numOfMedia = req.getParameter("medianum"); + + mergeData.put("new", "1"); + mergeData.put("articleid", req.getParameter("articleid")); + mergeData.put("commentid", req.getParameter("commentid")); + popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData()); + + if (numOfMedia==null || numOfMedia.equals("")) { + numOfMedia="1"; + } + else if(Integer.parseInt(numOfMedia) > Integer.parseInt(maxMedia)) { + numOfMedia = maxMedia; + } + + int mediaNum = Integer.parseInt(numOfMedia); + SimpleList mediaFields = new SimpleList(); + for(int i =0; i