source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/AbstractTextSearch.java@ 29318

Last change on this file since 29318 was 28966, checked in by kjdon, 10 years ago

Lots of changes. Mainly to do with removing this.doc from everywhere. Document is not thread safe. Now we tend to create a new Document everytime we are starting a new page/message etc. in service this.desc_doc is available as teh document to create service info stuff. But it should only be used for this and not for other messages. newDOM is now static for XMLConverter. method param changes for some GSXML methods.

File size: 7.0 KB
Line 
1/*
2 * AbstractTextSearch.java
3 * Copyright (C) 2005 New Zealand Digital Library, http://www.nzdl.org
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19package org.greenstone.gsdl3.service;
20
21// Greenstone classes
22import java.util.ArrayList;
23
24import org.apache.log4j.Logger;
25import org.greenstone.gsdl3.util.GSXML;
26
27import org.w3c.dom.Document;
28import org.w3c.dom.Element;
29
30/**
31 * Partially implements a generic search service
32 *
33 */
34
35public abstract class AbstractTextSearch extends AbstractSearch
36{
37
38 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.service.AbstractTextSearch.class.getName());
39
40 // optional standard params - some of these have to be implemented
41 protected static final String INDEX_SUBCOLLECTION_PARAM = "indexSubcollection";
42 protected static final String INDEX_LANGUAGE_PARAM = "indexLanguage";
43
44 protected static final String INDEX_SUBCOLLECTION_ELEM = "indexSubcollection";
45 protected static final String INDEX_LANGUAGE_ELEM = "indexLanguage";
46
47 // some other common params that may be used
48 protected static final String CASE_PARAM = "case";
49 protected static final String STEM_PARAM = "stem";
50 protected static final String ACCENT_PARAM = "accent";
51
52 protected static final String BOOLEAN_PARAM_ON = "1";
53 protected static final String BOOLEAN_PARAM_OFF = "0";
54 protected static final String MATCH_PARAM = "matchMode";
55 protected static final String MATCH_PARAM_ALL = "all";
56 protected static final String MATCH_PARAM_SOME = "some";
57
58 protected String default_index_subcollection = "";
59
60 protected String default_index_language = "";
61
62 public AbstractTextSearch()
63 {
64 super();
65 // the search service
66 QUERY_SERVICE = "TextQuery";
67 paramDefaults.put(CASE_PARAM, BOOLEAN_PARAM_ON);
68 paramDefaults.put(STEM_PARAM, BOOLEAN_PARAM_OFF);
69 paramDefaults.put(ACCENT_PARAM, BOOLEAN_PARAM_ON);
70 paramDefaults.put(MATCH_PARAM, MATCH_PARAM_SOME);
71 }
72
73 /** adds the standard query params into the service description */
74 protected void addStandardQueryParams(Element param_list, String lang)
75 {
76 if (!default_index_subcollection.equals(""))
77 {
78 createParameter(INDEX_SUBCOLLECTION_PARAM, param_list, lang);
79 }
80 if (!default_index_language.equals(""))
81 {
82 createParameter(INDEX_LANGUAGE_PARAM, param_list, lang);
83 }
84
85 super.addStandardQueryParams(param_list, lang);
86 }
87
88 /**
89 * Top up createParameterChain with TextQuery specific params: case, stem
90 * ...
91 */
92 protected boolean createParameterChain(String name, Element param_list, String lang, String default_value)
93 {
94 Document doc = param_list.getOwnerDocument();
95 Element param = null;
96 String param_default = default_value;
97 if (default_value == null) {
98 // have we got a stored up default? will be null if not there
99 param_default = paramDefaults.get(name);
100 }
101
102 if (super.createParameterChain(name, param_list, lang, default_value))
103 {
104 // found a match, so can stop here
105 return true;
106 }
107 // otherwise look to see if it is a text specific parameter
108 if (name.equals(INDEX_SUBCOLLECTION_PARAM))
109 {
110 Element index_sub_list = (Element) GSXML.getChildByTagName(this.config_info, INDEX_SUBCOLLECTION_ELEM + GSXML.LIST_MODIFIER);
111 if (index_sub_list == null)
112 return true; // processed, just not a very interesting result
113 ArrayList<String> index_sub_ids = new ArrayList<String>();
114 ArrayList<String> index_sub_names = new ArrayList<String>();
115 getIndexSubcollectionData(index_sub_ids, index_sub_names, lang);
116 String param_type = GSXML.PARAM_TYPE_ENUM_SINGLE;
117 if (does_multi_index_search)
118 {
119 param_type = GSXML.PARAM_TYPE_ENUM_MULTI;
120 }
121 if (param_default == null)
122 {
123 param_default = this.default_index_subcollection;
124 }
125 param = GSXML.createParameterDescription2(doc, INDEX_SUBCOLLECTION_PARAM, getTextString("param." + INDEX_SUBCOLLECTION_PARAM, lang), param_type, param_default, index_sub_ids, index_sub_names);
126 param_list.appendChild(param);
127 return true;
128 }
129 else if (name.equals(INDEX_LANGUAGE_PARAM))
130 {
131 Element index_lang_list = (Element) GSXML.getChildByTagName(this.config_info, INDEX_LANGUAGE_ELEM + GSXML.LIST_MODIFIER);
132 if (index_lang_list == null)
133 return true; // processed, just not a very interesting result
134 ArrayList<String> index_lang_ids = new ArrayList<String>();
135 ArrayList<String> index_lang_names = new ArrayList<String>();
136 getIndexLanguageData(index_lang_ids, index_lang_names, lang);
137 String param_type = GSXML.PARAM_TYPE_ENUM_SINGLE;
138 if (does_multi_index_search)
139 {
140 param_type = GSXML.PARAM_TYPE_ENUM_MULTI;
141 }
142 if (param_default == null)
143 {
144 param_default = this.default_index_language;
145 }
146 param = GSXML.createParameterDescription2(doc, INDEX_LANGUAGE_PARAM, getTextString("param." + INDEX_LANGUAGE_PARAM, lang), param_type, param_default, index_lang_ids, index_lang_names);
147 param_list.appendChild(param);
148 return true;
149 }
150 else if (name.equals(CASE_PARAM) || name.equals(STEM_PARAM) || name.equals(ACCENT_PARAM)) {
151 String[] bool_ops = {"0", "1"};
152 String[] bool_texts = {getTextString("param.boolean.off", lang),getTextString("param.boolean.on", lang)};
153 param = GSXML.createParameterDescription(doc, name, getTextString("param."+name, lang), GSXML.PARAM_TYPE_BOOLEAN, param_default, bool_ops, bool_texts);
154 param_list.appendChild(param);
155 return true;
156 } else if (name.equals(MATCH_PARAM)) {
157
158 String[] vals = {MATCH_PARAM_SOME, MATCH_PARAM_ALL };
159 String[] val_texts = {getTextString("param."+MATCH_PARAM+"."+MATCH_PARAM_SOME, lang), getTextString("param."+MATCH_PARAM+"."+MATCH_PARAM_ALL, lang)};
160 param = GSXML.createParameterDescription(doc, MATCH_PARAM, getTextString("param."+MATCH_PARAM, lang), GSXML.PARAM_TYPE_ENUM_SINGLE, param_default, vals, val_texts);
161 param_list.appendChild(param);
162 return true;
163 }
164 // Get to here then none of the above params matched
165 // => return false so the chain can continue
166 return false;
167
168 }
169
170 /**
171 * do the actual query must be implemented by subclass
172 */
173 abstract protected Element processTextQuery(Element request);
174
175 /**
176 * get the details about the indexexSubcollections available might be
177 * implemented by subclass
178 */
179 protected void getIndexSubcollectionData(ArrayList<String> index_ids, ArrayList<String> index_names, String lang)
180 {
181 }
182
183 /**
184 * get the details about the indexes available might be implemented by
185 * subclass
186 */
187 protected void getIndexLanguageData(ArrayList<String> index_ids, ArrayList<String> index_names, String lang)
188 {
189 }
190
191}
Note: See TracBrowser for help on using the repository browser.