/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/rwiki/trunk/rwiki-tool/tool/src/java/uk/ac/cam/caret/sakai/rwiki/tool/bean/FullSearchBean.java $ * $Id: FullSearchBean.java 79108 2010-07-06 18:04:55Z stephen.marquard@uct.ac.za $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006 The Sakai Foundation. * * Licensed under the Educational Community License, Version 1.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ecl1.php * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package uk.ac.cam.caret.sakai.rwiki.tool.bean; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.search.api.InvalidSearchQueryException; import org.sakaiproject.search.api.SearchList; import org.sakaiproject.search.api.SearchService; import org.sakaiproject.tool.api.ToolManager; import uk.ac.cam.caret.sakai.rwiki.tool.util.WikiPageAction; /** * Bean for helping with the search view * * @author andrew */ public class FullSearchBean { private static Log log = LogFactory.getLog(FullSearchBean.class); /** Tool restriction: see RWikiEntityContentProducer.getTool() **/ private static final String SEARCH_SUFFIX = " +tool:wiki"; /** * The search criteria */ private String search; /** * The realm to restrict the search to */ private String realm; /** * RWikiObjectService to use */ private SearchService searchService; /** * Time taken */ private double timeTaken = 0; /** * The number of results per page */ private int pagesize = 20; /** * The number of list links */ private int nlistPages = 5; /** * The default request page */ private int requestPage = 0; /** * The default number of results */ private int nresults = 0; /** * The current search list */ private SearchList searchResults; private ToolManager toolManager; /** * Creates a searchBean * * @param search * @param user * @param realm * @param objectService */ public FullSearchBean(String search, String requestPage, String realm, SearchService searchService, ToolManager toolManager) { this.search = search; this.realm = realm; this.searchService = searchService; this.toolManager = toolManager; try { this.requestPage = Integer.parseInt(requestPage); } catch (NumberFormatException e) { this.requestPage = 0; } } /** * Set the RWikiObjectService for searching from * * @param objectService */ public void setRWikiObjectService(SearchService searchService) { this.searchService = searchService; } /** * Gets the current search request * * @return current search request */ public String getSearch() { return search; } /** * Gets the current search realm * * @return current search realm */ public String getRealm() { return realm; } /** * Parse wiki page name from search title obtained from search api * * @return wiki page-name */ public String pageNameFromSearchTitle(String searchTitle) { if (searchTitle.startsWith(" /site/")) { String h = searchTitle.substring(searchTitle.lastIndexOf('/')+1); return h; } return searchTitle; } /** * Perform the search * * @return a list of page names that match the search criteria */ public List getSearchResults() { return search(); } public String getTimeTaken() { int tt = (int) timeTaken; return String.valueOf(tt); } /** * Perform the search * * @return a list of page names that match the search criteria */ public List search() { log.debug("search()"); if (searchResults == null) { List<String> l = new ArrayList<String>(); l.add(toolManager.getCurrentPlacement().getContext()); long start = System.currentTimeMillis(); int searchStart = requestPage * pagesize; int searchEnd = searchStart + pagesize; try { searchResults = searchService.search(search.concat(SEARCH_SUFFIX), l, searchStart, searchEnd); long end = System.currentTimeMillis(); timeTaken = end - start; nresults = searchResults.getFullSize(); } catch (InvalidSearchQueryException e) { //TODO we need to handle the exception and return a message to the user if (log.isDebugEnabled()) { e.printStackTrace(); } return null; } } log.debug("got a searchresult of: " + searchResults.size()); return searchResults; } public List getSearchPages() { SearchList sr = (SearchList) search(); //its possible for the searchlist to be null if (sr == null) { return null; } int npages = sr.getFullSize() / pagesize; List pages = new ArrayList(); /* int cpage = requestPage - (nlistPages / 2); if (cpage < 0) { cpage = 0; } int lastPage = Math.min(cpage + nlistPages, npages); while (cpage <= lastPage) { pages.add(new PageLink(cpage)); cpage++; } */ for (int i=0; i<npages; i++) { pages.add(new PageLink(i)); } return pages; } public class PageLink { private int pagenum = 0; public PageLink(int pagenum) { this.pagenum = pagenum; } public String getPage() { return String.valueOf(pagenum); } public String getPageNum() { return String.valueOf(pagenum); } public String getFullSearchLinkUrl() { return "?" + ViewBean.ACTION_URL_ENCODED + "=" + ViewBean.urlEncode(WikiPageAction.FULL_SEARCH_ACTION .getName()) + "&" + ViewBean.SEARCH_URL_ENCODED + "=" + ViewBean.urlEncode(search) + "&" + ViewBean.PAGE_URL_ENCODED + "=" + ViewBean.urlEncode(String.valueOf(pagenum)) + "&" + ViewBean.REALM_URL_ENCODED + "=" + ViewBean.urlEncode(realm) + "&" + ViewBean.PANEL_URL_ENCODED + "=" + ViewBean.MAIN_URL_ENCODED; } } /** * @return Returns the nlistPages. */ public int getNlistPages() { return nlistPages; } /** * @param nlistPages * The nlistPages to set. */ public void setNlistPages(int nlistPages) { this.nlistPages = nlistPages; } /** * @return Returns the pagesize. */ public int getPagesize() { return pagesize; } /** * @param pagesize * The pagesize to set. */ public void setPagesize(int pagesize) { this.pagesize = pagesize; } /** * @return Returns the requestPage. */ public int getRequestPage() { return requestPage; } /** * @param requestPage * The requestPage to set. */ public void setRequestPage(int requestPage) { this.requestPage = requestPage; } /** * @param timeTaken * The timeTaken to set. */ public void setTimeTaken(double timeTaken) { this.timeTaken = timeTaken; } public int getNresults() { return nresults; } }