/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package utils; import utils.ClassPathSearcher; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.io.StringWriter; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Node; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.xml.sax.SAXException; /** * */ public class XmlUtils { private final static Logger logger = Logger.getLogger(XmlUtils.class.getName()); /* * from http://www.coderanch.com/how-to/java/DocumentToString */ public static String xmlToString(Node node) { try { Source source = new DOMSource(node); StringWriter stringWriter = new StringWriter(); Result result = new StreamResult(stringWriter); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); transformer.transform(source, result); return stringWriter.getBuffer().toString(); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } return null; } public static boolean validateNodeAgainstSchema(Node n, String schemaFile) { if (n == null || schemaFile == null || schemaFile.isEmpty()) { return false; } if (schemaFile.endsWith(".xsd")) { schemaFile = schemaFile.substring(0, schemaFile.length()-4); } try { ClassPathSearcher searcher = ClassPathSearcher.getInstance(); Map schemas = searcher.findFilesInClassPath( ".*"+schemaFile+"\\.xsd"); if (schemas == null || schemas.keySet().isEmpty()) { logger.log(Level.SEVERE, "Schema file {0} not found!", schemaFile); return false; } if (schemas.keySet().size()>1) { logger.log(Level.SEVERE, "Schema file {0} defined multiple times!", schemaFile); return false; } InputStream istream = schemas.get(schemas.keySet().iterator().next()); String schemaLang = "http://www.w3.org/2001/XMLSchema"; SchemaFactory factory = SchemaFactory.newInstance(schemaLang); Schema schema = factory.newSchema(new StreamSource(istream)); Validator validator = schema.newValidator(); logger.log(Level.INFO,"Node content to be validated: {0}", xmlToString(n)); StringReader r = new StringReader(xmlToString(n)); validator.validate(new StreamSource(r)); } catch (IOException ex) { logger.log(Level.SEVERE, null, ex); return false; } catch (SAXException ex) { logger.log(Level.SEVERE, null, ex); return false; } return true; } }