diff --git a/agrirouter-sdk-java-api/pom.xml b/agrirouter-sdk-java-api/pom.xml index 3a73b0c9..281c7bc8 100644 --- a/agrirouter-sdk-java-api/pom.xml +++ b/agrirouter-sdk-java-api/pom.xml @@ -44,14 +44,6 @@ org.junit.jupiter junit-jupiter-api - - org.apache.logging.log4j - log4j-api - - - org.apache.logging.log4j - log4j-core - com.google.code.gson gson diff --git a/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/HasLogger.java b/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/HasLogger.java new file mode 100644 index 00000000..5719b9bd --- /dev/null +++ b/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/HasLogger.java @@ -0,0 +1,63 @@ +package com.dke.data.agrirouter.api.service; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.Marker; +import org.slf4j.MarkerFactory; + +import static java.lang.String.valueOf; + +/** + * Interface to encapsulate logging capabilities. Logging will be done using LOG4J2, ruleset should + * be: + * + * + * + * Please be aware of the rule "Log or throw" regarding exceptions. + */ +public interface HasLogger { + + Marker METHOD_BEGIN = MarkerFactory.getMarker("METHOD_BEGIN"); + Marker METHOD_END = MarkerFactory.getMarker("METHOD_END"); + + Map loggerCache = new HashMap<>(); + + /** + * Returns the native LOG4J2 logger for further logging. + * + * @return - + */ + default Logger getNativeLogger() { + if (null == loggerCache.get(this.getClass().getName())) { + final Logger logger = LoggerFactory.getLogger(this.getClass()); + loggerCache.put(this.getClass().getName(), logger); + } + return loggerCache.get(this.getClass().getName()); + } + + /** + * Log method begin. Will log all given parameters as well. + */ + default void logMethodBegin(Object... objects) { + getNativeLogger().debug(METHOD_BEGIN, "BEGIN | Start of method."); + Arrays.stream(objects).forEach(o -> getNativeLogger().trace(valueOf(o))); + } + + /** + * Log method exit. Will log all given results as well. + * + * @param objects The results of the method. + */ + default void logMethodEnd(Object... objects) { + Arrays.stream(objects).forEach(o -> getNativeLogger().trace(valueOf(o))); + getNativeLogger().debug(METHOD_END, "END | End of method."); + } +} diff --git a/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/LoggingEnabledService.java b/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/LoggingEnabledService.java deleted file mode 100644 index 678e621b..00000000 --- a/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/LoggingEnabledService.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.dke.data.agrirouter.api.service; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.Marker; -import org.apache.logging.log4j.MarkerManager; -import org.apache.logging.log4j.message.ObjectArrayMessage; - -/** - * Interface to encapsulate logging capabilities. Logging will be done using LOG4J2, ruleset should - * be: - * - * - * - * Please be aware of the rule "Log or throw" regarding exceptions. - */ -public interface LoggingEnabledService { - - Marker METHOD_BEGIN = MarkerManager.getMarker("METHOD_BEGIN"); - Marker METHOD_END = MarkerManager.getMarker("METHOD_END"); - Marker METHOD_PARAMETERS = MarkerManager.getMarker("METHOD_PARAMETERS"); - Marker METHOD_RESULTS = MarkerManager.getMarker("METHOD_RESULTS"); - - Logger LOGGER = LogManager.getLogger(); - - /** - * Returns the native LOG4J2 logger for further logging. - * - * @return - - */ - default Logger getNativeLogger() { - return LOGGER; - } - - /** - * Log method begin. Will log all given parameters as well. - * - * @param objects The parameters of the method. - */ - default void logMethodBegin(Object... objects) { - LOGGER.debug(METHOD_BEGIN, "BEGIN | Start of method."); - LOGGER.trace(METHOD_PARAMETERS, new ObjectArrayMessage(objects)); - } - - /** - * Log method exit. Will log all given results as well. - * - * @param objects The results of the method. - */ - default void logMethodEnd(Object... objects) { - LOGGER.debug(METHOD_END, "END | End of method."); - LOGGER.trace(METHOD_RESULTS, new ObjectArrayMessage(objects)); - } -} diff --git a/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/ParameterValidation.java b/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/ParameterValidation.java index 67798f88..66dcabe4 100644 --- a/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/ParameterValidation.java +++ b/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/ParameterValidation.java @@ -3,13 +3,9 @@ import com.dke.data.agrirouter.api.exception.IllegalParameterDefinitionException; import java.util.Collection; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; /** Parameter validation using bean validation. */ -public interface ParameterValidation { - - Logger LOGGER = LogManager.getLogger(); +public interface ParameterValidation extends HasLogger { /** * Validation of the parameters. If there are any constraint violations, there will be a @@ -18,10 +14,10 @@ public interface ParameterValidation { * @throws IllegalParameterDefinitionException - */ default void validate() { - LOGGER.debug("Validating parameters."); - LOGGER.trace("Technical validation."); + getNativeLogger().debug("Validating parameters."); + getNativeLogger().trace("Technical validation."); this.technicalValidation(); - LOGGER.trace("Business validation."); + getNativeLogger().trace("Business validation."); this.businessValidation(); } diff --git a/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/RequestLogging.java b/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/RequestLogging.java index 5344ea4e..fb9ec9d2 100644 --- a/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/RequestLogging.java +++ b/agrirouter-sdk-java-api/src/main/java/com/dke/data/agrirouter/api/service/RequestLogging.java @@ -1,15 +1,11 @@ package com.dke.data.agrirouter.api.service; import javax.ws.rs.core.Response; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -public interface RequestLogging { - - Logger logger = LogManager.getLogger(RequestLogging.class); +public interface RequestLogging extends HasLogger { default void logRequest(String className, Response response) { String logMessage = "\n" + "# [" + className + "] " + "\n" + response + "\n"; - this.logger.info(() -> logMessage); + this.getNativeLogger().info(logMessage); } } diff --git a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/EnvironmentalService.java b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/EnvironmentalService.java index 6cce231d..3b8734d8 100644 --- a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/EnvironmentalService.java +++ b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/EnvironmentalService.java @@ -1,10 +1,10 @@ package com.dke.data.agrirouter.impl; import com.dke.data.agrirouter.api.env.Environment; -import com.dke.data.agrirouter.api.service.LoggingEnabledService; +import com.dke.data.agrirouter.api.service.HasLogger; /** Internal implementation for an environmental service. */ -public abstract class EnvironmentalService implements LoggingEnabledService { +public abstract class EnvironmentalService implements HasLogger { /** The current environment. */ protected final Environment environment; diff --git a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/NonEnvironmentalService.java b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/NonEnvironmentalService.java index 250524ef..a3e5b04f 100644 --- a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/NonEnvironmentalService.java +++ b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/NonEnvironmentalService.java @@ -1,6 +1,6 @@ package com.dke.data.agrirouter.impl; -import com.dke.data.agrirouter.api.service.LoggingEnabledService; +import com.dke.data.agrirouter.api.service.HasLogger; /** Internal implementation for an environmental service. */ -public abstract class NonEnvironmentalService implements LoggingEnabledService {} +public abstract class NonEnvironmentalService implements HasLogger {} diff --git a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/common/signing/SecurityKeyCreationService.java b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/common/signing/SecurityKeyCreationService.java index 67b30432..9fc49723 100644 --- a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/common/signing/SecurityKeyCreationService.java +++ b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/common/signing/SecurityKeyCreationService.java @@ -2,7 +2,7 @@ import com.dke.data.agrirouter.api.exception.CouldNotCreatePrivateKeyException; import com.dke.data.agrirouter.api.exception.CouldNotCreatePublicKeyException; -import com.dke.data.agrirouter.api.service.LoggingEnabledService; +import com.dke.data.agrirouter.api.service.HasLogger; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; @@ -12,7 +12,7 @@ import java.security.spec.X509EncodedKeySpec; import java.util.Base64; -public class SecurityKeyCreationService implements LoggingEnabledService { +public class SecurityKeyCreationService implements HasLogger { public PrivateKey createPrivateKey(String privateKey) { this.logMethodBegin(privateKey); diff --git a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/common/ssl/KeyStoreCreationService.java b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/common/ssl/KeyStoreCreationService.java index 860f3b79..b27703ea 100644 --- a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/common/ssl/KeyStoreCreationService.java +++ b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/common/ssl/KeyStoreCreationService.java @@ -1,7 +1,7 @@ package com.dke.data.agrirouter.impl.common.ssl; import com.dke.data.agrirouter.api.exception.CouldNotCreateDynamicKeyStoreException; -import com.dke.data.agrirouter.api.service.LoggingEnabledService; +import com.dke.data.agrirouter.api.service.HasLogger; import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.IOException; @@ -19,7 +19,7 @@ import javax.net.SocketFactory; import javax.net.ssl.*; -public class KeyStoreCreationService implements LoggingEnabledService { +public class KeyStoreCreationService implements HasLogger { public static final String TEMPORARY_KEY_PASSWORD = "changeit"; diff --git a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/MessageEncoder.java b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/MessageEncoder.java index f318e2da..1ad3db3a 100644 --- a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/MessageEncoder.java +++ b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/MessageEncoder.java @@ -10,14 +10,14 @@ import com.dke.data.agrirouter.api.dto.encoding.EncodedMessage; import com.dke.data.agrirouter.api.enums.SystemMessageType; import com.dke.data.agrirouter.api.enums.TechnicalMessageType; -import com.dke.data.agrirouter.api.service.LoggingEnabledService; +import com.dke.data.agrirouter.api.service.HasLogger; import com.dke.data.agrirouter.api.service.messaging.encoding.EncodeMessageService; import com.dke.data.agrirouter.api.service.parameters.*; import com.dke.data.agrirouter.api.util.TimestampUtil; import com.dke.data.agrirouter.impl.common.MessageIdService; import java.util.Objects; -public interface MessageEncoder extends LoggingEnabledService { +public interface MessageEncoder extends HasLogger { /** * Encode a message to delete messages. diff --git a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/encoding/EncodeMessageServiceImpl.java b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/encoding/EncodeMessageServiceImpl.java index 9c4abf35..4c0f89d2 100644 --- a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/encoding/EncodeMessageServiceImpl.java +++ b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/encoding/EncodeMessageServiceImpl.java @@ -85,8 +85,8 @@ public List encode(List messageParameterTuples) { /** * Chunk and add the Base64 encoding for a message if necessary. If there is only one chunk, the - * single chunk will be returned as Base64 encoded value. The chunk information and all IDs - * will be set by the SDK and are no longer in control of the application. + * single chunk will be returned as Base64 encoded value. The chunk information and all IDs will + * be set by the SDK and are no longer in control of the application. * * @param messageHeaderParameters - * @param payloadParameters Content of the message. It shall not be Base64 encoded before. @@ -171,8 +171,8 @@ public List chunkAndEncode( } else { if (messageHeaderParameters.getTechnicalMessageType().getNeedsBase64Encoding()) { getNativeLogger() - .debug( - "The message type needs to be base64 encoded, therefore we are encoding the raw value."); + .debug( + "The message type needs to be base64 encoded, therefore we are encoding the raw value."); final PayloadParameters payload = new PayloadParameters(); payload.copyFrom(payloadParameters); payload.setValue( diff --git a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/rest/MessageFetcher.java b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/rest/MessageFetcher.java index bad0eb38..8cbcea4a 100644 --- a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/rest/MessageFetcher.java +++ b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/messaging/rest/MessageFetcher.java @@ -2,6 +2,7 @@ import com.dke.data.agrirouter.api.cancellation.CancellationToken; import com.dke.data.agrirouter.api.enums.CertificationType; +import com.dke.data.agrirouter.api.service.HasLogger; import com.dke.data.agrirouter.api.service.parameters.FetchMessageParameters; import com.dke.data.agrirouter.impl.RequestFactory; import com.dke.data.agrirouter.impl.validation.ResponseValidator; @@ -9,13 +10,9 @@ import java.util.Optional; import javax.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; /** Interface to fetch messages for the HTTP implementation by polling the outbox. */ -public interface MessageFetcher extends ResponseValidator { - - Logger LOGGER = LogManager.getLogger(); +public interface MessageFetcher extends ResponseValidator, HasLogger { int MAX_TRIES_BEFORE_FAILURE = 10; long DEFAULT_INTERVAL = 500; @@ -34,9 +31,10 @@ default Optional poll( fetchMessageParameters.validate(); int nrOfTries = 1; while (cancellationToken.isNotCancelled()) { - LOGGER.debug( - "The cancellation token is not cancelled, we have another try. This is try number {}.", - nrOfTries); + getNativeLogger() + .debug( + "The cancellation token is not cancelled, we have another try. This is try number {}.", + nrOfTries); Response response = RequestFactory.securedRequest( Objects.requireNonNull(fetchMessageParameters.getOnboardingResponse()) diff --git a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/onboard/AbstractOnboardingService.java b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/onboard/AbstractOnboardingService.java index 599cb5c1..7721539c 100644 --- a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/onboard/AbstractOnboardingService.java +++ b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/onboard/AbstractOnboardingService.java @@ -10,7 +10,6 @@ import com.google.gson.Gson; import java.util.Optional; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.message.ObjectArrayMessage; public abstract class AbstractOnboardingService extends EnvironmentalService { @@ -25,10 +24,6 @@ protected OnboardingRequest getOnboardRequest( String gatewayId, CertificationType certificationType) { this.getNativeLogger().info("BEGIN | Creating onboard request."); - this.getNativeLogger() - .debug( - new ObjectArrayMessage( - uuid, applicationId, certificationType, gatewayId, certificationType)); OnboardingRequest onboardingRequest = new OnboardingRequest(); onboardingRequest.setId(uuid); diff --git a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/validation/ResponseValidator.java b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/validation/ResponseValidator.java index c038e180..83c8b537 100644 --- a/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/validation/ResponseValidator.java +++ b/agrirouter-sdk-java-impl/src/main/java/com/dke/data/agrirouter/impl/validation/ResponseValidator.java @@ -4,15 +4,11 @@ import com.dke.data.agrirouter.api.exception.InvalidHttpStatusException; import com.dke.data.agrirouter.api.exception.InvalidUrlForRequestException; import com.dke.data.agrirouter.api.exception.UnauthorizedRequestException; +import com.dke.data.agrirouter.api.service.HasLogger; import org.apache.http.HttpStatus; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.message.ObjectArrayMessage; /** Validation of the response, encapsulated using an interface. */ -public interface ResponseValidator { - - Logger LOGGER = LogManager.getLogger(); +public interface ResponseValidator extends HasLogger { /** * Asserting that the status code is valid. A valid status is in between 200 and 207 (defined by @@ -21,8 +17,8 @@ public interface ResponseValidator { * @param statusCode The current status code. */ default boolean assertStatusCodeIsValid(int statusCode) { - LOGGER.debug("Validating status code."); - LOGGER.trace(new ObjectArrayMessage(statusCode)); + getNativeLogger().debug("Validating status code."); + getNativeLogger().trace("Status code was '{}'", statusCode); this.checkIfStatusCodeIsError(statusCode); if (statusCode != HttpStatus.SC_OK && statusCode != HttpStatus.SC_CREATED @@ -42,9 +38,10 @@ default boolean assertStatusCodeIsValid(int statusCode) { * * @param statusCode The current status code. */ + @SuppressWarnings("UnusedReturnValue") default boolean assertStatusCodeIsOk(int statusCode) { - LOGGER.debug("Validating status code."); - LOGGER.trace(new ObjectArrayMessage(statusCode)); + getNativeLogger().debug("Validating status code."); + getNativeLogger().trace("Status code was '{}'", statusCode); this.checkIfStatusCodeIsError(statusCode); if (statusCode != HttpStatus.SC_OK) { throw new InvalidHttpStatusException(statusCode); @@ -58,8 +55,8 @@ default boolean assertStatusCodeIsOk(int statusCode) { * @param statusCode The current status code. */ default boolean assertStatusCodeIsCreated(int statusCode) { - LOGGER.debug("Validating status code."); - LOGGER.trace(new ObjectArrayMessage(statusCode)); + getNativeLogger().debug("Validating status code."); + getNativeLogger().trace("Status code was '{}'", statusCode); this.checkIfStatusCodeIsError(statusCode); if (statusCode != HttpStatus.SC_CREATED) { throw new InvalidHttpStatusException(statusCode); @@ -73,8 +70,8 @@ default boolean assertStatusCodeIsCreated(int statusCode) { * @param statusCode The current status code. */ default boolean assertStatusCodeIsBadRequest(int statusCode) { - LOGGER.debug("Validating status code."); - LOGGER.trace(new ObjectArrayMessage(statusCode)); + getNativeLogger().debug("Validating status code."); + getNativeLogger().trace("Status code was '{}'", statusCode); this.checkIfStatusCodeIsError(statusCode); if (statusCode != HttpStatus.SC_BAD_REQUEST) { throw new InvalidHttpStatusException(statusCode); @@ -89,7 +86,7 @@ default boolean assertStatusCodeIsBadRequest(int statusCode) { * @param statusCode The current response. */ default void checkIfStatusCodeIsError(int statusCode) { - LOGGER.debug("Checking if the response is an error."); + getNativeLogger().debug("Checking if the response is an error."); if (statusCode == HttpStatus.SC_NOT_FOUND) { throw new InvalidUrlForRequestException(); } diff --git a/pom.xml b/pom.xml index 19d5e145..6cc2ed2e 100644 --- a/pom.xml +++ b/pom.xml @@ -86,13 +86,13 @@ 2.38.0 1.1.1 1.3.71 - 2.16.0 1.2.4 1.14 2.1.1 19.0.0 2.11.0.rc1 1.1.1 + 1.7.32 3.8.1 @@ -239,14 +239,9 @@ - org.apache.logging.log4j - log4j-api - ${log4j-api.version} - - - org.apache.logging.log4j - log4j-core - ${log4j-api.version} + org.slf4j + slf4j-api + ${slf4j-api.version} @@ -292,6 +287,13 @@ + + + org.slf4j + slf4j-api + + +