package aQute.libg.xslt;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URL;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class Transform {
	static TransformerFactory	transformerFactory	= TransformerFactory.newInstance();

	static Map<URI,Templates>	cache				= new ConcurrentHashMap<URI,Templates>();

	public static void transform(TransformerFactory transformerFactory, URL xslt, InputStream in, OutputStream out)
			throws Exception {
		if (xslt == null)
			throw new IllegalArgumentException("No source template specified");

		Templates templates = cache.get(xslt.toURI());
		if (templates == null) {
			try (InputStream xsltIn = xslt.openStream()) {
				templates = transformerFactory.newTemplates(new StreamSource(xsltIn));

				cache.put(xslt.toURI(), templates);
			}
		}
		Result xmlResult = new StreamResult(out);
		Source xmlSource = new StreamSource(in);
		Transformer t = templates.newTransformer();
		t.transform(xmlSource, xmlResult);
		out.flush();
	}

	public static void transform(URL xslt, InputStream in, OutputStream out) throws Exception {
		transform(transformerFactory, xslt, in, out);
	}
}
