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