+ 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!");
+ }
+ }