package net.ihe.xcpd.resp.tools;


import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.w3c.dom.Document;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;

public class XSDValidator {

    static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";

    static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";

    static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";

    static boolean isValid;

    static {
        isValid = false;
    }

    public static boolean validXMLWithDOM(String xmlString, String xsdFile) {
        isValid = true; // Valide jusqu'� ce qu'une erreur se produise !
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setIgnoringComments(true);
        dbf.setNamespaceAware(true);
        dbf.setValidating(true);
        dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
        dbf.setAttribute(JAXP_SCHEMA_SOURCE, new File(xsdFile));
        try {
            // Parsage du fichier XML avec DOM
            DocumentBuilder db = dbf.newDocumentBuilder();
            db.setErrorHandler(new ErrorHandler() {
                public void fatalError(SAXParseException e) {
                    System.out
                    .println("Erreur de validation XSD - Erreur fatal");
                    //e.printStackTrace();
                    isValid = false;
                }

                public void error(SAXParseException e) {
                    System.out.println("Erreur de validation XSD - Erreur");
                    //e.printStackTrace();
                    isValid = false;
                }

                public void warning(SAXParseException e) {
                    System.out.println("Erreur de validation XSD - Warning");
                    //e.printStackTrace();
                    isValid = false;
                }
            });
            ByteArrayInputStream bais = new ByteArrayInputStream(xmlString.getBytes());
            Document doc = db.parse(bais);
        } catch (ParserConfigurationException pcee) {
            System.out.println("pcee = " + pcee);
            return false;
        } catch (IOException ioe) {
            System.out.println("ioe = " + ioe);
            return false;
        } catch (SAXException saxe) {
            System.out.println("saxe = " + saxe);
            return false;
        }
        return isValid;
    }

    public static boolean validXMLWithSAX(String xmlString, String xsdFile) {
        isValid = true;
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            spf.setNamespaceAware(true);
            spf.setValidating(true);
            SAXParser sp = spf.newSAXParser();
            sp.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
            sp.setProperty(JAXP_SCHEMA_SOURCE, xsdFile);
            ByteArrayInputStream bais = new ByteArrayInputStream(xmlString.getBytes());
            sp.parse(bais, new DefaultHandler(){
                public void fatalError(SAXParseException e) {
                    System.out
                    .println("Erreur de validation XSD - Erreur fatal");
                    isValid = false;
                }

                public void error(SAXParseException e) {
                    System.out.println("Erreur de validation XSD - Erreur");
                    isValid = false;
                }

                public void warning(SAXParseException e) {
                    System.out.println("Erreur de validation XSD - Warning");
                    isValid = false;
                }
            });
        } catch (SAXException se) {
            System.out.println(se);
            return false;
        } catch (ParserConfigurationException pce){
            System.out.println(pce);
            return false;
        } catch (IOException ioe){
            System.out.println(ioe);
            return false;
        }
        return isValid;
    }

    public static void main(String[] args) {
        System.out.println(XSDValidator.validXMLWithDOM("info.xml", "info.xsd"));
        System.out.println(XSDValidator.validXMLWithSAX("info.xml", "info.xsd"));
    }
} 