X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fservlet%2FServletModuleOpenIndy.java;h=6896876a9e6e5850eb42dbea4e3e46eaca1d6293;hb=a0e0629d9b38c2eb4eba6d9420ccbc6d1b44ab00;hp=db23bc0a828fe3a1229666b10c4824c81d1ccfec;hpb=3d6d6279b8ad710d4ec72ddec1976894ef8099a4;p=mir.git diff --git a/source/mircoders/servlet/ServletModuleOpenIndy.java b/source/mircoders/servlet/ServletModuleOpenIndy.java index db23bc0a..6896876a 100755 --- a/source/mircoders/servlet/ServletModuleOpenIndy.java +++ b/source/mircoders/servlet/ServletModuleOpenIndy.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001, 2002 The Mir-coders group + * Copyright (C) 2001, 2002 The Mir-coders group * * This file is part of Mir. * @@ -18,51 +18,43 @@ * 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 the com.oreilly.servlet library, 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. + * 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 java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Date; -import java.util.Enumeration; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.ListIterator; +import java.util.Locale; import java.util.Map; import java.util.Random; import java.util.Set; import java.util.Vector; -import java.util.Locale; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpUtils; +import org.apache.commons.fileupload.FileItem; import org.apache.commons.net.smtp.SMTPClient; import org.apache.commons.net.smtp.SMTPReply; -import org.apache.fop.apps.Driver; -import org.apache.fop.apps.XSLTInputHandler; -import org.apache.log.Hierarchy; -import org.apache.log.Priority; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.queryParser.QueryParser; @@ -71,30 +63,39 @@ import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.Searcher; import org.apache.struts.util.MessageResources; +import gnu.regexp.RE; +import gnu.regexp.REMatch; + import mir.entity.Entity; -import mir.entity.EntityList; import mir.generator.Generator; import mir.log.LoggerWrapper; -import mir.misc.FileHandler; import mir.misc.StringUtil; -import mir.misc.WebdbMultipartRequest; import mir.servlet.ServletModule; import mir.servlet.ServletModuleExc; import mir.servlet.ServletModuleFailure; import mir.servlet.ServletModuleUserExc; +import mir.session.HTTPAdapters; +import mir.session.Request; +import mir.session.Session; +import mir.session.SessionHandler; +import mir.session.SimpleResponse; +import mir.session.UploadedFile; import mir.storage.StorageObjectFailure; import mir.util.ExceptionFunctions; +import mir.util.HTTPParsedRequest; import mir.util.HTTPRequestParser; import mir.util.StringRoutines; import mircoders.entity.EntityComment; import mircoders.entity.EntityContent; +import mircoders.global.CacheKey; import mircoders.global.MirGlobal; -import mircoders.media.MediaRequest; -import mircoders.media.UnsupportedMediaFormatExc; +import mircoders.media.MediaUploadProcessor; import mircoders.module.ModuleComment; import mircoders.module.ModuleContent; import mircoders.module.ModuleImages; +import mircoders.module.ModuleMediaType; import mircoders.module.ModuleTopics; +import mircoders.pdf.PDFGenerator; import mircoders.search.AudioSearchTerm; import mircoders.search.ContentSearchTerm; import mircoders.search.ImagesSearchTerm; @@ -118,7 +119,7 @@ import mircoders.storage.DatabaseTopics; * open-postings to the newswire * * @author mir-coders group - * @version $Id: ServletModuleOpenIndy.java,v 1.72 2003/04/10 03:31:47 zapata Exp $ + * @version $Id: ServletModuleOpenIndy.java,v 1.89.2.1 2003/05/17 16:21:14 john Exp $ * */ @@ -128,7 +129,7 @@ public class ServletModuleOpenIndy extends ServletModule private String commentFormTemplate, commentFormDoneTemplate, commentFormDupeTemplate; private String postingFormTemplate, postingFormDoneTemplate, postingFormDupeTemplate; private String searchResultsTemplate; - private String prepareMailTemplate,sentMailTemplate; + private String prepareMailTemplate,sentMailTemplate,emailAnArticleTemplate; private ModuleContent contentModule; private ModuleComment commentModule; private ModuleImages imageModule; @@ -146,14 +147,18 @@ public class ServletModuleOpenIndy extends ServletModule commentFormTemplate = configuration.getString("ServletModule.OpenIndy.CommentTemplate"); commentFormDoneTemplate = configuration.getString("ServletModule.OpenIndy.CommentDoneTemplate"); commentFormDupeTemplate = configuration.getString("ServletModule.OpenIndy.CommentDupeTemplate"); + postingFormTemplate = configuration.getString("ServletModule.OpenIndy.PostingTemplate"); postingFormDoneTemplate = configuration.getString("ServletModule.OpenIndy.PostingDoneTemplate"); postingFormDupeTemplate = configuration.getString("ServletModule.OpenIndy.PostingDupeTemplate"); + searchResultsTemplate = configuration.getString("ServletModule.OpenIndy.SearchResultsTemplate"); prepareMailTemplate = configuration.getString("ServletModule.OpenIndy.PrepareMailTemplate"); + emailAnArticleTemplate = configuration.getString("ServletModule.OpenIndy.MailableArticleTemplate"); sentMailTemplate = configuration.getString("ServletModule.OpenIndy.SentMailTemplate"); directOp = configuration.getString("DirectOpenposting").toLowerCase(); - mainModule = new ModuleComment(DatabaseComment.getInstance()); + commentModule = new ModuleComment(DatabaseComment.getInstance()); + mainModule = commentModule; contentModule = new ModuleContent(DatabaseContent.getInstance()); topicsModule = new ModuleTopics(DatabaseTopics.getInstance()); imageModule = new ModuleImages(DatabaseImages.getInstance()); @@ -178,13 +183,11 @@ public class ServletModuleOpenIndy extends ServletModule configuration.getString("ServletModule.OpenIndy.PostingDisabledTemplate")); } - /** * Method for making a comment */ - public void addcomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure - { + public void addcomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { if (MirGlobal.abuse().getOpenPostingDisabled()) { openPostingDisabled(req, res); @@ -192,11 +195,8 @@ public class ServletModuleOpenIndy extends ServletModule } String aid = req.getParameter("aid"); // the article id the comment will belong to -/* - String language = req.getParameter("language"); - */ - if (aid!=null && !aid.equals("")) { + if (aid != null && !aid.equals("")) { try { Map mergeData = new HashMap(); @@ -208,15 +208,8 @@ public class ServletModuleOpenIndy extends ServletModule mergeData.put("passwd", passwd); } else { - mergeData.put("passwd", (String) null); - } -/* - if (language != null) { - HttpSession session = req.getSession(false); - session.setAttribute("Locale", new Locale(language, "")); - session.setAttribute("language", language); + mergeData.put("passwd", (String)null); } -*/ mergeData.put("aid", aid); Map extraInfo = new HashMap(); @@ -228,7 +221,8 @@ public class ServletModuleOpenIndy extends ServletModule throw new ServletModuleFailure("ServletModuleOpenIndy.addcomment: " + t.getMessage(), t); } } - else throw new ServletModuleExc("aid not set!"); + else + throw new ServletModuleExc("aid not set!"); } /** @@ -236,9 +230,7 @@ public class ServletModuleOpenIndy extends ServletModule * the commentDone Page */ - public void inscomment(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure - { + public void inscomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { if (MirGlobal.abuse().getOpenPostingDisabled()) { openPostingDisabled(req, res); @@ -246,66 +238,68 @@ public class ServletModuleOpenIndy extends ServletModule } String aid = req.getParameter("to_media"); // the article id the comment will belong to - if (aid!=null && !aid.equals("")) - { - // ok, collecting data from form - try { - Map withValues = getIntersectingValues(req, DatabaseComment.getInstance()); + if (aid != null && !aid.equals("")) { + // ok, collecting data from form + try { + Map 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); + //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"); - withValues.put("to_comment_status","1"); + withValues.put(k, StringUtil.removeHTMLTags(v)); + } + withValues.put("is_published", "1"); + withValues.put("to_comment_status", "1"); + withValues.put("is_html", "0"); - //checking the onetimepasswd - HttpSession session = req.getSession(false); - String sessionPasswd = (String) session.getAttribute("passwd"); - if ( sessionPasswd != null){ - String passwd = req.getParameter("passwd"); - if ( passwd == null || passwd.length()==0) { - throw new ServletModuleUserExc("comment.error.missingpassword", new String[] {}); - } - if (!sessionPasswd.equals(passwd)) { - throw new ServletModuleUserExc("comment.error.invalidpassword", new String[] {}); - } - session.invalidate(); + //checking the onetimepasswd + HttpSession session = req.getSession(false); + String sessionPasswd = (String) session.getAttribute("passwd"); + if (sessionPasswd != null) { + String passwd = req.getParameter("passwd"); + if (passwd == null || passwd.length() == 0) { + throw new ServletModuleUserExc("comment.error.missingpassword", new String[] {}); } - - String id = mainModule.add(withValues); - - if(id==null){ - deliver(req, res, (Map) null, null, commentFormDupeTemplate); + if (!sessionPasswd.equals(passwd)) { + throw new ServletModuleUserExc("comment.error.invalidpassword", new String[] {}); } - else { - MirGlobal.abuse().logComment(req.getRemoteAddr(), id, new Date(), (String) req.getHeader("User-Agent")); + session.invalidate(); + } - DatabaseContent.getInstance().setUnproduced("id="+aid); + String id = mainModule.add(withValues); - try { - EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(id); - MirGlobal.abuse().checkComment(comment, req, res); - MirGlobal.localizer().openPostings().afterCommentPosting(comment); - } - catch (Throwable t) { - throw new ServletModuleExc(t.getMessage()); - } - } + SimpleResponse response = new SimpleResponse(); + response.setResponseGenerator(commentFormDoneTemplate); - // redirecting to url - // should implement back to article - Map mergeData = new HashMap(); - deliver(req, res, mergeData, null, commentFormDoneTemplate); + if (id == null) { + deliver(req, res, (Map)null, null, commentFormDupeTemplate); } - catch (Throwable e) { - throw new ServletModuleFailure(e); + else { + DatabaseContent.getInstance().setUnproduced("id=" + aid); + + try { + EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(id); + MirGlobal.localizer().openPostings().afterCommentPosting(comment); + MirGlobal.abuse().checkComment( + comment, new HTTPAdapters.HTTPRequestAdapter(req), res); + } + catch (Throwable t) { + throw new ServletModuleExc(t.getMessage()); + } } + + // redirecting to url + // should implement back to article + deliver(req, res, response.getResponseValues(), null, response.getResponseGenerator()); } - else throw new ServletModuleExc("aid not set!"); + catch (Throwable e) { + throw new ServletModuleFailure(e); + } + } + else + throw new ServletModuleExc("aid not set!"); } @@ -327,7 +321,7 @@ public class ServletModuleOpenIndy extends ServletModule // onetimepasswd if (MirGlobal.abuse().getOpenPostingPassword()) { - String passwd = this.createOneTimePasswd(); + String passwd = generateOnetimePassword(); HttpSession session = req.getSession(false); session.setAttribute("passwd", passwd); mergeData.put("passwd", passwd); @@ -374,43 +368,29 @@ public class ServletModuleOpenIndy extends ServletModule * the postingDone Page */ - public void insposting(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure - { + public void insposting(HttpServletRequest aRequest, HttpServletResponse aResponse) throws + ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { if (MirGlobal.abuse().getOpenPostingDisabled()) { - openPostingDisabled(req, res); + openPostingDisabled(aRequest, aResponse); return; } - Map mergeData = new HashMap(); - boolean setMedia=false; - boolean setTopic = false; - try { + HTTPParsedRequest parsedRequest = new HTTPParsedRequest( + aRequest, + configuration.getString("Mir.DefaultEncoding"), + configuration.getInt("MaxMediaUploadSize")*1024, + configuration.getString("TempDir")); - WebdbMultipartRequest mp = null; - EntityList mediaList = null; - try { - // new MediaRequest, "1" is the id for the openPosting user - MediaRequest mediaReq = new MediaRequest("1", true); - mp = new WebdbMultipartRequest(req, (FileHandler)mediaReq); - mediaList = mediaReq.getEntityList(); - } - catch (Throwable e) { - throw new ServletModuleFailure(e); - } - - Map withValues = mp.getParameters(); + Map mergeData = new HashMap(); - //checking the onetimepasswd - HttpSession session = req.getSession(false); + HttpSession session = aRequest.getSession(false); String sessionPasswd = (String) session.getAttribute("passwd"); - if (sessionPasswd != null){ - String passwd = (String) withValues.get("passwd"); - - logger.debug("session password = " + sessionPasswd + ", form password = " + passwd); + if (sessionPasswd != null) { + String passwd = (String) parsedRequest.getParameter("passwd"); - if ( passwd == null || passwd.length()==0) { + if (passwd == null || passwd.length() == 0) { throw new ServletModuleUserExc("posting.error.missingpassword", new String[] {}); } if (!sessionPasswd.equals(passwd)) { @@ -419,99 +399,173 @@ public class ServletModuleOpenIndy extends ServletModule session.invalidate(); } - if ((((String)withValues.get("title")).length() == 0) || - (((String)withValues.get("description")).length() == 0) || - (((String)withValues.get("content_data")).length() == 0)) + if ((((String) parsedRequest.getParameter("title")).length() == 0) || + (((String) parsedRequest.getParameter("description")).length() == 0) || + (((String) parsedRequest.getParameter("content_data")).length() == 0)) throw new ServletModuleUserExc("posting.error.missingfield", new String[] {}); - // call the routines that escape html + List mediaList = new Vector(); + Iterator i = parsedRequest.getFiles().iterator(); - for (Iterator i=withValues.keySet().iterator(); i.hasNext(); ){ - String k=(String)i.next(); - String v=(String)withValues.get(k); + while (i.hasNext()) { + UploadedFile file = new mir.session.CommonsUploadedFileAdapter((FileItem) i.next()); + Map mediaValues = new HashMap(); + + String suffix = file.getFieldName().substring(5); // media${m} + logger.debug("media_title" + suffix); + String title = parsedRequest.getParameter("media_title" + suffix); + + mediaValues.put("title", StringUtil.removeHTMLTags(title)); + mediaValues.put("creator", StringUtil.removeHTMLTags(parsedRequest.getParameter("creator"))); + mediaValues.put("to_publisher", "0"); + mediaValues.put("is_published", "1"); + mediaValues.put("to_media_folder", "7"); + + mediaList.add(MediaUploadProcessor.processMediaUpload(file, mediaValues)); + } + + Map withValues = new HashMap(); + i = DatabaseContent.getInstance().getFields().iterator(); + while (i.hasNext()) { + String field = (String) i.next(); + String value = parsedRequest.getParameter(field); + if (value!=null) + withValues.put(field, value); + } - if (k.equals("content_data")){ + + for (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.deleteForbiddenTags(v)); + withValues.put(k, StringUtil.deleteForbiddenTags(v)); } else if (k.equals("description")) { String tmp = StringUtil.deleteForbiddenTags(v); - withValues.put(k,StringUtil.deleteHTMLTableTags(tmp)); + withValues.put(k, StringUtil.deleteHTMLTableTags(tmp)); } else { - withValues.put(k,StringUtil.removeHTMLTags(v)); + 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("publish_path", + StringUtil.webdbDate2path( (String) withValues.get("date"))); withValues.put("is_produced", "0"); - withValues.put("is_published","1"); + withValues.put("is_published", "1"); if (directOp.equals("yes")) - withValues.put("to_article_type","1"); + withValues.put("to_article_type", "1"); - withValues.put("to_publisher","1"); + withValues.put("to_publisher", "1"); // inserting content into database String cid = contentModule.add(withValues); - logger.debug("id: "+cid); + logger.debug("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, null, postingFormDupeTemplate); + if (cid == null) { + deliver(aRequest, aResponse, mergeData, null, postingFormDupeTemplate); return; } - MirGlobal.abuse().logArticle(req.getRemoteAddr(), cid, new Date(), (String) req.getHeader("User-Agent")); - - String[] to_topicsArr = mp.getParameterValues("to_topic"); - - if (to_topicsArr != null && to_topicsArr.length > 0) { - try{ - DatabaseContentToTopics.getInstance().setTopics(cid,to_topicsArr); - setTopic = true; + List topics = parsedRequest.getParameterList("to_topic"); + if (topics.size() > 0) { + try { + DatabaseContentToTopics.getInstance().setTopics(cid, topics); } catch (Throwable e) { logger.error("setting content_x_topic failed"); contentModule.deleteById(cid); - throw new ServletModuleFailure("smod - openindy :: insposting: setting content_x_topic failed: "+e.toString(), e); - } //end try - } //end if - - //if we're here all is ok... associate the media to the article - for(int i=0;i= totalHits) - newPosition=totalHits-1; - session.setAttribute("positionInResults",new Integer(newPosition)); + newPosition = totalHits - 1; + session.setAttribute("positionInResults", new Integer(newPosition)); } else { - if (searchForwardValue != null){ - int totalHits = ((Integer) session.getAttribute("numberOfHits")).intValue(); - int newPosition=((Integer)session.getAttribute("positionInResults")).intValue()+increment; - if (newPosition<0) - newPosition=0; + if (searchForwardValue != null) { + int totalHits = ( (Integer) session.getAttribute("numberOfHits")).intValue(); + int newPosition = ( (Integer) session.getAttribute("positionInResults")).intValue() + increment; + if (newPosition < 0) + newPosition = 0; if (newPosition >= totalHits) - newPosition=totalHits-1; + newPosition = totalHits - 1; - session.setAttribute("positionInResults",new Integer(newPosition)); + session.setAttribute("positionInResults", new Integer(newPosition)); } else { - String indexPath=configuration.getString("IndexPath"); - + String indexPath = configuration.getString("IndexPath"); String creatorFragment = creatorTerm.makeTerm(req); - if (creatorFragment != null){ + if (creatorFragment != null) { queryString = queryString + " +" + creatorFragment; } // search title, description, and content for something // the contentTerm uses param "search_boolean" to combine its terms String contentFragment = contentTerm.makeTerm(req); - if (contentFragment != null){ + if (contentFragment != null) { logger.debug("contentFragment: " + contentFragment); queryString = queryString + " +" + contentFragment; } String topicFragment = topicTerm.makeTerm(req); - if (topicFragment != null){ + if (topicFragment != null) { queryString = queryString + " +" + topicFragment; } String imagesFragment = imagesTerm.makeTerm(req); - if (imagesFragment != null){ + if (imagesFragment != null) { queryString = queryString + " +" + imagesFragment; } String audioFragment = audioTerm.makeTerm(req); - if (audioFragment != null){ + if (audioFragment != null) { queryString = queryString + " +" + audioFragment; } String videoFragment = videoTerm.makeTerm(req); - if (videoFragment != null){ + if (videoFragment != null) { queryString = queryString + " +" + videoFragment; } - if (queryString == null || queryString == ""){ + if (queryString == null || queryString == "") { queryString = ""; } - else{ - try{ + else { + try { Searcher searcher = null; try { searcher = new IndexSearcher(indexPath); } - catch(IOException e) { + catch (IOException e) { logger.debug("Can't open indexPath: " + indexPath); - throw new ServletModuleExc("Problem with Search Index! : "+ e.toString()); + throw new ServletModuleExc("Problem with Search Index! : " + e.toString()); } Query query = null; try { query = QueryParser.parse(queryString, "content", new StandardAnalyzer()); } - catch(Exception e) { + catch (Exception e) { searcher.close(); logger.debug("Query don't parse: " + queryString); - throw new ServletModuleExc("Problem with Query String! (was '"+queryString+"')"); + throw new ServletModuleExc("Problem with Query String! (was '" + queryString + "')"); } Hits hits = null; try { hits = searcher.search(query); } - catch(IOException e) { + catch (IOException e) { searcher.close(); logger.debug("Can't get hits: " + e.toString()); throw new ServletModuleExc("Problem getting hits!"); @@ -794,74 +844,73 @@ public class ServletModuleOpenIndy extends ServletModule int start = 0; int end = hits.length(); - String sortBy=req.getParameter("search_sort"); - if (sortBy == null || sortBy.equals("")){ + String sortBy = req.getParameter("search_sort"); + if (sortBy == null || sortBy.equals("")) { throw new ServletModuleExc("Please let me sort by something!(missing search_sort)"); } // here is where the documents will go for storage across sessions ArrayList theDocumentsSorted = new ArrayList(); - if (sortBy.equals("score")){ - for(int i = start; i < end; i++) { + if (sortBy.equals("score")) { + for (int i = start; i < end; i++) { theDocumentsSorted.add(hits.doc(i)); } } - else{ + else { // then we'll sort by date! - Map dateToPosition = new HashMap(end,1.0F); //we know how big it will be - for(int i = start; i < end; i++) { - String creationDate=(hits.doc(i)).get("creationDate"); + Map dateToPosition = new HashMap(end, 1.0F); //we know how big it will be + for (int i = start; i < end; i++) { + String creationDate = (hits.doc(i)).get("creationDate"); // do a little dance in case two contents created at the same second! - if (dateToPosition.containsKey(creationDate)){ - ((ArrayList) (dateToPosition.get(creationDate))).add(new Integer(i)); + if (dateToPosition.containsKey(creationDate)) { + ( (ArrayList) (dateToPosition.get(creationDate))).add(new Integer(i)); } - else{ + else { ArrayList thePositions = new ArrayList(); thePositions.add(new Integer(i)); - dateToPosition.put(creationDate,thePositions); + dateToPosition.put(creationDate, thePositions); } } Set keys = dateToPosition.keySet(); - ArrayList keyList= new ArrayList(keys); + ArrayList keyList = new ArrayList(keys); Collections.sort(keyList); - if (sortBy.equals("date_desc")){ + if (sortBy.equals("date_desc")) { Collections.reverse(keyList); } - else{ - if (!sortBy.equals("date_asc")){ - throw new ServletModuleExc("don't know how to sort by: "+ sortBy); + else { + if (!sortBy.equals("date_asc")) { + throw new ServletModuleExc("don't know how to sort by: " + sortBy); } } ListIterator keyTraverser = keyList.listIterator(); - while (keyTraverser.hasNext()){ - ArrayList positions = (ArrayList)dateToPosition.get((keyTraverser.next())); - ListIterator positionsTraverser=positions.listIterator(); - while (positionsTraverser.hasNext()){ - theDocumentsSorted.add(hits.doc(((Integer)(positionsTraverser.next())).intValue())); + while (keyTraverser.hasNext()) { + ArrayList positions = (ArrayList) dateToPosition.get( (keyTraverser.next())); + ListIterator positionsTraverser = positions.listIterator(); + while (positionsTraverser.hasNext()) { + theDocumentsSorted.add(hits.doc( ( (Integer) (positionsTraverser.next())).intValue())); } } } - try{ + try { searcher.close(); } - catch (IOException e){ + catch (IOException e) { logger.debug("Can't close searcher: " + e.toString()); throw new ServletModuleFailure("Problem closing searcher(normal):" + e.getMessage(), e); } - session.removeAttribute("numberOfHits"); session.removeAttribute("theDocumentsSorted"); session.removeAttribute("positionInResults"); - session.setAttribute("numberOfHits",new Integer(end)); - session.setAttribute("theDocumentsSorted",theDocumentsSorted); - session.setAttribute("positionInResults",new Integer(0)); + session.setAttribute("numberOfHits", new Integer(end)); + session.setAttribute("theDocumentsSorted", theDocumentsSorted); + session.setAttribute("positionInResults", new Integer(0)); } - catch (IOException e){ + catch (IOException e) { logger.debug("Can't close searcher: " + e.toString()); throw new ServletModuleFailure("Problem closing searcher: " + e.getMessage(), e); } @@ -870,48 +919,48 @@ public class ServletModuleOpenIndy extends ServletModule } try { - ArrayList theDocs = (ArrayList)session.getAttribute("theDocumentsSorted"); - if (theDocs != null){ + ArrayList theDocs = (ArrayList) session.getAttribute("theDocumentsSorted"); + if (theDocs != null) { - mergeData.put("numberOfHits", ((Integer)session.getAttribute("numberOfHits")).toString()); + mergeData.put("numberOfHits", ( (Integer) session.getAttribute("numberOfHits")).toString()); List theHits = new Vector(); - int pIR=((Integer)session.getAttribute("positionInResults")).intValue(); + int pIR = ( (Integer) session.getAttribute("positionInResults")).intValue(); int terminus; - int numHits=((Integer)session.getAttribute("numberOfHits")).intValue(); + int numHits = ( (Integer) session.getAttribute("numberOfHits")).intValue(); - if (!(pIR+increment>=numHits)){ - mergeData.put("hasNext","y"); + if (! (pIR + increment >= numHits)) { + mergeData.put("hasNext", "y"); } else { mergeData.put("hasNext", null); } - if (pIR>0){ - mergeData.put("hasPrevious","y"); + if (pIR > 0) { + mergeData.put("hasPrevious", "y"); } else { mergeData.put("hasPrevious", null); } - if ((pIR+increment)>numHits){ - terminus=numHits; + if ( (pIR + increment) > numHits) { + terminus = numHits; } else { - terminus=pIR+increment; + terminus = pIR + increment; } - for(int i = pIR; i < terminus; i++) { + for (int i = pIR; i < terminus; i++) { Map h = new HashMap(); - Document theHit = (Document)theDocs.get(i); - whereTerm.returnMeta(h,theHit); - creatorTerm.returnMeta(h,theHit); - titleTerm.returnMeta(h,theHit); - descriptionTerm.returnMeta(h,theHit); - dateTerm.returnMeta(h,theHit); - imagesTerm.returnMeta(h,theHit); - audioTerm.returnMeta(h,theHit); - videoTerm.returnMeta(h,theHit); + Document theHit = (Document) theDocs.get(i); + whereTerm.returnMeta(h, theHit); + creatorTerm.returnMeta(h, theHit); + titleTerm.returnMeta(h, theHit); + descriptionTerm.returnMeta(h, theHit); + dateTerm.returnMeta(h, theHit); + imagesTerm.returnMeta(h, theHit); + audioTerm.returnMeta(h, theHit); + videoTerm.returnMeta(h, theHit); theHits.add(h); } - mergeData.put("hits",theHits); + mergeData.put("hits", theHits); } } catch (Throwable e) { @@ -920,110 +969,116 @@ public class ServletModuleOpenIndy extends ServletModule throw new ServletModuleFailure("Problem getting hits: " + e.getMessage(), e); } - mergeData.put("queryString",queryString); + mergeData.put("queryString", queryString); deliver(req, res, mergeData, null, searchResultsTemplate); } - catch (NullPointerException n){ - throw new ServletModuleFailure("Null Pointer: "+n.toString(), n); + catch (NullPointerException n) { + throw new ServletModuleFailure("Null Pointer: " + n.toString(), n); } } /* - * Method for dynamically generating a pdf from a fo file + * Method for dynamically generating a pdf using iText */ + public void getpdf(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + long starttime=System.currentTimeMillis(); String ID_REQUEST_PARAM = "id"; - String language = req.getParameter("language"); - String generateFO=configuration.getString("GenerateFO"); - String generatePDF=configuration.getString("GeneratePDF"); - - - //don't do anything if we are not making FO files, or if we are - //pregenerating PDF's - if (generateFO.equals("yes") && generatePDF.equals("no")){ - //fop complains unless you do the logging this way - org.apache.log.Logger log = null; - Hierarchy hierarchy = Hierarchy.getDefaultHierarchy(); - log = hierarchy.getLoggerFor("fop"); - log.setPriority(Priority.WARN); - - String producerStorageRoot=configuration.getString("Producer.StorageRoot"); - String producerDocRoot=configuration.getString("Producer.DocRoot"); - // String templateDir=MirConfig.getPropWithHome("HTMLTemplateProcessor.Dir"); - String xslSheet=configuration.getString("Producer.HTML2FOStyleSheet"); - try { - String idParam = req.getParameter(ID_REQUEST_PARAM); - if (idParam != null) { - EntityContent contentEnt = - (EntityContent)contentModule.getById(idParam); - String publishPath = StringUtil.webdbDate2path(contentEnt.getValue("date")); - String foFile; - - if (language == null){ - foFile = producerStorageRoot + producerDocRoot + "/" - + publishPath + idParam + ".fo"; - } - else{ - foFile = producerStorageRoot + producerDocRoot + "/" - + language + publishPath + idParam + ".fo"; - } - logger.debug("USING FILES" + foFile + " and " + xslSheet); - XSLTInputHandler input = new XSLTInputHandler(new File(foFile), - new File(xslSheet)); - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - res.setContentType("application/pdf"); - - Driver driver = new Driver(); - driver.setLogger(log); - driver.setRenderer(Driver.RENDER_PDF); - driver.setOutputStream(out); - driver.render(input.getParser(), input.getInputSource()); - - byte[] content = out.toByteArray(); - res.setContentLength(content.length); - res.getOutputStream().write(content); - res.getOutputStream().flush(); - } - else { - throw new ServletModuleExc("Missing id."); - } + int maxArticlesInNewsleter = 15; // it is nice not to be dos'ed + try { + String idParam = req.getParameter(ID_REQUEST_PARAM); + if (idParam != null) { + + + RE re = new RE("[0-9]+"); + + + REMatch[] idMatches=re.getAllMatches(idParam); + + String cacheSelector=""; + + for (int i = 0; i < idMatches.length; i++){ + cacheSelector= cacheSelector + "," + idMatches[i].toString(); + } + + String cacheType="pdf"; + + CacheKey theCacheKey = new CacheKey(cacheType,cacheSelector); + + byte[] thePDF; + + if (MirGlobal.mruCache().hasObject(theCacheKey)){ + logger.info("fetching pdf from cache"); + thePDF = (byte[]) MirGlobal.mruCache().getObject(theCacheKey); + } + else { + logger.info("generating pdf and caching it"); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + PDFGenerator pdfMaker = new PDFGenerator(out); + + if (idMatches.length > 1){ + pdfMaker.addLine(); + for (int i = 0; i < idMatches.length && i < maxArticlesInNewsleter; i++){ + REMatch aMatch = idMatches[i]; + String id=aMatch.toString(); + EntityContent contentEnt = (EntityContent)contentModule.getById(id); + pdfMaker.addIndexItem(contentEnt); } - catch (Throwable t) { - logger.error(t.toString()); + } + + for (int i = 0; i < idMatches.length; i++){ + REMatch aMatch = idMatches[i]; + String id=aMatch.toString(); + EntityContent contentEnt = (EntityContent)contentModule.getById(id); + + pdfMaker.add(contentEnt); + } + + pdfMaker.stop(); + thePDF = out.toByteArray(); + + //and save all our hard work! + MirGlobal.mruCache().storeObject(theCacheKey,thePDF); + } + + res.setContentType("application/pdf"); + res.setContentLength(thePDF.length); + res.getOutputStream().write(thePDF); + res.getOutputStream().flush(); + String elapsedtime=(new Long(System.currentTimeMillis()-starttime)).toString(); + logger.info("pdf retireval took "+elapsedtime + " milliseconds" ); - throw new ServletModuleFailure(t); + } + else { + throw new ServletModuleExc("Missing id."); } } - else { - throw new ServletModuleExc("Can't generate a PDF because the config tells me not to."); + catch (Throwable t) { + logger.error(t.toString()); + throw new ServletModuleFailure(t); } + } - protected String createOneTimePasswd(){ + + public String generateOnetimePassword() { Random r = new Random(); int random = r.nextInt(); + long l = System.currentTimeMillis(); - l = (l*l*l*l)/random; - if(l<0) l = l * -1; - String returnString = ""+l; - return returnString.substring(5); - } + l = (l * l * l * l) / random; + if (l < 0) + l = l * -1; + String returnString = "" + l; - /* this is an overwritten method of ServletModule in order - to use different bundles for open and admin */ -/* public void deliver(HttpServletRequest req, HttpServletResponse res, - TemplateModelRoot rtm, TemplateModelRoot popups, - String templateFilename) throws ServletModuleFailure - { + return returnString.substring(5); } -*/ - public void deliver(HttpServletRequest aRequest, HttpServletResponse aResponse, Map aData, Map anExtra, String aGenerator) - throws ServletModuleFailure { + + public void deliver(HttpServletRequest aRequest, HttpServletResponse aResponse, Map aData, Map anExtra, String aGenerator) throws ServletModuleFailure { try { deliver(aResponse.getWriter(), aRequest, aResponse, aData, anExtra, aGenerator); } @@ -1035,13 +1090,13 @@ public class ServletModuleOpenIndy extends ServletModule public void deliver(PrintWriter anOutputWriter, HttpServletRequest aRequest, HttpServletResponse aResponse, Map aData, Map anExtra, String aGenerator) throws ServletModuleFailure { try { - Map responseData = ServletHelper.makeGenerationData(new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}, "bundles.open"); + Map responseData = ServletHelper.makeGenerationData(aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}, "bundles.open"); responseData.put("data", aData); responseData.put("extra", anExtra); Generator generator = MirGlobal.localizer().generators().makeOpenPostingGeneratorLibrary().makeGenerator(aGenerator); - generator.generate(anOutputWriter, responseData, logger.asPrintWriter(logger.INFO_MESSAGE)); + generator.generate(anOutputWriter, responseData, logger); anOutputWriter.close(); } @@ -1052,6 +1107,27 @@ public class ServletModuleOpenIndy extends ServletModule } } + public void deliver(PrintWriter anOutputWriter, HttpServletRequest aRequest, HttpServletResponse aResponse, Map aData, Map anExtra, String aGenerator,String aLocaleString) + throws ServletModuleFailure { + try { + Map responseData = ServletHelper.makeGenerationData(aResponse, new Locale[] { new Locale(aLocaleString,""), getFallbackLocale(aRequest)}, "bundles.open"); + responseData.put("data", aData); + responseData.put("extra", anExtra); + + + Generator generator = MirGlobal.localizer().generators().makeOpenPostingGeneratorLibrary().makeGenerator(aGenerator); + generator.generate(anOutputWriter, responseData, logger); + + anOutputWriter.close(); + } + catch (Throwable e) { + logger.error("Error while generating " + aGenerator + ": " + e.getMessage()); + + throw new ServletModuleFailure(e); + } + } + + public void handleError(HttpServletRequest aRequest, HttpServletResponse aResponse,PrintWriter out, Throwable anException) { try { logger.error("error: " + anException); @@ -1074,9 +1150,7 @@ public class ServletModuleOpenIndy extends ServletModule Map data = new HashMap(); MessageResources messages = MessageResources.getMessageResources("bundles.open"); - data.put("errorstring", - messages.getMessage(getLocale(aRequest), anException.getMessage(), anException.getParameters()) - ); + data.put("errorstring", messages.getMessage(getLocale(aRequest), anException.getMessage(), anException.getParameters())); data.put("date", StringUtil.date2readableDateTime(new GregorianCalendar())); deliver(out, aRequest, aResponse, data, null, configuration.getString("ServletModule.OpenIndy.UserErrorTemplate")); @@ -1085,4 +1159,8 @@ public class ServletModuleOpenIndy extends ServletModule throw new ServletModuleFailure(e); } } + + private String createOneTimePasswd() { + return ""; + } }