View Javadoc

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