package eu.dnetlib.enabling.resultset;

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.wsaddressing.W3CEndpointReference;

import eu.dnetlib.miscutils.functional.UnaryFunction;

/**
 * Create a mapped resultset using a given XSLT.
 *
 * @author marko
 *
 */
public class XSLTMappedResultSetFactory extends MappedResultSetFactory {

	/**
	 * Create a mapped resultset using a given XSLT.
	 *
	 * @param source source
	 * @param xslt XSLT source
	 * @return epr of mapped resultset
	 * @throws TransformerConfigurationException could happen
	 */
	public W3CEndpointReference createMappedResultSet(final W3CEndpointReference source, final String xslt) throws TransformerConfigurationException {
		return createMappedResultSet(source, new StreamSource(new StringReader(xslt)));
	}

	/**
	 * Create a mapped resultset using a given XSLT.
	 *
	 * @param source source
	 * @param xslt XSLT
	 * @return epr of mapped resultset
	 * @throws TransformerFactoryConfigurationError
	 * @throws TransformerConfigurationException could happen
	 */
	public W3CEndpointReference createMappedResultSet(final W3CEndpointReference source, final Source xslt) throws TransformerConfigurationException {
		final Transformer transformer = TransformerFactory.newInstance().newTransformer(xslt); // NOPMD
		return createMappedResultSet(source, new UnaryFunction<String, String>() {
			public String evaluate(final String input) {
				final StringWriter output = new StringWriter();
				try {
					transformer.transform(new StreamSource(new StringReader(input)), new StreamResult(output));
				} catch (TransformerException e) {
					return "";
				}
				return output.toString();
			}
		});
	}

}
