Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
package com.marginallyclever.makelangelo;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import static com.marginallyclever.makelangelo.TranslationsMissingTest.listFiles;
import static org.junit.jupiter.api.Assertions.*;
public class LanguagesXmlValidationForNoDupKeyTest {
private static final Logger logger = LoggerFactory.getLogger(LanguagesXmlValidationForNoDupKeyTest.class);
public final static String ressourceStringForXmlShemaFile = "/translator/language_no_dup_key.xsd";
@Test
public void validateLaguagesXmlFiles() throws IOException {
List<String> xmlFilesWithValidationDefect = new ArrayList<>();
File srcDir = new File("src" + File.separator + "main" + File.separator + "resources" + File.separator + "languages");
// Pre requi
// //URL schemaFile = new File("src/test/resources/translator/language_no_dup_key.xsd").toURI().toURL();
URL schemaFile = LanguagesXmlValidationForNoDupKeyTest.class.getResource(ressourceStringForXmlShemaFile);
// Pre requi schema xsd file
assertNotNull(schemaFile, "The test need a redable schema xsd file (" + ressourceStringForXmlShemaFile + ") to validate the language files");
// Pre requi some language xml file to test
List<File> files = listFiles(srcDir.toPath(), ".xml");
// assert some files
// ?TODO
// valide the files found
files.forEach(file -> {
boolean isValide = xmlValidationWithExternalXsdShema(file, schemaFile);
if (!isValide) {
xmlFilesWithValidationDefect.add(file.toString());
}
});
StringBuilder sb = new StringBuilder();
if (!xmlFilesWithValidationDefect.isEmpty()) {
logger.info("invalide with " + ressourceStringForXmlShemaFile + " :");
for (String result : xmlFilesWithValidationDefect) {
sb.append(" ");
sb.append(result);
sb.append("\n");
logger.info(" {}", result);
}
}
assertEquals(0, xmlFilesWithValidationDefect.size(), "Some language xml file do not validate with " + ressourceStringForXmlShemaFile + "\n" + sb.toString() + ", see previous logs for details");
}
@Test
public void verifyThatValidationWorks_notvalide() throws IOException {
URL schemaFile = LanguagesXmlValidationForNoDupKeyTest.class.getResource(ressourceStringForXmlShemaFile);
assertNotNull(schemaFile, "The test need a redable schema xsd file (" + ressourceStringForXmlShemaFile + ") to validate the language files");
String myTestFileWithWithDupKeyInRessources = "/translator/english_with_dup_key.xml";
URL resource = LanguagesXmlValidationForNoDupKeyTest.class.getResource(myTestFileWithWithDupKeyInRessources);
assertNotNull(resource, "The test need a redable xml file (" + myTestFileWithWithDupKeyInRessources + ") to test itself");
// english_with_dup_key.xml contains some duplicated an en empty key //language/string/key
boolean isValide = xmlValidationWithExternalXsdShema(new File(resource.getFile()), schemaFile);
assertTrue(!isValide);
}
@Test
public void verifyThatValidationWorks_valide() throws IOException {
URL schemaFile = LanguagesXmlValidationForNoDupKeyTest.class.getResource(ressourceStringForXmlShemaFile);
assertNotNull(schemaFile, "The test need a redable schema xsd file (" + ressourceStringForXmlShemaFile + ") to validate the language files");
String myTestFileWithNoDupKeyInRessources = "/translator/english_with_no_dup_key.xml";
URL resource = LanguagesXmlValidationForNoDupKeyTest.class.getResource(myTestFileWithNoDupKeyInRessources);
assertNotNull(resource, "The test need a redable xml file (" + myTestFileWithNoDupKeyInRessources + ") to test itself");
// english_with_no_dup_key.xml do not containe duplicated or empty //language/string/key
boolean isValide = xmlValidationWithExternalXsdShema(new File(resource.getFile()), schemaFile);
assertTrue(isValide);
}
/**
* Validate an xml file with an external xsd Schema. src inspiration :
* https://stackoverflow.com/questions/15732/whats-the-best-way-to-validate-an-xml-file-against-an-xsd-file
*
* @param xmlFileToValidate the xml file to validate.
* @param schemaFile the xsd schema file to use to validate the xml file.
* @return true if the validation is a succes ( no warm, error or fatal
* error ) false otherwise and if other exception ( cant found file xml, or
* xsd, or xsd not valid) occure.
*/
public static boolean xmlValidationWithExternalXsdShema(File xmlFileToValidate, URL schemaFile) {
Source xmlStreamSource = new StreamSource(xmlFileToValidate);
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
Schema schema = schemaFactory.newSchema(schemaFile);
Validator validator = schema.newValidator();
// a list to store the validation errors / warms used to find if finnaly a validated (if this list empty) xml file or not latter.
List<String> errorHandlerException = new ArrayList<>();
// to get full error list, we set a ErrorEandler
validator.setErrorHandler(new ErrorHandler() {
@Override
public void warning(SAXParseException e) throws SAXException {
logger.info(String.format("[ %7s ] %s:%-4d %s", "warning", e.getSystemId(), e.getLineNumber(), e.getMessage()));
errorHandlerException.add(e.toString());
}
@Override
public void error(SAXParseException e) throws SAXException {
logger.info(String.format("[ %7s ] %s:%-4d %s", "error", e.getSystemId(), e.getLineNumber(), e.getMessage()));
errorHandlerException.add(e.toString());
}
@Override
public void fatalError(SAXParseException e) throws SAXException {
logger.info(String.format("[ %7s ] %s:%-4d %s", "fatalError", e.getSystemId(), e.getLineNumber(), e.getMessage()));
errorHandlerException.add(e.toString());
}
});
// the validation.
validator.validate(xmlStreamSource);
return errorHandlerException.isEmpty();
} catch (SAXException e) {
// avec le setErrorHandler on ne devrait plus passer ici.
logger.info(String.format("[ %7s ] %s\n%s", "invalid", xmlStreamSource.getSystemId(), e));
} catch (IOException ex) {
logger.info(String.format("[ %7s ] %s\n%s", "error", xmlStreamSource.getSystemId(), ex));
} catch (Exception ex) {
// le shema n'existe pas ?
logger.info(String.format("[ %7s ] %s\n%s", "error", xmlStreamSource.getSystemId(), ex));
}
return false;
}
}
b80678d95This file is pinned to the selected release. Download the original to open it in your design tool.