1 package org.sapia.soto.state.xml; 2 3 import java.util.List ; 4 5 import javax.xml.parsers.SAXParserFactory ; 6 import javax.xml.transform.sax.SAXResult ; 7 import javax.xml.transform.sax.TransformerHandler ; 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 ; 15 import org.xml.sax.InputSource ; 16 import org.xml.sax.XMLReader ; 17 18 27 public class TransformState extends StepState implements EnvAware{ 28 29 private Env _env; 30 31 34 public void setEnv(Env env) { 35 _env = env; 36 } 37 38 41 public void execute(Result res) { 42 TransformChain chain = new DefaultTransformChain(); 43 XMLContext ctx; 44 try{ 45 ctx = (XMLContext)res.getContext(); 46 }catch(ClassCastException e){ 47 throw new IllegalStateException ("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 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 handler = (TransformerHandler ) handlers.get(0); 70 handler.setResult(new SAXResult (ctx.getContentHandler())); 71 process(res, handler); 72 } else { 73 TransformerHandler first = null; 74 TransformerHandler current; 75 int size = handlers.size() - 1; 76 for (int i = 0; i < size; i++) { 77 current = (TransformerHandler )handlers.get(i); 78 if(i == 0){ 79 first = current; 80 } 81 current.setResult(new SAXResult ((TransformerHandler )handlers.get(i + 1))); 82 } 83 ((TransformerHandler ) handlers.get(handlers.size() - 1)).setResult(new SAXResult (ctx.getContentHandler())); 84 85 process(res, first); 86 } 87 } 88 89 95 protected void process(Result res, ContentHandler handler){ 96 SAXParserFactory fac = SAXParserFactory.newInstance(); 97 fac.setNamespaceAware(true); 98 if(!res.getContext().hasCurrentObject()){ 99 res.error("No object on context stack;" + InputSource .class.getName() + " expected"); 100 } 101 try{ 102 XMLReader reader = fac.newSAXParser().getXMLReader(); 103 reader.setContentHandler(handler); 104 reader.parse((InputSource )res.getContext().currentObject()); 105 }catch(ClassCastException e){ 106 res.error(InputSource .class.getName() + " expected on stack; got: " + res.getContext().currentObject()); 107 }catch(Exception 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 |