1 package com.atlassian.marketplace.client.impl;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.net.URI;
8
9 import com.atlassian.marketplace.client.MpacException;
10 import com.atlassian.marketplace.client.api.ArtifactId;
11 import com.atlassian.marketplace.client.api.Assets;
12 import com.atlassian.marketplace.client.api.ImageId;
13 import com.atlassian.marketplace.client.api.ImagePurpose;
14 import com.atlassian.marketplace.client.api.UriTemplate;
15 import com.atlassian.marketplace.client.model.Links;
16 import com.atlassian.marketplace.client.util.UriBuilder;
17
18 import com.google.common.collect.ImmutableMap;
19
20 final class AssetsImpl extends ApiImplBase implements Assets
21 {
22 AssetsImpl(ApiHelper apiHelper, InternalModel.MinimalLinks root) throws MpacException
23 {
24 super(apiHelper, root, "assets");
25 }
26
27 @Override
28 public ArtifactId uploadAddonArtifact(File artifactFile) throws MpacException
29 {
30 URI uri = apiHelper.requireLinkUri(getLinksOnly(getApiRoot()), "artifact", Assets.class);
31 return ArtifactId.fromUri(uploadAssetFromFile(uri, artifactFile));
32 }
33
34 @Override
35 public ImageId uploadImage(File imageFile, ImagePurpose imageType) throws MpacException
36 {
37 UriTemplate ut = ApiHelper.requireLinkUriTemplate(getLinksOnly(getApiRoot()), "imageByType", Assets.class);
38 URI uri = apiHelper.resolveLink(ut.resolve(ImmutableMap.of("imageType", imageType.getKey())));
39 return ImageId.fromUri(uploadAssetFromFile(uri, imageFile));
40 }
41
42 private URI uploadAssetFromFile(URI collectionUri, File file) throws MpacException
43 {
44 try
45 {
46 FileInputStream fis = new FileInputStream(file);
47 try
48 {
49 return uploadAssetFromStream(collectionUri, fis, file.length(), file.getName());
50 }
51 finally
52 {
53 fis.close();
54 }
55 }
56 catch (IOException e)
57 {
58 throw new MpacException(e);
59 }
60 }
61
62 private URI uploadAssetFromStream(URI collectionUri, InputStream stream, long length, String logicalFileName) throws MpacException
63 {
64 URI uri = UriBuilder.fromUri(collectionUri).queryParam("file", logicalFileName).build();
65 InternalModel.MinimalLinks result =
66 apiHelper.postContent(uri, stream, length, "application/binary", InternalModel.MinimalLinks.class);
67 return ApiHelper.requireLink(result.getLinks(), "self", Links.class).getUri();
68 }
69 }