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
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
95 }
96 return defaultValue;
97 }
98
99 }