/* * Transform.java * * Created on December 6, 2003, 6:52 PM */ package gov.nist.registry.common2.util.xsl; import gov.nist.registry.common2.exception.XdsInternalException; import gov.nist.registry.common2.registry.Validator; import gov.nist.registry.xds.Logger; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.io.StringBufferInputStream; import java.io.StringReader; import java.util.HashMap; import java.util.Iterator; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * A class for handling XSL transforms. * @author Bill Majurski */ public class Transform { private static final Log log = LogFactory.getLog(Transform.class); static HashMap transforms = null; InputStream inputStream; OutputStream outputStream; static boolean disableCache = true; HashMap parameters = null; Transformer transformer; static TransformerFactory tFactory = null; public static String run( String systemId, String input ) throws Exception { return Transform.run(systemId, input, null, null, null, null, null, null); } public static String run( String systemId, String input, String parm1Name, String parm1Value ) throws Exception { return Transform.run(systemId, input, parm1Name, parm1Value, null, null, null, null); } public static String run( String systemId, String input, String parm1Name, String parm1Value, String parm2Name, String parm2Value ) throws Exception { return Transform.run(systemId, input, parm1Name, parm1Value, parm2Name, parm2Value, null, null); } public static String run( String systemId, String input, String parm1Name, String parm1Value, String parm2Name, String parm2Value, String parm3Name, String parm3Value ) throws Exception { Transform x = new Transform(); x.setTransform(systemId); x.setInput(input); if (parm1Name != null) x.setParameter(parm1Name, parm1Value); if (parm2Name != null) x.setParameter(parm2Name, parm2Value); if (parm3Name != null) x.setParameter(parm3Name, parm3Value); x.run(); return x.getOutputString(); } /** * Loads a transform file and returns that transform in a Transform object. * @param f The transform file. * @throws java.lang.Exception Thrown if there is a parsing error. * @return A Tranform object representing the transform. */ static public Transform load(File f) throws Exception { Transform tform; String path=""; if (!disableCache) { if (transforms == null) transforms = new HashMap(); path = f.getPath(); tform = (Transform) transforms.get(path); if (tform != null) return tform; } tform = new Transform(); tform.setTransform(f); if (!disableCache) transforms.put(path, tform); return tform; } /** Creates a new instance of Transform */ public Transform() { inputStream = null; outputStream = null; } /** * Set the transform by providing a File object. * @param f The File representing the transform file. * @throws java.lang.Exception Thrown if there is a problem accessing the file. */ public void setTransform(File f) throws Exception { StreamSource streamSource; if (!f.exists()) throw new Exception("File: " + f.getPath() + " does not exist"); streamSource = new StreamSource(f); if (tFactory == null) tFactory = TransformerFactory.newInstance(); transformer = tFactory.newTransformer(streamSource); } /** * Set the transform by providing an XML String and String representing a URI. * @param s The XML String. * @param systemId The URI location of a transform. * @throws java.lang.Exception Thrown if there is a problem accessing the URI. */ public void setTransform(String s, String systemId) throws Exception { StreamSource streamSource; //StringBufferInputStream is = new StringBufferInputStream(s); StringReader sr = new StringReader(s); streamSource = new StreamSource(sr, systemId); if (tFactory == null) tFactory = TransformerFactory.newInstance(); transformer = tFactory.newTransformer(streamSource); } /** * Set the transform by providing a String representing a URI. * @param systemId The URI location of a transform. * @throws java.lang.Exception Thrown if there is a problem accessing the URI. */ public void setTransform(String systemId) throws TransformerConfigurationException { if (log.isDebugEnabled()) { log.debug("Transform:setTransform: " + systemId); } StreamSource streamSource; streamSource = new StreamSource(systemId); if (tFactory == null) tFactory = TransformerFactory.newInstance(); transformer = tFactory.newTransformer(streamSource); } /** * Adds parameter name/value pairs which will be passed along to the transform * handler. * @param name The name of the parameter. * @param value The value of the parameter. */ public void setParameter(String name, Object value) { if (value == null) value = ""; if (parameters == null) parameters = new HashMap(); parameters.put(name, value); if (log.isDebugEnabled() ) { log.debug("Transform:setParameter " + name + "=>" + value); } } /** * Set the input as a String object. * @param input The input String. */ public void setInput(String input) { int display = 80; if (log.isDebugEnabled() ) { log.debug("Transform.setInput: " + input.substring(0, (input.length() < display) ? input.length() : display)); } inputStream = new StringBufferInputStream(input); outputStream = new ByteArrayOutputStream(); } /** * Run the transform. * @throws java.lang.Exception Throws an exception if there is a problem using the input or output * sources. */ public void run() throws XdsInternalException { transformer.clearParameters(); if (parameters != null) { log.debug("Transform.java: Has parameters"); for (Iterator it=parameters.keySet().iterator(); it.hasNext(); ) { String key = (String) it.next(); Object value = parameters.get(key); System.out.println("key=" + key + " value=" + (String) value); transformer.setParameter(key, value); } log.debug("parameters set"); } StreamSource in; try { in = new StreamSource(inputStream); } catch (Exception e) { throw new XdsInternalException("XSL Transform: error creating input stream source: " + e.getMessage()); } StreamResult out; try { out = new StreamResult(outputStream); } catch (Exception e) { throw new XdsInternalException("XSL Transform: error creating ouput stream source: " + e.getMessage()); } try { transformer.transform(in, out); } catch (Exception e) { throw new XdsInternalException("XSL Transform: error running transform: " + e.getMessage()); } } /** * Get the results of the transform. * @return A String representing the output of the transform. */ public String getOutputString() { return outputStream.toString(); } }