/*******************************************************************************
 * Copyright (c) 2001, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal.xml;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.jem.util.logger.proxy.Logger;
import org.w3c.dom.Document;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
/**
 * Insert the type's description here.
 * Creation date: (4/11/2001 11:58:50 AM)
 * @author: Administrator
 */
public class GeneralXmlDocumentReader
{
    protected InputSource inputSource;
    protected EntityResolver entityResolver;
    protected ErrorHandler errorHandler;
    protected boolean doValidate = false;
    protected boolean doAllowJavaEncodings = false;

/**
 * GeneralXmlDocumentReader constructor comment.
 */
    public GeneralXmlDocumentReader() 
    {
        super();
    }
/**
 * GeneralXmlDocumentReader constructor comment.
 */
    public GeneralXmlDocumentReader(InputSource source) 
    {
        super();
        setInputSource(source);
    }
/**
 * GeneralXmlDocumentReader constructor comment.
 */
    public GeneralXmlDocumentReader(InputSource source, EntityResolver resolver, ErrorHandler handler) 
    {
        super();
        setInputSource(source);
        setEntityResolver(resolver);
        setErrorHandler(handler);
    }
/**
 * Insert the method's description here.
 * Creation date: (4/11/2001 12:04:18 PM)
 * @return org.xml.sax.EntityResolver
 */
    protected org.xml.sax.EntityResolver createDefaultEntityResolver() 
    {
        return null;
    }
/**
 * Insert the method's description here.
 * Creation date: (4/11/2001 12:04:18 PM)
 * @return org.xml.sax.ErrorHandler
 */
    protected org.xml.sax.ErrorHandler createDefaultErrorHandler() 
    {
        return new ErrorHandler() {
        	/* (non-Javadoc)
			 * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException)
			 */
			public void error(SAXParseException exception) throws SAXException {
				throw exception;
			}
			/* (non-Javadoc)
			 * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException)
			 */
			public void fatalError(SAXParseException exception) throws SAXException {
				throw exception;
			}
			/* (non-Javadoc)
			 * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException)
			 */
			public void warning(SAXParseException exception) throws SAXException {
				Logger.getLogger().logWarning(exception);
			}
        };
    }
    protected javax.xml.parsers.DocumentBuilder createNewDOMParser() 
    {
        try
        {
            javax.xml.parsers.DocumentBuilderFactory dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance();
            setFeatures(dbf);
            return dbf.newDocumentBuilder();

        }
        catch (Exception ie)
        {
            handleException(J2EEXMLResourceHandler.getString(XMLParseResourceHandler.failed_instantiating_EXC_, (new Object[] {"Failed to instantiate parser"})), ie); //$NON-NLS-1$ // = "Failed instantiating: "
        }
        return null;
    }
/**
 * Insert the method's description here.
 * Creation date: (4/11/2001 12:01:34 PM)
 * @return boolean
 */
    public boolean doAllowJavaEncodings() 
    {
        return doAllowJavaEncodings;
    }
/**
 * Insert the method's description here.
 * Creation date: (4/11/2001 12:01:34 PM)
 * @return boolean
 */
    public boolean doValidate() 
    {
        return doValidate;
    }
/**
 * Insert the method's description here.
 * Creation date: (4/11/2001 1:34:14 PM)
 * @return java.lang.ClassLoader
 */
    public java.lang.ClassLoader getClassLoader() 
    {
        ClassLoader cl = getClass().getClassLoader();
        if (cl == null)
            cl = Thread.currentThread().getContextClassLoader();
        if (cl == null)
            cl = ClassLoader.getSystemClassLoader();

        return cl;
    }
    public Document getDocument() 
    {
        return parseDocument();
    }
    
    protected Document getDocument(javax.xml.parsers.DocumentBuilder domParser) 
    {
        return domParser.newDocument();
    }


/**
 * Insert the method's description here.
 * Creation date: (4/11/2001 12:04:18 PM)
 * @return org.xml.sax.EntityResolver
 */
    public org.xml.sax.EntityResolver getEntityResolver() 
    {
        if (entityResolver == null)
            entityResolver = createDefaultEntityResolver();
        return entityResolver;
    }
/**
 * Insert the method's description here.
 * Creation date: (4/11/2001 12:04:18 PM)
 * @return org.xml.sax.ErrorHandler
 */
    public org.xml.sax.ErrorHandler getErrorHandler() 
    {
        if (errorHandler == null)
        {
            errorHandler = createDefaultErrorHandler();
        }
        return errorHandler;
    }

/**
 * Insert the method's description here.
 * Creation date: (4/11/2001 12:04:18 PM)
 * @return org.xml.sax.InputSource
 */
    public org.xml.sax.InputSource getInputSource() 
    {
        return inputSource;
    }
    
    protected void handleException(String aMessage, Throwable anException) 
    {
        if (anException instanceof InvocationTargetException)
        {
            InvocationTargetException invocationEx =
            (InvocationTargetException) anException;
            if (invocationEx.getTargetException() != null)
                handleException(aMessage, invocationEx.getTargetException());
        }
        else
            primHandleException(aMessage, anException);
    }
    
    protected Document parse(javax.xml.parsers.DocumentBuilder domParser, InputSource is) 
    {
        try
        {
            return domParser.parse(is);
        }
        catch (org.xml.sax.SAXException ex)
        {
            handleException(J2EEXMLResourceHandler.getString(XMLParseResourceHandler.failed_instantiating_EXC_, (new Object[] {"SAX Parser error"})), ex); //$NON-NLS-1$ // = "Failed instantiating: "

        }
        catch (java.io.IOException ex)
        {
            handleException(J2EEXMLResourceHandler.getString(XMLParseResourceHandler.failed_instantiating_EXC_, (new Object[] {"IO Exception on input stream"})), ex); //$NON-NLS-1$ // = "Failed instantiating: "
        }
        return null;
    }


    public Document parseDocument() 
    {
    	ClassLoader prevClassLoader = Thread.currentThread().getContextClassLoader();
    	try {
    		Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
			javax.xml.parsers.DocumentBuilder parser = createNewDOMParser();
        	setEntityResolver(parser);
        	setErrorHandler(parser);
        	return parse(parser, getInputSource());
	} finally {
      Thread.currentThread().setContextClassLoader(prevClassLoader);
	}
    	
    	
    	
    	
        
    }
    
    protected void primHandleException(String aMessage, Throwable anException) 
    {
        org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError(anException);
        throw new RuntimeException(aMessage);

    }
/**
 * Insert the method's description here.
 * Creation date: (4/11/2001 12:01:34 PM)
 * @param newAllowJavaEncodings boolean
 */
    public void setAllowJavaEncodings(boolean newAllowJavaEncodings) 
    {
        doAllowJavaEncodings = newAllowJavaEncodings;
    }
    
    protected void setEntityResolver(javax.xml.parsers.DocumentBuilder domParser) 
    {
        if (getEntityResolver() != null)
        {
            domParser.setEntityResolver(getEntityResolver());
        }
    }


/**
 * Insert the method's description here.
 * Creation date: (4/11/2001 12:04:18 PM)
 * @param newEntityResolver org.xml.sax.EntityResolver
 */
    public void setEntityResolver(org.xml.sax.EntityResolver newEntityResolver) 
    {
        entityResolver = newEntityResolver;
    }
    

    protected void setErrorHandler(javax.xml.parsers.DocumentBuilder domParser) 
    {
        if (getErrorHandler() != null)
        {
            domParser.setErrorHandler(getErrorHandler());
        }
    }


/**
 * Insert the method's description here.
 * Creation date: (4/11/2001 12:04:18 PM)
 * @param newErrorHandler org.xml.sax.ErrorHandler
 */
    public void setErrorHandler(org.xml.sax.ErrorHandler newErrorHandler) 
    {
        errorHandler = newErrorHandler;
    }

    protected void setFeatures(javax.xml.parsers.DocumentBuilderFactory domParser) 
    {
        try {
			domParser.setValidating(doValidate());
	        domParser.setAttribute("http://apache.org/xml/features/allow-java-encodings", new Boolean(doAllowJavaEncodings())); //$NON-NLS-1$
	        domParser.setExpandEntityReferences(true);
		} catch(IllegalArgumentException e) {
			//Ignore
		}
    }


/**
 * Insert the method's description here.
 * Creation date: (4/11/2001 12:04:18 PM)
 * @param newInputSource org.xml.sax.InputSource
 */
    public void setInputSource(org.xml.sax.InputSource newInputSource) 
    {
        inputSource = newInputSource;
    }
/**
 * Insert the method's description here.
 * Creation date: (4/11/2001 12:01:34 PM)
 * @param newValidate boolean
 */
    public void setValidate(boolean newValidate) 
    {
        doValidate = newValidate;
    }
}


