KickJava   Java API By Example, From Geeks To Geeks.

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


1 package org.sapia.soto.state.xml;
2
3 import java.util.List JavaDoc;
4
5 import javax.xml.parsers.SAXParserFactory JavaDoc;
6 import javax.xml.transform.sax.SAXResult JavaDoc;
7 import javax.xml.transform.sax.TransformerHandler JavaDoc;
8
9 import org.sapia.soto.Env;
10 import org.sapia.soto.EnvAware;
11 import org.sapia.soto.SotoContainer;
12 import org.sapia.soto.state.Result;
13 import org.sapia.soto.state.StepState;
14 import org.xml.sax.ContentHandler JavaDoc;
15 import org.xml.sax.InputSource JavaDoc;
16 import org.xml.sax.XMLReader JavaDoc;
17
18 /**
19  * @author Yanick Duchesne
20  *
21  * <dl>
22  * <dt><b>Copyright:</b><dd>Copyright &#169; 2002-2004 <a HREF="http://www.sapia-oss.org">Sapia Open Source Software</a>. All Rights Reserved.</dd></dt>
23  * <dt><b>License:</b><dd>Read the license.txt file of the jar or visit the
24  * <a HREF="http://www.sapia-oss.org/license.html">license page</a> at the Sapia OSS web site</dd></dt>
25  * </dl>
26  */

27 public class TransformState extends StepState implements EnvAware{
28     
29     private Env _env;
30     
31     /**
32    * @see org.sapia.soto.EnvAware#setEnv(org.sapia.soto.Env)
33    */

34   public void setEnv(Env env) {
35         _env = env;
36   }
37   
38   /**
39    * @see org.sapia.soto.state.ExecContainer#execute(org.sapia.soto.state.Result)
40    */

41   public void execute(Result JavaDoc res) {
42     TransformChain chain = new DefaultTransformChain();
43     XMLContext ctx;
44         try{
45             ctx = (XMLContext)res.getContext();
46         }catch(ClassCastException JavaDoc e){
47             throw new IllegalStateException JavaDoc("Expected context to be instance of " + XMLContext.class.getName() + "; got: " + res.getContext().getClass().getName());
48         }
49         
50       if(ctx.getContentHandler() == null){
51         return;
52       }
53         
54     ctx.push(chain);
55     super.execute(res);
56     if(res.isAborted() || res.isError()){
57         ctx.pop();
58         return;
59     }
60     ctx.pop();
61         List JavaDoc handlers = chain.getTransformerHandlers();
62         
63         ctx.getViewParams().put(SotoContainer.SOTO_ENV_KEY, _env);
64         
65         if(handlers.size() == 0){
66             process(res, ctx.getContentHandler());
67         }
68         else if (handlers.size() == 1) {
69             TransformerHandler JavaDoc handler = (TransformerHandler JavaDoc) handlers.get(0);
70             handler.setResult(new SAXResult JavaDoc(ctx.getContentHandler()));
71             process(res, handler);
72         } else {
73             TransformerHandler JavaDoc first = null;
74             TransformerHandler JavaDoc current;
75             int size = handlers.size() - 1;
76             for (int i = 0; i < size; i++) {
77                 current = (TransformerHandler JavaDoc)handlers.get(i);
78                 if(i == 0){
79                     first = current;
80                 }
81                 current.setResult(new SAXResult JavaDoc((TransformerHandler JavaDoc)handlers.get(i + 1)));
82         }
83             ((TransformerHandler JavaDoc) handlers.get(handlers.size() - 1)).setResult(new SAXResult JavaDoc(ctx.getContentHandler()));
84         
85             process(res, first);
86         }
87   }
88   
89   /**
90    * This template method can be overriden by child classes. By default, it expects an <code>InputSource</code>
91    * to be on the context stack. That <code>InputSource</code> is used to feed the transform chain.
92    * @param res
93    * @param handler
94    */

95   protected void process(Result JavaDoc res, ContentHandler JavaDoc handler){
96     SAXParserFactory JavaDoc fac = SAXParserFactory.newInstance();
97     fac.setNamespaceAware(true);
98     if(!res.getContext().hasCurrentObject()){
99         res.error("No object on context stack;" + InputSource JavaDoc.class.getName() + " expected");
100     }
101     try{
102         XMLReader JavaDoc reader = fac.newSAXParser().getXMLReader();
103         reader.setContentHandler(handler);
104         reader.parse((InputSource JavaDoc)res.getContext().currentObject());
105     }catch(ClassCastException JavaDoc e){
106         res.error(InputSource JavaDoc.class.getName() + " expected on stack; got: " + res.getContext().currentObject());
107     }catch(Exception JavaDoc e){
108         res.error("Could not parse input source", e);
109     }
110   }
111   
112   protected Env env(){
113     return _env;
114   }
115
116 }
117
Popular Tags