Skip to content

Commit

Permalink
Merge pull request #467 from slovensko-digital/fix/orsr-standalone-forms
Browse files Browse the repository at this point in the history
Fix ORSR forms standalone and API
  • Loading branch information
celuchmarek authored Jun 27, 2024
2 parents b7dfbc6 + 00cc542 commit fa0c8f3
Show file tree
Hide file tree
Showing 7 changed files with 1,723 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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);

Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 <?xml-stylesheet> 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;
}

Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,9 @@ public boolean findResources() throws XMLValidationException {

return true;
}

@Override
public String getIdentifier() {
return "http://www.justice.gov.sk/Forms";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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")) {

Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -289,12 +289,14 @@ public static Stream<InMemoryDocument> validCadesDocumentsProvider() throws IOEx
public static Stream<InMemoryDocument> 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)
);
Expand Down
Loading

0 comments on commit fa0c8f3

Please sign in to comment.