diff --git a/src/main/java/digital/slovensko/autogram/core/eforms/EFormResourcesBuilder.java b/src/main/java/digital/slovensko/autogram/core/eforms/EFormResourcesBuilder.java index bc252f43..cd7c026a 100644 --- a/src/main/java/digital/slovensko/autogram/core/eforms/EFormResourcesBuilder.java +++ b/src/main/java/digital/slovensko/autogram/core/eforms/EFormResourcesBuilder.java @@ -10,6 +10,7 @@ import eu.europa.esig.dss.model.DSSDocument; +import org.w3c.dom.Document; import org.w3c.dom.Element; public abstract class EFormResourcesBuilder { @@ -28,10 +29,10 @@ public static EFormResources build(DSSDocument document, String fsFormId, String public static EFormResources buildFromDocument(DSSDocument document, String fsFormId, String propertiesCanonicalization, String xsdIdentifier, XsltParams xsltParams) throws AutogramException { - var xml = getXmlFromDocument(document).getDocumentElement(); + var xml = getXmlFromDocument(document); EFormResources eformResources; if (isXDC(document.getMimeType())) - eformResources = buildFromXDC(xml, propertiesCanonicalization); + eformResources = buildFromXDC(xml.getDocumentElement(), propertiesCanonicalization); else eformResources = buildFromEFormXml(xml, propertiesCanonicalization, xsdIdentifier, xsltParams, fsFormId); @@ -76,7 +77,7 @@ private static EFormResources buildFromXDC(Element xdc, String canonicalizationM return buildFromEFormXml(canonicalizationMethod, formUri, xsdDigest, xsltDigest, xsdIdentifier, params); } - private static EFormResources buildFromEFormXml(Element xml, String canonicalizationMethod, String xsdIdentifier, XsltParams xsltParams, String fsFormId) + private static EFormResources buildFromEFormXml(Document xml, String canonicalizationMethod, String xsdIdentifier, XsltParams xsltParams, String fsFormId) throws XMLValidationException, UnknownEformException { if (fsFormId != null) return FsEFormResources.buildFromFsFormId(fsFormId, canonicalizationMethod, null, null); diff --git a/src/main/java/digital/slovensko/autogram/core/eforms/EFormUtils.java b/src/main/java/digital/slovensko/autogram/core/eforms/EFormUtils.java index ba3b420b..0387d5e6 100644 --- a/src/main/java/digital/slovensko/autogram/core/eforms/EFormUtils.java +++ b/src/main/java/digital/slovensko/autogram/core/eforms/EFormUtils.java @@ -197,15 +197,26 @@ public static String getFormUri(Element xdc) { return xsiSchemaLocationNode.getNodeValue(); } - public static String getNamespaceFromEformXml(Node xml) { - var xmlns = xml.getAttributes().getNamedItem("xmlns"); - if (xmlns != null) + public static String getNamespaceFromEformXml(Document xml) { + var xmlns = xml.getDocumentElement().getAttributes().getNamedItem("xmlns"); + // Never use justice.gov.sk as identifier + if (xmlns != null && !xmlns.getNodeValue().contains("justice.gov.sk")) return xmlns.getNodeValue(); - xmlns = xml.getAttributes().getNamedItemNS("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation"); + xmlns = xml.getDocumentElement().getAttributes().getNamedItemNS("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation"); if (xmlns != null) return xmlns.getNodeValue(); + // extract "href" attribute from element + var nodes = xml.getChildNodes(); + for (var i = 0; i < nodes.getLength(); i++) + if (nodes.item(i).getNodeType() == Node.PROCESSING_INSTRUCTION_NODE && nodes.item(i).getNodeName().equals("xml-stylesheet")) + for (var attribute : nodes.item(i).getNodeValue().split("\\s+")) { + var keyValue = attribute.split("="); + if (keyValue.length == 2 && "href".equals(keyValue[0])) + return keyValue[1].replace("\"", "").replace(".xslt", ".xsd"); + } + return null; } @@ -353,7 +364,7 @@ public static String fillXsdIdentifier(String formIdentifier) { } public static boolean isOrsrUri(String uri) { - return uri != null && uri.contains("://eformulare.justice.sk"); + return uri != null && (uri.contains("://eformulare.justice.sk") || uri.contains("justice.gov.sk/")); } public static String getFsFormIdFromFilename(String filename) { diff --git a/src/main/java/digital/slovensko/autogram/core/eforms/OrsrEFormResources.java b/src/main/java/digital/slovensko/autogram/core/eforms/OrsrEFormResources.java index 9b580466..fd5f0783 100644 --- a/src/main/java/digital/slovensko/autogram/core/eforms/OrsrEFormResources.java +++ b/src/main/java/digital/slovensko/autogram/core/eforms/OrsrEFormResources.java @@ -38,4 +38,9 @@ public boolean findResources() throws XMLValidationException { return true; } + + @Override + public String getIdentifier() { + return "http://www.justice.gov.sk/Forms"; + } } diff --git a/src/main/java/digital/slovensko/autogram/core/eforms/dto/EFormAttributes.java b/src/main/java/digital/slovensko/autogram/core/eforms/dto/EFormAttributes.java index 36f4e2aa..73c89d4f 100644 --- a/src/main/java/digital/slovensko/autogram/core/eforms/dto/EFormAttributes.java +++ b/src/main/java/digital/slovensko/autogram/core/eforms/dto/EFormAttributes.java @@ -34,8 +34,11 @@ private static EFormAttributes build(String identifier, String transformation, S } } - if (transformation != null) + if (transformation != null) { xsltParams = EFormUtils.fillXsltParams(transformation, identifier, xsltParams); + if (!transformation.isEmpty() && transformation.charAt(0) == '\uFEFF') + transformation = transformation.substring(1); + } if (containerXmlns != null && containerXmlns.contains("xmldatacontainer")) { @@ -52,6 +55,9 @@ private static EFormAttributes build(String identifier, String transformation, S throw new EFormException("Chýba identifikátor", "Identifikátor je povinný atribút pre XML Datacontainer"); } + if (EFormUtils.isOrsrUri(identifier)) + embedUsedSchemas = true; + return new EFormAttributes(identifier, transformation, schema, containerXmlns, xsdIdentifier, xsltParams, embedUsedSchemas); } } diff --git a/src/main/java/digital/slovensko/autogram/core/eforms/xdc/XDCBuilder.java b/src/main/java/digital/slovensko/autogram/core/eforms/xdc/XDCBuilder.java index b02de589..b061a9a6 100644 --- a/src/main/java/digital/slovensko/autogram/core/eforms/xdc/XDCBuilder.java +++ b/src/main/java/digital/slovensko/autogram/core/eforms/xdc/XDCBuilder.java @@ -103,11 +103,10 @@ private static Element createXMLData(Document document, String identifierUri, St boolean shouldEmbedSchemas) { var element = document.createElement("xdc:XMLData"); element.setAttribute("ContentType", "application/xml; charset=UTF-8"); + element.setAttribute("Identifier", identifierUri); - if (!shouldEmbedSchemas) { - element.setAttribute("Identifier", identifierUri); + if (!shouldEmbedSchemas) element.setAttribute("Version", identifierVersion); - } return element; } diff --git a/src/test/java/digital/slovensko/autogram/TestMethodSources.java b/src/test/java/digital/slovensko/autogram/TestMethodSources.java index c6a56f5c..5dec48f3 100644 --- a/src/test/java/digital/slovensko/autogram/TestMethodSources.java +++ b/src/test/java/digital/slovensko/autogram/TestMethodSources.java @@ -289,12 +289,14 @@ public static Stream validCadesDocumentsProvider() throws IOEx public static Stream orsrDocumentsProvider() throws IOException { var fupaXml = cls.getResourceAsStream("FUPA.xml").readAllBytes(); var fupsXml = cls.getResourceAsStream("FUPS.xml").readAllBytes(); + var fuzsNewXml = cls.getResourceAsStream("fuzs_new.xml").readAllBytes(); var fupsXdcXml = cls.getResourceAsStream("FUPS.xdc.xml").readAllBytes(); var fupsXdcNoNamespaceXml = cls.getResourceAsStream("FUPS_wo_namespace.xdc.xml").readAllBytes(); return Stream.of( new InMemoryDocument(fupaXml, "FUPA.xml", MimeTypeEnum.XML), new InMemoryDocument(fupsXml, "FUPS.xml", MimeTypeEnum.XML), + new InMemoryDocument(fuzsNewXml, "fuzs_new.xml", MimeTypeEnum.XML), new InMemoryDocument(fupsXdcXml, "FUPS.xdc.xml", MimeTypeEnum.XML), new InMemoryDocument(fupsXdcNoNamespaceXml, "FUPS_wo_namespace.xdc.xml", MimeTypeEnum.XML) ); diff --git a/src/test/resources/digital/slovensko/autogram/fuzs_new.xml b/src/test/resources/digital/slovensko/autogram/fuzs_new.xml new file mode 100644 index 00000000..10fd772e --- /dev/null +++ b/src/test/resources/digital/slovensko/autogram/fuzs_new.xml @@ -0,0 +1,1687 @@ + + + + + + + + + 1.0.0.1137 + ZSRO + + + + + + 0bd016e3-7bd1-4b62-bc05-4335625b55a3 + + + + 0 + true + + + Mestský súd Bratislava III + Námestie Biely Kríž + 7 + Bratislava III + 83607 + 2 + B + + + + + + + Place holder, s.r.o. + Bratislava + 2024-06-24 + true + false + + + 3 + Sro + + 12345 + B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Place Holder, s.r.o. + 12345678 + + + Test + 123 + + 529397 + + Bratislava - mestská časť Karlova Ves + + + 84104 + + 703 + Slovenská republika + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + None + + + + + + + + + + + + + + + + + + + + + + + + + None + + + + + + + + + + + + + + + + + + + + + + + + + None + + + + + + + + + + + + + + + + + + + + + + + + + + + None + + + + + + + + + + + + + + + + + + + + + + + + + None + + + + + + + + + + + + + + + + + + + + + + + + + + + None + + + + + + + + + + + + + + + + + + + + + + + + + None + + + + + + + + + + + + + + + + + + + + + + + + + + + None + + + + + + + + + + + + + + + + + + + + + + + + + None + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file