View Javadoc

1   /*
2    * Copyright (C) 2011 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.internal.jersey;
18  
19  import com.atlassian.jira.rest.client.ProgressMonitor;
20  import com.atlassian.jira.rest.client.VersionRestClient;
21  import com.atlassian.jira.rest.client.domain.Version;
22  import com.atlassian.jira.rest.client.domain.VersionRelatedIssuesCount;
23  import com.atlassian.jira.rest.client.domain.input.VersionInput;
24  import com.atlassian.jira.rest.client.domain.input.VersionPosition;
25  import com.atlassian.jira.rest.client.internal.json.JsonObjectParser;
26  import com.atlassian.jira.rest.client.internal.json.JsonParser;
27  import com.atlassian.jira.rest.client.internal.json.VersionJsonParser;
28  import com.atlassian.jira.rest.client.internal.json.VersionRelatedIssueCountJsonParser;
29  import com.atlassian.jira.rest.client.internal.json.gen.JsonGenerator;
30  import com.atlassian.jira.rest.client.internal.json.gen.VersionInputJsonGenerator;
31  import com.atlassian.jira.rest.client.internal.json.gen.VersionPositionInputGenerator;
32  import com.sun.jersey.client.apache.ApacheHttpClient;
33  import org.codehaus.jettison.json.JSONException;
34  import org.codehaus.jettison.json.JSONObject;
35  
36  import javax.annotation.Nullable;
37  import javax.ws.rs.core.UriBuilder;
38  import java.net.URI;
39  
40  /**
41   * Jersey-based implementation of VersionRestClient
42   *
43   * @since client 0.3, server 4.4
44   */
45  public class JerseyVersionRestClient extends AbstractJerseyRestClient implements VersionRestClient {
46  
47  	private final URI versionRootUri;
48  
49  	public JerseyVersionRestClient(URI baseUri, ApacheHttpClient client) {
50  		super(baseUri, client);
51  		versionRootUri = UriBuilder.fromUri(baseUri).path("version").build();
52  	}
53  
54  	@Override
55  	public Version createVersion(final VersionInput version, ProgressMonitor progressMonitor) {
56  		return postAndParse(versionRootUri, InputGeneratorCallable.create(new VersionInputJsonGenerator(), version), new VersionJsonParser(), progressMonitor);
57  	}
58  
59  	@Override
60  	public Version updateVersion(URI versionUri, final VersionInput version, ProgressMonitor progressMonitor) {
61  		return putAndParse(versionUri, InputGeneratorCallable.create(new VersionInputJsonGenerator(), version), new VersionJsonParser(), progressMonitor);
62  	}
63  
64  	@Override
65  	public void removeVersion(URI versionUri, @Nullable URI moveFixIssuesToVersionUri,
66  			@Nullable URI moveAffectedIssuesToVersionUri, ProgressMonitor progressMonitor) {
67  		final UriBuilder uriBuilder = UriBuilder.fromUri(versionUri);
68  		if (moveFixIssuesToVersionUri != null) {
69  			uriBuilder.queryParam("moveFixIssuesTo", moveFixIssuesToVersionUri);
70  		}
71  		if (moveAffectedIssuesToVersionUri != null) {
72  			uriBuilder.queryParam("moveAffectedIssuesTo", moveAffectedIssuesToVersionUri);
73  		}
74  		delete(uriBuilder.build(), progressMonitor);
75  	}
76  
77  	@Override
78  	public Version getVersion(URI versionUri, ProgressMonitor progressMonitor) {
79  		return getAndParse(versionUri, new VersionJsonParser(), progressMonitor);
80  	}
81  
82  	@Override
83  	public VersionRelatedIssuesCount getVersionRelatedIssuesCount(URI versionUri, ProgressMonitor progressMonitor) {
84  		final URI relatedIssueCountsUri = UriBuilder.fromUri(versionUri).path("relatedIssueCounts").build();
85  		return getAndParse(relatedIssueCountsUri, new VersionRelatedIssueCountJsonParser(), progressMonitor);
86  	}
87  
88  	@Override
89  	public int getNumUnresolvedIssues(URI versionUri, ProgressMonitor progressMonitor) {
90  		final URI unresolvedIssueCountUri = UriBuilder.fromUri(versionUri).path("unresolvedIssueCount").build();
91  		return getAndParse(unresolvedIssueCountUri, new JsonObjectParser<Integer>() {
92  			@Override
93  			public Integer parse(JSONObject json) throws JSONException {
94  				return json.getInt("issuesUnresolvedCount");
95  			}
96  		}, progressMonitor);
97  	}
98  
99  	@Override
100 	public Version moveVersionAfter(URI versionUri, URI afterVersionUri, ProgressMonitor progressMonitor) {
101 		final URI moveUri = getMoveVersionUri(versionUri);
102 
103 		return postAndParse(moveUri, InputGeneratorCallable.create(new JsonGenerator<URI>() {
104 			@Override
105 			public JSONObject generate(URI uri) throws JSONException {
106 				final JSONObject res = new JSONObject();
107 				res.put("after", uri);
108 				return res;
109 			}
110 		}, afterVersionUri), new VersionJsonParser(), progressMonitor);
111 	}
112 
113 	@Override
114 	public Version moveVersion(URI versionUri, final VersionPosition versionPosition, ProgressMonitor progressMonitor) {
115 		final URI moveUri = getMoveVersionUri(versionUri);
116 		return postAndParse(moveUri, InputGeneratorCallable.create(new VersionPositionInputGenerator(), versionPosition),
117 				new VersionJsonParser(), progressMonitor);
118 	}
119 
120 	private URI getMoveVersionUri(URI versionUri) {
121 		return UriBuilder.fromUri(versionUri).path("move").build();
122 	}
123 }