View Javadoc

1   package com.atlassian.marketplace.client.impl;
2   
3   import com.atlassian.fugue.Option;
4   import com.atlassian.marketplace.client.MpacException;
5   import com.atlassian.marketplace.client.api.Page;
6   import com.atlassian.marketplace.client.api.PageReference;
7   import com.atlassian.marketplace.client.api.ProductQuery;
8   import com.atlassian.marketplace.client.api.ProductVersionSpecifier;
9   import com.atlassian.marketplace.client.api.Products;
10  import com.atlassian.marketplace.client.api.QueryBounds;
11  import com.atlassian.marketplace.client.api.UriTemplate;
12  import com.atlassian.marketplace.client.model.Product;
13  import com.atlassian.marketplace.client.model.ProductVersion;
14  import com.atlassian.marketplace.client.util.UriBuilder;
15  
16  import com.google.common.collect.ImmutableMap;
17  
18  final class ProductsImpl extends ApiImplBase implements Products
19  {
20      ProductsImpl(ApiHelper apiHelper, InternalModel.MinimalLinks root) throws MpacException
21      {
22          super(apiHelper, root, "products");
23      }
24  
25      @Override
26      public Option<Product> getByKey(String productKey, ProductQuery query) throws MpacException
27      {
28          InternalModel.Products collectionRep = getEmptyBaseCollectionRep();
29          UriTemplate byKeyTemplate = ApiHelper.requireLinkUriTemplate(collectionRep.getLinks(), "byKey", InternalModel.Products.class);
30          UriBuilder uri = UriBuilder.fromUri(byKeyTemplate.resolve(ImmutableMap.of("productKey", productKey)));
31          ApiHelper.addProductQueryParams(query, uri);
32          return apiHelper.getOptionalEntity(uri.build(), Product.class);
33      }
34  
35      @Override
36      public Option<ProductVersion> getVersion(String productKey, ProductVersionSpecifier versionQuery) throws MpacException
37      {
38          InternalModel.Products collectionRep = getEmptyBaseCollectionRep();
39          UriTemplate template = ApiHelper.requireLinkUriTemplate(collectionRep.getLinks(),
40                  getVersionLinkTemplateRel(versionQuery), InternalModel.Products.class);
41          ImmutableMap.Builder<String, String> params = ImmutableMap.builder();
42          params.put("productKey", productKey);
43          for (Integer b: versionQuery.getBuildNumber())
44          {
45              params.put("buildNumber", String.valueOf(b));
46          }
47          for (String n: versionQuery.getName())
48          {
49              params.put("versionName", n);
50          }
51          UriBuilder uri = UriBuilder.fromUri(template.resolve(params.build()));
52          return apiHelper.getOptionalEntity(uri.build(), ProductVersion.class);
53      }
54      
55      private String getVersionLinkTemplateRel(ProductVersionSpecifier versionQuery)
56      {
57          return versionQuery.getBuildNumber().isDefined() ? "versionByBuild" :
58              (versionQuery.getName().isDefined() ? "versionByName" : "latestVersion");
59      }
60      
61      @Override
62      public Page<Product> find(ProductQuery query) throws MpacException
63      {
64          final UriBuilder uri = fromApiRoot();
65          ApiHelper.addProductQueryParams(query, uri);
66          return apiHelper.getMore(new PageReference<Product>(
67              uri.build(), query.getBounds(), pageReader(InternalModel.Products.class)));
68      }
69  
70      private InternalModel.Products getEmptyBaseCollectionRep() throws MpacException
71      {
72          UriBuilder uri = fromApiRoot();
73          ApiHelper.addBoundsParams(ProductQuery.builder().bounds(QueryBounds.empty()).build(), uri);
74          return apiHelper.getEntity(uri.build(), InternalModel.Products.class);
75      }
76  }