    /*
    Copyright (c) 2004, Plumtree Software

    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification,
    are permitted provided that the following conditions is met:

    Neither the name of Plumtree Software nor the names of its contributors may be used
    to endorse or promote products derived from this software without specific prior
    written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
    SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
    OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    */

    package com.plumtree.remote.googlesample.search;

    import com.google.soap.search.GoogleSearch;
    import com.google.soap.search.GoogleSearchFault;
    import com.google.soap.search.GoogleSearchResult;
    import com.google.soap.search.GoogleSearchResultElement;
    import com.plumtree.remote.ServiceException;
    import com.plumtree.remote.googlesample.Constants;
    import com.plumtree.remote.search.IRemoteSearch;
    import com.plumtree.remote.search.ISearchContext;
    import com.plumtree.remote.search.ISearchQuery;
    import com.plumtree.remote.search.ISearchResult;
    import com.plumtree.remote.search.ISearchUser;
    import com.plumtree.remote.search.*;
    import java.net.*;

    /**
    * basicSearch method for GoogleSearch
    */
    public class PtGoogleSearch implements IRemoteSearch
    {

    	/**
    	* Simple Google search- not using ISearchUser or ISearchContext
    	* Queries Google , gets result array, and turns into search result array
    	* @see com.plumtree.remote.search.IRemoteSearch#basicSearch(com.plumtree.remote.search.ISearchQuery, com.plumtree.remote.search.ISearchUser, com.plumtree.remote.search.ISearchContext)
    	*/
    	public ISearchResult basicSearch(
    		ISearchQuery searchQuery,
    		ISearchUser searchUser,
    		ISearchContext searchContext)
    		throws ServiceException
    	{
    		//get the key, query and image from getSearchInfo. The values were set in the Service Configuration Interface (SCI) page.
    		//if not using SCI pages, hard-code the key and image values below.
    		//getSearchInfo retrieves values set in the sci pages
    		String key = searchQuery.getSearchInfo().get(Constants.KEY);
    		String query = searchQuery.getSearchString();
    		String image = searchQuery.getSearchInfo().get(Constants.IMAGE);

    		//get the search result from the search query
    		ISearchResult searchResult = searchQuery.getSearchResult();

    		int startResult = searchQuery.getNumberToSkip();
    		int totalResults = 0;
    		try
    		{
    			//do the Google search
    			//see the Google documentation for more info
    			GoogleSearchResult result = null;
    			GoogleSearchResultElement[] elements = null;

    			GoogleSearch googleSearch =
    				new com.google.soap.search.GoogleSearch();

    			//encode the key as it may have + signs
    			googleSearch.setKey(URLEncoder.encode(key));
    			googleSearch.setQueryString(query);
    			googleSearch.setStartResult(startResult);
    			result = googleSearch.doSearch();
    			elements = result.getResultElements();

    			//Google search should have setDescriptionEncoded set to false
    			//as html is sometimes passed in the title or description
    			searchResult.setDescriptionEncoded(false);
    			searchResult.setTotalNumberOfHits(
    				result.getEstimatedTotalResultsCount());

    		  //put into the format for IRemoteSearch.basicSearch
    			int len = elements.length;
    			ISearchRecord[] records = new ISearchRecord[len];
    			for (int i = 0; i < len; i++)
    			{

    				RemoteSearchRecord record = new RemoteSearchRecord();
    				GoogleSearchResultElement element = elements[i];
    				record.setTitle(element.getTitle());
    				record.setDescription(element.getSummary());
    				record.setOpenDocumentURL(element.getURL());

    				//Google does not provide an image- the image came from the sci page
    				record.setImageURL(image);

    			  records[i] = record;
    			}

    			searchResult.setSearchResultList(records);

    		}
    		//if there are exceptions, return the message to the user using TYPE_OTHER_ERROR
    		//and the message string
    		catch (GoogleSearchFault sf)
    		{
    			throw new SearchException(
    				TypeSearchError.TYPE_OTHER_ERROR,
    				sf.getMessage());
    		}
    		catch (Exception e)
    		{
    			throw new SearchException(
    				TypeSearchError.TYPE_OTHER_ERROR,
    				e.getMessage());
    		}

    		return searchResult;
    	}

    }