import java.io.File;
import java.io.FileReader;

import org.apache.xerces.dom.DOMInputImpl;
import org.apache.xerces.dom.DocumentImpl;
import org.apache.xerces.util.XMLGrammarPoolImpl;
import org.w3c.dom.DOMConfiguration;
import org.w3c.dom.DOMError;
import org.w3c.dom.DOMErrorHandler;
import org.w3c.dom.Document;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSParser;

/*
 * Created on 29-okt-2005
 *
 * This program uses Xerces 
 * - validates a xml file against schema
 /**
 * @author Dick Deneer
 * 
 */
public class TestNormalize
{

	XMLGrammarPoolImpl myGrammarPool = new XMLGrammarPoolImpl();
	DOMImplementationLS impl = null;
	 

	public static void main(String[] args) throws Exception
	{
		System.out.println("Program started");
		TestNormalize testValidate = new TestNormalize();
		if (args.length != 2)
		{
			System.out.println("This program expects 2 parameters: ");
			System.out.println("  parameter 1 = schemaFile");
			System.out.println("  parameter 2 = xmlFile");
			System.exit(0);
		}

		// check if files exist
		File schemaFile = new File(args[0]);
		if (!schemaFile.exists())
		{
			System.out.println("cannot find schema file " + args[0]);
			System.exit(0);
		}
		File xmlFile = new File(args[1]);
		if (!xmlFile.exists())
		{
			System.out.println("cannot find xml file " + args[1]);
			System.exit(0);
		}

		testValidate.doTest(schemaFile, xmlFile);

	}

	public void doTest(File schemaFile, File xmlFile) throws Exception
	{
		Document document = parse(xmlFile);
		validate(document, schemaFile);

	}

	public Document parse(File xmlFile) throws Exception
	{

		DOMInputImpl input = new DOMInputImpl();
		FileReader reader = new FileReader(xmlFile);
		input.setCharacterStream(reader);

		System.setProperty(DOMImplementationRegistry.PROPERTY,
				"org.apache.xerces.dom.DOMXSImplementationSourceImpl");

		DOMImplementationRegistry registry = DOMImplementationRegistry
				.newInstance();

		impl = (DOMImplementationLS) registry
				.getDOMImplementation("psvi");

		LSParser parser = impl.createLSParser(
				DOMImplementationLS.MODE_SYNCHRONOUS, null);

		org.w3c.dom.DOMConfiguration config = parser.getDomConfig();
		config.setParameter("datatype-normalization", Boolean.FALSE);
		config.setParameter("validate", Boolean.FALSE);
		config.setParameter("psvi", Boolean.TRUE);

		return parser.parseURI(xmlFile.getAbsolutePath());

	}

	public void validate(Document document, final File schema)
	{

		DocumentImpl docImpl = (DocumentImpl) document;

		DOMConfiguration config = docImpl.getDomConfig();

		// set validation feature
		config.setParameter("validate", Boolean.TRUE);

		// set schema language
		config.setParameter("schema-type", "http://www.w3.org/2001/XMLSchema");
		config.setParameter("schema-location", schema.getAbsolutePath());
		config.setParameter("datatype-normalization", Boolean.FALSE);
		config.setParameter("psvi", Boolean.TRUE);
		config.setParameter(
				"http://apache.org/xml/properties/internal/grammar-pool",
				myGrammarPool);
		config.setParameter("error-handler", new DOMErrorHandler()
		{

			public boolean handleError(DOMError e)
			{
				// TODO Auto-generated method stub
				System.out.println("handleError " + e.getMessage());
				return true;
			}

		});

		// document.normalize();
		((DocumentImpl) document).normalizeDocument();

	}

}