package org.apache.openjpa.sdo;

import java.io.InputStream;
import java.io.OutputStream;

import javax.xml.parsers.*;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import com.sun.org.apache.xpath.internal.XPathAPI;

class XMLReadWrite {
	private Document doc;
	public XMLReadWrite(InputStream is) throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setValidating(false);
		DocumentBuilder builder = factory.newDocumentBuilder();
		doc = builder.parse(is);
	}
	
	public void save(OutputStream os)  throws Exception {
	      Source source = new DOMSource(doc);
          Result result = new StreamResult(os);
          Transformer transformer = TransformerFactory.newInstance().newTransformer();
//          transformer.setOutputProperty(OutputKeys.METHOD,     "xml");
//          transformer.setOutputProperty(OutputKeys.ENCODING,   "UTF-16");
          transformer.setOutputProperty(OutputKeys.INDENT,     "yes");
          transformer.setOutputProperty(OutputKeys.MEDIA_TYPE, "text/xml");
//          transformer.setOutputProperty(OutputKeys.STANDALONE, "no");          
          transformer.transform(source, result);
	}
	
	public Document getDocument() {
		return doc;
	}
	
	public void insertClass(String cls) {
		Node root = doc.getDocumentElement();
		try {
			Node pUnit = XPathAPI.selectSingleNode(root, "persistence-unit");
			if (XPathAPI.selectSingleNode(pUnit, "class[text()='"+cls+"']") != null)
				return;
			Node properties = XPathAPI.selectSingleNode(pUnit, "properties");
			Element newNode = doc.createElement("class");
			newNode.setTextContent(cls);
			pUnit.insertBefore(newNode, properties);
		} catch (DOMException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}
	}
		

}
