/**
* 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.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.xml.sax.SAXException;
import com.google.common.collect.ImmutableSet;
import com.jaeksoft.searchlib.SearchLibException;
import com.jaeksoft.searchlib.config.Config;
import com.jaeksoft.searchlib.filter.GeoFilter.Type;
import com.jaeksoft.searchlib.util.StringUtils;
import com.jaeksoft.searchlib.util.XmlWriter;
import com.jaeksoft.searchlib.web.ServletTransaction;
import com.jaeksoft.searchlib.webservice.query.search.SearchQueryAbstract.OperatorEnum;
public class FilterList implements Iterable<FilterAbstract<?>> {
private List<FilterAbstract<?>> filterList;
private OperatorEnum defaultOperator;
private transient Config config;
public FilterList() {
config = null;
filterList = null;
defaultOperator = OperatorEnum.AND;
}
public FilterList(FilterList fl) {
this.config = fl.config;
this.defaultOperator = fl.defaultOperator;
this.filterList = null;
for (FilterAbstract<?> f : fl)
add(f.duplicate());
}
public FilterList(Config config) {
this.filterList = null;
this.config = config;
this.defaultOperator = OperatorEnum.AND;
}
public void add(FilterAbstract<?> filter) {
if (filter == null)
return;
if (filterList == null)
filterList = new ArrayList<FilterAbstract<?>>(1);
filterList.add(filter);
renumbered();
}
public void remove(FilterAbstract<?> filter) {
if (filter == null)
return;
if (filterList == null)
return;
filterList.remove(filter);
renumbered();
}
public void reset() {
if (filterList == null)
return;
for (FilterAbstract<?> filter : filterList)
filter.reset();
}
private void renumbered() {
if (filterList == null)
return;
int i = 1;
for (FilterAbstract<?> item : filterList)
item.setParamPosition(i++);
}
FilterAbstract<?> first() {
if (filterList == null)
return null;
return filterList.get(0);
}
public int size() {
return filterList == null ? 0 : filterList.size();
}
@Override
public Iterator<FilterAbstract<?>> iterator() {
return filterList == null ? ImmutableSet.<FilterAbstract<?>> of().iterator() : filterList.iterator();
}
public Object[] getArray() {
return filterList == null ? new Object[0] : filterList.toArray();
}
public void writeXmlConfig(XmlWriter xmlWriter, String nodeName) throws SAXException {
xmlWriter.startElement("filters", "defaultOperator", defaultOperator.name());
if (filterList != null)
for (FilterAbstract<?> filter : filterList)
filter.writeXmlConfig(xmlWriter);
xmlWriter.endElement();
}
final public void setFromServlet(final ServletTransaction transaction, final String prefix) {
if (filterList != null)
for (FilterAbstract<?> filter : filterList)
filter.setFromServlet(transaction, prefix);
}
private void addFromServlet(String[] values, boolean negative) {
if (values == null)
return;
for (String value : values)
if (value != null)
if (value.trim().length() > 0)
add(new QueryFilter(value, negative, FilterAbstract.Source.REQUEST, null));
}
public void addFromServlet(ServletTransaction transaction, String prefix) {
if (prefix == null)
prefix = StringUtils.EMPTY;
addFromServlet(transaction.getParameterValues(StringUtils.fastConcat(prefix, "fq")), false);
addFromServlet(transaction.getParameterValues(StringUtils.fastConcat(prefix, "fqn")), true);
}
public void setParam(int pos, String param) throws SearchLibException {
if (filterList == null || pos < 0 || pos >= filterList.size())
throw new SearchLibException("Wrong filter parameter (" + pos + ")");
filterList.get(pos).setParam(param);
}
final public boolean isDistance() {
if (filterList != null)
for (FilterAbstract<?> filter : filterList)
if (filter.isDistance())
return true;
return false;
}
final public float getMaxDistance() {
double maxDistance = Double.MAX_VALUE;
if (filterList != null) {
for (FilterAbstract<?> filter : filterList) {
if (filter.isGeoFilter()) {
GeoFilter geoFilter = (GeoFilter) filter;
if (geoFilter.getType() == Type.RADIUS)
if (maxDistance > geoFilter.getMaxDistance())
maxDistance = geoFilter.getMaxDistance();
}
}
}
return (float) (maxDistance == Double.MAX_VALUE ? 0 : maxDistance);
}
public void addAuthFilter() {
if (filterList != null)
for (FilterAbstract<?> filter : filterList)
if (filter instanceof AuthFilter)
return;
add(new AuthFilter());
}
/**
* @return the defaultOperator
*/
public OperatorEnum getDefaultOperator() {
return defaultOperator;
}
/**
* @param defaultOperator
* the defaultOperator to set
*/
public void setDefaultOperator(OperatorEnum operator) {
defaultOperator = operator;
}
public String getDefaultOperatorString() {
return defaultOperator == null ? null : defaultOperator.toString();
}
public void setDefaultOperatorString(String value) {
setDefaultOperator(OperatorEnum.find(value));
}
}