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 }