/** * License Agreement for OpenSearchServer * * Copyright (C) 2008-2014 Emmanuel Keller / Jaeksoft * * http://www.open-search-server.com * * This file is part of OpenSearchServer. * * OpenSearchServer is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenSearchServer 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenSearchServer. * If not, see <http://www.gnu.org/licenses/>. **/ package com.jaeksoft.searchlib.filter; import java.io.IOException; import javax.xml.xpath.XPathExpressionException; import org.apache.lucene.analysis.Analyzer; import org.w3c.dom.Node; import org.xml.sax.SAXException; import com.jaeksoft.searchlib.SearchLibException; import com.jaeksoft.searchlib.config.Config; import com.jaeksoft.searchlib.query.ParseException; import com.jaeksoft.searchlib.request.AbstractLocalSearchRequest; import com.jaeksoft.searchlib.request.AbstractRequest; import com.jaeksoft.searchlib.request.AbstractSearchRequest; import com.jaeksoft.searchlib.result.ResultSearchSingle; import com.jaeksoft.searchlib.schema.SchemaField; import com.jaeksoft.searchlib.util.StringUtils; import com.jaeksoft.searchlib.util.Timer; import com.jaeksoft.searchlib.util.XPathParser; import com.jaeksoft.searchlib.util.XmlWriter; import com.jaeksoft.searchlib.web.ServletTransaction; import com.jaeksoft.searchlib.webservice.query.search.SearchQueryAbstract.OperatorEnum; public class RequestTemplateFilter extends FilterAbstract<RequestTemplateFilter> { private String requestName; private String queryString; public RequestTemplateFilter() { this(StringUtils.EMPTY, StringUtils.EMPTY, false, Source.REQUEST, null); } public RequestTemplateFilter(String requestName, String queryString, boolean negative, Source src, String paramPosition) { super(FilterType.REQUEST_TEMPLATE_FILTER, src, negative, paramPosition); this.requestName = requestName; this.queryString = queryString; } public RequestTemplateFilter(XPathParser xpp, Node node) throws XPathExpressionException { this(XPathParser.getAttributeString(node, "requestName"), xpp .getNodeString(node, false), "yes".equals(XPathParser .getAttributeString(node, "negative")), Source.CONFIGXML, null); } @Override public String getDescription() { StringBuilder sb = new StringBuilder("Template filter: "); sb.append(requestName); sb.append(" - "); sb.append(queryString); return sb.toString(); } @Override public String getCacheKey(SchemaField defaultField, Analyzer analyzer, AbstractLocalSearchRequest request) throws ParseException { return StringUtils.fastConcat("TemplateFilter - ", requestName, queryString); } @Override public void writeXmlConfig(XmlWriter xmlWriter) throws SAXException { xmlWriter.startElement("requestTemplateFilter", "negative", isNegative() ? "yes" : "no", "requestName", requestName); xmlWriter.textNode(queryString); xmlWriter.endElement(); } @Override public FilterHits getFilterHits(SchemaField defaultField, Analyzer analyzer, AbstractLocalSearchRequest request, Timer timer) throws ParseException, IOException, SearchLibException { Config config = request.getConfig(); AbstractRequest filterRequest = config.getNewRequest(requestName); if (!(filterRequest instanceof AbstractSearchRequest)) throw new SearchLibException( "Filter failure. Request type not compatible: " + requestName); ((AbstractSearchRequest) filterRequest).setForFilter(true); ResultSearchSingle result = (ResultSearchSingle) config .getIndexAbstract().request(filterRequest); return new FilterHits(result, isNegative(), timer); } @Override public RequestTemplateFilter duplicate() { return new RequestTemplateFilter(requestName, queryString, isNegative(), getSource(), getParamPosition()); } @Override public void copyTo(FilterAbstract<?> selectedItem) { if (!(selectedItem instanceof RequestTemplateFilter)) throw new RuntimeException("Wrong filter type " + selectedItem.getClass().getName()); super.copyTo(selectedItem); RequestTemplateFilter copyTo = (RequestTemplateFilter) selectedItem; copyTo.requestName = requestName; copyTo.queryString = queryString; } @Override final public void setFromServlet(final ServletTransaction transaction, final String prefix) { String q = transaction.getParameterString(StringUtils.fastConcat( prefix, getParamPosition())); if (q != null) setQueryString(q); } @Override final public void setParam(final String param) { if (param != null) setQueryString(param); } @Override public OperatorEnum getOperator(OperatorEnum defaultOperator) { return defaultOperator; } /** * @return the requestName */ public String getRequestName() { return requestName; } /** * @param requestName * the requestName to set */ public void setRequestName(String requestName) { this.requestName = requestName; } @Override public void reset() { } /** * @return the queryString */ public String getQueryString() { return queryString; } /** * @param queryString * the queryString to set */ public void setQueryString(String queryString) { this.queryString = queryString; } }