All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opencms.search.CmsSearch Maven / Gradle / Ivy

Go to download

OpenCms is an enterprise-ready, easy to use website content management system based on Java and XML technology. Offering a complete set of features, OpenCms helps content managers worldwide to create and maintain beautiful websites fast and efficiently.

There is a newer version: 18.0
Show newest version
/*
 * This library is part of OpenCms -
 * the Open Source Content Management System
 *
 * Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * For further information about Alkacon Software GmbH & Co. KG, please see the
 * company website: http://www.alkacon.com
 *
 * For further information about OpenCms, please see the
 * project website: http://www.opencms.org
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package org.opencms.search;

import org.opencms.file.CmsObject;
import org.opencms.i18n.CmsEncoder;
import org.opencms.main.CmsException;
import org.opencms.main.CmsIllegalArgumentException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.search.CmsSearchParameters.CmsSearchFieldQuery;
import org.opencms.util.CmsStringUtil;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.commons.logging.Log;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.Sort;

/**
 * Helper class to access the search facility within a jsp.

* * Typically, the following fields are available for searching: *

    *
  • title - the title of a resource
  • *
  • keywords - the keywords of a resource
  • *
  • description - the description of a resource
  • *
  • content - the aggregated content of a resource
  • *
  • created - the creation date of a resource
  • *
  • lastmodified - the date of the last modification of a resource
  • *
  • path - the path to display the resource
  • *
  • channel - the channel of a resource
  • *
  • contentdefinition - the name of the content definition class of a resource
  • *
* * @since 6.0.0 */ public class CmsSearch { /** The log object for this class. */ private static final Log LOG = CmsLog.getLog(CmsSearch.class); /** The result categories of a search. */ protected Map m_categoriesFound; /** The cms object. */ protected transient CmsObject m_cms; /** The latest exception. */ protected Exception m_lastException; /** The URL which leads to the next result page. */ protected String m_nextUrl; /** The number of pages for the result list. */ protected int m_pageCount; /** The restriction for the search parameters, used for "search in search result". */ protected CmsSearchParameters m_parameterRestriction; /** The search parameters used for searching, build out of the given individual parameter values. */ protected CmsSearchParameters m_parameters; /** The URL which leads to the previous result page. */ protected String m_prevUrl; /** The current search result. */ protected List m_result; /** The search parameter String. */ protected String m_searchParameters; /** The total number of search results matching the query. */ protected int m_searchResultCount; /** Indicates if the parsed query was deliberately set on this instance. */ private boolean m_parsedQuerySet; /** * Default constructor, used to instantiate the search facility as a bean.

*/ public CmsSearch() { m_parameters = new CmsSearchParameters(); m_parameters.setSearchRoots(""); m_parameters.setSearchPage(1); m_searchResultCount = 0; m_parameters.setSort(CmsSearchParameters.SORT_DEFAULT); m_parameters.setFields(Arrays.asList(CmsSearchIndex.DOC_META_FIELDS)); m_parsedQuerySet = false; } /** * Adds an individual query for a search field.

* * If this is used, any setting made with {@link #setQuery(String)} and {@link #setField(String[])} * will be ignored and only the individual field search settings will be used.

* * When combining occurrences of SHOULD, MUST and MUST_NOT, keep the following in mind: * All SHOULD clauses will be grouped and wrapped in one query, * all MUST and MUST_NOT clauses will be grouped in another query. * This means that at least one of the terms which are given as a SHOULD query must occur in the * search result.

* * @param fieldQuery the field query to use * * @since 8.0.2 */ public void addFieldQuery(CmsSearchFieldQuery fieldQuery) { m_parameters.addFieldQuery(fieldQuery); resetLastResult(); } /** * Adds an individual query for a search field.

* * If this is used, any setting made with {@link #setQuery(String)} and {@link #setField(String[])} * will be ignored and only the individual field search settings will be used.

* * When combining occurrences of SHOULD, MUST and MUST_NOT, keep the following in mind: * All SHOULD clauses will be grouped and wrapped in one query, * all MUST and MUST_NOT clauses will be grouped in another query. * This means that at least one of the terms which are given as a SHOULD query must occur in the * search result.

* * @param fieldName the field name * @param searchQuery the search query * @param occur the occur parameter for the query in the field * * @since 7.5.1 */ public void addFieldQuery(String fieldName, String searchQuery, Occur occur) { addFieldQuery(new CmsSearchParameters.CmsSearchFieldQuery(fieldName, searchQuery, occur)); } /** * Adds an individual query for a search field that MUST occur.

* * If this is used, any setting made with {@link #setQuery(String)} and {@link #setField(String[])} * will be ignored and only the individual field search settings will be used.

* * When combining occurrences of SHOULD, MUST and MUST_NOT, keep the following in mind: * All SHOULD clauses will be grouped and wrapped in one query, * all MUST and MUST_NOT clauses will be grouped in another query. * This means that at least one of the terms which are given as a SHOULD query must occur in the * search result.

* * @param fieldName the field name * @param searchQuery the search query * * @since 7.5.1 */ public void addFieldQueryMust(String fieldName, String searchQuery) { addFieldQuery(fieldName, searchQuery, BooleanClause.Occur.MUST); } /** * Adds an individual query for a search field that MUST NOT occur.

* * If this is used, any setting made with {@link #setQuery(String)} and {@link #setField(String[])} * will be ignored and only the individual field search settings will be used.

* * When combining occurrences of SHOULD, MUST and MUST_NOT, keep the following in mind: * All SHOULD clauses will be grouped and wrapped in one query, * all MUST and MUST_NOT clauses will be grouped in another query. * This means that at least one of the terms which are given as a SHOULD query must occur in the * search result.

* * @param fieldName the field name * @param searchQuery the search query * * @since 7.5.1 */ public void addFieldQueryMustNot(String fieldName, String searchQuery) { addFieldQuery(fieldName, searchQuery, BooleanClause.Occur.MUST_NOT); } /** * Adds an individual query for a search field that SHOULD occur.

* * If this is used, any setting made with {@link #setQuery(String)} and {@link #setField(String[])} * will be ignored and only the individual field search settings will be used.

* * When combining occurrences of SHOULD, MUST and MUST_NOT, keep the following in mind: * All SHOULD clauses will be grouped and wrapped in one query, * all MUST and MUST_NOT clauses will be grouped in another query. * This means that at least one of the terms which are given as a SHOULD query must occur in the * search result.

* * @param fieldName the field name * @param searchQuery the search query * * @since 7.5.1 */ public void addFieldQueryShould(String fieldName, String searchQuery) { addFieldQuery(fieldName, searchQuery, BooleanClause.Occur.SHOULD); } /** * Returns true if a category overview should be shown as part of the result.

* * Please note: The calculation of the category count slows down the search time by an order * of magnitude. Make sure that you only use this feature if it's really required! * Be especially careful if your search result list can become large (> 1000 documents), since in this case * overall system performance will certainly be impacted considerably when calculating the categories.

* * @return true if a category overview should be shown as part of the result */ public boolean getCalculateCategories() { return m_parameters.getCalculateCategories(); } /** * Returns the search categories.

* * @return the search categories */ public String[] getCategories() { List l = m_parameters.getCategories(); return l.toArray(new String[l.size()]); } /** * Returns the maximum number of pages which should be shown.

* * @return the maximum number of pages which should be shown */ public int getDisplayPages() { return m_parameters.getDisplayPages(); } /** * Gets the current fields list.

* * @return the fields to search */ public String getFields() { if (m_parameters.getFields() == null) { return ""; } StringBuffer result = new StringBuffer(); Iterator it = m_parameters.getFields().iterator(); while (it.hasNext()) { result.append(it.next()); result.append(" "); } return result.toString(); } /** * Gets the name of the current search index.

* * @return the name of the index */ public String getIndex() { return m_parameters.getSearchIndex().getName(); } /** * Gets the last exception after a search operation.

* * @return the exception occurred in a search operation or null */ public Exception getLastException() { return m_lastException; } /** * Gets the number of matches displayed on each page.

* * @return matches per result page */ public int getMatchesPerPage() { return m_parameters.getMatchesPerPage(); } /** * Returns the maximum creation date a resource must have to be included in the search result.

* * @return the maximum creation date a resource must have to be included in the search result */ public long getMaxDateCreated() { return m_parameters.getMaxDateCreated(); } /** * Returns the maximum last modification date a resource must have to be included in the search result.

* * @return the maximum last modification date a resource must have to be included in the search result */ public long getMaxDateLastModified() { return m_parameters.getMaxDateLastModified(); } /** * Returns the minimum creation date a resource must have to be included in the search result.

* * @return the minimum creation date a resource must have to be included in the search result */ public long getMinDateCreated() { return m_parameters.getMinDateCreated(); } /** * Returns the minimum last modification date a resource must have to be included in the search result.

* * @return the minimum last modification date a resource must have to be included in the search result */ public long getMinDateLastModified() { return m_parameters.getMinDateLastModified(); } /** * Gets the URL for the link to the next result page.

* * @return the URL to the next result page */ public String getNextUrl() { return m_nextUrl; } /** * Creates a sorted map of URLs to link to other search result pages.

* * The key values are Integers representing the page number, the entry * holds the corresponding link.

* * @return a map with String URLs */ public Map getPageLinks() { Map links = new TreeMap(); if (m_pageCount <= 1) { return links; } int startIndex, endIndex; String link = m_cms.getRequestContext().getUri() + m_parameters.toQueryString() + "&searchPage="; if (getDisplayPages() < 1) { // number of displayed pages not limited, build a map with all available page links startIndex = 1; endIndex = m_pageCount; } else { // limited number of displayed pages, calculate page range int currentPage = getSearchPage(); int countBeforeCurrent = getDisplayPages() / 2; int countAfterCurrent; if ((currentPage - countBeforeCurrent) < 1) { // set count before to number of available pages countBeforeCurrent = currentPage - 1; } // set count after to number of remaining pages (- 1 for current page) countAfterCurrent = getDisplayPages() - countBeforeCurrent - 1; // calculate start and end index startIndex = currentPage - countBeforeCurrent; endIndex = currentPage + countAfterCurrent; // check end index if (endIndex > m_pageCount) { int delta = endIndex - m_pageCount; // decrease start index with delta to get the right number of displayed pages startIndex -= delta; // check start index to avoid values < 1 if (startIndex < 1) { startIndex = 1; } endIndex = m_pageCount; } } // build the sorted tree map of page links for (int i = startIndex; i <= endIndex; i++) { links.put(new Integer(i), (link + i)); } return links; } /** * Returns the search parameters used for searching, build out of the given individual parameter values.

* * @return the search parameters used for searching, build out of the given individual parameter values */ public CmsSearchParameters getParameters() { if (m_parameterRestriction != null) { m_parameters = m_parameters.restrict(m_parameterRestriction); } return m_parameters; } /** * Returns the parsed query.

* * The parsed query is automatically set by the OpenCms search index when a query is created * with either {@link #setQuery(String)} or {@link #addFieldQuery(CmsSearchFieldQuery)}. * The Lucene query build from the parameters is stored here and can be later used * for paging through the results.

* * Please note that this returns only to the query part, not the filter part of the search.

* * @return the parsed query */ public String getParsedQuery() { return m_parameters.getParsedQuery(); } /** * Gets the URL for the link to the previous result page.

* * @return the URL to the previous result page */ public String getPreviousUrl() { return m_prevUrl; } /** * Gets the current search query.

* * @return the current query string or null if no query was set before */ public String getQuery() { return m_parameters.getQuery(); } /** * Gets the minimum search query length.

* * @return the minimum search query length */ public int getQueryLength() { return m_parameters.getQueryLength(); } /** * Gets the current result page.

* * @return the current result page */ public int getSearchPage() { return m_parameters.getSearchPage(); } /** * Returns the search result for the current query, as a list of {@link CmsSearchResult} objects.

* * @return the search result (may be empty) or null if no index or query was set before */ public List getSearchResult() { if ((m_cms != null) && (m_result == null) && (m_parameters.getIndex() != null) && (m_parameters.isIgnoreQuery() || CmsStringUtil.isNotEmpty(m_parameters.getQuery()) || CmsStringUtil.isNotEmpty(m_parameters.getParsedQuery()) || (m_parameters.getFieldQueries() != null))) { if (!m_parameters.isIgnoreQuery() && CmsStringUtil.isEmpty(m_parameters.getParsedQuery()) && (getQueryLength() > 0)) { if (m_parameters.getFieldQueries() != null) { // check all field queries if the length of the query is ok for (CmsSearchParameters.CmsSearchFieldQuery fq : m_parameters.getFieldQueries()) { for (String keyword : fq.getSearchTerms()) { if (CmsStringUtil.isEmpty(keyword) || (keyword.trim().length() < getQueryLength())) { m_lastException = new CmsSearchException( Messages.get().container( Messages.ERR_QUERY_TOO_SHORT_1, new Integer(getQueryLength()))); return null; } } } } else if (m_parameters.getQuery().trim().length() < getQueryLength()) { m_lastException = new CmsSearchException( Messages.get().container(Messages.ERR_QUERY_TOO_SHORT_1, new Integer(getQueryLength()))); return null; } } try { CmsSearchResultList result = m_parameters.getSearchIndex().search(m_cms, getParameters()); if (result.size() > 0) { m_result = result; m_searchResultCount = result.getHitCount(); m_categoriesFound = result.getCategories(); // re-caluclate the number of pages for this search result m_pageCount = m_searchResultCount / m_parameters.getMatchesPerPage(); if ((m_searchResultCount % m_parameters.getMatchesPerPage()) != 0) { m_pageCount++; } // re-calculate the URLs to browse forward and backward in the search result String url = m_cms.getRequestContext().getUri() + m_parameters.toQueryString() + "&searchPage="; if (m_parameters.getSearchPage() > 1) { m_prevUrl = url + (m_parameters.getSearchPage() - 1); } if (m_parameters.getSearchPage() < m_pageCount) { m_nextUrl = url + (m_parameters.getSearchPage() + 1); } } else { m_result = Collections.emptyList(); m_searchResultCount = 0; m_categoriesFound = null; m_pageCount = 0; m_prevUrl = null; m_nextUrl = null; } } catch (Exception exc) { if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_SEARCHING_FAILED_0), exc); } m_result = null; m_searchResultCount = 0; m_pageCount = 0; m_lastException = exc; } } return m_result; } /** * Returns a map of categories (Strings) for the last search result, mapped to the hit count (Integer) of * the documents in this category, or null if the categories have not been calculated.

* * @return a map of categories for the last search result * * @see CmsSearch#getCalculateCategories() * @see CmsSearch#setCalculateCategories(boolean) */ public Map getSearchResultCategories() { return m_categoriesFound; } /** * Returns the total number of search results matching the query.

* * @return the total number of search results matching the query */ public int getSearchResultCount() { return m_searchResultCount; } /** * Returns the search roots.

* * Only resources that are sub-resources of one of the search roots * are included in the search result.

* * The search roots are used in addition to the current site root * of the user performing the search.

* * By default, the search roots contain only one entry with an empty string.

* * @return the search roots */ public String[] getSearchRoots() { List l = m_parameters.getRoots(); return l.toArray(new String[l.size()]); } /** * Returns the sort order used for sorting the results of s search.

* * @return the sort order used for sorting the results of s search */ public Sort getSortOrder() { return m_parameters.getSort(); } /** * Initializes the bean with the cms object.

* * @param cms the cms object */ public void init(CmsObject cms) { m_cms = cms; m_result = null; m_lastException = null; m_pageCount = 0; m_nextUrl = null; m_prevUrl = null; } /** * Sets the flag that controls calculation of result categories for the next search, * use this only if it's really required since the search can become very slow using this option.

* * Please note: The calculation of the category count slows down the search time by an order * of magnitude. Make sure that you only use this feature if it's really required! * Be especially careful if your search result list can become large (> 1000 documents), since in this case * overall system performance will certainly be impacted considerably when calculating the categories.

* * @param calculateCategories if true, the category count will be calculated for the next search */ public void setCalculateCategories(boolean calculateCategories) { m_parameters.setCalculateCategories(calculateCategories); } /** * Sets the search categories, all search results must be in one of the categories, * the category set must match the indexed category exactly.

* * All categories will automatically be trimmed and lower cased, since search categories * are also stored this way in the index.

* * @param categories the categories to set */ public void setCategories(String[] categories) { List setCategories = new ArrayList(); if (categories != null) { if (categories.length != 0) { // ensure all categories are not null, trimmed, not-empty and lowercased String cat; for (int i = 0; i < categories.length; i++) { cat = categories[i]; if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(cat)) { // all categories must internally be lower case, // since the index keywords are lower cased as well cat = cat.trim().toLowerCase(); setCategories.add(cat); } } } } m_parameters.setCategories(setCategories); resetLastResult(); } /** * Sets the maximum number of pages which should be shown.

* * Enter an odd value to achieve a nice, "symmetric" output.

* * @param value the maximum number of pages which should be shown */ public void setDisplayPages(int value) { m_parameters.setDisplayPages(value); } /** * Controls if the excerpt from a field is generated only for searched fields, or for all fields (the default).

* * The default setting is false, which means all text fields configured for the excerpt will * be used to generate the excerpt, regardless if they have been searched in or not.

* * Please note: A field will only be included in the excerpt if it has been configured as excerpt="true" * in opencms-search.xml. This method controls if so configured fields are used depending on the * fields searched, see {@link #setField(String[])}.

* * @param value if true, the excerpt is generated only from the fields actually searched in */ public void setExcerptOnlySearchedFields(boolean value) { m_parameters.setExcerptOnlySearchedFields(value); resetLastResult(); } /** * Sets the fields to search.

* * If the fields are set to null, * or not set at all, the default fields "content" and "meta" are used.

* * For a list of valid field names, see the Interface constants of * {@link org.opencms.search.documents.I_CmsDocumentFactory}. * * @param fields the fields to search */ public void setField(String[] fields) { m_parameters.setFields(Arrays.asList(fields)); resetLastResult(); } /** * Set the name of the index to search.

* * A former search result will be deleted.

* * @param indexName the name of the index */ public void setIndex(String indexName) { resetLastResult(); if (CmsStringUtil.isNotEmpty(indexName)) { try { CmsSearchIndex index = OpenCms.getSearchManager().getIndex(indexName); if (index == null) { throw new CmsException(Messages.get().container(Messages.ERR_INDEX_NOT_FOUND_1, indexName)); } m_parameters.setSearchIndex(index); } catch (Exception exc) { if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_INDEX_ACCESS_FAILED_1, indexName), exc); } m_lastException = exc; } } } /** * Sets the number of matches per page.

* * @param matches the number of matches per page */ public void setMatchesPerPage(int matches) { m_parameters.setMatchesPerPage(matches); resetLastResult(); } /** * Sets the maximum creation date a resource must have to be included in the search result.

* * @param maxDateCreated the maximum creation date to set */ public void setMaxDateCreated(String maxDateCreated) { m_parameters.setMaxDateCreated(CmsStringUtil.getLongValue(maxDateCreated, Long.MAX_VALUE, "maxDateCreated")); } /** * Sets the maximum last modification date a resource must have to be included in the search result.

* * @param maxDateLastModified the maximum last modification date to set */ public void setMaxDateLastModified(String maxDateLastModified) { m_parameters.setMaxDateLastModified( CmsStringUtil.getLongValue(maxDateLastModified, Long.MAX_VALUE, "maxDateLastModified")); } /** * Sets the minimum creation date a resource must have to be included in the search result.

* * @param minDateCreated the minimum creation date to set */ public void setMinDateCreated(String minDateCreated) { m_parameters.setMinDateCreated(CmsStringUtil.getLongValue(minDateCreated, Long.MIN_VALUE, "minDateCreated")); } /** * Sets the minimum last modification date a resource must have to be included in the search result.

* * @param minDateLastModified he minimum last modification date to set */ public void setMinDateLastModified(String minDateLastModified) { m_parameters.setMinDateLastModified( CmsStringUtil.getLongValue(minDateLastModified, Long.MIN_VALUE, "minDateLastModified")); } /** * Set the parameters to use if a non null instance is provided.

* * @param parameters the parameters to use for the search if a non null instance is provided * */ public void setParameters(CmsSearchParameters parameters) { if (parameters != null) { m_parameters = parameters; } } /** * Sets the parsed query, which will be parameter decoded first.

* * The parsed query is automatically set by the OpenCms search index when a query is created * with either {@link #setQuery(String)} or {@link #addFieldQuery(CmsSearchFieldQuery)}. * The Lucene query build from the parameters is stored here and can be later used * for paging through the results.

* * Please note that this applies only to the query part, not the filter part of the search.

* * @param parsedQuery the parsed query to set */ public void setParsedQuery(String parsedQuery) { try { m_parsedQuerySet = true; m_parameters.setParsedQuery(CmsEncoder.decodeParameter(parsedQuery)); } catch (CmsIllegalArgumentException iae) { m_lastException = iae; } } /** * Sets the search query.

* * The syntax of the query depends on the search engine used. * A former search result will be deleted.

* * @param query the search query (escaped format) */ public void setQuery(String query) { try { m_parameters.setQuery(CmsEncoder.decodeParameter(query)); } catch (CmsIllegalArgumentException iae) { m_lastException = iae; } resetLastResult(); } /** * Sets the minimum length of the search query.

* * @param length the minimum search query length */ public void setQueryLength(int length) { m_parameters.setQueryLength(length); } /** * Limits the search to a given of resource type only.

* * @param resourceType the resource type to limit the search result to * * @since 7.5.1 */ public void setResourceType(String resourceType) { setResourceTypes(new String[] {resourceType}); } /** * Limits the search to a given list of resource types only.

* * @param resourceTypes the resource types to limit the search result to */ public void setResourceTypes(String[] resourceTypes) { if (resourceTypes != null) { m_parameters.setResourceTypes(Arrays.asList(resourceTypes)); } else { m_parameters.setResourceTypes(null); } resetLastResult(); } /** * Restrict the result of the next search to the results of the last search, * restricted with the provided parameters.

* * Use this for "seach in search result" functions.

* * @param restriction the restriction to use * * @see CmsSearchParameters#restrict(CmsSearchParameters) */ public void setResultRestriction(CmsSearchParameters restriction) { resetLastResult(); m_parameterRestriction = restriction; } /** * Sets the current result page.

* * Works with jsp bean mechanism for request parameter "searchPage" * that is generated here for page links.

* * @param page the current result page */ public void setSearchPage(int page) { m_parameters.setSearchPage(page); resetLastResult(); } /** * Convenience method to set exactly one search root.

* * @param searchRoot the search root to set * * @see #setSearchRoots(String[]) */ public void setSearchRoot(String searchRoot) { setSearchRoots(CmsStringUtil.splitAsArray(searchRoot, ",")); } /** * Sets the search root list.

* * Only resources that are sub-resources of one of the search roots * are included in the search result.

* * The search roots set here are used in addition to the current site root * of the user performing the search.

* * By default, the search roots contain only one entry with an empty string.

* * @param searchRoots the search roots to set */ public void setSearchRoots(String[] searchRoots) { List l = new ArrayList(Arrays.asList(searchRoots)); m_parameters.setRoots(l); resetLastResult(); } /** * Sets the sort order used for sorting the results of s search.

* * @param sortOrder the sort order to set */ public void setSortOrder(Sort sortOrder) { m_parameters.setSort(sortOrder); resetLastResult(); } /** * Resets the last search result.

*/ private void resetLastResult() { m_result = null; m_lastException = null; m_categoriesFound = null; m_parameterRestriction = null; if (!m_parsedQuerySet) { // don't reset parsed query if it was deliberately set, otherwise initializing search bean from JSP might fail m_parameters.setParsedQuery(null); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy