X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fservlet%2FServletModuleOpenIndy.java;h=31b99bff38e6ce748bb62a7c68a477be230698f1;hb=9065f22c307993d6dd19be86aafcef915f52f36d;hp=abb7523e573d8f11f472540b80b8ec0374aa2eea;hpb=986ca960959af906d6b639d13ae50353b6c74dc5;p=mir.git diff --git a/source/mircoders/servlet/ServletModuleOpenIndy.java b/source/mircoders/servlet/ServletModuleOpenIndy.java index abb7523e..31b99bff 100755 --- a/source/mircoders/servlet/ServletModuleOpenIndy.java +++ b/source/mircoders/servlet/ServletModuleOpenIndy.java @@ -1,6 +1,7 @@ package mircoders.servlet; import java.io.*; +import java.lang.*; import java.sql.*; import java.util.*; import java.net.*; @@ -37,10 +38,10 @@ public class ServletModuleOpenIndy extends ServletModule { private String commentFormTemplate, commentFormDoneTemplate, commentFormDupeTemplate; - private String postingFormTemplate, postingFormDoneTemplate; + private String postingFormTemplate, postingFormDoneTemplate, postingFormDupeTemplate; private ModuleContent contentModule; private ModuleImages imageModule; - private ModuleTopics themenModule; + private ModuleTopics themenModule; private String directOp ="yes"; // Singelton / Kontruktor @@ -55,6 +56,7 @@ public class ServletModuleOpenIndy extends ServletModule commentFormDupeTemplate = MirConfig.getProp("ServletModule.OpenIndy.CommentDupeTemplate"); postingFormTemplate = MirConfig.getProp("ServletModule.OpenIndy.PostingTemplate"); postingFormDoneTemplate = MirConfig.getProp("ServletModule.OpenIndy.PostingDoneTemplate"); + postingFormDupeTemplate = MirConfig.getProp("ServletModule.OpenIndy.PostingDupeTemplate"); directOp = MirConfig.getProp("DirectOpenposting").toLowerCase(); mainModule = new ModuleComment(DatabaseComment.getInstance()); contentModule = new ModuleContent(DatabaseContent.getInstance()); @@ -98,30 +100,35 @@ public class ServletModuleOpenIndy extends ServletModule // ok, collecting data from form try { HashMap withValues = getIntersectingValues(req, DatabaseComment.getInstance()); + + //no html in comments(for now) + for (Iterator i=withValues.keySet().iterator(); i.hasNext(); ){ + String k=(String)i.next(); + String v=(String)withValues.get(k); + + withValues.put(k,StringUtil.removeHTMLTags(v)); + } withValues.put("is_published","1"); - // Dupe detection -// EntityList com = mainModule.getByWhereClause("description='"+req.getParameter("description")+"' AND to_media='"+aid+"' AND creator='"+req.getParameter("creator")+"'", 0); -// if (com.getCount() > 0) { -// theLog.printDebugInfo("Comment dupe dropped for article "+aid); -// deliver(req, res, (TemplateModelRoot) null, commentFormDupeTemplate); -// } else { - - // inserting into database - String id = mainModule.add(withValues); - - // producing new page - new ProducerContent().handle(null, null, true, false, aid); - - // sync the server - int exitValue = Helper.rsync(); - theLog.printDebugInfo("rsync:"+exitValue); - - // redirecting to url - // should implement back to article - SimpleHash mergeData = new SimpleHash(); - deliver(req, res, mergeData, commentFormDoneTemplate); -// } + // inserting into database + String id = mainModule.add(withValues); + theLog.printDebugInfo("id: "+id); + //insert was not successfull + if(id==null){ + deliver(req, res, new SimpleHash(), commentFormDupeTemplate); + } + + // producing new page + new ProducerContent().handle(null, null, true, false, aid); + + // sync the server + int exitValue = Helper.rsync(); + theLog.printDebugInfo("rsync:"+exitValue); + + // redirecting to url + // should implement back to article + SimpleHash mergeData = new SimpleHash(); + deliver(req, res, mergeData, commentFormDoneTemplate); } catch (StorageObjectException e) { throw new ServletModuleException(e.toString());} catch (ModuleException e) { throw new ServletModuleException(e.toString());} @@ -151,14 +158,15 @@ public class ServletModuleOpenIndy extends ServletModule } mergeData.put("medianum",numOfMedia); mergeData.put("mediafields",mediaFields); - mergeData.put("themenPopupData", themenModule.getTopicsAsSimpleList()); /** @todo popups missing */ try{ mergeData.put("languagePopUpData",DatabaseLanguage.getInstance().getPopupData()); + mergeData.put("themenPopupData", themenModule.getTopicsAsSimpleList()); } catch (Exception e) { - theLog.printError("languagePopUpData failed"); + theLog.printError("languagePopUpData or getTopicslist failed"); + throw new ServletModuleException("smod -- openindy -- getting language or topics failed: "+e.toString()); } deliver(req, res, mergeData, postingFormTemplate); } @@ -169,20 +177,44 @@ public class ServletModuleOpenIndy extends ServletModule */ public void insposting(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException + throws ServletModuleException, ServletModuleUserException { SimpleHash mergeData = new SimpleHash(); boolean setMedia=false; + boolean setTopic = false; try { WebdbMultipartRequest mp = new WebdbMultipartRequest(req); HashMap withValues = mp.getParameters(); + + if ((((String)withValues.get("title")).length() == 0) || + (((String)withValues.get("description")).length() == 0) || + (((String)withValues.get("content_data")).length() == 0)) + throw new ServletModuleUserException("Missing field"); + + // call the routines that escape html + + for (Iterator i=withValues.keySet().iterator(); i.hasNext(); ){ + String k=(String)i.next(); + String v=(String)withValues.get(k); + + if (k.equals("content_data")){ + //this doesn't quite work yet, so for now, all html goes + //withValues.put(k,StringUtil.approveHTMLTags(v)); + //withValues.put(k,StringUtil.removeHTMLTags(v)); + } else { + withValues.put(k,StringUtil.removeHTMLTags(v)); + } + + } + withValues.put("date", StringUtil.date2webdbDate(new GregorianCalendar())); withValues.put("publish_path", StringUtil.webdbDate2path((String)withValues.get("date"))); withValues.put("is_produced", "0"); - // op-articles are immediatly published - withValues.put("is_published","1"); + // op-articles are not immediatly published + // we don't know that all is good yet (media, title is present, etc..) + withValues.put("is_published","0"); // if op direct article-type == newswire if (directOp.equals("yes")) withValues.put("to_article_type","1"); @@ -193,14 +225,29 @@ public class ServletModuleOpenIndy extends ServletModule // inserting content into database String cid = contentModule.add(withValues); + theLog.printDebugInfo("id: "+cid); + //insert was not successfull + if(cid==null){ + //How do we know that it was not succesful cause of a + //dupe, what if it failed cause of "No space left on device"? + //Or is there something I am missing? Wouldn't it be better + //to have an explicit dupe check and then insert? I have no + //idea what I am talking about. this comment is in case + //I forget to explicitely ask. -mh + deliver(req, res, mergeData, postingFormDupeTemplate); + } - String[] to_topicsArr = mp.getParameterValues("to_topic"); - if (to_topicsArr != null && to_topicsArr.length > 0) { + String[] to_topicsArr = mp.getParameterValues("to_topic"); + + if (to_topicsArr != null && to_topicsArr.length > 0) { try{ DatabaseContentToTopics.getInstance().setTopics(cid,to_topicsArr); - theLog.printError("setting content_x_topic success"); + setTopic = true; + theLog.printError("setting content_x_topic success"); } catch (Exception e) { theLog.printError("setting content_x_topic failed"); + contentModule.deleteById(cid); + throw new ServletModuleException("smod - openindy :: insposting: setting content_x_topic failed: "+e.toString()); } //end try } //end if @@ -210,16 +257,47 @@ public class ServletModuleOpenIndy extends ServletModule for(Iterator it = mp.requestList.iterator(); it.hasNext();){ MpRequest mpReq = (MpRequest)it.next(); String fileName = mpReq.getFilename(); - String contentType = FileUtil.guessContentTypeFromName(fileName); + + //get the content-type from what the client browser + //sends us. (the "Oreilly method") + String contentType = mpReq.getContentType(); + + theLog.printError("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); + theLog.printError("tYPE: "+contentType); + if (contentType==null) + contentType = "text/plain"; // rfc1867 says this is the default + } HashMap mediaValues = new HashMap(); theLog.printError("CONTENT TYPE IS: "+contentType); - - if ((contentType==null) || (contentType=="application/octet-stream")) { - throw new ServletModuleException("ModuleException: One or more files of unrecognized types"); + + if (contentType.equals("text/plain") || + contentType.equals("application/octet-stream")) { + System.err.println("IN HERE"); + throw new ServletModuleUserException("One or more files of unrecognized types"); } - String mediaTitle=(String)withValues.get("media_title"+i); i++; @@ -231,58 +309,84 @@ public class ServletModuleOpenIndy extends ServletModule mediaValues.put("to_publisher", "1"); // op user mediaValues.put("to_media_folder", "7"); // op media_folder mediaValues.put("is_produced", "0"); - mediaValues.put("is_published","1"); + mediaValues.put("is_published","0"); + //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); + DatabaseMediaType mediaTypeStor = DatabaseMediaType.getInstance(); + EntityList mediaTypesList = mediaTypeStor.selectByWhereClause(wc); String mediaTypeId = null; - String mediaStorageName = null; - String mediaHandlerName = null; - + MirMedia mediaHandler; + Database mediaStorage; + + //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"); + 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(mediaTypesList.elementAt(0)); + mediaStorage = MediaHelper.getStorage(mediaTypesList.elementAt(0), + "mircoders.storage.Database"); + } catch (MirMediaException e) { + throw new ServletModuleException("getting media handler failed: " + +e.toString()); + } + mediaValues.put("to_media_type",mediaTypeId); - + + //load the classes via reflection String MediaId; + Entity mediaEnt = null; 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(mediaValues); - mediaId = mediaEnt.insert(); - - theLog.printError("done inserting!!! "); - Class mediaHandlerClass = Class.forName("mir.media.MediaHandler"+mediaHandlerName); - MirMedia mediaHandler = (MirMedia)mediaHandlerClass.newInstance(); - mediaHandler.set(mpReq.getMedia(), mediaEnt,mediaTypesList.elementAt(0)); - theLog.printError("about to run ProduceMedia"+mediaId); - if(mediaId!=null){ - new ProducerMedia().handle(null, null, false, false, mediaId); - } - } catch (Exception e) { - theLog.printError("setting uploaded_media failed: "+e.toString()); - } + mediaEnt = (Entity)mediaStorage.getEntityClass().newInstance(); + mediaEnt.setStorage(mediaStorage); + mediaEnt.setValues(mediaValues); + mediaId = mediaEnt.insert(); + + //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; - - try{ - DatabaseContentToMedia.getInstance().addMedia(cid,mediaId); - theLog.printError("setting content_x_media success"); + //we got this far, associate the media to the article + theLog.printError("ID"+mediaId); + mediaEnt.setValueForProperty("is_published","1"); + mediaEnt.update(); + new ProducerMedia().handle(null,null,false,false,mediaId); + DatabaseContentToMedia.getInstance().addMedia(cid,mediaId); } catch (Exception e) { - theLog.printError("setting content_x_media failed"); + theLog.printError("setting media failed: "+e.toString()); + contentModule.deleteById(cid); + throw new ServletModuleException("setting media failed: "+e.toString()); } } else { - theLog.printDebugInfo("Wrong file uploaded!: " + fileName); - throw new ServletModuleException("ModuleException: One or more files of unrecognized types"); - } + contentModule.deleteById(cid); + theLog.printDebugInfo("Wrong file type uploaded!: " + fileName); + throw new ServletModuleUserException("One or more files of unrecognized types"); + } // end if-else mediaTypesList.size() > 0 - } + } //end for Iterator... + + //if we're here all is ok... + EntityContent contentEnt = (EntityContent)contentModule.getById(cid); + contentEnt.setValueForProperty("is_published","1"); + contentEnt.update(); + + //dereference mp. -mh + mp=null; // producing openpostinglist new ProducerOpenPosting().handle(null,null,false,false); @@ -291,6 +395,10 @@ public class ServletModuleOpenIndy extends ServletModule //if direct op producing startpage if (directOp.equals("yes")) new ProducerStartPage().handle(null,null); + //produce the topicPages if set + //should be more intelligent + //if(setTopic==true) new ProducerTopics().handle(null,null); + // sync the server //should be configureable int exitValue = Helper.rsync(); @@ -306,3 +414,4 @@ public class ServletModuleOpenIndy extends ServletModule } +