Skip to content

Commit 7c24617

Browse files
author
danf
committed
0.7.1 - Jackson configuration changed to not send nulls for missing json keys (i.e. in details classes)
1 parent 6829c3f commit 7c24617

File tree

5 files changed

+81
-8
lines changed

5 files changed

+81
-8
lines changed

api/src/main/java/com/jfrog/bintray/client/api/details/ObjectMapperHelper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.jfrog.bintray.client.api.details;
22

33
import org.codehaus.jackson.JsonFactory;
4+
import org.codehaus.jackson.map.DeserializationConfig;
45
import org.codehaus.jackson.map.ObjectMapper;
56
import org.codehaus.jackson.map.SerializationConfig;
7+
import org.codehaus.jackson.map.annotate.JsonSerialize;
68

79
/**
810
* Helper class that provides the ObjectMapper for all Details classes
@@ -19,6 +21,11 @@ private static ObjectMapper buildDetailsMapper() {
1921
// TODO: when moving to Jackson 2.x these can be replaced with JodaModule
2022
mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
2123
mapper.configure(SerializationConfig.Feature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false);
24+
25+
//Don't include keys with null values implicitly, only explicitly set values should be sent over
26+
mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, false);
27+
mapper.configure(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES, false);
28+
mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
2229
return mapper;
2330
}
2431
}

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version=0.8-SNAPSHOT
1+
version=0.7.1-SNAPSHOT

impl/src/main/java/com/jfrog/bintray/client/impl/BintrayClient.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ static public Bintray create(String userName, String apiKey) {
4040
*/
4141
static public Bintray create(String url, String userName, String apiKey) {
4242
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(userName, apiKey);
43-
return new BintrayImpl(createClient(creds, null, BINTRAY_API_URL), BINTRAY_API_URL, DEFAULT_THREAD_POOL_SIZE,
43+
return new BintrayImpl(createClient(creds, null, url), url, DEFAULT_THREAD_POOL_SIZE,
4444
DEFAULT_SIGN_REQUEST_TIMEOUT_PER_FILE);
4545
}
4646

@@ -66,14 +66,15 @@ static public Bintray create(String bintrayUserName, String bintrayApiKey,
6666
private static CloseableHttpClient createClient(UsernamePasswordCredentials creds,
6767
HttpClientConfigurator.ProxyConfig proxyConfig, String url) {
6868

69-
String baseUrl = (url == null || url.isEmpty()) ? BINTRAY_API_URL : url;
7069
return new HttpClientConfigurator()
71-
.hostFromUrl(baseUrl)
70+
.hostFromUrl(url)
7271
.soTimeout(DEFAULT_TIMEOUT)
7372
.connectionTimeout(DEFAULT_TIMEOUT)
7473
.noRetry()
7574
.proxy(proxyConfig)
7675
.authentication(creds)
76+
.maxTotalConnections(50)
77+
.defaultMaxConnectionsPerHost(30)
7778
.getClient();
7879
}
7980
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.jfrog.bintray.client.api.BintrayCallException;
44
import com.jfrog.bintray.client.api.MultipleBintrayCallException;
55
import com.jfrog.bintray.client.api.handle.*;
6-
import com.jfrog.bintray.client.impl.BintrayClient;
76
import org.apache.commons.io.IOUtils;
87
import org.apache.http.*;
98
import org.apache.http.client.ResponseHandler;
@@ -43,7 +42,7 @@ public class BintrayImpl implements Bintray {
4342

4443
public BintrayImpl(CloseableHttpClient client, String baseUrl, int threadPoolSize, int signRequestTimeoutPerFile) {
4544
this.client = client;
46-
this.baseUrl = (baseUrl == null || baseUrl.isEmpty()) ? BintrayClient.BINTRAY_API_URL : baseUrl;
45+
this.baseUrl = baseUrl;
4746
this.executorService = Executors.newFixedThreadPool(threadPoolSize);
4847
this.signRequestTimeoutPerFile = signRequestTimeoutPerFile;
4948
}

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

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ import ch.qos.logback.classic.Logger
55
import ch.qos.logback.classic.LoggerContext
66
import com.jfrog.bintray.client.api.BintrayCallException
77
import com.jfrog.bintray.client.api.details.Attribute
8+
import com.jfrog.bintray.client.api.details.ObjectMapperHelper
89
import com.jfrog.bintray.client.api.details.PackageDetails
910
import com.jfrog.bintray.client.api.details.VersionDetails
1011
import com.jfrog.bintray.client.api.handle.Bintray
1112
import com.jfrog.bintray.client.api.handle.PackageHandle
13+
import com.jfrog.bintray.client.api.handle.RepositoryHandle
1214
import com.jfrog.bintray.client.api.handle.VersionHandle
1315
import com.jfrog.bintray.client.api.model.Pkg
1416
import com.jfrog.bintray.client.api.model.Subject
@@ -98,7 +100,7 @@ class BintrayClientSpec extends Specification {
98100
assert this.connectionProperties.username
99101
assert this.connectionProperties.apiKey
100102
assert this.connectionProperties.email
101-
bintray = BintrayClient.create(this.connectionProperties.username as String, this.connectionProperties.apiKey as String, null, null)
103+
bintray = BintrayClient.create(this.connectionProperties.username as String, this.connectionProperties.apiKey as String)
102104
restClient = createClient()
103105
pkgBuilder = new PackageDetails(PKG_NAME).description('bla-bla').labels(['l1', 'l2']).licenses(['Apache-2.0'])
104106
versionBuilder = new VersionDetails(VERSION).description('versionDesc')
@@ -412,7 +414,7 @@ class BintrayClientSpec extends Specification {
412414

413415
def 'on error response is returned without parsing'() {
414416
setup:
415-
Bintray wrongBintray = BintrayClient.create(this.connectionProperties.username as String, this.connectionProperties.apiKey as String, null, null)
417+
Bintray wrongBintray = BintrayClient.create(this.connectionProperties.username as String, this.connectionProperties.apiKey as String)
416418
when:
417419
wrongBintray.subject('bla').get()
418420
then:
@@ -596,6 +598,70 @@ class BintrayClientSpec extends Specification {
596598

597599
}
598600

601+
def 'send empty values - verify they are not null'() {
602+
603+
String minimalPkgName = "MyPackage"
604+
605+
String minimalPkgJson = "{\n" +
606+
"\t\t\"name\": \"" + minimalPkgName + "\",\n" +
607+
"\t\t\"repo\": \"" + REPO_NAME + "\",\n" +
608+
"\t\t\"owner\": \"" + connectionProperties.username + "\",\n" +
609+
"\t\t\"desc\": \"\",\n" +
610+
"\t\t\"website_url\": \"\",\n" +
611+
"\t\t\"labels\": [],\n" +
612+
"\t\t\"licenses\": [\"MIT\"]\n" +
613+
"}"
614+
615+
String minimalVerJson = "{\n" +
616+
"\t\t\"name\": \"3.3.3\",\n" +
617+
"\t\t\"vcs_tag\": \"\",\n" +
618+
"\t\t\"labels\": null,\n" +
619+
"\t\t\"description\": \"\"\n" +
620+
"}"
621+
622+
setup:
623+
ObjectMapper mapper = ObjectMapperHelper.objectMapper
624+
625+
ArrayList<String> licenses = new ArrayList<>();
626+
licenses.add("Apache-2.0")
627+
PackageDetails newPkgDetails = new PackageDetails(minimalPkgName);
628+
newPkgDetails.licenses(licenses);
629+
newPkgDetails.setRepo(REPO_NAME)
630+
newPkgDetails.setSubject(connectionProperties.username)
631+
newPkgDetails.setVcsUrl("")
632+
newPkgDetails.setDescription("")
633+
634+
VersionDetails newVerDetails = new VersionDetails("2.2.0")
635+
newVerDetails.setDescription("")
636+
637+
PackageDetails pkgDetailsFromJson = mapper.readValue(minimalPkgJson, PackageDetails.class)
638+
VersionDetails verDetailsFromJson = mapper.readValue(minimalVerJson, VersionDetails.class)
639+
640+
when:
641+
RepositoryHandle repo = bintray.subject(connectionProperties.username).repository(REPO_NAME)
642+
643+
PackageHandle pkg = repo.createPkg(newPkgDetails)
644+
VersionHandle ver = pkg.createVersion(newVerDetails)
645+
646+
pkg.update(pkgDetailsFromJson)
647+
ver.update(verDetailsFromJson)
648+
649+
String pkgJsonContent = PackageImpl.getCreateUpdateJson(pkgDetailsFromJson);
650+
String verJsonContent = VersionImpl.getCreateUpdateJson(verDetailsFromJson);
651+
652+
then:
653+
pkgJsonContent.equals("{\"name\":\"MyPackage\",\"labels\":[],\"licenses\":[\"MIT\"],\"desc\":\"\",\"website_url\":\"\"}")
654+
verJsonContent.contentEquals("{\"name\":\"3.3.3\",\"vcs_tag\":\"\"}")
655+
656+
cleanup:
657+
try {
658+
String cleanPkg = "/packages/" + connectionProperties.username + "/" + REPO_NAME + "/" + minimalPkgName
659+
restClient.delete(cleanPkg, null)
660+
} catch (Exception e) {
661+
System.err.println("cleanup: " + e)
662+
}
663+
}
664+
599665

600666
def cleanup() {
601667
try {

0 commit comments

Comments
 (0)