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.*;
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   * Builder for IssueInput class.
32   *
33   * @since 1.0
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  	 * Puts given FieldInput into fields collection. <strong><br/>
91  	 * <p/>
92  	 * <br/>
93  	 * <strong>Recommended</strong> way to set field value is to use {@link IssueInputBuilder#setFieldValue(String, Object)}.
94  	 *
95  	 * @param fieldInput FieldInput to insert.
96  	 * @return this
97  	 */
98  	public IssueInputBuilder setFieldInput(FieldInput fieldInput) {
99  		fields.put(fieldInput.getId(), fieldInput);
100 		return this;
101 	}
102 
103 	/**
104 	 * Puts new {@link FieldInput} with given id and value into fields collection.<br/>
105 	 * <p/>
106 	 * <br/>
107 	 * <strong>Recommended</strong> way to set field value is to use {@link IssueInputBuilder#setFieldValue(String, Object)}.
108 	 *
109 	 * @param id    Field's id
110 	 * @param value Complex value for field
111 	 * @return this
112 	 */
113 	@SuppressWarnings("unused")
114 	public IssueInputBuilder setFieldValue(String id, ComplexIssueInputFieldValue value) {
115 		return setFieldInput(new FieldInput(id, value));
116 	}
117 
118 	/**
119 	 * Sets value of field. This method transforms given value to one of understandable by input generator.
120 	 *
121 	 * @param id    Field's id
122 	 * @param value Field's value
123 	 * @return this
124 	 * @throws CannotTransformValueException When transformer cannot transform given value
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 	 * This method returns value transformer manager used to transform values by {@link IssueInputBuilder#setFieldValue(String, Object)}.
198 	 * You may use this manager if you want register new custom transformer.
199 	 *
200 	 * @return value transformer manager
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 }