tim@11: package de.intevation.gnv.util;
tim@11:
tim@11: import java.io.ByteArrayOutputStream;
tim@11: import java.io.File;
tim@11: import java.io.UnsupportedEncodingException;
ingo@394: import java.util.HashMap;
ingo@394: import java.util.Map;
tim@11:
tim@11: import javax.xml.transform.Source;
tim@11: import javax.xml.transform.Transformer;
tim@11: import javax.xml.transform.TransformerConfigurationException;
tim@11: import javax.xml.transform.TransformerException;
tim@11: import javax.xml.transform.TransformerFactory;
tim@11: import javax.xml.transform.TransformerFactoryConfigurationError;
tim@11: import javax.xml.transform.dom.DOMSource;
tim@11: import javax.xml.transform.stream.StreamResult;
tim@11: import javax.xml.transform.stream.StreamSource;
tim@11:
sascha@396: import org.apache.log4j.Logger;
tim@11: import org.w3c.dom.Node;
tim@11:
tim@11: /**
ingo@690: * This xsl transformer is used to transform incoming xml documents with the
ingo@690: * help of templates into a html representation.
sascha@699: *
sascha@684: * @author Tim Englich
tim@11: */
tim@11: public class XSLTransformer {
tim@962:
tim@11: /**
tim@11: * the logger, used to log exceptions and additonaly information
tim@11: */
tim@11: private static Logger log = Logger.getLogger(XSLTransformer.class);
tim@36:
tim@962: /**
tim@962: * The parameter that is required in the XSL sheet.
tim@962: */
ingo@394: private Map params;
ingo@394:
tim@11: /**
tim@11: * Constructor
tim@11: */
tim@11: public XSLTransformer() {
tim@11: super();
tim@11: }
tim@36:
ingo@690: /**
ingo@690: * Turns toTransform into another format using the template
ingo@690: * templateFileName with the encoding. The parameters added in
ingo@690: * {@link #addParameter(java.lang.String, java.lang.String)} are available
ingo@690: * in the transformer.
sascha@699: *
ingo@690: * @param toTransform The node to be transformed.
ingo@690: * @param encoding The encoding to be used.
ingo@690: * @param templateFileName The template used for transformation.
ingo@690: * @return the transformed document as string.
ingo@690: */
tim@36: public String transform(Node toTransform, String encoding,
tim@38: String templateFileName) {
tim@11: String resultValue = null;
tim@36: try {
tim@36: Source templateSource = new StreamSource(new File(templateFileName));
tim@36: TransformerFactory xformFactory = TransformerFactory.newInstance();
tim@36: Transformer transformer = xformFactory
tim@36: .newTransformer(templateSource);
ingo@394:
ingo@394: if (params != null) {
ingo@394: for(Map.Entry entry: params.entrySet()) {
ingo@394: transformer.setParameter(entry.getKey(), entry.getValue());
ingo@394: }
ingo@394: }
ingo@394:
tim@36: ByteArrayOutputStream baos = new ByteArrayOutputStream();
tim@36: StreamResult scrResult = new StreamResult(baos);
tim@36: // log.debug(xmlUtils.writeNode2String(toTransform));
tim@36: DOMSource source = new DOMSource(toTransform);
tim@36: transformer.transform(source, scrResult);
tim@36: resultValue = new String(baos.toByteArray(), encoding);
tim@36: } catch (TransformerConfigurationException e) {
tim@36: log.error(e, e);
tim@36: } catch (UnsupportedEncodingException e) {
tim@36: log.error(e, e);
tim@36: } catch (TransformerFactoryConfigurationError e) {
tim@36: log.error(e, e);
tim@36: } catch (TransformerException e) {
tim@36: log.error(e, e);
tim@36: }
tim@36:
tim@11: return resultValue;
tim@11: }
tim@11:
ingo@394:
ingo@690: /**
ingo@690: * Add a parameter that is required in the XSL sheet.
ingo@690: *
ingo@690: * @param name The name of the parameter.
ingo@690: * @param value The value of the parameter.
ingo@690: */
ingo@394: public void addParameter(String name, String value) {
ingo@394: if (params == null) {
ingo@1008: params = new HashMap(3);
ingo@394: }
ingo@394:
ingo@394: params.put(name, value);
ingo@394: }
tim@11: }
sascha@700: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :