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.lang3.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 StringBuilder searchString = new StringBuilder();
17 private Map<String, SearchParameter> parameters = new LinkedHashMap<>();
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.contains(SearchQuery.PARAMETER_SEPARATOR)) {
48
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
76 }
77 return defaultValue;
78 }
79
80 }