View Javadoc
1   package com.atlassian.refapp.sal.search.query;
2   
3   import com.atlassian.refapp.sal.search.parameter.BasicSearchParameter;
4   import com.atlassian.sal.api.search.parameter.SearchParameter;
5   import com.atlassian.sal.api.search.query.SearchQuery;
6   import org.apache.commons.lang.StringUtils;
7   
8   import java.io.UnsupportedEncodingException;
9   import java.net.URLDecoder;
10  import java.util.LinkedHashMap;
11  import java.util.Map;
12  
13  /**
14   * Copied from sal-core for now so we can remove the dependency on Apache HTTP client.
15   */
16  public class DefaultSearchQuery implements SearchQuery {
17      private StringBuffer searchString = new StringBuffer();
18      private Map<String, SearchParameter> parameters = new LinkedHashMap<String, SearchParameter>();
19  
20      public DefaultSearchQuery(String query) {
21          append(query);
22      }
23  
24  
25      public SearchQuery setParameter(String name, String value) {
26          parameters.put(name, new BasicSearchParameter(name, value));
27          return this;
28      }
29  
30      public String getParameter(String name) {
31          final SearchParameter value = parameters.get(name);
32  
33          return value == null ? null : value.getValue();
34      }
35  
36      public String buildQueryString() {
37          StringBuilder builder = new StringBuilder(searchString);
38          for (SearchParameter parameter : parameters.values()) {
39              builder.append('&');
40              builder.append(parameter.buildQueryString());
41          }
42          return builder.toString();
43      }
44  
45      public SearchQuery append(String query) {
46          if (StringUtils.isEmpty(query)) {
47              throw new IllegalArgumentException("Cannot parse empty query string!");
48          }
49          if (query.indexOf(SearchQuery.PARAMETER_SEPARATOR) == -1) {
50              //looks like there's no params.
51              searchString.append(query);
52              return this;
53          }
54  
55          final String[] strings = query.split(SearchQuery.PARAMETER_SEPARATOR);
56          searchString.append(strings[0]);
57          for (int i = 1; i < strings.length; i++) {
58              String string = strings[i];
59              BasicSearchParameter searchParam = new BasicSearchParameter(string);
60              parameters.put(searchParam.getName(), searchParam);
61          }
62          return this;
63      }
64  
65  
66      public String getSearchString() {
67          try {
68              return URLDecoder.decode(searchString.toString(), "UTF-8");
69          } catch (UnsupportedEncodingException e) {
70              throw new RuntimeException("You're JVM doesn't appear to support UTF-8", e);
71          }
72      }
73  
74  
75      public int getParameter(String name, int defaultValue) {
76          final String value = getParameter(name);
77          try {
78              return Integer.parseInt(value);
79          } catch (NumberFormatException e) {
80              // ignore
81          }
82          return defaultValue;
83      }
84  
85  }