Skip to content

Commit 07976b1

Browse files
author
danf
committed
Add support for Vagrant and Debian uploads
1 parent 7645872 commit 07976b1

File tree

12 files changed

+217
-39
lines changed

12 files changed

+217
-39
lines changed

api/src/main/java/com/jfrog/bintray/client/api/handle/VersionHandle.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ public interface VersionHandle extends Handle<Version> {
3838

3939
VersionHandle upload(String path, InputStream content) throws BintrayCallException;
4040

41+
VersionHandle uploadVagrant(String path, String boxProvider, InputStream content) throws BintrayCallException;
42+
43+
VersionHandle uploadDebian(String path, String distribution, String component, String architecture,
44+
InputStream content) throws BintrayCallException;
45+
46+
VersionHandle uploadDebian(String path, List<String> distributions, List<String> components,
47+
List<String> architectures, InputStream content) throws BintrayCallException;
48+
4149
VersionHandle publish() throws BintrayCallException;
4250

4351
VersionHandle publishSync() throws BintrayCallException;

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ subprojects() {
5454
compile 'joda-time:joda-time:2.2'
5555
compile 'commons-io:commons-io:2.1'
5656
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.5'
57-
compile("org.apache.httpcomponents:httpclient:4.4.1") {
57+
compile("org.apache.httpcomponents:httpclient:4.5.1") {
5858
exclude group: 'commons-logging' //DO NOT REMOVE
5959
}
6060
}

impl/src/main/java/com/jfrog/bintray/client/impl/handle/VersionHandleImpl.java

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.jfrog.bintray.client.api.model.Version;
1111
import com.jfrog.bintray.client.impl.model.VersionImpl;
1212
import org.apache.commons.io.IOUtils;
13+
import org.apache.commons.lang.StringUtils;
1314
import org.apache.http.HttpResponse;
1415
import org.codehaus.jackson.map.ObjectMapper;
1516
import org.slf4j.Logger;
@@ -133,7 +134,7 @@ public VersionHandle updateAttributes(List<Attribute> attributes) throws IOExcep
133134
public VersionHandle upload(Map<String, InputStream> content) throws MultipleBintrayCallException {
134135
Map<String, InputStream> uriConvertedContent = new HashMap<>();
135136
for (String path : content.keySet()) {
136-
uriConvertedContent.put(getCurrentVersionContentUri() + path, content.get(path));
137+
uriConvertedContent.put(getUploadUriWithPath(path), content.get(path));
137138
}
138139

139140
bintrayHandle.putBinary(uriConvertedContent, null);
@@ -142,7 +143,27 @@ public VersionHandle upload(Map<String, InputStream> content) throws MultipleBin
142143

143144
@Override
144145
public VersionHandle upload(String path, InputStream content) throws BintrayCallException {
145-
bintrayHandle.putBinary(getCurrentVersionContentUri() + path, null, content);
146+
bintrayHandle.putBinary(getUploadUriWithPath(path), null, content);
147+
return this;
148+
}
149+
150+
public VersionHandle uploadVagrant(String path, String boxProvider,
151+
InputStream content) throws BintrayCallException {
152+
bintrayHandle.putBinary(getVagrantUploadUri(path, boxProvider), null, content);
153+
return this;
154+
}
155+
156+
public VersionHandle uploadDebian(String path, String distribution, String component, String architecture,
157+
InputStream content) throws BintrayCallException {
158+
bintrayHandle.putBinary(getUploadUriWithPath(path),
159+
getDebianCoordinatesHeaders(distribution, component, architecture), content);
160+
return this;
161+
}
162+
163+
public VersionHandle uploadDebian(String path, List<String> distributions, List<String> components,
164+
List<String> architectures, InputStream content) throws BintrayCallException {
165+
bintrayHandle.putBinary(getUploadUriWithPath(path),
166+
getDebianCoordinatesHeaders(distributions, components, architectures), content);
146167
return this;
147168
}
148169

@@ -218,6 +239,29 @@ private String getCurrentVersionFullyQualifiedUri() {
218239
packageHandle.repository().name(), packageHandle.name(), name);
219240
}
220241

242+
private String getVagrantUploadUri(String path, String boxProvider) {
243+
return getUploadUriWithPath(path) + "?box_provider=" + boxProvider;
244+
}
245+
246+
private String getUploadUriWithPath(String path) {
247+
return getCurrentVersionContentUri() + path;
248+
}
249+
250+
private Map<String, String> getDebianCoordinatesHeaders(List<String> distributions, List<String> components,
251+
List<String> architectures) {
252+
return getDebianCoordinatesHeaders(StringUtils.join(distributions, ","), StringUtils.join(components, ","),
253+
StringUtils.join(architectures, ","));
254+
}
255+
256+
private Map<String, String> getDebianCoordinatesHeaders(String distribution, String component,
257+
String architecture) {
258+
Map<String, String> coordinatesHeaders = new HashMap<>();
259+
coordinatesHeaders.put("X-Bintray-Debian-Distribution", distribution);
260+
coordinatesHeaders.put("X-Bintray-Debian-Component", component);
261+
coordinatesHeaders.put("X-Bintray-Debian-Architecture", architecture);
262+
return coordinatesHeaders;
263+
}
264+
221265
private VersionHandle upload(List<File> content, boolean recursive) {
222266
// TODO: implement upload of files
223267
throw new UnsupportedOperationException("Not yet implemented");

impl/src/test/groovy/com/jfrog/bintray/client/test/BintraySpecSuite.groovy

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,31 @@ package com.jfrog.bintray.client.test
33
import ch.qos.logback.classic.Level
44
import ch.qos.logback.classic.Logger
55
import ch.qos.logback.classic.LoggerContext
6+
import com.jfrog.bintray.client.api.BintrayCallException
67
import com.jfrog.bintray.client.api.details.Attribute
78
import com.jfrog.bintray.client.api.details.PackageDetails
9+
import com.jfrog.bintray.client.api.details.RepositoryDetails
810
import com.jfrog.bintray.client.api.details.VersionDetails
911
import com.jfrog.bintray.client.api.handle.Bintray
1012
import com.jfrog.bintray.client.impl.BintrayClient
1113
import com.jfrog.bintray.client.impl.HttpClientConfigurator
1214
import com.jfrog.bintray.client.impl.handle.BintrayImpl
1315
import com.jfrog.bintray.client.test.spec.*
1416
import org.apache.http.auth.UsernamePasswordCredentials
17+
import org.codehaus.jackson.map.ObjectMapper
1518
import org.junit.BeforeClass
1619
import org.junit.runner.RunWith
1720
import org.junit.runners.Suite
1821
import org.slf4j.LoggerFactory
1922
import spock.lang.Shared
2023

24+
import static com.jfrog.bintray.client.api.BintrayClientConstatnts.API_REPOS
25+
2126
/**
2227
* @author Dan Feldman
2328
*/
2429
@RunWith(Suite)
25-
@Suite.SuiteClasses([RepoSpec.class, PackageSpec.class, VersionSpec.class, BintrayClientSpec.class, ProductSpec.class])
30+
@Suite.SuiteClasses([RepoSpec.class, PackageSpec.class, VersionSpec.class, BintrayClientSpec.class, ProductSpec.class, SpecialArtifactUploadSpec.class])
2631
class BintraySpecSuite {
2732

2833
public static final String REPO_CREATE_NAME = 'repoTest'
@@ -53,6 +58,8 @@ class BintraySpecSuite {
5358
@Shared
5459
public static String repoJson
5560
@Shared
61+
public static String genericRepoJson
62+
@Shared
5663
public static String productJson
5764

5865
public static ArrayList<Attribute<String>> attributes = [
@@ -88,18 +95,13 @@ class BintraySpecSuite {
8895
if (apiKeyFromEnv) {
8996
connectionProperties.apiKey = apiKeyFromEnv
9097
}
91-
def emailFromEnv = System.getenv('BINTRAY_EMAIL')
92-
if (emailFromEnv) {
93-
connectionProperties.email = emailFromEnv
94-
}
9598
def orgFromEnv = System.getenv('BINTRAY_ORG')
9699
if (orgFromEnv) {
97100
connectionProperties.org = orgFromEnv
98101
}
99102
assert connectionProperties
100103
assert connectionProperties.username
101104
assert connectionProperties.apiKey
102-
assert connectionProperties.email
103105

104106
bintray = BintrayClient.create(getApiUrl(),
105107
connectionProperties.username as String,
@@ -154,6 +156,15 @@ class BintraySpecSuite {
154156
" \"labels\":[\"lable1\", \"label2\"]\n" +
155157
"}"
156158

159+
genericRepoJson = "{\n" +
160+
" \"name\": \"" + REPO_NAME + "\",\n" +
161+
" \"type\": \"generic\",\n" +
162+
" \"private\": false,\n" +
163+
" \"premium\": false,\n" +
164+
" \"desc\": \"Generic Test Repo\",\n" +
165+
" \"labels\":[\"testLabel1\", \"testLabel2\"]\n" +
166+
"}"
167+
157168
productJson = "{\n" +
158169
" \"name\": \"" + TEST_PRODUCT_NAME + "\",\n" +
159170
" \"desc\": \"product description\",\n" +
@@ -190,4 +201,25 @@ class BintraySpecSuite {
190201
public static String getDownloadUrl() {
191202
return connectionProperties.bintrayDownloadUrl ?: 'https://dl.bintray.com'
192203
}
204+
205+
public static void createRepoIfNeeded(String repoName, String repoJson) {
206+
if (!bintray.subject(connectionProperties.username).repository(repoName).exists()) {
207+
ObjectMapper mapper = new ObjectMapper()
208+
RepositoryDetails repositoryDetails = mapper.readValue(repoJson, RepositoryDetails.class)
209+
bintray.subject(connectionProperties.username).createRepo(repositoryDetails)
210+
}
211+
}
212+
213+
public static void deleteRepo(String repoName) {
214+
try {
215+
String repo = "/" + API_REPOS + connectionProperties.username + "/" + repoName
216+
restClient.delete(repo, null)
217+
} catch (BintrayCallException bce) {
218+
if (bce.getStatusCode() != 404) {
219+
System.err.println("cleanup: " + bce)
220+
}
221+
} catch (Exception e) {
222+
System.err.println("cleanup: " + e)
223+
}
224+
}
193225
}

impl/src/test/groovy/com/jfrog/bintray/client/test/spec/BintrayClientSpec.groovy

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ class BintrayClientSpec extends Specification {
3535
private static Map files = ['com/bla/bintray-client-java-api.jar' : getClass().getResourceAsStream('/testJar1.jar'),
3636
'org/foo/bar/bintray-client-java-service.jar': getClass().getResourceAsStream('/testJar2.jar')]
3737

38+
def void setup() {
39+
createRepoIfNeeded(REPO_NAME, genericRepoJson)
40+
}
41+
3842
def 'Test correct URL encoding'() {
3943
setup:
4044
def path1 = "content/user/" + REPO_NAME + "/" + PKG_NAME + "/" + VERSION + "/com/jfrog/bintray/bintray-test/1.0/bintray-test-1.0.pom;publish=1"
@@ -86,8 +90,7 @@ class BintrayClientSpec extends Specification {
8690
def 'files uploaded and can be accessed by the author'() {
8791
setup:
8892
def ver = bintray.subject(connectionProperties.username).repository(REPO_NAME).createPkg(pkgBuilder).createVersion(versionBuilder)
89-
String url = getDownloadUrl()
90-
def downloadServerClient = createClient(url)
93+
def downloadServerClient = createClient(getDownloadUrl())
9194
files = ['com/bla/bintray-client-java-api.jar' : getClass().getResourceAsStream('/testJar1.jar'),
9295
'org/foo/bar/bintray-client-java-service.jar': getClass().getResourceAsStream('/testJar2.jar')]
9396

@@ -267,4 +270,8 @@ class BintrayClientSpec extends Specification {
267270
System.err.println("cleanup: " + e)
268271
}
269272
}
273+
274+
def cleanup() {
275+
deleteRepo(REPO_NAME)
276+
}
270277
}

impl/src/test/groovy/com/jfrog/bintray/client/test/spec/PackageSpec.groovy

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ import static org.apache.http.HttpStatus.SC_NOT_FOUND
2424
*/
2525
class PackageSpec extends Specification {
2626

27+
def void setup() {
28+
createRepoIfNeeded(REPO_NAME, genericRepoJson)
29+
}
30+
2731
def 'Package created'() {
2832
setup:
2933
bintray.subject(connectionProperties.username).repository(REPO_NAME).createPkg(pkgBuilder).createVersion(versionBuilder)
@@ -158,4 +162,8 @@ class PackageSpec extends Specification {
158162
System.err.println("cleanup: " + e)
159163
}
160164
}
165+
166+
def cleanup() {
167+
deleteRepo(REPO_NAME)
168+
}
161169
}

impl/src/test/groovy/com/jfrog/bintray/client/test/spec/ProductSpec.groovy

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import spock.lang.IgnoreIf
1414
import spock.lang.Specification
1515

1616
import static com.jfrog.bintray.client.api.BintrayClientConstatnts.API_PRODUCTS
17-
import static com.jfrog.bintray.client.api.BintrayClientConstatnts.API_REPOS
1817
import static com.jfrog.bintray.client.test.BintraySpecSuite.*
1918

2019
/**
@@ -108,16 +107,8 @@ class ProductSpec extends Specification {
108107
} catch (Exception e) {
109108
System.err.println("cleanup: " + e)
110109
}
111-
String delRepo = "/" + API_REPOS + connectionProperties.org + "/" + REPO_CREATE_NAME
112-
try {
113-
restClient.delete(delRepo, null)
114-
} catch (BintrayCallException bce) {
115-
if (bce.getStatusCode() != 404) {
116-
System.err.println("cleanup: " + bce)
117-
}
118-
} catch (Exception e) {
119-
System.err.println("cleanup: " + e)
120-
}
110+
111+
deleteRepo(REPO_CREATE_NAME)
121112
}
122113

123114
public static boolean testOrgDefined() {

impl/src/test/groovy/com/jfrog/bintray/client/test/spec/RepoSpec.groovy

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ import com.jfrog.bintray.client.api.BintrayCallException
44
import com.jfrog.bintray.client.api.details.RepositoryDetails
55
import com.jfrog.bintray.client.api.handle.RepositoryHandle
66
import com.jfrog.bintray.client.api.model.Pkg
7-
import com.jfrog.bintray.client.api.model.Subject
87
import com.jfrog.bintray.client.impl.model.RepositoryImpl
9-
import com.timgroup.jgravatar.Gravatar
108
import groovy.json.JsonSlurper
119
import org.apache.commons.io.IOUtils
1210
import org.apache.http.HttpHeaders
@@ -24,17 +22,8 @@ import static org.apache.http.HttpStatus.SC_NOT_FOUND
2422
*/
2523
class RepoSpec extends Specification {
2624

27-
def 'Connection is successful and subject has correct username and avatar'() {
28-
//noinspection JavaStylePropertiesInvocation,GroovySetterCallCanBePropertyAccess
29-
setup:
30-
Gravatar gravatar = new Gravatar().setSize(140)
31-
32-
when:
33-
Subject clientTests = bintray.subject(connectionProperties.username).get()
34-
35-
then:
36-
clientTests.name == connectionProperties.username
37-
new URL(clientTests.gravatarId).bytes == gravatar.download(connectionProperties.email as String)
25+
def void setup() {
26+
createRepoIfNeeded(REPO_NAME, genericRepoJson)
3827
}
3928

4029
def 'Default Repos exist'(String repoName, def _) {
@@ -156,7 +145,7 @@ class RepoSpec extends Specification {
156145
updateDetails.getLabels().sort().equals(directJson.labels.sort())
157146
}
158147

159-
def 'Delete repository'(){
148+
def 'Delete repository'() {
160149
setup:
161150
ObjectMapper mapper = new ObjectMapper()
162151
RepositoryDetails repositoryDetails = mapper.readValue(repoJson, RepositoryDetails.class)
@@ -170,10 +159,9 @@ class RepoSpec extends Specification {
170159
!bintray.subject(connectionProperties.username).repository(repositoryDetails.name).exists()
171160
}
172161

173-
def cleanup() {
162+
def static void tearDown() {
174163
try {
175-
String repo = "/" + API_REPOS + connectionProperties.username + "/" + REPO_CREATE_NAME
176-
restClient.delete(repo, null)
164+
177165
} catch (BintrayCallException bce) {
178166
if (bce.getStatusCode() != 404) {
179167
System.err.println("cleanup: " + bce)
@@ -182,4 +170,9 @@ class RepoSpec extends Specification {
182170
System.err.println("cleanup: " + e)
183171
}
184172
}
173+
174+
def cleanup() {
175+
deleteRepo(REPO_CREATE_NAME)
176+
deleteRepo(REPO_NAME)
177+
}
185178
}

0 commit comments

Comments
 (0)