1 package com.indexdata.mkjsf.pazpar2.commands;
\r
3 import javax.enterprise.context.SessionScoped;
\r
4 import javax.inject.Named;
\r
6 import org.apache.log4j.Logger;
\r
8 import com.indexdata.mkjsf.pazpar2.ClientCommandResponse;
\r
9 import com.indexdata.mkjsf.pazpar2.HttpResponseWrapper;
\r
10 import com.indexdata.mkjsf.pazpar2.Pz2Bean;
\r
11 import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand;
\r
12 import com.indexdata.mkjsf.pazpar2.data.ResponseDataObject;
\r
13 import com.indexdata.mkjsf.pazpar2.data.ResponseParser;
\r
15 @SessionScoped @Named
\r
16 public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand {
\r
18 private static final long serialVersionUID = -1888520867838597236L;
\r
19 private static Logger logger = Logger.getLogger(SearchCommand.class);
\r
20 private SingleTargetFilter singleTargetFilter = null;
\r
22 public SearchCommand() {
\r
26 public ResponseDataObject run() {
\r
27 logger.info("Running " + getCommandName());
\r
28 logger.info("Using client " + Pz2Bean.get().getSearchClient());
\r
29 logger.info("Storing responses to " + Pz2Bean.get().getPzresp());
\r
30 Pz2Bean.get().getSearchClient().setSearchCommand(this);
\r
31 logger.info("Executing command " + getCommandName());
\r
32 HttpResponseWrapper httpResponse = Pz2Bean.get().getSearchClient().executeCommand(this);
\r
33 ResponseDataObject responseObject = ResponseParser.getParser().getDataObject((ClientCommandResponse) httpResponse);
\r
34 Pz2Bean.get().getPzresp().put(getCommandName(), responseObject);
\r
35 return responseObject;
\r
39 public void setQuery(String query) {
\r
40 setParameter(new CommandParameter("query","=",query));
\r
43 public String getQuery () {
\r
44 return getParameter("query") == null ? null : getParameter("query").getValueWithExpressions();
\r
47 public void setFilter(String filterExpression) {
\r
48 setParameter(new CommandParameter("filter","=",filterExpression));
\r
51 public String getFilter() {
\r
52 return getParameter("filter") == null ? null : getParameter("filter").getValueWithExpressions();
\r
55 public void addFilter(String filterExpression) {
\r
57 if (hasParameterValue("filter")) {
\r
58 setFilter(filterExpression);
\r
60 getParameter("filter");
\r
62 throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented.");
\r
65 public void removeFilters () {
\r
66 removeParameter("filter");
\r
69 public void removeFilter(String filterExpression) {
\r
71 throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented.");
\r
74 public boolean hasFilter () {
\r
75 return getFilter().length()>0;
\r
78 public void setLimit (String limitExpression) {
\r
79 setParameter(new CommandParameter("limit","=",limitExpression));
\r
82 public String getLimit () {
\r
83 return getParameterValue("limit");
\r
86 public void setStartrecs (String startrecs) {
\r
87 setParameter(new CommandParameter("startrecs","=",startrecs));
\r
90 public String getStartrecs () {
\r
91 return getParameterValue("startrecs");
\r
94 public void setMaxrecs (String maxrecs) {
\r
95 setParameter(new CommandParameter("maxrecs","=",maxrecs));
\r
98 public String getMaxrecs () {
\r
99 return getParameterValue("maxrecs");
\r
102 public void setSort (String sort) {
\r
103 setParameter(new CommandParameter("sort","=",sort));
\r
106 public String getSort () {
\r
107 return getParameterValue("sort");
\r
110 public void setRank (String rank) {
\r
111 setParameter(new CommandParameter("rank","=",rank));
\r
114 public String getRank () {
\r
115 return getParameterValue("rank");
\r
118 public void setMergekey (String mergekey) {
\r
119 setParameter(new CommandParameter("mergekey","=",mergekey));
\r
122 public String getMergekey () {
\r
123 return getParameterValue("mergekey");
\r
128 * Sets a facet, in CQL, to restrict the current results,
\r
129 * then executes the search
\r
131 * @param facetKey i.e. 'au' for author
\r
132 * @param term i.e. 'Dickens, Charles'
\r
134 public void setFacet(String facetKey, String term) {
\r
135 if (term != null && term.length()>0) {
\r
136 getParameter("query").addExpression(new Expression(facetKey,"=",term));
\r
141 * Sets a facet to limit the current query by. The
\r
142 * facet is appended to the query string itself (rather
\r
143 * as a separately managed entity. It will thus appear
\r
144 * in a query field as retrieved by getQuery(). It will
\r
145 * not be removed by removeFacet(...)
\r
147 * @param facetKey i.e. 'au' for author
\r
148 * @param term i.e. 'Dickens, Charles'
\r
150 public void setFacetOnQuery (String facetKey, String term) {
\r
151 String facetExpression = facetKey + "=" + term;
\r
152 if (term != null && term.length()>0) {
\r
153 String currentQuery= getParameterValue("query");
\r
154 setParameter(new CommandParameter("query","=", currentQuery + " and " + facetExpression));
\r
159 * Removes a facet set by setFacet(...), then executes
\r
162 * Will not remove facets set by setFacetOnQuery(...)
\r
164 * @param facetKey i.e. 'au' for author
\r
165 * @param term i.e. 'Dickens, Charles'
\r
167 public void removeFacet(String facetKey, String term) {
\r
168 if (getParameter("query") != null) {
\r
169 getParameter("query").removeExpression(new Expression(facetKey,"=",term));
\r
175 * Adds a single target filter to restrict the current query by,
\r
176 * then executes the current search.
\r
178 * This is a special case of the general setFilter function,
\r
179 * allowing to associate a descriptive target name with the
\r
180 * filter expression for display in UI.
\r
182 * @param targetId pazpar2's ID for the target to limit by
\r
183 * @param targetName a descriptive name for the target
\r
185 public void setSingleTargetFilter (String targetId, String targetName) {
\r
186 if (hasSingleTargetFilter(new SingleTargetFilter(targetId,targetName))) {
\r
187 logger.debug("Already using target filter " + this.singleTargetFilter.getFilterExpression());
\r
189 logger.debug("Setting new single target filter for [" + targetName + "]");
\r
190 this.singleTargetFilter = new SingleTargetFilter(targetId,targetName);
\r
191 setParameter(new CommandParameter("filter","=",this.singleTargetFilter.getFilterExpression()));
\r
195 public SingleTargetFilter getSingleTargetFilter () {
\r
196 logger.debug("request to get the current single target filter " + singleTargetFilter);
\r
197 return singleTargetFilter;
\r
201 * Removes the current target filter from the search
\r
204 public String removeSingleTargetFilter () {
\r
205 logger.debug("Removing target filter " + singleTargetFilter.getFilterExpression());
\r
206 this.singleTargetFilter = null;
\r
207 removeParameter("filter");
\r
213 * @return The target filter set on the current search command
\r
215 public boolean hasSingleTargetFilter() {
\r
216 logger.debug("Checking if a single target filter is set: " + (singleTargetFilter != null));
\r
217 return singleTargetFilter != null;
\r
221 * Resolves if the current search command has a target filter - to
\r
222 * be used by the UI for conditional rendering of target filter info.
\r
224 * @return true if the current search command is limited by a target
\r
227 protected boolean hasSingleTargetFilter(SingleTargetFilter targetFilter) {
\r
228 logger.debug("Checking if target filter for [" + targetFilter.getTargetName() + "] is set.");
\r
229 return hasSingleTargetFilter() && targetFilter.equals(this.singleTargetFilter);
\r
232 public SearchCommand copy () {
\r
233 SearchCommand newCommand = new SearchCommand();
\r
234 for (String parameterName : parameters.keySet()) {
\r
235 newCommand.setParameterInState(parameters.get(parameterName).copy());
\r
237 newCommand.singleTargetFilter = this.singleTargetFilter;
\r
242 public ServiceProxyCommand getSp() {
\r
247 public boolean spOnly() {
\r