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