From 2ee70f55b0463ca9b7ea68244bae92890746302e Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 12 Dec 2024 14:14:00 +0100
Subject: [PATCH 1/5] OZG-7037 create archivierung package

---
 .../ArchiveEventListener.java                 |   8 +-
 .../archive/archivierung/ArchiveService.java  |  59 ++++
 .../archive/export/ExportService.java         |  43 ---
 .../ArchiveEventListenerITCase.java           |   2 +-
 .../ArchiveEventListenerTest.java             |   9 +-
 .../archivierung/ArchiveServiceTest.java      | 256 ++++++++++++++++++
 .../archive/export/ExportServiceTest.java     | 221 ---------------
 7 files changed, 325 insertions(+), 273 deletions(-)
 rename archive-manager-server/src/main/java/de/ozgcloud/archive/{vorgang => archivierung}/ArchiveEventListener.java (96%)
 create mode 100644 archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveService.java
 rename archive-manager-server/src/test/java/de/ozgcloud/archive/{vorgang => archivierung}/ArchiveEventListenerITCase.java (98%)
 rename archive-manager-server/src/test/java/de/ozgcloud/archive/{vorgang => archivierung}/ArchiveEventListenerTest.java (96%)
 create mode 100644 archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveServiceTest.java

diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/ArchiveEventListener.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveEventListener.java
similarity index 96%
rename from archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/ArchiveEventListener.java
rename to archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveEventListener.java
index e863cb3..d2577b6 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/ArchiveEventListener.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveEventListener.java
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.archive.vorgang;
+package de.ozgcloud.archive.archivierung;
 
 import java.util.function.Consumer;
 import java.util.function.Predicate;
@@ -39,7 +39,7 @@ import de.ozgcloud.archive.common.callcontext.CallContextUser;
 import de.ozgcloud.archive.common.callcontext.CurrentUserService;
 import de.ozgcloud.archive.common.command.CommandService;
 import de.ozgcloud.archive.common.errorhandling.TimeoutException;
-import de.ozgcloud.archive.export.ExportService;
+import de.ozgcloud.archive.vorgang.VorgangService;
 import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandCreatedEvent;
 import de.ozgcloud.command.CommandFailedEvent;
@@ -77,7 +77,7 @@ class ArchiveEventListener {
 
 	private final ApplicationEventPublisher eventPublisher;
 	private final CommandService commandService;
-	private final ExportService exportService;
+	private final ArchiveService archiveService;
 
 	@EventListener(condition = IS_ARCHIVE_VORGANG_EVENT)
 	void onArchiveVorgangEvent(CommandCreatedEvent event) {
@@ -92,7 +92,7 @@ class ArchiveEventListener {
 	@EventListener(condition = IS_LOCKED_BY_ARCHIVE_MANAGER_EVENT)
 	public void onVorgangLockedEvent(VorgangLockedEvent event) {
 		waitForPendingCommandsToFinish(event.getCommand().getVorgangId(), WAIT_INTERVAL);
-		runWithSecurityContext(event.getCommand(), exportService::archiveVorgang);
+		runWithSecurityContext(event.getCommand(), archiveService::archiveVorgang);
 	}
 
 	void waitForPendingCommandsToFinish(String vorgangId, long waitIntervalInMillis) {
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
new file mode 100644
index 0000000..5f2bdc2
--- /dev/null
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveService.java
@@ -0,0 +1,59 @@
+package de.ozgcloud.archive.archivierung;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.UUID;
+
+import jakarta.activation.DataHandler;
+import jakarta.activation.FileDataSource;
+
+import org.springframework.stereotype.Service;
+
+import de.ozgcloud.archive.common.xta.XtaService;
+import de.ozgcloud.archive.export.ExportService;
+import de.ozgcloud.command.Command;
+import de.ozgcloud.common.errorhandling.TechnicalException;
+import de.ozgcloud.xta.client.model.XtaFile;
+import lombok.RequiredArgsConstructor;
+
+@Service
+@RequiredArgsConstructor
+class ArchiveService {
+
+	private final XtaService xtaService;
+	private final ExportService exportService;
+
+	public void archiveVorgang(Command command) {
+		xtaService.sendXdomeaFile(buildXdomeaXtaFile(command.getVorgangId()));
+	}
+
+	XtaFile buildXdomeaXtaFile(String vorgangId) {
+		var fileNameId = createFileNameId();
+		return XtaFile.builder()
+				.name(exportService.buildXdomeaFileName(fileNameId))
+				.content(createFileContent(vorgangId, fileNameId))
+				.contentType("application/zip")
+				.build();
+	}
+
+	String createFileNameId() {
+		return UUID.randomUUID().toString();
+	}
+
+	DataHandler createFileContent(String vorgangId, String fileNameId) {
+		try {
+			var tempFile = createTempFile(fileNameId);
+			var fileDataSource = new FileDataSource(tempFile);
+			exportService.writeXdomeaFileContent(vorgangId, fileNameId, fileDataSource.getOutputStream());
+			return new DataHandler(fileDataSource);
+		} catch (IOException e) {
+			throw new TechnicalException("Error on creating file content for xDomea file!", e);
+		}
+	}
+
+	File createTempFile(String fileNameId) throws IOException {
+		var tempFile = File.createTempFile(fileNameId, ".zip");
+		tempFile.deleteOnExit();
+		return tempFile;
+	}
+}
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 1aba00a..955842d 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
@@ -1,21 +1,16 @@
 package de.ozgcloud.archive.export;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.Optional;
 import java.util.Set;
-import java.util.UUID;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
-import jakarta.activation.DataHandler;
-import jakarta.activation.FileDataSource;
-
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
@@ -23,7 +18,6 @@ import org.springframework.stereotype.Service;
 import de.ozgcloud.archive.ArchiveManagerConfiguration;
 import de.ozgcloud.archive.bescheid.ExportBescheidService;
 import de.ozgcloud.archive.common.ExportFilenameGenerator;
-import de.ozgcloud.archive.common.xta.XtaService;
 import de.ozgcloud.archive.file.ExportFileService;
 import de.ozgcloud.archive.file.OzgFile;
 import de.ozgcloud.archive.historie.ExportHistorieService;
@@ -33,9 +27,7 @@ import de.ozgcloud.archive.vorgang.Eingang;
 import de.ozgcloud.archive.vorgang.EingangHeader;
 import de.ozgcloud.archive.vorgang.VorgangService;
 import de.ozgcloud.archive.vorgang.VorgangWithEingang;
-import de.ozgcloud.command.Command;
 import de.ozgcloud.common.errorhandling.TechnicalException;
-import de.ozgcloud.xta.client.model.XtaFile;
 import de.xoev.xdomea.AbgabeAbgabe0401;
 import lombok.RequiredArgsConstructor;
 
@@ -57,46 +49,11 @@ public class ExportService {
 	private final ExportKommentarService exportKommentarService;
 	private final ExportNachrichtService exportNachrichtService;
 	private final ExportBescheidService exportBescheidService;
-	private final XtaService xtaService;
-
-	public void archiveVorgang(Command command) {
-		xtaService.sendXdomeaFile(buildXdomeaXtaFile(command.getVorgangId()));
-	}
-
-	XtaFile buildXdomeaXtaFile(String vorgangId) {
-		var fileNameId = createFileNameId();
-		return XtaFile.builder()
-				.name(buildXdomeaFileName(fileNameId))
-				.content(createFileContent(vorgangId, fileNameId))
-				.contentType("application/zip")
-				.build();
-	}
-
-	String createFileNameId() {
-		return UUID.randomUUID().toString();
-	}
 
 	public String buildXdomeaFileName(String fileNameId) {
 		return String.format(EXPORT_XDOMEA_FILENAME_TEMPLATE, fileNameId);
 	}
 
-	DataHandler createFileContent(String vorgangId, String fileNameId) {
-		try {
-			var tempFile = createTempFile(fileNameId);
-			var fileDataSource = new FileDataSource(tempFile);
-			writeXdomeaFileContent(vorgangId, fileNameId, fileDataSource.getOutputStream());
-			return new DataHandler(fileDataSource);
-		} catch (IOException e) {
-			throw new TechnicalException("Error on creating file content for xDomea file!", e);
-		}
-	}
-
-	File createTempFile(String fileNameId) throws IOException {
-		var tempFile = File.createTempFile(fileNameId, ".zip");
-		tempFile.deleteOnExit();
-		return tempFile;
-	}
-
 	public void writeXdomeaFileContent(String vorgangId, String filenameId, OutputStream outputStream) {
 		var exportData = collectExportData(vorgangId, filenameId);
 		writeZipFile(exportData, outputStream);
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/vorgang/ArchiveEventListenerITCase.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveEventListenerITCase.java
similarity index 98%
rename from archive-manager-server/src/test/java/de/ozgcloud/archive/vorgang/ArchiveEventListenerITCase.java
rename to archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveEventListenerITCase.java
index e72c634..cffcb26 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/vorgang/ArchiveEventListenerITCase.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveEventListenerITCase.java
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.archive.vorgang;
+package de.ozgcloud.archive.archivierung;
 
 import static org.mockito.Mockito.*;
 
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/vorgang/ArchiveEventListenerTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveEventListenerTest.java
similarity index 96%
rename from archive-manager-server/src/test/java/de/ozgcloud/archive/vorgang/ArchiveEventListenerTest.java
rename to archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveEventListenerTest.java
index 8f0318b..4648346 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/vorgang/ArchiveEventListenerTest.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveEventListenerTest.java
@@ -21,7 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-package de.ozgcloud.archive.vorgang;
+package de.ozgcloud.archive.archivierung;
 
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
@@ -44,7 +44,8 @@ import de.ozgcloud.archive.attributes.ClientAttributeService;
 import de.ozgcloud.archive.common.callcontext.CurrentUserService;
 import de.ozgcloud.archive.common.command.CommandService;
 import de.ozgcloud.archive.common.errorhandling.TimeoutException;
-import de.ozgcloud.archive.export.ExportService;
+import de.ozgcloud.archive.vorgang.VorgangService;
+import de.ozgcloud.archive.vorgang.VorgangWithEingangTestFactory;
 import de.ozgcloud.command.Command;
 import de.ozgcloud.command.CommandCreatedEventTestFactory;
 import de.ozgcloud.command.CommandFailedEvent;
@@ -70,7 +71,7 @@ class ArchiveEventListenerTest {
 	@Mock
 	private CommandService commandService;
 	@Mock
-	private ExportService exportService;
+	private ArchiveService archiveService;
 
 	@Captor
 	private ArgumentCaptor<Consumer<Command>> commandExecutorCapture;
@@ -214,7 +215,7 @@ class ArchiveEventListenerTest {
 				verify(eventListener).runWithSecurityContext(eq(command), commandExecutorCapture.capture());
 				commandExecutorCapture.getValue().accept(command);
 
-				verify(exportService).archiveVorgang(command);
+				verify(archiveService).archiveVorgang(command);
 
 			}
 		}
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveServiceTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveServiceTest.java
new file mode 100644
index 0000000..bd22a52
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveServiceTest.java
@@ -0,0 +1,256 @@
+package de.ozgcloud.archive.archivierung;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.UUID;
+
+import jakarta.activation.DataHandler;
+import jakarta.activation.FileDataSource;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockedConstruction;
+import org.mockito.Spy;
+
+import de.ozgcloud.archive.common.xta.XtaService;
+import de.ozgcloud.archive.export.ExportService;
+import de.ozgcloud.archive.vorgang.VorgangWithEingangTestFactory;
+import de.ozgcloud.archive.vorgang.XdomeaXtaFileTestFactory;
+import de.ozgcloud.command.Command;
+import de.ozgcloud.command.CommandTestFactory;
+import de.ozgcloud.common.errorhandling.TechnicalException;
+import de.ozgcloud.xta.client.model.XtaFile;
+import lombok.SneakyThrows;
+
+class ArchiveServiceTest {
+
+	@Spy
+	@InjectMocks
+	private ArchiveService service;
+
+	@Mock
+	private ExportService exportService;
+	@Mock
+	private XtaService xtaService;
+
+	@Nested
+	class TestArchiveVorgang {
+
+		private final Command command = CommandTestFactory.create();
+		private final XtaFile xdomeaFile = XdomeaXtaFileTestFactory.create();
+
+		@BeforeEach
+		void mock() {
+			doReturn(xdomeaFile).when(service).buildXdomeaXtaFile(CommandTestFactory.VORGANG_ID);
+		}
+
+		@Test
+		void shouldCallBuildXdomeaXtaFile() {
+			archiveVorgang();
+
+			verify(service).buildXdomeaXtaFile(CommandTestFactory.VORGANG_ID);
+		}
+
+		@Test
+		void shouldCallSendXdomeaFile() {
+			archiveVorgang();
+
+			verify(xtaService).sendXdomeaFile(xdomeaFile);
+		}
+
+		private void archiveVorgang() {
+			service.archiveVorgang(command);
+		}
+	}
+
+	@Nested
+	class TestBuildXdomeaXtaFile {
+
+		private final String fileNameId = UUID.randomUUID().toString();
+
+		@BeforeEach
+		void mock() {
+			doReturn(fileNameId).when(service).createFileNameId();
+			when(exportService.buildXdomeaFileName(any())).thenReturn(XdomeaXtaFileTestFactory.FILE_NAME);
+			doReturn(XdomeaXtaFileTestFactory.DATA_HANDLER).when(service).createFileContent(VorgangWithEingangTestFactory.ID, fileNameId);
+		}
+
+		@Test
+		void shouldCallCreateFileNameId() {
+			buildXdomeaXtaFile();
+
+			verify(service).createFileNameId();
+		}
+
+		@Test
+		void shouldCallBuildXdomeaFileName() {
+			buildXdomeaXtaFile();
+
+			verify(exportService).buildXdomeaFileName(fileNameId);
+		}
+
+		@Test
+		void shouldCallCreateFileContent() {
+			buildXdomeaXtaFile();
+
+			verify(service).createFileContent(VorgangWithEingangTestFactory.ID, fileNameId);
+		}
+
+		@Test
+		void shouldReturnXdomeaFile() {
+			var xdomeaFile = buildXdomeaXtaFile();
+
+			assertThat(xdomeaFile).usingRecursiveComparison().isEqualTo(XdomeaXtaFileTestFactory.create());
+		}
+
+		private XtaFile buildXdomeaXtaFile() {
+			return service.buildXdomeaXtaFile(VorgangWithEingangTestFactory.ID);
+		}
+	}
+
+	@Nested
+	class TestCreateFileNameId {
+
+		private final UUID uuid = UUID.randomUUID();
+
+		@Test
+		void shouldReturnRandomUUID() {
+			try (var mockedStaticUUID = mockStatic(UUID.class)) {
+				mockedStaticUUID.when(UUID::randomUUID).thenReturn(uuid);
+
+				var returnedFileNameId = service.createFileNameId();
+
+				assertThat(returnedFileNameId).isEqualTo(uuid.toString());
+			}
+		}
+	}
+
+	@Nested
+	class TestCreateFileContent {
+
+		private final String fileNameId = UUID.randomUUID().toString();
+
+		@Nested
+		class TestOnNoExceptionThrown {
+			private MockedConstruction<FileDataSource> fileDataSourceConstruction;
+			private FileDataSource fileDataSource;
+			private File dataSourceFile;
+
+			private MockedConstruction<DataHandler> dataHandlerConstruction;
+			private DataHandler dataHandler;
+			private FileDataSource dataHandlerSource;
+
+			@Mock
+			private File tempFile;
+			@Mock
+			private OutputStream outputStream;
+
+			@BeforeEach
+			@SneakyThrows
+			void setUpMock() {
+				doReturn(tempFile).when(service).createTempFile(fileNameId);
+				fileDataSourceConstruction = mockConstruction(FileDataSource.class,
+						(fileDataSource, context) -> {
+							dataSourceFile = (File) context.arguments().get(0);
+							this.fileDataSource = fileDataSource;
+							when(fileDataSource.getOutputStream()).thenReturn(outputStream);
+						});
+				dataHandlerConstruction = mockConstruction(DataHandler.class, (dataHandler, context) -> {
+					this.dataHandler = dataHandler;
+					dataHandlerSource = (FileDataSource) context.arguments().get(0);
+				});
+			}
+
+			@AfterEach
+			void cleanUp() {
+				fileDataSourceConstruction.close();
+				dataHandlerConstruction.close();
+			}
+
+			@Test
+			@SneakyThrows
+			void shouldCallCreateTempFile() {
+				createFileContent();
+
+				verify(service).createTempFile(fileNameId);
+			}
+
+			@Test
+			void shouldCreateFileDataSourceWithTempFile() {
+				createFileContent();
+
+				assertThat(dataSourceFile).isEqualTo(tempFile);
+			}
+
+			@Test
+			@SneakyThrows
+			void shouldGetOutputStreamOfFileDataSource() {
+				createFileContent();
+
+				verify(fileDataSource).getOutputStream();
+			}
+
+			@Test
+			void shouldWriteXdomeaContentToOutputStream() {
+				createFileContent();
+
+				verify(exportService).writeXdomeaFileContent(VorgangWithEingangTestFactory.ID, fileNameId, outputStream);
+			}
+
+			@Test
+			void shouldConstructDataHandlerFromFileDataSource() {
+				createFileContent();
+
+				assertThat(dataHandlerConstruction.constructed()).hasSize(1);
+				assertThat(dataHandlerSource).isEqualTo(fileDataSource);
+			}
+
+			@Test
+			void shouldReturnDataHandler() {
+				var resultDataHandler = createFileContent();
+
+				assertThat(resultDataHandler).isEqualTo(dataHandler);
+			}
+		}
+
+		@Nested
+		class TestOnIOExceptionThrown {
+			@Test
+			@SneakyThrows
+			void shouldThrowTechnicalExcpetion() {
+				doThrow(IOException.class).when(service).createTempFile(any());
+
+				assertThrows(TechnicalException.class, () -> createFileContent());
+			}
+		}
+
+		private DataHandler createFileContent() {
+			return service.createFileContent(VorgangWithEingangTestFactory.ID, fileNameId);
+		}
+	}
+
+	@Nested
+	class TestCreateTempFile {
+
+		private final String fileNameId = UUID.randomUUID().toString();
+
+		@Test
+		@SneakyThrows
+		void shouldReturnFile() {
+			var file = service.createTempFile(fileNameId);
+
+			assertThat(file).isNotNull().isInstanceOf(File.class);
+		}
+	}
+
+}
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/export/ExportServiceTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/export/ExportServiceTest.java
index 128073a..1f79f26 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/export/ExportServiceTest.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/export/ExportServiceTest.java
@@ -2,11 +2,9 @@ package de.ozgcloud.archive.export;
 
 import static de.ozgcloud.archive.common.XDomeaTestUtils.*;
 import static org.assertj.core.api.Assertions.*;
-import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
@@ -15,9 +13,6 @@ import java.util.UUID;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
-import jakarta.activation.DataHandler;
-import jakarta.activation.FileDataSource;
-
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -27,7 +22,6 @@ import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
-import org.mockito.MockedConstruction;
 import org.mockito.MockedStatic;
 import org.mockito.Spy;
 
@@ -54,11 +48,7 @@ import de.ozgcloud.archive.vorgang.VorgangService;
 import de.ozgcloud.archive.vorgang.VorgangTypeTestFactory;
 import de.ozgcloud.archive.vorgang.VorgangWithEingang;
 import de.ozgcloud.archive.vorgang.VorgangWithEingangTestFactory;
-import de.ozgcloud.archive.vorgang.XdomeaXtaFileTestFactory;
-import de.ozgcloud.command.Command;
-import de.ozgcloud.command.CommandTestFactory;
 import de.ozgcloud.common.errorhandling.TechnicalException;
-import de.ozgcloud.xta.client.model.XtaFile;
 import de.xoev.xdomea.AbgabeAbgabe0401;
 import de.xoev.xdomea.AkteType;
 import de.xoev.xdomea.DokumentType;
@@ -669,215 +659,4 @@ class ExportServiceTest {
 		}
 	}
 
-	@Nested
-	class TestArchiveVorgang {
-
-		private final Command command = CommandTestFactory.create();
-		private final XtaFile xdomeaFile = XdomeaXtaFileTestFactory.create();
-
-		@BeforeEach
-		void mock() {
-			doReturn(xdomeaFile).when(service).buildXdomeaXtaFile(CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldCallBuildXdomeaXtaFile() {
-			archiveVorgang();
-
-			verify(service).buildXdomeaXtaFile(CommandTestFactory.VORGANG_ID);
-		}
-
-		@Test
-		void shouldCallSendXdomeaFile() {
-			archiveVorgang();
-
-			verify(xtaService).sendXdomeaFile(xdomeaFile);
-		}
-
-		private void archiveVorgang() {
-			service.archiveVorgang(command);
-		}
-	}
-
-	@Nested
-	class TestBuildXdomeaXtaFile {
-
-		private final String fileNameId = UUID.randomUUID().toString();
-
-		@BeforeEach
-		void mock() {
-			doReturn(fileNameId).when(service).createFileNameId();
-			doReturn(XdomeaXtaFileTestFactory.FILE_NAME).when(service).buildXdomeaFileName(any());
-			doReturn(XdomeaXtaFileTestFactory.DATA_HANDLER).when(service).createFileContent(VorgangWithEingangTestFactory.ID, fileNameId);
-		}
-
-		@Test
-		void shouldCallCreateFileNameId() {
-			buildXdomeaXtaFile();
-
-			verify(service).createFileNameId();
-		}
-
-		@Test
-		void shouldCallBuildXdomeaFileName() {
-			buildXdomeaXtaFile();
-
-			verify(service).buildXdomeaFileName(fileNameId);
-		}
-
-		@Test
-		void shouldCallCreateFileContent() {
-			buildXdomeaXtaFile();
-
-			verify(service).createFileContent(VorgangWithEingangTestFactory.ID, fileNameId);
-		}
-
-		@Test
-		void shouldReturnXdomeaFile() {
-			var xdomeaFile = buildXdomeaXtaFile();
-
-			assertThat(xdomeaFile).usingRecursiveComparison().isEqualTo(XdomeaXtaFileTestFactory.create());
-		}
-
-		private XtaFile buildXdomeaXtaFile() {
-			return service.buildXdomeaXtaFile(VorgangWithEingangTestFactory.ID);
-		}
-	}
-
-	@Nested
-	class TestCreateFileNameId {
-
-		private final UUID uuid = UUID.randomUUID();
-
-		@Test
-		void shouldReturnRandomUUID() {
-			try (var mockedStaticUUID = mockStatic(UUID.class)) {
-				mockedStaticUUID.when(UUID::randomUUID).thenReturn(uuid);
-
-				var returnedFileNameId = service.createFileNameId();
-
-				assertThat(returnedFileNameId).isEqualTo(uuid.toString());
-			}
-		}
-	}
-
-	@Nested
-	class TestCreateFileContent {
-
-		private final String fileNameId = UUID.randomUUID().toString();
-
-		@Nested
-		class TestOnNoExceptionThrown {
-			private MockedConstruction<FileDataSource> fileDataSourceConstruction;
-			private FileDataSource fileDataSource;
-			private File dataSourceFile;
-
-			private MockedConstruction<DataHandler> dataHandlerConstruction;
-			private DataHandler dataHandler;
-			private FileDataSource dataHandlerSource;
-
-			@Mock
-			private File tempFile;
-			@Mock
-			private OutputStream outputStream;
-
-			@BeforeEach
-			@SneakyThrows
-			void setUpMock() {
-				doReturn(tempFile).when(service).createTempFile(fileNameId);
-				fileDataSourceConstruction = mockConstruction(FileDataSource.class,
-						(fileDataSource, context) -> {
-							dataSourceFile = (File) context.arguments().get(0);
-							this.fileDataSource = fileDataSource;
-							when(fileDataSource.getOutputStream()).thenReturn(outputStream);
-						});
-				dataHandlerConstruction = mockConstruction(DataHandler.class, (dataHandler, context) -> {
-					this.dataHandler = dataHandler;
-					dataHandlerSource = (FileDataSource) context.arguments().get(0);
-				});
-				doNothing().when(service).writeXdomeaFileContent(any(), any(), any());
-			}
-
-			@AfterEach
-			void cleanUp() {
-				fileDataSourceConstruction.close();
-				dataHandlerConstruction.close();
-			}
-
-			@Test
-			@SneakyThrows
-			void shouldCallCreateTempFile() {
-				createFileContent();
-
-				verify(service).createTempFile(fileNameId);
-			}
-
-			@Test
-			void shouldCreateFileDataSourceWithTempFile() {
-				createFileContent();
-
-				assertThat(dataSourceFile).isEqualTo(tempFile);
-			}
-
-			@Test
-			@SneakyThrows
-			void shouldGetOutputStreamOfFileDataSource() {
-				createFileContent();
-
-				verify(fileDataSource).getOutputStream();
-			}
-
-			@Test
-			void shouldWriteXdomeaContentToOutputStream() {
-				createFileContent();
-
-				verify(service).writeXdomeaFileContent(VorgangWithEingangTestFactory.ID, fileNameId, outputStream);
-			}
-
-			@Test
-			void shouldConstructDataHandlerFromFileDataSource() {
-				createFileContent();
-
-				assertThat(dataHandlerConstruction.constructed()).hasSize(1);
-				assertThat(dataHandlerSource).isEqualTo(fileDataSource);
-			}
-
-			@Test
-			void shouldReturnDataHandler() {
-				var resultDataHandler = createFileContent();
-
-				assertThat(resultDataHandler).isEqualTo(dataHandler);
-			}
-		}
-
-		@Nested
-		class TestOnIOExceptionThrown {
-			@Test
-			@SneakyThrows
-			void shouldThrowTechnicalExcpetion() {
-				doThrow(IOException.class).when(service).createTempFile(any());
-
-				assertThrows(TechnicalException.class, () -> createFileContent());
-			}
-		}
-
-		private DataHandler createFileContent() {
-			return service.createFileContent(VorgangWithEingangTestFactory.ID, fileNameId);
-		}
-	}
-
-	@Nested
-	class TestCreateTempFile {
-
-		private final String fileNameId = UUID.randomUUID().toString();
-
-		@Test
-		@SneakyThrows
-		void shouldReturnFile() {
-			var file = service.createTempFile(fileNameId);
-
-			assertThat(file).isNotNull().isInstanceOf(File.class);
-		}
-	}
-
 }
\ No newline at end of file
-- 
GitLab


From 2bc665076ea8fa1040917239a141b93bf37ddc95 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 12 Dec 2024 14:18:40 +0100
Subject: [PATCH 2/5] OZG-7037 rename variable

---
 .../main/java/de/ozgcloud/archive/vorgang/VorgangService.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

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 497e0a0..3e0f89c 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
@@ -75,8 +75,8 @@ public class VorgangService {
 		return allgemeineMetadatenType;
 	}
 
-	public void lockVorgang(Command command) {
-		ozgCloudCommandService.addSubCommands(buildCreateSubCommandsRequest(command.getId(), buildLockVorgangSubCommand(command)));
+	public void lockVorgang(Command parentCommand) {
+		ozgCloudCommandService.addSubCommands(buildCreateSubCommandsRequest(parentCommand.getId(), buildLockVorgangSubCommand(parentCommand)));
 	}
 
 	OzgCloudCommand buildLockVorgangSubCommand(Command command) {
-- 
GitLab


From 555aa7110b30ffbf2eab286ebdd69ef092a0028b Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 12 Dec 2024 14:48:06 +0100
Subject: [PATCH 3/5] OZG-7037 move ClientAttributeService into Archive Service

---
 .../archive/ArchiveManagerConfiguration.java  |  1 -
 .../archivierung/ArchiveEventListener.java    |  8 +-
 .../archive/archivierung/ArchiveService.java  | 24 ++++++
 .../attributes/ClientAttributeService.java    | 61 ---------------
 .../ArchiveEventListenerTest.java             |  5 +-
 .../archivierung/ArchiveServiceTest.java      | 77 +++++++++++++++++++
 ...loudBooleanClientAttributeTestFactory.java | 29 +++++++
 7 files changed, 134 insertions(+), 71 deletions(-)
 delete mode 100644 archive-manager-server/src/main/java/de/ozgcloud/archive/attributes/ClientAttributeService.java
 create mode 100644 archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/OzgCloudBooleanClientAttributeTestFactory.java

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 2472774..6fdcbf2 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
@@ -58,7 +58,6 @@ public class ArchiveManagerConfiguration {
 	public static final String CALL_CONTEXT_PROVIDER_NAME = "archive_CallContextProvider";
 	public static final String CALL_CONTEXT_MAPPER_NAME = "archive_CallContextMapper";
 
-	public static final String CLIENT_ATTRIBUTE_SERVICE_NAME = "archive_ClientAttributeService";
 	public static final String OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME = "archive_OzgCloudClientAttributeService";
 
 	public static final String KOMMENTAR_SERVICE_NAME = "archive_KommentarService";
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 d2577b6..a9f8f15 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
@@ -34,7 +34,6 @@ import org.springframework.security.core.context.SecurityContext;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.archive.ArchiveManagerConfiguration;
-import de.ozgcloud.archive.attributes.ClientAttributeService;
 import de.ozgcloud.archive.common.callcontext.CallContextUser;
 import de.ozgcloud.archive.common.callcontext.CurrentUserService;
 import de.ozgcloud.archive.common.command.CommandService;
@@ -69,13 +68,12 @@ class ArchiveEventListener {
 	@Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) // NOSONAR
 	private final CurrentUserService currentUserService;
 
-	@Qualifier(ArchiveManagerConfiguration.CLIENT_ATTRIBUTE_SERVICE_NAME) // NOSONAR
-	private final ClientAttributeService clientAttributeService;
-
 	@Qualifier(ArchiveManagerConfiguration.VORGANG_SERVICE_NAME) // NOSONAR
 	private final VorgangService vorgangService;
 
 	private final ApplicationEventPublisher eventPublisher;
+
+	@Qualifier(ArchiveManagerConfiguration.COMMAND_SERVICE_NAME) // NOSONAR
 	private final CommandService commandService;
 	private final ArchiveService archiveService;
 
@@ -85,7 +83,7 @@ class ArchiveEventListener {
 	}
 
 	void doLockVorgang(Command command) {
-		clientAttributeService.setVorgangArchiving(command.getVorgangId());
+		archiveService.setVorgangArchiving(command.getVorgangId());
 		vorgangService.lockVorgang(command);
 	}
 
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 5f2bdc2..63fca7e 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
@@ -7,8 +7,15 @@ import java.util.UUID;
 import jakarta.activation.DataHandler;
 import jakarta.activation.FileDataSource;
 
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
+import de.ozgcloud.apilib.client_attribute.OzgCloudAccessPermission;
+import de.ozgcloud.apilib.client_attribute.OzgCloudBooleanClientAttribute;
+import de.ozgcloud.apilib.client_attribute.OzgCloudClientAttributeService;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangIdMapper;
+import de.ozgcloud.archive.ArchiveManagerConfiguration;
+import de.ozgcloud.archive.common.callcontext.CallContextUser;
 import de.ozgcloud.archive.common.xta.XtaService;
 import de.ozgcloud.archive.export.ExportService;
 import de.ozgcloud.command.Command;
@@ -20,8 +27,25 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 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
+	private final OzgCloudClientAttributeService ozgCloudAttributesService;
+	private final OzgCloudVorgangIdMapper vorgangIdMapper;
+
+	public void setVorgangArchiving(String vorgangId) {
+		ozgCloudAttributesService.setClientAttribute(buildBooleanClientAttribute(true), vorgangIdMapper.fromString(vorgangId));
+	}
+
+	OzgCloudBooleanClientAttribute buildBooleanClientAttribute(boolean isArchiving) {
+		return OzgCloudBooleanClientAttribute.builder()
+				.clientName(CallContextUser.ARCHIVE_MANAGER_CLIENT_NAME)
+				.access(OzgCloudAccessPermission.READ_ONLY)
+				.attributeName(ATTRIBUTE_NAME_ANTRAG_ARCHIVING)
+				.value(isArchiving)
+				.build();
+	}
 
 	public void archiveVorgang(Command command) {
 		xtaService.sendXdomeaFile(buildXdomeaXtaFile(command.getVorgangId()));
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/attributes/ClientAttributeService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/attributes/ClientAttributeService.java
deleted file mode 100644
index 21d24f8..0000000
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/attributes/ClientAttributeService.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-package de.ozgcloud.archive.attributes;
-
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Service;
-
-import de.ozgcloud.apilib.client_attribute.OzgCloudAccessPermission;
-import de.ozgcloud.apilib.client_attribute.OzgCloudBooleanClientAttribute;
-import de.ozgcloud.apilib.client_attribute.OzgCloudClientAttributeService;
-import de.ozgcloud.apilib.vorgang.OzgCloudVorgangIdMapper;
-import de.ozgcloud.archive.ArchiveManagerConfiguration;
-import de.ozgcloud.archive.common.callcontext.CallContextUser;
-import lombok.RequiredArgsConstructor;
-
-@Service(ArchiveManagerConfiguration.CLIENT_ATTRIBUTE_SERVICE_NAME) // NOSONAR
-@RequiredArgsConstructor
-public class ClientAttributeService {
-
-	public static final String ATTRIBUTE_NAME_ANTRAG_ARCHIVING = "ARCHIVING";
-
-	@Qualifier(ArchiveManagerConfiguration.OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME) // NOSONAR
-	private final OzgCloudClientAttributeService ozgCloudAttributesService;
-
-	private final OzgCloudVorgangIdMapper vorgangIdMapper;
-
-	public void setVorgangArchiving(String vorgangId) {
-		ozgCloudAttributesService.setClientAttribute(buildBooleanClientAttribute(true), vorgangIdMapper.fromString(vorgangId));
-	}
-
-	OzgCloudBooleanClientAttribute buildBooleanClientAttribute(boolean isArchiving) {
-		return OzgCloudBooleanClientAttribute.builder()
-				.clientName(CallContextUser.ARCHIVE_MANAGER_CLIENT_NAME)
-				.access(OzgCloudAccessPermission.READ_ONLY)
-				.attributeName(ATTRIBUTE_NAME_ANTRAG_ARCHIVING)
-				.value(isArchiving)
-				.build();
-	}
-
-}
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveEventListenerTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveEventListenerTest.java
index 4648346..2e8379e 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveEventListenerTest.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveEventListenerTest.java
@@ -40,7 +40,6 @@ import org.mockito.Spy;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.security.core.context.SecurityContext;
 
-import de.ozgcloud.archive.attributes.ClientAttributeService;
 import de.ozgcloud.archive.common.callcontext.CurrentUserService;
 import de.ozgcloud.archive.common.command.CommandService;
 import de.ozgcloud.archive.common.errorhandling.TimeoutException;
@@ -63,8 +62,6 @@ class ArchiveEventListenerTest {
 	@Mock
 	private CurrentUserService currentUserService;
 	@Mock
-	private ClientAttributeService clientAttributeService;
-	@Mock
 	private VorgangService vorgangService;
 	@Mock
 	private ApplicationEventPublisher eventPublisher;
@@ -103,7 +100,7 @@ class ArchiveEventListenerTest {
 		void shouldCallSetVorgangArchiving() {
 			doLockVorgang();
 
-			verify(clientAttributeService).setVorgangArchiving(CommandTestFactory.VORGANG_ID);
+			verify(archiveService).setVorgangArchiving(CommandTestFactory.VORGANG_ID);
 		}
 
 		@Test
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveServiceTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveServiceTest.java
index bd22a52..4e1213a 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveServiceTest.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/ArchiveServiceTest.java
@@ -17,11 +17,18 @@ import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 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.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.MockedConstruction;
 import org.mockito.Spy;
 
+import de.ozgcloud.apilib.client_attribute.OzgCloudAccessPermission;
+import de.ozgcloud.apilib.client_attribute.OzgCloudClientAttributeService;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangIdMapper;
+import de.ozgcloud.archive.common.callcontext.CallContextUser;
 import de.ozgcloud.archive.common.xta.XtaService;
 import de.ozgcloud.archive.export.ExportService;
 import de.ozgcloud.archive.vorgang.VorgangWithEingangTestFactory;
@@ -42,6 +49,76 @@ class ArchiveServiceTest {
 	private ExportService exportService;
 	@Mock
 	private XtaService xtaService;
+	@Mock
+	private OzgCloudClientAttributeService ozgCloudAttributesService;
+	@Mock
+	private OzgCloudVorgangIdMapper vorgangIdMapper;
+
+	@Nested
+	class TestSetVorgangArchiving {
+
+		@Test
+		void shouldBuildBooleanClientAttribute() {
+			setVorgangArchiving();
+
+			verify(service).buildBooleanClientAttribute(true);
+		}
+
+		@Test
+		void shouldCallVorgangIdMapper() {
+			setVorgangArchiving();
+
+			verify(vorgangIdMapper).fromString(VorgangWithEingangTestFactory.ID);
+		}
+
+		@Test
+		void shouldSetClientAttribute() {
+			var attribute = OzgCloudBooleanClientAttributeTestFactory.create();
+			doReturn(attribute).when(service).buildBooleanClientAttribute(true);
+			when(vorgangIdMapper.fromString(VorgangWithEingangTestFactory.ID)).thenReturn(OzgCloudVorgangId.from(VorgangWithEingangTestFactory.ID));
+
+			setVorgangArchiving();
+
+			verify(ozgCloudAttributesService).setClientAttribute(attribute, OzgCloudVorgangId.from(VorgangWithEingangTestFactory.ID));
+		}
+
+		private void setVorgangArchiving() {
+			service.setVorgangArchiving(VorgangWithEingangTestFactory.ID);
+		}
+	}
+
+	@Nested
+	class TestBuildBooleanClientAttribute {
+
+		@Test
+		void shouldSetClientName() {
+			var attribute = service.buildBooleanClientAttribute(false);
+
+			assertThat(attribute.getClientName()).isEqualTo(CallContextUser.ARCHIVE_MANAGER_CLIENT_NAME);
+		}
+
+		@Test
+		void shouldSetAccess() {
+			var attribute = service.buildBooleanClientAttribute(false);
+
+			assertThat(attribute.getAccess()).isEqualTo(OzgCloudAccessPermission.READ_ONLY);
+		}
+
+		@Test
+		void shouldSetAttributeName() {
+			var attribute = service.buildBooleanClientAttribute(false);
+
+			assertThat(attribute.getAttributeName()).isEqualTo(ArchiveService.ATTRIBUTE_NAME_ANTRAG_ARCHIVING);
+		}
+
+		@ParameterizedTest
+		@ValueSource(booleans = { true, false })
+		void shouldSetValue(boolean isArchiving) {
+			var attribute = service.buildBooleanClientAttribute(isArchiving);
+
+			assertThat(attribute.getValue()).isEqualTo(isArchiving);
+		}
+	}
 
 	@Nested
 	class TestArchiveVorgang {
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/OzgCloudBooleanClientAttributeTestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/OzgCloudBooleanClientAttributeTestFactory.java
new file mode 100644
index 0000000..954b23b
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/archivierung/OzgCloudBooleanClientAttributeTestFactory.java
@@ -0,0 +1,29 @@
+package de.ozgcloud.archive.archivierung;
+
+import com.thedeanda.lorem.LoremIpsum;
+
+import de.ozgcloud.apilib.client_attribute.OzgCloudAccessPermission;
+import de.ozgcloud.apilib.client_attribute.OzgCloudBooleanClientAttribute;
+import de.ozgcloud.apilib.client_attribute.OzgCloudBooleanClientAttribute.OzgCloudBooleanClientAttributeBuilder;
+import de.ozgcloud.archive.common.callcontext.CallContextUserTestFactory;
+
+public class OzgCloudBooleanClientAttributeTestFactory {
+
+	private static final boolean VALUE = true;
+	private static final String ATTRIBUTE_NAME = LoremIpsum.getInstance().getWords(1);
+	private static final OzgCloudAccessPermission ACCESS = OzgCloudAccessPermission.READ_ONLY;
+	private static final String CLIENT_NAME = CallContextUserTestFactory.CLIENT_NAME;
+
+	public static OzgCloudBooleanClientAttribute create() {
+		return createBuilder().build();
+	}
+
+	private static OzgCloudBooleanClientAttributeBuilder<?, ?> createBuilder() {
+		return OzgCloudBooleanClientAttribute.builder()
+				.clientName(CLIENT_NAME)
+				.access(ACCESS)
+				.attributeName(ATTRIBUTE_NAME)
+				.value(VALUE);
+	}
+
+}
-- 
GitLab


From e74d345561efef95da848ea9e5de35d009dda32d Mon Sep 17 00:00:00 2001
From: Felix Reichenbach <felix.reichenbach@mgm-tp.com>
Date: Thu, 2 Jan 2025 16:01:34 +0100
Subject: [PATCH 4/5] OZG-7037 restore licence header

---
 .../archive/archivierung/ArchiveService.java  | 24 +++++++++++++++++++
 1 file changed, 24 insertions(+)

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 63fca7e..bbabead 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
@@ -1,3 +1,27 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
 package de.ozgcloud.archive.archivierung;
 
 import java.io.File;
-- 
GitLab


From afa771120690b4561535d98736806353bf2e1b23 Mon Sep 17 00:00:00 2001
From: Felix Reichenbach <felix.reichenbach@mgm-tp.com>
Date: Thu, 2 Jan 2025 16:02:19 +0100
Subject: [PATCH 5/5] OZG-7037 remove empty line

---
 .../java/de/ozgcloud/archive/archivierung/ArchiveService.java    | 1 -
 1 file changed, 1 deletion(-)

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 bbabead..dc45d25 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
@@ -21,7 +21,6 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-
 package de.ozgcloud.archive.archivierung;
 
 import java.io.File;
-- 
GitLab