Cleanup/fix jackson 2 -> 3 migration (#3024)

Signed-off-by: Avgustin Marinov <Avgustin.Marinov@bosch.com>
This commit is contained in:
Avgustin Marinov
2026-04-16 13:29:26 +03:00
committed by GitHub
parent 000dd97bbc
commit 37559cdedc
50 changed files with 442 additions and 514 deletions

View File

@@ -32,6 +32,11 @@
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>tools.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas-test</artifactId>

View File

@@ -11,11 +11,10 @@ package org.eclipse.hawkbit.mgmt.json.model.target;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.NoArgsConstructor;
import tools.jackson.databind.annotation.JsonDeserialize;
/**
* Class to hold multiple distribution set assignments. A JSON object

View File

@@ -9,46 +9,30 @@
*/
package org.eclipse.hawkbit.mgmt.json.model.target;
import java.io.IOException;
import java.io.Serial;
import java.util.Arrays;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import tools.jackson.core.JsonParser;
import tools.jackson.databind.DeserializationContext;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.deser.std.StdDeserializer;
/**
* Deserializes a single object or a List of
* {@link MgmtDistributionSetAssignment}s
* Deserializes a single object or a List of {@link MgmtDistributionSetAssignment}s
*/
public class MgmtDistributionSetAssignmentsDeserializer extends StdDeserializer<MgmtDistributionSetAssignments> {
@Serial
private static final long serialVersionUID = 1L;
/**
* Mandatory constructor
*/
public MgmtDistributionSetAssignmentsDeserializer() {
this(null);
}
protected MgmtDistributionSetAssignmentsDeserializer(final Class<?> vc) {
super(vc);
super(MgmtDistributionSetAssignments.class);
}
@Override
public MgmtDistributionSetAssignments deserialize(final JsonParser jp, final DeserializationContext ctx)
throws IOException {
public MgmtDistributionSetAssignments deserialize(final JsonParser jp, final DeserializationContext ctx) {
final MgmtDistributionSetAssignments assignments = new MgmtDistributionSetAssignments();
final ObjectCodec codec = jp.getCodec();
final JsonNode node = codec.readTree(jp);
final JsonNode node = jp.readValueAsTree();
if (node.isArray()) {
assignments.addAll(Arrays.asList(codec.treeToValue(node, MgmtDistributionSetAssignment[].class)));
assignments.addAll(Arrays.asList(ctx.readTreeAsValue(node, MgmtDistributionSetAssignment[].class)));
} else {
assignments.add(codec.treeToValue(node, MgmtDistributionSetAssignment.class));
assignments.add(ctx.readTreeAsValue(node, MgmtDistributionSetAssignment.class));
}
return assignments;
}

View File

@@ -11,10 +11,9 @@ package org.eclipse.hawkbit.mgmt.json.model;
import static org.assertj.core.api.Assertions.assertThat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.eclipse.hawkbit.mgmt.json.model.target.MgmtTarget;
import org.junit.jupiter.api.Test;
import tools.jackson.databind.ObjectMapper;
/**
* Feature: Unit Tests - Management API<br/>
@@ -23,7 +22,7 @@ import org.junit.jupiter.api.Test;
class AuditFieldSerializationTest {
@Test
void assertAuditingFields() throws JsonProcessingException {
void assertAuditingFields() {
final MgmtTarget mgmtTarget = new MgmtTarget();
mgmtTarget.setCreatedBy("user");
mgmtTarget.setCreatedAt(System.currentTimeMillis() - 1_000_000);

View File

@@ -11,13 +11,12 @@ package org.eclipse.hawkbit.mgmt.json.model.distributionset;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.ObjectMapper;
/**
* Feature: Tests for the MgmtTargetAssignmentResponseBody<br/>
@@ -33,7 +32,7 @@ class MgmtTargetAssignmentResponseBodyTest {
* Tests that the ActionIds are serialized correctly in MgmtTargetAssignmentResponseBody
*/
@Test
void testActionIdsSerialization() throws IOException {
void testActionIdsSerialization() {
final MgmtTargetAssignmentResponseBody responseBody = generateResponseBody();
final ObjectMapper objectMapper = new ObjectMapper();
final String responseBodyAsString = objectMapper.writeValueAsString(responseBody);

View File

@@ -9,7 +9,10 @@
*/
package org.eclipse.hawkbit.mgmt.rest.resource;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
@@ -17,6 +20,7 @@ import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.servers.Server;
import io.swagger.v3.oas.models.servers.ServerVariable;
import io.swagger.v3.oas.models.servers.ServerVariables;
import io.swagger.v3.oas.models.tags.Tag;
import org.eclipse.hawkbit.rest.OpenApi;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.beans.factory.annotation.Value;
@@ -52,10 +56,10 @@ public class MgmtOpenApiConfiguration {
"""))
.servers(tenantEndpointEnabled
? List.of(
new Server()
.url("/{tenant}/")
.variables(new ServerVariables().addServerVariable("tenant", tenantSeverVariable())),
new Server().url("/"))
new Server()
.url("/{tenant}/")
.variables(new ServerVariables().addServerVariable("tenant", tenantSeverVariable())),
new Server().url("/"))
: List.of(new Server().url("/")))
.addSecurityItem(new SecurityRequirement()
.addList(BASIC_AUTH_SEC_SCHEME_NAME)
@@ -74,7 +78,7 @@ public class MgmtOpenApiConfiguration {
.type(SecurityScheme.Type.HTTP)
.bearerFormat("JWT")
.scheme("bearer")))
.tags(OpenApi.sort(openApi.getTags())))
.tags(sort(openApi.getTags())))
.build();
}
@@ -84,4 +88,35 @@ public class MgmtOpenApiConfiguration {
tenantServerVariable.setDefault("DEFAULT");
return tenantServerVariable;
}
private static final String ORDER = "order";
private static final Comparator<Tag> TAG_COMPARATOR = new Comparator<>() {
@Override
public int compare(final Tag o1, final Tag o2) {
final int o1Order = order(o1);
final int o2Order = order(o2);
if (o1Order == o2Order) {
return o1.getName().compareTo(o2.getName());
} else {
return Integer.compare(o1Order, o2Order);
}
}
private static int order(final Tag tag) {
return Optional.ofNullable(tag.getExtensions())
.map(extensions -> extensions.get(OpenApi.X_HAWKBIT))
.filter(extension -> Map.class.isAssignableFrom(extension.getClass()))
.map(Map.class::cast)
.map(propertiesMap -> propertiesMap.get(ORDER))
.map(String.class::cast)
.map(Integer::parseInt)
.orElse(0);
}
};
private static List<Tag> sort(final List<Tag> tags) {
tags.sort(TAG_COMPARATOR);
return tags;
}
}

View File

@@ -45,7 +45,6 @@ import java.util.stream.Stream;
import jakarta.validation.ConstraintViolationException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jayway.jsonpath.JsonPath;
import org.eclipse.hawkbit.auth.SpPermission;
import org.eclipse.hawkbit.exception.SpServerError;
@@ -115,7 +114,7 @@ class MgmtTargetResourceTest extends AbstractManagementApiIntegrationTest {
private static final String JSON_PATH_ROOT = "$";
// fields, attributes
private static final String JSON_PATH_FIELD_ID = ".id";
private static final String JSON_PATH_FIELD_CONTROLLERID = ".controllerId";
private static final String JSON_PATH_FIELD_CONTROLLER_ID = ".controllerId";
private static final String JSON_PATH_FIELD_NAME = ".name";
private static final String JSON_PATH_FIELD_DESCRIPTION = ".description";
private static final String JSON_PATH_FIELD_CONTENT = ".content";
@@ -133,7 +132,7 @@ class MgmtTargetResourceTest extends AbstractManagementApiIntegrationTest {
private static final String JSON_PATH_FIELD_TARGET_TYPE = ".targetType";
private static final String JSON_PATH_NAME = JSON_PATH_ROOT + JSON_PATH_FIELD_NAME;
private static final String JSON_PATH_ID = JSON_PATH_ROOT + JSON_PATH_FIELD_ID;
private static final String JSON_PATH_CONTROLLERID = JSON_PATH_ROOT + JSON_PATH_FIELD_CONTROLLERID;
private static final String JSON_PATH_CONTROLLER_ID = JSON_PATH_ROOT + JSON_PATH_FIELD_CONTROLLER_ID;
private static final String JSON_PATH_DESCRIPTION = JSON_PATH_ROOT + JSON_PATH_FIELD_DESCRIPTION;
private static final String JSON_PATH_LAST_REQUEST_AT = JSON_PATH_ROOT + JSON_PATH_FIELD_LAST_REQUEST_AT;
private static final String JSON_PATH_TYPE = JSON_PATH_ROOT + JSON_PATH_FIELD_TARGET_TYPE;
@@ -853,7 +852,7 @@ class MgmtTargetResourceTest extends AbstractManagementApiIntegrationTest {
.andDo(MockMvcResultPrinter.print())
.andExpect(status().isOk())
.andExpect(jsonPath(JSON_PATH_NAME, equalTo(knownName)))
.andExpect(jsonPath(JSON_PATH_CONTROLLERID, equalTo(knownControllerId)))
.andExpect(jsonPath(JSON_PATH_CONTROLLER_ID, equalTo(knownControllerId)))
.andExpect(jsonPath(JSON_PATH_DESCRIPTION, equalTo(TARGET_DESCRIPTION_TEST)))
.andExpect(jsonPath(JSON_PATH_LAST_REQUEST_AT, equalTo(target.getLastTargetQuery())))
.andExpect(jsonPath("$.pollStatus", hasKey("lastRequestAt")))
@@ -2353,7 +2352,7 @@ class MgmtTargetResourceTest extends AbstractManagementApiIntegrationTest {
.andDo(MockMvcResultPrinter.print())
.andExpect(status().isOk())
.andExpect(jsonPath(JSON_PATH_NAME, equalTo("targetOfType1")))
.andExpect(jsonPath(JSON_PATH_CONTROLLERID, equalTo("id2")))
.andExpect(jsonPath(JSON_PATH_CONTROLLER_ID, equalTo("id2")))
.andExpect(jsonPath(JSON_PATH_TYPE, equalTo(type1.getId().intValue())))
.andExpect(jsonPath(JSON_PATH_DESCRIPTION, equalTo("testid2")))
.andExpect(jsonPath("$._links.targetType.href", equalTo(hrefType1)))

View File

@@ -25,7 +25,6 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.eclipse.hawkbit.auth.SpPermission;
import org.eclipse.hawkbit.mgmt.json.model.system.MgmtSystemTenantConfigurationValueRequest;
import org.eclipse.hawkbit.repository.DistributionSetTypeManagement;
@@ -35,6 +34,7 @@ import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.ResultMatcher;
import tools.jackson.databind.ObjectMapper;
/**
* Spring MVC Tests against the MgmtTenantManagementResource.

View File

@@ -9,11 +9,9 @@
*/
package org.eclipse.hawkbit.mgmt.rest.resource.util;
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.eclipse.hawkbit.mgmt.json.model.artifact.MgmtArtifact;
import org.eclipse.hawkbit.rest.json.model.ExceptionInfo;
import tools.jackson.databind.ObjectMapper;
/**
* Utility additions for the REST API tests.
@@ -22,11 +20,11 @@ public final class ResourceUtility {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
public static ExceptionInfo convertException(final String jsonExceptionResponse) throws IOException {
public static ExceptionInfo convertException(final String jsonExceptionResponse) {
return OBJECT_MAPPER.readValue(jsonExceptionResponse, ExceptionInfo.class);
}
public static MgmtArtifact convertArtifactResponse(final String jsonResponse) throws IOException {
public static MgmtArtifact convertArtifactResponse(final String jsonResponse) {
return OBJECT_MAPPER.readValue(jsonResponse, MgmtArtifact.class);
}
}

View File

@@ -16,13 +16,13 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.eclipse.hawkbit.auth.SpPermission;
import org.eclipse.hawkbit.auth.SpRole;
import org.eclipse.hawkbit.repository.test.util.WithUser;
import org.junit.jupiter.api.Test;
import org.springframework.http.HttpStatus;
import org.springframework.test.context.TestPropertySource;
import tools.jackson.databind.ObjectMapper;
/**
* Feature: Integration Test - Security<br/>
@@ -96,7 +96,7 @@ class PreAuthorizeEnabledTest extends AbstractSecurityTest {
mvc.perform(get("/rest/v1/system/configs")).andExpect(result -> {
// returns default DS type because of READ_TARGET
assertThat(result.getResponse().getStatus()).isEqualTo(HttpStatus.OK.value());
assertThat((Map<?, ?>) new ObjectMapper().reader().readValue(result.getResponse().getContentAsString(), HashMap.class)).hasSize(1);
assertThat((Map<?, ?>) new ObjectMapper().readValue(result.getResponse().getContentAsString(), HashMap.class)).hasSize(1);
});
}