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