Skip to content

Commit 67d9f97

Browse files
authored
feat(logging): update the current logging implementation (#94)
adds support for structured logging in API calls
1 parent 8c5fb84 commit 67d9f97

28 files changed

Lines changed: 1791 additions & 1545 deletions

README.md

Lines changed: 69 additions & 42 deletions
Large diffs are not rendered by default.

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
<dependency>
5555
<groupId>io.apimatic</groupId>
5656
<artifactId>core-interfaces</artifactId>
57-
<version>[0.2, 0.3)</version>
57+
<version>[0.3, 0.4)</version>
5858
</dependency>
5959
<dependency>
6060
<groupId>junit</groupId>
@@ -96,7 +96,7 @@
9696
<dependency>
9797
<groupId>org.slf4j</groupId>
9898
<artifactId>slf4j-api</artifactId>
99-
<version>2.0.7</version>
99+
<version>2.0.10</version>
100100
</dependency>
101101
<dependency>
102102
<groupId>org.jacoco</groupId>

src/main/java/io/apimatic/core/ApiCall.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import java.io.IOException;
44
import java.util.concurrent.CompletableFuture;
55
import java.util.function.Consumer;
6+
67
import io.apimatic.core.configurations.http.request.EndpointConfiguration;
8+
import io.apimatic.core.logger.SdkLoggerFactory;
79
import io.apimatic.core.request.async.AsyncExecutor;
810
import io.apimatic.core.types.CoreApiException;
911
import io.apimatic.coreinterfaces.http.request.Request;
1012
import io.apimatic.coreinterfaces.http.request.configuration.CoreEndpointConfiguration;
1113
import io.apimatic.coreinterfaces.http.response.Response;
14+
import io.apimatic.coreinterfaces.logger.ApiLogger;
1215

1316
/**
1417
* An API call, or API request, is a message sent to a server asking an API to provide a service or
@@ -38,6 +41,12 @@ public final class ApiCall<ResponseType, ExceptionType extends CoreApiException>
3841
*/
3942
private final CoreEndpointConfiguration endpointConfiguration;
4043

44+
/**
45+
* An instance of {@link ApiLogger} for logging.
46+
*/
47+
private final ApiLogger apiLogger;
48+
49+
4150
/**
4251
* ApiCall constructor.
4352
* @param globalConfig the required configuration to built the ApiCall.
@@ -52,6 +61,7 @@ private ApiCall(final GlobalConfiguration globalConfig, final Request coreHttpRe
5261
this.request = coreHttpRequest;
5362
this.responseHandler = responseHandler;
5463
this.endpointConfiguration = coreEndpointConfiguration;
64+
this.apiLogger = SdkLoggerFactory.getLogger(globalConfig.getLoggingConfiguration());
5565
}
5666

5767
/**
@@ -61,8 +71,11 @@ private ApiCall(final GlobalConfiguration globalConfig, final Request coreHttpRe
6171
* @throws ExceptionType Represents error response from the server.
6272
*/
6373
public ResponseType execute() throws IOException, ExceptionType {
64-
Response httpResponse =
65-
globalConfig.getHttpClient().execute(request, endpointConfiguration);
74+
apiLogger.logRequest(request);
75+
Response httpResponse = globalConfig.getHttpClient()
76+
.execute(request, endpointConfiguration);
77+
apiLogger.logResponse(httpResponse);
78+
6679
return responseHandler.handle(request, httpResponse, globalConfig, endpointConfiguration);
6780
}
6881

@@ -75,7 +88,7 @@ public CompletableFuture<ResponseType> executeAsync() {
7588
request -> globalConfig.getHttpClient().executeAsync(request,
7689
endpointConfiguration),
7790
(httpRequest, httpResponse) -> responseHandler.handle(httpRequest, httpResponse,
78-
globalConfig, endpointConfiguration));
91+
globalConfig, endpointConfiguration), apiLogger);
7992
}
8093

8194
/**

src/main/java/io/apimatic/core/GlobalConfiguration.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@
66
import java.util.List;
77
import java.util.Map;
88
import java.util.function.Function;
9+
10+
import io.apimatic.core.logger.configurations.SdkLoggingConfiguration;
911
import io.apimatic.core.utilities.CoreHelper;
1012
import io.apimatic.coreinterfaces.authentication.Authentication;
1113
import io.apimatic.coreinterfaces.compatibility.CompatibilityFactory;
1214
import io.apimatic.coreinterfaces.http.Callback;
1315
import io.apimatic.coreinterfaces.http.HttpClient;
1416
import io.apimatic.coreinterfaces.http.HttpHeaders;
17+
import io.apimatic.coreinterfaces.logger.configuration.LoggingConfiguration;
1518

1619
/**
1720
* A class which hold the global configuration properties to make a successful Api Call
@@ -62,6 +65,11 @@ public final class GlobalConfiguration {
6265
*/
6366
private Function<String, String> baseUri;
6467

68+
/***
69+
* An instance of {@link LoggingConfiguration}
70+
*/
71+
private LoggingConfiguration loggingConfiguration;
72+
6573
/**
6674
* A private constructor.
6775
* @param compatibilityFactory
@@ -73,12 +81,14 @@ public final class GlobalConfiguration {
7381
* @param globalHeaders
7482
* @param additionalHeaders
7583
* @param baseUri
84+
* @param loggingConfiguration
7685
*/
7786
private GlobalConfiguration(final CompatibilityFactory compatibilityFactory,
7887
final String userAgent, final Map<String, String> userAgentConfig,
7988
final Map<String, Authentication> authentications, final Callback callback,
8089
final HttpClient httpClient, final Map<String, List<String>> globalHeaders,
81-
final HttpHeaders additionalHeaders, final Function<String, String> baseUri) {
90+
final HttpHeaders additionalHeaders, final Function<String, String> baseUri,
91+
final LoggingConfiguration loggingConfiguration) {
8292
this.compatibilityFactory = compatibilityFactory;
8393
this.userAgent = userAgent;
8494
this.userAgentConfig = userAgentConfig;
@@ -88,6 +98,7 @@ private GlobalConfiguration(final CompatibilityFactory compatibilityFactory,
8898
this.globalHeaders = globalHeaders != null ? globalHeaders : new HashMap<>();
8999
this.additionalHeaders = additionalHeaders;
90100
this.baseUri = baseUri;
101+
this.loggingConfiguration = loggingConfiguration;
91102

92103
if (this.userAgent != null) {
93104
this.userAgent = CoreHelper.updateUserAgent(userAgent, userAgentConfig);
@@ -158,6 +169,13 @@ public Function<String, String> getBaseUri() {
158169
return baseUri;
159170
}
160171

172+
/***
173+
* @return Logging configuration for Logger
174+
*/
175+
public LoggingConfiguration getLoggingConfiguration() {
176+
return loggingConfiguration;
177+
}
178+
161179
public static class Builder {
162180
/**
163181
* An instance of {@link CompatibilityFactory}.
@@ -204,6 +222,12 @@ public static class Builder {
204222
*/
205223
private Function<String, String> baseUri;
206224

225+
/***
226+
* An instance of {@link LoggingConfiguration}
227+
*/
228+
private LoggingConfiguration loggingConfiguration =
229+
new SdkLoggingConfiguration.Builder().build();
230+
207231
/**
208232
* @param compatibilityFactory value for CompatibilityFactor.
209233
* @return Builder.
@@ -293,14 +317,23 @@ public Builder baseUri(Function<String, String> baseUri) {
293317
return this;
294318
}
295319

320+
/**
321+
* @param config Logging configuration for Logger
322+
* @return Builder
323+
*/
324+
public Builder loggingConfiguration(LoggingConfiguration config) {
325+
this.loggingConfiguration = config;
326+
return this;
327+
}
328+
296329
/**
297330
* Builds a new {@link GlobalConfiguration} object using the set fields.
298331
* @return {@link GlobalConfiguration}.
299332
*/
300333
public GlobalConfiguration build() {
301334
return new GlobalConfiguration(compatibilityFactory, userAgent, userAgentConfig,
302335
authentications, callback, httpClient, globalHeaders, additionalheaders,
303-
baseUri);
336+
baseUri, loggingConfiguration);
304337
}
305338
}
306339

src/main/java/io/apimatic/core/HttpRequest.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public final class HttpRequest {
4545
/**
4646
* A StringBuilder.
4747
*/
48-
private final StringBuilder urlBuilder;
48+
private final StringBuilder queryUrlBuilder;
4949

5050
/**
5151
* An instance of {@link CompatibilityFactory}.
@@ -79,7 +79,7 @@ private HttpRequest(final GlobalConfiguration coreConfig, final String server,
7979
final ArraySerializationFormat arraySerializationFormat) throws IOException {
8080
this.coreConfig = coreConfig;
8181
this.compatibilityFactory = coreConfig.getCompatibilityFactory();
82-
urlBuilder = getStringBuilder(server, path);
82+
queryUrlBuilder = getStringBuilder(server, path, queryParams, arraySerializationFormat);
8383

8484
processTemplateParams(templateParams);
8585
Object bodyValue = buildBody(body, bodySerializer, bodyParameters);
@@ -103,11 +103,11 @@ private Request buildRequest(
103103
Map<String, Object> queryParams, List<SimpleEntry<String, Object>> formFields,
104104
ArraySerializationFormat arraySerializationFormat) throws IOException {
105105
if (body != null) {
106-
return compatibilityFactory.createHttpRequest(httpMethod, urlBuilder, headerParams,
106+
return compatibilityFactory.createHttpRequest(httpMethod, queryUrlBuilder, headerParams,
107107
queryParams, body);
108108
}
109109

110-
return compatibilityFactory.createHttpRequest(httpMethod, urlBuilder, headerParams,
110+
return compatibilityFactory.createHttpRequest(httpMethod, queryUrlBuilder, headerParams,
111111
queryParams, formFields);
112112
}
113113

@@ -150,13 +150,22 @@ private List<SimpleEntry<String, Object>> generateFormFields(
150150
return CoreHelper.prepareFormFields(formParameters, arraySerializationFormat);
151151
}
152152

153-
private StringBuilder getStringBuilder(String server, String path) {
154-
return new StringBuilder(coreConfig.getBaseUri().apply(server) + path);
153+
private StringBuilder getStringBuilder(String server, String path,
154+
Map<String, Object> queryParams,
155+
ArraySerializationFormat arraySerializationFormat) {
156+
157+
StringBuilder urlBuilder = new StringBuilder(coreConfig.getBaseUri().apply(server) + path);
158+
159+
// set query parameters
160+
CoreHelper.appendUrlWithQueryParameters(urlBuilder, queryParams,
161+
arraySerializationFormat);
162+
163+
return new StringBuilder(CoreHelper.cleanUrl(urlBuilder));
155164
}
156165

157166
private void processTemplateParams(Map<String, SimpleEntry<Object, Boolean>> templateParams) {
158167
if (!templateParams.isEmpty()) {
159-
CoreHelper.appendUrlWithTemplateParameters(urlBuilder, templateParams);
168+
CoreHelper.appendUrlWithTemplateParameters(queryUrlBuilder, templateParams);
160169
}
161170
}
162171

0 commit comments

Comments
 (0)