View Javadoc

1   package com.atlassian.sal.core.search.query;
2   
3   import com.atlassian.sal.api.search.parameter.SearchParameter;
4   import com.atlassian.sal.api.search.query.SearchQuery;
5   import com.atlassian.sal.core.search.parameter.BasicSearchParameter;
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   */
15  public class DefaultSearchQuery implements SearchQuery {
16      private StringBuffer searchString = new StringBuffer();
17      private Map<String, SearchParameter> parameters = new LinkedHashMap<String, SearchParameter>();
18  
19      public DefaultSearchQuery(String query) {
20          append(query);
21      }
22  
23      public SearchQuery setParameter(String name, String value) {
24          parameters.put(name, new BasicSearchParameter(name, value));
25          return this;
26      }
27  
28      public String getParameter(String name) {
29          final SearchParameter value = parameters.get(name);
30  
31          return value == null ? null : value.getValue();
32      }
33  
34      public String buildQueryString() {
35          StringBuilder builder = new StringBuilder(searchString);
36          for (SearchParameter parameter : parameters.values()) {
37              builder.append('&');
38              builder.append(parameter.buildQueryString());
39          }
40          return builder.toString();
41      }
42  
43      public SearchQuery append(String query) {
44          if (StringUtils.isEmpty(query)) {
45              throw new IllegalArgumentException("Cannot parse empty query string!");
46          }
47          if (query.indexOf(SearchQuery.PARAMETER_SEPARATOR) == -1) {
48              //looks like there's no params.
49              searchString.append(query);
50              return this;
51          }
52  
53          final String[] strings = query.split(SearchQuery.PARAMETER_SEPARATOR);
54          searchString.append(strings[0]);
55          for (int i = 1; i < strings.length; i++) {
56              String string = strings[i];
57              BasicSearchParameter searchParam = new BasicSearchParameter(string);
58              parameters.put(searchParam.getName(), searchParam);
59          }
60          return this;
61      }
62  
63      public String getSearchString() {
64          try {
65              return URLDecoder.decode(searchString.toString(), "UTF-8");
66          } catch (UnsupportedEncodingException e) {
67              throw new RuntimeException(e);
68          }
69      }
70  
71      public int getParameter(String name, int defaultValue) {
72          try {
73              return Integer.parseInt(getParameter(name));
74          } catch (NumberFormatException e) {
75              // ignore
76          }
77          return defaultValue;
78      }
79  
80  }