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.httpclient.api.HttpClient;
19  import com.atlassian.jira.rest.client.api.VersionRestClient;
20  import com.atlassian.jira.rest.client.api.domain.Version;
21  import com.atlassian.jira.rest.client.api.domain.VersionRelatedIssuesCount;
22  import com.atlassian.jira.rest.client.api.domain.input.VersionInput;
23  import com.atlassian.jira.rest.client.api.domain.input.VersionPosition;
24  import com.atlassian.jira.rest.client.internal.json.JsonObjectParser;
25  import com.atlassian.jira.rest.client.internal.json.VersionJsonParser;
26  import com.atlassian.jira.rest.client.internal.json.VersionRelatedIssueCountJsonParser;
27  import com.atlassian.jira.rest.client.internal.json.gen.JsonGenerator;
28  import com.atlassian.jira.rest.client.internal.json.gen.VersionInputJsonGenerator;
29  import com.atlassian.jira.rest.client.internal.json.gen.VersionPositionInputGenerator;
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 }