diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/DateConverter.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/DateConverter.java index d475428b3c32af5c4eb4c906de6ed74944072015..d2058d91426c4c70004aae05f9dd5f47fc3bee41 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/DateConverter.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/DateConverter.java @@ -1,5 +1,7 @@ package de.ozgcloud.alfa.common; +import static java.util.Objects.*; + import java.time.LocalDate; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @@ -24,19 +26,24 @@ public class DateConverter { public Optional<XMLGregorianCalendar> convertGermanFormatToISO(String dateStr) { try { - return Optional.of(createDatatypeFactory().newXMLGregorianCalendar(LocalDate.parse(dateStr, DATE_TIME_FORMATTER).toString())); + if (nonNull(dateStr)) { + return Optional.of(createDatatypeFactory().newXMLGregorianCalendar(LocalDate.parse(dateStr, DATE_TIME_FORMATTER).toString())); + } } catch (Exception e) { - LOG.error("Date '{}' cannot be converted to ISO format.", dateStr, e); - return Optional.empty(); + LOG.warn("Date '{}' cannot be converted to ISO format.", dateStr, e); } + return Optional.empty(); } public XMLGregorianCalendar toXmlGregorianCalendar(ZonedDateTime date) { try { - return createDatatypeFactory().newXMLGregorianCalendar(GregorianCalendar.from(date)); + if (nonNull(date)) { + return createDatatypeFactory().newXMLGregorianCalendar(GregorianCalendar.from(date)); + } } catch (Exception e) { - throw new TechnicalException("Date '%s' cannot be converted to ISO format.".formatted(date), e); + LOG.warn("Date '{}' cannot be converted to ISO format.", date, e); } + return null; } DatatypeFactory createDatatypeFactory() { diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportService.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportService.java index 416cf6fdd698d31657fd1eac79fbf046caa7e9e5..3f5690be1f58840a358a13f484043a279d3ed3ff 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportService.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportService.java @@ -51,9 +51,10 @@ class ExportService { var abgabe = AbgabeCreator.createAbgabeCreator() .withKopf(exportVorgangService.createKopf(vorgangWithEingang)) .withVorgang(exportVorgangService.createVorgangType(vorgangWithEingang)) - .withDokumentTypes(exportFileService.createDokumentTypes(ozgFiles, vorgangWithEingang.getEingang().getHeader().getFormEngineName())) + .withDokumentTypes( + exportFileService.createDokumentTypes(ozgFiles.stream(), vorgangWithEingang.getEingang().getHeader().getFormEngineName())) .create(); - return ExportData.builder().abgabe(abgabe).exportFilename(buildXmlFilename(filenameId)).exportFiles(ozgFiles).build(); + return ExportData.builder().abgabe(abgabe).exportFilename(buildXmlFilename(filenameId)).exportFiles(ozgFiles.stream()).build(); } String buildXmlFilename(String filenameId) { @@ -93,7 +94,7 @@ class ExportService { exportFileService.writeOzgFile(ozgFile.getId(), zipOutputStream); zipOutputStream.closeEntry(); } catch (IOException e) { - throw new RuntimeException(e); + throw new TechnicalException("Cannot add file to ZIP.", e); } } @@ -101,7 +102,7 @@ class ExportService { try (var fileInputStream = new FileInputStream(file)) { fileInputStream.transferTo(outputStream); } catch (Exception e) { - throw new TechnicalException("Error writting XDomea zip file to output stream", e); + throw new TechnicalException("Error writing XDomea zip file to output stream", e); } } } diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/ExportFileService.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/ExportFileService.java index c224b6c04fdb5fda786fca7dea4bf3f65a08edab..c196597c3074a43243b137b08a25d2165832fcf9 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/ExportFileService.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/ExportFileService.java @@ -1,6 +1,7 @@ package de.ozgcloud.alfa.file; import java.io.OutputStream; +import java.util.List; import java.util.function.Predicate; import java.util.stream.Stream; @@ -17,7 +18,7 @@ import de.xoev.xdomea.DokumentType; @Service public class ExportFileService { - private static final Predicate<OzgFile> IS_PDF_FILE = file -> file.getContentType().equals(MediaType.APPLICATION_PDF_VALUE); + private static final Predicate<OzgFile> IS_PDF_FILE = file -> MediaType.APPLICATION_PDF_VALUE.equals(file.getContentType()); @Autowired private OzgFileService ozgFileService; @@ -28,10 +29,10 @@ public class ExportFileService { @Autowired private DokumentTypeCreator dokumentTypeCreator; - public Stream<OzgFile> getAllPdfs(String eingangId) { + public List<OzgFile> getAllPdfs(String eingangId) { var representations = ozgFileService.getRepresentationsByEingang(eingangId); var attachments = ozgFileService.getAttachmentsByEingang(eingangId); - return Stream.concat(representations, attachments).filter(IS_PDF_FILE); + return Stream.concat(representations, attachments).filter(IS_PDF_FILE).toList(); } public Stream<DokumentType> createDokumentTypes(Stream<OzgFile> ozgFileStream, String formEngineName) { diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataMapper.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataMapper.java index e2aba0f9fde6b7f2ae5d0c515ba95d70e3cf6d78..89cf757115450c9f89f4b4352d611627f0aeb8a8 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataMapper.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataMapper.java @@ -1,5 +1,7 @@ package de.ozgcloud.alfa.vorgang; +import static java.util.Objects.*; + import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Collection; @@ -77,9 +79,11 @@ class FormDataMapper { AntragsdatenItemType buildSingleValueField(String name, Object value) { var singleValue = new AntragsdatenSingleValueFieldType(); singleValue.setName(name); - var datatype = datatypeMapper.from(value); - singleValue.setType(datatype); - singleValue.setValue(formatValue(datatype, value)); + if (nonNull(value)) { + var datatype = datatypeMapper.from(value); + singleValue.setType(datatype); + singleValue.setValue(formatValue(datatype, value)); + } return singleValue; } diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java index 2a09022daa695900b8d0818ec1ff4919727157e3..342b1d2e6d5166a7062787664826cfb032e5bd86 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java @@ -9,6 +9,7 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.util.List; import java.util.UUID; import java.util.stream.Stream; import java.util.zip.ZipEntry; @@ -128,7 +129,9 @@ class ExportServiceTest { when(exportVorgangService.getVorgang(any())).thenReturn(vorgang); when(exportVorgangService.createVorgangType(any())).thenReturn(vorgangType); when(exportVorgangService.createKopf(any())).thenReturn(kopfType); - when(exportFileService.getAllPdfs(any())).thenReturn(ozgFiles); + List<OzgFile> ozgFileList = mock(List.class); + when(ozgFileList.stream()).thenReturn(ozgFiles); + when(exportFileService.getAllPdfs(any())).thenReturn(ozgFileList); when(exportFileService.createDokumentTypes(any(), any())).thenReturn(dokumentTypes); doReturn(FILE_NAME).when(service).buildXmlFilename(any()); abgabeCreatorStatic = mockStatic(AbgabeCreator.class); diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataMapperTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataMapperTest.java index 9cfb13a037e85443dc219724cd8821331231f66a..6ffbdbf6b0e5699274a8603c442d891a112d39db 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataMapperTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataMapperTest.java @@ -242,6 +242,14 @@ class FormDataMapperTest { assertThat(antragsdatenSingleValueFieldType.getValue()).isEqualTo(FORMDATA_VALUE); } + @Test + void shouldNotSetIfValueIsNull() { + formDataMapper.buildSingleValueField(NAME, null); + + verify(formDataMapper, never()).formatValue(DatatypeType.STRING, null); + } + + @Test void shouldCallFormatValue() { when(datatypeMapper.from(any())).thenReturn(DatatypeType.STRING); @@ -270,5 +278,12 @@ class FormDataMapperTest { verify(dateConverter).toXmlGregorianCalendar(dateTime); } + + @Test + void shouldFormatNull() { + var value = formDataMapper.formatValue(DatatypeType.STRING, null); + + assertThat(value).isEqualTo("null"); + } } } \ No newline at end of file