
com.day.cq.searchpromote.Search Maven / Gradle / Ivy
/*************************************************************************
*
* ADOBE CONFIDENTIAL
* __________________
*
* Copyright 2011 Adobe Systems Incorporated
* All Rights Reserved.
*
* NOTICE: All information contained herein is, and remains
* the property of Adobe Systems Incorporated and its suppliers,
* if any. The intellectual and technical concepts contained
* herein are proprietary to Adobe Systems Incorporated and its
* suppliers and may be covered by U.S. and Foreign Patents,
* patents in process, and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from Adobe Systems Incorporated.
**************************************************************************/
package com.day.cq.searchpromote;
import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.http.Header;
import org.apache.http.HeaderIterator;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.StatusLine;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.osgi.services.HttpClientBuilderFactory;
import org.apache.http.util.EntityUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.InputSource;
import com.day.cq.searchpromote.impl.DecompressingMethod;
import com.day.cq.searchpromote.xml.form.SearchForm;
import com.day.cq.searchpromote.xml.form.SearchFormParser;
import com.day.cq.searchpromote.xml.result.Banner;
import com.day.cq.searchpromote.xml.result.BreadCrumb;
import com.day.cq.searchpromote.xml.result.BreadCrumbItem;
import com.day.cq.searchpromote.xml.result.CustomerResult;
import com.day.cq.searchpromote.xml.result.Facet;
import com.day.cq.searchpromote.xml.result.Menu;
import com.day.cq.searchpromote.xml.result.Pagination;
import com.day.cq.searchpromote.xml.result.Query;
import com.day.cq.searchpromote.xml.result.Result;
import com.day.cq.searchpromote.xml.result.ResultParser;
import com.day.cq.searchpromote.xml.result.ResultSet;
import com.day.cq.searchpromote.xml.result.Suggestion;
import com.day.cq.searchpromote.xml.result.Suggestions;
import com.day.cq.wcm.webservicesupport.Configuration;
import aQute.bnd.annotation.ProviderType;
@ProviderType
public final class Search {
private final Logger log = LoggerFactory.getLogger(getClass());
/** Valid query pattern */
public static final String VALID_QUERY_PATTERN = ".*?q\\d*=.*?";
/** Query parameter */
public static final String QUERY_PARAM_NAME = "q";
/** Property name member ID */
public static final String PN_MEMBER_ID = "memberid";
/** Property name account number */
public static final String PN_ACCOUNT_NUMBER = "accountno";
/** Property name search form XML */
public static final String PN_SEARCHFORMXML = "searchformxml";
/** Search form parser */
private SearchFormParser searchFormParser;
/** Search form */
private SearchForm searchForm;
/** Result parser */
private ResultParser resultsParser;
/** customer result */
private CustomerResult customerResult;
/** Sling request */
private SlingHttpServletRequest request;
/** Configuration */
private Configuration configuration;
/** HTTPClient Builder Factory */
private HttpClientBuilderFactory httpClientBuilderFactory;
/** Query string from request */
private String queryString;
/** Time in ms for requesting results */
private Long requestTime;
/** Time in ms for parsing results */
private Long parsingTime;
/** Time in ms for connection timeout */
private int connectionTimeout = SearchPromoteConstants.DEFAULT_CONNECTION_TIMEOUT;
/** Time in ms for socket timeout */
private int socketTimeout = SearchPromoteConstants.DEFAULT_SOCKET_TIMEOUT;
/**
* Creates a new instance of a Search object.
*
* @param request {@link SlingHttpServletRequest}
* @param configuration {@link Configuration}
* @throws SearchPromoteException {@link SearchPromoteException} if an error occurs
* @deprecated Use {@link com.day.cq.searchpromote.Search#Search(SlingHttpServletRequest, Configuration, HttpClientBuilderFactory)} instead.
*/
@Deprecated
public Search(SlingHttpServletRequest request, Configuration configuration) throws SearchPromoteException {
this.request = request;
this.configuration = configuration;
try {
this.searchFormParser = new SearchFormParser();
this.resultsParser = new ResultParser();
}catch(Exception e) {
log.error(e.getMessage(), e);
throw new SearchPromoteException(e.getMessage(), e);
}
consumeRequestParameters();
if(searchForm == null) {
parseSearchForm();
}
if(queryString != null) {
parseResults();
}
}
/**
* Creates a new instance of a Search object.
*
* @param request The {@link SlingHttpServletRequest}
* @param configuration The {@link Configuration}
* @param httpClientBuilderFactory The {@link HttpClientBuilderFactory}
* @param connectionTimeout Timeout in milliseconds until a connection is
* established. A timeout value of 0 is interpreted as an
* infinite timeout.
* @param socketTimeout Timeout in milliseconds, which is the timeout for
* waiting for data or a maximum period of inactivity between two
* consecutive data packets. A timeout value of 0 is
* interpreted as an infinite timeout.
* @throws SearchPromoteException if an error occurs
*/
public Search(SlingHttpServletRequest request, Configuration configuration, HttpClientBuilderFactory httpClientBuilderFactory, int connectionTimeout, int socketTimeout) throws SearchPromoteException {
if (httpClientBuilderFactory == null) {
throw new IllegalArgumentException("HttClientBuilderFactory cannot be null");
}
if (connectionTimeout < 0) {
throw new IllegalArgumentException("Connection timeout value cannot be less than 0");
}
if (socketTimeout < 0) {
throw new IllegalArgumentException("Socket timeout value cannot be less than 0");
}
this.request = request;
this.configuration = configuration;
this.httpClientBuilderFactory = httpClientBuilderFactory;
this.connectionTimeout = connectionTimeout;
this.socketTimeout = socketTimeout;
try {
this.searchFormParser = new SearchFormParser();
this.resultsParser = new ResultParser();
} catch(Exception e) {
log.error(e.getMessage(), e);
throw new SearchPromoteException(e.getMessage(), e);
}
consumeRequestParameters();
if(searchForm == null) {
parseSearchForm();
}
if(queryString != null) {
parseResults();
}
}
/**
* Creates a new instance of a Search object.
*
* @param request {@link SlingHttpServletRequest}
* @param configuration {@link Configuration}
* @param httpClientBuilderFactory {@link HttpClientBuilderFactory}
* @throws SearchPromoteException {@link SearchPromoteException} if an error occurs
*/
public Search(SlingHttpServletRequest request, Configuration configuration, HttpClientBuilderFactory httpClientBuilderFactory) throws SearchPromoteException {
this(request, configuration, httpClientBuilderFactory, SearchPromoteConstants.DEFAULT_CONNECTION_TIMEOUT, SearchPromoteConstants.DEFAULT_SOCKET_TIMEOUT);
}
/**
* Returns a query parameter from the provided query string. Additional to
* the delimiter & the Search&Promote parameter delimiters ; and / are
* supported.
*
* @param queryString queryString
* @param parameter parameter
* @return query parameter
*/
public static String getQueryParameter(String queryString, String parameter) {
if(queryString != null && !"".equals(queryString)) {
Pattern pm = Pattern.compile(".*?" + parameter + "=([^;&/]*)?.*?");
Matcher m = pm.matcher(queryString);
if(m.find()) {
return m.group(1);
}
}
return null;
}
/**
* Returns current query string.
*
* @return query string
*/
public String getQueryString() {
return queryString;
}
/**
* Sets query string.
*
* @param query querystring
*/
public void setQueryString(String query) {
this.queryString = query;
}
/**
* Returns the {@link SearchForm}.
*
* @return {@link SearchForm}
*/
public SearchForm getSearchForm() {
return searchForm;
}
/**
* Returns the {@link Query}.
*
* @return {@link Query}
*/
public Query getQuery() {
if(customerResult != null) {
return customerResult.getQuery();
}
return null;
}
/**
* Returns a {@link List} of {@link BreadCrumbItem}'s.
*
* @return {@link List} of {@link BreadCrumbItem}s
*/
public List getBreadcrumbs() {
if(customerResult != null && customerResult.getBreadCrumbList() != null) {
for(BreadCrumb b : customerResult.getBreadCrumbList().getItems()){
if("default".equalsIgnoreCase(b.getName())) {
return b.getItems();
}
}
}
return new ArrayList();
}
/**
* Returns the {@link Pagination}.
*
* @return {@link Pagination}
*/
public Pagination getPagination() {
if(customerResult != null) {
return customerResult.getPagination();
}
return null;
}
/**
* Returns a {@link List} of {@link Result}'s.
*
* @return {@link List} of {@link Result}s.
*/
public List getResults() {
if(customerResult != null && customerResult.getResultList() != null) {
for(ResultSet rs : customerResult.getResultList().getResultSets()) {
if("default".equalsIgnoreCase(rs.getName())) {
return rs.getItems();
}
}
}
return new ArrayList();
}
/**
* Returns a {@link String} containing the url to redirect to.
*
* @return {@link String} containing the url to redirect to
*/
public String getRedirect() {
if(shouldRedirect()) {
return customerResult.getRedirect().getTarget();
}
return "";
}
/**
* Returns a {@link Boolean} wether the request should be redirected
*
* @return {@link Boolean} wether the request should be redirected
*/
public boolean shouldRedirect() {
return (
customerResult != null &&
customerResult.getRedirect() != null &&
customerResult.getRedirect().getTarget() != null);
}
/**
* Returns a {@link Suggestions} object.
*
* @return {@link Suggestions} object
*/
public Suggestions getSuggestion() {
if(customerResult != null) {
return customerResult.getSuggestions();
}
return null;
}
/**
* Returns a {@link List} of {@link Suggestion}'s.
*
* @return {@link List} of {@link Suggestion}s
*/
public List getSuggestions() {
if(customerResult != null && customerResult.getSuggestions() != null) {
return customerResult.getSuggestions().getItems();
}
return new ArrayList();
}
/**
* Returns a {@link List} of {@link Facet}'s.
*
* @return {@link List} of {@link Facet}s.
*/
public List getFacets() {
//TODO
if(customerResult != null && customerResult.getFacetList() != null) {
return customerResult.getFacetList().getFacets();
}
return new ArrayList();
}
/**
* Returns the {@link Facet} with the specified name
or
* null
if it could not be found.
*
* @param name facet name
* @return {@link Facet} with specified name
*/
public Facet getFacet(String name) {
for(Facet facet : getFacets()) {
if(name.equals(facet.getTitle().trim())) {
return facet;
}
}
return null;
}
/**
* Returns a {@link List} of {@link Banner}s.
*
* @return {@link List} of {@link Banner}s
*
*/
public List getBanners() {
if(customerResult != null && customerResult.getBannerList() != null) {
return customerResult.getBannerList().getBanners();
}
return new ArrayList();
}
/**
* Returns the {@link Banner} for the specified bannerArea
or
* null
if it could not be found.
*
* @param bannerArea bannerArea
* @return {@link Banner}
*/
public Banner getBanner(String bannerArea) {
for(Banner banner: getBanners()){
if(banner.getArea().equals(bannerArea)){
return banner;
}
}
return null;
}
/**
* Returns a {@link List} of {@link Menu}s.
*
* @return list of menus
*/
public List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy