Skip to content

Commit 2efd0bc

Browse files
committed
Adjust to Jackson3-backed implementation.
Signed-off-by: Olga Maciaszek-Sharma <[email protected]>
1 parent 7dda21b commit 2efd0bc

File tree

23 files changed

+391
-389
lines changed

23 files changed

+391
-389
lines changed

docs/pom.xml

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<!-- Aligned with Groovy in SC-Build -->
2525
<groovy.version>4.0.6</groovy.version>
2626
<generate-adoc-resource.phase>process-classes</generate-adoc-resource.phase>
27+
<jsonschema.version>4.38.0</jsonschema.version>
2728
</properties>
2829

2930
<build>
@@ -186,9 +187,18 @@
186187
<artifactId>spring-amqp</artifactId>
187188
</dependency>
188189
<dependency>
189-
<groupId>com.fasterxml.jackson.module</groupId>
190-
<artifactId>jackson-module-jsonSchema</artifactId>
191-
<version>${jackson-module-jsonSchema.version}</version>
190+
<groupId>tools.jackson.dataformat</groupId>
191+
<artifactId>jackson-dataformat-yaml</artifactId>
192+
</dependency>
193+
<dependency>
194+
<groupId>com.github.victools</groupId>
195+
<artifactId>jsonschema-generator</artifactId>
196+
<version>${jsonschema.version}</version>
197+
</dependency>
198+
<dependency>
199+
<groupId>com.github.victools</groupId>
200+
<artifactId>jsonschema-module-jackson</artifactId>
201+
<version>${jsonschema.version}</version>
192202
</dependency>
193203
</dependencies>
194204
</profile>

docs/src/main/java/org/springframework/cloud/contract/docs/Main.java

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,19 @@
2424
import java.util.List;
2525
import java.util.stream.Collectors;
2626

27-
import com.fasterxml.jackson.core.JsonProcessingException;
28-
import com.fasterxml.jackson.databind.ObjectMapper;
29-
import com.fasterxml.jackson.databind.SerializationFeature;
30-
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
31-
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
32-
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
33-
import com.fasterxml.jackson.module.jsonSchema.JsonSchemaGenerator;
27+
import com.github.victools.jsonschema.generator.OptionPreset;
28+
import com.github.victools.jsonschema.generator.SchemaGenerator;
29+
import com.github.victools.jsonschema.generator.SchemaGeneratorConfig;
30+
import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder;
31+
import com.github.victools.jsonschema.generator.SchemaVersion;
32+
import com.github.victools.jsonschema.module.jackson.JacksonModule;
3433
import org.slf4j.Logger;
3534
import org.slf4j.LoggerFactory;
35+
import tools.jackson.databind.JsonNode;
36+
import tools.jackson.databind.SerializationFeature;
37+
import tools.jackson.databind.json.JsonMapper;
38+
import tools.jackson.dataformat.yaml.YAMLMapper;
39+
import tools.jackson.dataformat.yaml.YAMLWriteFeature;
3640

3741
import org.springframework.beans.factory.config.BeanDefinition;
3842
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
@@ -71,11 +75,16 @@ void produceJsonSchemaOfAYamlModel() throws IOException {
7175
log.info("Generated schema!");
7276
}
7377

74-
private String generateJsonSchemaForClass(Class clazz) throws JsonProcessingException {
75-
ObjectMapper mapper = new ObjectMapper();
76-
mapper.enable(SerializationFeature.INDENT_OUTPUT);
77-
JsonSchemaGenerator schemaGen = new JsonSchemaGenerator(mapper);
78-
JsonSchema schema = schemaGen.generateSchema(clazz);
78+
private String generateJsonSchemaForClass(Class clazz) {
79+
JsonMapper mapper = JsonMapper.builder()
80+
.enable(SerializationFeature.INDENT_OUTPUT)
81+
.build();
82+
SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_2020_12,
83+
OptionPreset.PLAIN_JSON)
84+
.with(new JacksonModule());
85+
SchemaGeneratorConfig config = configBuilder.build();
86+
SchemaGenerator generator = new SchemaGenerator(config);
87+
JsonNode schema = generator.generateSchema(clazz);
7988
return mapper.writeValueAsString(schema);
8089
}
8190

@@ -89,9 +98,10 @@ void produceAdocWithAllOfMetadataClasses() throws Exception {
8998
}
9099

91100
private StringBuilder adocWithMetadata(List<Class> metadata) throws Exception {
92-
YAMLMapper mapper = new YAMLMapper();
93-
mapper.enable(SerializationFeature.INDENT_OUTPUT);
94-
mapper.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);
101+
YAMLMapper mapper = YAMLMapper.builder()
102+
.enable(SerializationFeature.INDENT_OUTPUT)
103+
.disable(YAMLWriteFeature.WRITE_DOC_START_MARKER)
104+
.build();
95105
StringBuilder sb = new StringBuilder();
96106
for (Class metadatum : metadata) {
97107
Constructor constructor = null;

spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/wiremock/DefaultWireMockStubPostProcessor.java

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020
import java.util.List;
2121
import java.util.Map;
2222

23-
import com.fasterxml.jackson.core.JsonProcessingException;
24-
import com.fasterxml.jackson.databind.ObjectMapper;
2523
import com.github.tomakehurst.wiremock.common.Metadata;
2624
import com.github.tomakehurst.wiremock.extension.Parameters;
2725
import com.github.tomakehurst.wiremock.extension.PostServeActionDefinition;
@@ -30,12 +28,13 @@
3028
import com.github.tomakehurst.wiremock.http.Fault;
3129
import com.github.tomakehurst.wiremock.http.ResponseDefinition;
3230
import com.github.tomakehurst.wiremock.stubbing.StubMapping;
31+
import tools.jackson.databind.json.JsonMapper;
3332

3433
import org.springframework.cloud.contract.spec.Contract;
3534

3635
class DefaultWireMockStubPostProcessor implements WireMockStubPostProcessor {
3736

38-
private final ObjectMapper objectMapper = new ObjectMapper();
37+
private final JsonMapper objectMapper = new JsonMapper();
3938

4039
@Override
4140
public StubMapping postProcess(StubMapping stubMapping, Contract contract) {
@@ -67,9 +66,12 @@ public void setMetadata(StubMapping stubMapping, StubMapping stubMappingFromMeta
6766

6867
public ResponseDefinition mergedResponse(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
6968
return new ResponseDefinition(stubMapping.getResponse().getStatus(),
70-
stubMapping.getResponse().getStatusMessage(), stubMapping.getResponse().getBody(),
71-
stubMapping.getResponse().getJsonBody(), stubMapping.getResponse().getBase64Body(),
72-
stubMapping.getResponse().getBodyFileName(), stubMapping.getResponse().getHeaders(),
69+
stubMapping.getResponse().getStatusMessage(), stubMapping.getResponse()
70+
.getBody(),
71+
stubMapping.getResponse().getJsonBody(), stubMapping.getResponse()
72+
.getBase64Body(),
73+
stubMapping.getResponse().getBodyFileName(), stubMapping.getResponse()
74+
.getHeaders(),
7375
stubMapping.getResponse().getAdditionalProxyRequestHeaders(),
7476
fixedDelayMilliseconds(stubMapping, stubMappingFromMetadata),
7577
delayDistribution(stubMapping, stubMappingFromMetadata),
@@ -95,17 +97,20 @@ public Parameters transformerParameters(StubMapping stubMapping, StubMapping stu
9597

9698
public List<String> transformers(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
9799
return stubMappingFromMetadata.getResponse().getTransformers() != null
98-
? stubMappingFromMetadata.getResponse().getTransformers() : stubMapping.getResponse().getTransformers();
100+
? stubMappingFromMetadata.getResponse()
101+
.getTransformers() : stubMapping.getResponse().getTransformers();
99102
}
100103

101104
public Fault fault(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
102105
return stubMappingFromMetadata.getResponse().getFault() != null
103-
? stubMappingFromMetadata.getResponse().getFault() : stubMapping.getResponse().getFault();
106+
? stubMappingFromMetadata.getResponse()
107+
.getFault() : stubMapping.getResponse().getFault();
104108
}
105109

106110
public String proxyBaseUrl(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
107111
return stubMappingFromMetadata.getResponse().getProxyBaseUrl() != null
108-
? stubMappingFromMetadata.getResponse().getProxyBaseUrl() : stubMapping.getResponse().getProxyBaseUrl();
112+
? stubMappingFromMetadata.getResponse()
113+
.getProxyBaseUrl() : stubMapping.getResponse().getProxyBaseUrl();
109114
}
110115

111116
public String proxyUrlPrefixToRemove(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
@@ -140,25 +145,22 @@ else if (wiremock instanceof StubMapping) {
140145
return (StubMapping) wiremock;
141146
}
142147
else if (wiremock instanceof Map) {
143-
try {
144-
return StubMapping.buildFrom(this.objectMapper.writeValueAsString(wiremock));
145-
}
146-
catch (JsonProcessingException e) {
147-
throw new IllegalStateException("Failed to build StubMapping for map [" + wiremock + "]", e);
148-
}
148+
return StubMapping.buildFrom(this.objectMapper.writeValueAsString(wiremock));
149149
}
150150
throw new UnsupportedOperationException("Unsupported type for wiremock metadata extension");
151151
}
152152

153153
@Override
154154
public boolean isApplicable(Contract contract) {
155-
boolean contains = contract.getMetadata().containsKey(WireMockMetaData.METADATA_KEY);
155+
boolean contains = contract.getMetadata()
156+
.containsKey(WireMockMetaData.METADATA_KEY);
156157
if (!contains) {
157158
return false;
158159
}
159-
Object stubMapping = WireMockMetaData.fromMetadata(contract.getMetadata()).getStubMapping();
160+
Object stubMapping = WireMockMetaData.fromMetadata(contract.getMetadata())
161+
.getStubMapping();
160162
return WireMockMetaData.APPLICABLE_CLASSES.stream()
161-
.anyMatch(aClass -> aClass.isAssignableFrom(stubMapping.getClass()));
163+
.anyMatch(aClass -> aClass.isAssignableFrom(stubMapping.getClass()));
162164
}
163165

164166
}

spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/java/org/springframework/cloud/contract/verifier/wiremock/DefaultWireMockStubPostProcessorTests.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@
2020
import java.util.Map;
2121
import java.util.stream.Collectors;
2222

23-
import com.fasterxml.jackson.core.JsonProcessingException;
24-
import com.fasterxml.jackson.databind.ObjectMapper;
2523
import com.github.tomakehurst.wiremock.extension.PostServeActionDefinition;
2624
import com.github.tomakehurst.wiremock.stubbing.StubMapping;
2725
import org.junit.jupiter.api.Test;
26+
import tools.jackson.databind.json.JsonMapper;
2827

2928
import org.springframework.cloud.contract.spec.Contract;
3029

@@ -119,10 +118,10 @@ void should_merge_stub_mappings_when_stub_mapping_is_stub_mapping() {
119118
}
120119

121120
@Test
122-
void should_merge_stub_mappings_when_stub_mapping_is_map() throws JsonProcessingException {
121+
void should_merge_stub_mappings_when_stub_mapping_is_map() {
123122
Contract contract = new Contract();
124123
Map<String, Object> map = new HashMap<>();
125-
map.put("stubMapping", new ObjectMapper().readValue(POST_SERVE_ACTION, HashMap.class));
124+
map.put("stubMapping", new JsonMapper().readValue(POST_SERVE_ACTION, HashMap.class));
126125
contract.getMetadata().put("wiremock", map);
127126
StubMapping stubMapping = StubMapping.buildFrom(STUB_MAPPING);
128127

@@ -152,13 +151,14 @@ private void thenPostServerActionWasSet(StubMapping result) {
152151
then(result.getRequest().getMethod().getName()).isEqualTo("GET");
153152
then(result.getResponse().getStatus()).isEqualTo(200);
154153
then(result.getResponse().getBody()).isEqualTo("pong");
155-
then(result.getPostServeActions().stream().map(a -> a.getName()).collect(Collectors.toList()))
156-
.contains("webhook");
154+
then(result.getPostServeActions().stream().map(a -> a.getName())
155+
.collect(Collectors.toList()))
156+
.contains("webhook");
157157
PostServeActionDefinition definition = result.getPostServeActions()
158-
.stream()
159-
.filter(a -> a.getName().equals("webhook"))
160-
.findFirst()
161-
.orElseThrow(() -> new AssertionError("No webhook action found"));
158+
.stream()
159+
.filter(a -> a.getName().equals("webhook"))
160+
.findFirst()
161+
.orElseThrow(() -> new AssertionError("No webhook action found"));
162162
then(definition.getParameters().getString("method")).isEqualTo("POST");
163163
}
164164

spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ dependencies {
6464
implementation "com.jcraft:jsch.agentproxy.jsch:${jschVersion}"
6565
implementation "com.jcraft:jsch.agentproxy.sshagent:${jschVersion}"
6666
implementation "com.jcraft:jsch.agentproxy.usocket-jna:${jschVersion}"
67-
implementation "com.fasterxml.jackson.core:jackson-databind:${jacksonDatabindVersion}"
67+
implementation "tools.jackson.core:jackson-databind:${jacksonDatabindVersion}"
6868

6969
implementation "org.springframework:spring-core:${springVersion}"
7070
implementation("org.springframework.cloud:spring-cloud-contract-shade:${project.version}")

spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ org.gradle.daemon=false
2020
aetherVersion=1.1.0
2121
springCloudBuildVersion=5.0.0-SNAPSHOT
2222
springVersion=7.0.0-M7
23-
jacksonDatabindVersion=2.13.2.1
23+
jacksonDatabindVersion=3.0.0-rc9
2424
mavenResolverVersion=1.9.18
2525
jgitVersion=5.12.0.202106070339-r
2626
jschVersion=0.0.9

spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
<artifactId>jsch.agentproxy.jsch</artifactId>
7777
</dependency>
7878
<dependency>
79-
<groupId>com.fasterxml.jackson.core</groupId>
79+
<groupId>tools.jackson.core</groupId>
8080
<artifactId>jackson-databind</artifactId>
8181
</dependency>
8282
<dependency>

spring-cloud-contract-verifier/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
<artifactId>spring-boot-test-autoconfigure</artifactId>
3535
</dependency>
3636
<dependency>
37-
<groupId>com.fasterxml.jackson.core</groupId>
37+
<groupId>tools.jackson.core</groupId>
3838
<artifactId>jackson-databind</artifactId>
3939
</dependency>
4040
<dependency>
@@ -168,7 +168,7 @@
168168
<artifactId>snakeyaml</artifactId>
169169
</dependency>
170170
<dependency>
171-
<groupId>com.fasterxml.jackson.dataformat</groupId>
171+
<groupId>tools.jackson.dataformat</groupId>
172172
<artifactId>jackson-dataformat-yaml</artifactId>
173173
</dependency>
174174
<dependency>

spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/TestGeneratorApplication.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616

1717
package org.springframework.cloud.contract.verifier;
1818

19-
import com.fasterxml.jackson.core.JsonProcessingException;
20-
import com.fasterxml.jackson.databind.ObjectMapper;
19+
import tools.jackson.databind.json.JsonMapper;
2120

2221
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties;
2322

@@ -26,14 +25,14 @@ public final class TestGeneratorApplication {
2625
private TestGeneratorApplication() {
2726
}
2827

29-
public static void main(String[] args) throws JsonProcessingException {
28+
public static void main(String[] args) {
3029
if (args.length != 1) {
3130
throw new RuntimeException("Invalid number of arguments");
3231
}
3332

34-
ObjectMapper objectMapper = new ObjectMapper();
33+
JsonMapper jsonMapper = new JsonMapper();
3534

36-
ContractVerifierConfigProperties configProperties = objectMapper.readValue(args[0],
35+
ContractVerifierConfigProperties configProperties = jsonMapper.readValue(args[0],
3736
ContractVerifierConfigProperties.class);
3837

3938
TestGenerator generator = new TestGenerator(configProperties);

spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/converter/YamlContractConverter.java

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,14 @@
1717
package org.springframework.cloud.contract.verifier.converter;
1818

1919
import java.io.File;
20-
import java.io.IOException;
2120
import java.util.Collection;
2221
import java.util.List;
2322
import java.util.Map;
2423

25-
import com.fasterxml.jackson.core.JsonProcessingException;
26-
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
2724
import org.apache.commons.lang3.StringUtils;
2825
import org.slf4j.Logger;
2926
import org.slf4j.LoggerFactory;
27+
import tools.jackson.dataformat.yaml.YAMLMapper;
3028

3129
import org.springframework.cloud.contract.spec.Contract;
3230
import org.springframework.cloud.contract.spec.ContractConverter;
@@ -91,12 +89,7 @@ public List<YamlContract> read(byte[] bytes) {
9189
return singletonList(this.mapper.readValue(bytes, YamlContract.class));
9290
}
9391
catch (Exception e) {
94-
try {
95-
return this.mapper.readerForListOf(YamlContract.class).readValue(bytes);
96-
}
97-
catch (IOException ioException) {
98-
throw new RuntimeException(ioException);
99-
}
92+
return this.mapper.readerForListOf(YamlContract.class).readValue(bytes);
10093
}
10194
}
10295

@@ -105,12 +98,8 @@ protected String name(YamlContract contract) {
10598
}
10699

107100
protected byte[] getBytes(YamlContract yamlContract) {
108-
try {
109-
return this.mapper.writeValueAsString(yamlContract).getBytes();
110-
}
111-
catch (JsonProcessingException e) {
112-
throw new RuntimeException(e);
113-
}
101+
return this.mapper.writeValueAsString(yamlContract).getBytes();
102+
114103
}
115104

116105
}

0 commit comments

Comments
 (0)