Skip to content

Commit

Permalink
refactor: use our own JsonParseException
Browse files Browse the repository at this point in the history
Jackson 2.16 has removed several deprecated methods. We were massively
using DeserializationContext#mappingException but this one has been
deprecated since Jackson 2.9

To prevent any breaking change, I've created a JsonParseException that
extends JsonProcessingException
  • Loading branch information
jgiovaresco committed Mar 1, 2024
1 parent 65115b3 commit cf50bee
Show file tree
Hide file tree
Showing 17 changed files with 84 additions and 55 deletions.
@@ -0,0 +1,29 @@
/*
* Copyright © 2015 The Gravitee team (http://gravitee.io)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.gravitee.definition.jackson.datatype;

import com.fasterxml.jackson.core.JsonProcessingException;

public class JsonParseException extends JsonProcessingException {

public JsonParseException(String msg) {
super(msg);
}

public JsonParseException(String msg, Throwable rootCause) {
super(msg, rootCause);
}
}
Expand Up @@ -22,6 +22,7 @@
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import io.gravitee.definition.jackson.datatype.JsonParseException;
import io.gravitee.definition.model.*;
import io.gravitee.definition.model.Properties;
import io.gravitee.definition.model.flow.Flow;
Expand Down Expand Up @@ -57,14 +58,14 @@ public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOExcept
public T deserialize(JsonParser jp, DeserializationContext ctxt, T api, JsonNode node) throws IOException {
JsonNode idNode = node.get("id");
if (idNode == null) {
throw ctxt.mappingException("ID property is required");
throw new JsonParseException("ID property is required");
} else {
api.setId(idNode.asText());
}

JsonNode nameNode = node.get("name");
if (nameNode == null) {
throw ctxt.mappingException("Name property is required");
throw new JsonParseException("Name property is required");
} else {
api.setName(nameNode.asText());
}
Expand All @@ -82,7 +83,7 @@ public T deserialize(JsonParser jp, DeserializationContext ctxt, T api, JsonNode
api.setProxy(proxyNode.traverse(jp.getCodec()).readValueAs(Proxy.class));
} else {
logger.error("A proxy property is required for {}", api.getName());
throw ctxt.mappingException("A proxy property is required for " + api.getName());
throw new JsonParseException("A proxy property is required for " + api.getName());
}

JsonNode servicesNode = node.get("services");
Expand Down Expand Up @@ -114,7 +115,7 @@ public T deserialize(JsonParser jp, DeserializationContext ctxt, T api, JsonNode
if (!api.getResources().contains(resource)) {
api.getResources().add(resource);
} else {
throw ctxt.mappingException("A resource already exists with name " + resource.getName());
throw new JsonParseException("A resource already exists with name " + resource.getName());
}
} catch (IOException e) {
logger.error("An error occurred during api deserialization", e);
Expand All @@ -130,7 +131,7 @@ public T deserialize(JsonParser jp, DeserializationContext ctxt, T api, JsonNode

if (api.getDefinitionVersion() == DefinitionVersion.V1) {
if (node.get("flows") != null) {
throw ctxt.mappingException("Flows are only available for definition >= 2.x.x ");
throw new JsonParseException("Flows are only available for definition >= 2.x.x ");
}

JsonNode pathsNode = node.get("paths");
Expand All @@ -153,7 +154,7 @@ public T deserialize(JsonParser jp, DeserializationContext ctxt, T api, JsonNode

if (api.getDefinitionVersion() == DefinitionVersion.V2) {
if (node.get("paths") != null) {
throw ctxt.mappingException("Paths are only available for definition 1.x.x ");
throw new JsonParseException("Paths are only available for definition 1.x.x ");
}

JsonNode flowsNode = node.get("flows");
Expand Down
Expand Up @@ -15,24 +15,14 @@
*/
package io.gravitee.definition.jackson.datatype.api.deser;

import static java.util.Comparator.reverseOrder;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import io.gravitee.definition.model.*;
import io.gravitee.definition.model.Properties;
import io.gravitee.definition.jackson.datatype.JsonParseException;
import io.gravitee.definition.model.flow.Consumer;
import io.gravitee.definition.model.flow.ConsumerType;
import io.gravitee.definition.model.flow.Flow;
import io.gravitee.definition.model.plugins.resources.Resource;
import io.gravitee.definition.model.services.Services;
import io.gravitee.definition.model.services.discovery.EndpointDiscoveryService;
import java.io.IOException;
import java.util.*;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -58,7 +48,7 @@ public Consumer deserialize(JsonParser jp, DeserializationContext ctxt) throws I

JsonNode consumerIdNode = node.get("consumerId");
if (consumerIdNode == null) {
throw ctxt.mappingException("Consumer ID property is required");
throw new JsonParseException("Consumer ID property is required");
} else {
consumer.setConsumerId(consumerIdNode.asText());
}
Expand Down
Expand Up @@ -21,6 +21,7 @@
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import io.gravitee.definition.jackson.datatype.JsonParseException;
import io.gravitee.definition.model.Api;
import io.gravitee.definition.model.HttpRequest;
import io.gravitee.definition.model.HttpResponse;
Expand All @@ -45,15 +46,15 @@ public DebugApiDeserializer(Class<?> vc) {
}

@Override
public DebugApi deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
public DebugApi deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
JsonNode node = jp.getCodec().readTree(jp);
DebugApi debugApi = (DebugApi) this.base.deserialize(jp, ctxt, new DebugApi(), node);
JsonNode requestNode = node.get("request");
if (requestNode != null) {
debugApi.setRequest(requestNode.traverse(jp.getCodec()).readValueAs(HttpRequest.class));
} else {
logger.error("A request property is required for {}", debugApi.getName());
throw ctxt.mappingException("A request property is required for " + debugApi.getName());
throw new JsonParseException("A request property is required for " + debugApi.getName());
}

JsonNode responseNode = node.get("response");
Expand Down
Expand Up @@ -19,16 +19,19 @@
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.gravitee.definition.jackson.datatype.GraviteeMapper;
import io.gravitee.definition.jackson.datatype.JsonParseException;
import io.gravitee.definition.model.Endpoint;
import io.gravitee.definition.model.ssl.pem.PEMTrustStore;
import java.io.IOException;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @author David BRASSELY (david.brassely at graviteesource.com)
Expand All @@ -53,14 +56,14 @@ public Endpoint deserialize(JsonParser parser, DeserializationContext ctxt) thro
if (nameNode != null) {
name = nameNode.asText();
} else {
throw ctxt.mappingException("Endpoint name is required");
throw new JsonParseException("Endpoint name is required");
}

JsonNode targetNode = node.get("target");
if (targetNode != null) {
target = targetNode.asText();
} else {
throw ctxt.mappingException("Endpoint target is required");
throw new JsonParseException("Endpoint target is required");
}

JsonNode typeNode = node.get("type");
Expand Down
Expand Up @@ -16,13 +16,13 @@
package io.gravitee.definition.jackson.datatype.api.deser;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import io.gravitee.common.http.HttpHeader;
import io.gravitee.common.http.HttpHeaders;
import io.gravitee.definition.jackson.datatype.JsonParseException;
import io.gravitee.definition.model.*;
import io.gravitee.definition.model.services.Services;
import java.io.IOException;
Expand All @@ -42,7 +42,7 @@ public EndpointGroupDeserializer(Class<EndpointGroup> vc) {
}

@Override
public EndpointGroup deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
public EndpointGroup deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
JsonNode node = jp.getCodec().readTree(jp);

final EndpointGroup group = new EndpointGroup();
Expand All @@ -61,7 +61,7 @@ public EndpointGroup deserialize(JsonParser jp, DeserializationContext ctxt) thr
if (endpoint != null) {
boolean added = endpoints.add(endpoint);
if (!added) {
throw ctxt.mappingException("[api] API endpoint names must be unique");
throw new JsonParseException("[api] API endpoint names must be unique");
}
}
}
Expand Down
Expand Up @@ -18,6 +18,7 @@
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import io.gravitee.definition.jackson.datatype.JsonParseException;
import io.gravitee.definition.model.Property;
import java.io.IOException;

Expand All @@ -40,14 +41,14 @@ public Property deserialize(JsonParser jp, DeserializationContext ctxt) throws I

JsonNode keyNode = node.get("key");
if (keyNode == null) {
throw ctxt.mappingException("Key property is required");
throw new JsonParseException("Key property is required");
} else {
key = keyNode.asText();
}

JsonNode valueNode = node.get("value");
if (valueNode == null) {
throw ctxt.mappingException("Value property is required");
throw new JsonParseException("Value property is required");
} else {
value = valueNode.asText();
}
Expand Down
Expand Up @@ -19,6 +19,7 @@
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import io.gravitee.definition.jackson.datatype.JsonParseException;
import io.gravitee.definition.model.plugins.resources.Resource;
import java.io.IOException;

Expand All @@ -42,21 +43,21 @@ public Resource deserialize(JsonParser jp, DeserializationContext ctxt) throws I
if (nameNode != null) {
resource.setName(nameNode.asText());
} else {
throw ctxt.mappingException("[resource] Name is required");
throw new JsonParseException("[resource] Name is required");
}

final JsonNode typeNode = node.get("type");
if (typeNode != null) {
resource.setType(typeNode.asText());
} else {
throw ctxt.mappingException("[resource] Type is required");
throw new JsonParseException("[resource] Type is required");
}

final JsonNode configurationNode = node.get("configuration");
if (configurationNode != null) {
resource.setConfiguration(configurationNode.toString());
} else {
throw ctxt.mappingException("[resource] Configuration is required");
throw new JsonParseException("[resource] Configuration is required");
}

final JsonNode enabledNode = node.get("enabled");
Expand Down
Expand Up @@ -16,9 +16,9 @@
package io.gravitee.definition.jackson.datatype.services.core.deser;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import io.gravitee.definition.jackson.datatype.JsonParseException;
import io.gravitee.definition.model.services.schedule.ScheduledService;
import java.io.IOException;
import java.util.Arrays;
Expand All @@ -36,8 +36,7 @@ public ScheduledServiceDeserializer(Class<T> vc) {
}

@Override
protected void deserialize(T service, JsonParser jsonParser, JsonNode node, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
protected void deserialize(T service, JsonParser jsonParser, JsonNode node, DeserializationContext ctxt) throws IOException {
super.deserialize(service, jsonParser, node, ctxt);

final JsonNode scheduleNode = node.get("schedule");
Expand All @@ -54,14 +53,14 @@ protected void deserialize(T service, JsonParser jsonParser, JsonNode node, Dese
if (rateNode != null) {
rate = rateNode.asLong();
} else {
throw ctxt.mappingException("[scheduled-service] Rate is required");
throw new JsonParseException("[scheduled-service] Rate is required");
}

final JsonNode unitNode = triggerNode.get("unit");
if (unitNode != null) {
unit = TimeUnit.valueOf(unitNode.asText().toUpperCase());
} else {
throw ctxt.mappingException("[scheduled-service] Unit is required");
throw new JsonParseException("[scheduled-service] Unit is required");
}
} else if (node.has("interval")) {
// Ensure backward compatibility
Expand All @@ -74,7 +73,7 @@ protected void deserialize(T service, JsonParser jsonParser, JsonNode node, Dese
if (unitNode != null) {
unit = TimeUnit.valueOf(unitNode.asText().toUpperCase());
} else {
throw ctxt.mappingException("[scheduled-service] Unit is required");
throw new JsonParseException("[scheduled-service] Unit is required");
}
}
}
Expand Down
Expand Up @@ -16,10 +16,10 @@
package io.gravitee.definition.jackson.datatype.services.core.deser;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import io.gravitee.definition.jackson.datatype.JsonParseException;
import io.gravitee.definition.model.Service;
import java.io.IOException;

Expand All @@ -44,7 +44,7 @@ public T deserialize(JsonParser jsonParser, DeserializationContext deserializati

return service;
} catch (Exception ex) {
throw deserializationContext.mappingException(ex.getMessage());
throw new JsonParseException(ex.getMessage());
}
}

Expand Down
Expand Up @@ -20,6 +20,7 @@
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import io.gravitee.definition.jackson.datatype.JsonParseException;
import io.gravitee.definition.model.Service;
import io.gravitee.definition.model.services.Services;
import io.gravitee.definition.model.services.discovery.EndpointDiscoveryService;
Expand Down Expand Up @@ -78,7 +79,7 @@ public Type getType() {
}
}
} catch (IOException ioe) {
throw ctxt.mappingException(ioe.getMessage());
throw new JsonParseException(ioe.getMessage());
}
}

Expand Down
Expand Up @@ -18,6 +18,7 @@
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import io.gravitee.definition.jackson.datatype.JsonParseException;
import io.gravitee.definition.jackson.datatype.services.core.deser.ServiceDeserializer;
import io.gravitee.definition.jackson.datatype.services.discovery.EndpointDiscoveryProviderMapper;
import io.gravitee.definition.model.services.discovery.EndpointDiscoveryService;
Expand Down Expand Up @@ -45,7 +46,7 @@ protected void deserialize(EndpointDiscoveryService service, JsonParser jsonPars
String providerPlugin = EndpointDiscoveryProviderMapper.getProvider(provider);
service.setProvider(providerPlugin);
} else {
throw ctxt.mappingException("[endpoint-discovery] Provider is required");
throw new JsonParseException("[endpoint-discovery] Provider is required");
}

service.setConfiguration(node.get("configuration").toString());
Expand Down

0 comments on commit cf50bee

Please sign in to comment.