# HG changeset patch # User Mike Becker # Date 1706362089 -3600 # Node ID 1e852be126546f5a8e9436239aae5b72f8e4a0a7 # Parent a47b92fab3bd4dc75926c654b38662081c078938 adds schema validation - fixes #291 diff -r a47b92fab3bd -r 1e852be12654 src/main/java/de/unixwork/uwproj/Main.java --- a/src/main/java/de/unixwork/uwproj/Main.java Sat Jan 27 12:29:50 2024 +0100 +++ b/src/main/java/de/unixwork/uwproj/Main.java Sat Jan 27 14:28:09 2024 +0100 @@ -2,7 +2,13 @@ import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; +import org.xml.sax.SAXException; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.SchemaFactory; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; @@ -19,8 +25,27 @@ public final static String OUT_FILE_DEFAULT = "configure"; static Project loadProjectFile(String fileName) { - try { - return new Project(new File(fileName)); + try (final var xsdResource = Objects.requireNonNull(Main.class.getClassLoader().getResourceAsStream("make/uwproj.xsd"))) { + // Create the XSD validator + final var factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + final var schema = factory.newSchema(new StreamSource(xsdResource)); + final var validator = schema.newValidator(); + + // Load the DOM from the input file + final var dom = DocumentBuilderFactory. + newDefaultNSInstance(). + newDocumentBuilder(). + parse(fileName). + getDocumentElement(); + + // Validate the XML + validator.validate(new DOMSource(dom)); + + // Parse the XML + return new Project(dom); + } catch (SAXException saxerror) { + System.err.println(saxerror.getMessage()); + throw new RuntimeException("XML validation failed."); } catch (Exception e) { throw new RuntimeException(e); } diff -r a47b92fab3bd -r 1e852be12654 src/main/java/de/unixwork/uwproj/Project.java --- a/src/main/java/de/unixwork/uwproj/Project.java Sat Jan 27 12:29:50 2024 +0100 +++ b/src/main/java/de/unixwork/uwproj/Project.java Sat Jan 27 14:28:09 2024 +0100 @@ -22,12 +22,7 @@ private final Set lang; - public Project(File file) throws Exception { - var root = DocumentBuilderFactory. - newDefaultNSInstance(). - newDocumentBuilder(). - parse(file). - getDocumentElement(); + public Project(Element root) throws Exception { NodeList dependency_nodes = root.getElementsByTagName("dependency"); NodeList target_nodes = root.getElementsByTagName("target"); NodeList config_nodes = root.getElementsByTagName("config");