[Yanel-commits] rev 51294 -
public/yanel/trunk/src/contributions/resources/search/src/java/org/wyona/yanel/impl/resources/search
michi at wyona.com
michi at wyona.com
Thu Jul 15 09:29:56 CEST 2010
Author: michi
Date: 2010-07-15 09:29:55 +0200 (Thu, 15 Jul 2010)
New Revision: 51294
Modified:
public/yanel/trunk/src/contributions/resources/search/src/java/org/wyona/yanel/impl/resources/search/SearchResource.java
Log:
thanks to Memo pagination has been added
Modified: public/yanel/trunk/src/contributions/resources/search/src/java/org/wyona/yanel/impl/resources/search/SearchResource.java
===================================================================
--- public/yanel/trunk/src/contributions/resources/search/src/java/org/wyona/yanel/impl/resources/search/SearchResource.java 2010-07-15 07:22:36 UTC (rev 51293)
+++ public/yanel/trunk/src/contributions/resources/search/src/java/org/wyona/yanel/impl/resources/search/SearchResource.java 2010-07-15 07:29:55 UTC (rev 51294)
@@ -20,7 +20,12 @@
import org.apache.commons.lang.StringEscapeUtils;
/**
- * Search resource
+ * Search resource. The configuration parameters "max-entries-per-page" and "max-navigation-links"
+ * can be used in the resource configuration file to set the number of search results per page
+ * and the number of links that will be displayed to navigate between those pages (usually at the
+ * bottom of the page). The page numbers to be linked to will be passed to the XSLT so that they can
+ * be handled there accordingly. The current page number must be shared between java and XSLT
+ * via the request parameter "page".
*/
public class SearchResource extends BasicXMLResource {
@@ -30,23 +35,28 @@
private static String QUERY_NAME = "q";
private static String DOMAIN_NAME = "domain";
private static String DEFAULT_PROVIDER = "yanel";
+ private static final String CURRENT_PAGE_NUMBER_REQUEST_PARAMETER_NAME = "page";
+ private static final String MAX_ENTRIES_CONFIG_PARAMETER_NAME = "max-entries-per-page";
+ private static final int MAX_ENTRIES_DEFAULT = 3;
+ private static final String MAX_PAGINATION_LINKS_CONFIG_PARAMETER_NAME = "max-navigation-links";
+ private static final int MAX_PAGINATION_LINKS_DEFAULT = 1;
/**
* @see org.wyona.yanel.core.api.attributes.ViewableV2#getView(String)
*/
public View getView(String viewId) throws Exception {
- String provider = getRequest().getParameter(PROVIDER_NAME);
+ String provider = getEnvironment().getRequest().getParameter(PROVIDER_NAME);
if (provider != null && !provider.equals(DEFAULT_PROVIDER)) {
ExternalSearchProvider esp = getExternalSearchProvider(provider);
if (esp != null) {
View view = new View();
view.setResponse(false); // this resource writes the response itself in order to do a server side redirect
- javax.servlet.http.HttpServletResponse response = getResponse();
+ javax.servlet.http.HttpServletResponse response = getEnvironment().getResponse();
response.setStatus(307); // Temporary redirect (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)
- String query = getRequest().getParameter(QUERY_NAME);
- String domain = getRequest().getParameter(DOMAIN_NAME);
+ String query = getEnvironment().getRequest().getParameter(QUERY_NAME);
+ String domain = getEnvironment().getRequest().getParameter(DOMAIN_NAME);
String site="";
if (domain != null) site = "+site:" + domain; // TODO: This will work for Google and bing, but is this true for all search engines?
response.setHeader("Location", esp.getURL() + query + site);
@@ -67,14 +77,14 @@
StringBuilder sb = new StringBuilder("<?xml version=\"1.0\"?>");
sb.append("<y:search xmlns:y=\"http://www.wyona.org/yanel/search/1.0\">");
- String provider = getRequest().getParameter(PROVIDER_NAME);
+ String provider = getEnvironment().getRequest().getParameter(PROVIDER_NAME);
if (provider == null) {
provider = DEFAULT_PROVIDER;
log.warn("No search provider specified! Default provider will be used: " + provider);
}
sb.append("<y:provider id=\"" + provider + "\">" + provider + "</y:provider>");
- String query = getRequest().getParameter(QUERY_NAME);
+ String query = getEnvironment().getRequest().getParameter(QUERY_NAME);
if (query != null && query.length() > 0) {
sb.append("<y:query>" + StringEscapeUtils.escapeXml(query) + "</y:query>");
try {
@@ -93,8 +103,88 @@
}
if (results != null && results.length > 0) {
- sb.append("<y:results>");
- for (int i = 0; i < results.length; i++) {
+
+ boolean paginationEnabled = false;
+ int currentPageNumber = 1;
+ int maxEntries = MAX_ENTRIES_DEFAULT;
+ String maxEntriesStr = getResourceConfigProperty(MAX_ENTRIES_CONFIG_PARAMETER_NAME);
+ if (maxEntriesStr != null && 0 != maxEntriesStr.length()){
+ maxEntries = Integer.parseInt(maxEntriesStr.trim());
+ paginationEnabled = true;
+ }
+ int maxLinks = MAX_PAGINATION_LINKS_DEFAULT;
+ String maxLinksStr = getResourceConfigProperty(MAX_PAGINATION_LINKS_CONFIG_PARAMETER_NAME);
+ if (maxLinksStr != null && 0 != maxLinksStr.length()){
+ maxLinks = Integer.parseInt(maxLinksStr.trim());
+ paginationEnabled = true;
+ }
+
+
+ if (paginationEnabled) {
+ if (log.isDebugEnabled()) {
+ log.debug("Max number of search results per page is set to " + maxEntries);
+ log.debug("Max number of results page links is set to " + maxLinks);
+ log.debug("Results will be paginated");
+ }
+
+ String currentPageNumberStr = getEnvironment().getRequest().getParameter(CURRENT_PAGE_NUMBER_REQUEST_PARAMETER_NAME);
+ if (currentPageNumberStr == null || 0 == currentPageNumberStr.length()) {
+ currentPageNumber = 1;
+ } else {
+ currentPageNumber = Integer.parseInt(currentPageNumberStr.trim());
+ if (log.isDebugEnabled()) {
+ log.debug("The currently diplayed results page number is " + currentPageNumber);
+ }
+ }
+ } else {
+ log.warn("Pagination is not configured within resource config, hence all results will be displayed.");
+ }
+
+
+ int totalPages = (results.length / maxEntries);
+ if (results.length % maxEntries > 0) {
+ totalPages = totalPages + 1;
+ }
+ int firstLink = currentPageNumber - (maxLinks / 2);
+ int lastLink = firstLink + maxLinks;
+ if (log.isDebugEnabled()) {
+ log.debug("Total number of results = " + results.length);
+ log.debug("Total number of pages = " + totalPages);
+ log.debug("First link page number = " + firstLink);
+ log.debug("Last link page number = " + lastLink);
+ }
+
+
+ sb.append("<y:pages max-entries-per-page=\"" + maxEntries + "\" max-page-links=\"" + maxLinks + "\">");
+ if (currentPageNumber > 1) {
+ sb.append("<y:previous>" + (currentPageNumber - 1) + "</y:previous>");
+ }
+ for (int pageNumber = firstLink; pageNumber < lastLink; pageNumber++) {
+ if (pageNumber <= 0) continue;
+ if (pageNumber > totalPages) break;
+ sb.append("<y:page");
+ if (pageNumber == currentPageNumber) {
+ sb.append(" selected='true'");
+ }
+ sb.append(">" + pageNumber + "</y:page>");
+ }
+ if (currentPageNumber < totalPages) {
+ sb.append("<y:next>" + (currentPageNumber + 1) + "</y:next>");
+ }
+ sb.append("</y:pages>");
+
+ sb.append("<y:results page-number='" + currentPageNumber + "'>");
+ int startingEntry = 0;
+ int numberOfEntries = results.length;
+ if (paginationEnabled) {
+ startingEntry = (currentPageNumber - 1) * numberOfEntries;
+ numberOfEntries = maxEntries;
+ }
+ for (int i = startingEntry; i < (startingEntry + numberOfEntries); i++) {
+ if (i >= results.length) {
+ // INFO: Break in case number of entries on last page exceeds length of results
+ break;
+ }
sb.append("<y:result url=\"" + results[i].getURL() + "\">");
if (results[i].getTitle() != null) {
log.debug("Title: " + results[i].getTitle());
More information about the Yanel-commits
mailing list