1 package com.atlassian.jira.web.dwr;
2
3 import java.util.Collection;
4 import java.util.Iterator;
5
6 import org.apache.log4j.Logger;
7 import org.ofbiz.core.entity.GenericValue;
8
9 import com.atlassian.jira.bc.JiraServiceContext;
10 import com.atlassian.jira.bc.JiraServiceContextImpl;
11 import com.atlassian.jira.bc.search.PickerSearchService;
12 import com.atlassian.jira.config.properties.APKeys;
13 import com.atlassian.jira.config.properties.ApplicationProperties;
14 import com.atlassian.jira.security.JiraAuthenticationContext;
15 import com.atlassian.jira.util.ErrorCollection;
16 import com.atlassian.jira.util.SimpleErrorCollection;
17 import com.opensymphony.user.User;
18
19 public abstract class AbstractAjaxPicker {
20
21 private static final Logger log = Logger.getLogger(AbstractAjaxPicker.class);
22
23 private final JiraAuthenticationContext authContext;
24
25 private final PickerSearchService service;
26
27 private final ApplicationProperties applicationProperties;
28
29
30
31
32
33
34
35
36
37
38
39 public AbstractAjaxPicker(JiraAuthenticationContext authContext, PickerSearchService service, ApplicationProperties applicationProperties) {
40 this.authContext = authContext;
41 this.service = service;
42 this.applicationProperties = applicationProperties;
43 }
44
45
46
47
48
49
50
51
52
53
54 public AutoCompleteResults getEntities(final String _fieldName, final String _entityName, final String _query) {
55
56 final JiraServiceContext jiraServiceCtx = getContext();
57 final AutoCompleteResults acResults = new AutoCompleteResults();
58
59 if (service.canPerformAjaxSearch(jiraServiceCtx)) {
60 int limit = getLimit();
61 int count = 0;
62 Collection results = service.getResults(jiraServiceCtx, _entityName, _query);
63 for (Iterator iterator = results.iterator(); iterator.hasNext();) {
64 if (count >= limit) {
65 break;
66 }
67 GenericValue gv = (GenericValue) iterator.next();
68 String html = formatEntity(_fieldName, gv, _query);
69 acResults.addResult(gv.get("id").toString(), html);
70 count++;
71 }
72 acResults.setFooterMessage(getText("jira.ajax.autocomplete.manageableAsProject.more.results", String.valueOf(count), String.valueOf(results.size())));
73 }
74 return acResults;
75 }
76
77 protected String getElementId(String fieldName, String type, String field) {
78 return " id=\"" + fieldName + "_" + type + "_" + field + "\" ";
79 }
80
81
82 private int getLimit() {
83
84 int limit = 20;
85 try {
86 limit = Integer.valueOf(applicationProperties.getDefaultBackedString(APKeys.JIRA_AJAX_AUTOCOMPLETE_LIMIT)).intValue();
87 } catch (Exception nfe) {
88 log.error("jira.ajax.autocomplete.limit does not exist or is an invalid number in jira-application.properties.", nfe);
89 }
90 return limit;
91 }
92
93 protected abstract String formatEntity(String fieldName, GenericValue _gv, String query);
94
95 JiraServiceContext getContext() {
96 User user = authContext.getUser();
97 ErrorCollection errorCollection = new SimpleErrorCollection();
98 return new JiraServiceContextImpl(user, errorCollection);
99 }
100
101
102
103
104
105
106
107
108 String getText(String key) {
109 return authContext.getI18nBean().getText(key);
110 }
111
112
113
114
115
116
117
118
119
120
121 String getText(String key, Object param) {
122 return authContext.getI18nBean().getText(key, param);
123 }
124
125
126
127
128
129
130
131
132
133
134
135
136 String getText(String key, String param1, String param2) {
137 return authContext.getI18nBean().getText(key, param1, param2);
138 }
139
140
141 }