com.pearson.openideas.cq5.components.search.SearchResults.java Source code

Java tutorial

Introduction

Here is the source code for com.pearson.openideas.cq5.components.search.SearchResults.java

Source

/**
 * Created: Jun 12, 2013 11:13:12 PM
 *
 * Copyright (c) 2000 - 2011, Crown Partners.
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of 
 * Crown Partners. ("Confidential Information").  You shall not
 * disclose such Confidential Information and shall use it only in
 * accordance with the terms of the license agreement you entered into
 * with Crown Partners.
 */
package com.pearson.openideas.cq5.components.search;

import com.crownpartners.cq.quickstart.core.component.AbstractComponent;
import com.day.cq.tagging.Tag;
import com.day.cq.tagging.TagManager;
import com.day.cq.tagging.TagManager.FindResults;
import com.day.cq.wcm.foundation.Image;
import com.pearson.openideas.cq5.components.beans.solr.Page;
import com.pearson.openideas.cq5.components.beans.solr.SolrResults;
import com.pearson.openideas.cq5.components.beans.solr.SolrSearchParameters;
import com.pearson.openideas.cq5.components.enums.IndexedPageTypeEnum;
import com.pearson.openideas.cq5.components.enums.NamespaceEnum;
import com.pearson.openideas.cq5.components.services.solr.page.SolrPageSearchService;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.sling.api.resource.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.jsp.PageContext;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

/**
 * This component is used for searching and displaying the search results.
 * 
 * @version 2.0
 * 
 * @author Sam Labib
 */
public class SearchResults extends AbstractComponent {

    private static final Logger log = LoggerFactory.getLogger(SearchResults.class);

    private String searchText;
    private String searchType;
    private List<Page> pages;

    // Paging
    private static final int PAGESIZE = 10;
    private long totalMatches;
    private int matchesOnThisPage;
    private int start;
    private int pageNumber;
    private StringBuilder params;

    /**
     * Constructor.
     * 
     * @param pageContext
     *            The page context
     */
    public SearchResults(PageContext pageContext) {
        super(pageContext);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void init() {

        searchText = getSlingRequest().getParameter("searchbox");
        searchType = getSlingRequest().getParameter("searchType");

        searchText = StringEscapeUtils.escapeJavaScript(searchText);
        searchText = StringEscapeUtils.escapeHtml(searchText);

        if (StringUtils.isNotBlank(searchText)) {
            // calculate page information
            String pageStr = getRequestParameter("page");
            pageNumber = 1;
            if (pageStr != null) {
                try {
                    pageNumber = Integer.parseInt(pageStr);
                } catch (NumberFormatException ex) {
                    log.error("The page number is not a valid number: " + pageNumber, ex);
                }
            }
            log.debug("The page number is: " + pageNumber);
            start = (PAGESIZE * (pageNumber - 1));

            if (start == 0) {
                TagManager tagManager = getResourceResolver().adaptTo(TagManager.class);
                FindResults findResults = tagManager.findByTitle(searchText);
                Tag[] tags = findResults.tags;
                if (tags.length > 0) {
                    for (Tag tag : tags) {
                        log.debug("The tag title is: " + tag.getTitle());
                        if (tag.getCount() > 0 && tag.getTitle().equalsIgnoreCase(searchText)) {
                            StringBuilder url = new StringBuilder(getSlingRequest().getContextPath());
                            url.append("explore/");
                            if (tag.getTagID().startsWith(NamespaceEnum.THEME.getNamespace())) {
                                url.append("theme");
                            } else if (tag.getTagID().startsWith(NamespaceEnum.CATEGORY.getNamespace())) {
                                url.append("sector");
                            } else if (tag.getTagID().startsWith(NamespaceEnum.REGION.getNamespace())) {
                                url.append("region");
                            } else {
                                log.info("Unknown tagID: " + tag.getTagID());
                                continue;
                            }
                            url.append('.');
                            url.append(tag.getName());
                            url.append(".html");
                            // Redirect to a landing page
                            try {
                                log.debug("redirecting to: " + url.toString());
                                getSlingResponse().sendRedirect(url.toString());
                            } catch (IOException ex) {
                                log.error("Failed to redirect to: " + url.toString(), ex);
                            }
                            return;
                        }
                    }
                }
            }

            SolrPageSearchService solrPageSearchService = getSlingScriptHelper()
                    .getService(SolrPageSearchService.class);
            SolrSearchParameters param = new SolrSearchParameters();
            String originalSearchText = searchText;
            if ("Exact phrase".equals(searchType)) {
                searchText = '"' + searchText + '"';
            } else if ("All words".equals(searchType)) {
                searchText = searchText.replaceAll(" ", " AND ");
            }
            log.debug("\n\nSearch Text: " + searchText);

            param.setQuery(searchText);
            param.setDisplayCount(PAGESIZE);
            param.setCurrentRecord(start);
            try {
                params = new StringBuilder("?searchbox=");
                params.append(URLEncoder.encode(searchText, "UTF-8"));
                if (StringUtils.isNotBlank(searchType)) {
                    params.append("&searchType=");
                    params.append(URLEncoder.encode(searchType, "UTF-8"));
                }
                params.append("&page=");
                SolrResults<Page> solrResults = solrPageSearchService.retrieve(param);
                totalMatches = solrResults.getTotalMatches();
                log.debug("Total matches for this search: " + totalMatches);
                pages = solrResults.getBeans();
                Map<String, Map<String, List<String>>> highlighting = solrResults.getHighlighting();

                matchesOnThisPage = pages.size();
                log.debug("RESULTS THIS PAGE: " + matchesOnThisPage);
                for (Page page : pages) {

                    //need to check for null here, in case a page was deleted from publish without being unindexed
                    if (getResourceResolver().getResource(page.getUrl() + "/jcr:content") != null) {
                        page.setIsValid(true);
                        log.info("title: " + page.getTitle());
                        if (IndexedPageTypeEnum.ARTICLE.getIndexedPageType().equals(page.getPageType())) {
                            Resource resource = getResourceResolver().getResource(page.getUrl() + "/jcr:content");
                            if (resource.getChild("articleBody").getChild("imagethumb") != null) {
                                Image image = new Image(resource.getChild("articleBody").getChild("imagethumb"));
                                image.setSelector(".img");
                                page.setImage(image);
                                log.debug("do we have an THUMBNAIL image on this search result? "
                                        + image.hasContent());
                            } else {
                                Image image = new Image(resource.getChild("articleBody").getChild("image"));
                                image.setSelector(".img");
                                page.setImage(image);
                                log.debug("Or, do we have a regular image? " + image.hasContent());
                            }
                        }

                        Map<String, List<String>> map = highlighting.get(page.getUrl());
                        if (map != null && map.size() > 0) {
                            for (String key : map.keySet()) {
                                String excerpt = map.get(key).get(0);
                                excerpt = StringUtils.replace(excerpt, "<p>", "");
                                excerpt = StringUtils.replace(excerpt, "</p>", "");
                                page.setExcerpt(excerpt);
                                break;
                            }
                        }
                    }
                }
            } catch (Exception ex) {
                log.error("Failed to get the search results", ex);
            }

            //ugly hack, I hate myself for doing this
            searchText = originalSearchText;
            //but it came in handy...this way the extra stuff added for specific searches is never sent back to the front end

        } else {
            log.warn("The search term is empty");
        }
    }

    /**
     * Get the searchText.
     * 
     * @return The searchText
     */
    public String getSearchText() {
        return searchText;
    }

    /**
     * Set the searchText.
     * 
     * @param searchText
     *            The searchText to set
     */
    public void setSearchText(String searchText) {
        this.searchText = searchText;
    }

    /**
     * Get the pages.
     * 
     * @return The pages
     */
    public List<Page> getPages() {
        return pages;
    }

    /**
     * Set the pages.
     * 
     * @param pages
     *            The pages to set
     */
    public void setPages(List<Page> pages) {
        this.pages = pages;
    }

    /**
     * Get the pagesize.
     * 
     * @return The pagesize
     */
    public int getPagesize() {
        return PAGESIZE;
    }

    /**
     * Get the totalMatches.
     * 
     * @return The totalMatches
     */
    public long getTotalMatches() {
        return totalMatches;
    }

    /**
     * Get the pageNumber.
     * 
     * @return The pageNumber
     */
    public int getPageNumber() {
        return pageNumber;
    }

    /**
     * Get the page count.
     * 
     * @return The page count
     */
    public int getPageCount() {
        return (int) Math.ceil(totalMatches / (double) PAGESIZE);
    }

    /**
     * Get the start of the list we're displaying.
     * 
     * @return The start of the list we're displaying.
     */
    public int getListStart() {
        return start + 1;
    }

    /**
     * Get the end of the list we're displaying.
     * 
     * @return The end of the list we're displaying
     */
    public long getListEnd() {
        int end = pageNumber * PAGESIZE;
        if (end > totalMatches) {
            return totalMatches;
        }
        return end;
    }

    /**
     * Get the parameters for paging.
     * 
     * @return The parameters for paging
     */
    public String getParams() {
        return params.toString();
    }

    /**
     * Sets new matchesOnThisPage.
     *
     * @param matchesOnThisPage New value of matchesOnThisPage.
     */
    public void setMatchesOnThisPage(int matchesOnThisPage) {
        this.matchesOnThisPage = matchesOnThisPage;
    }

    /**
     * Gets matchesOnThisPage.
     *
     * @return Value of matchesOnThisPage.
     */
    public int getMatchesOnThisPage() {
        return matchesOnThisPage;
    }

    /**
     * Sets new searchType.
     *
     * @param searchType New value of searchType.
     */
    public void setSearchType(String searchType) {
        this.searchType = searchType;
    }

    /**
     * Gets searchType.
     *
     * @return Value of searchType.
     */
    public String getSearchType() {
        return searchType;
    }
}