diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ReadZipException.java b/common/src/main/java/de/ozgcloud/eingang/common/zip/ReadZipException.java similarity index 82% rename from semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ReadZipException.java rename to common/src/main/java/de/ozgcloud/eingang/common/zip/ReadZipException.java index c3fcc85a910df48282884211d68617f4095248df..2a50bc6bc844a3d0a3f2aec157d1e93f1004f338 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ReadZipException.java +++ b/common/src/main/java/de/ozgcloud/eingang/common/zip/ReadZipException.java @@ -1,4 +1,4 @@ -package de.ozgcloud.eingang.semantik.common; +package de.ozgcloud.eingang.common.zip; public class ReadZipException extends RuntimeException { diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ZipAttachmentReader.java b/common/src/main/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReader.java similarity index 92% rename from semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ZipAttachmentReader.java rename to common/src/main/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReader.java index 02b4e95012b0343aa44ebd79f6f0305135ad9234..b205c7e48052942ce401c52565c628857383977b 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ZipAttachmentReader.java +++ b/common/src/main/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReader.java @@ -21,11 +21,10 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.eingang.semantik.common; +package de.ozgcloud.eingang.common.zip; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -43,7 +42,6 @@ import java.util.zip.ZipInputStream; import org.springframework.util.MimeTypeUtils; import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.DeleteOnCloseInputStream; import de.ozgcloud.eingang.common.formdata.IncomingFile; import lombok.Getter; import lombok.extern.log4j.Log4j2; @@ -214,27 +212,10 @@ public class ZipAttachmentReader { .build(); } - @Deprecated - public InputStream getSourceZipAsStream() { - try { - return new DeleteOnCloseInputStream(sourceZipFile); - } catch (FileNotFoundException e) { - throw new TechnicalException("Original ZIP was deleted", e); - } - } - public File getSourceZip() { return sourceZipFile; } - public long getSourceFileSize() { - try { - return Files.size(sourceZipFile.toPath()); - } catch (IOException e) { - throw new TechnicalException("Cannot get size of source ZIP.", e); - } - } - String getContentType(String name) { Objects.requireNonNull(name); return Objects.requireNonNullElse(URLConnection.guessContentTypeFromName(name), MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE); diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/common/ZipAttachmentReaderTest.java b/common/src/test/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReaderTest.java similarity index 82% rename from semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/common/ZipAttachmentReaderTest.java rename to common/src/test/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReaderTest.java index f6e1fa7e07c716a5b00a059ea8e46c1c35d16116..d5c4bea2a9581247067a875ca94ac6cac28482b4 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/common/ZipAttachmentReaderTest.java +++ b/common/src/test/java/de/ozgcloud/eingang/common/zip/ZipAttachmentReaderTest.java @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.eingang.semantik.common; +package de.ozgcloud.eingang.common.zip; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; @@ -33,9 +33,11 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.function.Predicate; +import java.util.stream.Stream; import java.util.zip.ZipException; import java.util.zip.ZipInputStream; +import de.ozgcloud.eingang.common.formdata.DeleteOnCloseInputStream; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.junit.jupiter.api.Assertions; @@ -47,8 +49,6 @@ import org.springframework.util.MimeTypeUtils; import de.ozgcloud.common.test.TestUtils; import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.semantik.common.ReadZipException; -import de.ozgcloud.eingang.semantik.common.ZipAttachmentReader; import lombok.SneakyThrows; class ZipAttachmentReaderTest { @@ -75,20 +75,11 @@ class ZipAttachmentReaderTest { @SneakyThrows private void verifySourceFileSavedInTmpDirectory() { - List<Path> foundFiles = Files.find(Path.of(getTmpDirectoryPath()), 1, - ((path, basicFileAttributes) -> path.getFileName().toString().startsWith(ZipAttachmentReader.SOURCE_ZIP_PREFIX))) - .toList(); - assertThat(foundFiles).hasSize(1).first(); - } - - @Test - @DisplayName("should return readable input stream for source zip file") - void shouldReturnSourceStream() { - var expectedContent = TestUtils.loadFile(ZIP_1_FILE_NAME); - - var sourceZipAsStream = createZipAttachment(ZIP_1_FILE_NAME).getSourceZipAsStream(); - - assertThat(sourceZipAsStream).hasSameContentAs(expectedContent); + try(Stream<Path> paths = Files.find(Path.of(getTmpDirectoryPath()), 1, + ((path, basicFileAttributes) -> path.getFileName().toString().startsWith(ZipAttachmentReader.SOURCE_ZIP_PREFIX)))) { + List<Path> foundFiles = paths.toList(); + assertThat(foundFiles).hasSize(1); + } } @Test @@ -96,7 +87,7 @@ class ZipAttachmentReaderTest { void shouldFailSilentByEncryptedZip() { var zipAttachment = createZipAttachment(ZIP_ENCRYPTED); - assertThrows(ReadZipException.class, () -> zipAttachment.readContent()); + assertThrows(ReadZipException.class, zipAttachment::readContent); } private static ZipAttachmentReader createZipAttachment(String fileName) { @@ -137,7 +128,7 @@ class ZipAttachmentReaderTest { var attachmentContentList = new ZipAttachmentReader().readContent(loadZip(ZIP_1_FILE_NAME)); assertThat(attachmentContentList).hasSize(1); - var contentEntry = attachmentContentList.get(0); + var contentEntry = attachmentContentList.getFirst(); assertThat(contentEntry.getName()).isEqualTo(content_file_0_name); assertThat(contentEntry.getSize()).isEqualTo(content_file_0_size); assertThat(contentEntry.getContentStream()).hasSameContentAs(TestUtils.loadFile(content_file_0_name)); @@ -171,6 +162,7 @@ class ZipAttachmentReaderTest { entry.getContentStreamForFinalRead().close(); } + @SneakyThrows @Test @DisplayName("should return readable input stream for source zip if cannot extract content") void shouldReturnSourceStreamByError() { @@ -179,7 +171,7 @@ class ZipAttachmentReaderTest { assertThrows(ReadZipException.class, attachment::readContent); - assertThat(attachment.getSourceZipAsStream()).hasSameContentAs(new ByteArrayInputStream(attachmentContent)); + assertThat(new DeleteOnCloseInputStream(attachment.getSourceZip())).hasSameContentAs(new ByteArrayInputStream(attachmentContent)); } @Test @@ -189,7 +181,7 @@ class ZipAttachmentReaderTest { var zipAttachment = ZipAttachmentReader.from(invalidZip, "invalid"); - assertThrows(ReadZipException.class, () -> zipAttachment.readContent()); + assertThrows(ReadZipException.class, zipAttachment::readContent); } @Test @@ -212,30 +204,35 @@ class ZipAttachmentReaderTest { private static final String ZIP_BOMB_WITH_MANY_FILES = "zipbombs/filewithmanyfiles.dat.zip"; @Test + @SneakyThrows void shouldFailOnExtremCompressionRatio() { - var zip = loadZip(ZIP_BOMB_WITH_BIG_NULL_FILE_CONTENT); + try(var zip = loadZip(ZIP_BOMB_WITH_BIG_NULL_FILE_CONTENT)) { - ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip)); + ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip)); - assertThat(exception.getMessage()).contains("Ratio between compressed and uncompressed data is highly suspicious"); + assertThat(exception.getMessage()).contains("Ratio between compressed and uncompressed data is highly suspicious"); + } } @Test @SneakyThrows void shouldFailOnTotalExtractedSize() { - var zip = loadZip(ZIP_1_FILE_NAME); - reader.readContent(zip); + try(var zip = loadZip(ZIP_1_FILE_NAME)) { + reader.readContent(zip); - verify(reader).checkTotalExtractedSize(157); + verify(reader).checkTotalExtractedSize(157); + } } @Test + @SneakyThrows void shouldFailOnTotalZipEntries() { - var zip = loadZip(ZIP_BOMB_WITH_MANY_FILES); + try(var zip = loadZip(ZIP_BOMB_WITH_MANY_FILES)) { - ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip)); + ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip)); - assertThat(exception.getMessage()).contains("Total entries in zip file exceeded"); + assertThat(exception.getMessage()).contains("Total entries in zip file exceeded"); + } } } @@ -302,12 +299,16 @@ class ZipAttachmentReaderTest { @SneakyThrows private static void cleanupTempFiles() { - Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).filter(hasNameSuffix).map(Path::toFile).forEach(File::delete); + try(Stream<Path> paths = Files.walk(Path.of(TMP_DIRECTORY_PATH), 1)) { + paths.filter(hasNameSuffix).map(Path::toFile).forEach(File::delete); + } } @SneakyThrows private static boolean noFilesWithSuffixInTempDirectory() { - return Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).noneMatch(hasNameSuffix); + try(Stream<Path> paths = Files.walk(Path.of(TMP_DIRECTORY_PATH), 1)) { + return paths.noneMatch(hasNameSuffix); + } } @SneakyThrows diff --git a/semantik-adapter/src/test/resources/attachment-1file.zip b/common/src/test/resources/attachment-1file.zip similarity index 100% rename from semantik-adapter/src/test/resources/attachment-1file.zip rename to common/src/test/resources/attachment-1file.zip diff --git a/semantik-adapter/src/test/resources/attachment-2files.zip b/common/src/test/resources/attachment-2files.zip similarity index 100% rename from semantik-adapter/src/test/resources/attachment-2files.zip rename to common/src/test/resources/attachment-2files.zip diff --git a/semantik-adapter/src/test/resources/attachment-empty.zip b/common/src/test/resources/attachment-empty.zip similarity index 100% rename from semantik-adapter/src/test/resources/attachment-empty.zip rename to common/src/test/resources/attachment-empty.zip diff --git a/semantik-adapter/src/test/resources/attachment-encrypted.zip b/common/src/test/resources/attachment-encrypted.zip similarity index 100% rename from semantik-adapter/src/test/resources/attachment-encrypted.zip rename to common/src/test/resources/attachment-encrypted.zip diff --git a/semantik-adapter/src/test/resources/zip-file-0.txt b/common/src/test/resources/zip-file-0.txt similarity index 100% rename from semantik-adapter/src/test/resources/zip-file-0.txt rename to common/src/test/resources/zip-file-0.txt diff --git a/semantik-adapter/src/test/resources/zip-file-1.txt b/common/src/test/resources/zip-file-1.txt similarity index 100% rename from semantik-adapter/src/test/resources/zip-file-1.txt rename to common/src/test/resources/zip-file-1.txt diff --git a/semantik-adapter/src/test/resources/zipbombs/filewithmanyfiles.dat.zip b/common/src/test/resources/zipbombs/filewithmanyfiles.dat.zip similarity index 100% rename from semantik-adapter/src/test/resources/zipbombs/filewithmanyfiles.dat.zip rename to common/src/test/resources/zipbombs/filewithmanyfiles.dat.zip diff --git a/semantik-adapter/src/test/resources/zipbombs/filewithnulls.dat.zip b/common/src/test/resources/zipbombs/filewithnulls.dat.zip similarity index 100% rename from semantik-adapter/src/test/resources/zipbombs/filewithnulls.dat.zip rename to common/src/test/resources/zipbombs/filewithnulls.dat.zip diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java index f4e91092747456556d75874ee1a8cddc12c5dfc2..d63b1e4f5a502a5efce7f280b107422e0ee83a64 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java @@ -33,7 +33,7 @@ import org.springframework.stereotype.Component; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.IncomingFile; import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.semantik.common.ZipAttachmentReader; +import de.ozgcloud.eingang.common.zip.ZipAttachmentReader; import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/xta/XtaEngineBasedAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/xta/XtaEngineBasedAdapter.java index a74ff267bd5984e068abd0fc00a9bd6c2469e05d..4d63028f1527aff9f19e37bae5f0e047ca6301b8 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/xta/XtaEngineBasedAdapter.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/xta/XtaEngineBasedAdapter.java @@ -1,26 +1,13 @@ package de.ozgcloud.eingang.semantik.enginebased.xta; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; - import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; public class XtaEngineBasedAdapter implements EngineBasedSemantikAdapter { - @Autowired - private List<XtaEngineBasedMapper> mappers; - @Override public FormData parseFormData(FormData formData) { - var processed = formData; - - for (var mapper : mappers) { - processed = mapper.parseFormData(processed); - } - - return processed; + return formData; } } diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/xta/XtaEngineBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/xta/XtaEngineBasedMapper.java deleted file mode 100644 index 085f7f230d0b65cd06215654e1554c31cce7baeb..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/xta/XtaEngineBasedMapper.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.xta; - -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedMapper; - -public interface XtaEngineBasedMapper extends EngineBasedMapper { - -} diff --git a/xta-adapter/pom.xml b/xta-adapter/pom.xml index 49348c3407d54b4c553eee7753a18e15d4775872..4edb48cfc8aaa8cbade56f0b083beccc15d08d74 100644 --- a/xta-adapter/pom.xml +++ b/xta-adapter/pom.xml @@ -95,6 +95,13 @@ <version>${mockwebserver.version}</version> <scope>test</scope> </dependency> + <!-- Test --> + <dependency> + <groupId>de.ozgcloud.eingang</groupId> + <artifactId>common</artifactId> + <type>test-jar</type> + <scope>test</scope> + </dependency> </dependencies> <build> diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java index a685b0a20bfc5a93b90dcd606cebb2dea31e8187..6f936847d3c5f66dfd55c05b35cf9062d725a44c 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java @@ -1,6 +1,6 @@ package de.ozgcloud.eingang.xta; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.ws.client.WebServiceClientException; import org.springframework.ws.client.support.interceptor.ClientInterceptor; @@ -8,7 +8,6 @@ import org.springframework.ws.context.MessageContext; import org.springframework.ws.soap.SoapMessage; import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import eu.osci.ws._2014._10.transport.OriginatorsType; import eu.osci.ws._2014._10.transport.PartyIdentifierType; import eu.osci.ws._2014._10.transport.PartyType; import jakarta.validation.Valid; @@ -17,11 +16,11 @@ import jakarta.xml.bind.JAXBElement; import jakarta.xml.bind.JAXBException; @Component +@RequiredArgsConstructor class WsHeaderAddingInterceptor implements ClientInterceptor { - @Autowired @Valid - private XtaProperties properties; + private final XtaProperties properties; @Override public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { @@ -47,9 +46,6 @@ class WsHeaderAddingInterceptor implements ClientInterceptor { identifier.setValue(properties.getIdentifier()); partyType.setIdentifier(identifier); - var origin = new OriginatorsType(); - origin.setAuthor(partyType); - return objectFactory.createAuthor(partyType); } diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java index f2e05fc7684fe33d1db3dd42ae46f1f044f23ef8..d051b2ad41ec47e054eb530118efc865036af643 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java @@ -9,7 +9,10 @@ import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormHeader; import de.ozgcloud.eingang.common.formdata.IncomingFile; -@Mapper +@Mapper( + /*uses = XtaZipRepresentationsMapper.class, + injectionStrategy = InjectionStrategy.CONSTRUCTOR*/ +) interface XtaMessageMapper { @Mapping(target = "antragsteller", ignore = true) diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java index 5da39aab1d30059a0e4577686a7427bc860f6278..b543be4a74e03d1f6f453f3071ad51a872c71495 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java @@ -10,7 +10,6 @@ import java.util.Iterator; import java.util.stream.Stream; import javax.xml.namespace.QName; -import javax.xml.transform.TransformerException; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -104,19 +103,16 @@ class XtaRemoteService { } WebServiceMessageCallback buildMarshalCallBack(Object jaxbElement, ActionCallback callback) { - return new WebServiceMessageCallback() { - @Override - public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException { - MarshallingUtils.marshal(osciMarshaller, jaxbElement, message); - callback.doWithMessage(message); - } + return message -> { + MarshallingUtils.marshal(osciMarshaller, jaxbElement, message); + callback.doWithMessage(message); }; } WebServiceMessageExtractor<MsgStatusListTypeAndHeaderResponse> buildHeaderExtractor() { - return new WebServiceMessageExtractor<MsgStatusListTypeAndHeaderResponse>() { + return new WebServiceMessageExtractor<>() { @Override - public MsgStatusListTypeAndHeaderResponse extractData(WebServiceMessage message) throws IOException, TransformerException { + public MsgStatusListTypeAndHeaderResponse extractData(WebServiceMessage message) throws IOException { MsgBoxResponseType header = extractHeader(message); @@ -277,7 +273,7 @@ class XtaRemoteService { @SuppressWarnings("unchecked") ExceptionType exceptionType = ((JAXBElement<ExceptionType>) xoevMarshaller.unmarshal(soapfaultdetailelement1.getSource())).getValue(); - return DETAIL_LOG_TEMPLATE.formatted(exceptionType.getErrorCode().getCode(), exceptionType.getErrorCode().getName().toString()); + return DETAIL_LOG_TEMPLATE.formatted(exceptionType.getErrorCode().getCode(), exceptionType.getErrorCode().getName()); } diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java index 8668263d9b0914c6458296220db651e6b26552c7..10fad61ff239daa3ce420d95feaa2373b513dfc6 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java @@ -11,7 +11,7 @@ import java.security.cert.CertificateException; import javax.net.ssl.KeyManagerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; import org.springframework.boot.webservices.client.WebServiceTemplateCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -28,12 +28,12 @@ import lombok.extern.log4j.Log4j2; @Log4j2 @Configuration +@RequiredArgsConstructor public class XtaRemoteServiceConfiguration { static final String URI_TEMPLATE = "%s://%s/MB_XTA-WS/XTA210msgBoxPort.svc"; - @Autowired - private XtaProperties properties; + private final XtaProperties properties; @Bean Jaxb2Marshaller osciTransportMarshaller() { diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java index 0c497d51f85560d84085d663c2bc32aaf46a408e..5f580e13f68ed182ac9886601b9ff519edb94782 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java @@ -1,6 +1,6 @@ package de.ozgcloud.eingang.xta; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Profile; import org.springframework.context.event.ContextRefreshedEvent; @@ -11,15 +11,15 @@ import de.ozgcloud.eingang.semantik.SemantikAdapter; import lombok.NonNull; import lombok.extern.log4j.Log4j2; + @Profile("!itcase") @Log4j2 @Component +@RequiredArgsConstructor class XtaRunner implements ApplicationListener<ContextRefreshedEvent> { - @Autowired - private XtaService service; - @Autowired - private SemantikAdapter semantikAdapter; + private final XtaService service; + private final SemantikAdapter semantikAdapter; @Override public void onApplicationEvent(ContextRefreshedEvent event) { diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java index 9e60b84b7ac4ba0dafc491ae1d80742a4d002d58..ffbd98129eb61cda6171ff740b54084fb17e5e0d 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java @@ -4,8 +4,8 @@ import java.util.Spliterators; import java.util.stream.Stream; import java.util.stream.StreamSupport; +import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.ozgcloud.eingang.common.formdata.FormData; @@ -16,17 +16,16 @@ import lombok.extern.log4j.Log4j2; @Service @Log4j2 +@RequiredArgsConstructor class XtaService { static final String DFOERDERMITTELANTRAG_MESSAGE_TYPE = "Geschaeftsgang.Geschaeftsgang.0201"; static final int VORGANG_NUMMER_SUFFIX_LENGTH = 4; - @Autowired - private XtaRemoteService remoteService; - @Autowired - private XtaMessageMapper mapper; - @Autowired - private VorgangNummerSupplier vorgangNummerSupplier; + private final XtaRemoteService remoteService; + private final XtaMessageMapper mapper; + private final XtaZipRepresentationsMapper zipMapper; + private final VorgangNummerSupplier vorgangNummerSupplier; public Stream<FormData> getMessages() { return createXtaMessageStream().filter(this::filterByMessageType).map(this::getFormData); @@ -51,6 +50,7 @@ class XtaService { public FormData getFormData(@NonNull XtaMessageMetaData metaData) { var msg = remoteService.getMessage(metaData.getMessageId()); var formData = mapper.toFormData(msg.toBuilder().metaData(metaData).build()); + formData = zipMapper.extractZipToRepresentations(formData); return updateHeader(formData); } diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/xta/XtaZipRepresentationsMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaZipRepresentationsMapper.java similarity index 81% rename from semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/xta/XtaZipRepresentationsMapper.java rename to xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaZipRepresentationsMapper.java index 9a0814f1efa9b86843d27db360a53986091b2dd2..d404967e1c19fdb94ce93316fd0163f837ebb5e6 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/xta/XtaZipRepresentationsMapper.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaZipRepresentationsMapper.java @@ -1,26 +1,24 @@ -package de.ozgcloud.eingang.semantik.enginebased.xta; - -import java.util.Collections; -import java.util.List; -import java.util.function.Predicate; - -import org.springframework.stereotype.Component; +package de.ozgcloud.eingang.xta; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.semantik.common.ZipAttachmentReader; +import de.ozgcloud.eingang.common.zip.ZipAttachmentReader; import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; +import java.util.function.Predicate; -@Component @Log4j2 -public class XtaZipRepresentationsMapper implements XtaEngineBasedMapper { +@Component +public class XtaZipRepresentationsMapper { public static final String ZIP_CONTENT_TYPE = "application/zip"; static final Predicate<IncomingFile> IS_ZIP_FILE = contentType -> ZIP_CONTENT_TYPE.equals(contentType.getContentType()); - @Override - public FormData parseFormData(FormData srcFormData) { + public FormData extractZipToRepresentations(FormData srcFormData) { List<IncomingFile> extractedFiles = srcFormData.getRepresentations().stream() .filter(IS_ZIP_FILE) diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java index 59bddcf63df7c9135a753a6ee4aab49a375bd087..2038131bb388f729bbf5b48f4d39e9729557bddc 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java @@ -1,8 +1,8 @@ package de.ozgcloud.eingang.xta; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -22,7 +22,7 @@ class XtaApplicationTest { @Test void startup() { // should start without exception; - assertTrue(true); + Assertions.assertTrue(true); } @Test diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java index beb10f64917e4923553562d5ffa19298e4a58db8..e1229a00cb142dfb4b4fdd97dd03a3d419fd923d 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java @@ -5,14 +5,18 @@ import static org.assertj.core.api.InstanceOfAssertFactories.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import de.ozgcloud.eingang.semantik.SemantikAdapter; +import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootContextLoader; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; import org.springframework.test.context.ActiveProfiles; import de.ozgcloud.common.test.TestUtils; @@ -110,9 +114,12 @@ class XtaITCase { } +@RequiredArgsConstructor class ActivateXTARunnerConfig { + private final XtaService service; + private final SemantikAdapter semantikAdapter; @Bean XtaRunner xtaRunner() { - return new XtaRunner(); + return new XtaRunner(service, semantikAdapter); } -} \ No newline at end of file +} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfigurationTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfigurationTest.java index cb5c3f846497e9e8d9c2e39dc1fb58e4f14144da..59d354ecb7c21690e7656712e51c7c5bc56428a3 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfigurationTest.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfigurationTest.java @@ -3,11 +3,13 @@ package de.ozgcloud.eingang.xta; import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; import org.mockito.Spy; class XtaRemoteServiceConfigurationTest { @Spy + @InjectMocks XtaRemoteServiceConfiguration configuration; @Test diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java index d1fc3de86803ba5fc9c49a574011b41adf8e3be0..2352d4386a225626f4272d6a87031139326cddbd 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java @@ -32,14 +32,15 @@ class XtaServiceTest { @Mock private XtaMessageMapper mapper; @Mock + private XtaZipRepresentationsMapper zipMapper; + @Mock private VorgangNummerSupplier vorgangNummerSupplier; @Nested class TestGetMessagesAsFormData { - private XtaMessageMetaDatasAndHeader metaData = XtaMessageMetaDatasAndHeaderTestFactory.create(); - private XtaMessageMetaData messageMetaData = XtaMessageMetaDataTestFactory.create(); - private XtaMessage message = XtaMessageTestFactory.create(); + private final XtaMessageMetaData messageMetaData = XtaMessageMetaDataTestFactory.create(); + private final XtaMessage message = XtaMessageTestFactory.create(); @BeforeEach void setup() { @@ -55,8 +56,7 @@ class XtaServiceTest { @Test void shouldCallFilterByMessageType() { - when(mapper.toFormData(any())).thenReturn(FormDataTestFactory.create()); - when(remoteService.getMessage(any(XtaMessageId.class))).thenReturn(message); + setupMocks(); service.getMessages().toList(); @@ -65,8 +65,7 @@ class XtaServiceTest { @Test void shouldCallGetFormData() { - when(mapper.toFormData(any())).thenReturn(FormDataTestFactory.create()); - when(remoteService.getMessage(any(XtaMessageId.class))).thenReturn(message); + setupMocks(); doReturn(true).when(service).filterByMessageType(messageMetaData); service.getMessages().toList(); @@ -82,6 +81,13 @@ class XtaServiceTest { verify(service, never()).getFormData(any()); } + + private void setupMocks(){ + var testFormData = FormDataTestFactory.create(); + when(mapper.toFormData(any())).thenReturn(testFormData); + when(zipMapper.extractZipToRepresentations(testFormData)).thenReturn(testFormData); + when(remoteService.getMessage(any(XtaMessageId.class))).thenReturn(message); + } } @Nested @@ -105,7 +111,7 @@ class XtaServiceTest { @Nested class TestGetFormData { - private XtaMessage message = XtaMessageTestFactory.create(); + private final XtaMessage message = XtaMessageTestFactory.create(); @Captor private ArgumentCaptor<XtaMessage> messageCaptor; @@ -133,6 +139,7 @@ class XtaServiceTest { service.getFormData(XtaMessageMetaDataTestFactory.create()); verify(mapper).toFormData(any()); + verify(zipMapper).extractZipToRepresentations(any()); } @Test diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/xta/XtaZipRepresentationsMapperTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaZipRepresentationsMapperTest.java similarity index 77% rename from semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/xta/XtaZipRepresentationsMapperTest.java rename to xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaZipRepresentationsMapperTest.java index 56b515e083af42c3b22fc050990df4765832a277..9c247bdd8363aefea78f7b436535abe7b95ffc53 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/xta/XtaZipRepresentationsMapperTest.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaZipRepresentationsMapperTest.java @@ -1,25 +1,27 @@ -package de.ozgcloud.eingang.semantik.enginebased.xta; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.io.InputStream; -import java.util.List; -import java.util.stream.IntStream; +package de.ozgcloud.eingang.xta; +import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.IncomingFile; +import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; +import de.ozgcloud.eingang.common.zip.ZipAttachmentReader; +import lombok.SneakyThrows; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; import org.mockito.Mockito; import org.mockito.Spy; +import org.springframework.stereotype.Component; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.semantik.common.ZipAttachmentReader; -import lombok.SneakyThrows; +import java.io.InputStream; +import java.util.List; +import java.util.stream.IntStream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +@Component class XtaZipRepresentationsMapperTest { private static final String ZIP_CONTENT_TYPE = "application/zip"; @@ -28,14 +30,14 @@ class XtaZipRepresentationsMapperTest { private final XtaZipRepresentationsMapper mapper = new XtaZipRepresentationsMapper(); @Nested - class TestExtractZipFileEctract { + class TestExtractZipFile { @Test void shouldExtractZipFiles() { try (var zipAttachment = Mockito.mockStatic(ZipAttachmentReader.class)) { initZipRepresentationMocks(zipAttachment); - var formData = mapper.parseFormData(createTestFormDataWithZipRepresentation()); + var formData = mapper.extractZipToRepresentations(createTestFormDataWithZipRepresentation()); assertThat(formData.getRepresentations()).hasSize(3); } @@ -56,7 +58,7 @@ class XtaZipRepresentationsMapperTest { try (var zipAttachment = Mockito.mockStatic(ZipAttachmentReader.class)) { initZipRepresentationMocks(zipAttachment); - var formData = mapper.parseFormData(createTestFormDataWithZipRepresentation()); + var formData = mapper.extractZipToRepresentations(createTestFormDataWithZipRepresentation()); assertThat(formData.getNumberOfRepresentations()).isEqualTo(3); } @@ -66,7 +68,7 @@ class XtaZipRepresentationsMapperTest { void shouldIgnoreNonZipFiles() { try (var zipAttachment = Mockito.mockStatic(ZipAttachmentReader.class)) { - var formData = mapper.parseFormData(createTestFormDataWithoutZipRepresentation()); + var formData = mapper.extractZipToRepresentations(createTestFormDataWithoutZipRepresentation()); assertThat(formData.getNumberOfRepresentations()).isEqualTo(1); } @@ -83,7 +85,7 @@ class XtaZipRepresentationsMapperTest { try (var zipAttachment = Mockito.mockStatic(ZipAttachmentReader.class)) { initZipRepresentationMocks(zipAttachment); - var formData = mapper.parseFormData(createTestFormDataWithZipRepresentation()); + var formData = mapper.extractZipToRepresentations(createTestFormDataWithZipRepresentation()); assertThat(formData.getRepresentations()).map(IncomingFile::getContentType) .filteredOn(e -> e.equals(XtaZipRepresentationsMapper.ZIP_CONTENT_TYPE)).hasSize(1); @@ -94,7 +96,7 @@ class XtaZipRepresentationsMapperTest { void shouldDoNothingOnEmptyRepresentations() { try (var zipAttachment = Mockito.mockStatic(ZipAttachmentReader.class)) { - var formData = mapper.parseFormData(createTestFormDataWithoutRepresentation()); + var formData = mapper.extractZipToRepresentations(createTestFormDataWithoutRepresentation()); assertThat(formData.getRepresentations()).isEmpty(); } @@ -108,7 +110,7 @@ class XtaZipRepresentationsMapperTest { @Test void testIsZipFilePredicate() { - assertThat(XtaZipRepresentationsMapper.IS_ZIP_FILE.test(IncomingFileTestFactory.create())).isFalse(); + assertThat(de.ozgcloud.eingang.xta.XtaZipRepresentationsMapper.IS_ZIP_FILE.test(IncomingFileTestFactory.create())).isFalse(); assertThat(XtaZipRepresentationsMapper.IS_ZIP_FILE.test(IncomingFileTestFactory.createBuilder().contentType(ZIP_CONTENT_TYPE).build())) .isTrue(); }