001: //=== Copyright (C) 2001-2007 Food and Agriculture Organization of the
002: //=== United Nations (FAO-UN), United Nations World Food Programme (WFP)
003: //=== and United Nations Environment Programme (UNEP)
004: //===
005: //=== This program is free software; you can redistribute it and/or modify
006: //=== it under the terms of the GNU General Public License as published by
007: //=== the Free Software Foundation; either version 2 of the License, or (at
008: //=== your option) any later version.
009: //===
010: //=== This program is distributed in the hope that it will be useful, but
011: //=== WITHOUT ANY WARRANTY; without even the implied warranty of
012: //=== MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: //=== General Public License for more details.
014: //===
015: //=== You should have received a copy of the GNU General Public License
016: //=== along with this program; if not, write to the Free Software
017: //=== Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
018: //===
019: //=== Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2,
020: //=== Rome - Italy. email: geonetwork@osgeo.org
021: //==============================================================================
022:
023: package org.fao.geonet.kernel.search;
024:
025: import org.fao.geonet.services.util.MainUtil;
026: import org.fao.geonet.constants.Geonet;
027: import org.fao.geonet.constants.Params;
028:
029: import jeeves.server.*;
030: import jeeves.server.context.*;
031: import jeeves.utils.Util;
032:
033: import org.jdom.Element;
034:
035: import java.util.Iterator;
036:
037: //--------------------------------------------------------------------------------
038: // interface to search metadata
039: //--------------------------------------------------------------------------------
040:
041: public abstract class MetaSearcher {
042: private int _from, _to;
043: private boolean _valid = false;
044:
045: //--------------------------------------------------------------------------------
046: // MetaSearcher API
047:
048: public abstract void search(ServiceContext srvContext,
049: Element request, ServiceConfig config) throws Exception;
050:
051: public abstract Element present(ServiceContext srvContext,
052: Element request, ServiceConfig config) throws Exception;
053:
054: public abstract int getSize();
055:
056: public abstract Element getSummary() throws Exception;
057:
058: public abstract void close();
059:
060: //--------------------------------------------------------------------------------
061: // utilities
062:
063: public void setValid(boolean valid) {
064: _valid = valid;
065: }
066:
067: protected void initSearchRange(ServiceContext srvContext) {
068: // get from and to default values
069: _from = 1;
070: Element defaultSearch = MainUtil.getDefaultSearch(srvContext,
071: null);
072: try {
073: _to = Integer.parseInt(defaultSearch
074: .getChildText(Geonet.SearchResult.HITS_PER_PAGE));
075: } catch (NumberFormatException nfe) {
076: _to = 10;
077: }
078: }
079:
080: protected void updateSearchRange(Element request) {
081: // get request parameters
082: String sFrom = request.getChildText("from");
083: String sTo = request.getChildText("to");
084: if (sFrom != null) {
085: try {
086: _from = Integer.parseInt(sFrom);
087: } catch (NumberFormatException nfe) {
088: throw new IllegalArgumentException(
089: "Bad 'from' parameter: " + sFrom);
090: }
091: }
092: if (sTo != null) {
093: try {
094: _to = Integer.parseInt(sTo);
095: } catch (NumberFormatException nfe) {
096: throw new IllegalArgumentException(
097: "Bad 'to' parameter: " + sTo);
098: }
099: }
100:
101: int count = getSize();
102: _from = _from > count ? count : _from;
103: _to = _to > count ? count : _to;
104: }
105:
106: protected int getFrom() {
107: return _from;
108: }
109:
110: protected int getTo() {
111: return _to;
112: }
113:
114: protected boolean isValid() {
115: return _valid;
116: }
117:
118: public Element get(ServiceContext srvContext, Element request,
119: ServiceConfig config) throws Exception {
120: String id = Util.getParam(request, Params.ID);
121:
122: // save _from and _to
123: int from = _from;
124: int to = _to;
125:
126: // perform search
127: Element req = new Element("request");
128: addElement(req, "from", id);
129: addElement(req, "to", id);
130: Element result = present(srvContext, req, config);
131:
132: // restore _from and _to
133: _from = from;
134: _to = to;
135:
136: // skip summary
137: for (Iterator iter = result.getChildren().iterator(); iter
138: .hasNext();) {
139: Element child = (Element) iter.next();
140:
141: if (!child.getName().equals(Geonet.Elem.SUMMARY))
142: return child;
143: }
144: return null;
145: }
146:
147: protected static void addElement(Element root, String name,
148: String value) {
149: root.addContent(new Element(name).setText(value));
150: }
151: }
|