Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v6
- name: Set up Maven Central Repository
uses: actions/setup-java@v1
uses: actions/setup-java@v5
with:
java-version: 20
java-version: 21
distribution: temurin
server-id: ossrh
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
Expand Down
9 changes: 5 additions & 4 deletions .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Set up JDK 20
uses: actions/setup-java@v1
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: 20
java-version: 21
distribution: temurin
- name: Build and analyze
run: mvn -B verify -DskipTests=true -Dgpg.skip -Dmaven.javadoc.skip=true org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Pcoverage
env:
Expand Down
7 changes: 4 additions & 3 deletions .github/workflows/publish_on_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v6
- name: Set up Maven Central Repository
uses: actions/setup-java@v1
uses: actions/setup-java@v5
with:
java-version: 20
java-version: 21
distribution: temurin
server-id: ossrh
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
Expand Down
18 changes: 4 additions & 14 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,9 @@
<commons-codec.version>1.15</commons-codec.version>
<slf4j.version>1.7.35</slf4j.version>
<httpclient.version>4.5.13</httpclient.version>
<jackson.version>2.13.3</jackson.version>
<jackson.version>3.0.3</jackson.version>
<bcpkix-jdk18.version>1.79</bcpkix-jdk18.version>
<lombok.version>1.18.22</lombok.version>
<lombok.version>1.18.42</lombok.version>

<!-- IBAN Generator -->
<iban4j.version>3.2.3-RELEASE</iban4j.version>
Expand Down Expand Up @@ -161,18 +161,8 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<groupId>tools.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.ibanity.apis.client.http.impl;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.ibanity.apis.client.http.IbanityHttpClient;
import com.ibanity.apis.client.http.handler.IbanityResponseHandler;
import lombok.NonNull;
Expand All @@ -11,6 +10,7 @@
import org.apache.http.client.methods.*;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicHeader;
import tools.jackson.core.JacksonException;

import javax.net.ssl.SSLContext;
import java.io.IOException;
Expand Down Expand Up @@ -72,7 +72,7 @@ public HttpResponse post(@NonNull URI path, @NonNull Object requestApiModel, @No
HttpPost httpPost = new HttpPost(path);
httpPost.setEntity(createEntityRequest(objectMapper().writeValueAsString(requestApiModel)));
return execute(additionalHeaders, customerAccessToken, httpPost);
} catch (JsonProcessingException exception) {
} catch (JacksonException exception) {
throw new RuntimeException("An error occurred while converting object to json", exception);
}
}
Expand Down Expand Up @@ -109,7 +109,7 @@ public HttpResponse patch(@NonNull URI path, @NonNull Object requestApiModel, @N
HttpPatch httpPatch = new HttpPatch(path);
httpPatch.setEntity(createEntityRequest(objectMapper().writeValueAsString(requestApiModel)));
return execute(additionalHeaders, customerAccessToken, httpPatch);
} catch (JsonProcessingException exception) {
} catch (JacksonException exception) {
throw new RuntimeException("An error occurred while converting object to json", exception);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.ibanity.apis.client.mappers;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.ibanity.apis.client.jsonapi.FinancialInstitutionResponseApiModel;
import com.ibanity.apis.client.jsonapi.IbanityErrorApiModel;
import com.ibanity.apis.client.jsonapi.OAuth2ErrorResourceApiModel;
import com.ibanity.apis.client.models.ErrorMeta;
import com.ibanity.apis.client.models.FinancialInstitutionResponse;
import com.ibanity.apis.client.models.IbanityError;
import tools.jackson.core.JacksonException;

import static com.ibanity.apis.client.utils.IbanityUtils.objectMapper;

Expand Down Expand Up @@ -47,7 +47,7 @@ private static String parseBody(FinancialInstitutionResponseApiModel financialIn
} else {
try {
return objectMapper().writeValueAsString(body);
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
throw new RuntimeException("Invalid payload", e);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import com.ibanity.apis.client.jsonapi.ResourceApiModel;
import com.ibanity.apis.client.models.IbanityWebhookEvent;
import com.ibanity.apis.client.utils.IbanityUtils;
import tools.jackson.core.JacksonException;

import java.io.IOException;
import java.util.function.Function;

import static java.lang.String.format;
Expand All @@ -17,7 +17,7 @@ public static <T extends IbanityWebhookEvent> T mapWebhookResource(String payloa
try {
DataApiModel dataApiModel = IbanityUtils.objectMapper().readValue(payload, ResourceApiModel.class).getData();
return customMapping.apply(dataApiModel);
} catch (IOException exception) {
} catch (JacksonException exception) {
throw new IllegalArgumentException("Response cannot be parsed", exception);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.ibanity.apis.client.products.ponto_connect.services.impl;

import com.fasterxml.jackson.databind.JsonNode;
import tools.jackson.databind.JsonNode;
import com.ibanity.apis.client.http.IbanityHttpClient;
import com.ibanity.apis.client.models.IbanityProduct;
import com.ibanity.apis.client.products.ponto_connect.models.OrganizationUsage;
Expand Down Expand Up @@ -44,7 +44,7 @@ public OrganizationUsage getOrganizationUsage(OrganizationUsageReadQuery readQue

private OrganizationUsage map(JsonNode dataApiModel) {
return OrganizationUsage.builder()
.id(dataApiModel.get("data").get("id").textValue())
.id(dataApiModel.get("data").get("id").asString())
.paymentCount(new BigDecimal(dataApiModel.get("data").get("attributes").get("paymentCount").toString()))
.accountCount(new BigDecimal(dataApiModel.get("data").get("attributes").get("accountCount").toString()))
.paymentAccountCount(new BigDecimal(dataApiModel.get("data").get("attributes").get("paymentAccountCount").toString()))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.ibanity.apis.client.services.impl;

import com.fasterxml.jackson.databind.JsonNode;
import tools.jackson.databind.JsonNode;
import com.ibanity.apis.client.http.IbanityHttpClient;
import com.ibanity.apis.client.models.IbanityProduct;
import com.ibanity.apis.client.services.ApiUrlProvider;
Expand Down Expand Up @@ -59,7 +59,7 @@ public String find(String rootPath, String[] subPaths) {

return Stream.of(subPaths)
.reduce(apiUrls, JsonNode::get, (jsonNode1, jsonNode2) -> jsonNode2)
.textValue();
.asString();
} catch (Exception exception) {
throw new IllegalArgumentException("Url cannot be found", exception);
}
Expand Down
21 changes: 10 additions & 11 deletions src/main/java/com/ibanity/apis/client/utils/IbanityUtils.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
package com.ibanity.apis.client.utils;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.ibanity.apis.client.builders.IbanityConfiguration;
import com.ibanity.apis.client.http.interceptor.IbanitySignatureInterceptor;
import com.ibanity.apis.client.http.interceptor.IdempotencyInterceptor;
Expand All @@ -17,6 +12,9 @@
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.DefaultClientConnectionReuseStrategy;
import org.apache.http.impl.client.HttpClientBuilder;
import tools.jackson.databind.DeserializationFeature;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.json.JsonMapper;

import javax.net.ssl.*;
import java.io.IOException;
Expand All @@ -35,6 +33,12 @@ public final class IbanityUtils {
private static final String CA_TRUST_STORE_KEY = "ibanity-ca";
private static final String TLS_PROTOCOL = "TLS";

public static final ObjectMapper OBJECT_MAPPER = JsonMapper.builder()
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.changeDefaultPropertyInclusion(incl -> incl.withValueInclusion(JsonInclude.Include.NON_NULL))
.changeDefaultPropertyInclusion(incl -> incl.withContentInclusion(JsonInclude.Include.NON_NULL))
.build();

private IbanityUtils() {

}
Expand Down Expand Up @@ -75,12 +79,7 @@ public static HttpClient httpClient(IbanityConfiguration configuration) {
}

public static ObjectMapper objectMapper() {
return new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule())
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return OBJECT_MAPPER;
}

private static void configureHttpClient(SSLContext sslContext,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.ibanity.apis.client.webhooks.services.impl;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import tools.jackson.core.JacksonException;
import tools.jackson.databind.JsonNode;
import com.ibanity.apis.client.exceptions.IbanityRuntimeException;
import com.ibanity.apis.client.http.IbanityHttpClient;
import com.ibanity.apis.client.models.IbanityWebhookEvent;
Expand Down Expand Up @@ -32,9 +32,9 @@ public IbanityWebhookEvent verifyAndParseEvent(String payload, String jwt) {
verify(payload, jwt);
try {
JsonNode jsonNode = IbanityUtils.objectMapper().readTree(payload);
String type = jsonNode.get("data").get("type").textValue();
String type = jsonNode.get("data").get("type").asString();
return WebhooksUtils.webhookEventParser(payload, type);
} catch (JsonProcessingException exception) {
} catch (JacksonException exception) {
throw new IllegalArgumentException("Response cannot be parsed", exception);
}
}
Expand Down
88 changes: 88 additions & 0 deletions src/test/java/com/ibanity/apis/client/utils/IbanityUtilsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.ibanity.apis.client.utils;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.jupiter.api.Test;
import tools.jackson.databind.ObjectMapper;

import java.time.Instant;
import java.util.Date;

import static org.assertj.core.api.Assertions.assertThat;

class IbanityUtilsTest {

@Test
void objectMapper_shouldDeserializeJsonWithUnknownProperties() {
ObjectMapper objectMapper = IbanityUtils.objectMapper();

String jsonWithUnknownProperty = "{\"name\":\"John\",\"unknownField\":\"value\",\"anotherUnknown\":123}";

TestPerson person = objectMapper.readValue(jsonWithUnknownProperty, TestPerson.class);

assertThat(person.getName()).isEqualTo("John");
}

@Test
void objectMapper_shouldExcludeNullPropertiesFromSerialization() {
ObjectMapper objectMapper = IbanityUtils.objectMapper();

TestPerson person = TestPerson.builder()
.name("John")
.email(null)
.build();

String json = objectMapper.writeValueAsString(person);

assertThat(json).isEqualTo("{\"name\":\"John\"}");
}

@Test
void objectMapper_shouldWriteDateAsTimestamp() {
ObjectMapper objectMapper = IbanityUtils.objectMapper();

Instant instant = Instant.parse("2023-01-15T10:30:00.000Z");
Date date = Date.from(instant);

TestWithDate testObject = TestWithDate.builder()
.id("123")
.createdAt(instant)
.updatedAt(date)
.build();

String json = objectMapper.writeValueAsString(testObject);
assertThat(json).isEqualTo("{\"createdAt\":\"2023-01-15T10:30:00Z\",\"id\":\"123\",\"updatedAt\":\"2023-01-15T10:30:00.000Z\"}");
}

@Test
void objectMapper_shouldHandleEmptyObjectSerialization() {
ObjectMapper objectMapper = IbanityUtils.objectMapper();

TestPerson person = TestPerson.builder().build();

String json = objectMapper.writeValueAsString(person);

assertThat(json).isEqualTo("{}");
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
static class TestPerson {
private String name;
private String email;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
static class TestWithDate {
private String id;
private Instant createdAt;
private Date updatedAt;
}
}