1 package org.sapia.soto.state.cocoon.view; 2 3 import org.sapia.soto.Env; 4 import org.sapia.soto.EnvAware; 5 import org.sapia.soto.config.ThreadState; 6 import org.sapia.soto.util.Resource; 7 import org.sapia.soto.util.ResourceHandler; 8 import org.sapia.soto.util.Utils; 9 10 import org.sapia.util.text.TemplateContextIF; 11 12 import java.io.IOException ; 13 import java.io.InputStream ; 14 15 import java.util.Iterator ; 16 import java.util.Map ; 17 18 import javax.xml.transform.Templates ; 19 import javax.xml.transform.TransformerConfigurationException ; 20 import javax.xml.transform.TransformerFactory ; 21 import javax.xml.transform.sax.SAXTransformerFactory ; 22 import javax.xml.transform.sax.TransformerHandler ; 23 import javax.xml.transform.stream.StreamSource ; 24 25 26 44 public class XslSource implements EnvAware { 45 private Templates _templ; 46 private SAXTransformerFactory _fac; 47 private Resource _file; 48 private Env _env; 49 private long _lastModified = System.currentTimeMillis(); 50 51 public XslSource() { 52 } 53 54 59 public void setSrc(String uri) 60 throws IOException , TransformerConfigurationException { 61 if (_fac == null) { 62 _fac = (SAXTransformerFactory ) TransformerFactory.newInstance(); 63 } 64 ResourceHandler handler = (ResourceHandler) _env.getResourceHandlerFor(uri); 65 _file = handler.getResourceObject(uri); 66 _templ = _fac.newTemplates(new StreamSource (process( 67 _file.getInputStream(), uri))); 68 } 69 70 73 public String getUri(){ 74 return _file.getURI(); 75 } 76 77 82 public TransformerHandler getTransformerHandler(Map params) 83 throws TransformerConfigurationException , IOException { 84 if ((_file != null) && (_file.lastModified() != _lastModified)) { 85 reload(); 86 } 87 88 TransformerHandler handler = _fac.newTransformerHandler(_templ); 89 Object key; 90 Object val; 91 92 for (Iterator iter = params.keySet().iterator(); iter.hasNext();) { 93 key = iter.next(); 94 val = params.get(key); 95 96 if (val != null) { 97 handler.getTransformer().setParameter(key.toString(), val); 98 } 99 } 100 101 return handler; 102 } 103 104 107 public void setEnv(Env env) { 108 _env = env; 109 } 110 111 115 protected void setSaxTransformerFactory(SAXTransformerFactory fac) { 116 _fac = fac; 117 } 118 119 private synchronized void reload() 120 throws TransformerConfigurationException , IOException { 121 if (_file.lastModified() != _lastModified) { 122 _templ = _fac.newTemplates(new StreamSource (_file.getInputStream(), 123 _file.getURI())); 124 } 125 126 _lastModified = _file.lastModified(); 127 } 128 129 private InputStream process(InputStream is, String uri) 130 throws IOException { 131 TemplateContextIF ctx = ThreadState.currentTemplateContext(); 132 133 return Utils.replaceVars(ctx, is, uri); 134 } 135 } 136 | Popular Tags |