From f0ac108399565369b9461cf9389405e2d9253f4c Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Mon, 24 Jul 2023 15:05:18 +0200
Subject: [PATCH] (auto)configuration of file manager and dummy implementation
 as fallback

---
 .../file/dummy/DummyOzgCloudFileService.java  | 41 ++++++++++++++++++
 .../file/grpc/GrpcOzgCloudFileService.java    |  5 +--
 .../apilib/file/grpc/OzgCloudFileMapper.java  |  2 +-
 .../vorgang/dummy/DummyVorgangService.java    |  7 ++-
 .../de/ozgcloud/apilib/demo/DemoRunner.java   |  7 +++
 .../src/main/resources/application.yml        |  6 ++-
 .../OzgCloudClientAutoConfiguration.java      | 43 +++++++++++++++----
 .../OzgCloudFileManagerProperties.java        | 24 +++++++++++
 .../OzgCloudVorgangManagerProperties.java     |  5 ++-
 9 files changed, 124 insertions(+), 16 deletions(-)
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/file/dummy/DummyOzgCloudFileService.java
 create mode 100644 ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudFileManagerProperties.java

diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/dummy/DummyOzgCloudFileService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/dummy/DummyOzgCloudFileService.java
new file mode 100644
index 0000000..2e61739
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/dummy/DummyOzgCloudFileService.java
@@ -0,0 +1,41 @@
+package de.ozgcloud.apilib.file.dummy;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.stereotype.Service;
+
+import de.itvsh.kop.common.errorhandling.TechnicalException;
+import de.ozgcloud.apilib.file.OzgCloudFile;
+import de.ozgcloud.apilib.file.OzgCloudFileId;
+import de.ozgcloud.apilib.file.OzgCloudFileService;
+
+@Service
+@ConditionalOnMissingBean(OzgCloudFileService.class)
+public class DummyOzgCloudFileService implements OzgCloudFileService {
+
+	private static final byte[] TEST_DATA = "Hello World!".getBytes();
+
+	public static final OzgCloudFile DUMMY_FILE = OzgCloudFile.builder()
+			.id(OzgCloudFileId.from("42"))
+			.contentType("text/plain")
+			.size(TEST_DATA.length)
+			.name("helloWorld.txt")
+			.build();
+
+	@Override
+	public OzgCloudFile getFile(OzgCloudFileId id) {
+		return DUMMY_FILE;
+	}
+
+	@Override
+	public void writeFileDataToStream(OzgCloudFileId id, OutputStream streamToWriteData) {
+		try {
+			streamToWriteData.write(TEST_DATA);
+		} catch (IOException e) {
+			throw new TechnicalException("Erro wrting dummy data.", e);
+		}
+	}
+
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java
index 3fc5f89..5d6b8ad 100644
--- a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java
@@ -7,7 +7,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.logging.Level;
 
-import org.springframework.beans.factory.annotation.Autowired;
+import org.mapstruct.factory.Mappers;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.stereotype.Service;
 
@@ -38,8 +38,7 @@ public class GrpcOzgCloudFileService implements OzgCloudFileService {
 	@GrpcClient("file-manager")
 	private final BinaryFileServiceStub asyncServiceStub;
 
-	@Autowired
-	private final OzgCloudFileMapper mapper;
+	private final OzgCloudFileMapper mapper = Mappers.getMapper(OzgCloudFileMapper.class);
 
 	static final int CHUNK_SIZE = 255 * 1024;
 
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileMapper.java
index f8e5c3b..07c8706 100644
--- a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileMapper.java
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileMapper.java
@@ -11,5 +11,5 @@ public interface OzgCloudFileMapper {
 
 	OzgCloudFile fromGrpc(GrpcOzgFile grpcFile);
 
-	OzgCloudFileId toOzgCloudFileId(String string);
+	OzgCloudFileId toOzgCloudFileId(String id);
 }
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/dummy/DummyVorgangService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/dummy/DummyVorgangService.java
index 761d910..449e147 100644
--- a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/dummy/DummyVorgangService.java
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/dummy/DummyVorgangService.java
@@ -10,6 +10,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
 import org.springframework.stereotype.Service;
 
 import de.ozgcloud.apilib.errorhandling.NotFoundException;
+import de.ozgcloud.apilib.file.dummy.DummyOzgCloudFileService;
+import de.ozgcloud.apilib.vorgang.OzgCloudAntragsteller;
 import de.ozgcloud.apilib.vorgang.OzgCloudEingang;
 import de.ozgcloud.apilib.vorgang.OzgCloudVorgang;
 import de.ozgcloud.apilib.vorgang.OzgCloudVorgangHeader;
@@ -33,7 +35,10 @@ public class DummyVorgangService implements OzgCloudVorgangService {
 			.createdAt(ZonedDateTime.now())
 			.aktenzeichen("ABC-123-04")
 			.build();
-	private static final OzgCloudEingang EINGANG_1 = OzgCloudEingang.builder().build();
+	private static final OzgCloudEingang EINGANG_1 = OzgCloudEingang.builder()
+			.antragsteller(OzgCloudAntragsteller.builder().build())
+			.representations(List.of(DummyOzgCloudFileService.DUMMY_FILE))
+			.build();
 
 	private static final String VORGANG_NAME_2 = "Antrag auf Führung eines Kampfhamsters";
 	private static final String VORGANG_NR_2 = "5678";
diff --git a/api-lib-demo/src/main/java/de/ozgcloud/apilib/demo/DemoRunner.java b/api-lib-demo/src/main/java/de/ozgcloud/apilib/demo/DemoRunner.java
index a140db5..ba3b61d 100644
--- a/api-lib-demo/src/main/java/de/ozgcloud/apilib/demo/DemoRunner.java
+++ b/api-lib-demo/src/main/java/de/ozgcloud/apilib/demo/DemoRunner.java
@@ -5,6 +5,8 @@ import org.springframework.context.ApplicationListener;
 import org.springframework.context.event.ContextRefreshedEvent;
 import org.springframework.stereotype.Component;
 
+import de.ozgcloud.apilib.file.OzgCloudFileId;
+import de.ozgcloud.apilib.file.OzgCloudFileService;
 import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
 import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService;
 
@@ -13,10 +15,15 @@ class DemoRunner implements ApplicationListener<ContextRefreshedEvent> {
 
 	@Autowired
 	private OzgCloudVorgangService vorgangService;
+	@Autowired
+	private OzgCloudFileService fileService;
 
 	@Override
 	public void onApplicationEvent(ContextRefreshedEvent event) {
 		System.out.println(vorgangService.getById(OzgCloudVorgangId.from("647885a50b105b1e4995378e")));
+
+		System.out.println(fileService.getFile(OzgCloudFileId.from("630363d5b5816c0d8efd6f19")));
+
 	}
 
 }
diff --git a/api-lib-demo/src/main/resources/application.yml b/api-lib-demo/src/main/resources/application.yml
index fda4dff..0fd2021 100644
--- a/api-lib-demo/src/main/resources/application.yml
+++ b/api-lib-demo/src/main/resources/application.yml
@@ -1,3 +1,7 @@
 ozgcloud:
   vorgang-manager:
-    address: static://127.0.0.1:9090
\ No newline at end of file
+    address: static://127.0.0.1:9090
+    negotiation-type: plaintext
+  file-manager:
+    address: ${ozgcloud.vorgang-manager.address}
+    negotiation-type: plaintext
\ No newline at end of file
diff --git a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java
index b6a3b42..b27610b 100644
--- a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java
+++ b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java
@@ -1,38 +1,63 @@
 package de.ozgcloud.client.autoconfigure;
 
-import org.springframework.beans.factory.annotation.Value;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Import;
 
+import de.ozgcloud.apilib.file.dummy.DummyOzgCloudFileService;
+import de.ozgcloud.apilib.file.grpc.GrpcOzgCloudFileService;
 import de.ozgcloud.apilib.vorgang.dummy.DummyVorgangService;
 import de.ozgcloud.apilib.vorgang.grpc.GrpcVorgangService;
 import net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration;
 import net.devh.boot.grpc.client.config.GrpcChannelProperties;
 import net.devh.boot.grpc.client.config.GrpcChannelsProperties;
-import net.devh.boot.grpc.client.config.NegotiationType;
 
 @AutoConfiguration(before = GrpcClientAutoConfiguration.class)
-@Import({ GrpcVorgangService.class, DummyVorgangService.class })
+@ComponentScan("de.ozgcloud.client.autoconfigure")
+@Import({
+		GrpcVorgangService.class, DummyVorgangService.class,
+		GrpcOzgCloudFileService.class, DummyOzgCloudFileService.class
+})
 public class OzgCloudClientAutoConfiguration {
 
 	private static final String CLIENT_NAME_VORGANG_MANAGER = "vorgang-manager";
+	private static final String CLIENT_NAME_FILE_MANAGER = "file-manager";
 
-	@Value("${ozgcloud.vorgang-manager.address:null}")
-	private String address;
+	@Autowired
+	private OzgCloudVorgangManagerProperties vorgangManagerProperties;
+	@Autowired
+	private OzgCloudFileManagerProperties fileManagerProperties;
 
 	@Bean
 	@ConditionalOnProperty("ozgcloud.vorgang-manager.address")
 	GrpcChannelsProperties channelProperties() {
 		var properties = new GrpcChannelsProperties();
+		var clientMap = properties.getClient();
+
+		addVorgangManager(clientMap);
+		addFileManager(clientMap);
+
+		return properties;
+	}
+
+	private void addVorgangManager(Map<String, GrpcChannelProperties> clientMap) {
 		var channelProps = new GrpcChannelProperties();
+		channelProps.setAddress(vorgangManagerProperties.getAddress());
+		channelProps.setNegotiationType(vorgangManagerProperties.getNegotiationType());
 
-		properties.getClient().put(CLIENT_NAME_VORGANG_MANAGER, channelProps);
+		clientMap.put(CLIENT_NAME_VORGANG_MANAGER, channelProps);
+	}
 
-		channelProps.setAddress(address);
-		channelProps.setNegotiationType(NegotiationType.PLAINTEXT);
+	private void addFileManager(Map<String, GrpcChannelProperties> clientMap) {
+		var channelProps = new GrpcChannelProperties();
+		channelProps.setAddress(fileManagerProperties.getAddress());
+		channelProps.setNegotiationType(fileManagerProperties.getNegotiationType());
 
-		return properties;
+		clientMap.put(CLIENT_NAME_FILE_MANAGER, channelProps);
 	}
 }
diff --git a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudFileManagerProperties.java b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudFileManagerProperties.java
new file mode 100644
index 0000000..6023b40
--- /dev/null
+++ b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudFileManagerProperties.java
@@ -0,0 +1,24 @@
+package de.ozgcloud.client.autoconfigure;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Getter;
+import lombok.Setter;
+import net.devh.boot.grpc.client.config.NegotiationType;
+
+@Getter
+@Setter
+@Configuration
+@ConfigurationProperties("ozgcloud.file-manager")
+public class OzgCloudFileManagerProperties {
+	/**
+	 * Network-Address of the File-Manager instance, starting with resolving
+	 * protocol. Example for local use: static://127.0.0.1:9090
+	 */
+	private String address;
+	/**
+	 * Negotiation Type for the gRPC connection - possible Values: PLAINTEXT, TLS
+	 */
+	private NegotiationType negotiationType = NegotiationType.valueOf("TLS");
+}
diff --git a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudVorgangManagerProperties.java b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudVorgangManagerProperties.java
index 734594f..a78870b 100644
--- a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudVorgangManagerProperties.java
+++ b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudVorgangManagerProperties.java
@@ -1,12 +1,15 @@
 package de.ozgcloud.client.autoconfigure;
 
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
 
 import lombok.Getter;
 import lombok.Setter;
+import net.devh.boot.grpc.client.config.NegotiationType;
 
 @Getter
 @Setter
+@Configuration
 @ConfigurationProperties("ozgcloud.vorgang-manager")
 public class OzgCloudVorgangManagerProperties {
 	/**
@@ -17,5 +20,5 @@ public class OzgCloudVorgangManagerProperties {
 	/**
 	 * Negotiation Type for the gRPC connection - possible Values: PLAINTEXT, TLS
 	 */
-	private String negotiationType = "TLS";
+	private NegotiationType negotiationType = NegotiationType.valueOf("TLS");
 }
-- 
GitLab