import org.apache.xerces.parsers.DOMParser;

import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;

public class JPParser implements ErrorHandler {
	
	
	//Dom parser
	private DOMParser parser;
	//Flag for error handling	
	private boolean err = false;
	
	
	//Constructor : create and initiate parser behavior
	public JPParser () {
		try {
			parser = new DOMParser();
			parser.setErrorHandler(this);
			parser.setFeature( "http://xml.org/sax/features/validation", true);
		}
		catch (SAXNotRecognizedException e) {}
		catch (SAXNotSupportedException e) {}
	}
	
	
	//Parse method : return value :
	//	false = no error during parsing
	//	true  = some errors	
	public boolean parse(String in) {
		try {
			parser.parse(in);
			return err;
		}
		catch (Exception e) {
			return false;
		}
	}
	
	//Implementation of ErrorHandler Interface's methods
	public void warning(SAXParseException ex) {
        	System.err.println("[Warning] "+
                	           getLocationString(ex)+": "+
                        	   ex.getMessage());
                err = true;
    	}	

	public void error(SAXParseException ex) {
       		System.err.println("[Error] "+
                	           getLocationString(ex)+": "+
                        	   ex.getMessage());
                err = true;
   	}

	public void fatalError(SAXParseException ex) throws SAXException {
       		System.err.println("[Fatal Error] "+
                		getLocationString(ex)+": "+
                      	  ex.getMessage());
        	err = true;
        	throw ex;
        	
    	}		
	
	//Get the error position in the xml file
	private String getLocationString(SAXParseException ex) {
        	StringBuffer str = new StringBuffer();

        	String systemId = ex.getSystemId();
       		if (systemId != null) {
            		int index = systemId.lastIndexOf('/');
            		if (index != -1) 
                		systemId = systemId.substring(index + 1);
            		str.append(systemId);
        	}
        	str.append(':');
        	str.append(ex.getLineNumber());
        	str.append(':');
        	str.append(ex.getColumnNumber());

        	return str.toString();
	}	
}	
	
		