From a0b490f47bc60e832dd3e096d4a6807447548c79 Mon Sep 17 00:00:00 2001 From: mh Date: Fri, 29 Mar 2002 14:04:36 +0000 Subject: [PATCH] beginning of media admin stuff. will be cleaned up next week --- source/mir/media/MirMediaUserException.java | 27 ++ source/mircoders/servlet/ServletModuleImages.java | 252 +--------------- .../servlet/ServletModuleUploadedMedia.java | 321 +++++++++++++++++++++ 3 files changed, 349 insertions(+), 251 deletions(-) create mode 100755 source/mir/media/MirMediaUserException.java create mode 100755 source/mircoders/servlet/ServletModuleUploadedMedia.java diff --git a/source/mir/media/MirMediaUserException.java b/source/mir/media/MirMediaUserException.java new file mode 100755 index 00000000..be59d93a --- /dev/null +++ b/source/mir/media/MirMediaUserException.java @@ -0,0 +1,27 @@ +package mir.media; + +import java.lang.*; + +/* + * MirMediaException - + * differentiates itself from a bug in that it + * represents a probable user error + * + * @version 29.1.2002 + * @author mh + * + */ + +public final class MirMediaUserException extends Exception { + String msg; + + public MirMediaUserException(String msg) { + super(msg); + this.msg = msg; + } + + public String getMsg() { + return msg; + } +} + diff --git a/source/mircoders/servlet/ServletModuleImages.java b/source/mircoders/servlet/ServletModuleImages.java index 870a262c..ef19a450 100755 --- a/source/mircoders/servlet/ServletModuleImages.java +++ b/source/mircoders/servlet/ServletModuleImages.java @@ -33,7 +33,7 @@ import mircoders.producer.*; * @author RK */ -public class ServletModuleImages extends mir.servlet.ServletModule +public class ServletModuleImages extends ServletModuleUploadedMedia { //private static DatabaseRights dbRights; @@ -57,115 +57,6 @@ public class ServletModuleImages extends mir.servlet.ServletModule } } - - public void insert(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException - { - try { - WebdbMultipartRequest mp = new WebdbMultipartRequest(req); - HashMap parameters = mp.getParameters(); - String mediaId=null; - MpRequest mpReq = (MpRequest)mp.requestList.get(0); - byte[] imageData=mpReq.getMedia(); - String fileName=mpReq.getFilename(); - String contentType= mpReq.getContentType(); - - EntityUsers user = _getUser(req); - parameters.put("date", StringUtil.date2webdbDate(new GregorianCalendar())); - parameters.put("to_publisher", user.getId()); - parameters.put("is_produced", "0"); - if (!parameters.containsKey("is_published")) - parameters.put("is_published","0"); - - String id = mainModule.add(parameters); - EntityImages entImage = (EntityImages)mainModule.getById(id); - - if (imageData!=null && fileName!=null) { - //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 - String wc = " mime_type='"+contentType+"'"; - - EntityList mediaTypesList = DatabaseMediaType.getInstance().selectByWhereClause(wc); - String mediaTypeId = null; - String mediaStorageName = null; - String mediaHandlerName = null; - - //if we found an entry matching the - //content-type int the table. - if (mediaTypesList.size() > 0) { - //get the class names from the media_type table. - mediaTypeId = mediaTypesList.elementAt(0).getId(); - mediaStorageName = mediaTypesList.elementAt(0).getValue("tablename"); - mediaHandlerName = mediaTypesList.elementAt(0).getValue("classname"); - parameters.put("to_media_type",mediaTypeId); - - //load the classes via reflection - String MediaId; - try { - Class mediaStorageClass = Class.forName("mircoders.storage.Database"+mediaStorageName); - Method m = mediaStorageClass.getMethod("getInstance", null); - Database mediaStorage = (Database)m.invoke(null, null); - Entity mediaEnt = (Entity)mediaStorage.getEntityClass().newInstance(); - mediaEnt.setStorage(mediaStorage); - mediaEnt.setValues(parameters); - mediaId = mediaEnt.insert(); - - Class mediaHandlerClass = Class.forName("mir.media.MediaHandler"+mediaHandlerName); - MirMedia mediaHandler = (MirMedia)mediaHandlerClass.newInstance(); - //save and store the media data/metadata - mediaHandler.set(mpReq.getMedia(), mediaEnt,mediaTypesList.elementAt(0)); - - //were done with mpReq at this point, dereference it. as it contains - //mucho mem. -mh 01.10.2001 - mpReq=null; - - if(mediaId!=null){ - new ProducerImages().handle(null, null, false, false, mediaId); - } - } catch (Exception e) { - theLog.printError("setting uploaded_media failed: "+e.toString()); - } //end try-catch - - - entImage.setImage(imageData); - } - _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 (StorageObjectException e) { throw new ServletModuleException("StorageObjectException" + e.toString());} - - } - - public void update(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException - { - - try { - WebdbMultipartRequest mp = new WebdbMultipartRequest(req); - HashMap parameters = mp.getParameters(); - //MpRequest mpReq = (MpRequest)mp.requestList.get(0); - //byte[] imageData=mpReq.getMedia(); - //String fileName=mpReq.getFilename(); - //String contentType=mpReq.getContentType(); - - 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"); - - String id = mainModule.set(parameters); - theLog.printError("Image 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());} - - } - - public void showimg(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException { @@ -211,147 +102,6 @@ public class ServletModuleImages extends mir.servlet.ServletModule else throw new ServletModuleException("id nicht angeben."); } - public void list(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException { - // Parameter auswerten - SimpleHash mergeData = new SimpleHash(); - String query_text = req.getParameter("query_text"); - mergeData.put("query_text",query_text); - if (query_text!=null) mergeData.put("query_text_encoded",URLEncoder.encode(query_text)); - String query_field = req.getParameter("query_field"); - mergeData.put("query_field",query_field); - String query_is_published = req.getParameter("query_is_published"); - mergeData.put("query_is_published",query_is_published); - String query_media_folder = req.getParameter("query_media_folder"); - mergeData.put("query_media_folder",query_media_folder); - String offset = req.getParameter("offset"); - if (offset==null || offset.equals("")) offset="0"; - mergeData.put("offset",offset); - - String order = req.getParameter("order"); - if (order==null) order="webdb_lastchange desc"; - - // if in connection mode to content - String cid = req.getParameter("cid"); - mergeData.put("cid",cid); - - - // sql basteln - String whereClause=""; boolean isFirst=true; - if (query_text!=null && !query_text.equalsIgnoreCase("")) { - whereClause += "lower("+query_field+") like lower('%"+query_text+"%')"; isFirst=false;} - if (query_is_published != null && !query_is_published.equals("")) { - if (isFirst==false) whereClause+=" and "; - whereClause += "is_published='"+query_is_published+"'"; - isFirst=false; - } - if (query_media_folder != null && !query_media_folder.equals("")) { - if (isFirst==false) whereClause+=" and "; - whereClause += "to_media_folder='"+query_media_folder+"'"; - } - //theLog.printDebugInfo("sql-whereclause: " + whereClause + " order: " + order + " offset: " + offset); - - // fetch und ausliefern - try { - if (query_text!=null || query_is_published!=null || query_media_folder!=null) { - EntityList theList = mainModule.getByWhereClause(whereClause, order, (new Integer(offset)).intValue(),10); - if (theList != null) { - mergeData.put("contentlist",theList); - if(theList.getOrder()!=null) { - mergeData.put("order", theList.getOrder()); - mergeData.put("order_encoded", URLEncoder.encode(theList.getOrder())); - } - mergeData.put("count", (new Integer(theList.getCount())).toString()); - mergeData.put("from", (new Integer(theList.getFrom())).toString()); - mergeData.put("to", (new Integer(theList.getTo())).toString()); - if (theList.hasNextBatch()) - mergeData.put("next", (new Integer(theList.getNextBatch())).toString()); - if (theList.hasPrevBatch()) - mergeData.put("prev", (new Integer(theList.getPrevBatch())).toString()); - } - } - // raus damit - HTMLTemplateProcessor.process(res, templateListString, mergeData, res.getWriter(), getLocale(req)); - } - catch (ModuleException e) {throw new ServletModuleException(e.toString());} - catch (IOException e) {throw new ServletModuleException(e.toString());} - catch (Exception e) {throw new ServletModuleException(e.toString());} - } - - - public void add(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException - { - try { - SimpleHash mergeData = new SimpleHash(); - mergeData.put("new", "1"); - SimpleHash popups = new SimpleHash(); - popups.put("mediafolderPopupData",DatabaseMediafolder.getInstance().getPopupData()); - deliver(req, res, mergeData, popups, templateObjektString); - } - catch (Exception e) { throw new ServletModuleException(e.toString());} - } - - public void edit(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException { - String idParam = req.getParameter("id"); - _edit(idParam, req, res); - } - - private void _edit(String idParam, HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException { - if (idParam!=null && !idParam.equals("")) { - try { - SimpleHash popups = new SimpleHash(); - popups.put("mediafolderPopupData",DatabaseMediafolder.getInstance().getPopupData()); - deliver(req, res, mainModule.getById(idParam),popups, - templateObjektString); - } catch (ModuleException e) { - throw new ServletModuleException(e.toString()); - } catch (StorageObjectException e) { - throw new ServletModuleException(e.toString()); - } - } else { - throw new ServletModuleException("ServletmoduleImage :: _edit without id"); - } - } - - - /** @todo should be in ServletModule.java */ - private EntityUsers _getUser(HttpServletRequest req) - { - HttpSession session=req.getSession(false); - return (EntityUsers)session.getAttribute("login.uid"); - } - - - // deprecated - public void upload(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException - { - //theLog.printDebugInfo("-- trying to upload"); - String idParam = req.getParameter("id"); - if (idParam!=null && !idParam.equals("")) { - try { - - WebdbMultipartRequest mp = new WebdbMultipartRequest(req); - HashMap withValues = mp.getParameters(); - MpRequest mpReq = (MpRequest)mp.requestList.get(0); - byte[] imageData=mpReq.getMedia(); - String fileName=mpReq.getFilename(); - String contentType=mpReq.getContentType(); - - EntityImages entImage = (EntityImages)mainModule.getById(idParam); - entImage.setImage(imageData); - } - catch (IOException e) { throw new ServletModuleException("upload -- ioexception " + e.toString());} - catch (ModuleException e) { throw new ServletModuleException("upload -- moduleexception " + e.toString());} - catch (StorageObjectException e) { throw new ServletModuleException("upload -- storageobjectexception " + e.toString());} - } - else // keine id - throw new ServletModuleException("Keine id angegeben"); - edit(req,res); - } - } diff --git a/source/mircoders/servlet/ServletModuleUploadedMedia.java b/source/mircoders/servlet/ServletModuleUploadedMedia.java new file mode 100755 index 00000000..d304d6eb --- /dev/null +++ b/source/mircoders/servlet/ServletModuleUploadedMedia.java @@ -0,0 +1,321 @@ +package mircoders.servlet; + +import java.io.*; +import java.lang.*; +import java.sql.*; +import java.util.*; +import java.net.*; +import java.lang.reflect.*; +import javax.servlet.*; +import javax.servlet.http.*; + +import freemarker.template.*; +import com.oreilly.servlet.multipart.*; +import com.oreilly.servlet.*; + +import mir.servlet.*; +import mir.module.*; +import mir.misc.*; +import mir.entity.*; +import mir.storage.*; +import mir.media.*; + +import mircoders.entity.*; +import mircoders.storage.*; +import mircoders.module.*; +import mircoders.producer.*; + +/* + * ServletModuleBilder - + * liefert HTML fuer Bilder + * + * + * @author RK + */ + +public abstract class ServletModuleUploadedMedia + extends mir.servlet.ServletModule +{ + + //private static DatabaseRights dbRights; + + public static ServletModule getInstance() { return null; } + + public void insert(HttpServletRequest req, HttpServletResponse res) + throws ServletModuleException, ServletModuleUserException + { + try { + WebdbMultipartRequest mp = new WebdbMultipartRequest(req); + HashMap parameters = mp.getParameters(); + 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); + + if (contentType.equals("text/plain") || + contentType.equals("application/octet-stream")) { + throw new ServletModuleUserException( + "One or more files of unrecognized types"); + } + + 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