/********************
corrig? exo 2
********************/

/*  question a
*/
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.w3c.dom.*;
import java.io.*;

class XmlValidHandlerManager extends DefaultHandler {
	private boolean bool_isValid = true;
	
	public void reportState() {
	if (isValid()) {
		System.out.println("Document valide");
	} 
	else {
		System.out.println("Document non valide");
		}
	}
	
	public boolean isValid() {
		return bool_isValid;
	}
	
	private void reportProblem(String generalMessage, SAXParseException e) {
		System.err.println(generalMessage);
		System.err.println(" Ligne : "+e.getLineNumber());
		System.err.println(" Colonne : "+e.getColumnNumber());
		System.err.println(" Message : "+e.getMessage());
		}
	
	public void fatalError(SAXParseException e) {
		reportProblem("Erreur de validation - Erreur fatal",e);
		bool_isValid = false;
	}
	
	public void error(SAXParseException e) {
		reportProblem("Erreur de validation - Erreur",e);
		bool_isValid = false;
	}
	
	public void warning(SAXParseException e) {
	reportProblem("Erreur de validation - Warning",e);
	bool_isValid = false;
	}
}

public class Validator {
	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";

	// valider un document xml avec un schema sans prise en compte des espaces de noms
	public static Document domParseWithXsd(String xmlFileName, String xsdFileName) {
		return domParseWithXsd(xmlFileName, xsdFileName, false);
	}

	public static Document domParseWithXsd(String xmlFileName, String xsdFileName,	boolean isNameSpaceAware) {
		try {
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder db;
			Document dom;
			XmlValidHandlerManager errorHandler = new XmlValidHandlerManager();
			// Reglages de la fabrique
			dbFactory.setIgnoringComments(true);
			dbFactory.setNamespaceAware(isNameSpaceAware);
			dbFactory.setValidating(true);
			dbFactory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
			dbFactory.setAttribute(JAXP_SCHEMA_SOURCE, new File(xsdFileName));
			db = dbFactory.newDocumentBuilder();
			db.setErrorHandler(errorHandler);
			dom = db.parse(new File(xmlFileName));
			errorHandler.reportState();
			return dom;
		} 
		catch (ParserConfigurationException e) {
			System.err.println(e.getMessage());
			return null;
		} 
		catch (SAXException e) {
			System.err.println(e.getMessage());
			return null;
		} catch (java.io.IOException e) {
			System.err.println(e.getMessage());
			return null;
		}
	}

	public static void main(String[] args) {
		if (args.length > 1) {
		// args[0] : XML
		// args[1] : XSD
		domParseWithXsd(args[0], args[1],true);
		}
	}
}
