

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.DOMException;

import java.util.HashMap;
import java.util.Map;

import java.io.PrintStream;
/**
  *@author vasanthl@yahoo.com	
**/
public class DOMFactory {


private  static Map container = new HashMap();

private static boolean _debug   = false;

private static PrintStream	o   = System.out;

private static DocumentBuilder	domBuilder ;

	static
	{
		initPool();
	}
	
	public static void initPool(){
	
	try{

		String debugSwitch=	System.getProperty(DOMFactory.class.getName()+"_debug");
		if(debugSwitch!=null)
			_debug = true;
			
									
		DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
		 fac.setNamespaceAware(true);
		DocumentBuilder	db=fac.newDocumentBuilder();

		domBuilder	= fac.newDocumentBuilder();
				
		Document d = db.newDocument();
		
		container.put("document",d);
		if(_debug)o.println("_______added document in Map_______key:document");
		
		container.put("domBuilder",domBuilder);
		if(_debug)o.println("_______added domBuilder in Map_____key:domBuilder");
		
		
		}
		
		catch(ParserConfigurationException pe){
			
			if(_debug)
			o.println("Exception in initPool "+pe.toString()) ; 				
		
		}
		catch(DOMException de){
			
			if(_debug)
			o.println("Exception in initPool "+de.toString()) ; 					
		
		}
		catch(Exception e){
			
			if(_debug)
			o.println("Exception in initPool "+e.toString());		
			
		}

		
	}
	
	

		/*
			returns a fresh copy of org.w3c.dom.Document
			
		*/
		
	public static Document getDOMClone(){
		
		
		Document baseDOM = (Document)container.get("document");
		
		
		Document DOMClone =(Document)baseDOM.cloneNode(false);
		
		
		
		return DOMClone;
		
	}
	/*
		return a cached instance of
		javax.xml.parsers.DocumentBuilder
	*/
	
	public static DocumentBuilder getDOMBuilder(){

				return (DocumentBuilder)container.get("domBuilder");
		
	}
	
	
}

