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
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
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
81 }
82 return defaultValue;
83 }
84
85 }