public void validate(String message, CombinedXmlValidationProfile profile) throws ValidationException { requireNonNull(profile, "validation profile must be not null"); // check whether the root element name is valid String rootElementName = rootElementName(requireNonNull(message, "message must be not null")); if (! profile.isValidRootElement(rootElementName)) { throw new ValidationException("Invalid root element '" + rootElementName + "'"); } // XSD validation String xsdPath = profile.getXsdPath(rootElementName); if (xsdPath != null) { XSD_VALIDATOR.validate(source(message), xsdPath); } // Schematron validation String schematronPath = profile.getSchematronPath(rootElementName); if (schematronPath != null) { SchematronProfile schematronProfile = new SchematronProfile( schematronPath, profile.getCustomSchematronParameters(rootElementName)); SCHEMATRON_VALIDATOR.validate(source(message), schematronProfile); } } }
@Override public void audit(AuditContext auditContext, AuditMessage... auditMessages) { for (AuditMessage message : auditMessages) { String s = Current.toString(message, true); log.debug(s); if (needValidation) { validator.validate(source(s), NEW_VALIDATION_SCHEMA); } messages.add(message); } }
@Test public void testXml() throws Exception { QueryRegistry queryRegistry = SampleData.createFetchQuery(); FetchQuery query = (FetchQuery) queryRegistry.getQuery(); assertEquals(Timestamp.Precision.YEAR, query.getCreationTime().getFrom().getPrecision()); query.getCreationTime().getFrom().setPrecision(null); Element element = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument().createElement("dummy"); JAXBContext jaxbContext = JAXBContext.newInstance(QueryRegistry.class); jaxbContext.createMarshaller().marshal(query, element); String s = new String(XmlUtils.serialize(element.getFirstChild())); assertTrue(s.contains("<xds:from dateTime=\"1980-01-01T00:00:00Z\"/>")); assertTrue(s.contains("<xds:to dateTime=\"1981-01-01T00:00:00Z\" precision=\"YEAR\"/>")); s = s.replace("precision=\"YEAR\"", "precision=\"some garbage\""); ByteArrayInputStream stream = new ByteArrayInputStream(s.getBytes()); FetchQuery query1 = (FetchQuery) jaxbContext.createUnmarshaller().unmarshal(stream); assertEquals(Timestamp.Precision.SECOND, query1.getCreationTime().getFrom().getPrecision()); assertEquals(Timestamp.Precision.SECOND, query1.getCreationTime().getTo().getPrecision()); }