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 }