diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/CommandAlfaService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/CommandAlfaService.java new file mode 100644 index 0000000000000000000000000000000000000000..da38d6c8b9afd5fd4ab2f39633438c843844388e --- /dev/null +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/CommandAlfaService.java @@ -0,0 +1,38 @@ +package de.ozgcloud.apilib.alfa; + +import java.time.ZonedDateTime; +import java.util.Map; + +import de.ozgcloud.apilib.common.command.OzgCloudCommand; +import de.ozgcloud.apilib.common.command.OzgCloudCommandService; +import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class CommandAlfaService implements AlfaService { + + private final OzgCloudCommandService commandService; + + @Override + public void addAktenNotiz(OzgCloudVorgangId vorgangId, String text) { + var command = createCreateItemCommand(vorgangId, text); + + commandService.createAndWaitUntilDone(command); + } + + OzgCloudCommand createCreateItemCommand(OzgCloudVorgangId vorgangId, String text) { + Map<String, Object> item = Map.of("text", text, + "createdAt", ZonedDateTime.now().toString()); + Map<String, Object> commandBody = Map.of("item", item, + "vorgangId", vorgangId.toString(), + "itemName", "Kommentar", + "client", "Alfa"); + + return OzgCloudCommand.builder() + .order("CREATE_ATTACHED_ITEM") + .vorgangId(vorgangId) + .relationId(vorgangId) + .bodyObject(commandBody) + .build(); + } +} diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/dummy/DummyAlfaService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/dummy/DummyAlfaService.java index dec1c02a5e1977fd80e934b9ec18d2714ee0177e..34b82a8f3502044934b9df3cfc2346e5a4a61433 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/dummy/DummyAlfaService.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/dummy/DummyAlfaService.java @@ -1,10 +1,14 @@ package de.ozgcloud.apilib.alfa.dummy; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; + import de.ozgcloud.apilib.alfa.AlfaService; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; +import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService; import lombok.extern.java.Log; @Log +@ConditionalOnMissingBean(OzgCloudVorgangService.class) public class DummyAlfaService implements AlfaService { @Override diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java index b3538711109bb6e26756cba9a56a3cc59c4aed09..181039b33d928fa7e3c46c6f46c088383e3183e6 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java @@ -1,14 +1,20 @@ package de.ozgcloud.apilib.common.command; +import java.util.Set; + import de.itvsh.kop.common.datatype.StringBasedValue; +import lombok.EqualsAndHashCode; +@EqualsAndHashCode(callSuper = true) public class OzgCloudCommandStatus extends StringBasedValue { - public static final OzgCloudCommandStatus PENDING = from("PENDING"); - public static final OzgCloudCommandStatus FINISHED = from("FINISHED"); - public static final OzgCloudCommandStatus ERROR = from("ERROR"); - public static final OzgCloudCommandStatus REVOKE_PENDING = from("REVOKE_PENDING"); - public static final OzgCloudCommandStatus REVOKED = from("REVOKED"); + public static final OzgCloudCommandStatus PENDING = new OzgCloudCommandStatus("PENDING"); + public static final OzgCloudCommandStatus FINISHED = new OzgCloudCommandStatus("FINISHED"); + public static final OzgCloudCommandStatus ERROR = new OzgCloudCommandStatus("ERROR"); + public static final OzgCloudCommandStatus REVOKE_PENDING = new OzgCloudCommandStatus("REVOKE_PENDING"); + public static final OzgCloudCommandStatus REVOKED = new OzgCloudCommandStatus("REVOKED"); + + private static final Set<OzgCloudCommandStatus> FINAL_STATES = Set.of(FINISHED, ERROR, REVOKED); OzgCloudCommandStatus(String status) { super(status); @@ -17,4 +23,8 @@ public class OzgCloudCommandStatus extends StringBasedValue { public static OzgCloudCommandStatus from(String status) { return new OzgCloudCommandStatus(status); } + + public boolean isFinalState() { + return FINAL_STATES.contains(this); + } } diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/CommandMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/CommandMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..f9d39db5bfae0aac5b165622bcfc394656264840 --- /dev/null +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/CommandMapper.java @@ -0,0 +1,77 @@ +package de.ozgcloud.apilib.common.command.grpc; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Named; + +import de.itvsh.kop.common.datatype.StringBasedValue; +import de.itvsh.kop.pluto.common.grpc.GrpcObjectMapper; +import de.itvsh.ozg.pluto.grpc.command.GrpcCommand; +import de.itvsh.ozg.pluto.grpc.command.GrpcCreateCommandRequest; +import de.ozgcloud.apilib.common.command.OzgCloudCommand; +import de.ozgcloud.apilib.common.command.OzgCloudCommandId; +import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus; +import de.ozgcloud.apilib.common.datatypes.GenericId; +import de.ozgcloud.apilib.user.OzgCloudUserId; +import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; + +@Mapper(uses = { GrpcObjectMapper.class }) +public interface CommandMapper { + + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "clearField", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "mergeBodyObj", ignore = true) + @Mapping(target = "mergeCallContext", ignore = true) + @Mapping(target = "mergeRedirectRequest", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "removeBody", ignore = true) + @Mapping(target = "callContext", ignore = true) + @Mapping(target = "order", ignore = true) + @Mapping(target = "orderStringBytes", ignore = true) + @Mapping(target = "orderValue", ignore = true) + @Mapping(target = "redirectRequest", ignore = true) + @Mapping(target = "relationIdBytes", ignore = true) + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "vorgangIdBytes", ignore = true) + @Mapping(target = "allFields", ignore = true) + @Mapping(target = "bodyBuilderList", ignore = true) + @Mapping(target = "bodyList", ignore = true) + @Mapping(target = "bodyOrBuilderList", ignore = true) + + @Mapping(target = "bodyObj", source = "bodyObject") + @Mapping(target = "orderString", source = "order") + GrpcCreateCommandRequest buildCreateCommandRequest(OzgCloudCommand commandToCreate); + + @Mapping(target = "bodyObject", source = "bodyObj") + @Mapping(target = "order", source = "orderString") + @Mapping(target = "relationVersion", ignore = true) + @Mapping(target = "relationId", qualifiedByName = "mapRelationId") + @Mapping(target = "body", ignore = true) + OzgCloudCommand fromGrpc(GrpcCommand command); + + @Named("mapRelationId") + default StringBasedValue mapRelationId(String relationId) { + return GenericId.from(relationId); + } + + default OzgCloudVorgangId toOzgCloudVorgangId(String userId) { + return OzgCloudVorgangId.from(userId); + } + + default OzgCloudUserId toOzgCloudUserId(String userId) { + return OzgCloudUserId.from(userId); + } + + default OzgCloudCommandStatus toOzgCloudCommandStatus(String status) { + return OzgCloudCommandStatus.from(status); + } + + default OzgCloudCommandId toOzgCloudCommandId(String id) { + return OzgCloudCommandId.from(id); + } + + default String valueToString(StringBasedValue value) { + return value.toString(); + } +} diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java index 9c485e77d6e42eb06f2d8b0f4981cf2bc275d768..f411ba77ed41fe1f84fc46e4ca96936bf1f5d4aa 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java @@ -1,9 +1,9 @@ package de.ozgcloud.apilib.common.command.grpc; -import de.itvsh.kop.pluto.common.grpc.GrpcObjectMapper; import de.itvsh.ozg.pluto.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub; -import de.itvsh.ozg.pluto.grpc.command.GrpcCreateCommandRequest; +import de.itvsh.ozg.pluto.grpc.command.GrpcGetCommandRequest; import de.ozgcloud.apilib.common.command.OzgCloudCommand; +import de.ozgcloud.apilib.common.command.OzgCloudCommandId; import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.inject.GrpcClient; @@ -11,27 +11,41 @@ import net.devh.boot.grpc.client.inject.GrpcClient; @RequiredArgsConstructor public class GrpcOzgCloudCommandService implements OzgCloudCommandService { + private static final int WAIT_TIME_MS = 500; + @GrpcClient("command-manager") private final CommandServiceBlockingStub commandServiceStub; - private GrpcObjectMapper objectMapper; + private final CommandMapper mapper; @Override public OzgCloudCommand createAndWaitUntilDone(OzgCloudCommand commandToCreate) { - var command = create(commandToCreate); - // TODO Auto-generated method stub - return null; + return waitUntilDone(create(commandToCreate)); } OzgCloudCommand create(OzgCloudCommand commandToCreate) { - commandServiceStub.createCommand(buildCreateCommandRequest(commandToCreate)); - return null; + var created = commandServiceStub.createCommand(mapper.buildCreateCommandRequest(commandToCreate)); + return mapper.fromGrpc(created.getCommand()); } - GrpcCreateCommandRequest buildCreateCommandRequest(OzgCloudCommand commandToCreate) { - return GrpcCreateCommandRequest.newBuilder() - .build(); - + OzgCloudCommand waitUntilDone(OzgCloudCommand commandToWaitFor) { + var command = commandToWaitFor; +// TODO timeout + while (!command.getStatus().isFinalState()) { + synchronized (this) { + try { + wait(WAIT_TIME_MS); + command = reloadCommand(command.getId()); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } + return command; } + private OzgCloudCommand reloadCommand(OzgCloudCommandId commandId) { + GrpcGetCommandRequest request = GrpcGetCommandRequest.newBuilder().setId(commandId.toString()).build(); + return mapper.fromGrpc(commandServiceStub.getCommand(request)); + } } diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/datatypes/GenericId.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/datatypes/GenericId.java new file mode 100644 index 0000000000000000000000000000000000000000..4e5107a4959f35ea8aa029aefe087c75429958b9 --- /dev/null +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/datatypes/GenericId.java @@ -0,0 +1,14 @@ +package de.ozgcloud.apilib.common.datatypes; + +import de.itvsh.kop.common.datatype.StringBasedValue; + +public class GenericId extends StringBasedValue { + + GenericId(String id) { + super(id); + } + + public static GenericId from(String id) { + return new GenericId(id); + } +} diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/CommandMapperTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/CommandMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..630f977b188e3cfbaf8be65992df41dc098a28d7 --- /dev/null +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/CommandMapperTest.java @@ -0,0 +1,26 @@ +package de.ozgcloud.apilib.common.command.grpc; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; +import org.mockito.InjectMocks; + +class CommandMapperTest { + + @InjectMocks + private CommandMapper mapper = Mappers.getMapper(CommandMapper.class); + + @Nested + class TestBuildCreateCommandRequest { + + @Test + void shouldBuildRequest() { + var request = mapper.buildCreateCommandRequest(OzgCloudCommandTestFactory.create()); + + assertThat(request).usingRecursiveComparison().isEqualTo(GrpcCreateCommandRequestTestFactory.create()); + } + } + +} diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandResponseTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandResponseTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..7effb0ccc58cf8f491545e7e9179819283784d02 --- /dev/null +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandResponseTestFactory.java @@ -0,0 +1,15 @@ +package de.ozgcloud.apilib.common.command.grpc; + +import de.itvsh.ozg.pluto.grpc.command.GrpcCommandResponse; + +public class GrpcCommandResponseTestFactory { + + public static final GrpcCommandResponse create() { + return createBuilder().build(); + } + + public static final GrpcCommandResponse.Builder createBuilder() { + return GrpcCommandResponse.newBuilder() + .setCommand(GrpcCommandTestFactory.create()); + } +} diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..9d9e01c44c5287efbfed2acc2ce0c3bdaa45cc45 --- /dev/null +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandTestFactory.java @@ -0,0 +1,14 @@ +package de.ozgcloud.apilib.common.command.grpc; + +import de.itvsh.ozg.pluto.grpc.command.GrpcCommand; + +public class GrpcCommandTestFactory { + + public static GrpcCommand create() { + return createBuilder().build(); + } + + public static GrpcCommand.Builder createBuilder() { + return GrpcCommand.newBuilder(); + } +} diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java index 1b0db3f057ce222f7b8f408d72e904e4e5a2f297..de5ab15066349dfd74110048ad1ac0dbd0de4223 100644 --- a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java @@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -21,38 +22,73 @@ class GrpcOzgCloudCommandServiceTest { @Mock private CommandServiceBlockingStub serviceStub; + @Mock + private CommandMapper mapper; @Nested class TestCreateAndWaitUntilDone { + private OzgCloudCommand command = OzgCloudCommandTestFactory.create(); + @Test void shouldCallCreate() { - OzgCloudCommand command = OzgCloudCommandTestFactory.create(); + var created = OzgCloudCommandTestFactory.create(); + doReturn(created).when(service).create(any()); service.createAndWaitUntilDone(command); verify(service).create(command); } - @Nested - class BuildCreateCommandRequest { - @Test - void shouldBuildCommand() { - var request = service.buildCreateCommandRequest(OzgCloudCommandTestFactory.create()); + @Test + void shouldWaitUntilDone() { + var created = OzgCloudCommandTestFactory.create(); + doReturn(created).when(service).create(any()); - assertThat(request).usingRecursiveComparison().isEqualTo(GrpcCreateCommandRequestTestFactory.create()); - } + service.createAndWaitUntilDone(command); + + verify(service).waitUntilDone(created); } @Nested class Create { + + @BeforeEach + void init() { + when(serviceStub.createCommand(any())).thenReturn(GrpcCommandResponseTestFactory.create()); + } + + @Test + void shouldBuildRequest() { + service.create(command); + + verify(mapper).buildCreateCommandRequest(command); + } + @Test void shouldCallStub() { var request = GrpcCreateCommandRequestTestFactory.create(); - doReturn(request).when(service).buildCreateCommandRequest(any()); + doReturn(request).when(mapper).buildCreateCommandRequest(any()); service.create(OzgCloudCommandTestFactory.create()); - verify(serviceStub).createCommand(notNull()); + verify(serviceStub).createCommand(request); + } + + @Test + void shouldMapCommand() { + service.create(command); + + verify(mapper).fromGrpc(GrpcCommandTestFactory.create()); + } + + @Test + void shouldReturnResult() { + var expected = OzgCloudCommandTestFactory.create(); + when(mapper.fromGrpc(any())).thenReturn(expected); + + var returned = service.create(command); + + assertThat(returned).isSameAs(expected); } } } 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 690fc86afa0c85f92a3f5763c35992d122b76c9b..81ed5df7f0b3cc213b7f2e9747b3c4c81bd6ec3c 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 @@ -13,7 +13,7 @@ import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService; @Component class DemoRunner implements ApplicationListener<ContextRefreshedEvent> { - private static final OzgCloudVorgangId VORGANG_ID = OzgCloudVorgangId.from("64dde1bd0ffe733638cc7d2a"); + private static final OzgCloudVorgangId VORGANG_ID = OzgCloudVorgangId.from("64e889ba8e24a914a1628047"); @Autowired private OzgCloudVorgangService vorgangService; diff --git a/api-lib-demo/src/main/resources/application.yml b/api-lib-demo/src/main/resources/application.yml index 725075941532a08d7aa318e508a24642fc5e115b..72dc612706b7343e8e82b708a078d58b9290fdaf 100644 --- a/api-lib-demo/src/main/resources/application.yml +++ b/api-lib-demo/src/main/resources/application.yml @@ -1,8 +1,11 @@ ozgcloud: vorgang-manager: -# address: static://127.0.0.1:9090 - address: nordfriesland-pluto-grpc.test.by.ozg-cloud.de:443 - negotiation-type: tls + address: static://127.0.0.1:9090 +# address: nordfriesland-pluto-grpc.test.by.ozg-cloud.de:443 + negotiation-type: plaintext file-manager: + address: ${ozgcloud.vorgang-manager.address} + negotiation-type: plaintext + command-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 756f8883901c78685fd4e637ef53bfba15742e65..7a4cc81b9ece5e7c63f878ca9d5874218ec91e01 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 @@ -2,6 +2,7 @@ package de.ozgcloud.client.autoconfigure; import java.util.Map; +import org.mapstruct.factory.Mappers; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -11,11 +12,16 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Import; +import de.itvsh.ozg.pluto.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub; import de.ozgcloud.apilib.alfa.AlfaService; +import de.ozgcloud.apilib.alfa.CommandAlfaService; import de.ozgcloud.apilib.alfa.dummy.DummyAlfaService; import de.ozgcloud.apilib.common.callcontext.DefaultOzgCloudCallContextProvider; import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor; import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider; +import de.ozgcloud.apilib.common.command.OzgCloudCommandService; +import de.ozgcloud.apilib.common.command.grpc.CommandMapper; +import de.ozgcloud.apilib.common.command.grpc.GrpcOzgCloudCommandService; import de.ozgcloud.apilib.file.dummy.DummyOzgCloudFileService; import de.ozgcloud.apilib.file.grpc.GrpcOzgCloudFileService; import de.ozgcloud.apilib.vorgang.dummy.DummyVorgangService; @@ -23,6 +29,7 @@ import de.ozgcloud.apilib.vorgang.grpc.GrpcOzgCloudVorgangService; 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.inject.GrpcClient; @AutoConfiguration(before = GrpcClientAutoConfiguration.class) @ComponentScan("de.ozgcloud.client.autoconfigure") @@ -35,11 +42,14 @@ public class OzgCloudClientAutoConfiguration { private static final String CLIENT_NAME_VORGANG_MANAGER = "vorgang-manager"; private static final String CLIENT_NAME_FILE_MANAGER = "file-manager"; + private static final String CLIENT_NAME_COMMAND_MANAGER = "command-manager"; @Autowired private OzgCloudVorgangManagerProperties vorgangManagerProperties; @Autowired private OzgCloudFileManagerProperties fileManagerProperties; + @Autowired + private OzgCloudCommandManagerProperties commandManagerProperties; @Bean @ConditionalOnProperty("ozgcloud.vorgang-manager.address") @@ -49,6 +59,7 @@ public class OzgCloudClientAutoConfiguration { addVorgangManager(clientMap); addFileManager(clientMap); + addCommandManager(clientMap); return properties; } @@ -69,12 +80,39 @@ public class OzgCloudClientAutoConfiguration { clientMap.put(CLIENT_NAME_FILE_MANAGER, channelProps); } + private void addCommandManager(Map<String, GrpcChannelProperties> clientMap) { + var channelProps = new GrpcChannelProperties(); + channelProps.setAddress(commandManagerProperties.getAddress()); + channelProps.setNegotiationType(commandManagerProperties.getNegotiationType()); + + clientMap.put(CLIENT_NAME_COMMAND_MANAGER, channelProps); + } + @Bean @ConditionalOnMissingBean OzgCloudCallContextProvider callContextProvider(ApplicationContext ctxt) { return new DefaultOzgCloudCallContextProvider(ctxt); } + @Bean + @ConditionalOnProperty("ozgcloud.command-manager.address") + OzgCloudCommandService grpcCommandService(@GrpcClient("command-manager") CommandServiceBlockingStub commandServiceStub, + CommandMapper commandMapper) { + return new GrpcOzgCloudCommandService(commandServiceStub, commandMapper); + } + + @Bean + @ConditionalOnProperty("ozgcloud.command-manager.address") + CommandMapper commandMapper() { + return Mappers.getMapper(CommandMapper.class); + } + + @Bean + @ConditionalOnProperty("ozgcloud.command-manager.address") + AlfaService commandAlfaService(OzgCloudCommandService commandService) { + return new CommandAlfaService(commandService); + } + @Bean @ConditionalOnMissingBean AlfaService alfaService() { diff --git a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudCommandManagerProperties.java b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudCommandManagerProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..f1db9ebef4a7a9260de68df453e9b4692590b917 --- /dev/null +++ b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudCommandManagerProperties.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.command-manager") +public class OzgCloudCommandManagerProperties { + /** + * Network-Address of the Command-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"); +}