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