View Javadoc

1   package com.atlassian.marketplace.client.impl;
2   
3   import java.net.URI;
4   
5   import com.atlassian.fugue.Either;
6   import com.atlassian.fugue.Option;
7   import com.atlassian.marketplace.client.MpacException;
8   import com.atlassian.marketplace.client.api.ApplicationKey;
9   import com.atlassian.marketplace.client.api.ApplicationVersionSpecifier;
10  import com.atlassian.marketplace.client.api.ApplicationVersionsQuery;
11  import com.atlassian.marketplace.client.api.Applications;
12  import com.atlassian.marketplace.client.api.Page;
13  import com.atlassian.marketplace.client.api.PageReference;
14  import com.atlassian.marketplace.client.api.ProductQuery;
15  import com.atlassian.marketplace.client.api.QueryBounds;
16  import com.atlassian.marketplace.client.api.UriTemplate;
17  import com.atlassian.marketplace.client.model.Application;
18  import com.atlassian.marketplace.client.model.ApplicationVersion;
19  import com.atlassian.marketplace.client.util.UriBuilder;
20  
21  import com.google.common.collect.ImmutableMap;
22  
23  import static com.atlassian.fugue.Option.none;
24  import static com.atlassian.marketplace.client.impl.ApiHelper.getTemplatedLink;
25  
26  final class ApplicationsImpl extends ApiImplBase implements Applications
27  {
28      ApplicationsImpl(ApiHelper apiHelper, InternalModel.MinimalLinks root) throws MpacException
29      {
30          super(apiHelper, root, "applications");
31      }
32  
33      @Override
34      public Option<Application> getByKey(ApplicationKey applicationKey) throws MpacException
35      {
36          InternalModel.Applications collectionRep = getEmptyBaseCollectionRep();
37          UriTemplate byKeyTemplate = ApiHelper.requireLinkUriTemplate(collectionRep._links, "byKey", InternalModel.Applications.class);
38          UriBuilder uri = UriBuilder.fromUri(byKeyTemplate.resolve(ImmutableMap.of("applicationKey", applicationKey.getKey())));
39          return apiHelper.getOptionalEntity(uri.build(), Application.class);
40      }
41      
42      @Override
43      public Option<ApplicationVersion> getVersion(ApplicationKey applicationKey, ApplicationVersionSpecifier versionQuery) throws MpacException
44      {
45          for (Application a: getByKey(applicationKey))
46          {
47              URI uri = getVersionUri(a, versionQuery);
48              return apiHelper.getOptionalEntity(uri, ApplicationVersion.class);
49          }
50          return none();
51      }
52  
53      @Override
54      public Page<ApplicationVersion> getVersions(ApplicationKey applicationKey, ApplicationVersionsQuery versionsQuery) throws MpacException
55      {
56          for (Application a: getByKey(applicationKey))
57          {
58              UriTemplate ut = getVersionsUriTemplate(a);
59              ImmutableMap.Builder<String, String> params = ImmutableMap.builder();
60              for (int b: versionsQuery.getAfterBuildNumber())
61              {
62                  params.put("afterBuildNumber", String.valueOf(b));
63              }
64              UriBuilder ub = UriBuilder.fromUri(ut.resolve(params.build()));
65              ApiHelper.addBoundsParams(versionsQuery, ub);
66              return apiHelper.getMore(new PageReference<ApplicationVersion>(
67                  ub.build(), versionsQuery.getBounds(), pageReader(InternalModel.ApplicationVersions.class)));
68          }
69          return Page.empty();
70      }
71     
72      @Override
73      public ApplicationVersion createVersion(ApplicationKey applicationKey, ApplicationVersion version) throws MpacException
74      {
75          for (Application a: getByKey(applicationKey))
76          {
77              return genericCreate(getVersionsUriTemplate(a).resolve(ImmutableMap.<String, String>of()), version);
78          }
79          throw new MpacException.ServerError(404);
80      }
81  
82      @Override
83      public ApplicationVersion updateVersion(ApplicationVersion original, ApplicationVersion updated) throws MpacException
84      {
85          return genericUpdate(original.getSelfUri(), original, updated);
86      }
87      
88      private UriTemplate getVersionsUriTemplate(Application a) throws MpacException
89      {
90          return ApiHelper.requireLinkUriTemplate(a.getLinks(), "versions", Application.class);
91      }
92      
93      private InternalModel.Applications getEmptyBaseCollectionRep() throws MpacException
94      {
95          UriBuilder uri = fromApiRoot();
96          ApiHelper.addBoundsParams(ProductQuery.builder().bounds(QueryBounds.empty()).build(), uri);
97          return apiHelper.getEntity(uri.build(), InternalModel.Applications.class);
98      }
99  
100     private URI getVersionUri(Application a, ApplicationVersionSpecifier v) throws MpacException
101     {
102         for (Either<String, Integer> specifiedVersion: v.getSpecifiedVersion())
103         {
104             for (String name: specifiedVersion.left())
105             {
106                 return getTemplatedLink(a, "versionByName", "name", name);
107             }
108             for (Integer build: specifiedVersion.right())
109             {
110                 return getTemplatedLink(a, "versionByBuild", "applicationBuildNumber", String.valueOf(build));
111             }
112         }
113         return apiHelper.requireLinkUri(a.getLinks(), "latestVersion", Application.class);
114     }
115 }