diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/ArchiveManagerConfiguration.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/ArchiveManagerConfiguration.java index 90f158d548309ca8961473fb78cafec16219e6d4..01c7a03353bbc42301b1416adb83706dd34df872 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/ArchiveManagerConfiguration.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/ArchiveManagerConfiguration.java @@ -26,6 +26,7 @@ package de.ozgcloud.archive; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; import de.ozgcloud.apilib.client_attribute.OzgCloudClientAttributeService; import de.ozgcloud.apilib.client_attribute.grpc.OzgCloudClientAttributeGrpcService; @@ -50,43 +51,44 @@ import net.devh.boot.grpc.client.inject.GrpcClient; @Configuration @RequiredArgsConstructor +@EnableScheduling public class ArchiveManagerConfiguration { - public static final String VORGANG_SERVICE_NAME = "archive_VorgangService"; - public static final String VORGANG_REMOTE_MANAGER_SERVICE_NAME = "archive_VorgangRemoteService"; - public static final String VORGANG_WITH_EINGANG_MAPPER_NAME = "archive_VorgangWithEingangMapper"; + public static final String VORGANG_SERVICE_NAME = "archiveVorgangService"; + public static final String VORGANG_REMOTE_MANAGER_SERVICE_NAME = "archiveVorgangRemoteService"; + public static final String VORGANG_WITH_EINGANG_MAPPER_NAME = "archiveVorgangWithEingangMapper"; - public static final String CURRENT_USER_SERVICE_NAME = "archive_CurrentUserService"; - public static final String DOCUMENT_MAPPER_NAME = "archive_DocumentMapper"; - public static final String DOCUMENT_REMOTE_SERVICE_NAME = "archive_DocumentRemoteService"; + public static final String CURRENT_USER_SERVICE_NAME = "archiveCurrentUserService"; + public static final String DOCUMENT_MAPPER_NAME = "archiveDocumentMapper"; + public static final String DOCUMENT_REMOTE_SERVICE_NAME = "archiveDocumentRemoteService"; - public static final String USER_SERVICE_NAME = "archive_UserService"; - public static final String USER_PROFILE_MAPPER_NAME = "archive_UserProfileMapper"; - public static final String OZGCLOUD_USER_PROFILE_SERVICE_NAME = "archive_OzgCloudUserProfileService"; + public static final String USER_SERVICE_NAME = "archiveUserService"; + public static final String USER_PROFILE_MAPPER_NAME = "archiveUserProfileMapper"; + public static final String OZGCLOUD_USER_PROFILE_SERVICE_NAME = "archiveOzgCloudUserProfileService"; - public static final String COMMAND_SERVICE_NAME = "archive_CommandService"; - public static final String COMMAND_REMOTE_SERVICE_NAME = "archive_CommandRemoteService"; - public static final String COMMAND_MAPPER_NAME = "archive_CommandMapper"; - public static final String OZGCLOUD_COMMAND_SERVICE_NAME = "archive_OzgCloudCommandService"; + public static final String COMMAND_SERVICE_NAME = "archiveCommandService"; + public static final String COMMAND_REMOTE_SERVICE_NAME = "archiveCommandRemoteService"; + public static final String COMMAND_MAPPER_NAME = "archiveCommandMapper"; + public static final String OZGCLOUD_COMMAND_SERVICE_NAME = "archiveOzgCloudCommandService"; - public static final String BINARY_FILE_SERVICE_NAME = "archive_BinaryFileService"; - public static final String BINARY_FILE_REMOTE_SERVICE_NAME = "archive_BinaryFileRemoteService"; - public static final String OZGCLOUD_FILE_SERVICE_NAME = "archive_OzgCloudFileService"; + public static final String BINARY_FILE_SERVICE_NAME = "archiveBinaryFileService"; + public static final String BINARY_FILE_REMOTE_SERVICE_NAME = "archiveBinaryFileRemoteService"; + public static final String OZGCLOUD_FILE_SERVICE_NAME = "archiveOzgCloudFileService"; - public static final String FILE_ID_MAPPER_NAME = "archive_FileIdMapper"; + public static final String FILE_ID_MAPPER_NAME = "archiveFileIdMapper"; - public static final String BESCHEID_REMOTE_SERVICE_NAME = "archive_BescheidRemoteService"; - public static final String BESCHEID_MAPPER_NAME = "archive_BescheidMapper"; + public static final String BESCHEID_REMOTE_SERVICE_NAME = "archiveBescheidRemoteService"; + public static final String BESCHEID_MAPPER_NAME = "archiveBescheidMapper"; - public static final String CALL_CONTEXT_PROVIDER_NAME = "archive_CallContextProvider"; - public static final String CALL_CONTEXT_MAPPER_NAME = "archive_CallContextMapper"; + public static final String CALL_CONTEXT_PROVIDER_NAME = "archiveCallContextProvider"; + public static final String CALL_CONTEXT_MAPPER_NAME = "archiveCallContextMapper"; - public static final String OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME = "archive_OzgCloudClientAttributeService"; + public static final String OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME = "archiveOzgCloudClientAttributeService"; - public static final String KOMMENTAR_SERVICE_NAME = "archive_KommentarService"; - public static final String KOMMENTAR_REMOTE_SERVICE_NAME = "archive_KommentarRemoteService"; + public static final String KOMMENTAR_SERVICE_NAME = "archiveKommentarService"; + public static final String KOMMENTAR_REMOTE_SERVICE_NAME = "archiveKommentarRemoteService"; - public static final String CALL_CONTEXT_SERVER_INTERCEPTOR_NAME = "archive_CallContextGrpcServerInterceptor"; + public static final String CALL_CONTEXT_SERVER_INTERCEPTOR_NAME = "archiveCallContextGrpcServerInterceptor"; public static final String GRPC_VORGANG_MANAGER_CLIENT_NAME = "vorgang-manager"; public static final String GRPC_COMMAND_MANAGER_CLIENT_NAME = "command-manager"; @@ -108,25 +110,25 @@ public class ArchiveManagerConfiguration { @GrpcClient(GRPC_FILE_MANAGER_CLIENT_NAME) private final BinaryFileServiceStub binaryFileServiceStub; - @Bean(ArchiveManagerConfiguration.OZGCLOUD_FILE_SERVICE_NAME) // NOSONAR + @Bean(ArchiveManagerConfiguration.OZGCLOUD_FILE_SERVICE_NAME) OzgCloudFileService ozgCloudFileService(OzgCloudFileMapper mapper, @Qualifier(CALL_CONTEXT_PROVIDER_NAME) CallContextProvider callContextProvider) { return new GrpcOzgCloudFileService(binaryFileServiceBlockingStub, binaryFileServiceStub, callContextProvider, mapper); } - @Bean(ArchiveManagerConfiguration.OZGCLOUD_USER_PROFILE_SERVICE_NAME) // NOSONAR + @Bean(ArchiveManagerConfiguration.OZGCLOUD_USER_PROFILE_SERVICE_NAME) OzgCloudUserProfileService grpcOzgCloudUserProfileService(UserProfileMapper userProfileMapper, @Qualifier(CALL_CONTEXT_PROVIDER_NAME) CallContextProvider callContextProvider) { return new GrpcOzgCloudUserProfileService(userProfileServiceBlockingStub, userProfileMapper, callContextProvider); } - @Bean(OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME) // NOSONAR + @Bean(OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME) OzgCloudClientAttributeService ozgCloudAttributesService(OzgCloudClientAttributeMapper mapper, @Qualifier(CALL_CONTEXT_PROVIDER_NAME) CallContextProvider callContextProvider) { return new OzgCloudClientAttributeGrpcService(clientAttributeServiceBlockingStub, mapper, callContextProvider); } - @Bean(OZGCLOUD_COMMAND_SERVICE_NAME) // NOSONAR + @Bean(OZGCLOUD_COMMAND_SERVICE_NAME) OzgCloudCommandService ozgCloudCommandService(CommandMapper commandMapper, @Qualifier(CALL_CONTEXT_PROVIDER_NAME) CallContextProvider callContextProvider) { return new GrpcOzgCloudCommandService(commandServiceStub, commandMapper, callContextProvider, diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveEventListener.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveEventListener.java index 1525b91fcbe26e08c3b1464869a5e23b8f380f41..34ce4ceab4ee17875b94de1db098119671c19c89 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveEventListener.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveEventListener.java @@ -65,15 +65,15 @@ public class ArchiveEventListener { public static final Predicate<Command> IS_LOCK_BY_ARCHIVE_MANAGER_COMMAND = command -> CallContextUser.ARCHIVE_MANAGER_CLIENT_NAME .equals(command.getCreatedByClientName()); - @Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) private final CurrentUserService currentUserService; - @Qualifier(ArchiveManagerConfiguration.VORGANG_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.VORGANG_SERVICE_NAME) private final VorgangService vorgangService; private final ApplicationEventPublisher eventPublisher; - @Qualifier(ArchiveManagerConfiguration.COMMAND_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.COMMAND_SERVICE_NAME) private final CommandService commandService; private final ArchiveService archiveService; diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveService.java index dc45d255352044fa6b333ff08bc590851cb88274..464bfca7a32555738f0bb60bdb67cd6f7869f631 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveService.java @@ -53,7 +53,7 @@ class ArchiveService { public static final String ATTRIBUTE_NAME_ANTRAG_ARCHIVING = "ARCHIVING"; private final XtaService xtaService; private final ExportService exportService; - @Qualifier(ArchiveManagerConfiguration.OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME) private final OzgCloudClientAttributeService ozgCloudAttributesService; private final OzgCloudVorgangIdMapper vorgangIdMapper; diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/BescheidRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/BescheidRemoteService.java index a7e8d3999f28118fb4d951349b0090c2c9ad74b4..527701d6174dec35523e0f01d5e1ee5ca7a44883 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/BescheidRemoteService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/BescheidRemoteService.java @@ -36,15 +36,15 @@ import de.ozgcloud.document.bescheid.GrpcGetAllBescheidRequest; import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.inject.GrpcClient; -@Service(ArchiveManagerConfiguration.BESCHEID_REMOTE_SERVICE_NAME) // NOSONAR +@Service(ArchiveManagerConfiguration.BESCHEID_REMOTE_SERVICE_NAME) @RequiredArgsConstructor class BescheidRemoteService { @GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) private final BescheidServiceBlockingStub grpcService; - @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) private final OzgCloudCallContextProvider contextProvider; - @Qualifier(ArchiveManagerConfiguration.BESCHEID_MAPPER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.BESCHEID_MAPPER_NAME) private final BescheidMapper bescheidMapper; public Stream<Bescheid> findByVorgangId(String vorgangId) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/DocumentRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/DocumentRemoteService.java index 4a4f63c82aa00d337a52a0ac420c654898f861c4..4f6ee36fbcc03b44b5ec0af84075fdb3a8fe7405 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/DocumentRemoteService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/DocumentRemoteService.java @@ -35,15 +35,15 @@ import de.ozgcloud.document.GrpcGetDocumentRequest; import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.inject.GrpcClient; -@Service(ArchiveManagerConfiguration.DOCUMENT_REMOTE_SERVICE_NAME) // NOSONAR +@Service(ArchiveManagerConfiguration.DOCUMENT_REMOTE_SERVICE_NAME) @RequiredArgsConstructor class DocumentRemoteService { - @GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) // NOSONAR + @GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) private final DocumentServiceBlockingStub grpcService; - @Qualifier(ArchiveManagerConfiguration.DOCUMENT_MAPPER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.DOCUMENT_MAPPER_NAME) private final DocumentMapper documentMapper; - @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) private final OzgCloudCallContextProvider contextProvider; public FileId getDocument(String documentId) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/ExportBescheidService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/ExportBescheidService.java index 6df64e3fd8f1a00300e0fd3ed8e98e2ea7224d12..bebc4d8f52cf45b557f4c9a14f07780f73fe9646 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/ExportBescheidService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/ExportBescheidService.java @@ -40,16 +40,16 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class ExportBescheidService { - @Qualifier(ArchiveManagerConfiguration.BESCHEID_REMOTE_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.BESCHEID_REMOTE_SERVICE_NAME) private final BescheidRemoteService bescheidRemoteService; - @Qualifier(ArchiveManagerConfiguration.BINARY_FILE_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.BINARY_FILE_SERVICE_NAME) private final BinaryFileService binaryFileService; - @Qualifier(ArchiveManagerConfiguration.DOCUMENT_REMOTE_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.DOCUMENT_REMOTE_SERVICE_NAME) private final DocumentRemoteService documentRemoteService; - @Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME) private final UserService userService; public BescheidExportData createExportData(VorgangWithEingang vorgang) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileRemoteService.java index 91f2aa07daab14a81b95399347184dc5f8538d5b..60782ee819edeb45bb97da55aa6a20f15928eaf2 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileRemoteService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileRemoteService.java @@ -43,22 +43,22 @@ import de.ozgcloud.vorgang.grpc.binaryFile.GrpcFindFilesResponse; import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.inject.GrpcClient; -@Service(ArchiveManagerConfiguration.BINARY_FILE_REMOTE_SERVICE_NAME) // NOSONAR +@Service(ArchiveManagerConfiguration.BINARY_FILE_REMOTE_SERVICE_NAME) @RequiredArgsConstructor class BinaryFileRemoteService { - @GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) // NOSONAR + @GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) private final BinaryFileServiceBlockingStub grpcService; - @Qualifier(ArchiveManagerConfiguration.OZGCLOUD_FILE_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.OZGCLOUD_FILE_SERVICE_NAME) private final OzgCloudFileService ozgCloudFileService; private final OzgFileMapper ozgFileMapper; - @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) private final OzgCloudCallContextProvider contextProvider; - @Qualifier(ArchiveManagerConfiguration.FILE_ID_MAPPER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.FILE_ID_MAPPER_NAME) private final FileIdMapper fileIdMapper; public Stream<OzgFile> getFiles(List<FileId> fileIds) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileService.java index 015ce73c96f9dd4d38b9a79c3d0ff4bf54a7e409..fb4a6db3666ff2b9562cfbddb4086054cf2e4c04 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileService.java @@ -35,11 +35,11 @@ import de.ozgcloud.archive.file.OzgFile; import de.ozgcloud.common.binaryfile.FileId; import lombok.RequiredArgsConstructor; -@Service(ArchiveManagerConfiguration.BINARY_FILE_SERVICE_NAME) // NOSONAR +@Service(ArchiveManagerConfiguration.BINARY_FILE_SERVICE_NAME) @RequiredArgsConstructor public class BinaryFileService { - @Qualifier(ArchiveManagerConfiguration.BINARY_FILE_REMOTE_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.BINARY_FILE_REMOTE_SERVICE_NAME) private final BinaryFileRemoteService binaryFileRemoteService; public Stream<OzgFile> getFiles(List<FileId> attachments) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptor.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptor.java index 8422a9e4625cee1430d6151a2dd12be112fefac1..203f8020d2ce23f71470a6548ce964a654fdc80f 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptor.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptor.java @@ -40,13 +40,13 @@ import io.grpc.ServerCallHandler; import io.grpc.ServerInterceptor; import lombok.RequiredArgsConstructor; -@Component(ArchiveManagerConfiguration.CALL_CONTEXT_SERVER_INTERCEPTOR_NAME) // NOSONAR +@Component(ArchiveManagerConfiguration.CALL_CONTEXT_SERVER_INTERCEPTOR_NAME) @RequiredArgsConstructor public class CallContextGrpcServerInterceptor implements ServerInterceptor { - @Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) private final CurrentUserService currentUserService; - @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_MAPPER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_MAPPER_NAME) private final CallContextMapper callContextMapper; @Override diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextProvider.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextProvider.java index dce8adf18e336911767493fc0868247f9555d3a0..3202e73abc6faeef77b97d686e153d6c7d3bb685 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextProvider.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextProvider.java @@ -31,13 +31,13 @@ import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider; import de.ozgcloud.archive.ArchiveManagerConfiguration; import lombok.RequiredArgsConstructor; -@Component(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR +@Component(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) @RequiredArgsConstructor public class CallContextProvider implements OzgCloudCallContextProvider { - @Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) private final CurrentUserService currentUserService; - @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_MAPPER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_MAPPER_NAME) private final CallContextMapper mapper; @Override diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CurrentUserService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CurrentUserService.java index 07e867d69de62efecc026ddec84cf92644a3e241..e31e1c90e7c875458ccd63254377bf24ae89d982 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CurrentUserService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CurrentUserService.java @@ -42,7 +42,7 @@ import de.ozgcloud.common.grpc.GrpcUtil; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -@Service(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) // NOSONAR +@Service(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) public class CurrentUserService { private final AuthenticationTrustResolver trustResolver; @@ -97,7 +97,6 @@ public class CurrentUserService { return ThreadContext.getContext().getOrDefault(GrpcUtil.KEY_REQUEST_ID, UUID.randomUUID().toString()); } - public SecurityContext startAndReturnPreviousSecurityContext(CallContextUser user) { var prevContext = SecurityContextHolder.getContext(); diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/ArchiveManagerCommand.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/ArchiveManagerCommand.java index 2c6000d429c53488cb3b4c48c6e6e0fa6b1b39da..a6fe1c548fb8bf2b91251ce21e7d39808920cc34 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/ArchiveManagerCommand.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/ArchiveManagerCommand.java @@ -24,18 +24,47 @@ package de.ozgcloud.archive.common.command; import java.time.ZonedDateTime; +import java.util.Collections; import java.util.Map; +import de.ozgcloud.command.Command; +import de.ozgcloud.command.CommandStatus; import lombok.Builder; import lombok.Getter; +import lombok.ToString; -@Builder(toBuilder = true) +@ToString @Getter -public class ArchiveManagerCommand { +@Builder(toBuilder = true) +public class ArchiveManagerCommand implements Command { + + private String id; + private String vorgangId; + private ZonedDateTime createdAt; private ZonedDateTime finishedAt; + + private String createdBy; private String createdByName; + private String createdByClientName; + + private CommandStatus status; + private String order; - private Map<String, ?> body; + private String relationId; + private Long relationVersion; + + @Builder.Default + private Map<String, Object> bodyObject = Collections.emptyMap(); + + /* + * @deprecated use {@link ArchiveManagerCommand#bodyObject} + */ + @Deprecated(since = "0.2.0", forRemoval = true) + private Map<String, String> body; + + private String errorMessage; + + private String createdResource; } diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandMapper.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandMapper.java index 106ae2502bee5d1ba65e30ca8776d63448c18db3..175a6ee53e7480e7df136e9a6672f22e90ab201c 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandMapper.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandMapper.java @@ -41,7 +41,10 @@ import de.ozgcloud.vorgang.grpc.command.GrpcCommand; @AnnotateWith(value = Component.class, elements = @Element(strings = ArchiveManagerConfiguration.COMMAND_MAPPER_NAME)) interface CommandMapper { - @Mapping(target = "body", source = "bodyObj") + @Mapping(target = "createdByClientName", ignore = true) // TODO Ergänzen sobald der aktueller Stand das zulässt + @Mapping(target = "relationVersion", ignore = true) + @Mapping(target = "body", ignore = true) + @Mapping(target = "bodyObject", source = "bodyObj") @Mapping(target = "order", source = "orderString") @Mapping(target = "finishedAt", expression = "java(mapToZonedDateTime(grpcCommand.getFinishedAt()))") ArchiveManagerCommand fromGrpc(GrpcCommand grpcCommand); diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandRemoteService.java index 58344ce3e7a567afcb01183f18c351480c6cc973..62a49a828931b173fe3475181f7dfdd38c9a81bc 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandRemoteService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandRemoteService.java @@ -39,14 +39,14 @@ import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.inject.GrpcClient; @RequiredArgsConstructor -@Service(ArchiveManagerConfiguration.COMMAND_REMOTE_SERVICE_NAME) // NOSONAR +@Service(ArchiveManagerConfiguration.COMMAND_REMOTE_SERVICE_NAME) class CommandRemoteService { - @GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) // NOSONAR + @GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) private final CommandServiceBlockingStub grpcService; - @Qualifier(ArchiveManagerConfiguration.COMMAND_MAPPER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.COMMAND_MAPPER_NAME) private final CommandMapper mapper; - @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) private final OzgCloudCallContextProvider contextProvider; public Stream<ArchiveManagerCommand> findCommands(String vorgangId, Optional<String> status, Optional<String> order) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandService.java index a1f4e512ba5723b7c28c322812a0784bf56473e6..19d9158710418249e40750331b2e217d240d8dbb 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandService.java @@ -35,20 +35,25 @@ import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; import de.ozgcloud.archive.ArchiveManagerConfiguration; +import de.ozgcloud.command.CommandStatus; import lombok.NonNull; import lombok.RequiredArgsConstructor; -@Service(ArchiveManagerConfiguration.COMMAND_SERVICE_NAME) // NOSONAR +@Service(ArchiveManagerConfiguration.COMMAND_SERVICE_NAME) @RequiredArgsConstructor public class CommandService { - @Qualifier(ArchiveManagerConfiguration.COMMAND_REMOTE_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.COMMAND_REMOTE_SERVICE_NAME) private final CommandRemoteService remoteService; - @Qualifier(ArchiveManagerConfiguration.OZGCLOUD_COMMAND_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.OZGCLOUD_COMMAND_SERVICE_NAME) private final OzgCloudCommandService ozgCloudCommandService; + public Stream<ArchiveManagerCommand> findPending(String vorgangId, String order) { + return remoteService.findCommands(vorgangId, Optional.of(CommandStatus.PENDING.name()), Optional.of(order)); + } + public Stream<ArchiveManagerCommand> findFinishedCommands(@NonNull String vorgangId) { - return remoteService.findCommands(vorgangId, Optional.of("FINISHED"), Optional.empty()); + return remoteService.findCommands(vorgangId, Optional.of(CommandStatus.FINISHED.name()), Optional.empty()); } public boolean hasPendingCommandsExceptWithOrder(String vorgangId, String order) { @@ -59,5 +64,4 @@ public class CommandService { private Predicate<? super OzgCloudCommand> hasNotOrder(String order) { return command -> !StringUtils.equals(command.getOrder(), order); } - -} +} \ No newline at end of file diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/user/UserService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/user/UserService.java index 0faf0027ea8800e4ef92104c868f892fde9ef1b2..b68770283d9856550704c194c194379331d4c84c 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/user/UserService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/user/UserService.java @@ -33,16 +33,16 @@ import de.ozgcloud.apilib.user.OzgCloudUserProfileService; import de.ozgcloud.archive.ArchiveManagerConfiguration; import lombok.RequiredArgsConstructor; -@Service(ArchiveManagerConfiguration.USER_SERVICE_NAME) // NOSONAR +@Service(ArchiveManagerConfiguration.USER_SERVICE_NAME) @RequiredArgsConstructor public class UserService { private static final String SYSTEM_USER_ID_PREFIX = "system_"; - @Qualifier(ArchiveManagerConfiguration.OZGCLOUD_USER_PROFILE_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.OZGCLOUD_USER_PROFILE_SERVICE_NAME) private final OzgCloudUserProfileService grpcOzgCloudUserProfileService; - @Qualifier(ArchiveManagerConfiguration.USER_PROFILE_MAPPER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.USER_PROFILE_MAPPER_NAME) private final UserProfileMapper mapper; public String getFullNameById(String userId) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaConfiguration.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaConfiguration.java index 174f5862deb05402b3200b9aedd221f5cdd5e96b..6126927c98b25edead404097d17a1c9d7eca965c 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaConfiguration.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaConfiguration.java @@ -2,6 +2,10 @@ package de.ozgcloud.archive.common.xta; import java.io.IOException; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -58,4 +62,9 @@ class XtaConfiguration { ObjectMapper objectMapper() { return new ObjectMapper(); } + + @Bean + DocumentBuilder documentBuilder() throws ParserConfigurationException { + return DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder(); + } } diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileHelper.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..2e4f493eb3cc6909d22e617fd011e5977878c663 --- /dev/null +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileHelper.java @@ -0,0 +1,13 @@ +package de.ozgcloud.archive.common.xta; + +import org.springframework.stereotype.Component; + +import de.ozgcloud.xta.client.model.XtaFile; + +@Component +public class XtaFileHelper { + + public XtaImportConfirmationHandler initImportConfirmationHandler(XtaFile file) { + return XtaImportConfirmationHandler.createFrom(file); + } +} \ No newline at end of file diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileParser.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileParser.java new file mode 100644 index 0000000000000000000000000000000000000000..70e10b3348bd4b3581df8a75e222c6e5865397df --- /dev/null +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileParser.java @@ -0,0 +1,41 @@ +package de.ozgcloud.archive.common.xta; + +import java.io.IOException; + +import javax.xml.parsers.DocumentBuilder; + +import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import de.ozgcloud.xta.client.model.XtaFile; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; + +@Log4j2 +@RequiredArgsConstructor +@Component +public class XtaFileParser { + + private final DocumentBuilder documentBuilder; + + public boolean isType(XtaFile file, XtaFileType type) { + try { + var doc = parse(file); + return type.getTypeStr().equals(getRootTagName(doc)); + } catch (Exception e) { + LOG.warn("Error parsing xta file.", e); + return false; + } + } + + Document parse(XtaFile file) throws SAXException, IOException { + var document = documentBuilder.parse(file.content().getDataSource().getInputStream()); + document.getDocumentElement().normalize(); + return document; + } + + private String getRootTagName(Document doc) { + return doc.getDocumentElement().getTagName(); + } +} \ No newline at end of file diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileReader.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileReader.java new file mode 100644 index 0000000000000000000000000000000000000000..87320fb68a027534135b88832b29e00ca6912ed4 --- /dev/null +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileReader.java @@ -0,0 +1,38 @@ +package de.ozgcloud.archive.common.xta; + +import java.io.IOException; + +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; + +import de.ozgcloud.common.errorhandling.TechnicalException; +import de.ozgcloud.xta.client.model.XtaFile; +import de.xoev.xdomea.AbgabeImportBestaetigen0402; + +class XtaFileReader<T> { + + private final Unmarshaller unmarshaller; + + public static XtaFileReader<AbgabeImportBestaetigen0402> createAbgabeImportBestaetigen0402Reader() { + return new XtaFileReader<>(AbgabeImportBestaetigen0402.class); + } + + private XtaFileReader(Class<T> clazz) { + try { + unmarshaller = JAXBContext.newInstance(clazz).createUnmarshaller(); + } catch (JAXBException e) { + throw new TechnicalException("Error reading xta file content", e); + } + } + + @SuppressWarnings("unchecked") + public T read(XtaFile xtaFile) { + try { + return (T) unmarshaller.unmarshal(xtaFile.content().getInputStream()); + } catch (JAXBException | IOException e) { + throw new TechnicalException("Error on reading file %s.".formatted(xtaFile.name()), e); + } + } + +} diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileType.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileType.java new file mode 100644 index 0000000000000000000000000000000000000000..ae63bc7117b27927d599b422339c3351eaf15e84 --- /dev/null +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileType.java @@ -0,0 +1,13 @@ +package de.ozgcloud.archive.common.xta; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +public enum XtaFileType { + IMPORT_CONFIRMATION("xdomea:Abgabe.ImportBestaetigen.0402"), + ABGABE("xdomea:Abgabe.Abgabe.0401"); + + @Getter + private final String typeStr; +} \ No newline at end of file diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaImportConfirmationHandler.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaImportConfirmationHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..70ad2f443b80beba421d9169bc598479e22c8ccf --- /dev/null +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaImportConfirmationHandler.java @@ -0,0 +1,44 @@ +package de.ozgcloud.archive.common.xta; + +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import de.ozgcloud.xta.client.model.XtaFile; +import de.xoev.xdomea.AbgabeImportBestaetigen0402; +import de.xoev.xdomea.ErfolgOderMisserfolgAbgabeType; +import lombok.RequiredArgsConstructor; + +public class XtaImportConfirmationHandler { + + private final AbgabeImportBestaetigen0402 importConfirmation; + + public static XtaImportConfirmationHandler createFrom(XtaFile file) { + return new XtaImportConfirmationHandler(file); + } + + private XtaImportConfirmationHandler(XtaFile file) { + importConfirmation = XtaFileReader.createAbgabeImportBestaetigen0402Reader().read(file); + } + + public Stream<XtaAbgabeAdapter> getAbgaben() { + return importConfirmation.getAbgegebenesObjekt().stream().map(XtaAbgabeAdapter::new); + } + + @RequiredArgsConstructor + public static class XtaAbgabeAdapter { + + private final ErfolgOderMisserfolgAbgabeType abgabeType; + + public String getVorgangId() { + return abgabeType.getIDSGO(); + } + + public boolean isSuccessful() { + return abgabeType.isErfolgreich(); + } + + public String getErrorMessage() { + return abgabeType.getFehlermeldung().stream().collect(Collectors.joining(";")); + } + } +} \ No newline at end of file diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaProperties.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaProperties.java index d5409da8ffaf6e8b7d7ecb408f631007a45f9a6d..f30ed809dd6bfd59762a20b71645ac304034c92b 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaProperties.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaProperties.java @@ -16,7 +16,7 @@ import lombok.Setter; @Setter public class XtaProperties { - static final String XTA_PROPERTIES_PREFIX = "ozgcloud.xta"; + public static final String XTA_PROPERTIES_PREFIX = "ozgcloud.xta"; /* * Flag to enable/disable XTA adapter usage. @@ -50,6 +50,11 @@ public class XtaProperties { * Client identifiers used to identify client at XTA adapter. */ private List<XtaIdentifier> clientIdentifiers; + /* + * Times in cron format at which Quittungen are fetched. Default is set to every + * 15 minutes. + */ + private String schedulerCron = "0 0/15 * * * *"; @Getter @Setter diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaService.java index 9aac41082bcaaa23dbb2b1acbadaf85411791ef5..9c7af3c1eee6c0bfd18b3c8bc114fb81cd07aab1 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaService.java @@ -1,6 +1,7 @@ package de.ozgcloud.archive.common.xta; import java.util.Optional; +import java.util.function.Consumer; import org.springframework.stereotype.Service; @@ -11,7 +12,9 @@ import de.ozgcloud.xta.client.model.XtaFile; import de.ozgcloud.xta.client.model.XtaMessage; import de.ozgcloud.xta.client.xdomea.XdomeaXtaMessageCreator; import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +@Log4j2 @RequiredArgsConstructor @Service public class XtaService { @@ -38,4 +41,13 @@ public class XtaService { XtaClient getXtaClient() { return xtaClient.orElseThrow(() -> new TechnicalException(XTA_CLIENT_IS_NOT_CONFIGURED_MESSAGE)); } + + public void fetchMessages(Consumer<XtaMessage> messageConsumer) { + try { + getXtaClient().fetchMessages(messageConsumer); + } catch (XtaClientException e) { + throw new TechnicalException("Error fetching xta messages.", e); + } + } + } diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportService.java index 555dd08ff192966cb4f0a90396053f8cec20be61..d5ecc52add0b1ab7efa515a2d559e39fdf4e64e0 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportService.java @@ -65,10 +65,10 @@ public class ExportService { private final XdomeaXmlMarshaller xDomeaXmlMarshaller; private final ExportFileService exportFileService; - @Qualifier(ArchiveManagerConfiguration.VORGANG_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.VORGANG_SERVICE_NAME) private final VorgangService vorgangService; private final ExportHistorieService exportHistorieService; - @Qualifier(ArchiveManagerConfiguration.KOMMENTAR_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.KOMMENTAR_SERVICE_NAME) private final ExportKommentarService exportKommentarService; private final ExportNachrichtService exportNachrichtService; private final ExportBescheidService exportBescheidService; diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/file/OzgFileRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/file/OzgFileRemoteService.java index 76dee5b4a028d3a19541ef73ddcd6ac292965206..5ed79e0b2c3efa91840b4973e33c6be86fffc5ea 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/file/OzgFileRemoteService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/file/OzgFileRemoteService.java @@ -41,10 +41,10 @@ import net.devh.boot.grpc.client.inject.GrpcClient; @RequiredArgsConstructor class OzgFileRemoteService { - @GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) // NOSONAR + @GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) private final FileServiceBlockingStub grpcService; private final OzgFileMapper fileMapper; - @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) private final OzgCloudCallContextProvider contextProvider; public Stream<OzgFile> getAttachments(String vorgangId) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilder.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilder.java index febbbf87dd931033c03cd0e9bf18b23c1e70f080..3d391de243bd5ac4a7aafc2bc858e50be0b30067 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilder.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilder.java @@ -66,6 +66,6 @@ class AktenzeichenChangeHistoryBuilder extends ChangeHistoryBuilder<Aktenzeichen } String getAktenzeichen(ArchiveManagerCommand command) { - return getValueFromCommandBody(BODY_PROPERTY_AKTENZEICHEN, command); + return getValueFromCommandBodyObject(BODY_PROPERTY_AKTENZEICHEN, command); } } diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilder.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilder.java index 3f7e8bcdfdd4e4bfddb93b4d67a940c4f417d326..1d16d066782fd65eb4c6a737e837b6c10b1437d6 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilder.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilder.java @@ -74,7 +74,7 @@ class AssignedUserChangeHistoryBuilder extends ChangeHistoryBuilder<AssignedUser } String getAssignedUserFullNameFromCommand(ArchiveManagerCommand command) { - var assignedUserId = getValueFromCommandBody(BODY_PROPERTY_ASSIGNED_USER, command); + var assignedUserId = getValueFromCommandBodyObject(BODY_PROPERTY_ASSIGNED_USER, command); return userProfileCache.getUserProfile(assignedUserId).map(UserProfile::getFullName).orElse("automatisch"); } } diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/ChangeHistoryBuilder.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/ChangeHistoryBuilder.java index c05fdfc54cab82fcc3926052e7cc3de457d0e820..15a1b70220ff556df280e512d37d999f88fe61b9 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/ChangeHistoryBuilder.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/ChangeHistoryBuilder.java @@ -104,8 +104,8 @@ abstract class ChangeHistoryBuilder<T extends ChangeHistoryBuilder<T>> { .build(); } - String getValueFromCommandBody(String propertyName, ArchiveManagerCommand command) { - return Optional.ofNullable(command.getBody()).map(body -> body.get(propertyName)).map(Object::toString).orElse(StringUtils.EMPTY); + String getValueFromCommandBodyObject(String propertyName, ArchiveManagerCommand command) { + return Optional.ofNullable(command.getBodyObject()).map(body -> body.get(propertyName)).map(Object::toString).orElse(StringUtils.EMPTY); } record CommandWithChangeValues(ArchiveManagerCommand command, String valueBeforeChange, String valueAfterChange) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/VorgangChangeHistoryService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/VorgangChangeHistoryService.java index 72f50de09755e54694dbcbe1b129de5ac8be2f8e..4bb0ad087cef198cc39fef7e19b6fe9af614868b 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/VorgangChangeHistoryService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/VorgangChangeHistoryService.java @@ -40,10 +40,10 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor class VorgangChangeHistoryService { - @Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME) private final UserService userService; - @Qualifier(ArchiveManagerConfiguration.COMMAND_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.COMMAND_SERVICE_NAME) private final CommandService commandService; public VorgangChangeHistory createVorgangChangeHistory(VorgangWithEingang vorgang) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/ExportKommentarService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/ExportKommentarService.java index 8922d1e87f3cfa57d9430df63c3aa7363cb26fbf..5462b2ed1aef821509543a38f65b5f6a5cbce284 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/ExportKommentarService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/ExportKommentarService.java @@ -41,11 +41,11 @@ import lombok.RequiredArgsConstructor; @Service(ArchiveManagerConfiguration.KOMMENTAR_SERVICE_NAME) public class ExportKommentarService { - @Qualifier(ArchiveManagerConfiguration.KOMMENTAR_REMOTE_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.KOMMENTAR_REMOTE_SERVICE_NAME) private final KommentarRemoteService kommentarRemoteService; - @Qualifier(ArchiveManagerConfiguration.BINARY_FILE_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.BINARY_FILE_SERVICE_NAME) private final BinaryFileService binaryFileService; - @Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME) private final UserService userService; public KommentarsExportData createExportData(VorgangWithEingang vorgang) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/KommentarRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/KommentarRemoteService.java index f42be6e0c777fbae782c822e3cef108d7ec812f1..ea9201a33284d4e0b1bd3b1e98126b951278e9e7 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/KommentarRemoteService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/KommentarRemoteService.java @@ -36,7 +36,7 @@ import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.Vo import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.inject.GrpcClient; -@Service(ArchiveManagerConfiguration.KOMMENTAR_REMOTE_SERVICE_NAME) // NOSONAR +@Service(ArchiveManagerConfiguration.KOMMENTAR_REMOTE_SERVICE_NAME) @RequiredArgsConstructor class KommentarRemoteService { @@ -45,7 +45,7 @@ class KommentarRemoteService { @GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) private final VorgangAttachedItemServiceBlockingStub grpcService; private final KommentarMapper mapper; - @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) private final OzgCloudCallContextProvider contextProvider; public Stream<Kommentar> findByVorgangId(String vorgangId) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/postfach/ExportNachrichtService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/postfach/ExportNachrichtService.java index 4f9de86b5b3e166e957a5b8dcd01f0680ae10694..8e480b13a8fee8efc62ee6b3622bff4879868ef8 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/postfach/ExportNachrichtService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/postfach/ExportNachrichtService.java @@ -46,7 +46,7 @@ public class ExportNachrichtService { private final PostfachMailRemoteService postfachMailRemoteService; private final BinaryFileService binaryFileService; - @Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME) private final UserService userService; public PostfachMailExportData createExportData(VorgangWithEingang vorgang) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungScheduler.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungScheduler.java new file mode 100644 index 0000000000000000000000000000000000000000..ee8a238bbadadf5921aa478709f92b34b8f7f6f4 --- /dev/null +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungScheduler.java @@ -0,0 +1,32 @@ +package de.ozgcloud.archive.quittung; + +import jakarta.annotation.PostConstruct; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Profile; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import de.ozgcloud.archive.common.xta.XtaProperties; +import lombok.RequiredArgsConstructor; + +@Component +@Profile("!itcase") +@RequiredArgsConstructor +@ConditionalOnProperty(prefix = XtaProperties.XTA_PROPERTIES_PREFIX, name = "enabled") +public class QuittungScheduler { + + private static final String SCHEDULER_CRON = "#{xtaProperties.schedulerCron}"; + + private final QuittungService service; + + @PostConstruct + public void onStartup() { + run(); + } + + @Scheduled(cron = SCHEDULER_CRON) + public void run() { + service.fetchQuittung(); + } +} diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungService.java new file mode 100644 index 0000000000000000000000000000000000000000..87a479849a0957c23a94a9eef892d78307d41ce4 --- /dev/null +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungService.java @@ -0,0 +1,86 @@ +package de.ozgcloud.archive.quittung; + +import java.util.List; + +import org.apache.commons.collections.CollectionUtils; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Service; + +import de.ozgcloud.archive.common.command.ArchiveManagerCommand; +import de.ozgcloud.archive.common.command.CommandService; +import de.ozgcloud.archive.common.xta.XtaFileHelper; +import de.ozgcloud.archive.common.xta.XtaFileParser; +import de.ozgcloud.archive.common.xta.XtaFileType; +import de.ozgcloud.archive.common.xta.XtaImportConfirmationHandler.XtaAbgabeAdapter; +import de.ozgcloud.archive.common.xta.XtaService; +import de.ozgcloud.command.Command; +import de.ozgcloud.command.CommandExecutedEvent; +import de.ozgcloud.command.CommandFailedEvent; +import de.ozgcloud.xta.client.model.XtaFile; +import de.ozgcloud.xta.client.model.XtaMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; + +@Log4j2 +@RequiredArgsConstructor +@Service +class QuittungService { + + static final String ARCHIVE_VORGANG_ORDER = "ARCHIVE_VORGANG"; + + private final XtaService xtaService; + private final XtaFileHelper xtaFileHelper; + private final XtaFileParser xtaFileParser; + + private final CommandService commandService; + + private final ApplicationEventPublisher eventPublisher; + + public void fetchQuittung() { + xtaService.fetchMessages(this::consumeQuittung); + } + + void consumeQuittung(XtaMessage message) { + if (isImportConfirmation(message.messageFile())) { + xtaFileHelper.initImportConfirmationHandler(message.messageFile()).getAbgaben().forEach(this::handleAbgabe); + } + } + + boolean isImportConfirmation(XtaFile xtaFile) { + return xtaFileParser.isType(xtaFile, XtaFileType.IMPORT_CONFIRMATION); + } + + void handleAbgabe(XtaAbgabeAdapter abgabeHandler) { + var vorgangId = abgabeHandler.getVorgangId(); + var pendingCommands = findPendingArchiveVorgangCommands(vorgangId); + + if (CollectionUtils.isNotEmpty(pendingCommands)) { + evaluateAbgabe(abgabeHandler, pendingCommands); + } else { + LOG.warn("No pending archive command found for vorgang: %s. Cannot confirm archiving succesful", vorgangId); + } + } + + private List<ArchiveManagerCommand> findPendingArchiveVorgangCommands(String vorgangId) { + return commandService.findPending(vorgangId, ARCHIVE_VORGANG_ORDER).toList(); + } + + void evaluateAbgabe(XtaAbgabeAdapter abgabeHandler, List<ArchiveManagerCommand> pendingCommands) { + if (pendingCommands.size() > 1) { + LOG.warn("Multiple pending commands found for vorgang: %s.", abgabeHandler.getVorgangId()); + } + if (abgabeHandler.isSuccessful()) { + pendingCommands.forEach(this::publishCommandExecutedEvent); + } else { + pendingCommands.forEach(command -> publishCommandFailedEvent(abgabeHandler, command)); + } + } + + void publishCommandExecutedEvent(Command pendingCommand) { + eventPublisher.publishEvent(new CommandExecutedEvent(pendingCommand)); + } + + void publishCommandFailedEvent(XtaAbgabeAdapter contentHandler, Command pendingCommand) { + eventPublisher.publishEvent(new CommandFailedEvent(pendingCommand.getId(), contentHandler.getErrorMessage())); + } +} diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangRemoteService.java index 6c0b50859a32db91ce76b566a9db7a080f546194..4394539cd722e418204e79bf0b9ba8a6e7b8394f 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangRemoteService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangRemoteService.java @@ -34,17 +34,17 @@ import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.inject.GrpcClient; -@Service(ArchiveManagerConfiguration.VORGANG_REMOTE_MANAGER_SERVICE_NAME) // NOSONAR +@Service(ArchiveManagerConfiguration.VORGANG_REMOTE_MANAGER_SERVICE_NAME) @RequiredArgsConstructor class VorgangRemoteService { - @GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) // NOSONAR + @GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) private final VorgangServiceBlockingStub grpcService; - @Qualifier(ArchiveManagerConfiguration.VORGANG_WITH_EINGANG_MAPPER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.VORGANG_WITH_EINGANG_MAPPER_NAME) private final VorgangWithEingangMapper vorgangWithEingangMapper; - @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) private final OzgCloudCallContextProvider contextProvider; public VorgangWithEingang findVorgangWithEingang(String vorgangId) { diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangService.java index 44c5f661718557c8c10b7f625e06b965cc4f2cd3..5d0be7ae621ebc838d9542bdf9be337ea83c8e39 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangService.java @@ -48,7 +48,7 @@ import de.xoev.xdomea.VorgangType; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -@Service(ArchiveManagerConfiguration.VORGANG_SERVICE_NAME) // NOSONAR +@Service(ArchiveManagerConfiguration.VORGANG_SERVICE_NAME) public class VorgangService { static final String LOCK_VORGANG_ORDER = "LOCK_VORGANG"; @@ -56,11 +56,11 @@ public class VorgangService { static final String LOCK_VORGANG_REASON = "Vorgang wird archiviert."; static final String SUB_COMMAND_EXECUTION_MODE = "PARALLEL"; - @Qualifier(ArchiveManagerConfiguration.VORGANG_REMOTE_MANAGER_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.VORGANG_REMOTE_MANAGER_SERVICE_NAME) private final VorgangRemoteService vorgangRemoteService; - @Qualifier(ArchiveManagerConfiguration.OZGCLOUD_COMMAND_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.OZGCLOUD_COMMAND_SERVICE_NAME) private final OzgCloudCommandService ozgCloudCommandService; - @Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) // NOSONAR + @Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) private final CurrentUserService currentUserService; private final CommandMapper commandMapper; diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/ArchiveManagerTestApplication.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/ArchiveManagerTestApplication.java index 9373e61aafa6b3ab1ec6c2d8d15de73e0443bce1..2b6ec1725317aa7b6fffc364481f496b6d563d3d 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/ArchiveManagerTestApplication.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/ArchiveManagerTestApplication.java @@ -42,6 +42,7 @@ import de.ozgcloud.apilib.user.UserProfileMapper; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangIdMapper; import de.ozgcloud.apilib.vorgang.grpc.OzgCloudVorgangMapper; import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc; +import de.ozgcloud.xta.client.XtaClient; @SpringBootApplication @ComponentScan({ "de.ozgcloud.*" }) @@ -60,6 +61,8 @@ public class ArchiveManagerTestApplication { @MockBean private BuildProperties properties; @MockBean + private XtaClient xtaClient; + @MockBean private OzgCloudClientAttributeMapper clientAttributeMapper; public static void main(String[] args) { @@ -76,5 +79,4 @@ public class ArchiveManagerTestApplication { CommandMapper commandMapper() { return Mappers.getMapper(CommandMapper.class); } - -} +} \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptorTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptorTest.java index 437490ce8620a3f5af6f6b587fae62e2a7e021ad..76556e7aed494d9ac10c1487da14f71473175364 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptorTest.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptorTest.java @@ -24,6 +24,7 @@ package de.ozgcloud.archive.common.callcontext; import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.Optional; @@ -236,7 +237,4 @@ class CallContextGrpcServerInterceptorTest { private record RequestTest() { } - - private record ResponseTest() { - } } \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandMapperTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandMapperTest.java index a4d1c91c79f70b5f1e7b814a9a9b6723e76433c8..40c516b5733b5e613b7db8054def33b9f75ae20b 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandMapperTest.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandMapperTest.java @@ -34,9 +34,7 @@ import org.mapstruct.factory.Mappers; import org.mockito.InjectMocks; import org.mockito.Mock; -import de.ozgcloud.apilib.common.command.grpc.GrpcCommandTestFactory; import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; -import de.ozgcloud.vorgang.grpc.command.GrpcCommand; class CommandMapperTest { @@ -48,33 +46,25 @@ class CommandMapperTest { @Nested class TestFromGrpc { - private GrpcCommand command = GrpcCommandTestFactory.createBuilder() - .setFinishedAt(CommandTestFactory.FINISHED_AT.toString()) - .setCreatedByName(CommandTestFactory.CREATED_BY_NAME) - .setOrderString(CommandTestFactory.ORDER) - .build(); - @DisplayName("on existing body object at command") @Nested class TestOnExistingBodyObject { @Test void shouldCallGrpcObjectMapper() { - mapper.fromGrpc(command); + mapper.fromGrpc(GrpcCommandTestFactory.create()); - verify(grpcObjectMapper).mapFromGrpc(command.getBodyObj()); + verify(grpcObjectMapper).mapFromGrpc(GrpcCommandTestFactory.BODY_OBJECT); } @Test void shouldMapToCommand() { when(grpcObjectMapper.mapFromGrpc(any())).thenReturn(CommandTestFactory.BODY); - var result = mapper.fromGrpc(command); + var result = mapper.fromGrpc(GrpcCommandTestFactory.create()); assertThat(result).usingRecursiveComparison().isEqualTo(CommandTestFactory.create()); } } - } - } \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandServiceTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandServiceTest.java index b4a09e172312f7e956b92cd758c662649ba69e7e..3baace331b1abdec2170a5e8ec8153d7ad913c86 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandServiceTest.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandServiceTest.java @@ -30,7 +30,9 @@ import static org.mockito.Mockito.*; import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -43,8 +45,10 @@ import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.grpc.OzgCloudCommandTestFactory; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; import de.ozgcloud.archive.vorgang.VorgangWithEingangTestFactory; +import de.ozgcloud.command.CommandStatus; class CommandServiceTest { + @Spy @InjectMocks private CommandService service; @@ -66,6 +70,31 @@ class CommandServiceTest { } } + @DisplayName("Find pending") + @Nested + class TestFindPending { + + private final String order = LoremIpsum.getInstance().getWords(1); + + @Test + void shouldCallRemoteService() { + service.findPending(VorgangWithEingangTestFactory.ID, order); + + verify(remoteService).findCommands(VorgangWithEingangTestFactory.ID, Optional.of(CommandStatus.PENDING.name()), + Optional.of(order)); + } + + @Test + void shouldReturnValue() { + var command = ArchiveManagerCommand.builder().build(); + when(remoteService.findCommands(any(), any(), any())).thenReturn(Stream.of(command)); + + var commands = service.findPending(VorgangWithEingangTestFactory.ID, order).toList(); + + assertThat(commands).containsExactly(command); + } + } + @Nested class TestHasPendingCommandsExceptArchive { diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandTestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandTestFactory.java index 86671d991b629483928cdf946ac805460c1b9cce..22fbb411f8155392e181505e828524dbd11181a4 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandTestFactory.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandTestFactory.java @@ -25,33 +25,55 @@ package de.ozgcloud.archive.common.command; import java.time.ZonedDateTime; import java.util.Map; +import java.util.UUID; import com.thedeanda.lorem.LoremIpsum; -import de.ozgcloud.archive.common.command.ArchiveManagerCommand.ArchiveManagerCommandBuilder; import de.ozgcloud.archive.common.user.UserProfileTestFactory; +import de.ozgcloud.command.CommandStatus; public class CommandTestFactory { - public static final ZonedDateTime FINISHED_AT = ZonedDateTime.now(); + public static final String ID = UUID.randomUUID().toString(); + public static final String VORGANG_ID = UUID.randomUUID().toString();; + public static final String CREATED_BY_NAME = UserProfileTestFactory.FULLNAME; public static final String ORDER = LoremIpsum.getInstance().getWords(1); + public static final CommandStatus STATUS = CommandStatus.FINISHED; + + public static final String BODY_FIELD_NAME = LoremIpsum.getInstance().getWords(1); + public static final String BODY_FIELD_VALUE = LoremIpsum.getInstance().getWords(1); + public static final Map<String, Object> BODY = Map.of(BODY_FIELD_NAME, BODY_FIELD_VALUE); + + public static final String RELATION_ID = UUID.randomUUID().toString(); + public static final long RELATION_VERSION = 42; + + public static final String CREATED_AT_STR = "2023-08-18T13:54:10Z"; + public static final ZonedDateTime CREATED_AT = ZonedDateTime.parse(CREATED_AT_STR); + public static final String FINISHED_AT_STR = "2023-08-18T13:55:10Z"; + public static final ZonedDateTime FINISHED_AT = ZonedDateTime.parse(FINISHED_AT_STR); - public static final String PROPERTY_1 = LoremIpsum.getInstance().getWords(1); - public static final String PROPERTY_2 = LoremIpsum.getInstance().getWords(1); - public static final String VALUE_1 = LoremIpsum.getInstance().getWords(1); - public static final String VALUE_2 = LoremIpsum.getInstance().getWords(1); - public static final Map<String, Object> BODY = Map.of(PROPERTY_1, VALUE_1, PROPERTY_2, VALUE_2); + public static final String CREATED_RESOURCE = UUID.randomUUID().toString(); + public static final String CREATED_BY = UUID.randomUUID().toString(); + public static final String ERROR_MESSAGE = "An error occurred"; public static ArchiveManagerCommand create() { - return createBuilder() - .build(); + return createBuilder().build(); } - public static ArchiveManagerCommandBuilder createBuilder() { - return ArchiveManagerCommand.builder().body(BODY) + public static ArchiveManagerCommand.ArchiveManagerCommandBuilder createBuilder() { + return ArchiveManagerCommand.builder() + .id(ID) + .vorgangId(VORGANG_ID) + .relationId(RELATION_ID) + .order(ORDER) + .status(STATUS) + .createdAt(CREATED_AT) .finishedAt(FINISHED_AT) + .bodyObject(BODY) + .createdResource(CREATED_RESOURCE) + .createdBy(CREATED_BY) .createdByName(CREATED_BY_NAME) - .order(ORDER); + .errorMessage(ERROR_MESSAGE); } -} +} \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/GrpcCommandTestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/GrpcCommandTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..831cee8510d5897df84552adfdf5bd2848fe6a7a --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/GrpcCommandTestFactory.java @@ -0,0 +1,33 @@ +package de.ozgcloud.archive.common.command; + +import de.ozgcloud.vorgang.common.GrpcObject; +import de.ozgcloud.vorgang.common.GrpcProperty; +import de.ozgcloud.vorgang.grpc.command.GrpcCommand; + +public class GrpcCommandTestFactory { + + public static final GrpcObject BODY_OBJECT = GrpcObject.newBuilder() + .addProperty(GrpcProperty.newBuilder() + .setName(CommandTestFactory.BODY_FIELD_NAME).addValue(CommandTestFactory.BODY_FIELD_VALUE)) + .build(); + + public static GrpcCommand create() { + return createBuilder().build(); + } + + public static GrpcCommand.Builder createBuilder() { + return GrpcCommand.newBuilder() + .setId(CommandTestFactory.ID.toString()) + .setVorgangId(CommandTestFactory.VORGANG_ID) + .setCreatedAt(CommandTestFactory.CREATED_AT_STR) + .setFinishedAt(CommandTestFactory.FINISHED_AT_STR) + .setCreatedBy(CommandTestFactory.CREATED_BY) + .setCreatedByName(CommandTestFactory.CREATED_BY_NAME) + .setStatus(CommandTestFactory.STATUS.toString()) + .setErrorMessage(CommandTestFactory.ERROR_MESSAGE) + .setRelationId(CommandTestFactory.RELATION_ID) + .setBodyObj(BODY_OBJECT) + .setOrderString(CommandTestFactory.ORDER) + .setCreatedResource(CommandTestFactory.CREATED_RESOURCE); + } +} diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/AbgabeImportBestaetigen0402TestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/AbgabeImportBestaetigen0402TestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..d034a25e99f4699183b736593be47bde4b271d41 --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/AbgabeImportBestaetigen0402TestFactory.java @@ -0,0 +1,34 @@ +package de.ozgcloud.archive.common.xta; + +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; + +import org.w3c.dom.Document; + +import de.xoev.xdomea.AbgabeImportBestaetigen0402; +import lombok.SneakyThrows; + +public class AbgabeImportBestaetigen0402TestFactory { + + public static final String VORGANG_ID = "DummyVorgangId"; + public static final boolean ERFOLGREICH = false; + public static final String FEHLERMELDUNG = "Grund, warum der Import nicht funktioniert hat."; + + public static final String FILE_PATH = "xml-templates/21b2f942-c454-44e6-a706-c4f6ef2d584a_Abgabe.ImportBestaetigen.0402.xml"; + + @SneakyThrows + public static AbgabeImportBestaetigen0402 create() { + return (AbgabeImportBestaetigen0402) getUnmarshaller() + .unmarshal(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH).content().getInputStream()); + } + + private static Unmarshaller getUnmarshaller() throws JAXBException { + return JAXBContext.newInstance(AbgabeImportBestaetigen0402.class).createUnmarshaller(); + } + + @SneakyThrows + public static Document createAsDocument() { + return DocumentTestFactory.createFrom(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH)); + } +} \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/DocumentTestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/DocumentTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..36d4a24ef635b9f1b8f17493cf3cf86dfd21815d --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/DocumentTestFactory.java @@ -0,0 +1,23 @@ +package de.ozgcloud.archive.common.xta; + +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Document; + +import de.ozgcloud.xta.client.model.XtaFile; +import lombok.SneakyThrows; + +public class DocumentTestFactory { + + public static final XtaFile FILE = XtaFileTestFactory.create(); + + public static Document create() { + return createFrom(FILE); + } + + @SneakyThrows + public static Document createFrom(XtaFile file) { + return DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder().parse(file.content().getDataSource().getInputStream()); + } + +} diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileHelperTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileHelperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..5485f56607185add07b0b74df6b510007104b3c1 --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileHelperTest.java @@ -0,0 +1,26 @@ +package de.ozgcloud.archive.common.xta; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; + +class XtaFileHelperTest { + + @InjectMocks + private XtaFileHelper service; + + @DisplayName("Init import confirmation handler") + @Nested + class TestInitImportConfirmationHandler { + + @Test + void shouldReturnInstanceOfHandler() { + var handler = service.initImportConfirmationHandler(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH)); + + assertThat(handler).isNotNull().isInstanceOf(XtaImportConfirmationHandler.class); + } + } +} \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserITCase.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..47cca112e543d89778b4f4ce4764d3c754d44a4e --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserITCase.java @@ -0,0 +1,38 @@ +package de.ozgcloud.archive.common.xta; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import de.ozgcloud.common.test.ITCase; + +@ITCase +class XtaFileParserITCase { + + @Autowired + private XtaFileParser parser; + + @DisplayName("Is import confirmation") + @Nested + class TestIsType { + + @Test + void shouldReturnTrueOnMatchingTag() { + var isImportConfirmation = parser.isType(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH), + XtaFileType.IMPORT_CONFIRMATION); + + assertThat(isImportConfirmation).isTrue(); + } + + @Test + void shouldReturnFalseOnNonMatchingTag() { + var isImportConfirmation = parser.isType(XtaFileTestFactory.create(), XtaFileType.ABGABE); + + assertThat(isImportConfirmation).isFalse(); + } + } + +} \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserTest.java new file mode 100644 index 0000000000000000000000000000000000000000..2f3713ad2b66b577bbda5200903e45f5fffc2cb2 --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserTest.java @@ -0,0 +1,124 @@ +package de.ozgcloud.archive.common.xta; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.io.InputStream; + +import javax.xml.parsers.DocumentBuilder; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.springframework.core.io.ClassPathResource; +import org.w3c.dom.Document; + +import de.ozgcloud.common.errorhandling.TechnicalException; +import de.ozgcloud.xta.client.model.XtaFile; +import lombok.SneakyThrows; + +class XtaFileParserTest { + + @Spy + @InjectMocks + private XtaFileParser parser; + + @Mock + private DocumentBuilder documentBuilder; + + @DisplayName("Is import confirmation") + @Nested + class TestIsType { + + private final XtaFile file = XtaFileTestFactory.create(); + + @Test + @SneakyThrows + void shouldCallParse() { + isType(); + + verify(parser).parse(file); + } + + @Test + @SneakyThrows + void shouldReturnTrueOnMatchingTag() { + doReturn(AbgabeImportBestaetigen0402TestFactory.createAsDocument()).when(parser).parse(file); + + var isImportConfirmation = isType(); + + assertThat(isImportConfirmation).isTrue(); + } + + @Test + @SneakyThrows + void shouldReturnFalseOnNonMatchingTag() { + doReturn(DocumentTestFactory.create()).when(parser).parse(file); + + var isImportConfirmation = isType(); + + assertThat(isImportConfirmation).isFalse(); + } + + @Test + @SneakyThrows + void shouldReturnFalseOnException() { + doThrow(TechnicalException.class).when(parser).parse(any()); + + var isType = isType(); + + assertThat(isType).isFalse(); + } + + private boolean isType() { + return parser.isType(file, XtaFileType.IMPORT_CONFIRMATION); + } + } + + @Nested + class TestParse { + + private final XtaFile file = XtaFileTestFactory.create(); + private final Document document = AbgabeImportBestaetigen0402TestFactory.createAsDocument(); + + @Captor + private ArgumentCaptor<InputStream> inputStreamCaptor; + + @BeforeEach + @SneakyThrows + void mock() { + when(documentBuilder.parse(any(InputStream.class))).thenReturn(document); + } + + @Test + @SneakyThrows + void shouldCallDocumentBuilder() { + var expectedBytes = new ClassPathResource(XtaFileTestFactory.DUMMY_XML_FILE_PATH).getContentAsByteArray(); + + parse(); + + verify(documentBuilder).parse(inputStreamCaptor.capture()); + assertThat(inputStreamCaptor.getValue().readAllBytes()).isEqualTo(expectedBytes); + } + + @Test + @SneakyThrows + void shouldReturnDocument() { + var result = parse(); + + assertThat(result).isEqualTo(document); + } + + @SneakyThrows + private Document parse() { + return parser.parse(file); + } + } +} \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileReaderTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileReaderTest.java new file mode 100644 index 0000000000000000000000000000000000000000..73c88d4bfc0d48758e059b3e1936fcfa1cb6f142 --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileReaderTest.java @@ -0,0 +1,62 @@ +package de.ozgcloud.archive.common.xta; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.Unmarshaller; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import de.ozgcloud.common.errorhandling.TechnicalException; +import de.ozgcloud.common.test.ReflectionTestUtils; +import de.ozgcloud.xta.client.model.XtaFile; +import de.xoev.xdomea.AbgabeImportBestaetigen0402; +import lombok.SneakyThrows; + +class XtaFileReaderTest { + + @Nested + class TestCreateAbgabeImportBestaetigen0402Reader { + + @Test + void shouldCreateReader() { + var reader = XtaFileReader.createAbgabeImportBestaetigen0402Reader(); + + assertThat(reader).isExactlyInstanceOf(XtaFileReader.class); + } + + @Test + @SneakyThrows + void shouldSetUnmarshaller() { + var reader = XtaFileReader.createAbgabeImportBestaetigen0402Reader(); + + assertThat(ReflectionTestUtils.getField(reader, "unmarshaller", Unmarshaller.class)).usingRecursiveComparison() + .isEqualTo(JAXBContext.newInstance(AbgabeImportBestaetigen0402.class).createUnmarshaller()); + } + } + + @Nested + class TestRead { + + @Test + @SneakyThrows + void shouldReadContent() { + var reader = XtaFileReader.createAbgabeImportBestaetigen0402Reader(); + + var abgabe = reader.read(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH)); + + assertThat(abgabe).usingRecursiveComparison().isEqualTo(AbgabeImportBestaetigen0402TestFactory.create()); + } + + @Test + @SneakyThrows + void shouldThrowTechnicalException() { + var reader = XtaFileReader.createAbgabeImportBestaetigen0402Reader(); + XtaFile unknownFile = XtaFileTestFactory.create(XtaFileTestFactory.DUMMY_XML_FILE_PATH); + + assertThrows(TechnicalException.class, () -> reader.read(unknownFile)); + } + } +} diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileTestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..4e03b8db6ffae2c86c18f18e07b03bda9231cb98 --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileTestFactory.java @@ -0,0 +1,37 @@ +package de.ozgcloud.archive.common.xta; + +import jakarta.activation.DataHandler; +import jakarta.activation.FileDataSource; + +import org.springframework.core.io.ClassPathResource; + +import de.ozgcloud.xta.client.model.XtaFile; +import lombok.SneakyThrows; + +public class XtaFileTestFactory { + + public static final String DUMMY_XML_FILE_PATH = "xml-templates/dummy.xml"; + + public static XtaFile create() { + return create(DUMMY_XML_FILE_PATH); + } + + public static XtaFile create(String filePath) { + return createBuilder(filePath).build(); + } + + public static XtaFile.XtaFileBuilder createBuilder() { + return createBuilder(DUMMY_XML_FILE_PATH); + } + + public static XtaFile.XtaFileBuilder createBuilder(String filePath) { + return XtaFile.builder() + .content(createDataHandler(filePath)); + } + + @SneakyThrows + private static DataHandler createDataHandler(String filePath) { + var file = new ClassPathResource(filePath).getFile(); + return new DataHandler(new FileDataSource(file)); + } +} \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaImportConfirmationHandlerTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaImportConfirmationHandlerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..3e36d432775aa4feeb8bd23679aee7fcfbae5f09 --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaImportConfirmationHandlerTest.java @@ -0,0 +1,118 @@ +package de.ozgcloud.archive.common.xta; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockedStatic; + +import de.ozgcloud.archive.common.xta.XtaImportConfirmationHandler.XtaAbgabeAdapter; +import de.ozgcloud.common.test.ReflectionTestUtils; +import de.ozgcloud.xta.client.model.XtaFile; +import de.xoev.xdomea.AbgabeImportBestaetigen0402; + +class XtaImportConfirmationHandlerTest { + + @DisplayName("Xta import confirmation handler") + @Nested + class TestXtaImportConfirmationHandler { + + private final AbgabeImportBestaetigen0402 importConfirmation = AbgabeImportBestaetigen0402TestFactory.create(); + private final XtaFile file = XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH); + + @Mock + private XtaFileReader<AbgabeImportBestaetigen0402> reader; + + @Nested + class TestCreateFrom { + + @SuppressWarnings("rawtypes") + private MockedStatic<XtaFileReader> fileReaderStaticMock; + + @BeforeEach + void initMock() { + fileReaderStaticMock = mockStatic(XtaFileReader.class); + fileReaderStaticMock.when(XtaFileReader::createAbgabeImportBestaetigen0402Reader).thenReturn(reader); + } + + @AfterEach + void closeMock() { + fileReaderStaticMock.close(); + } + + @Test + void shouldReadFileContent() { + XtaImportConfirmationHandler.createFrom(file); + + verify(reader).read(file); + } + + @Test + void shouldSetImportConfirmation() { + when(reader.read(any())).thenReturn(importConfirmation); + + var confiHandler = XtaImportConfirmationHandler.createFrom(file); + + assertThat(ReflectionTestUtils.getField(confiHandler, "importConfirmation", AbgabeImportBestaetigen0402.class)) + .usingRecursiveComparison().isEqualTo(importConfirmation); + + } + + } + + @Nested + class TestGetAbgaben { + private final XtaFile file = XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH); + + @Test + void shouldReturnAbgabenAsHandler() { + var handler = XtaImportConfirmationHandler.createFrom(file); + + assertThat(handler.getAbgaben()).hasSize(1); + assertThat(handler.getAbgaben().findFirst()).isPresent().get().isInstanceOf(XtaAbgabeAdapter.class); + } + } + } + + @DisplayName("Xta abgabe handler") + @Nested + class TestXtaAbgabeAdapter { + + private final XtaFile file = XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH); + + @Test + void shouldReturnVorgangId() { + var vorgangId = initAbgabeHandler().getVorgangId(); + + assertThat(vorgangId).isEqualTo(AbgabeImportBestaetigen0402TestFactory.VORGANG_ID); + } + + @Test + void shouldReturnIsSucessful() { + var isSuccessful = initAbgabeHandler().isSuccessful(); + + assertThat(isSuccessful).isEqualTo(AbgabeImportBestaetigen0402TestFactory.ERFOLGREICH); + } + + @Test + void shouldReturnErrorMessage() { + var errorMessage = initAbgabeHandler().getErrorMessage(); + + assertThat(errorMessage).isEqualTo(AbgabeImportBestaetigen0402TestFactory.FEHLERMELDUNG); + } + + private XtaAbgabeAdapter initAbgabeHandler() { + return initImportConfirmationHandler().getAbgaben().findFirst().get(); + } + + private XtaImportConfirmationHandler initImportConfirmationHandler() { + return XtaImportConfirmationHandler.createFrom(file); + } + } +} \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaMessageTestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaMessageTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..2ab40253ff8a3ab8f8b4a36f979e4e07e29fb188 --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaMessageTestFactory.java @@ -0,0 +1,18 @@ +package de.ozgcloud.archive.common.xta; + +import de.ozgcloud.xta.client.model.XtaFile; +import de.ozgcloud.xta.client.model.XtaMessage; + +public class XtaMessageTestFactory { + + public static final XtaFile MESSAGE_FILE = XtaFileTestFactory.create(); + + public static XtaMessage create() { + return createBuilder().build(); + } + + public static XtaMessage.XtaMessageBuilder createBuilder() { + return XtaMessage.builder() + .messageFile(MESSAGE_FILE); + } +} \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaServiceTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaServiceTest.java index 536adb305f6e1acdac5731ff29f1c78eca0fec9a..8aa6c075b216996913d946da156958c7db6f0dae 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaServiceTest.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaServiceTest.java @@ -6,16 +6,20 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.Optional; +import java.util.function.Consumer; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockedStatic; import org.mockito.Spy; +import org.springframework.context.ApplicationEventPublisher; +import de.ozgcloud.archive.common.command.CommandService; import de.ozgcloud.archive.vorgang.XdomeaXtaFileTestFactory; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.xta.client.XtaClient; @@ -148,6 +152,15 @@ class XtaServiceTest { private XtaService xtaService; + @Mock + private XtaFileHelper xtaFileHelper; + + @Mock + private CommandService commandService; + + @Mock + private ApplicationEventPublisher eventPublisher; + @Nested class TestOnConfiguredXtaClient { @@ -183,4 +196,45 @@ class XtaServiceTest { return xtaService.getXtaClient(); } } + + @DisplayName("Fetch messages") + @Nested + class TestFetchMessages { + + @Mock + private Consumer<XtaMessage> messageConsumer; + + @BeforeEach + void mock() { + doReturn(xtaClient).when(service).getXtaClient(); + } + + @Test + void shouldCallGetXtaClient() { + fetchMessages(); + + verify(service).getXtaClient(); + } + + @SneakyThrows + @Test + void shouldCallClient() { + fetchMessages(); + + verify(xtaClient).fetchMessages(messageConsumer); + } + + @SneakyThrows + @Test + void shouldThrowException() { + when(xtaClient.fetchMessages(any())).thenThrow(new XtaClientException("error-message")); + + assertThatThrownBy(this::fetchMessages).isInstanceOf(TechnicalException.class); + } + + private void fetchMessages() { + service.fetchMessages(messageConsumer); + } + } + } diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/export/ExportGrpcServiceTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/export/ExportGrpcServiceTest.java index 52694de1c9a693475348ab5174472e74be5de8f3..f2a0fb2f4f1467a12b56ef4b61948b4c55dccd76 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/export/ExportGrpcServiceTest.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/export/ExportGrpcServiceTest.java @@ -176,7 +176,8 @@ class ExportGrpcServiceTest { @Mock private OutputStream outputStream; - private MockedConstruction<GrpcBinaryFileServerDownloader> downloaderMockedConstruction; // NOSONAR + @SuppressWarnings("rawtypes") + private MockedConstruction<GrpcBinaryFileServerDownloader> downloaderMockedConstruction; private GrpcBinaryFileServerDownloader<GrpcExportVorgangResponse> downloader; private StreamObserver<GrpcExportVorgangResponse> setResponseObserver; private TaskExecutor setTaskExecutor; diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilderTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilderTest.java index deb8bba8e88d27f52b04e45df9389d24b550cfa3..cc6e23826262ea5c7301930af8d7ce26e58679fb 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilderTest.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilderTest.java @@ -185,14 +185,14 @@ public class AktenzeichenChangeHistoryBuilderTest { @BeforeEach void init() { - when(builder.getValueFromCommandBody(BODY_PROPERTY_AKTENZEICHEN, previousCommand)).thenReturn(AKTENZEICHEN); + when(builder.getValueFromCommandBodyObject(BODY_PROPERTY_AKTENZEICHEN, previousCommand)).thenReturn(AKTENZEICHEN); } @Test void shouldGetValueFromCommandBody() { builder.getAktenzeichen(previousCommand); - verify(builder).getValueFromCommandBody(BODY_PROPERTY_AKTENZEICHEN, previousCommand); + verify(builder).getValueFromCommandBodyObject(BODY_PROPERTY_AKTENZEICHEN, previousCommand); } @Test diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilderTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilderTest.java index 65db09161154086d5def426d792616d8eff35ab8..fe7afe21864ffe3befe9f506c210a6a6955fb248 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilderTest.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilderTest.java @@ -217,7 +217,7 @@ public class AssignedUserChangeHistoryBuilderTest { @BeforeEach void init() { - doReturn(UserProfileTestFactory.USER_ID).when(builder).getValueFromCommandBody(any(), any()); + doReturn(UserProfileTestFactory.USER_ID).when(builder).getValueFromCommandBodyObject(any(), any()); doReturn(Optional.of(UserProfileTestFactory.create())).when(userProfileCache).getUserProfile(any()); } @@ -225,7 +225,7 @@ public class AssignedUserChangeHistoryBuilderTest { void shouldGetUserIdFromCommand() { callBuilder(); - verify(builder).getValueFromCommandBody(BODY_PROPERTY_ASSIGNED_USER, previousCommand); + verify(builder).getValueFromCommandBodyObject(BODY_PROPERTY_ASSIGNED_USER, previousCommand); } @Test diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/ChangeHistoryBuilderTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/ChangeHistoryBuilderTest.java index 457a8673679a869cd0e1743b5d17f1c2fb7f68d4..5cc94ff0a704dc7b28d75ec3abbc99e2e233edc8 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/ChangeHistoryBuilderTest.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/ChangeHistoryBuilderTest.java @@ -252,19 +252,19 @@ public class ChangeHistoryBuilderTest { @ParameterizedTest @NullAndEmptySource - void shouldReturnEmptyIfBodyIsNullOrEmpty(Map<String, ?> body) { - var command = previousCommand.toBuilder().body(body).build(); + void shouldReturnEmptyIfBodyIsNullOrEmpty(Map<String, Object> body) { + var command = previousCommand.toBuilder().bodyObject(body).build(); - var value = builder.getValueFromCommandBody(PROPERTY_NAME, command); + var value = builder.getValueFromCommandBodyObject(PROPERTY_NAME, command); assertThat(value).isEmpty(); } @Test void shouldReturnEmptyIfPropertyIsNotPresentInBody() { - var command = previousCommand.toBuilder().body(Map.of("a", "b")).build(); + var command = previousCommand.toBuilder().bodyObject(Map.of("a", "b")).build(); - var value = builder.getValueFromCommandBody(PROPERTY_NAME, command); + var value = builder.getValueFromCommandBodyObject(PROPERTY_NAME, command); assertThat(value).isEmpty(); } @@ -272,9 +272,9 @@ public class ChangeHistoryBuilderTest { @Test void shouldReturnValueFromBody() { var expectedValue = LoremIpsum.getInstance().getWords(2); - var command = previousCommand.toBuilder().body(Map.of(PROPERTY_NAME, expectedValue)).build(); + var command = previousCommand.toBuilder().bodyObject(Map.of(PROPERTY_NAME, expectedValue)).build(); - var value = builder.getValueFromCommandBody(PROPERTY_NAME, command); + var value = builder.getValueFromCommandBodyObject(PROPERTY_NAME, command); assertThat(value).isEqualTo(expectedValue); } diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungSchedulerTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungSchedulerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..120451f8f879100ad73f8e32f25581ecd94d4cf1 --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungSchedulerTest.java @@ -0,0 +1,40 @@ +package de.ozgcloud.archive.quittung; + +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +class QuittungSchedulerTest { + + @Spy + @InjectMocks + private QuittungScheduler scheduler; + @Mock + private QuittungService service; + + @Nested + class TestOnStartup { + + @Test + void shouldCallRun() { + scheduler.onStartup(); + + verify(scheduler).run(); + } + } + + @Nested + class TestRun { + + @Test + void shouldCallService() { + scheduler.run(); + + verify(service).fetchQuittung(); + } + } +} \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungServiceTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..c6e600aa2848d2dc97011ddf78f6e7ed2ff4cfc1 --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungServiceTest.java @@ -0,0 +1,300 @@ +package de.ozgcloud.archive.quittung; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.List; +import java.util.function.Consumer; +import java.util.stream.Stream; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.springframework.context.ApplicationEventPublisher; + +import de.ozgcloud.archive.common.command.ArchiveManagerCommand; +import de.ozgcloud.archive.common.command.CommandService; +import de.ozgcloud.archive.common.command.CommandTestFactory; +import de.ozgcloud.archive.common.xta.AbgabeImportBestaetigen0402TestFactory; +import de.ozgcloud.archive.common.xta.XtaFileHelper; +import de.ozgcloud.archive.common.xta.XtaFileParser; +import de.ozgcloud.archive.common.xta.XtaFileTestFactory; +import de.ozgcloud.archive.common.xta.XtaFileType; +import de.ozgcloud.archive.common.xta.XtaImportConfirmationHandler; +import de.ozgcloud.archive.common.xta.XtaImportConfirmationHandler.XtaAbgabeAdapter; +import de.ozgcloud.archive.common.xta.XtaMessageTestFactory; +import de.ozgcloud.archive.common.xta.XtaService; +import de.ozgcloud.archive.vorgang.VorgangWithEingangTestFactory; +import de.ozgcloud.command.CommandExecutedEvent; +import de.ozgcloud.command.CommandFailedEvent; +import de.ozgcloud.xta.client.model.XtaFile; +import de.ozgcloud.xta.client.model.XtaMessage; + +class QuittungServiceTest { + + @Spy + @InjectMocks + private QuittungService service; + @Mock + private XtaService xtaService; + @Mock + private CommandService commandService; + @Mock + private ApplicationEventPublisher eventPublisher; + @Mock + private XtaFileHelper xtaFileHelper; + @Mock + private XtaFileParser xtaFileParser; + + @Nested + class TestFetchQuittung { + + @Captor + private ArgumentCaptor<Consumer<XtaMessage>> consumerCaptor; + + private final XtaMessage message = XtaMessageTestFactory.create(); + + @Test + void shouldCallXtaService() { + service.fetchQuittung(); + + verify(xtaService).fetchMessages(any()); + } + + @Test + void shouldPassQuittungConsumerToXtaService() { + service.fetchQuittung(); + + verify(xtaService).fetchMessages(consumerCaptor.capture()); + consumerCaptor.getValue().accept(message); + verify(service).consumeQuittung(message); + } + } + + @DisplayName("Consume Quittung") + @Nested + class TestConsumeQuittung { + + @Mock + private XtaImportConfirmationHandler xtaFileContentHandler; + + private final XtaMessage xtaMessage = XtaMessageTestFactory.create(); + + @Test + void shouldCallIsImportConfirmation() { + service.consumeQuittung(xtaMessage); + + verify(service).isImportConfirmation(XtaMessageTestFactory.MESSAGE_FILE); + } + + @DisplayName("on import confirmation") + @Nested + class TestOnImportConfirmation { + + @Mock + private XtaAbgabeAdapter abgabeHandler; + + @BeforeEach + void mock() { + doReturn(true).when(service).isImportConfirmation(any()); + when(xtaFileHelper.initImportConfirmationHandler(any())).thenReturn(xtaFileContentHandler); + when(xtaFileContentHandler.getAbgaben()).thenReturn(Stream.of(abgabeHandler, abgabeHandler)); + doNothing().when(service).handleAbgabe(any()); + } + + @Test + void shouldInitContentHandler() { + service.consumeQuittung(xtaMessage); + + verify(xtaFileHelper).initImportConfirmationHandler(XtaMessageTestFactory.MESSAGE_FILE); + } + + @DisplayName("should handle import confirmation if type from document is matching") + @Test + void shouldCallHandleAbgabe() { + service.consumeQuittung(xtaMessage); + + verify(service, times(2)).handleAbgabe(abgabeHandler); + } + } + + @DisplayName("should not handle message if its not an import confirmation") + @Test + void shouldNotProceed() { + doReturn(false).when(service).isImportConfirmation(any()); + + service.consumeQuittung(xtaMessage); + + verify(service, never()).handleAbgabe(any()); + verify(xtaFileHelper, never()).initImportConfirmationHandler(any()); + } + } + + @Nested + class TestIsImportConfirmation { + + private XtaFile xtaFile = XtaFileTestFactory.create(); + + @Test + void shouldCallXtaFileParser() { + service.isImportConfirmation(xtaFile); + + verify(xtaFileParser).isType(xtaFile, XtaFileType.IMPORT_CONFIRMATION); + } + + @ParameterizedTest + @ValueSource(booleans = { true, false }) + void shouldReturnIsType(boolean isImportConfirmation) { + when(xtaFileParser.isType(any(), any())).thenReturn(isImportConfirmation); + + var returnValue = service.isImportConfirmation(xtaFile); + + assertThat(returnValue).isEqualTo(isImportConfirmation); + } + + } + + @DisplayName("Handle abgabe") + @Nested + class TestHandleAbgabe { + + @Mock + private XtaAbgabeAdapter abgabeHandler; + + @BeforeEach + void mock() { + when(abgabeHandler.getVorgangId()).thenReturn(VorgangWithEingangTestFactory.ID); + when(commandService.findPending(any(), any())).thenReturn(Stream.empty()); + } + + @Test + void shouldGetVorgangId() { + handleImportConfirmation(); + + verify(abgabeHandler).getVorgangId(); + } + + @Test + void shouldCallCommandService() { + handleImportConfirmation(); + + verify(commandService).findPending(VorgangWithEingangTestFactory.ID, QuittungService.ARCHIVE_VORGANG_ORDER); + } + + @DisplayName("on existing pending commands") + @Nested + class TestOnExistingPendingCommands { + + private final ArchiveManagerCommand command = CommandTestFactory.create(); + private final List<ArchiveManagerCommand> commands = List.of(command); + + @BeforeEach + void mock() { + when(commandService.findPending(any(), any())).thenReturn(commands.stream()); + doNothing().when(service).evaluateAbgabe(any(), any()); + } + + @Test + void shouldCallEvaluateConfirmation() { + handleImportConfirmation(); + + verify(service).evaluateAbgabe(abgabeHandler, commands); + } + } + + @Test + void shouldNotCallEvaluateImportConfirmationOnEmptyList() { + handleImportConfirmation(); + + verify(service, never()).evaluateAbgabe(any(), any()); + } + + private void handleImportConfirmation() { + service.handleAbgabe(abgabeHandler); + } + } + + @DisplayName("Evaluate abgabe") + @Nested + class TestEvaluateConfirmation { + + @Mock + private XtaAbgabeAdapter abgabeHandler; + + private final ArchiveManagerCommand command = CommandTestFactory.create(); + private final List<ArchiveManagerCommand> commands = List.of(command, command); + + @Test + void shouldCallIsSuccessfullyDone() { + service.evaluateAbgabe(abgabeHandler, commands); + + verify(abgabeHandler).isSuccessful(); + } + + @Test + void shouldCallPublishCommendExcecutedEvent() { + when(abgabeHandler.isSuccessful()).thenReturn(true); + + service.evaluateAbgabe(abgabeHandler, commands); + + verify(service, times(2)).publishCommandExecutedEvent(command); + } + + @Test + void shouldCallPublishCommandFailedEvent() { + when(abgabeHandler.isSuccessful()).thenReturn(false); + + service.evaluateAbgabe(abgabeHandler, commands); + + verify(service, times(2)).publishCommandFailedEvent(abgabeHandler, command); + } + + @DisplayName("on successfully done import confirmation") + @Nested + class TestPublishCommandExcutedEvent { + + @Captor + private ArgumentCaptor<CommandExecutedEvent> commandExecutedEventCaptor; + + @DisplayName("should publish command executed event") + @Test + void shouldPublishCommandExecutedEvent() { + service.publishCommandExecutedEvent(command); + + verify(eventPublisher).publishEvent(commandExecutedEventCaptor.capture()); + assertThat(commandExecutedEventCaptor.getValue().getCommand()).isEqualTo(command); + } + } + + @DisplayName("on failed import confirmation") + @Nested + class TestPublishCommandFailedEvent { + + @Captor + private ArgumentCaptor<CommandFailedEvent> commandFailedEventCaptor; + + private final ArchiveManagerCommand command = CommandTestFactory.create(); + + @DisplayName("should publish command failed event") + @Test + void shouldPublishCommandFailedEvent() { + when(abgabeHandler.getErrorMessage()).thenReturn(AbgabeImportBestaetigen0402TestFactory.FEHLERMELDUNG); + + service.publishCommandFailedEvent(abgabeHandler, command); + + verify(eventPublisher).publishEvent(commandFailedEventCaptor.capture()); + assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(CommandTestFactory.ID); + assertThat(commandFailedEventCaptor.getValue().getErrorMessage()).isEqualTo(AbgabeImportBestaetigen0402TestFactory.FEHLERMELDUNG); + } + } + } +} diff --git a/archive-manager-server/src/test/resources/xml-templates/21b2f942-c454-44e6-a706-c4f6ef2d584a_Abgabe.ImportBestaetigen.0402.xml b/archive-manager-server/src/test/resources/xml-templates/21b2f942-c454-44e6-a706-c4f6ef2d584a_Abgabe.ImportBestaetigen.0402.xml new file mode 100644 index 0000000000000000000000000000000000000000..41cf2682648701c84fe63a2b8b6ddb6cb764b2ec --- /dev/null +++ b/archive-manager-server/src/test/resources/xml-templates/21b2f942-c454-44e6-a706-c4f6ef2d584a_Abgabe.ImportBestaetigen.0402.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<xdomea:Abgabe.ImportBestaetigen.0402 xmlns:xoev-code="http://xoev.de/schemata/code/1_0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xoev-lc="http://xoev.de/latinchars/1_1/datatypes" xmlns:dinspec91379="urn:xoev-de:kosit:xoev:datentyp:din-spec-91379_2019-03" xmlns:xdomea="urn:xoev-de:xdomea:schema:3.0.0" xmlns:ns3="urn:ozgcloud-de:xdomea:schema:1.0.0"> + <xdomea:Kopf> + <xdomea:ProzessID>662912249c67ff057850e259</xdomea:ProzessID> + <xdomea:Nachrichtentyp listURI="urn:xoev-de:xdomea:codeliste:nachrichtentyp" listVersionID="2.0"> + <code>0402</code> + </xdomea:Nachrichtentyp> + <xdomea:Erstellungszeitpunkt>2024-04-24T14:21:30.331Z</xdomea:Erstellungszeitpunkt> + <xdomea:Absender> + <xdomea:Behoerdenkennung> + <xdomea:Behoerdenschluessel listURI="urn:de:bund:destatis:bevoelkerungsstatistik:schluessel:rs" listVersionID="2023-11-30"/> + </xdomea:Behoerdenkennung> + <xdomea:Organisationseinheit> + <xdomea:Name>9030229</xdomea:Name> + </xdomea:Organisationseinheit> + </xdomea:Absender> + <xdomea:Empfaenger> + <xdomea:Behoerdenkennung> + <xdomea:Behoerdenschluessel listURI="urn:de:bund:destatis:bevoelkerungsstatistik:schluessel:rs" listVersionID="2023-11-30"/> + </xdomea:Behoerdenkennung> + </xdomea:Empfaenger> + + <xdomea:SendendesSystem> + <xdomea:Produktname>DMS-Name</xdomea:Produktname> + </xdomea:SendendesSystem> + </xdomea:Kopf> + <xdomea:AbgegebenesObjekt> + <xdomea:IDSGO>DummyVorgangId</xdomea:IDSGO> + <xdomea:Erfolgreich>false</xdomea:Erfolgreich> + <xdomea:Fehlermeldung>Grund, warum der Import nicht funktioniert hat.</xdomea:Fehlermeldung> + </xdomea:AbgegebenesObjekt> +</xdomea:Abgabe.ImportBestaetigen.0402> \ No newline at end of file diff --git a/archive-manager-server/src/test/resources/xml-templates/dummy.xml b/archive-manager-server/src/test/resources/xml-templates/dummy.xml new file mode 100644 index 0000000000000000000000000000000000000000..0687ccf63cb2c587bfbba3501cccabde537a2a67 --- /dev/null +++ b/archive-manager-server/src/test/resources/xml-templates/dummy.xml @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<tag:name xmlns:xoev-code="http://xoev.de/schemata/code/1_0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xoev-lc="http://xoev.de/latinchars/1_1/datatypes" xmlns:dinspec91379="urn:xoev-de:kosit:xoev:datentyp:din-spec-91379_2019-03" xmlns:xdomea="urn:xoev-de:xdomea:schema:3.0.0" xmlns:ns3="urn:ozgcloud-de:xdomea:schema:1.0.0"> +</tag:name> \ No newline at end of file