From d464ce8e8336bd5f7cbede1dadc7f7fd8a08fc2e Mon Sep 17 00:00:00 2001 From: john Date: Fri, 29 Nov 2002 14:22:30 +0000 Subject: [PATCH] search stuff: -added sort by date logic -added pagination (stores results in session so searches aren't repeated) --- .../mircoders/servlet/ServletModuleOpenIndy.java | 595 ++++++++++++--------- 1 file changed, 348 insertions(+), 247 deletions(-) diff --git a/source/mircoders/servlet/ServletModuleOpenIndy.java b/source/mircoders/servlet/ServletModuleOpenIndy.java index c0447903..f99eefc7 100755 --- a/source/mircoders/servlet/ServletModuleOpenIndy.java +++ b/source/mircoders/servlet/ServletModuleOpenIndy.java @@ -84,7 +84,7 @@ import mircoders.search.*; * open-postings to the newswire * * @author mir-coders group - * @version $Id: ServletModuleOpenIndy.java,v 1.46 2002/11/29 13:43:42 zapata Exp $ + * @version $Id: ServletModuleOpenIndy.java,v 1.47 2002/11/29 14:22:30 john Exp $ * */ @@ -142,25 +142,25 @@ public class ServletModuleOpenIndy extends ServletModule if (aid!=null && !aid.equals("")) { - SimpleHash mergeData = new SimpleHash(); - - // onetimepasswd - if(passwdProtection.equals("yes")){ - String passwd = this.createOneTimePasswd(); - System.out.println(passwd); - HttpSession session = req.getSession(false); - session.setAttribute("passwd",passwd); - mergeData.put("passwd", passwd); - } - - if (language!=null) { - HttpSession session = req.getSession(false); - session.setAttribute("Locale", new Locale(language, "")); - session.setAttribute("passwd",language); - } - - mergeData.put("aid", aid); - deliver(req, res, mergeData, commentFormTemplate); + SimpleHash mergeData = new SimpleHash(); + + // onetimepasswd + if(passwdProtection.equals("yes")){ + String passwd = this.createOneTimePasswd(); + System.out.println(passwd); + HttpSession session = req.getSession(false); + session.setAttribute("passwd",passwd); + mergeData.put("passwd", passwd); + } + + if (language!=null) { + HttpSession session = req.getSession(false); + session.setAttribute("Locale", new Locale(language, "")); + session.setAttribute("passwd",language); + } + + mergeData.put("aid", aid); + deliver(req, res, mergeData, commentFormTemplate); } else throw new ServletModuleException("aid not set!"); } @@ -176,61 +176,61 @@ 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 { - HashMap withValues = getIntersectingValues(req, DatabaseComment.getInstance()); + // 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(); ){ + //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"); - - //checking the onetimepasswd - if(passwdProtection.equals("yes")){ - HttpSession session = req.getSession(false); - String sessionPasswd = (String)session.getAttribute("passwd"); - if ( sessionPasswd == null){ - throw new ServletModuleUserException("Lost password"); - } - String passwd = req.getParameter("passwd"); - if ( passwd == null || (!sessionPasswd.equals(passwd))) { - throw new ServletModuleUserException("Missing password"); - } - session.invalidate(); - } - - // inserting into database - String id = mainModule.add(withValues); - logger.debug("inscomment: id = "+id); - //insert was not successfull - if(id==null){ - deliver(req, res, new SimpleHash(), commentFormDupeTemplate); - } else { - DatabaseContent.getInstance().setUnproduced("id="+aid); - - try { - EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(id); - MirGlobal.localizer().openPostings().afterCommentPosting(comment); - } - catch (Throwable t) { - throw new ServletModuleException(t.getMessage()); - } - - - - } - - // 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());} + } + withValues.put("is_published","1"); + + //checking the onetimepasswd + if(passwdProtection.equals("yes")){ + HttpSession session = req.getSession(false); + String sessionPasswd = (String)session.getAttribute("passwd"); + if ( sessionPasswd == null){ + throw new ServletModuleUserException("Lost password"); + } + String passwd = req.getParameter("passwd"); + if ( passwd == null || (!sessionPasswd.equals(passwd))) { + throw new ServletModuleUserException("Missing password"); + } + session.invalidate(); + } + + // inserting into database + String id = mainModule.add(withValues); + logger.debug("id: "+id); + //insert was not successfull + if(id==null){ + deliver(req, res, new SimpleHash(), commentFormDupeTemplate); + } else { + DatabaseContent.getInstance().setUnproduced("id="+aid); + + try { + EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(id); + MirGlobal.localizer().openPostings().afterCommentPosting(comment); + } + catch (Throwable t) { + throw new ServletModuleException(t.getMessage()); + } + + + + } + + // 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());} } else throw new ServletModuleException("aid not set!"); @@ -280,9 +280,9 @@ public class ServletModuleOpenIndy extends ServletModule extraInfo.put("topics", themenModule.getTopicsList()); - } + } catch (Exception e) { - logger.error("languagePopUpData or getTopicslist failed " + e.toString()); + logger.error("languagePopUpData or getTopicslist failed "+e.toString()); throw new ServletModuleException("OpenIndy -- failed getting language or topics: "+e.toString()); } @@ -315,7 +315,7 @@ public class ServletModuleOpenIndy extends ServletModule } catch (FileHandlerUserException e) { throw new ServletModuleUserException(e.getMsg()); } - + HashMap withValues = mp.getParameters(); //checking the onetimepasswd @@ -335,7 +335,7 @@ public class ServletModuleOpenIndy extends ServletModule 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"); + throw new ServletModuleUserException("Missing field"); // call the routines that escape html @@ -371,7 +371,7 @@ public class ServletModuleOpenIndy extends ServletModule // inserting content into database String cid = contentModule.add(withValues); - logger.debug("insposting: 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 @@ -389,14 +389,14 @@ public class ServletModuleOpenIndy extends ServletModule try{ DatabaseContentToTopics.getInstance().setTopics(cid,to_topicsArr); setTopic = true; - } - catch (Exception e) { + } + catch (Exception e) { logger.error("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 - + //if we're here all is ok... associate the media to the article for(int i=0;i= totalHits){ + throw new ServletModuleUserException("newPosition: index out bounds, value was:"+(new Integer(newPosition)).toString()); + } + session.setAttribute("positionInResults",new Integer(newPosition)); + } - catch (IOException e){ - logger.error("search: Can't close searcher: " + e.toString()); - throw new ServletModuleUserException("Problem closing searcher!"); + else { + if (searchSubmitValue != null && searchSubmitValue.equals("Forward")){ + int totalHits = ((Integer) session.getAttribute("numberOfHits")).intValue(); + int newPosition=((Integer)session.getAttribute("positionInResults")).intValue()+increment; + if (newPosition < 0 || newPosition >= totalHits){ + throw new ServletModuleUserException("newPosition: index out bounds, value was:"+(new Integer(newPosition)).toString()); + } + session.setAttribute("positionInResults",new Integer(newPosition)); + + } + else { + String indexPath=MirConfig.getProp("IndexPath"); + + + String creatorFragment = creatorTerm.makeTerm(req); + 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){ + logger.debug("contentFragment: " + contentFragment); + queryString = queryString + " +" + contentFragment; + } + + String topicFragment = topicTerm.makeTerm(req); + if (topicFragment != null){ + queryString = queryString + " +" + topicFragment; + } + + String imagesFragment = imagesTerm.makeTerm(req); + if (imagesFragment != null){ + queryString = queryString + " +" + imagesFragment; + } + + String audioFragment = audioTerm.makeTerm(req); + if (audioFragment != null){ + queryString = queryString + " +" + audioFragment; + } + + String videoFragment = videoTerm.makeTerm(req); + if (videoFragment != null){ + queryString = queryString + " +" + videoFragment; + } + + if (queryString == null || queryString == ""){ + queryString = ""; + } + else{ + try{ + Searcher searcher = null; + try { + searcher = new IndexSearcher(indexPath); + } + catch(IOException e) { + logger.debug("Can't open indexPath: " + indexPath); + throw new ServletModuleUserException("Problem with Search Index! : "+ e.toString()); + } + + Query query = null; + try { + query = QueryParser.parse(queryString, "content", new StandardAnalyzer()); + } + catch(Exception e) { + searcher.close(); + logger.debug("Query don't parse: " + queryString); + throw new ServletModuleUserException("Problem with Query String! (was '"+queryString+"')"); + } + + Hits hits = null; + try { + hits = searcher.search(query); + } + catch(IOException e) { + searcher.close(); + logger.debug("Can't get hits: " + e.toString()); + throw new ServletModuleUserException("Problem getting hits!"); + } + + int start = 0; + int end = hits.length(); + + String sortBy=req.getParameter("search_sort"); + if (sortBy == null || sortBy.equals("")){ + throw new ServletModuleUserException("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++) { + theDocumentsSorted.add(hits.doc(i)); + } + } + else{ + // then we'll sort by date! + HashMap 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)); + } + else{ + ArrayList thePositions = new ArrayList(); + thePositions.add(new Integer(i)); + dateToPosition.put(creationDate,thePositions); + } + } + Set keys = dateToPosition.keySet(); + ArrayList keyList= new ArrayList(keys); + Collections.sort(keyList); + if (sortBy.equals("date_desc")){ + Collections.reverse(keyList); + } + else{ + if (!sortBy.equals("date_asc")){ + throw new ServletModuleUserException("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())); + } + } + } + + try{ + searcher.close(); + } + catch (IOException e){ + logger.debug("Can't close searcher: " + e.toString()); + throw new ServletModuleUserException("Problem closing searcher(normal)!"); + } + + + 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)); + + } + catch (IOException e){ + logger.debug("Can't close searcher: " + e.toString()); + throw new ServletModuleUserException("Problem closing searcher!"); + } + } + } } + + try { + ArrayList theDocs = (ArrayList)session.getAttribute("theDocumentsSorted"); + if (theDocs != null){ + + mergeData.put("numberOfHits", ((Integer)session.getAttribute("numberOfHits")).toString()); + SimpleList theHits = new SimpleList(); + int pIR=((Integer)session.getAttribute("positionInResults")).intValue(); + int terminus; + int numHits=((Integer)session.getAttribute("numberOfHits")).intValue(); + + if (!(pIR+increment>=numHits)){ + mergeData.put("hasNext","y"); + } + if (pIR-increment>=0){ + mergeData.put("hasPrevious","y"); + } + + if ((pIR+increment)>numHits){ + terminus=numHits; + } + else { + terminus=pIR+increment; + } + for(int i = pIR; i < terminus; i++) { + SimpleHash h = new SimpleHash(); + 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); + } + } + catch (Exception e) { + logger.debug("Can't iterate over hits: " + e.toString()); + throw new ServletModuleUserException("Problem getting hits!"); + } + + mergeData.put("queryString",queryString); + deliver(req,res,mergeData,searchResultsTemplate); + } + catch (NullPointerException n){ + n.printStackTrace(); + throw new ServletModuleUserException("Null Pointer"+n.toString()); } - mergeData.put("queryString",queryString); - deliver(req,res,mergeData,searchResultsTemplate); } /* @@ -591,7 +689,7 @@ public class ServletModuleOpenIndy extends ServletModule public void getpdf(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException, ServletModuleUserException { String ID_REQUEST_PARAM = "id"; - + String generateFO=MirConfig.getProp("GenerateFO"); String generatePDF=MirConfig.getProp("GeneratePDF"); @@ -603,11 +701,11 @@ public class ServletModuleOpenIndy extends ServletModule Hierarchy hierarchy = Hierarchy.getDefaultHierarchy(); log = hierarchy.getLoggerFor("fop"); log.setPriority(Priority.WARN); - + String producerStorageRoot=MirConfig.getProp("Producer.StorageRoot"); String producerDocRoot=MirConfig.getProp("Producer.DocRoot"); String templateDir=MirConfig.getPropWithHome("HTMLTemplateProcessor.Dir"); - String xslSheet=templateDir + "/" + String xslSheet=templateDir + "/" + MirConfig.getProp("Producer.PrintableContent.html2foStyleSheetName"); try { String idParam = req.getParameter(ID_REQUEST_PARAM); @@ -615,11 +713,11 @@ public class ServletModuleOpenIndy extends ServletModule EntityContent contentEnt = (EntityContent)contentModule.getById(idParam); String publishPath = contentEnt.getValue("publish_path"); - String foFile = producerStorageRoot + producerDocRoot + "/" - + publishPath + "/" + idParam + ".fo"; - XSLTInputHandler input = new XSLTInputHandler(new File(foFile), - new File(xslSheet)); - + String foFile = producerStorageRoot + producerDocRoot + "/" + + publishPath + "/" + idParam + ".fo"; + XSLTInputHandler input = new XSLTInputHandler(new File(foFile), + new File(xslSheet)); + ByteArrayOutputStream out = new ByteArrayOutputStream(); res.setContentType("application/pdf"); @@ -637,19 +735,22 @@ public class ServletModuleOpenIndy extends ServletModule throw new ServletModuleUserException("Missing id parameter."); } } catch (Exception ex) { - throw new ServletModuleException(ex.toString()); + throw new ServletModuleException(ex.toString()); } } else { throw new ServletModuleUserException("Can't generate a PDF because the config tells me not to."); } } - + private void _throwBadContentType (String fileName, String contentType) throws ServletModuleUserException { - logger.error("Wrong file type uploaded!: " + fileName + " (" + contentType + ")"); - throw new ServletModuleUserException("A file you uploaded is of the " - +"following mime-type: " + contentType + ". Unfortunately we do not support this type. "); + logger.error("Wrong file type uploaded!: " + fileName+" " + +contentType); + throw new ServletModuleUserException("The file you uploaded is of the " + +"following mime-type: "+contentType + +", we do not support this mime-type. " + +"Error One or more files of unrecognized type. Sorry"); } protected String createOneTimePasswd(){ @@ -666,14 +767,14 @@ public class ServletModuleOpenIndy extends ServletModule /* 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) + TemplateModelRoot rtm, TemplateModelRoot popups, + String templateFilename) throws ServletModuleException { if (rtm == null) rtm = new SimpleHash(); try { PrintWriter out = res.getWriter(); HTMLTemplateProcessor.process(res, templateFilename, rtm, popups, out, - getLocale(req), "bundles.open"); + getLocale(req), "bundles.open"); out.close(); } catch (HTMLParseException e) { throw new ServletModuleException(e.toString()); -- 2.11.0