/** * License Agreement for OpenSearchServer * * Copyright (C) 2008-2015 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.request; import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.TreeSet; import javax.xml.xpath.XPathExpressionException; import org.apache.lucene.search.Query; import org.w3c.dom.DOMException; 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.function.expression.SyntaxError; import com.jaeksoft.searchlib.index.ReaderInterface; import com.jaeksoft.searchlib.query.ParseException; import com.jaeksoft.searchlib.result.AbstractResult; import com.jaeksoft.searchlib.result.ResultSearchMerged; import com.jaeksoft.searchlib.util.DomUtils; import com.jaeksoft.searchlib.util.StringUtils; import com.jaeksoft.searchlib.util.XPathParser; import com.jaeksoft.searchlib.util.XmlWriter; public class SearchMergedRequest extends AbstractSearchRequest implements RequestInterfaces.ReturnedFieldInterface, RequestInterfaces.FilterListInterface { private final TreeSet<RemoteRequest> requests; public SearchMergedRequest() { super(null, null /* RequestTypeEnum.SearchMergedRequest */); requests = new TreeSet<RemoteRequest>(); } public SearchMergedRequest(Config config) { super(config, null /* RequestTypeEnum.SearchMergedRequest */); requests = new TreeSet<RemoteRequest>(); } @Override protected void setDefaultValues() { super.setDefaultValues(); } @Override public void copyFrom(AbstractRequest request) { super.copyFrom(request); SearchMergedRequest searchMergedRequest = (SearchMergedRequest) request; requests.clear(); requests.addAll(searchMergedRequest.requests); } public Collection<RemoteRequest> getRequests() { return requests; } private final static String REMOTEREQUESTS_NODE_NAME = "remoteRequests"; private final static String REMOTEREQUEST_NODE_NAME = "remoteRequest"; private final static String REMOTEREQUEST_REMOTEURL = "url"; private final static String REMOTEREQUEST_INDEXNAME = "indexName"; private final static String REMOTEREQUEST_REQUESTNAME = "requestName"; @Override public void fromXmlConfigNoLock(Config config, XPathParser xpp, Node searchRequestNode) throws XPathExpressionException, DOMException, ParseException, InstantiationException, IllegalAccessException, ClassNotFoundException { super.fromXmlConfigNoLock(config, xpp, searchRequestNode); Node requestsNode = DomUtils.getFirstNode(searchRequestNode, REMOTEREQUESTS_NODE_NAME); if (requestsNode != null) { List<Node> requestNodeList = DomUtils.getNodes(requestsNode, REMOTEREQUEST_NODE_NAME); if (requestNodeList != null) for (Node requestNode : requestNodeList) requests.add(new RemoteRequest(requestNode)); } } @Override public void writeSubXmlConfig(XmlWriter xmlWriter) throws SAXException { xmlWriter.startElement(REMOTEREQUESTS_NODE_NAME); for (RemoteRequest request : requests) request.writeXmlConfig(xmlWriter); xmlWriter.endElement(); } @Override public String getInfo() { return null; } @Override public Query getQuery() throws ParseException, SyntaxError, SearchLibException, IOException { return null; } public void save(RemoteRequest oldRequest, RemoteRequest newRequest) { if (oldRequest != null) requests.remove(oldRequest); if (newRequest != null) requests.add(new RemoteRequest(newRequest)); } @Override public AbstractResult<?> execute(ReaderInterface reader) throws SearchLibException { return new ResultSearchMerged(this); } public static class RemoteRequest implements Comparable<RemoteRequest> { private String remoteURL; private String indexName; private String requestName; public RemoteRequest() { remoteURL = null; indexName = null; requestName = null; } public void writeXmlConfig(XmlWriter xmlWriter) throws SAXException { xmlWriter.startElement(REMOTEREQUEST_NODE_NAME, REMOTEREQUEST_REMOTEURL, remoteURL, REMOTEREQUEST_INDEXNAME, indexName, REMOTEREQUEST_REQUESTNAME, requestName); xmlWriter.endElement(); } public RemoteRequest(RemoteRequest request) { this.remoteURL = request.remoteURL; this.indexName = request.indexName; this.requestName = request.requestName; } private RemoteRequest(Node requestNode) { this.remoteURL = DomUtils.getAttributeText(requestNode, REMOTEREQUEST_REMOTEURL); this.indexName = DomUtils.getAttributeText(requestNode, REMOTEREQUEST_INDEXNAME); this.requestName = DomUtils.getAttributeText(requestNode, REMOTEREQUEST_REQUESTNAME); } /** * @return the remoteURL */ public String getRemoteURL() { return remoteURL; } /** * @param remoteURL * the remoteURL to set */ public void setRemoteURL(String remoteURL) { this.remoteURL = remoteURL; } /** * @return the indexName */ public String getIndexName() { return indexName; } /** * @param indexName * the indexName to set */ public void setIndexName(String indexName) { this.indexName = indexName; } /** * @return the requestName */ public String getRequestName() { return requestName; } /** * @param requestName * the requestName to set */ public void setRequestName(String requestName) { this.requestName = requestName; } @Override public int compareTo(RemoteRequest o) { int c; if ((c = StringUtils.compareNullString(remoteURL, o.remoteURL)) != 0) return c; if ((c = StringUtils.compareNullString(indexName, o.indexName)) != 0) return c; return StringUtils.compareNullString(requestName, o.requestName); } } }