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 :