View Javadoc

1   /*
2    * Copyright (C) 2012 Atlassian
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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   * Builder for IssueInput class.
41   *
42   * @since 1.0
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       * Creates {@link IssueInputBuilder} without any fields pre-populated. Remember to fill required fields for the target
56       * issue action.
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      * Puts given FieldInput into fields collection.
108      * <p>
109      * <strong>Recommended</strong> way to set field value is to use {@link IssueInputBuilder#setFieldValue(String, Object)}.
110      *
111      * @param fieldInput FieldInput to insert.
112      * @return this
113      */
114     public IssueInputBuilder setFieldInput(FieldInput fieldInput) {
115         fields.put(fieldInput.getId(), fieldInput);
116         return this;
117     }
118 
119     /**
120      * Puts new {@link FieldInput} with given id and value into fields collection.
121      * <p>
122      * <strong>Recommended</strong> way to set field value is to use {@link IssueInputBuilder#setFieldValue(String, Object)}.
123      *
124      * @param id    Field's id
125      * @param value Complex value for field
126      * @return this
127      */
128     @SuppressWarnings("unused")
129     public IssueInputBuilder setFieldValue(String id, ComplexIssueInputFieldValue value) {
130         return setFieldInput(new FieldInput(id, value));
131     }
132 
133     /**
134      * Sets value of field. This method transforms given value to one of understandable by input generator.
135      *
136      * @param id    Field's id
137      * @param value Field's value
138      * @return this
139      * @throws CannotTransformValueException When transformer cannot transform given value
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      * This method returns value transformer manager used to transform values by {@link IssueInputBuilder#setFieldValue(String, Object)}.
218      * You may use this manager if you want register new custom transformer.
219      *
220      * @return value transformer manager
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 }