package com.tandbergtv.metadatamanager.specimpl;

import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;

import org.apache.log4j.Logger;
import org.w3c.dom.Document;

import com.tandbergtv.metadatamanager.exception.TranslationException;
import com.tandbergtv.metadatamanager.spec.ITranslator;
import com.tandbergtv.metadatamanager.util.ResourceResolver;

public class XslTranslator implements ITranslator {

	private final Logger logger = Logger.getLogger(this.getClass());
	
	private InputStream xslStream;
	private Transformer transformer;
	private ClassLoader classLoader;
	
	public void setXslStream(InputStream xslStream) {

		this.xslStream = xslStream;
		try {
			TransformerFactory tf = TransformerFactory.newInstance(
                    "net.sf.saxon.TransformerFactoryImpl",
                    getClass().getClassLoader());

			tf.setURIResolver(new ResourceResolver(classLoader));
			transformer = tf.newTransformer(new StreamSource(this.xslStream));
		} catch (TransformerConfigurationException e) {
			throw new RuntimeException(e);
		} catch (TransformerFactoryConfigurationError e) {
			throw new RuntimeException(e);
		}
	}

	public Document translate(Document doc) throws TranslationException {
		logger.debug("In Translate");
		DocumentBuilder dBuilder;
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			dBuilder = factory.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			throw new RuntimeException(e);
		}

		Document docOut = dBuilder.newDocument();
		DOMResult result = new DOMResult(docOut);
		try {
			transformer.transform(new DOMSource(doc), result);
		} catch (TransformerException e) {
			throw new RuntimeException(e);
		}
		return docOut;
	}

	@Override
	public void setClassLoader(ClassLoader loader) {
		this.classLoader = loader;
		
	}
}
