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