/* See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * Esri 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 com.esri.gpt.control.georss; import com.esri.gpt.catalog.discovery.SpatialClause; import com.esri.gpt.catalog.discovery.rest.RestQuery; import com.esri.gpt.catalog.discovery.rest.RestQueryParser; import com.esri.gpt.catalog.search.ASearchEngine; import com.esri.gpt.catalog.search.GetRecordsGenerator; import com.esri.gpt.catalog.search.ISearchFilterSpatialObj; import com.esri.gpt.catalog.search.OpenSearchProperties; import com.esri.gpt.catalog.search.ResourceLinkBuilder; import com.esri.gpt.catalog.search.SearchCriteria; import com.esri.gpt.catalog.search.SearchEngineCSW; import com.esri.gpt.catalog.search.SearchEngineFactory; import com.esri.gpt.catalog.search.SearchException; import com.esri.gpt.catalog.search.SearchFilterContentTypes; import com.esri.gpt.catalog.search.SearchFilterHarvestSites; import com.esri.gpt.catalog.search.SearchFilterKeyword; import com.esri.gpt.catalog.search.SearchFilterPagination; import com.esri.gpt.catalog.search.SearchFilterSort; import com.esri.gpt.catalog.search.SearchFilterSpatial; import com.esri.gpt.catalog.search.SearchFilterTemporal; import com.esri.gpt.catalog.search.SearchFilterThemeTypes; import com.esri.gpt.catalog.search.SearchFiltersList; import com.esri.gpt.catalog.search.SearchResult; import com.esri.gpt.catalog.search.SearchResultRecords; import com.esri.gpt.control.georss.dcatcache.DcatCache; import com.esri.gpt.control.georss.dcatcache.DcatCacheUpdateRequest; import com.esri.gpt.framework.context.BaseServlet; import com.esri.gpt.framework.context.RequestContext; import com.esri.gpt.framework.jsf.FacesContextBroker; import com.esri.gpt.framework.jsf.MessageBroker; import com.esri.gpt.framework.util.Val; import com.esri.gpt.server.csw.provider.local.CoreQueryables; import de.tudresden.gis.search.SearchFilterGeooperators; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet end-point for rest based catalog query requests. */ public class RestQueryServlet extends BaseServlet { public final static String EXTRA_REST_ARGS_MAP = "EXTRA_REST_ARGS_MAP"; public final static String PARAM_KEY_SHOW_THUMBNAIL = "showThumbnail"; public final static String PARAM_KEY_SHOW_RELATIVE_URLS = "showRelativeUrl"; public final static String PARAM_KEY_IS_JSFREQUEST = "isJsfRequest"; /** * constructors ============================================================ */ /** * Default constructor. */ public RestQueryServlet() { } /** * methods ================================================================= */ /** * Processes the HTTP request. * * @param request the HTTP request. * @param response HTTP response. * @param context request context * @throws Exception if an exception occurs */ @Override protected void execute(HttpServletRequest request, HttpServletResponse response, RequestContext context) throws Exception { getLogger().finer("Handling rest query string=" + request.getQueryString()); MessageBroker msgBroker = new FacesContextBroker(request, response).extractMessageBroker(); // extra params Map<String, String> extraMap = new HashMap<String, String>(); extraMap.put(PARAM_KEY_SHOW_THUMBNAIL, request.getParameter(PARAM_KEY_SHOW_THUMBNAIL)); extraMap.put(PARAM_KEY_SHOW_RELATIVE_URLS, request.getParameter(PARAM_KEY_SHOW_RELATIVE_URLS)); extraMap.put(PARAM_KEY_IS_JSFREQUEST, request.getParameter(PARAM_KEY_IS_JSFREQUEST)); context.getObjectMap().put(EXTRA_REST_ARGS_MAP, extraMap); if (request.getScheme().toLowerCase().equals("https") && extraMap.get(PARAM_KEY_SHOW_THUMBNAIL) == null) { String agent = request.getHeader("user-agent"); if (agent != null && agent.toLowerCase().indexOf("msie") > -1) { extraMap.put(PARAM_KEY_SHOW_THUMBNAIL, "false"); } } // parse the query RestQuery query = null; try { query = parseRequest(request, context); } catch (Throwable t) { getLogger().log(Level.SEVERE, "Error parsing request.", t); } if (query == null) { query = new RestQuery(); } // establish the response content type, print writer and feed writer RestQueryServlet.ResponseFormat format = getResponseFormat(request, query); String sFormat = getRequestParameter(request, "f"); FeedWriter2 feedWriter2 = WriterFactory.createWriter( sFormat, msgBroker, query, request, response, context); FeedWriter feedWriter = null; PrintWriter printWriter = null; if (feedWriter2 != null) { feedWriter = (FeedWriter) feedWriter2; } else { this.setResponseContentType(request, response, query); printWriter = response.getWriter(); feedWriter = makeFeedWriter(request, context, printWriter, msgBroker, query); } // execute the query, write the response try { if (format == RestQueryServlet.ResponseFormat.xjson) { String callback = request.getParameter("callback"); if (callback != null) { printWriter.print(callback + "("); } // init query query.setReturnables(new CoreQueryables(context).getFull()); toSearchCriteria(request, context, query); feedWriter.write(JsonSearchEngine.createInstance().search(request, response, context, query)); if (callback != null) { printWriter.print(")"); } }else if (format == RestQueryServlet.ResponseFormat.dcat) { String callback = request.getParameter("callback"); if (callback != null) { printWriter.print(callback + "("); } // The following part of the code has been disabled since DCAT content // is being cached. query.setReturnables(new CoreQueryables(context).getFull()); toSearchCriteria(request, context, query); feedWriter.write(DcatJsonSearchEngine.createInstance().search(request, response, context, query)); if (callback != null) { printWriter.print(")"); } } else { SearchResult result = executeQuery1(request, context, msgBroker, query); if (feedWriter instanceof FeedWriter2) { ((FeedWriter2) feedWriter).write(result); } else if (feedWriter instanceof HtmlAdvancedWriter) { ((HtmlAdvancedWriter) feedWriter).write(result); } else { feedWriter.write(new SearchResultRecordsAdapter(result.getRecords())); } } } catch (Exception e) { getLogger().log(Level.SEVERE, "Error executing query.", e); if (feedWriter instanceof FeedWriter2) { ((FeedWriter2) feedWriter).writeError(e); } else { // feedWriter.write(new SearchResultRecords()); String msg = Val.chkStr(e.getMessage()); if (msg.length() == 0) { msg = e.toString(); } printWriter = null; response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, msg); } } finally { try { if (printWriter != null && (feedWriter instanceof FeedWriter2) == false) { printWriter.flush(); } } catch (Exception ef) { getLogger().log(Level.INFO, "Error while flushing printwriter", ef); } } } /** * Execute Query that returns a SearchResult object (SearchResult as opposed * to the SearchResultRecord which executeQuery does). * * @param request the request * @param context the context * @param messageBroker the message broker * @param query the query * @return the search result * @throws SearchException the search exception */ protected SearchResult executeQuery1(HttpServletRequest request, RequestContext context, MessageBroker messageBroker, RestQuery query) throws SearchException { // make the search engine ASearchEngine engine = null; SearchCriteria criteria = this.toSearchCriteria(request, context, query); SearchResult result = new SearchResult(); String rid = Val.chkStr(query.getRepositoryId()); RestQueryServlet.ResponseFormat format = getResponseFormat(request, query); boolean isJavascriptEnabled = Val.chkBool(request.getParameter("isJavascriptEnabled"), false); if (format.toString().toLowerCase().startsWith("searchpage") || isJavascriptEnabled == true) { if (format.toString().toLowerCase().startsWith("searchpage")) { @SuppressWarnings("unchecked") Map<String, String> extraArgs = (Map<String, String>) context .getObjectMap().get(EXTRA_REST_ARGS_MAP); if (extraArgs != null) { if (extraArgs.get(PARAM_KEY_SHOW_RELATIVE_URLS) == null) { extraArgs.put(PARAM_KEY_SHOW_RELATIVE_URLS, "true"); } extraArgs.put(PARAM_KEY_IS_JSFREQUEST, "true"); } } context.setViewerExecutesJavascript(true); } else { context.setViewerExecutesJavascript(false); } ResourceLinkBuilder rBuild = ResourceLinkBuilder.newBuilder(context, request, messageBroker); // handle a request against the local repository if ((rid.length() == 0) || rid.equalsIgnoreCase("local")) { // generate the CSW request string String cswRequest = ""; try { GetRecordsGenerator grg = new GetRecordsGenerator(context); cswRequest = grg.generateCswRequest(query); } catch (Exception e) { throw new SearchException(e); } // execute the query engine = SearchEngineFactory.createSearchEngine(criteria, result, context, messageBroker); SearchEngineCSW csw = (SearchEngineCSW) engine; csw.setResourceLinkBuilder(rBuild); csw.doSearch(cswRequest); // handle a request against a remote repository } else { // create the criteria, execute the query int iSearchTime = Val.chkInt(request.getParameter("maxSearchTimeMilliSec"), -1); engine = SearchEngineFactory.createSearchEngine(criteria, result, context, rid, messageBroker); engine.setResourceLinkBuilder(rBuild); if (iSearchTime > 0) { engine.setConnectionTimeoutMs(iSearchTime); engine.setResponseTimeout(iSearchTime); } engine.doSearch(); } // set the OpenSearch properties String basePath = RequestContext.resolveBaseContextPath(request); String osURL = basePath + "/openSearchDescription"; //String osURL = request.getRequestURL().toString(); //osURL = osURL.replaceAll("/rest/find/document","/openSearchDescription"); OpenSearchProperties osProps = new OpenSearchProperties(); osProps.setShortName(messageBroker.retrieveMessage("catalog.openSearch.shortName")); osProps.setDescriptionURL(osURL); osProps.setNumberOfHits(result.getMaxQueryHits()); osProps.setStartRecord(query.getFilter().getStartRecord()); osProps.setRecordsPerPage(query.getFilter().getMaxRecords()); result.getRecords().setOpenSearchProperties(osProps); return result; } /** * Executes the query. * * @param request the HTTP request * @param context the request context * @param messageBroker the resource message broker * @param query the query to execute * @return the resultant records * @throws SearchException if an exception occurs */ protected SearchResultRecords executeQuery(HttpServletRequest request, RequestContext context, MessageBroker messageBroker, RestQuery query) throws SearchException { return this.executeQuery1(request, context, messageBroker, query) .getRecords(); } /** * Gets the HTTP request parameter value associated with a key. * * @param request the HTTP request * @param parameterKey the parameter key * @return parameter value (empty string if not found, trimmed never null) */ protected String getRequestParameter(HttpServletRequest request, String parameterKey) { Map<String, String[]> parMap = request.getParameterMap(); for (Map.Entry<String, String[]> e : parMap.entrySet()) { if (e.getKey().equalsIgnoreCase(parameterKey)) { if (e.getValue().length > 0) { return Val.chkStr(e.getValue()[0]); } else { return ""; } } } return ""; } /** * Sets the HTTP content type for the response. * * @param request the HTTP request * @param response the HTTP response * @param query the rest query */ protected void setResponseContentType(HttpServletRequest request, HttpServletResponse response, RestQuery query) { String fmt = Val.chkStr(query.getResponseFormat()); if (fmt.equalsIgnoreCase("sitemap") || fmt.toLowerCase().startsWith("sitemap.")) { response.setContentType("text/xml;charset=UTF-8"); return; } switch (getResponseFormat(request, query)) { case georss: response.setContentType("application/rss+xml;charset=UTF-8"); break; case html: case searchpageresults: case searchpage: case htmlfragment: response.setContentType("text/html;charset=UTF-8"); break; case atom: response.setContentType("application/atom+xml;charset=UTF-8"); break; case dcat: response.setContentType("application/json;charset=UTF-8"); response.setHeader("Content-disposition", "attachment; filename=\"dcat.json\""); break; case json: response.setContentType("application/json;charset=UTF-8"); response.setHeader("Content-disposition", "attachment; filename=\"document.json\""); break; case pjson: case xjson: response.setContentType("text/plain;charset=UTF-8"); break; default: case kml: response.setContentType("application/vnd.google-earth.kml+xml;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment; filename=\"document.kml\""); break; } } /** * Determines the response format. * * @param request the HTTP request * @param query the rest query * @return the response format */ protected RestQueryServlet.ResponseFormat getResponseFormat(HttpServletRequest request, RestQuery query) { String sFormat = ""; if (query != null) { sFormat = Val.chkStr(query.getResponseFormat()); } if (sFormat.length() == 0) { sFormat = getRequestParameter(request, "f"); } return RestQueryServlet.ResponseFormat.checkValueOf(sFormat); } /** * Initializes the servlet. <br/>Init parameter "bundleBaseName" is read for * message configuration. * * @param config the servlet configuration * @throws ServletException if an exception occurs */ @Override public void init(ServletConfig config) throws ServletException { super.init(config); } /** * Makes a writer capable of generating an appropriate response based upon the * requested response format. * * @param request the HTTP request * @param context the request context * @param printWriter the underlying print writer * @param messageBroker the message broker * @param query the query * @return the appropriate writer */ protected FeedWriter makeFeedWriter(HttpServletRequest request, RequestContext context, PrintWriter printWriter, MessageBroker messageBroker, RestQuery query) { String fmt = Val.chkStr(query.getResponseFormat()); if (fmt.equalsIgnoreCase("sitemap") || fmt.toLowerCase().startsWith("sitemap.")) { context.getObjectMap().put( "com.esri.gpt.catalog.search.isSitemapRequest", "true"); return new SitemapWriter(request, context, printWriter, messageBroker, query); } RestQueryServlet.ResponseFormat format = getResponseFormat(request, query); String sTarget = query.getResponseTarget(); RecordSnippetWriter.Target target = RecordSnippetWriter.Target.checkValueOf(sTarget); // HTML writer if (format.equals(RestQueryServlet.ResponseFormat.html)) { HtmlFeedWriter htmlFeedWriter = new HtmlFeedWriter( messageBroker, printWriter); htmlFeedWriter.setTarget(target); String[] responseStyle = query.getResponseStyle().split(","); htmlFeedWriter.setStyleUrl(responseStyle); return htmlFeedWriter; // HTML fragment writer } else if (format.equals(RestQueryServlet.ResponseFormat.htmlfragment)) { HtmlFragmentFeedWriter htmlFeedWriter = new HtmlFragmentFeedWriter( messageBroker, printWriter); htmlFeedWriter.setTarget(target); return htmlFeedWriter; // KML writer } else if (format.equals(RestQueryServlet.ResponseFormat.kml)) { KmlFeedWriter kmlFeedWriter = new KmlFeedWriter( messageBroker, printWriter); kmlFeedWriter.setTarget(target); String responseGeometry = query.getResponseGeometry(); kmlFeedWriter.setGeometry(KmlFeedWriter.Geometry.checkValueOf(responseGeometry)); return kmlFeedWriter; // ATOM writer } else if (format.equals(RestQueryServlet.ResponseFormat.atom)) { AtomFeedWriter atomWriter = new AtomFeedWriter(printWriter); atomWriter.setEntryBaseUrl(query.getRssProviderUrl()); atomWriter.set_messageBroker(messageBroker); atomWriter.setTarget(target); return atomWriter; // JSON and PJSON writer } else if (format.equals(RestQueryServlet.ResponseFormat.json) || format.equals(RestQueryServlet.ResponseFormat.pjson)) { JsonFeedWriter jsonWriter = new JsonFeedWriter(printWriter, query, format == RestQueryServlet.ResponseFormat.pjson); jsonWriter.setCallback(request.getParameter("callback")); jsonWriter.setMessageBroker(messageBroker); return jsonWriter; // Normalized DCAT JSON writer } else if (format.equals(RestQueryServlet.ResponseFormat.dcat)) { DcatJsonFeedWriter jsonWriter = new DcatJsonFeedWriter(request, context, printWriter, query, true); jsonWriter.setMessageBroker(messageBroker); return jsonWriter; // Normalized JSON writer } else if (format.equals(RestQueryServlet.ResponseFormat.xjson)) { ExtJsonFeedWriter jsonWriter = ExtJsonFeedWriter.createInstance(request, context, printWriter, query, true); jsonWriter.setMessageBroker(messageBroker); return jsonWriter; // Advanced html writer } else if (format.equals(RestQueryServlet.ResponseFormat.searchpageresults) || format.equals(RestQueryServlet.ResponseFormat.searchpage)) { HtmlAdvancedWriter htmlAdvWriter = new HtmlAdvancedWriter(); htmlAdvWriter.setRequestContext(context); htmlAdvWriter.setCriteria(this.toSearchCriteria(request, context, query)); htmlAdvWriter.setResultsOnly( format.equals(RestQueryServlet.ResponseFormat.searchpageresults)); return htmlAdvWriter; // default: GEORSS writer } else { GeorssFeedWriter rssWriter = new GeorssFeedWriter( messageBroker, printWriter, query.getRssProviderUrl(), query.getRssSourceUrl()); rssWriter.setTarget(target); String responseGeometry = query.getResponseGeometry(); rssWriter.setGeometry(GeorssFeedWriter.Geometry.checkValueOf(responseGeometry)); return rssWriter; } } /** * Parses the request and generates a populated query suitable for execution. * <p/> * This method essentially uses URL key-value pairs to generate filter and * response components for a rest based query. * <p/> * This method is the primary extensibility point for the rest API. Code * example for this method given below for reference during extension. * <code> * <pre> *RestQuery query = new RestQuery(); * RestQueryParser parser = new RestQueryParser(request,context,query); * * parser.parseRepositoryId("rid"); * parser.parseResponseFormat("f"); * parser.parseResponseGeometry("geometryType"); * parser.parseResponseStyle("style"); * parser.parseResponseTarget("target"); * parser.parseStartRecord("start",1); * parser.parseMaxRecords("max",10); * parser.parsePropertyIsEqualTo("uuid","uuid"); * parser.parsePropertyIsLike("searchText","anytext"); * parser.parsePropertyList("contentType","dc:type",",",true); * parser.parsePropertyList("dataCategory","dc:subject",",",true); * parser.parsePropertyRange("after","before","dct:modified"); * parser.parseSpatialClause("bbox","spatialRel","geometry"); * parser.parseSortables("orderBy"); * return query; * </pre> * </code> * * @param request the HTTP request * @param context the request context * @return the populated rest query */ protected RestQuery parseRequest(HttpServletRequest request, RequestContext context) { RestQuery query = new RestQuery(); RestQueryParser parser = new RestQueryParser(request, context, query); parser.parseResponseFormat("f"); String requestURI = Val.chkStr(request.getRequestURI()); if (requestURI.toLowerCase().endsWith("/sitemap")) { String tmp = Val.chkStr(query.getResponseFormat()); if (tmp.length() == 0) { query.setResponseFormat("sitemap"); } } parser.parseRepositoryId("rid"); parser.parseResponseFormat("f"); parser.parseResponseGeometry("geometryType"); parser.parseResponseStyle("style"); parser.parseResponseTarget("target"); parser.parseStartRecord("start", 1); parser.parseMaxRecords("max", 10); parser.parsePropertyIsEqualTo("uuid", "uuid"); parser.parsePropertyIsLike("searchText", "anytext"); parser.parsePropertyList("contentType", "dc:type", ",", true); parser.parsePropertyList("dataCategory", "dc:subject", ",", true); parser.parsePropertyRange("after", "before", "dct:modified"); parser.parseSpatialClause("bbox", "spatialRel", "geometry"); parser.parseSortables("orderBy"); //parser.parsePropertyRange("validAfter","validBefore","dct:valid"); // date valid parser.parsePropertyIsEqualTo("publisher", "dc:publisher"); // publisher parser.parsePropertyIsEqualTo("source", "dc:source"); // harvesting id (uuid) parser.parsePropertyIsEqualTo("isPartOf", "dct:isPartOf"); // collection subset //parser.parsePropertyList("hasFormat","dct:hasFormat",",",true); //parameter &filter parser.parsePropertyIsLike("filter","anytext"); return query; } /** * Generates a search critera object from the request. * * @param request the HTTP request * @param context the request context * @param query the pre-populated rest query * @return the search criteria object */ protected SearchCriteria toSearchCriteria(HttpServletRequest request, RequestContext context, RestQuery query) { SearchCriteria criteria = new SearchCriteria(); RestQueryParser parser = new RestQueryParser(request, context, new RestQuery()); // keyword filter String sKeyword = Val.chkStr(parser.getRequestParameter("searchText")); if (sKeyword.length() > 0) { SearchFilterKeyword fKeyword = new SearchFilterKeyword(); fKeyword.setSearchText(sKeyword); criteria.setSearchFilterKeyword(fKeyword); } // spatial filter SpatialClause bbox = parser.extractSpatialClause("bbox", "spatialRel", "geometry"); if (bbox != null) { SearchFilterSpatial fSpatial = new SearchFilterSpatial(); fSpatial.setSelectedEnvelope(bbox.getBoundingEnvelope()); if (bbox instanceof SpatialClause.GeometryIsWithin) { fSpatial.setSelectedBounds(ISearchFilterSpatialObj.OptionsBounds.dataWithinExtent.name()); } else { fSpatial.setSelectedBounds(ISearchFilterSpatialObj.OptionsBounds.useGeogExtent.name()); } criteria.setSearchFilterSpatial(fSpatial); } // content type filter String sContentType = Val.chkStr(parser.getRequestParameter("contentType")); try { if (sContentType.length() > 0) { SearchFilterContentTypes fContentTypes = new SearchFilterContentTypes(); fContentTypes.setSelectedContentType( SearchEngineCSW.AimsContentTypes.valueOf(sContentType).name()); criteria.setSearchFilterContentTypes(fContentTypes); } } catch (IllegalArgumentException ex) { // if invalid content type simply do not create filter } // data category filter String delimitedThemes = Val.chkStr(parser.getRequestParameter("dataCategory")); String[] themes = Val.tokenize(delimitedThemes, ","); if (themes != null && themes.length > 0) { ArrayList<String> alThemes = new ArrayList<String>(); for (String theme : themes) { alThemes.add(theme); } SearchFilterThemeTypes fThemes = new SearchFilterThemeTypes(); fThemes.setSelectedThemes(alThemes); criteria.setSearchFilterThemes(fThemes); } // temporal filter String sAfter = Val.chkStr(parser.getRequestParameter("after")); String sBefore = Val.chkStr(parser.getRequestParameter("before")); if ((sAfter.length() > 0) || (sBefore.length() > 0)) { SearchFilterTemporal fTemporal = new SearchFilterTemporal(); fTemporal.setDateModifiedFrom(sAfter); fTemporal.setDateModifiedTo(sBefore); fTemporal.setSelectedModifiedDateOption( SearchFilterTemporal.SelectedTimePeriod.beforeAndOrAfterPeriod.name()); criteria.setSearchFilterTemporal(fTemporal); } // pagination filter SearchFilterPagination fPagination = new SearchFilterPagination(); fPagination.setStartPostion(query.getFilter().getStartRecord()); fPagination.setRecordsPerPage(query.getFilter().getMaxRecords()); int startRecord = query.getFilter().getStartRecord(); int maxRecords = query.getFilter().getMaxRecords(); double page = (((double) startRecord) / ((double) maxRecords)); fPagination.setCurrentPage((new Double(Math.ceil(page))).intValue()); criteria.setSearchFilterPageCursor(fPagination); // sort filter String sOrderBy = Val.chkStr(parser.getRequestParameter("orderBy")); try { if (sOrderBy.length() > 0) { SearchFilterSort fSort = new SearchFilterSort(); fSort.setSelectedSort(SearchFilterSort.OptionsSort.valueOf(sOrderBy).name()); criteria.setSearchFilterSort(fSort); } } catch (IllegalArgumentException ex) { // if invalid content type simply do not create filter } // Distributed search String rid = parser.getRequestParameter("rid"); SearchFilterHarvestSites harvestSites = new SearchFilterHarvestSites(); harvestSites.setSelectedHarvestSiteId(rid); SearchFiltersList filterList = new SearchFiltersList(); filterList.add(harvestSites); criteria.setMiscelleniousFilters(filterList); return criteria; } /** * enumerations ============================================================ */ /** * Enumeration of response formats. */ protected enum ResponseFormat { dcat, georss, kml, html, htmlfragment, atom, json, pjson, xjson, searchpage { @Override public boolean isApi() { return false; } }, searchpageresults { @Override public boolean isApi() { return false; } }; /** * Checks then returns the format associated with a value. <br/>If the value * is invalid, the default is returned. * * @param value the value to check. * @return the format Default: {@link ResponseFormat#georss} */ protected static RestQueryServlet.ResponseFormat checkValueOf(String value) { value = Val.chkStr(value); for (RestQueryServlet.ResponseFormat f : values()) { if (f.name().equalsIgnoreCase(value)) { return f; } } return georss; } public boolean isApi() { return true; } } }