KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > sapia > soto > state > xml > StyleStep


1 package org.sapia.soto.state.xml;
2
3 import org.apache.commons.lang.ClassUtils;
4 import org.sapia.soto.Env;
5 import org.sapia.soto.EnvAware;
6 import org.sapia.soto.config.ThreadState;
7 import org.sapia.soto.state.Result;
8 import org.sapia.soto.state.Step;
9 import org.sapia.soto.util.Resource;
10 import org.sapia.soto.util.ResourceHandler;
11 import org.sapia.soto.util.Utils;
12
13 import org.sapia.util.text.TemplateContextIF;
14
15 import java.io.IOException JavaDoc;
16 import java.io.InputStream JavaDoc;
17
18 import java.util.Iterator JavaDoc;
19 import java.util.Map JavaDoc;
20
21 import javax.xml.transform.Templates JavaDoc;
22 import javax.xml.transform.TransformerConfigurationException JavaDoc;
23 import javax.xml.transform.TransformerFactory JavaDoc;
24 import javax.xml.transform.sax.SAXTransformerFactory JavaDoc;
25 import javax.xml.transform.sax.TransformerHandler JavaDoc;
26 import javax.xml.transform.stream.StreamSource JavaDoc;
27
28
29 /**
30  * An instance of this class encapsulates the behavior necessary to create
31  * <code>TransformerHandler</code>s from XSL stylesheets. The instance is
32  * given the source to a stylesheet; whenever possible, it detects if the
33  * stylesheet has been modified and reloads it - currently, such a feature
34  * is available only for URIs that correspond to a <code>java.io.File</code>
35  * object.
36  *
37  * @author Yanick Duchesne
38  * <dl>
39  * <dt><b>Copyright:</b><dd>Copyright &#169; 2002-2003 <a HREF="http://www.sapia-oss.org">Sapia Open Source Software</a>. All Rights Reserved.</dd></dt>
40  * <dt><b>License:</b><dd>Read the license.txt file of the jar or visit the
41  * <a HREF="http://www.sapia-oss.org/license.html">license page</a> at the Sapia OSS web site</dd></dt>
42  * </dl>
43  */

44 public class StyleStep implements EnvAware, Step {
45   private Templates JavaDoc _templ;
46   private SAXTransformerFactory JavaDoc _fac;
47   private Resource _file;
48   private Env _env;
49   private long _lastModified = System.currentTimeMillis();
50
51     public StyleStep() throws TransformerConfigurationException JavaDoc{
52         _fac = (SAXTransformerFactory JavaDoc) TransformerFactory.newInstance();
53     }
54
55   protected StyleStep(SAXTransformerFactory JavaDoc fac) {
56     _fac = fac;
57   }
58   
59   /**
60    * @see org.sapia.soto.state.Step#getName()
61    */

62   public String JavaDoc getName() {
63     return ClassUtils.getShortClassName(getClass());
64   }
65   
66   /**
67    * @param uri the URI to an XSL stylesheet.
68    * @throws IOException
69    * @throws TransformerConfigurationException
70    */

71   public void setSrc(String JavaDoc uri)
72     throws IOException JavaDoc, TransformerConfigurationException JavaDoc {
73     ResourceHandler handler = (ResourceHandler) _env.getResourceHandlerFor(uri);
74     _file = handler.getResourceObject(uri);
75     _templ = _fac.newTemplates(new StreamSource JavaDoc(process(
76             _file.getInputStream(), uri)));
77   }
78
79   
80   /**
81    * @see org.sapia.soto.state.Executable#execute(org.sapia.soto.state.Result)
82    */

83   public void execute(Result res) {
84     XMLContext ctx;
85     try{
86         ctx = (XMLContext)res.getContext();
87     }catch(ClassCastException JavaDoc e){
88         throw new IllegalStateException JavaDoc("Expected context to be instance of " + XMLContext.class.getName() + "; got: " + res.getContext().getClass().getName());
89     }
90     
91     Map JavaDoc params = ctx.getViewParams();
92
93     if ((_file != null) && (_file.lastModified() != _lastModified)) {
94         try{
95           reload();
96         }catch(Exception JavaDoc e){
97             res.error("Problem reloading stylesheet", e);
98             return;
99         }
100     }
101
102     TransformerHandler JavaDoc handler;
103     try{
104         handler = _fac.newTransformerHandler(_templ);
105     }catch(TransformerConfigurationException JavaDoc e){
106         res.error("Problem creating TransformerHandler", e);
107         return;
108     }
109     Object JavaDoc key;
110     Object JavaDoc val;
111
112     for (Iterator JavaDoc iter = params.keySet().iterator(); iter.hasNext();) {
113       key = iter.next();
114       val = params.get(key);
115
116       if (val != null) {
117         handler.getTransformer().setParameter(key.toString(), val);
118       }
119     }
120     try{
121         TransformChain chain = (TransformChain)ctx.currentObject();
122         chain.add(handler);
123     }catch(ClassCastException JavaDoc e){
124             throw new IllegalStateException JavaDoc("Expected object on context stack to be instance of " + TransformChain.class.getName());
125     }
126   }
127
128   /**
129    * @see org.sapia.soto.EnvAware#setEnv(org.sapia.soto.Env)
130    */

131   public void setEnv(Env env) {
132     _env = env;
133   }
134
135   private synchronized void reload()
136     throws TransformerConfigurationException JavaDoc, IOException JavaDoc {
137     if (_file.lastModified() != _lastModified) {
138       _templ = _fac.newTemplates(new StreamSource JavaDoc(_file.getInputStream(),
139             _file.getURI()));
140     }
141
142     _lastModified = _file.lastModified();
143   }
144
145   private InputStream JavaDoc process(InputStream JavaDoc is, String JavaDoc uri)
146     throws IOException JavaDoc {
147     TemplateContextIF ctx = ThreadState.currentTemplateContext();
148
149     return Utils.replaceVars(ctx, is, uri);
150   }
151
152   public static class Export {
153     private String JavaDoc _name;
154
155     public void setName(String JavaDoc name) {
156       _name = name;
157     }
158   }
159 }
160
Popular Tags