From a11ba14be2486261ed0c19bfee14257b0b3643bd Mon Sep 17 00:00:00 2001
From: Martin Vogel <martin.vogel@sinc.de>
Date: Mon, 13 Jun 2022 17:57:52 +0200
Subject: [PATCH] #414 Load custom logger via SPI

---
 .../api/domain/metadata/Metadata.java         |  2 ++
 .../api/domain/metadata/data/Data.java        |  2 ++
 .../api/domain/submission/Callback.java       | 20 +++++++++++++++
 .../api/domain/submission/ServiceType.java    | 21 ++++++++++++++++
 .../api/domain/submission/Submission.java     | 25 +++++++++++++++++++
 .../api/logger/LoggingProvider.java           | 18 +++++++++++++
 .../java/fitconnect/api/logger/SdkLogger.java | 13 ----------
 .../fitconnect/client/FitConnectClient.java   |  4 +--
 .../java/de/fitconnect/client/TestRunner.java |  9 ++++---
 .../fitconnect/impl/SubmissionSender.java     |  2 +-
 .../fitconnect/impl/SubmissionSubscriber.java |  2 +-
 .../impl/auth/FitCoAuthService.java           |  2 +-
 .../impl/logger/DefaultLoggingProvider.java   | 13 ++++++++++
 .../fitconnect/impl/logger/SdkLogger.java     | 22 ++++++++++++++++
 .../fitconnect.api.logger.LoggingProvider     |  1 +
 .../impl/auth/OAuthTokenIntegrationTest.java  |  6 ++---
 16 files changed, 137 insertions(+), 25 deletions(-)
 create mode 100644 api/src/main/java/fitconnect/api/domain/submission/Callback.java
 create mode 100644 api/src/main/java/fitconnect/api/domain/submission/ServiceType.java
 create mode 100644 api/src/main/java/fitconnect/api/logger/LoggingProvider.java
 delete mode 100644 api/src/main/java/fitconnect/api/logger/SdkLogger.java
 create mode 100644 impl/src/main/java/fitconnect/impl/logger/DefaultLoggingProvider.java
 create mode 100644 impl/src/main/java/fitconnect/impl/logger/SdkLogger.java
 create mode 100644 impl/src/main/resources/META-INF/services/fitconnect.api.logger.LoggingProvider

diff --git a/api/src/main/java/fitconnect/api/domain/metadata/Metadata.java b/api/src/main/java/fitconnect/api/domain/metadata/Metadata.java
index 4af121a2c..74705e388 100644
--- a/api/src/main/java/fitconnect/api/domain/metadata/Metadata.java
+++ b/api/src/main/java/fitconnect/api/domain/metadata/Metadata.java
@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import lombok.Builder;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -21,6 +22,7 @@ import java.util.Map;
 })
 @Getter
 @Setter
+@Builder
 public class Metadata {
     @JsonProperty("contentStructure")
     ContentStructure contentStructure;
diff --git a/api/src/main/java/fitconnect/api/domain/metadata/data/Data.java b/api/src/main/java/fitconnect/api/domain/metadata/data/Data.java
index 7e830f2d1..159655d37 100644
--- a/api/src/main/java/fitconnect/api/domain/metadata/data/Data.java
+++ b/api/src/main/java/fitconnect/api/domain/metadata/data/Data.java
@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import lombok.Builder;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -20,6 +21,7 @@ import java.util.Map;
 })
 @Getter
 @Setter
+@Builder
 public class Data {
 
     @JsonProperty("signature")
diff --git a/api/src/main/java/fitconnect/api/domain/submission/Callback.java b/api/src/main/java/fitconnect/api/domain/submission/Callback.java
new file mode 100644
index 000000000..b45643172
--- /dev/null
+++ b/api/src/main/java/fitconnect/api/domain/submission/Callback.java
@@ -0,0 +1,20 @@
+package fitconnect.api.domain.submission;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.Value;
+
+import java.net.URI;
+
+@Getter
+@Setter
+@Value
+public class Callback {
+
+    @JsonProperty("uri")
+    URI uri;
+
+    @JsonProperty("secret")
+    String secret;
+}
diff --git a/api/src/main/java/fitconnect/api/domain/submission/ServiceType.java b/api/src/main/java/fitconnect/api/domain/submission/ServiceType.java
new file mode 100644
index 000000000..c3d3b2e1f
--- /dev/null
+++ b/api/src/main/java/fitconnect/api/domain/submission/ServiceType.java
@@ -0,0 +1,21 @@
+package fitconnect.api.domain.submission;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.Value;
+
+@Getter
+@Setter
+@Value
+public class ServiceType {
+
+    @JsonProperty("name")
+    String name;
+
+    @JsonProperty("description")
+    String description;
+
+    @JsonProperty("identifier")
+    String identifier;
+}
diff --git a/api/src/main/java/fitconnect/api/domain/submission/Submission.java b/api/src/main/java/fitconnect/api/domain/submission/Submission.java
index 174438594..7aa806e37 100644
--- a/api/src/main/java/fitconnect/api/domain/submission/Submission.java
+++ b/api/src/main/java/fitconnect/api/domain/submission/Submission.java
@@ -1,9 +1,34 @@
 package fitconnect.api.domain.submission;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
 import lombok.Getter;
 import lombok.Setter;
+import lombok.Value;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
 
 @Getter
 @Setter
+@Value
+@Builder
 public class Submission {
+
+    @JsonProperty("destinationId")
+    UUID destinationId;
+
+    @JsonProperty("destinationId")
+    Optional<UUID> caseId;
+
+    @JsonProperty("announcedAttachments")
+    List<UUID> announcedAttachments;
+
+    @JsonProperty("serviceType")
+    ServiceType serviceType;
+
+    @JsonProperty("callback")
+    Callback callback;
+
 }
diff --git a/api/src/main/java/fitconnect/api/logger/LoggingProvider.java b/api/src/main/java/fitconnect/api/logger/LoggingProvider.java
new file mode 100644
index 000000000..2987c41d5
--- /dev/null
+++ b/api/src/main/java/fitconnect/api/logger/LoggingProvider.java
@@ -0,0 +1,18 @@
+package fitconnect.api.logger;
+
+import java.util.logging.Logger;
+
+/**
+ * Provider that allows to register a custom {@link Logger} implementation.
+ *
+ */
+public interface LoggingProvider {
+
+    /**
+     * Creates a new custom {@link Logger}.
+     *
+     * @param name custom name for the logger
+     * @return Implementation of a {@link Logger}
+     */
+    Logger createLogger(final String name);
+}
diff --git a/api/src/main/java/fitconnect/api/logger/SdkLogger.java b/api/src/main/java/fitconnect/api/logger/SdkLogger.java
deleted file mode 100644
index c82eab60f..000000000
--- a/api/src/main/java/fitconnect/api/logger/SdkLogger.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package fitconnect.api.logger;
-
-
-import java.util.logging.Logger;
-
-public final class SdkLogger {
-
-    // TODO make custom logging module injectable / load via SPI
-
-    public static Logger defaultLogger(final Class clazz) {
-        return Logger.getLogger(clazz.getName());
-    }
-}
diff --git a/client/src/main/java/de/fitconnect/client/FitConnectClient.java b/client/src/main/java/de/fitconnect/client/FitConnectClient.java
index 4e88a9dad..d13bcfe9b 100644
--- a/client/src/main/java/de/fitconnect/client/FitConnectClient.java
+++ b/client/src/main/java/de/fitconnect/client/FitConnectClient.java
@@ -6,7 +6,7 @@ import fitconnect.api.domain.metadata.Metadata;
 import fitconnect.api.domain.metadata.attachment.Attachment;
 import fitconnect.api.domain.metadata.data.Data;
 import fitconnect.api.domain.submission.Submission;
-import fitconnect.api.logger.SdkLogger;
+import fitconnect.impl.logger.SdkLogger;
 
 import java.util.List;
 import java.util.Optional;
@@ -15,7 +15,7 @@ import java.util.logging.Logger;
 
 public class FitConnectClient {
 
-    private static final Logger logger = SdkLogger.defaultLogger(FitConnectClient.class);
+    private static final Logger logger = SdkLogger.customLogger(FitConnectClient.class);
 
     private final Sender sender;
     private Optional<OAuthToken> token = Optional.empty();
diff --git a/client/src/main/java/de/fitconnect/client/TestRunner.java b/client/src/main/java/de/fitconnect/client/TestRunner.java
index 7a82becde..8b01abaf9 100644
--- a/client/src/main/java/de/fitconnect/client/TestRunner.java
+++ b/client/src/main/java/de/fitconnect/client/TestRunner.java
@@ -1,5 +1,7 @@
 package de.fitconnect.client;
 
+import fitconnect.api.domain.metadata.Metadata;
+import fitconnect.api.domain.metadata.data.Data;
 import fitconnect.api.domain.submission.Submission;
 
 import java.util.Collections;
@@ -14,11 +16,10 @@ public class TestRunner {
         FitConnectClient client = new FitConnectClient();
 
         // sample high -level- api calls to send a submission
-        client
+        client.authenticate(clientId,secret)
                 .printToken()
-                .authenticate(clientId,secret)
-                .createSubmission(new Submission())
+                .createSubmission(Submission.builder().build())
                 .uploadAttachments(Collections.emptyList())
-                .sendSubmission(null, null);
+                .sendSubmission(Metadata.builder().build(), Data.builder().build());
     }
 }
diff --git a/impl/src/main/java/fitconnect/impl/SubmissionSender.java b/impl/src/main/java/fitconnect/impl/SubmissionSender.java
index 559ee48c3..c60c458da 100644
--- a/impl/src/main/java/fitconnect/impl/SubmissionSender.java
+++ b/impl/src/main/java/fitconnect/impl/SubmissionSender.java
@@ -10,7 +10,7 @@ import fitconnect.api.domain.metadata.attachment.Attachment;
 import fitconnect.api.domain.metadata.data.Data;
 import fitconnect.api.exceptions.AuthenticationException;
 import fitconnect.api.exceptions.EncryptionException;
-import fitconnect.api.logger.SdkLogger;
+import fitconnect.impl.logger.SdkLogger;
 import fitconnect.api.validation.CertificateValidator;
 import fitconnect.api.validation.ValidationResult;
 import fitconnect.impl.auth.FitCoAuthService;
diff --git a/impl/src/main/java/fitconnect/impl/SubmissionSubscriber.java b/impl/src/main/java/fitconnect/impl/SubmissionSubscriber.java
index de4a2144a..e8eea17c7 100644
--- a/impl/src/main/java/fitconnect/impl/SubmissionSubscriber.java
+++ b/impl/src/main/java/fitconnect/impl/SubmissionSubscriber.java
@@ -10,7 +10,7 @@ import fitconnect.api.domain.metadata.attachment.Attachment;
 import fitconnect.api.domain.metadata.data.Data;
 import fitconnect.api.exceptions.AuthenticationException;
 import fitconnect.api.exceptions.DecryptionException;
-import fitconnect.api.logger.SdkLogger;
+import fitconnect.impl.logger.SdkLogger;
 import fitconnect.api.validation.MetadataValidator;
 import fitconnect.api.validation.ValidationResult;
 import fitconnect.impl.auth.FitCoAuthService;
diff --git a/impl/src/main/java/fitconnect/impl/auth/FitCoAuthService.java b/impl/src/main/java/fitconnect/impl/auth/FitCoAuthService.java
index e9486a5b0..5b6a8574d 100644
--- a/impl/src/main/java/fitconnect/impl/auth/FitCoAuthService.java
+++ b/impl/src/main/java/fitconnect/impl/auth/FitCoAuthService.java
@@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import fitconnect.api.auth.OAuthService;
 import fitconnect.api.auth.OAuthToken;
 import fitconnect.api.exceptions.AuthenticationException;
-import fitconnect.api.logger.SdkLogger;
+import fitconnect.impl.logger.SdkLogger;
 
 import java.io.IOException;
 import java.net.URI;
diff --git a/impl/src/main/java/fitconnect/impl/logger/DefaultLoggingProvider.java b/impl/src/main/java/fitconnect/impl/logger/DefaultLoggingProvider.java
new file mode 100644
index 000000000..2eba4f249
--- /dev/null
+++ b/impl/src/main/java/fitconnect/impl/logger/DefaultLoggingProvider.java
@@ -0,0 +1,13 @@
+package fitconnect.impl.logger;
+
+import fitconnect.api.logger.LoggingProvider;
+
+import java.util.logging.Logger;
+
+public class DefaultLoggingProvider implements LoggingProvider {
+
+    @Override
+    public Logger createLogger(final String name) {
+        return Logger.getLogger(name);
+    }
+}
diff --git a/impl/src/main/java/fitconnect/impl/logger/SdkLogger.java b/impl/src/main/java/fitconnect/impl/logger/SdkLogger.java
new file mode 100644
index 000000000..fcd56f20b
--- /dev/null
+++ b/impl/src/main/java/fitconnect/impl/logger/SdkLogger.java
@@ -0,0 +1,22 @@
+package fitconnect.impl.logger;
+
+
+import fitconnect.api.logger.LoggingProvider;
+
+import java.util.ServiceLoader;
+import java.util.logging.Logger;
+
+public final class SdkLogger {
+
+    public static Logger defaultLogger(final Class clazz) {
+        return Logger.getLogger(clazz.getName());
+    }
+
+    // TODO find a better solution than this ;)
+    public static Logger customLogger(final Class clazz) {
+        var serviceLoader = ServiceLoader.load(LoggingProvider.class);
+        final LoggingProvider loggingProvider = serviceLoader.iterator().next();
+        return loggingProvider.createLogger(clazz.getName());
+    }
+
+}
diff --git a/impl/src/main/resources/META-INF/services/fitconnect.api.logger.LoggingProvider b/impl/src/main/resources/META-INF/services/fitconnect.api.logger.LoggingProvider
new file mode 100644
index 000000000..3f1e3b121
--- /dev/null
+++ b/impl/src/main/resources/META-INF/services/fitconnect.api.logger.LoggingProvider
@@ -0,0 +1 @@
+fitconnect.impl.logger.DefaultLoggingProvider
\ No newline at end of file
diff --git a/impl/src/test/java/fitconnect/impl/auth/OAuthTokenIntegrationTest.java b/impl/src/test/java/fitconnect/impl/auth/OAuthTokenIntegrationTest.java
index b0ee8870e..5b6dcd62b 100644
--- a/impl/src/test/java/fitconnect/impl/auth/OAuthTokenIntegrationTest.java
+++ b/impl/src/test/java/fitconnect/impl/auth/OAuthTokenIntegrationTest.java
@@ -31,8 +31,8 @@ class OAuthTokenIntegrationTest {
         // Then
 
         assertTrue(token.isPresent());
-        assertNull(token.get().error());
-        assertNotNull(token.get().access_token());
-        assertEquals(1800, token.get().expires_in());
+        assertNull(token.get().getError());
+        assertNotNull(token.get().getAccessToken());
+        assertEquals(1800, token.get().getExpiresIn());
     }
 }
\ No newline at end of file
-- 
GitLab