diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidator.java b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidator.java new file mode 100644 index 0000000000000000000000000000000000000000..eafbad0b39346f495d20d52f05b770d214a983c5 --- /dev/null +++ b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidator.java @@ -0,0 +1,75 @@ +package de.ozgcloud.xta.client.xdomea; + +import static de.ozgcloud.xta.client.xdomea.mapper.MetadataMapper.*; + +import java.util.List; +import java.util.Set; + +import de.ozgcloud.xta.client.exception.ClientException; +import de.ozgcloud.xta.client.model.XtaFile; +import de.ozgcloud.xta.client.model.XtaMessageMetaData; +import de.ozgcloud.xta.client.xdomea.reader.XdomeaXmlValues; +import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReader; +import lombok.Builder; +import lombok.RequiredArgsConstructor; + +@Builder +@RequiredArgsConstructor +public class XdomeaMetaDataValidator { + + private final ZipFileEntryReader zipFileEntryReader; + + static final String AUTHOR_ID_PREFIX_NAME = "author"; + static final String READER_ID_PREFIX_NAME = "reader"; + + public void validate( + XtaFile xdomeaZipFile, + XdomeaXmlValues xdomeaXmlValues, + XtaMessageMetaData messageMetadataData + ) throws ClientException { + validateIdentifierPrefixes( + xdomeaXmlValues.authorIdPrefix(), + xdomeaXmlValues.readerIdPrefix() + ); + validateZipFileName( + xdomeaZipFile.name(), + xdomeaXmlValues.processId(), + messageMetadataData.messageTypeCode() + ); + validatePrimaryDocumentReferences(xdomeaZipFile, xdomeaXmlValues.primaryDocumentNames()); + } + + void validateIdentifierPrefixes(String authorIdPrefix, String readerIdPrefix) throws ClientException { + validateIdentifierPrefix(authorIdPrefix, AUTHOR_ID_PREFIX, AUTHOR_ID_PREFIX_NAME); + validateIdentifierPrefix(readerIdPrefix, READER_ID_PREFIX, READER_ID_PREFIX_NAME); + } + + void validateIdentifierPrefix(String prefix, String expectedPrefix, String prefixName) throws ClientException { + if (!expectedPrefix.equals(normalizePrefix(prefix))) { + throw new ClientException("Expect prefix of %s identifier to be '%s'! (actual: %s)".formatted(prefixName, expectedPrefix, prefix)); + } + } + + private String normalizePrefix(String prefix) { + return prefix.endsWith(":") ? prefix.substring(0, prefix.length() - 1) : prefix; + } + + void validatePrimaryDocumentReferences(XtaFile xdomeaZipFile, List<String> primaryDocumentNames) throws ClientException { + var entryNames = Set.copyOf(zipFileEntryReader.getEntryNames(xdomeaZipFile.content())); + for (var primaryDocumentName : primaryDocumentNames) { + if (!entryNames.contains(primaryDocumentName)) { + throw new ClientException("Primary document reference '%s' not found in xdomea zip file!".formatted(primaryDocumentName)); + } + } + } + + void validateZipFileName(String xdomeaZipFileName, String processId, String messageTypeCode) throws ClientException { + var expectedXdomeaZipFileName = "%s_%s.zip".formatted(processId, messageTypeCode); + if (!expectedXdomeaZipFileName.equals(xdomeaZipFileName)) { + throw new ClientException( + "Expect xdomea zip file name to equal '%s'! (actual: '%s')".formatted(expectedXdomeaZipFileName, xdomeaZipFileName) + ); + } + } + +} diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorFactory.java b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..7dbf72ffea697299ac5bfe69b419f41e50469fd4 --- /dev/null +++ b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorFactory.java @@ -0,0 +1,19 @@ +package de.ozgcloud.xta.client.xdomea; + +import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReader; +import lombok.Builder; +import lombok.RequiredArgsConstructor; + +@Builder +@RequiredArgsConstructor +public class XdomeaMetaDataValidatorFactory { + + private final ZipFileEntryReader zipFileEntryReader; + + public XdomeaMetaDataValidator create() { + return XdomeaMetaDataValidator.builder() + .zipFileEntryReader(zipFileEntryReader) + .build(); + } + +} diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreator.java b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreator.java index 3bacbe6368cf5280afd8aeaf11791810d13843d4..2bd66d76bee063031959336990e92acea12daeb2 100644 --- a/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreator.java +++ b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreator.java @@ -30,21 +30,24 @@ public class XdomeaXtaMessageCreator { private final DocumentBuilder documentBuilder; private final MetadataMapper metadataMapper; private final ZipFileEntryReader zipFileEntryReader; + private final XdomeaMetaDataValidator metaDataValidator; public XtaMessage createMessage(XtaFile xdomeaZipFile) throws ClientException { return XtaMessage.builder() - .metaData(deriveMetaData(xdomeaZipFile)) + .metaData(deriveValidMetaData(xdomeaZipFile)) .messageFile(xdomeaZipFile) .attachmentFiles(emptyList()) .build(); } - XtaMessageMetaData deriveMetaData(XtaFile xdomeaZipFile) throws ClientException { + XtaMessageMetaData deriveValidMetaData(XtaFile xdomeaZipFile) throws ClientException { try { var xdomeaXmlValues = readXdomeaXmlValues(xdomeaZipFile); - return metadataMapper.mapXtaMessageMetadata(xdomeaXmlValues); + var messageMetadataData = metadataMapper.mapXtaMessageMetadata(xdomeaXmlValues); + metaDataValidator.validate(xdomeaZipFile, xdomeaXmlValues, messageMetadataData); + return messageMetadataData; } catch (TechnicalException e) { - throw new ClientException("Failed to derive message metadata from xdomea document!", e); + throw new ClientException("Failed to derive valid message metadata from xdomea document!", e); } } diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactory.java b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactory.java index b3141a7e3fd099dca2911a9d35ad2ce6305219c1..3b6ff6aba506a706aa6c09cc66c6d9a87e1f66bb 100644 --- a/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactory.java +++ b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactory.java @@ -25,6 +25,7 @@ import org.xml.sax.SAXParseException; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.xta.client.xdomea.mapper.MetadataMapper; import de.ozgcloud.xta.client.xdomea.reader.XdomeaValueReaderFactory; +import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReader; import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReaderFactory; import lombok.Builder; import lombok.RequiredArgsConstructor; @@ -48,21 +49,27 @@ public class XdomeaXtaMessageCreatorFactory { ); private final XdomeaValueReaderFactory xdomeaValueReaderFactory; - private final ZipFileEntryReaderFactory zipFileEntryReaderFactory; + private final ZipFileEntryReader zipFileEntryReader; private final DocumentBuilderFactory documentBuilderFactory; private final MetadataMapper metadataMapper; + private final XdomeaMetaDataValidatorFactory xdomeaMetaDataValidatorFactory; private final SchemaFactory schemaFactory; private final ClassLoader classLoader; private final ErrorHandler errorHandler; public static XdomeaXtaMessageCreatorFactory createInstance() { + var zipEntryReaderFactory = ZipFileEntryReaderFactory.builder().build(); + var zipEntryReader = zipEntryReaderFactory.create(); return XdomeaXtaMessageCreatorFactory.builder() .xdomeaValueReaderFactory(XdomeaValueReaderFactory.builder() .xPathFactory(createXPathFactory()) .build()) - .zipFileEntryReaderFactory(ZipFileEntryReaderFactory.builder().build()) + .zipFileEntryReader(zipEntryReader) .documentBuilderFactory(DocumentBuilderFactory.newInstance()) .metadataMapper(Mappers.getMapper(MetadataMapper.class)) + .xdomeaMetaDataValidatorFactory(XdomeaMetaDataValidatorFactory.builder() + .zipFileEntryReader(zipEntryReader) + .build()) .schemaFactory(SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)) .classLoader(XdomeaXtaMessageCreatorFactory.class.getClassLoader()) .errorHandler(new CustomErrorHandler()) @@ -141,8 +148,9 @@ public class XdomeaXtaMessageCreatorFactory { return XdomeaXtaMessageCreator.builder() .documentBuilder(createDocumentBuilder()) .xdomeaValueReader(xdomeaValueReaderFactory.create()) - .zipFileEntryReader(zipFileEntryReaderFactory.create()) + .zipFileEntryReader(zipFileEntryReader) .metadataMapper(metadataMapper) + .metaDataValidator(xdomeaMetaDataValidatorFactory.create()) .build(); } } diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReader.java b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReader.java index 9df91a388943841ac70ef9e7d37b76b1f870ecd3..90dcbeb54d465a6b50381ce74dc0ad77d744301f 100644 --- a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReader.java +++ b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReader.java @@ -1,6 +1,7 @@ package de.ozgcloud.xta.client.xdomea.reader; import java.util.Arrays; +import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -14,30 +15,47 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class XdomeaValueReader { - static final String AUTHOR_ID_SUFFIX_XPATH = getTextXpath("Kopf", "Absender", "code"); - static final String READER_ID_SUFFIX_XPATH = getTextXpath("Kopf", "Empfaenger", "code"); - static final String MESSAGE_TYPE_ID_SUFFIX_XPATH = getTextXpath("Kopf", "Nachrichtentyp", "code"); + static final String PROCESS_ID_XPATH = getXpath("Kopf", "ProzessID"); + static final String AUTHOR_ID_SUFFIX_XPATH = getXpath("Kopf", "Absender", "Behoerdenschluessel|Kennung", "code"); + static final String AUTHOR_ID_PREFIX_XPATH = getXpath("Kopf", "Absender", "Praefix", "code"); + static final String READER_ID_SUFFIX_XPATH = getXpath("Kopf", "Empfaenger", "Behoerdenschluessel|Kennung", "code"); + static final String READER_ID_PREFIX_XPATH = getXpath("Kopf", "Empfaenger", "Praefix", "code"); + static final String MESSAGE_TYPE_ID_SUFFIX_XPATH = getXpath("Kopf", "Nachrichtentyp", "code"); + static final String PRIMARY_DOCUMENT_NAME_XPATH = getXpath("Primaerdokument", "Dateiname"); - static String getTextXpath(String... hierarchy) { + static String getXpath(String... hierarchy) { return Arrays.stream(hierarchy) - .map(h -> "//*[local-name() = '" + h + "']") - .collect(Collectors.joining()) - + "/text()"; + .map(localNames -> Arrays.stream(localNames.split("\\|")) + .map(localName -> "local-name() = '" + localName + "'") + .collect(Collectors.joining(" or "))) + .map(predicate -> "//*[" + predicate + "]") + .collect(Collectors.joining()); } private final Map<String, XmlValueReader> xmlValueReaders; public XdomeaXmlValues readValues(Document xdomeaXmlDocument) throws ClientException { return XdomeaXmlValues.builder() + .processId(readRequiredValue(xdomeaXmlDocument, PROCESS_ID_XPATH)) .messageTypeCode(readRequiredValue(xdomeaXmlDocument, MESSAGE_TYPE_ID_SUFFIX_XPATH)) .authorIdSuffix(readRequiredValue(xdomeaXmlDocument, AUTHOR_ID_SUFFIX_XPATH)) + .authorIdPrefix(readRequiredValue(xdomeaXmlDocument, AUTHOR_ID_PREFIX_XPATH)) .readerIdSuffix(readRequiredValue(xdomeaXmlDocument, READER_ID_SUFFIX_XPATH)) + .readerIdPrefix(readRequiredValue(xdomeaXmlDocument, READER_ID_PREFIX_XPATH)) + .primaryDocumentNames(readPrimaryDocumentNames(xdomeaXmlDocument)) .build(); } + List<String> readPrimaryDocumentNames(Document xdomeaXmlDocument) { + return getXmlValueReader(PRIMARY_DOCUMENT_NAME_XPATH) + .readNonEmptyTexts(xdomeaXmlDocument) + .toList(); + } + String readRequiredValue(Document xdomeaXmlDocument, String xpathString) throws ClientException { return getXmlValueReader(xpathString) - .readString(xdomeaXmlDocument) + .readNonEmptyTexts(xdomeaXmlDocument) + .findFirst() .orElseThrow(() -> new ClientException("Required value " + xpathString + " not found in xdomea xml document!")); } diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactory.java b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactory.java index 1e9b6e0bd9ffb34782876cfc54b8b911cf0dc77d..74c0c97680258b1c0e6e2fd1df3aaf8ca878af3c 100644 --- a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactory.java +++ b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactory.java @@ -30,9 +30,13 @@ public class XdomeaValueReaderFactory { public XdomeaValueReader create() { return XdomeaValueReader.builder() .xmlValueReaders(Stream.of( + PROCESS_ID_XPATH, MESSAGE_TYPE_ID_SUFFIX_XPATH, AUTHOR_ID_SUFFIX_XPATH, - READER_ID_SUFFIX_XPATH + AUTHOR_ID_PREFIX_XPATH, + READER_ID_SUFFIX_XPATH, + READER_ID_PREFIX_XPATH, + PRIMARY_DOCUMENT_NAME_XPATH ).collect(Collectors.toMap( xpath -> xpath, this::createXmlValueReader diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaXmlValues.java b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaXmlValues.java index e5820e907a5a2d7eb94815f4fef528cce196bd20..1410fdc5347ecdc109604a56989ced63b703a549 100644 --- a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaXmlValues.java +++ b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaXmlValues.java @@ -1,13 +1,20 @@ package de.ozgcloud.xta.client.xdomea.reader; +import java.util.List; + +import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import lombok.Builder; @Builder public record XdomeaXmlValues( + @NotBlank String processId, @NotBlank String messageTypeCode, @NotBlank String authorIdSuffix, - @NotBlank String readerIdSuffix + @NotBlank String authorIdPrefix, + @NotBlank String readerIdSuffix, + @NotBlank String readerIdPrefix, + @Valid List<@NotBlank String> primaryDocumentNames ) { } diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReader.java b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReader.java index 094ae50eabdf1dc9aad81e76bf2c09d051fa25a5..642bff51e49b4c7ff2b3c2d8f7cbefc362dc4b67 100644 --- a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReader.java +++ b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReader.java @@ -1,12 +1,15 @@ package de.ozgcloud.xta.client.xdomea.reader; -import java.util.Optional; +import java.util.stream.IntStream; +import java.util.stream.Stream; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import de.ozgcloud.common.errorhandling.TechnicalException; import lombok.Builder; @@ -16,24 +19,34 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class XmlValueReader { - private final XPathExpression textXpath; + private final XPathExpression xPathExpression; - public Optional<String> readString(Document xmlDocument) { - return findStringByTextXpath(xmlDocument, textXpath) - .map(String::trim) - .filter(s -> !s.isBlank()); + public Stream<String> readNonEmptyTexts(Document xmlDocument) { + return getTextsFromNodes(queryNodeList(xmlDocument, xPathExpression)) + .filter(s -> !s.isEmpty()); } - private Optional<String> findStringByTextXpath(Document xdomeaXmlDocument, XPathExpression textXpath) { + private NodeList queryNodeList(Document xmlDocument, XPathExpression xPathExpression) { try { - return Optional.ofNullable((String) textXpath + return (NodeList) xPathExpression .evaluate( - xdomeaXmlDocument.getDocumentElement(), - XPathConstants.STRING - )); + xmlDocument.getDocumentElement(), + XPathConstants.NODESET + ); } catch (XPathExpressionException e) { throw new TechnicalException("Failed to execute xpath search!", e); } } + private Stream<String> getTextsFromNodes(NodeList nodeList) { + return streamNodeList(nodeList) + .map(Node::getTextContent) + .map(String::trim); + } + + private Stream<Node> streamNodeList(NodeList nodeList) { + return IntStream.range(0, nodeList.getLength()) + .mapToObj(nodeList::item); + } + } diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReaderFactory.java b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReaderFactory.java index 90966ec68d9e684e225bfe02aee739b51fba0659..5f28091a231a036a4dfefd2b6e9a08883199e0c4 100644 --- a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReaderFactory.java +++ b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReaderFactory.java @@ -25,7 +25,7 @@ public class XmlValueReaderFactory { public XmlValueReader create() { return XmlValueReader.builder() - .textXpath(compileXPathExpression()) + .xPathExpression(compileXPathExpression()) .build(); } } diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/ZipFileEntryReader.java b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/ZipFileEntryReader.java index 2164cb8d8c5d05833e87325984876a2e22d45f37..8b0df0b9cc40098cd285e228fed1895c0a66e862 100644 --- a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/ZipFileEntryReader.java +++ b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/ZipFileEntryReader.java @@ -2,6 +2,8 @@ package de.ozgcloud.xta.client.xdomea.reader; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; import java.util.function.Function; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -30,4 +32,18 @@ public class ZipFileEntryReader { throw new TechnicalException("Failed reading zip file!", e); } } + + public List<String> getEntryNames(DataHandler zipFileContent) { + var entryNames = new ArrayList<String>(); + try (var zipInputStream = new ZipInputStream(zipFileContent.getInputStream())) { + ZipEntry entry; + while ((entry = zipInputStream.getNextEntry()) != null) { + entryNames.add(entry.getName()); + zipInputStream.closeEntry(); + } + return entryNames; + } catch (IOException e) { + throw new TechnicalException("Failed reading zip file!", e); + } + } } diff --git a/src/main/resources/xdomea/300/xdomea-Baukasten.xsd b/src/main/resources/xdomea/300/xdomea-Baukasten.xsd index 97b358a114505f27f22593e524a5c21d5ba8136c..8cdd8a85cb57fb752969dffc9ed9a0c951948475 100644 --- a/src/main/resources/xdomea/300/xdomea-Baukasten.xsd +++ b/src/main/resources/xdomea/300/xdomea-Baukasten.xsd @@ -529,7 +529,7 @@ Der Standard xdomea wird von der gleichnamigen Arbeitsgruppe des IT-Planungsrate <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##any" - processContents="lax"/> + processContents="skip"/> </xs:sequence> </xs:complexType> <xs:complexType name="AufbewahrungsdauerType"> diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientRemoteITCase.java b/src/test/java/de/ozgcloud/xta/client/XtaClientRemoteITCase.java index bf9b0552ffde367cc372fa486922491d92283cff..e6dadc2b2f0b7008900ff612b98b768b53e7a5a3 100644 --- a/src/test/java/de/ozgcloud/xta/client/XtaClientRemoteITCase.java +++ b/src/test/java/de/ozgcloud/xta/client/XtaClientRemoteITCase.java @@ -140,9 +140,7 @@ class XtaClientRemoteITCase { @DisplayName("should return with open status") @SneakyThrows @ParameterizedTest - @ValueSource(strings = { "dfoerdermittel" }) - // @ValueSource(strings = { "dfoerdermittel", "abgabe0401-kleiner-waffenschein" }) - // TODO fix client-side validation to find out why "abgabe0401-kleiner-waffenschein" fails + @ValueSource(strings = { "dfoerdermittel", "abgabe0401-kleiner-waffenschein" }) void shouldReturn(String messageLabel) { XtaMessage xtaMessage = createXdomeaMessage(messageLabel); diff --git a/src/test/java/de/ozgcloud/xta/client/extension/Patch.java b/src/test/java/de/ozgcloud/xta/client/extension/Patch.java index d5763badc00b701dc03499b96c95bebf1068f9e3..d527b0f0325b879aecc1d4fef0bb7067e6e42b8e 100644 --- a/src/test/java/de/ozgcloud/xta/client/extension/Patch.java +++ b/src/test/java/de/ozgcloud/xta/client/extension/Patch.java @@ -23,10 +23,13 @@ public record Patch( var patchedContent = new StringBuilder(); try { for (var hunk : hunks) { - for (var patchedLine : hunk.apply(lines, lineOffset)) { - patchedContent.append(patchedLine).append("\n"); + var patchResult = hunk.apply(lines, lineOffset); + for (var patchLine : patchResult.lines()) { + patchedContent.append(patchLine).append("\n"); } + lineOffset = patchResult.lineOffset(); } + lines.forEachRemaining(patchedContent::append); } catch (TechnicalException exception) { throw new TechnicalException("Error applying patch! filePath=" + filePath, exception); } diff --git a/src/test/java/de/ozgcloud/xta/client/extension/PatchHunk.java b/src/test/java/de/ozgcloud/xta/client/extension/PatchHunk.java index c2dfed9bfa8e0edd6bb97b24fc453f26e3b97fe2..912c39baa0c9688d2797813cb95a4142af9c8b1f 100644 --- a/src/test/java/de/ozgcloud/xta/client/extension/PatchHunk.java +++ b/src/test/java/de/ozgcloud/xta/client/extension/PatchHunk.java @@ -11,14 +11,21 @@ public record PatchHunk( List<HunkLine> hunkLines ) { - public List<String> apply(Iterator<String> lines, int lineOffset) { + public record PatchResult( + List<String> lines, + int lineOffset + ) { + } + + public PatchResult apply(Iterator<String> lines, int lineOffset) { var patchedLines = new ArrayList<String>(); - skipToContextStart(lines, lineOffset, patchedLines); + lineOffset = skipToContextStart(lines, lineOffset, patchedLines); for (var hunkLine : hunkLines) { switch (hunkLine.operation) { case CONTEXT -> { var contextLine = lines.next(); + lineOffset++; if (!hunkLine.line.equals(contextLine)) { throw new TechnicalException( "Unexpected context line! expected='" + hunkLine.line + "' actual='" + contextLine + "', lineOffset=" + lineOffset); @@ -28,6 +35,7 @@ public record PatchHunk( case ADD -> patchedLines.add(hunkLine.line); case REMOVE -> { var removeLine = lines.next(); + lineOffset++; if (!hunkLine.line.equals(removeLine)) { throw new TechnicalException( "Unexpected remove line! expected='" + hunkLine.line + "' actual='" + removeLine + "', lineOffset=" + lineOffset); @@ -35,16 +43,17 @@ public record PatchHunk( } } } - return patchedLines; + return new PatchResult(patchedLines, lineOffset); } - private void skipToContextStart(Iterator<String> lines, int lineOffset, List<String> patchedLines) { + private int skipToContextStart(Iterator<String> lines, int lineOffset, List<String> patchedLines) { for (; lineOffset < contextStartLineNumber - 1; lineOffset++) { if (!lines.hasNext()) { throw new TechnicalException("Unexpected end of target file! lineOffset=" + lineOffset); } patchedLines.add(lines.next()); } + return lineOffset; } public record HunkLine( diff --git a/src/test/java/de/ozgcloud/xta/client/factory/XdomeaXmlValuesTestFactory.java b/src/test/java/de/ozgcloud/xta/client/factory/XdomeaXmlValuesTestFactory.java index 8e72d58bcc5472e40d6d1cf7eccdd808d236513d..a4f402b6f47e37e46f40b7bf533f10519611258e 100644 --- a/src/test/java/de/ozgcloud/xta/client/factory/XdomeaXmlValuesTestFactory.java +++ b/src/test/java/de/ozgcloud/xta/client/factory/XdomeaXmlValuesTestFactory.java @@ -1,13 +1,19 @@ package de.ozgcloud.xta.client.factory; +import java.util.List; + import de.ozgcloud.xta.client.xdomea.reader.XdomeaXmlValues; public class XdomeaXmlValuesTestFactory { - + public static final String PROCESS_ID = "000ProcessId-111"; public static final String SHORT_MESSAGE_TYPE_CODE = "messageTypeCode"; public static final String AUTHOR_ID_SUFFIX = "authorIdSuffix"; + public static final String AUTHOR_ID_PREFIX = "authorIdPrefix"; public static final String READER_ID_SUFFIX = "readerIdSuffix"; + public static final String READER_ID_PREFIX = "readerIdPrefix"; + + public static final List<String> PRIMARY_DOCUMENT_NAMES = List.of("doc.pdf", "doc.xml"); public static XdomeaXmlValues create() { return createBuilder().build(); @@ -15,8 +21,12 @@ public class XdomeaXmlValuesTestFactory { public static XdomeaXmlValues.XdomeaXmlValuesBuilder createBuilder() { return XdomeaXmlValues.builder() + .processId(PROCESS_ID) .messageTypeCode(SHORT_MESSAGE_TYPE_CODE) .authorIdSuffix(AUTHOR_ID_SUFFIX) - .readerIdSuffix(READER_ID_SUFFIX); + .authorIdPrefix(AUTHOR_ID_PREFIX) + .readerIdSuffix(READER_ID_SUFFIX) + .readerIdPrefix(READER_ID_PREFIX) + .primaryDocumentNames(PRIMARY_DOCUMENT_NAMES); } } diff --git a/src/test/java/de/ozgcloud/xta/client/factory/ZipFileTestFactory.java b/src/test/java/de/ozgcloud/xta/client/factory/ZipFileTestFactory.java index 25a7efedb0f0875ea6395fe11998003ae8864a2f..da503fa895417bb3d0a73013fa6fcf22bc042eca 100644 --- a/src/test/java/de/ozgcloud/xta/client/factory/ZipFileTestFactory.java +++ b/src/test/java/de/ozgcloud/xta/client/factory/ZipFileTestFactory.java @@ -5,13 +5,10 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; -import java.util.function.UnaryOperator; import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import jakarta.annotation.Nullable; - import org.apache.commons.codec.Resources; import org.apache.commons.io.IOUtils; @@ -60,12 +57,6 @@ public class ZipFileTestFactory { ).toList()); } - public static byte[] replaceXmlString(byte[] data, @Nullable UnaryOperator<String> xmlStringReplacer) { - return xmlStringReplacer == null - ? data - : xmlStringReplacer.apply(new String(data, StandardCharsets.UTF_8)).getBytes(StandardCharsets.UTF_8); - } - static Stream<String> listResourceFileNames(String resourceDirectoryPath) { try (var inputStream = Resources.getInputStream(resourceDirectoryPath)) { return Arrays.stream(IOUtils.toString(inputStream, StandardCharsets.UTF_8).split("\n")); diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorFactoryTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorFactoryTest.java new file mode 100644 index 0000000000000000000000000000000000000000..60b10771660b97fb3e29796df425f6a26ebf4872 --- /dev/null +++ b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorFactoryTest.java @@ -0,0 +1,35 @@ +package de.ozgcloud.xta.client.xdomea; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReader; + +class XdomeaMetaDataValidatorFactoryTest { + + @InjectMocks + private XdomeaMetaDataValidatorFactory factory; + + @Mock + private ZipFileEntryReader zipFileEntryReader; + + @DisplayName("create") + @Nested + class TestCreate { + + @DisplayName("should return") + @Test + void shouldReturn() { + var result = factory.create(); + + assertThat(result).usingRecursiveComparison().isEqualTo(XdomeaMetaDataValidator.builder() + .zipFileEntryReader(zipFileEntryReader) + .build()); + } + } +} \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..b3251bedc7fb829bd22a35a6d6c6f648c678626c --- /dev/null +++ b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorTest.java @@ -0,0 +1,248 @@ +package de.ozgcloud.xta.client.xdomea; + +import static de.ozgcloud.xta.client.factory.MessageMetaDataTestFactory.*; +import static de.ozgcloud.xta.client.factory.XdomeaXmlValuesTestFactory.*; +import static de.ozgcloud.xta.client.factory.XtaFileTestFactory.*; +import static de.ozgcloud.xta.client.xdomea.XdomeaMetaDataValidator.*; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.List; + +import jakarta.activation.DataHandler; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +import de.ozgcloud.xta.client.exception.ClientException; +import de.ozgcloud.xta.client.factory.XdomeaXmlValuesTestFactory; +import de.ozgcloud.xta.client.factory.XtaFileTestFactory; +import de.ozgcloud.xta.client.factory.XtaMessageMetaDataTestFactory; +import de.ozgcloud.xta.client.model.XtaFile; +import de.ozgcloud.xta.client.model.XtaMessageMetaData; +import de.ozgcloud.xta.client.xdomea.mapper.MetadataMapper; +import de.ozgcloud.xta.client.xdomea.reader.XdomeaXmlValues; +import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReader; +import lombok.SneakyThrows; + +class XdomeaMetaDataValidatorTest { + + @Spy + @InjectMocks + private XdomeaMetaDataValidator validator; + + @Mock + private ZipFileEntryReader zipFileEntryReader; + + @DisplayName("validate") + @Nested + class TestValidate { + + private XtaFile xdomeaZipFile; + + private XdomeaXmlValues xdomeaXmlValues; + + private XtaMessageMetaData messageMetadataData; + + @BeforeEach + @SneakyThrows + void mock() { + xdomeaZipFile = XtaFileTestFactory.create(); + xdomeaXmlValues = XdomeaXmlValuesTestFactory.create(); + messageMetadataData = XtaMessageMetaDataTestFactory.create(); + doNothing().when(validator).validateIdentifierPrefixes(any(), any()); + doNothing().when(validator).validateZipFileName(any(), any(), any()); + doNothing().when(validator).validatePrimaryDocumentReferences(any(), any()); + } + + @DisplayName("should verify identifier prefixes") + @Test + @SneakyThrows + void shouldVerifyIdentifierPrefixes() { + validate(); + + verify(validator).validateIdentifierPrefixes( + AUTHOR_ID_PREFIX, + READER_ID_PREFIX + ); + } + + @DisplayName("should verify zip file name") + @Test + @SneakyThrows + void shouldVerifyZipFileName() { + validate(); + + verify(validator).validateZipFileName( + XTA_FILE_NAME, + PROCESS_ID, + MESSAGE_TYPE_CODE + ); + } + + @DisplayName("should verify primary document references") + @Test + @SneakyThrows + void shouldVerifyPrimaryDocumentReferences() { + validate(); + + verify(validator).validatePrimaryDocumentReferences( + xdomeaZipFile, + PRIMARY_DOCUMENT_NAMES + ); + } + + @SneakyThrows + private void validate() { + validator.validate(xdomeaZipFile, xdomeaXmlValues, messageMetadataData); + } + } + + @DisplayName("validate identifier prefixes") + @Nested + class TestValidateIdentifierPrefixes { + + @BeforeEach + @SneakyThrows + void mock() { + doNothing().when(validator).validateIdentifierPrefix(any(), any(), any()); + } + + @DisplayName("should validate author identifier prefix") + @Test + @SneakyThrows + void shouldValidateAuthorIdentifierPrefix() { + validator.validateIdentifierPrefixes(AUTHOR_ID_PREFIX, READER_ID_PREFIX); + + verify(validator).validateIdentifierPrefix( + AUTHOR_ID_PREFIX, + MetadataMapper.AUTHOR_ID_PREFIX, + AUTHOR_ID_PREFIX_NAME + ); + } + + @DisplayName("should validate reader identifier prefix") + @Test + @SneakyThrows + void shouldValidateReaderIdentifierPrefix() { + validator.validateIdentifierPrefixes(AUTHOR_ID_PREFIX, READER_ID_PREFIX); + + verify(validator).validateIdentifierPrefix( + READER_ID_PREFIX, + MetadataMapper.READER_ID_PREFIX, + READER_ID_PREFIX_NAME + ); + } + } + + @DisplayName("validate identifier prefix") + @Nested + class TestValidateIdentifierPrefix { + + private static final String EXPECTED_PREFIX = "prefix"; + private static final String PREFIX_NAME = "prefixName"; + + @DisplayName("should normalize prefix") + @ParameterizedTest + @ValueSource(strings = { + "prefix:", + "prefix", + }) + @SneakyThrows + void shouldNormalizePrefix(String prefix) { + validator.validateIdentifierPrefix(prefix, EXPECTED_PREFIX, PREFIX_NAME); + } + + @DisplayName("should throw client exception for wrong prefix") + @ParameterizedTest + @ValueSource(strings = { + "prefi", + "prefix::", + "prefix$:", + "prefix$", + }) + void shouldThrowClientExceptionForWrongPrefix(String prefix) { + assertThatThrownBy(() -> validator.validateIdentifierPrefix(prefix, EXPECTED_PREFIX, PREFIX_NAME)) + .isInstanceOf(ClientException.class) + .hasMessageContaining(PREFIX_NAME); + } + + } + + @DisplayName("validate zip file name") + @Nested + class TestValidateZipFileName { + + private static final String PROCESS_ID = "processId"; + private static final String MESSAGE_TYPE_CODE = "messageTypeCode"; + private static final String VALID_ZIP_FILE_NAME = "processId_messageTypeCode.zip"; + + @DisplayName("should not throw exception for valid zip file name") + @Test + void shouldNotThrowExceptionForValidZipFileName() { + assertThatCode(() -> validator.validateZipFileName(VALID_ZIP_FILE_NAME, PROCESS_ID, MESSAGE_TYPE_CODE)) + .doesNotThrowAnyException(); + } + + @DisplayName("should throw client exception for wrong zip file name") + @ParameterizedTest + @ValueSource(strings = { + "$processId_messageTypeCode.zip", + "processId_me$ssageTypeCode.zip", + "processId_messageTypeCode.zip$", + }) + void shouldThrowClientExceptionForWrongZipFileName(String wrongZipFileName) { + assertThatThrownBy(() -> validator.validateZipFileName(wrongZipFileName, PROCESS_ID, MESSAGE_TYPE_CODE)) + .isInstanceOf(ClientException.class); + } + + } + + @DisplayName("validate primary document references") + @Nested + class TestValidatePrimaryDocumentReferences { + + private static final List<String> VALID_ZIP_ENTRY_NAMES = List.of("doc.pdf", "doc.xml", "other.doc"); + private static final List<String> INVALID_ZIP_ENTRY_NAMES = List.of("doc.pdf"); + + @Mock + private XtaFile xdomeaZipFile; + + @Mock + private DataHandler contentDataHandler; + + @BeforeEach + @SneakyThrows + void mock() { + when(xdomeaZipFile.content()).thenReturn(contentDataHandler); + + } + + @DisplayName("should not throw exception for valid primary document references") + @Test + @SneakyThrows + void shouldNotThrowExceptionForValidPrimaryDocumentReferences() { + when(zipFileEntryReader.getEntryNames(contentDataHandler)).thenReturn(VALID_ZIP_ENTRY_NAMES); + + validator.validatePrimaryDocumentReferences(xdomeaZipFile, PRIMARY_DOCUMENT_NAMES); + } + + @DisplayName("should throw client exception for missing primary document references") + @Test + @SneakyThrows + void shouldThrowClientExceptionForMissingPrimaryDocumentReferences() { + when(zipFileEntryReader.getEntryNames(contentDataHandler)).thenReturn(INVALID_ZIP_ENTRY_NAMES); + + assertThatThrownBy(() -> validator.validatePrimaryDocumentReferences(xdomeaZipFile, PRIMARY_DOCUMENT_NAMES)) + .isInstanceOf(ClientException.class); + } + } + +} \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactoryTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactoryTest.java index 578ea24b61a8b077455ee9693ca0ba805e870bce..723de052ef5cbc4d9796fe8179329e33b70045e7 100644 --- a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactoryTest.java +++ b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactoryTest.java @@ -38,7 +38,6 @@ import de.ozgcloud.xta.client.xdomea.mapper.MetadataMapper; import de.ozgcloud.xta.client.xdomea.reader.XdomeaValueReader; import de.ozgcloud.xta.client.xdomea.reader.XdomeaValueReaderFactory; import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReader; -import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReaderFactory; import lombok.SneakyThrows; class XdomeaXtaMessageCreatorFactoryTest { @@ -51,7 +50,7 @@ class XdomeaXtaMessageCreatorFactoryTest { private XdomeaValueReaderFactory xdomeaValueReaderFactory; @Mock - private ZipFileEntryReaderFactory zipFileEntryReaderFactory; + private ZipFileEntryReader zipFileEntryReader; @Mock private DocumentBuilderFactory documentBuilderFactory; @@ -59,6 +58,9 @@ class XdomeaXtaMessageCreatorFactoryTest { @Mock private MetadataMapper metadataMapper; + @Mock + private XdomeaMetaDataValidatorFactory xdomeaMetaDataValidatorFactory; + @Mock private SchemaFactory schemaFactory; @@ -79,10 +81,10 @@ class XdomeaXtaMessageCreatorFactoryTest { private DocumentBuilder documentBuilder; @Mock - private ZipFileEntryReader zipFileEntryReader; + private ParserConfigurationException parserConfigurationException; @Mock - private ParserConfigurationException parserConfigurationException; + private XdomeaMetaDataValidator metaDataValidator; @Mock private Schema schema; @@ -92,7 +94,7 @@ class XdomeaXtaMessageCreatorFactoryTest { when(documentBuilderFactory.newDocumentBuilder()).thenReturn(documentBuilder); doReturn(schema).when(factory).createSchema(); when(xdomeaValueReaderFactory.create()).thenReturn(xdomeaValueReader); - when(zipFileEntryReaderFactory.create()).thenReturn(zipFileEntryReader); + when(xdomeaMetaDataValidatorFactory.create()).thenReturn(metaDataValidator); } @DisplayName("should return") @@ -107,13 +109,14 @@ class XdomeaXtaMessageCreatorFactoryTest { .xdomeaValueReader(xdomeaValueReader) .zipFileEntryReader(zipFileEntryReader) .metadataMapper(metadataMapper) + .metaDataValidator(metaDataValidator) .build()); } - @DisplayName("should set document builder feature") + @DisplayName("should disallow doctype declarations") @Test @SneakyThrows - void shouldSetDocumentBuilderFeature() { + void shouldDisallowDoctypeDeclarations() { setupMocks(); factory.create(); diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageFactoryITCase.java b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorITCase.java similarity index 52% rename from src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageFactoryITCase.java rename to src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorITCase.java index 1fbac8bffce5809c634c65e566949b46d556cb77..6256c854dbd400a3fabd26ed0f5520ac5dd89f13 100644 --- a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageFactoryITCase.java +++ b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorITCase.java @@ -1,6 +1,6 @@ package de.ozgcloud.xta.client.xdomea; -import static de.ozgcloud.xta.client.factory.MessageMetaDataTestFactory.*; +import static de.ozgcloud.xta.client.extension.XtaServerSetupExtensionTestUtil.*; import static de.ozgcloud.xta.client.xdomea.mapper.MetadataMapper.*; import static org.assertj.core.api.Assertions.*; @@ -16,7 +16,7 @@ import de.ozgcloud.xta.client.extension.XtaMessageExampleLoader; import de.ozgcloud.xta.client.model.XtaFile; import lombok.SneakyThrows; -class XdomeaXtaMessageFactoryITCase { +class XdomeaXtaMessageCreatorITCase { private XdomeaXtaMessageCreator creator; @@ -38,8 +38,7 @@ class XdomeaXtaMessageFactoryITCase { var xtaMessage = creator.createMessage(xdomeaZipFile); - var readerIdentifierSuffix = getIdentifierValueSuffix(xtaMessage.metaData().readerIdentifier().value()); - assertThat(readerIdentifierSuffix).isEqualTo(getIdentifierValueSuffix(READER_IDENTIFIER.value())); + assertThat(xtaMessage.metaData().readerIdentifier().value()).isEqualTo(READER_CLIENT_IDENTIFIER1.value()); } @DisplayName("should use author") @@ -51,12 +50,7 @@ class XdomeaXtaMessageFactoryITCase { var xtaMessage = creator.createMessage(xdomeaZipFile); - var authorIdentifierSuffix = getIdentifierValueSuffix(xtaMessage.metaData().authorIdentifier().value()); - assertThat(authorIdentifierSuffix).isEqualTo(getIdentifierValueSuffix(AUTHOR_IDENTIFIER.value())); - } - - private String getIdentifierValueSuffix(String identifierValue) { - return identifierValue.substring(identifierValue.indexOf(":") + 1); + assertThat(xtaMessage.metaData().authorIdentifier().value()).isEqualTo(AUTHOR_CLIENT_IDENTIFIER.value()); } @DisplayName("should use message type code for 0201") @@ -71,17 +65,33 @@ class XdomeaXtaMessageFactoryITCase { } @DisplayName("should throw client exception for invalid message 0201") - @Test - void shouldThrowClientExceptionForInvalidMessage0201() { - var invalidMessageZipFile = XtaMessageExampleLoader.load(createExampleConfigBuilder() - .messageLabel("dfoerdermittel") - .patchLabel("invalid-behoerdenkennung-order.patch") - .build()).messageFile(); + @ParameterizedTest + @ValueSource(strings = { + "invalid-behoerdenkennung-order.patch", + "invalid-Kennung-missing.patch", + }) + void shouldThrowClientExceptionForInvalidMessage0201(String patchName) { + var invalidMessageZipFile = loadMessageFileWithPatch( + "dfoerdermittel", + patchName + ); assertThatThrownBy(() -> creator.createMessage(invalidMessageZipFile)) .isInstanceOf(ClientException.class); } + @DisplayName("should not throw with valid message 0201") + @Test + void shouldNotThrowWithValidMessage0201() { + var validMessageZipFile = loadMessageFileWithPatch( + "dfoerdermittel", + "valid-behoerdenkennung-name.patch" + ); + + assertThatCode(() -> creator.createMessage(validMessageZipFile)) + .doesNotThrowAnyException(); + } + @DisplayName("should use message type code for 0401") @Test @SneakyThrows @@ -92,19 +102,58 @@ class XdomeaXtaMessageFactoryITCase { assertThat(xtaMessage.metaData().messageTypeCode()).isEqualTo(MESSAGE_TYPE_CODE_0401); } + + @DisplayName("should throw client exception for invalid message 0401") + @ParameterizedTest + @ValueSource(strings = { + "invalid-ProzessID.patch", + "invalid-reference-to-primary-document.patch", + "invalid-Praefix-author.patch", + "invalid-Praefix-reader.patch", + }) + void shouldThrowClientExceptionForInvalidMessage0401(String patchName) { + var invalidMessageZipFile = loadMessageFileWithPatch( + "abgabe0401-kleiner-waffenschein", + patchName + ); + + assertThatThrownBy(() -> creator.createMessage(invalidMessageZipFile)) + .isInstanceOf(ClientException.class); + } + + @DisplayName("should not throw with valid message 0401") + @ParameterizedTest + @ValueSource(strings = { + "valid-unknown-namespaces.patch", + "valid-ignored-schemaLocation.patch" + }) + void shouldNotThrowWithValidMessage0401(String patchName) { + var validMessageZipFile = loadMessageFileWithPatch( + "abgabe0401-kleiner-waffenschein", + patchName + ); + + assertThatCode(() -> creator.createMessage(validMessageZipFile)) + .doesNotThrowAnyException(); + } + } private XtaMessageExampleLoader.MessageExampleConfig.MessageExampleConfigBuilder createExampleConfigBuilder() { return XtaMessageExampleLoader.MessageExampleConfig.builder() - .author(AUTHOR_IDENTIFIER) - .reader(READER_IDENTIFIER); + .author(AUTHOR_CLIENT_IDENTIFIER) + .reader(READER_CLIENT_IDENTIFIER1); } - private XtaFile loadMessageFile(String messageLabel) { - var message = XtaMessageExampleLoader.load(createExampleConfigBuilder() + private XtaFile loadMessageFileWithPatch(String messageLabel, String patchLabel) { + return XtaMessageExampleLoader.load(createExampleConfigBuilder() .messageLabel(messageLabel) - .build()); - return message.messageFile(); + .patchLabel(patchLabel) + .build()).messageFile(); + } + + private XtaFile loadMessageFile(String messageLabel) { + return loadMessageFileWithPatch(messageLabel, null); } } \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorTest.java index e896b3bdacadcd4d5b0728df14a3b1f965a57a1c..6ffa37b6177f2022c068f847707a02c5d8e36d3f 100644 --- a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorTest.java +++ b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorTest.java @@ -21,6 +21,9 @@ import org.w3c.dom.Document; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.xta.client.exception.ClientException; +import de.ozgcloud.xta.client.factory.XdomeaXmlValuesTestFactory; +import de.ozgcloud.xta.client.factory.XtaFileTestFactory; +import de.ozgcloud.xta.client.factory.XtaMessageMetaDataTestFactory; import de.ozgcloud.xta.client.model.XtaFile; import de.ozgcloud.xta.client.model.XtaMessage; import de.ozgcloud.xta.client.model.XtaMessageMetaData; @@ -48,6 +51,9 @@ class XdomeaXtaMessageCreatorTest { @Mock private ZipFileEntryReader zipFileEntryReader; + @Mock + private XdomeaMetaDataValidator metaDataValidator; + @DisplayName("create message") @Nested class TestCreateMessage { @@ -61,7 +67,7 @@ class XdomeaXtaMessageCreatorTest { @BeforeEach @SneakyThrows void mock() { - doReturn(metaData).when(creator).deriveMetaData(xdomeaZipFile); + doReturn(metaData).when(creator).deriveValidMetaData(xdomeaZipFile); } @DisplayName("should return metadata") @@ -94,17 +100,14 @@ class XdomeaXtaMessageCreatorTest { } } - @DisplayName("derive meta data") + @DisplayName("derive valid meta data") @Nested - class TestDeriveMetaData { + class TestDeriveValidMetaData { - @Mock private XtaFile xdomeaZipFile; - @Mock private XdomeaXmlValues xdomeaXmlValues; - @Mock private XtaMessageMetaData metaData; @Mock @@ -113,6 +116,9 @@ class XdomeaXtaMessageCreatorTest { @BeforeEach @SneakyThrows void mock() { + xdomeaZipFile = XtaFileTestFactory.create(); + xdomeaXmlValues = XdomeaXmlValuesTestFactory.create(); + metaData = XtaMessageMetaDataTestFactory.create(); doReturn(xdomeaXmlValues).when(creator).readXdomeaXmlValues(xdomeaZipFile); } @@ -120,19 +126,36 @@ class XdomeaXtaMessageCreatorTest { @Test @SneakyThrows void shouldReturn() { - doReturn(metaData).when(metadataMapper).mapXtaMessageMetadata(xdomeaXmlValues); + mockValidMetadata(); - var result = creator.deriveMetaData(xdomeaZipFile); + var result = creator.deriveValidMetaData(xdomeaZipFile); assertThat(result).isEqualTo(metaData); } + @DisplayName("should validate") + @Test + @SneakyThrows + void shouldValidate() { + mockValidMetadata(); + + creator.deriveValidMetaData(xdomeaZipFile); + + verify(metaDataValidator).validate(xdomeaZipFile, xdomeaXmlValues, metaData); + } + + @SneakyThrows + private void mockValidMetadata() { + doReturn(metaData).when(metadataMapper).mapXtaMessageMetadata(xdomeaXmlValues); + doNothing().when(metaDataValidator).validate(xdomeaZipFile, xdomeaXmlValues, metaData); + } + @DisplayName("should throw client exception") @Test void shouldThrowClientException() { doThrow(technicalException).when(metadataMapper).mapXtaMessageMetadata(xdomeaXmlValues); - assertThatThrownBy(() -> creator.deriveMetaData(xdomeaZipFile)) + assertThatThrownBy(() -> creator.deriveValidMetaData(xdomeaZipFile)) .isInstanceOf(ClientException.class); } @@ -163,7 +186,6 @@ class XdomeaXtaMessageCreatorTest { assertThat(result).isEqualTo(xdomeaXmlValues); } - } @DisplayName("replace filename extension with xml") diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/mapper/MetadataMapperTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/mapper/MetadataMapperTest.java index 25e7a8faa0af6c9591e61d346aaa08c550435092..46ed9f9fbfd4c6e95439562023ea9c723dc7e1d5 100644 --- a/src/test/java/de/ozgcloud/xta/client/xdomea/mapper/MetadataMapperTest.java +++ b/src/test/java/de/ozgcloud/xta/client/xdomea/mapper/MetadataMapperTest.java @@ -14,7 +14,6 @@ import org.mapstruct.factory.Mappers; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.xta.client.factory.XdomeaXmlValuesTestFactory; import de.ozgcloud.xta.client.model.XtaMessageMetaData; -import de.ozgcloud.xta.client.xdomea.reader.XdomeaXmlValues; class MetadataMapperTest { @@ -105,7 +104,7 @@ class MetadataMapperTest { void shouldMapAuthorIdentifierValue(String code) { var metadata = doMapping(code); - assertThat(metadata.authorIdentifier().value()).isEqualTo(AUTHOR_ID_PREFIX + ":" + AUTHOR_ID_SUFFIX); + assertThat(metadata.authorIdentifier().value()).isEqualTo(MetadataMapper.AUTHOR_ID_PREFIX + ":" + AUTHOR_ID_SUFFIX); } @DisplayName("should map author identifier category") @@ -123,7 +122,7 @@ class MetadataMapperTest { void shouldMapReaderIdentifierValue(String code) { var metadata = doMapping(code); - assertThat(metadata.readerIdentifier().value()).isEqualTo(READER_ID_PREFIX + ":" + READER_ID_SUFFIX); + assertThat(metadata.readerIdentifier().value()).isEqualTo(MetadataMapper.READER_ID_PREFIX + ":" + READER_ID_SUFFIX); } @DisplayName("should map reader identifier category") @@ -135,8 +134,6 @@ class MetadataMapperTest { assertThat(metadata.readerIdentifier().category()).isEqualTo(READER_ID_CATEGORY); } - private final XdomeaXmlValues xdomeaXmlValues = XdomeaXmlValuesTestFactory.create(); - @DisplayName("should throw technical exception with unknown message type code") @Test void shouldThrowTechnicalExceptionWithUnknownMessageTypeCode() { @@ -150,10 +147,6 @@ class MetadataMapperTest { .build()); } - - - - } } \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactoryTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactoryTest.java index b9ffaacdf06960efe0a1e61fa2750774924d0e5f..4acd368a45533018285fee40eed16cba77dd36f9 100644 --- a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactoryTest.java +++ b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactoryTest.java @@ -32,30 +32,50 @@ class XdomeaValueReaderFactoryTest { @Nested class TestCreate { + @Mock + XmlValueReader procesIdReader; + @Mock XmlValueReader messageTypeReader; @Mock XmlValueReader authorIdReader; + @Mock + XmlValueReader authorIdPrefixReader; + @Mock XmlValueReader readerIdReader; + @Mock + XmlValueReader readerIdPrefixReader; + + @Mock + XmlValueReader primaryDocumentNameReader; + @DisplayName("should return") @Test @SneakyThrows void shouldReturn() { + doReturn(procesIdReader).when(factory).createXmlValueReader(PROCESS_ID_XPATH); doReturn(messageTypeReader).when(factory).createXmlValueReader(MESSAGE_TYPE_ID_SUFFIX_XPATH); doReturn(authorIdReader).when(factory).createXmlValueReader(AUTHOR_ID_SUFFIX_XPATH); + doReturn(authorIdPrefixReader).when(factory).createXmlValueReader(AUTHOR_ID_PREFIX_XPATH); doReturn(readerIdReader).when(factory).createXmlValueReader(READER_ID_SUFFIX_XPATH); + doReturn(readerIdPrefixReader).when(factory).createXmlValueReader(READER_ID_PREFIX_XPATH); + doReturn(primaryDocumentNameReader).when(factory).createXmlValueReader(PRIMARY_DOCUMENT_NAME_XPATH); var reader = factory.create(); assertThat(reader).usingRecursiveComparison().isEqualTo(XdomeaValueReader.builder() .xmlValueReaders(Map.of( + PROCESS_ID_XPATH, procesIdReader, MESSAGE_TYPE_ID_SUFFIX_XPATH, messageTypeReader, AUTHOR_ID_SUFFIX_XPATH, authorIdReader, - READER_ID_SUFFIX_XPATH, readerIdReader + AUTHOR_ID_PREFIX_XPATH, authorIdPrefixReader, + READER_ID_SUFFIX_XPATH, readerIdReader, + READER_ID_PREFIX_XPATH, readerIdPrefixReader, + PRIMARY_DOCUMENT_NAME_XPATH, primaryDocumentNameReader )).build()); } } diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderTest.java index ec4357bbbffc73ff35af01849c4d90ef7dd6b610..9c72e7ab2ab52438c42b923abbc78b4b519d335e 100644 --- a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderTest.java +++ b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderTest.java @@ -3,8 +3,9 @@ package de.ozgcloud.xta.client.xdomea.reader; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; +import java.util.List; import java.util.Map; -import java.util.Optional; +import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -33,9 +34,13 @@ class XdomeaValueReaderTest { @Nested class TestReadValues { + private static final String PROCESS_ID = "process id"; private static final String MESSAGE_TYPE_CODE = "message type code"; private static final String AUTHOR_ID_SUFFIX = "author id suffix"; + private static final String AUTHOR_ID_PREFIX = "author id prefix"; private static final String READER_ID_SUFFIX = "reader id suffix"; + private static final String READER_ID_PREFIX = "reader id prefix"; + private static final List<String> PRIMARY_DOCUMENT_NAMES = List.of("primary document name"); @Mock Document xdomeaXmlDocument; @@ -43,9 +48,21 @@ class XdomeaValueReaderTest { @BeforeEach @SneakyThrows void mock() { + doReturn(PROCESS_ID).when(xdomeaValueReader).readRequiredValue(xdomeaXmlDocument, XdomeaValueReader.PROCESS_ID_XPATH); doReturn(MESSAGE_TYPE_CODE).when(xdomeaValueReader).readRequiredValue(xdomeaXmlDocument, XdomeaValueReader.MESSAGE_TYPE_ID_SUFFIX_XPATH); doReturn(AUTHOR_ID_SUFFIX).when(xdomeaValueReader).readRequiredValue(xdomeaXmlDocument, XdomeaValueReader.AUTHOR_ID_SUFFIX_XPATH); + doReturn(AUTHOR_ID_PREFIX).when(xdomeaValueReader).readRequiredValue(xdomeaXmlDocument, XdomeaValueReader.AUTHOR_ID_PREFIX_XPATH); doReturn(READER_ID_SUFFIX).when(xdomeaValueReader).readRequiredValue(xdomeaXmlDocument, XdomeaValueReader.READER_ID_SUFFIX_XPATH); + doReturn(READER_ID_PREFIX).when(xdomeaValueReader).readRequiredValue(xdomeaXmlDocument, XdomeaValueReader.READER_ID_PREFIX_XPATH); + doReturn(PRIMARY_DOCUMENT_NAMES).when(xdomeaValueReader).readPrimaryDocumentNames(xdomeaXmlDocument); + } + + @DisplayName("should return process id") + @Test + void shouldReturnProcessId() { + var result = readValues(); + + assertThat(result.processId()).isEqualTo(PROCESS_ID); } @DisplayName("should return message type code") @@ -64,6 +81,14 @@ class XdomeaValueReaderTest { assertThat(result.authorIdSuffix()).isEqualTo(AUTHOR_ID_SUFFIX); } + @DisplayName("should return author id prefix") + @Test + void shouldReturnAuthorIdPrefix() { + var result = readValues(); + + assertThat(result.authorIdPrefix()).isEqualTo(AUTHOR_ID_PREFIX); + } + @DisplayName("should return reader id suffix") @Test void shouldReturnReaderIdSuffix() { @@ -72,12 +97,58 @@ class XdomeaValueReaderTest { assertThat(result.readerIdSuffix()).isEqualTo(READER_ID_SUFFIX); } + @DisplayName("should return reader id prefix") + @Test + void shouldReturnReaderIdPrefix() { + var result = readValues(); + + assertThat(result.readerIdPrefix()).isEqualTo(READER_ID_PREFIX); + } + + @DisplayName("should return primary document names") + @Test + void shouldReturnPrimaryDocumentNames() { + var result = readValues(); + + assertThat(result.primaryDocumentNames()).isEqualTo(PRIMARY_DOCUMENT_NAMES); + } + @SneakyThrows private XdomeaXmlValues readValues() { return xdomeaValueReader.readValues(xdomeaXmlDocument); } } + @DisplayName("read primary document names") + @Nested + class TestReadPrimaryDocumentNames { + + @Mock + XmlValueReader xmlValueReader; + + @Mock + Document xdomeaXmlDocument; + + final String documentName1 = "dou.pdf"; + final String documentName2 = "doc.png"; + + @BeforeEach + void mock() { + doReturn(xmlValueReader).when(xdomeaValueReader).getXmlValueReader(XdomeaValueReader.PRIMARY_DOCUMENT_NAME_XPATH); + } + + @DisplayName("should return") + @Test + @SneakyThrows + void shouldReturn() { + when(xmlValueReader.readNonEmptyTexts(xdomeaXmlDocument)).thenReturn(Stream.of(documentName1, documentName2)); + + var result = xdomeaValueReader.readPrimaryDocumentNames(xdomeaXmlDocument); + + assertThat(result).containsExactly(documentName1, documentName2); + } + } + @DisplayName("read required value") @Nested class TestReadRequiredValue { @@ -99,7 +170,7 @@ class XdomeaValueReaderTest { @Test @SneakyThrows void shouldReturn() { - when(xmlValueReader.readString(xdomeaXmlDocument)).thenReturn(Optional.of(foundValue)); + when(xmlValueReader.readNonEmptyTexts(xdomeaXmlDocument)).thenReturn(Stream.of(foundValue)); var result = xdomeaValueReader.readRequiredValue(xdomeaXmlDocument, XPATH_STRING); @@ -109,7 +180,7 @@ class XdomeaValueReaderTest { @DisplayName("should throw client exception if missing") @Test void shouldThrowClientExceptionIfMissing() { - when(xmlValueReader.readString(xdomeaXmlDocument)).thenReturn(Optional.empty()); + when(xmlValueReader.readNonEmptyTexts(xdomeaXmlDocument)).thenReturn(Stream.empty()); assertThatThrownBy(() -> xdomeaValueReader.readRequiredValue(xdomeaXmlDocument, XPATH_STRING)) .isInstanceOf(ClientException.class); diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReaderFactoryTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReaderFactoryTest.java index 345df89592accc360d48b4696e376d4ff7ce9f3c..b848a3aea0f792d85c9676b501b53c6b7037eae9 100644 --- a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReaderFactoryTest.java +++ b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReaderFactoryTest.java @@ -62,7 +62,7 @@ class XmlValueReaderFactoryTest { var result = factory.create(); assertThat(result).usingRecursiveComparison().isEqualTo(XmlValueReader.builder() - .textXpath(expression) + .xPathExpression(expression) .build()); } diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReaderTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReaderTest.java index ec8631562e1ff698e96313ff0970efb0c5a8448b..aa059508e802f341efb712d056c235a14d33eb9b 100644 --- a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReaderTest.java +++ b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XmlValueReaderTest.java @@ -10,46 +10,46 @@ import org.w3c.dom.Document; public class XmlValueReaderTest { - @DisplayName("read string") + @DisplayName("read non empty texts") @Nested - class TestReadString { + class TestReadNonEmptyTexts { + private static final Document XML_DOCUMENT = createXMLDocument("<root><value attr=\"val\">test</value><value>test2</value></root>"); - private static final Document XML_DOCUMENT = createXMLDocument("<root><value>test</value></root>"); + @DisplayName("should return with two matches") + @Test + void shouldReturnWithTwoMatches() { + var xmlValueReader = createXmlValueReaderWithXPath("/root/value/text()"); - @DisplayName("when xml contains value") - @Nested - class TestWhenXmlContainsValue { + var result = xmlValueReader.readNonEmptyTexts(XML_DOCUMENT); - @DisplayName("should return value") - @Test - void testShouldReturnValue() { - var xmlValueReader = createXmlValueReaderWithXPath("/root/value/text()"); + assertThat(result).containsExactly("test", "test2"); + } - var result = xmlValueReader.readString(XML_DOCUMENT); + @DisplayName("should return with one match") + @Test + void shouldReturnWithOneMatch() { + var xmlValueReader = createXmlValueReaderWithXPath("/root/value[@attr]/text()"); - assertThat(result).contains("test"); - } - } + var result = xmlValueReader.readNonEmptyTexts(XML_DOCUMENT); - @DisplayName("when xml does not contain value") - @Nested - class TestWhenXmlDoesNotContainValue { + assertThat(result).containsExactly("test"); + } - @DisplayName("should return empty") - @Test - void testShouldReturnEmpty() { - var xmlValueReader = createXmlValueReaderWithXPath("/root/missing/text()"); + @DisplayName("should return with no match") + @Test + void shouldReturnWithNoMatch() { + var xmlValueReader = createXmlValueReaderWithXPath("/root/missing/text()"); - var result = xmlValueReader.readString(XML_DOCUMENT); + var result = xmlValueReader.readNonEmptyTexts(XML_DOCUMENT); - assertThat(result).isEmpty(); - } + assertThat(result).isEmpty(); } + } private XmlValueReader createXmlValueReaderWithXPath(String xPathString) { return XmlValueReader.builder() - .textXpath(createXPathExpression(xPathString)) + .xPathExpression(createXPathExpression(xPathString)) .build(); } diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/ZipFileEntryReaderTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/ZipFileEntryReaderTest.java index 31a55f0346f0d6a8fbbd843be14cc4c06843d820..37d1a0346e915cdb7f7ac542cafcbf1c74029470 100644 --- a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/ZipFileEntryReaderTest.java +++ b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/ZipFileEntryReaderTest.java @@ -3,11 +3,13 @@ package de.ozgcloud.xta.client.xdomea.reader; import static de.ozgcloud.xta.client.factory.XtaMessageTestFactory.*; import static org.assertj.core.api.Assertions.*; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.function.Function; import jakarta.activation.DataHandler; +import jakarta.activation.FileDataSource; import jakarta.mail.util.ByteArrayDataSource; import org.junit.jupiter.api.DisplayName; @@ -24,14 +26,13 @@ class ZipFileEntryReaderTest { private final ZipFileEntryReader reader = ZipFileEntryReaderFactory.builder().build().create(); - @DisplayName("map entry data") @Nested class TestMapEntryData { private final Function<InputStream, String> inputStreamConsumer = inputStream -> { try { - var data= inputStream.readAllBytes(); + var data = inputStream.readAllBytes(); return new String(data); } catch (IOException e) { throw new RuntimeException(e); @@ -61,6 +62,35 @@ class ZipFileEntryReaderTest { } } + @DisplayName("get entry names") + @Nested + class TestGetEntryNames { + + @DisplayName("should return entry names") + @Test + void shouldReturnEntryNames() { + var entryNames = reader.getEntryNames(ZIP_FILE); + + assertThat(entryNames).containsExactlyInAnyOrder( + "66a7635a-3872-3519-5ad8-00000000e7db_small_png.png", + "66a76331-3872-3519-5ad8-00000000e7d8_XML-Daten.xml", + "66a76372-3872-3519-5ad8-00000000e7df_Tempo.pdf", + "84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml" + ); + } + + @DisplayName("should throw exception on bad zip file") + @Test + void shouldThrowExceptionOnBadZipFile() { + assertThatThrownBy(() -> reader.getEntryNames(createMissingFileDataHandler())) + .isInstanceOf(TechnicalException.class); + } + + private static DataHandler createMissingFileDataHandler() { + return new DataHandler(new FileDataSource(new File("missing-file"))); + } + } + private static DataHandler createContentDataHandler(byte[] data) { return new DataHandler(new ByteArrayDataSource(data, "application/octet-stream")); } diff --git a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/invalid-Praefix-author.patch b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/invalid-Praefix-author.patch new file mode 100644 index 0000000000000000000000000000000000000000..f93f70208f4fdea2910713f591a1b7b3575045d1 --- /dev/null +++ b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/invalid-Praefix-author.patch @@ -0,0 +1,14 @@ +diff --git a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml +index c225828..e84f63f 100644 +--- a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml ++++ b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml +@@ -11,9 +11,6 @@ + <xdomea:Behoerdenschluessel listURI="urn:de:bund:destatis:bevoelkerungsstatistik:schluessel:rs" listVersionID="2024-02-29"> + <code>${authorIdentifier.value}</code> + </xdomea:Behoerdenschluessel> +- <xdomea:Praefix> +- <code>${authorIdentifier.prefix}:</code> +- </xdomea:Praefix> + </xdomea:Behoerdenkennung> + <xdomea:Organisationseinheit> + <xdomea:Name>9030229</xdomea:Name> diff --git a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/invalid-Praefix-reader.patch b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/invalid-Praefix-reader.patch new file mode 100644 index 0000000000000000000000000000000000000000..9732753faf606714b46f905b4e363b8711e332c6 --- /dev/null +++ b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/invalid-Praefix-reader.patch @@ -0,0 +1,13 @@ +diff --git a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml +index c225828..d7d2c56 100644 +--- a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml ++++ b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml +@@ -25,7 +25,7 @@ + <code>${readerIdentifier.value}</code> + </xdomea:Behoerdenschluessel> + <xdomea:Praefix> +- <code>${readerIdentifier.prefix}:</code> ++ <code>${authorIdentifier.prefix}:</code> + </xdomea:Praefix> + </xdomea:Behoerdenkennung> + </xdomea:Empfaenger> diff --git a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/invalid-ProzessID.patch b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/invalid-ProzessID.patch new file mode 100644 index 0000000000000000000000000000000000000000..9b876572e68157f36e092ca9d293895777ad4fbb --- /dev/null +++ b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/invalid-ProzessID.patch @@ -0,0 +1,13 @@ +diff --git a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml +index cac00bf..d36bfc6 100644 +--- a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml ++++ b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml +@@ -1,7 +1,7 @@ + <?xml version="1.0" encoding="UTF-8" standalone="yes"?> + <xdomea:Abgabe.Abgabe.0401 xmlns:xdomea="urn:xoev-de:xdomea:schema:3.0.0"> + <xdomea:Kopf> +- <xdomea:ProzessID>84be3140-e069-4d4a-80c7-889b5eec539e</xdomea:ProzessID> ++ <xdomea:ProzessID>66a76331-3872-3519-5ad8-00000000e7d7</xdomea:ProzessID> + <xdomea:Nachrichtentyp listURI="urn:xoev-de:xdomea:codeliste:nachrichtentyp" listVersionID="2.0"> + <code>0401</code> + </xdomea:Nachrichtentyp> diff --git a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/invalid-reference-to-primary-document.patch b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/invalid-reference-to-primary-document.patch new file mode 100644 index 0000000000000000000000000000000000000000..dace6391d8f44e1db9e967f0fa40251d7897cb8a --- /dev/null +++ b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/invalid-reference-to-primary-document.patch @@ -0,0 +1,13 @@ +diff --git a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml +index cac00bf..9103baa 100644 +--- a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml ++++ b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml +@@ -164,7 +164,7 @@ + </xdomea:Name> + <xdomea:Version></xdomea:Version> + <xdomea:Primaerdokument> +- <xdomea:Dateiname>66a7635a-3872-3519-5ad8-00000000e7db_small_png.png</xdomea:Dateiname> ++ <xdomea:Dateiname>66a7635a-3872-3519-5ad8-00000000e7db_unkonwn_png.png</xdomea:Dateiname> + <xdomea:DateinameOriginal>small_png.png</xdomea:DateinameOriginal> + </xdomea:Primaerdokument> + </xdomea:Format> diff --git a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml index d36bfc6e632f53d2a209f267528e2e54dbf943e8..c22582872b74b0b004708c41d21f1150279c1779 100644 --- a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml +++ b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xdomea:Abgabe.Abgabe.0401 xmlns:xdomea="urn:xoev-de:xdomea:schema:3.0.0"> <xdomea:Kopf> - <xdomea:ProzessID>66a76331-3872-3519-5ad8-00000000e7d7</xdomea:ProzessID> + <xdomea:ProzessID>84be3140-e069-4d4a-80c7-889b5eec539e</xdomea:ProzessID> <xdomea:Nachrichtentyp listURI="urn:xoev-de:xdomea:codeliste:nachrichtentyp" listVersionID="2.0"> <code>0401</code> </xdomea:Nachrichtentyp> @@ -11,6 +11,9 @@ <xdomea:Behoerdenschluessel listURI="urn:de:bund:destatis:bevoelkerungsstatistik:schluessel:rs" listVersionID="2024-02-29"> <code>${authorIdentifier.value}</code> </xdomea:Behoerdenschluessel> + <xdomea:Praefix> + <code>${authorIdentifier.prefix}:</code> + </xdomea:Praefix> </xdomea:Behoerdenkennung> <xdomea:Organisationseinheit> <xdomea:Name>9030229</xdomea:Name> @@ -21,6 +24,9 @@ <xdomea:Behoerdenschluessel listURI="urn:de:bund:destatis:bevoelkerungsstatistik:schluessel:rs" listVersionID="2024-02-29"> <code>${readerIdentifier.value}</code> </xdomea:Behoerdenschluessel> + <xdomea:Praefix> + <code>${readerIdentifier.prefix}:</code> + </xdomea:Praefix> </xdomea:Behoerdenkennung> </xdomea:Empfaenger> <xdomea:SendendesSystem> diff --git a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/valid-ignored-schemaLocation.patch b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/valid-ignored-schemaLocation.patch new file mode 100644 index 0000000000000000000000000000000000000000..d5a55d33ab3f4e5f3395dafee440c446041daa45 --- /dev/null +++ b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/valid-ignored-schemaLocation.patch @@ -0,0 +1,14 @@ +diff --git a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml +index c225828..9667727 100644 +--- a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml ++++ b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml +@@ -1,5 +1,8 @@ + <?xml version="1.0" encoding="UTF-8" standalone="yes"?> +-<xdomea:Abgabe.Abgabe.0401 xmlns:xdomea="urn:xoev-de:xdomea:schema:3.0.0"> ++<xdomea:Abgabe.Abgabe.0401 xmlns:xdomea="urn:xoev-de:xdomea:schema:3.0.0" ++ xmlns:xoev-code="http://xoev.de/schemata/code/1_0" ++ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ++ xsi:schemaLocation="http://xoev.de/schemata/code/1_0 http://xoev.de/schemata/code/1_0/xoev-code.xsd"> + <xdomea:Kopf> + <xdomea:ProzessID>84be3140-e069-4d4a-80c7-889b5eec539e</xdomea:ProzessID> + <xdomea:Nachrichtentyp listURI="urn:xoev-de:xdomea:codeliste:nachrichtentyp" listVersionID="2.0"> diff --git a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/valid-unknown-namespaces.patch b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/valid-unknown-namespaces.patch new file mode 100644 index 0000000000000000000000000000000000000000..94d0fd36d88466d6c52e43115ad4541858a4390f --- /dev/null +++ b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/valid-unknown-namespaces.patch @@ -0,0 +1,308 @@ +diff --git a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml +index c225828..42776d0 100644 +--- a/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml ++++ b/src/test/resources/messages/abgabe0401-kleiner-waffenschein/message/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.zip/84be3140-e069-4d4a-80c7-889b5eec539e_Abgabe.Abgabe.0401.xml +@@ -1,5 +1,5 @@ + <?xml version="1.0" encoding="UTF-8" standalone="yes"?> +-<xdomea:Abgabe.Abgabe.0401 xmlns:xdomea="urn:xoev-de:xdomea:schema:3.0.0"> ++<xdomea:Abgabe.Abgabe.0401 xmlns:xoev-code="http://xoev.de/schemata/code/1_0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xoev-lc="http://xoev.de/latinchars/1_1/datatypes" xmlns:dinspec91379="urn:xoev-de:kosit:xoev:datentyp:din-spec-91379_2019-03" xmlns:xdomea="urn:xoev-de:xdomea:schema:3.0.0" xmlns:ns3="urn:ozgcloud-de:xdomea:schema:1.0.0"> + <xdomea:Kopf> + <xdomea:ProzessID>84be3140-e069-4d4a-80c7-889b5eec539e</xdomea:ProzessID> + <xdomea:Nachrichtentyp listURI="urn:xoev-de:xdomea:codeliste:nachrichtentyp" listVersionID="2.0"> +@@ -310,6 +310,296 @@ Ihre Verwaltung</xdomea:MetadatumName> + </xdomea:Feldgruppe> + </xdomea:AnwendungsspezifischeErweiterung> + <xdomea:AnwendungsspezifischeErweiterungXML> ++ <ns3:Antragsdaten> ++ <ns3:Item xsi:type="ns3:AntragsdatenGroupType" name="empfangendestelle" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="telefaxnummer"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">+49 431 530550-99</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="emailadresse"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">info@ea-sh.de</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="strasse"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Deliusstraße</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="od_zustellung_nb"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">afmsh:9068873_AusnahmeLKWFahrverbot</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="OrganisationseinheitenAuswahl"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">9068873</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="OrganisationseinheitenID"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">9068873</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="ort"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Kiel</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="postleitzahl"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">24114</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="od_kennung"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">afmsh:9068873_AusnahmeLKWFahrverbot</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="od_vorhanden"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">false</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="od_typid"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">233034600</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="demailadresse"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">ea-poststelle@ea-sh.de-mail.de</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="hausnummer"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">10</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="telefonnummer"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">+49 431 530550-0</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="OrganisationseinheitenBEZEICHNUNG"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Einheitlicher Ansprechpartner Schleswig-Holstein</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="ortID"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">9006402</ns3:Value> ++ </ns3:Item> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="mailboxguid" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">b3849f0e-d0c2-4e20-b5f0-a77cf8ad5e87</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="KontaktsystemTypB" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">233034601</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="GebietID" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">9007404</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenGroupType" name="erklaerungen" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="b_datenschutz"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">* Ich erkläre mich damit einverstanden, dass der Einheitlicher Ansprechpartner Schleswig-Holstein zur Erfüllung seiner Aufgaben meine Daten unter Einhaltung der Bestimmungen der Datenschutz-Grundverordnung (DS-GVO) und des Landesdatenschutzgesetzes Schleswig-Holstein (LDSG-SH) speichert, verarbeitet und diese im Rahmen der gesetzlichen Bestimmungen an die für die Entscheidung zuständige Stelle weiterleitet. Ebenso bin ich mit der rechtskonformen Datenverarbeitung und Speicherung durch die zuständige Stelle einverstanden. Mir ist bekannt, dass ich die Einwilligung in die Verarbeitung und Übermittlung jederzeit gegenüber dem Einheitlicher Ansprechpartner Schleswig-Holstein, Deliusstraße 10, 24114 Kiel widerrufen kann. Ein Widerruf ist aber nur wirksam für die Zukunft. Verarbeitungen, die vor dem Widerruf erfolgt sind, sind davon nicht betroffen. Über die Verarbeitung meiner personenbezogenen Daten und die mir nach den datenschutzrechtlichen Regelungen zustehenden Ansprüche und Rechte habe ich unter Datenschutzerklärung Kenntnis erlangt.</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="policyurl"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">http://wafmxqa002.dpaor.de/sh/datenschutz/datenschutzerklaerungEA_de.doc</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="b_richtigkeit"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">* Ich bestätige die Richtigkeit meiner Angaben.</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="check_datenschutz"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">true</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="b_gebuehren_beschriftung"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">* Mir ist bekannt, dass durch das Einreichen des elektronischen Antrages von der zuständigen Stelle Gebühren erhoben werden können.</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="b_gebuehren_intro"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Gebühr bei Ausstellung des kleinen Waffenscheins: 60,00 Euro. Bearbeitungsgebühr bei Versagung: 45,00 Euro. Sie sind gemäß § 39 WaffG verpflichtet, der zuständigen Behörde die zur Durchführung des Gesetzes erforderlichen Auskünfte zu erteilen. Zur Prüfung Ihrer waffenrechtlichen Zuverlässigkeit und Eignung holt die Behörde eine unbeschränkte Auskunft aus dem Bundeszentralregister, eine Auskunft aus dem zentralen staatsanwaltschaftlichen Verfahrensregister, eine Stellungnahme der örtlichen Polizeidienststelle und Ihrer Wohnsitzgemeinde ein.</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="check_gebuehren"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">true</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="check_richtigkeit"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">true</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="b_missbrauch"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">* Mir ist bekannt, dass zur Verfolgung widerrechtlicher Nutzung die Daten meines zur Dateneingabe genutzten Endgerätes aufgezeichnet und verwendet werden können.</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="check_missbrauch"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">true</ns3:Value> ++ </ns3:Item> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="KontaktsystemTypA" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">233034600</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenGroupType" name="fm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Item xsi:type="ns3:AntragsdatenGroupType" name="ansprechpartner"> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="familienname"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">TestNachname</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="vorname"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">TestVorname</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="anrede"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Herr</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenGroupType" name="kontakt"> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="emailadresse"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">oliver.charlet@dataport.de</ns3:Value> ++ </ns3:Item> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenGroupType" name="anschrift"> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="ort"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Bad Segeberg</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="postleitzahl"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">23795</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="strasse"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Teststrasse</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="hausnummer"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">1000</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="staat"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Deutschland</ns3:Value> ++ </ns3:Item> ++ </ns3:Item> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenGroupType" name="verwaltungsleistungen"> ++ <ns3:Item xsi:type="ns3:AntragsdatenGroupType" name="verwaltungsleistung"> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="AnliegenBEZEICHNUNG"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Waffenschein / Kleiner Waffenschein</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="GebietID"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">9007404</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="GebietBEZEICHNUNG"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Bad Segeberg</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="leikaKEYLIST"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">99089122001000</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="AnliegenID"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">8966671</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenGroupType" name="ausgewaehlte_zustaendigestelle"> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="OrganisationseinheitenBEZEICHNUNG"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Kreis Segeberg - Jagd- und Waffenbehörde</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="OrganisationseinheitenID"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">9030229</ns3:Value> ++ </ns3:Item> ++ </ns3:Item> ++ </ns3:Item> ++ </ns3:Item> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenGroupType" name="header" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="t:client-id"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">land</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="t:id"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">kleinerWaffenschein-XglJWsVq</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="t:client"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Schleswig-Holstein</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="t:form"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Kleiner Waffenschein</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="t:form-id"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">waffen/kleinerWaffenscheinKOPutopia</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="t:sender"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">stage.afm.schleswig-holstein.de</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="t:customer-id"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">ea-sh</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="t:timestamp"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">2024-07-29T11:38:56.952+02:00</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="t:customer"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Einheitlicher Ansprechpartner</ns3:Value> ++ </ns3:Item> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenGroupType" name="zustaendigestelle" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="emailadresse"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">ordnung@segeberg.de</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="leikaKEYLIST"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">99089122001000</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="strasse"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Hamburger Straße</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="OrganisationseinheitenAuswahl"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">266531855</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="OrganisationseinheitenID"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">9030229</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="ort"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Bad Segeberg</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="AnliegenBEZEICHNUNG"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Waffenschein / Kleiner Waffenschein</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="postleitzahl"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">23795</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="auswahl_zustellung"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">abholen</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="hausnummer"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">30</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="b_zustellung"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Ich hole den Kleinen Waffenschein selbst ab.</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="OrganisationseinheitenBEZEICHNUNG"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Kreis Segeberg - Jagd- und Waffenbehörde</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="ortID"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">9007404</ns3:Value> ++ </ns3:Item> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="KommuneOrgansationseinheitenID" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">9068873</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="logourl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">http://wafmxqa002.dpaor.de/sh/logos/kopf_9068873.doc</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="AnliegenID" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">8966671</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="b_geburtsland" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Deutschland</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="ort_auswahl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">9007404$01060005</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="b_staatsangehoerigkeit_signatur" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">000</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="b_staatsangehoerigkeit" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">deutsch</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="GebietBEZEICHNUNG" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Bad Segeberg</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="pers_geburtsland" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">deutsch$Deutschland$000</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="b_anrede_schluesselnr" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">03</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="pers_anrede" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">Herr$03</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="iso3166numerisch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">276</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="b_geburtsland_signatur" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">000</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="GebietID" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">9007404</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="pers_staatsangehoerigkeit" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">deutsch$Deutschland$000</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="staat" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">000</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="GebietGNR94_GNR" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">01060005</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenGroupType" name="persoenlicheEignung" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="MitgliedschaftInVerboternerVereinigung"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">false</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="maengelvorhanden"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">false</ns3:Value> ++ </ns3:Item> ++ <ns3:Item xsi:type="ns3:AntragsdatenSingleValueFieldType" type="string" name="ermittlungsverfahren"> ++ <ns3:Value xsi:type="ns9:string" xmlns:ns9="http://www.w3.org/2001/XMLSchema">false</ns3:Value> ++ </ns3:Item> ++ </ns3:Item> ++ </ns3:Antragsdaten> + </xdomea:AnwendungsspezifischeErweiterungXML> + </xdomea:Vorgang> + </xdomea:Schriftgutobjekt> diff --git a/src/test/resources/messages/dfoerdermittel/invalid-Kennung-missing.patch b/src/test/resources/messages/dfoerdermittel/invalid-Kennung-missing.patch new file mode 100644 index 0000000000000000000000000000000000000000..2fb95620989a05e034fd84de03a7f0ff1bbad7a9 --- /dev/null +++ b/src/test/resources/messages/dfoerdermittel/invalid-Kennung-missing.patch @@ -0,0 +1,14 @@ +diff --git a/src/test/resources/messages/dfoerdermittel/message/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.zip/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml b/src/test/resources/messages/dfoerdermittel/message/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.zip/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml +index 7815e7b..82dd9db 100644 +--- a/src/test/resources/messages/dfoerdermittel/message/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.zip/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml ++++ b/src/test/resources/messages/dfoerdermittel/message/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.zip/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml +@@ -10,9 +10,6 @@ + <Erstellungszeitpunkt>2023-04-04T06:59:15.4231885+02:00</Erstellungszeitpunkt> + <Absender> + <Behoerdenkennung> +- <Kennung listURI="" listVersionID=""> +- <code xmlns="">${authorIdentifier.value}</code> +- </Kennung> + <Praefix listURI="" listVersionID=""> + <code xmlns="">${authorIdentifier.prefix}</code> + </Praefix> diff --git a/src/test/resources/messages/dfoerdermittel/valid-behoerdenkennung-name.patch b/src/test/resources/messages/dfoerdermittel/valid-behoerdenkennung-name.patch new file mode 100644 index 0000000000000000000000000000000000000000..61f1f0617d27570ef47353135bc6b08005d42a61 --- /dev/null +++ b/src/test/resources/messages/dfoerdermittel/valid-behoerdenkennung-name.patch @@ -0,0 +1,16 @@ +diff --git a/src/test/resources/messages/dfoerdermittel/message/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.zip/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml b/src/test/resources/messages/dfoerdermittel/message/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.zip/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml +index 7815e7b..23763f3 100644 +--- a/src/test/resources/messages/dfoerdermittel/message/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.zip/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml ++++ b/src/test/resources/messages/dfoerdermittel/message/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.zip/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml +@@ -12,9 +12,11 @@ + <Behoerdenkennung> + <Kennung listURI="" listVersionID=""> + <code xmlns="">${authorIdentifier.value}</code> ++ <name xmlns="">An optional description of the value</name> + </Kennung> + <Praefix listURI="" listVersionID=""> + <code xmlns="">${authorIdentifier.prefix}</code> ++ <name xmlns="">An optional description of the prefix</name> + </Praefix> + </Behoerdenkennung> + </Absender>