package org.apache.cocoon.xml;

import org.apache.cocoon.xml.dom.DOMBuilder;
import org.apache.cocoon.xml.dom.DOMStreamer;
import org.apache.xpath.XPathAPI;
import org.apache.xpath.objects.XObject;

import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.Locator;
import org.xml.sax.Attributes;

import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;

public class DOMObject implements XMLFragment {
  private Document doc = null;
  private Node docNode = null;
  private DOMBuilder domBuilder = null;
  private boolean initialized = false;
  private boolean finished = false;

  public boolean isInitialized(){
    return(initialized);
  }

  public boolean isFinished(){
    return(finished);
  }

  public void markFinished(){
    finished = true;
  }

  public void initialize(){
    DocumentBuilder docBuilder = null;
    try {
        docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    }
    catch(ParserConfigurationException pce){
    }
    this.doc = docBuilder.newDocument();
    this.docNode = doc.createDocumentFragment();
    this.domBuilder = new DOMBuilder(this.docNode);
    this.initialized = true;
  }

  public ContentHandler getContentHandler(){
    return(domBuilder);
  }
  
  public XObject getXObject(String XPath){
    try{
      // NodeIterator ni = XPathAPI.selectNodeIterator(document, XPath);
      XObject xobj = XPathAPI.eval(doc, XPath);
      return(xobj);
    } 
    catch(TransformerException e){
      return(null);
    }
  }

  public String getValue (String XPath){
    XObject x = getXObject(XPath);
    return(x.toString());
  }

  public void setValue ( String XPath ){
  }

  public void toDOM(Node node)
    throws Exception
  {
    if(isFinished())
      node.appendChild(docNode);
  }

  public void toSAX(ContentHandler handler)
    throws SAXException
  {
    if(isFinished()){
      DOMStreamer streamer = new DOMStreamer(handler);
      streamer.stream(this.docNode);
    }
  }
}