1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.atlassian.jira.rest.client.api.domain.input;
18
19 import com.atlassian.jira.rest.client.api.domain.BasicComponent;
20 import com.atlassian.jira.rest.client.api.domain.BasicPriority;
21 import com.atlassian.jira.rest.client.api.domain.BasicProject;
22 import com.atlassian.jira.rest.client.api.domain.BasicUser;
23 import com.atlassian.jira.rest.client.api.domain.EntityHelper;
24 import com.atlassian.jira.rest.client.api.domain.IssueFieldId;
25 import com.atlassian.jira.rest.client.api.domain.IssueType;
26 import com.atlassian.jira.rest.client.api.domain.Version;
27 import com.google.common.base.Function;
28 import com.google.common.collect.Iterables;
29 import com.google.common.collect.Lists;
30 import com.google.common.collect.Maps;
31 import org.joda.time.DateTime;
32 import org.joda.time.format.DateTimeFormatter;
33 import org.joda.time.format.ISODateTimeFormat;
34
35 import java.util.ArrayList;
36 import java.util.List;
37 import java.util.Map;
38
39
40
41
42
43
44 public class IssueInputBuilder {
45
46 private static final DateTimeFormatter JIRA_DATE_FORMATTER = ISODateTimeFormat.date();
47
48 private final ValueTransformerManager valueTransformerManager = new ValueTransformerManager()
49 .registerTransformer(new BaseValueTransformer());
50
51 private Map<String, FieldInput> fields = Maps.newHashMap();
52 private final List<PropertyInput> properties = new ArrayList<PropertyInput>();
53
54
55
56
57
58 public IssueInputBuilder() {
59 }
60
61 public IssueInputBuilder(String projectKey, Long issueTypeId) {
62 setProjectKey(projectKey);
63 setIssueTypeId(issueTypeId);
64 }
65
66 public IssueInputBuilder(BasicProject project, IssueType issueType) {
67 setProject(project);
68 setIssueType(issueType);
69 }
70
71 @SuppressWarnings("unused")
72 public IssueInputBuilder(String projectKey, Long issueTypeId, String summary) {
73 this(projectKey, issueTypeId);
74 setSummary(summary);
75 }
76
77 @SuppressWarnings("unused")
78 public IssueInputBuilder(BasicProject project, IssueType issueType, String summary) {
79 this(project, issueType);
80 setSummary(summary);
81 }
82
83 public IssueInputBuilder setSummary(String summary) {
84 return setFieldInput(new FieldInput(IssueFieldId.SUMMARY_FIELD, summary));
85 }
86
87 public IssueInputBuilder setProjectKey(String projectKey) {
88 return setFieldInput(new FieldInput(IssueFieldId.PROJECT_FIELD, ComplexIssueInputFieldValue.with("key", projectKey)));
89 }
90
91 public IssueInputBuilder setProject(BasicProject project) {
92 return setProjectKey(project.getKey());
93 }
94
95 public IssueInputBuilder setIssueTypeId(Long issueTypeId) {
96 return setFieldInput(new FieldInput(
97 IssueFieldId.ISSUE_TYPE_FIELD,
98 ComplexIssueInputFieldValue.with("id", issueTypeId.toString())
99 ));
100 }
101
102 public IssueInputBuilder setIssueType(IssueType issueType) {
103 return setIssueTypeId(issueType.getId());
104 }
105
106
107
108
109
110
111
112
113
114 public IssueInputBuilder setFieldInput(FieldInput fieldInput) {
115 fields.put(fieldInput.getId(), fieldInput);
116 return this;
117 }
118
119
120
121
122
123
124
125
126
127
128 @SuppressWarnings("unused")
129 public IssueInputBuilder setFieldValue(String id, ComplexIssueInputFieldValue value) {
130 return setFieldInput(new FieldInput(id, value));
131 }
132
133
134
135
136
137
138
139
140
141 public IssueInputBuilder setFieldValue(String id, Object value) throws CannotTransformValueException {
142 return setFieldInput(new FieldInput(id, valueTransformerManager.apply(value)));
143 }
144
145 public IssueInputBuilder setDescription(String summary) {
146 return setFieldInput(new FieldInput(IssueFieldId.DESCRIPTION_FIELD, summary));
147 }
148
149 public IssueInputBuilder setAssignee(BasicUser assignee) {
150 return setAssigneeName(assignee.getName());
151 }
152
153 public IssueInputBuilder setAssigneeName(String assignee) {
154 return setFieldInput(new FieldInput(IssueFieldId.ASSIGNEE_FIELD, ComplexIssueInputFieldValue.with("name", assignee)));
155 }
156
157 public IssueInput build() {
158 return new IssueInput(fields, properties);
159 }
160
161 @SuppressWarnings("unused")
162 public IssueInputBuilder setAffectedVersions(Iterable<Version> versions) {
163 return setAffectedVersionsNames(EntityHelper.toNamesList(versions));
164 }
165
166 public IssueInputBuilder setAffectedVersionsNames(Iterable<String> names) {
167 return setFieldInput(new FieldInput(IssueFieldId.AFFECTS_VERSIONS_FIELD, toListOfComplexIssueInputFieldValueWithSingleKey(names, "name")));
168 }
169
170 public IssueInputBuilder setComponentsNames(Iterable<String> names) {
171 return setFieldInput(new FieldInput(IssueFieldId.COMPONENTS_FIELD, toListOfComplexIssueInputFieldValueWithSingleKey(names, "name")));
172 }
173
174 public IssueInputBuilder setComponents(Iterable<BasicComponent> basicComponents) {
175 return setComponentsNames(EntityHelper.toNamesList(basicComponents));
176 }
177
178 public IssueInputBuilder setComponents(BasicComponent... basicComponents) {
179 return setComponents(Lists.newArrayList(basicComponents));
180 }
181
182 public IssueInputBuilder setDueDate(DateTime date) {
183 return setFieldInput(new FieldInput(IssueFieldId.DUE_DATE_FIELD, JIRA_DATE_FORMATTER.print(date)));
184 }
185
186 public IssueInputBuilder setFixVersionsNames(Iterable<String> names) {
187 return setFieldInput(new FieldInput(IssueFieldId.FIX_VERSIONS_FIELD, toListOfComplexIssueInputFieldValueWithSingleKey(names, "name")));
188 }
189
190 @SuppressWarnings("unused")
191 public IssueInputBuilder setFixVersions(Iterable<Version> versions) {
192 return setFixVersionsNames(EntityHelper.toNamesList(versions));
193 }
194
195 public IssueInputBuilder setPriority(BasicPriority priority) {
196 return setPriorityId(priority.getId());
197 }
198
199 public IssueInputBuilder setPriorityId(Long id) {
200 return setFieldInput(new FieldInput(IssueFieldId.PRIORITY_FIELD, ComplexIssueInputFieldValue.with("id", id.toString())));
201 }
202
203 public IssueInputBuilder setReporter(BasicUser reporter) {
204 return setReporterName(reporter.getName());
205 }
206
207 public IssueInputBuilder setReporterName(String reporterName) {
208 return setFieldInput(new FieldInput(IssueFieldId.REPORTER_FIELD, ComplexIssueInputFieldValue.with("name", reporterName)));
209 }
210
211 public IssueInputBuilder addProperty(final String key, final String value) {
212 properties.add(new PropertyInput(key, value));
213 return this;
214 }
215
216
217
218
219
220
221
222 @SuppressWarnings("UnusedDeclaration")
223 public ValueTransformerManager getValueTransformerManager() {
224 return valueTransformerManager;
225 }
226
227 private <T> Iterable<ComplexIssueInputFieldValue> toListOfComplexIssueInputFieldValueWithSingleKey(final Iterable<T> items, final String key) {
228 return Iterables.transform(items, new Function<T, ComplexIssueInputFieldValue>() {
229
230 @Override
231 public ComplexIssueInputFieldValue apply(T value) {
232 return ComplexIssueInputFieldValue.with(key, value);
233 }
234 });
235 }
236
237 }