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.domain.input;
18  
19  import com.atlassian.jira.rest.client.domain.BasicComponent;
20  import com.atlassian.jira.rest.client.domain.BasicIssueType;
21  import com.atlassian.jira.rest.client.domain.BasicPriority;
22  import com.atlassian.jira.rest.client.domain.BasicProject;
23  import com.atlassian.jira.rest.client.domain.BasicUser;
24  import com.atlassian.jira.rest.client.domain.IssueFieldId;
25  import com.atlassian.jira.rest.client.domain.Version;
26  import com.atlassian.jira.rest.client.internal.json.JsonParseUtil;
27  import com.atlassian.jira.rest.client.internal.json.gen.ComplexIssueInputFieldValueJsonGenerator;
28  import com.google.common.base.Function;
29  import com.google.common.collect.Iterables;
30  import com.google.common.collect.Lists;
31  import com.google.common.collect.Maps;
32  import org.joda.time.DateTime;
33  
34  import java.util.Map;
35  
36  import static com.atlassian.jira.rest.client.domain.EntityHelper.toNamesList;
37  
38  /**
39   * Builder for IssueInput class.  
40   *
41   * @since 1.0
42   */
43  public class IssueInputBuilder {
44  
45  	private final ValueTransformerManager valueTransformerManager = new ValueTransformerManager()
46  			.registerTransformer(new BaseValueTransformer());
47  
48  	private Map<String, FieldInput> fields = Maps.newHashMap();
49  
50  	public IssueInputBuilder(String projectKey, Long issueTypeId) {
51  		setProjectKey(projectKey);
52  		setIssueTypeId(issueTypeId);
53  	}
54  
55  	public IssueInputBuilder(BasicProject project, BasicIssueType issueType) {
56  		setProject(project);
57  		setIssueType(issueType);
58  	}
59  
60  	@SuppressWarnings("unused")
61  	public IssueInputBuilder(String projectKey, Long issueTypeId, String summary) {
62  		this(projectKey, issueTypeId);
63  		setSummary(summary);
64  	}
65  
66  	@SuppressWarnings("unused")
67  	public IssueInputBuilder(BasicProject project, BasicIssueType issueType, String summary) {
68  		this(project, issueType);
69  		setSummary(summary);
70  	}
71  
72  	public IssueInputBuilder setSummary(String summary) {
73  		return setFieldInput(new FieldInput(IssueFieldId.SUMMARY_FIELD, summary));
74  	}
75  
76  	public IssueInputBuilder setProjectKey(String projectKey) {
77  		return setFieldInput(new FieldInput(IssueFieldId.PROJECT_FIELD, ComplexIssueInputFieldValue.with("key", projectKey)));
78  	}
79  
80  	public IssueInputBuilder setProject(BasicProject project) {
81  		return setProjectKey(project.getKey());
82  	}
83  
84  	public IssueInputBuilder setIssueTypeId(Long issueTypeId) {
85  		return setFieldInput(new FieldInput(
86  				IssueFieldId.ISSUE_TYPE_FIELD,
87  				ComplexIssueInputFieldValue.with("id", issueTypeId.toString())
88  		));
89  	}
90  
91  	public IssueInputBuilder setIssueType(BasicIssueType issueType) {
92  		return setIssueTypeId(issueType.getId());
93  	}
94  
95  	/**
96  	 * Puts given FieldInput into fields collection. <strong><br/>
97  	 * <strong>Use this method only when you are sure what you are doing</strong> - value given in {@link FieldInput} must be
98  	 * understandable by {@link ComplexIssueInputFieldValueJsonGenerator#generateFieldValueForJson(Object)}.<br/>
99  	 * <br/>
100 	 * <strong>Recommended</strong> way to set field value is to use {@link IssueInputBuilder#setFieldValue(String, Object)}.
101 	 *
102 	 * @param fieldInput FieldInput to insert.
103 	 * @return this
104 	 */
105 	public IssueInputBuilder setFieldInput(FieldInput fieldInput) {
106 		fields.put(fieldInput.getId(), fieldInput);
107 		return this;
108 	}
109 
110 	/**
111 	 * Puts new {@link FieldInput} with given id and value into fields collection.<br/>
112 	 * <strong>Use this method only when you are sure what you are doing</strong> - value given in {@link FieldInput} must be
113 	 * understandable by {@link ComplexIssueInputFieldValueJsonGenerator#generateFieldValueForJson(Object)}.<br/>
114 	 * <br/>
115 	 * <strong>Recommended</strong> way to set field value is to use {@link IssueInputBuilder#setFieldValue(String, Object)}.
116 	 *
117 	 * @param id	Field's id
118 	 * @param value Complex value for field
119 	 * @return this
120 	 */
121 	@SuppressWarnings("unused")
122 	public IssueInputBuilder setFieldValue(String id, ComplexIssueInputFieldValue value) {
123 		return setFieldInput(new FieldInput(id, value));
124 	}
125 
126 	/**
127 	 * Sets value of field. This method transforms given value to one of understandable by input generator.
128 	 *
129 	 * @param id	Field's id
130 	 * @param value Field's value
131 	 * @return this
132 	 * @throws CannotTransformValueException When transformer cannot transform given value
133 	 */
134 	public IssueInputBuilder setFieldValue(String id, Object value) throws CannotTransformValueException {
135 		return setFieldInput(new FieldInput(id, valueTransformerManager.apply(value)));
136 	}
137 
138 	public IssueInputBuilder setDescription(String summary) {
139 		return setFieldInput(new FieldInput(IssueFieldId.DESCRIPTION_FIELD, summary));
140 	}
141 
142 	public IssueInputBuilder setAssignee(BasicUser assignee) {
143 		return setAssigneeName(assignee.getName());
144 	}
145 
146 	public IssueInputBuilder setAssigneeName(String assignee) {
147 		return setFieldInput(new FieldInput(IssueFieldId.ASSIGNEE_FIELD, ComplexIssueInputFieldValue.with("name", assignee)));
148 	}
149 
150 	public IssueInput build() {
151 		return new IssueInput(fields);
152 	}
153 
154 	@SuppressWarnings("unused")
155 	public IssueInputBuilder setAffectedVersions(Iterable<Version> versions) {
156 		return setAffectedVersionsNames(toNamesList(versions));
157 	}
158 
159 	public IssueInputBuilder setAffectedVersionsNames(Iterable<String> names) {
160 		return setFieldInput(new FieldInput(IssueFieldId.AFFECTS_VERSIONS_FIELD, toListOfComplexIssueInputFieldValueWithSingleKey(names, "name")));
161 	}
162 
163 	public IssueInputBuilder setComponentsNames(Iterable<String> names) {
164 		return setFieldInput(new FieldInput(IssueFieldId.COMPONENTS_FIELD, toListOfComplexIssueInputFieldValueWithSingleKey(names, "name")));
165 	}
166 
167 	public IssueInputBuilder setComponents(Iterable<BasicComponent> basicComponents) {
168 		return setComponentsNames(toNamesList(basicComponents));
169 	}
170 
171 	public IssueInputBuilder setComponents(BasicComponent... basicComponents) {
172 		return setComponents(Lists.newArrayList(basicComponents));
173 	}
174 
175 	public IssueInputBuilder setDueDate(DateTime date) {
176 		return setFieldInput(new FieldInput(IssueFieldId.DUE_DATE_FIELD, JsonParseUtil.formatDate(date)));
177 	}
178 
179 	public IssueInputBuilder setFixVersionsNames(Iterable<String> names) {
180 		return setFieldInput(new FieldInput(IssueFieldId.FIX_VERSIONS_FIELD, toListOfComplexIssueInputFieldValueWithSingleKey(names, "name")));
181 	}
182 
183 	@SuppressWarnings("unused")
184 	public IssueInputBuilder setFixVersions(Iterable<Version> versions) {
185 		return setFixVersionsNames(toNamesList(versions));
186 	}
187 
188 	public IssueInputBuilder setPriority(BasicPriority priority) {
189 		return setPriorityId(priority.getId());
190 	}
191 
192 	public IssueInputBuilder setPriorityId(Long id) {
193 		return setFieldInput(new FieldInput(IssueFieldId.PRIORITY_FIELD, ComplexIssueInputFieldValue.with("id", id.toString())));
194 	}
195 
196 	public IssueInputBuilder setReporter(BasicUser reporter) {
197 		return setReporterName(reporter.getName());
198 	}
199 
200 	public IssueInputBuilder setReporterName(String reporterName) {
201 		return setFieldInput(new FieldInput(IssueFieldId.REPORTER_FIELD, ComplexIssueInputFieldValue.with("name", reporterName)));
202 	}
203 
204 	/**
205 	 * This method returns value transformer manager used to transform values by {@link IssueInputBuilder#setFieldValue(String, Object)}.
206 	 * You may use this manager if you want register new custom transformer.
207 	 *
208 	 * @return value transformer manager
209 	 */
210 	@SuppressWarnings("UnusedDeclaration")
211 	public ValueTransformerManager getValueTransformerManager() {
212 		return valueTransformerManager;
213 	}
214 
215 	private <T> Iterable<ComplexIssueInputFieldValue> toListOfComplexIssueInputFieldValueWithSingleKey(final Iterable<T> items, final String key) {
216 		return Iterables.transform(items, new Function<T, ComplexIssueInputFieldValue>() {
217 
218 			@Override
219 			public ComplexIssueInputFieldValue apply(T value) {
220 				return ComplexIssueInputFieldValue.with(key, value);
221 			}
222 		});
223 	}
224 
225 }