Package org.eclipse.help.internal.webapp.data

Source Code of org.eclipse.help.internal.webapp.data.SearchData

/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.help.internal.webapp.data;

import java.util.ArrayList;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.help.internal.HelpPlugin;
import org.eclipse.help.internal.base.BaseHelpSystem;
import org.eclipse.help.internal.base.HelpBasePlugin;
import org.eclipse.help.internal.base.IHelpBaseConstants;
import org.eclipse.help.internal.search.ISearchQuery;
import org.eclipse.help.internal.search.QueryTooComplexException;
import org.eclipse.help.internal.search.SearchHit;
import org.eclipse.help.internal.search.SearchProgressMonitor;
import org.eclipse.help.internal.search.SearchQuery;
import org.eclipse.help.internal.search.SearchResults;
import org.eclipse.help.internal.webapp.HelpWebappPlugin;
import org.eclipse.help.internal.webapp.servlet.WebappWorkingSetManager;
import org.eclipse.help.internal.workingset.AdaptableToc;
import org.eclipse.help.internal.workingset.WorkingSet;

/**
* Helper class for searchView.jsp initialization
*/
public class SearchData extends ActivitiesData {
  private WebappWorkingSetManager wsmgr;

  // Request parameters
  private String topicHref;

  private String selectedTopicId = ""; //$NON-NLS-1$

  private String searchWord;

  private String workingSetName;

  // search results
  SearchHit[] hits;

  // percentage of indexing completion
  private int indexCompletion = 100;

  // QueryException if any
  private QueryTooComplexException queryException = null;
 
  private boolean showPotentialHits;

  /**
   * Constructs the xml data for the search resuls page.
   *
   * @param context
   * @param request
   */
  public SearchData(ServletContext context, HttpServletRequest request,
      HttpServletResponse response) {
    super(context, request, response);
    wsmgr = new WebappWorkingSetManager(request, response, getLocale());
    this.topicHref = request.getParameter("topic"); //$NON-NLS-1$
    if (topicHref != null && topicHref.length() == 0)
      topicHref = null;

    searchWord = request.getParameter("searchWord"); //$NON-NLS-1$

    // try loading search results or get the indexing progress info.
    if (isSearchRequest() && !isScopeRequest()) {
      loadSearchResults();
      if (queryException != null) {
        return;
      }
      if (!isProgressRequest()) {
        for (int i = 0; i < hits.length; i++) {
          // the following assume topic numbering as in searchView.jsp
          if (hits[i].getHref().equals(topicHref)) {
            selectedTopicId = "a" + i; //$NON-NLS-1$
            break;
          }
        }
      }
    }

    showPotentialHits = HelpBasePlugin.getDefault().getPluginPreferences()
      .getBoolean(IHelpBaseConstants.P_KEY_SHOW_POTENTIAL_HITS);
  }

  /**
   * Returns true when there is a search request
   *
   * @return boolean
   */
  public boolean isSearchRequest() {
    return (request.getParameter("searchWord") != null); //$NON-NLS-1$
  }

  /**
   * Return indexed completion percentage
   */
  public boolean isProgressRequest() {
    return (hits == null && indexCompletion != 100);
  }

  /**
   * Returns true when there is a request to change the scope (working set)
   */
  public boolean isScopeRequest() {
    return (request.getParameter("workingSet") != null); //$NON-NLS-1$
  }

  /**
   * Return the number of links
   *
   * @return int
   */
  public int getResultsCount() {
    return hits.length;
  }

  public String getSelectedTopicId() {
    return selectedTopicId;
  }

  public String getTopicHref(int i) {
    return UrlUtil.getHelpURL(hits[i].getHref());
  }

  public String getTopicLabel(int i) {
    return UrlUtil.htmlEncode(hits[i].getLabel());
  }

  public String getTopicTocLabel(int i) {
    if (hits[i].getToc() != null)
      return UrlUtil.htmlEncode(hits[i].getToc().getLabel());
    return ""; //$NON-NLS-1$
  }
 
  public String getTopicDescription(int i) {
    return UrlUtil.htmlEncode(hits[i].getDescription());
  }

  /**
   * @param i
   * @return true of result belong to an enabled TOC
   */
  public boolean isEnabled(int i) {
    String href = hits[i].getHref();
    return HelpBasePlugin.getActivitySupport().isEnabledTopic(href,
        getLocale());
  }
 
  /**
   * Returns whether or not the ith hit is a potential hit. This means
   * it may not be an actual hit (i.e. it found something in a filtered
   * section of the document).
   *
   * @param i the index of the hit to check
   * @return whether or not the hit is a potential hit
   */
  public boolean isPotentialHit(int i) {
    return (showPotentialHits && (getMode() != MODE_INFOCENTER) && hits[i].getFilters() != null);
  }

  /**
   * Return indexed completion percentage
   */
  public String getIndexedPercentage() {
    return String.valueOf(indexCompletion);
  }

  /**
   * Returns the search query
   */
  public String getSearchWord() {
    if (searchWord == null)
      return ""; //$NON-NLS-1$
    return searchWord;
  }

  /**
   * Returns the list of selected TOC's
   */
  public String[] getSelectedTocs() {
    String[] books = request.getParameterValues("scope"); //$NON-NLS-1$
    if (books == null) {
      // select all books
      TocData tocData = new TocData(context, request, response);
      books = new String[tocData.getTocCount()];
      for (int i = 0; i < books.length; i++)
        books[i] = tocData.getTocHref(i);
    }
    return books;
  }

  /**
   * Returns true if book is within a search scope
   */
  public boolean isTocSelected(int toc) {
    TocData tocData = new TocData(context, request, response);
    String href = tocData.getTocHref(toc);
    String[] books = request.getParameterValues("scope"); //$NON-NLS-1$
    if (books == null)
      return false;
    for (int i = 0; i < books.length; i++) {
      if (books[i].equals(href)) {
        return true;
      }
    }
    return false;
  }

  /**
   * Returns the working set selected. This is used to display the working set
   * name in the search banner.
   *
   * @return String
   */
  public String getScope() {
    if (workingSetName != null)
      return workingSetName;

    if (isScopeRequest()) {
      workingSetName = request.getParameter("workingSet"); //$NON-NLS-1$
    } else if (isSearchRequest()) {
      workingSetName = request.getParameter("scope"); //$NON-NLS-1$
      // if we have already set the working set, then use it.
      if (workingSetName == null)
        workingSetName = request.getParameter("workingSet"); //$NON-NLS-1$
    } else {
      workingSetName = wsmgr.getCurrentWorkingSet();
    }

    if (workingSetName == null || workingSetName.length() == 0
        || getMode() == RequestData.MODE_INFOCENTER
        && wsmgr.getWorkingSet(workingSetName) == null)
      workingSetName = ServletResources.getString("All", request); //$NON-NLS-1$
    return workingSetName;
  }

  /**
   * This method is used to persist the working set name and is called from
   * the search view, after each search
   */
  public void saveScope() {
    // if a working set is defined, set it in the preferences
    String workingSet = request.getParameter("scope"); //$NON-NLS-1$
    String lastWS = wsmgr.getCurrentWorkingSet();
    if (workingSet != null && !workingSet.equals(lastWS)) {
      wsmgr.setCurrentWorkingSet(workingSet);
    } else if (workingSet == null && lastWS != null && lastWS.length() > 0) {
      wsmgr.setCurrentWorkingSet(""); //$NON-NLS-1$
    }
  }

  /**
   * Call the search engine, and get results or the percentage of indexed
   * documents.
   */
  private void loadSearchResults() {
    try {
      SearchProgressMonitor pm = SearchProgressMonitor
          .getProgressMonitor(getLocale());
      if (pm.isDone()) {
        this.indexCompletion = 100;
        SearchResults results = createHitCollector();
        BaseHelpSystem.getSearchManager().search(createSearchQuery(),
            results, pm);
        hits = results.getSearchHits();
        if (hits == null) {
          HelpWebappPlugin
              .logWarning("No search results returned.  Help index is in use."); //$NON-NLS-1$
        }
        return;
      }
      // progress
      indexCompletion = pm.getPercentage();
      if (indexCompletion >= 100) {
        // 38573 We do not have results, so index cannot be 100
        indexCompletion = 100 - 1;
      }
      return;
    } catch (QueryTooComplexException qe) {
      queryException = qe;
    } catch (Exception e) {
      this.indexCompletion = 0;
    }

  }

  private ISearchQuery createSearchQuery() {
    String fieldSearchStr = request.getParameter("fieldSearch"); //$NON-NLS-1$
    boolean fieldSearch = fieldSearchStr != null ? new Boolean(
        fieldSearchStr).booleanValue() : false;
    return new SearchQuery(searchWord, fieldSearch, new ArrayList(),
        getLocale());
  }

  private SearchResults createHitCollector() {
    WorkingSet[] workingSets;
    if (request.getParameterValues("scopedSearch") == null) { //$NON-NLS-1$
      // scopes are working set names
      workingSets = getWorkingSets();
    } else {
      // scopes are books (advanced search)
      workingSets = createTempWorkingSets();
    }

    int maxHits = 500;
    String maxHitsStr = request.getParameter("maxHits"); //$NON-NLS-1$
    if (maxHitsStr != null) {
      try {
        int clientmaxHits = Integer.parseInt(maxHitsStr);
        if (0 < clientmaxHits && clientmaxHits < 500) {
          maxHits = clientmaxHits;
        }
      } catch (NumberFormatException nfe) {
      }
    }
    return new SearchResults(workingSets, maxHits, getLocale());
  }

  /**
   * @return WorkingSet[] or null
   */
  private WorkingSet[] getWorkingSets() {
    String[] scopes = request.getParameterValues("scope"); //$NON-NLS-1$
    if (scopes == null) {
      return null;
    }
    // confirm working set exists and use it
    ArrayList workingSetCol = new ArrayList(scopes.length);
    for (int s = 0; s < scopes.length; s++) {
      WorkingSet ws = wsmgr.getWorkingSet(scopes[s]);
      if (ws != null) {
        workingSetCol.add(ws);
      }
    }
    if (workingSetCol.size() == 0) {
      return null;
    }
    return (WorkingSet[]) workingSetCol
        .toArray(new WorkingSet[workingSetCol.size()]);
  }

  /**
   * @return WorkingSet[] or null
   */
  private WorkingSet[] createTempWorkingSets() {
    String[] scopes = request.getParameterValues("scope"); //$NON-NLS-1$
    if (scopes == null) {
      // it is possible that filtering is used, but all books are
      // deselected
      return new WorkingSet[0];
    }
    if (scopes.length == HelpPlugin.getTocManager().getTocs(getLocale()).length) {
      // do not filter if all books are selected
      return null;
    }
    // create working set from books
    ArrayList tocs = new ArrayList(scopes.length);
    for (int s = 0; s < scopes.length; s++) {
      AdaptableToc toc = wsmgr.getAdaptableToc(scopes[s]);
      if (toc != null) {
        tocs.add(toc);
      }
    }
    AdaptableToc[] adaptableTocs = (AdaptableToc[]) tocs
        .toArray(new AdaptableToc[tocs.size()]);
    WorkingSet[] workingSets = new WorkingSet[1];
    workingSets[0] = wsmgr.createWorkingSet("temp", adaptableTocs); //$NON-NLS-1$
    return workingSets;
  }

  public String getQueryExceptionMessage() {
    if (queryException == null) {
      return null;
    }
    return ServletResources.getString("searchTooComplex", request); //$NON-NLS-1$
  }

}
TOP

Related Classes of org.eclipse.help.internal.webapp.data.SearchData

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.