/*
 *  Copyright (c) 2005-2009, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 *  WSO2 Inc. licenses this file to you under the Apache License,
 *  Version 2.0 (the "License"); you may not use this file except
 *  in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 *
 */
package org.wso2.carbon.registry.admin.api.search;

import org.wso2.carbon.registry.core.exceptions.RegistryException;

/**
 * This provides functionality to search resources available in the registry by meta-data.
 * <p>
 * <strong> Using service clients for SearchService</strong>
 *
 * <p>
 * When using generated clients to access SearchService, ArrayOfString objects have to be used as
 * demonstrated in the following example.
 *
 * <p>
 * <i>Example : Searching resources created by "admin" and having "foo" as a property name </i>
 * <p>
 *
 * <code>
 * CustomSearchParameterBean parameterBean = new CustomSearchParameterBean(); <br>
 * ArrayOfString[] aos = new ArrayOfString[2]; // No. of parameters to be passed is 2, namely author
 *                                               and property name <br>
 * <br>
 * aos[0] = new ArrayOfString();   <br>
 * aos[0].addArray("author"); // search parameter name          <br>
 * aos[0].addArray("admin"); // search parameter value    <br>
 * <br>
 * aos[1] = new ArrayOfString();       <br>
 * aos[1].addArray("propertyName"); // search parameter name     <br>
 * aos[1].addArray("foo"); // search parameter value     <br>
 * <br>
 * parameterBean.setParameterValues(aos);        <br>
 * <br>
 * SearchAdminServiceStub ssClient = createSearchService(cookie, serverURL, configContext);    <br>
 * AdvancedSearchResultsBean bean = ssClient.getAdvancedSearchResults(parameterBean);  <br>
 * </code>
 *
 * <p>
 * CustomParameterBean encapsulates an ArrayOfString array which will contain all the parameters to
 * be sent to SearchService. Altogether, this array can have up to 13 elements each representing
 * "resourcePath", "author", "updater", "createdAfter", "createdBefore", "updatedAfter",
 * "updatedBefore", "commentWords", "tags", "propertyName", "propertyValue", "content" or
 * "mediaType". In the above case only "author" and "propertyName" have been used.
 * <p>
 * Each element should be an ArrayOfString object which has the parameter name (one of the 13 listed
 *  above) as the zeroth element and corresponding parameter value (search key) as the 1st element.
 * <p>
 * <br />
 * <b>Statistics:</b>
 * <ul>
 * <li>getSearchResults</li>
 * <li>getAdvancedSearchResults</li>
 * </ul>
 *
 * @param <CustomSearchParameterBean> a bean containing search parameters.
 * @param <SearchResultsBean> a bean storing results of basic search (tag search)
 * @param <AdvancedSearchResultsBean> a bean storing results of advanced search
 *
 */

public interface ISearchService <SearchResultsBean, AdvancedSearchResultsBean, CustomSearchParameterBean, MediaTypeValueList> {

	/**
	 * This method generates a search query that runs against the Registry and returns matching results
	 * @param searchType - String which indicates whether the search is a 'tag' search or a 'content' search
	 * @param criteria - The actual tags or content that needs to be searched for
	 * @return a bean containing an array of resource data of the results
	 * @throws RegistryException - if Registry is not available
	 */
	public abstract SearchResultsBean getSearchResults(String searchType,
			String criteria) throws RegistryException;

	/**
	 * This method generates a search query according to parameters passed, and runs this query against the Registry and returns matching resutls 
	 * @param parameters - Bean which contains a 2D array with parameters and their respective values
	 * @return a bean containing an array of resource data of the results
	 * @throws RegistryException - if Registry is not available
	 */
	public abstract AdvancedSearchResultsBean getAdvancedSearchResults(
			CustomSearchParameterBean parameters) throws RegistryException;

	/**
	 * Returns the 
	 * @param mediaType - String containing the media type. Ex: "application/xml"
	 * @return MediaTypeValueList
	 * @throws RegistryException
	 */
	public abstract MediaTypeValueList getMediaTypeSearch(String mediaType)
	throws RegistryException;

	/**
	 * Saves the advanced search fields as a filter for later retrieval
	 * @param queryBean - Bean with parameters and their respective values
	 * @param filterName - Name to be saved for this filter
	 * @throws RegistryException - if Registry is not available
	 */
	public abstract void saveAdvancedSearchFilter(
			CustomSearchParameterBean queryBean, String filterName)
	throws RegistryException;

	/**
	 * Returns the filter to populate advanced search fields
	 * @param filterName - Saved filter name
	 * @return - Bean with parameters and their respective values
	 * @throws RegistryException
	 */
	public abstract CustomSearchParameterBean getAdvancedSearchFilter(
			String filterName) throws RegistryException;

	/**
	 * Return names of all saved filters
	 * @return Array of String containing all saved filter names
	 * @throws RegistryException
	 */
	public abstract String[] getSavedFilters() throws RegistryException;

    /**
     * Delete a selected filter
     * @throws RegistryException
     */
    public void deleteFilter(String filterName) throws RegistryException;

}