View Javadoc

1   package net.sf.tomp.xtcl.command;
2   
3   import net.sf.tomp.xtcl.Context;
4   import net.sf.tomp.xtcl.filter.TeeFilter;
5   import net.sf.tomp.xtcl.filter.XTFilterFactory;
6   
7   import org.xml.sax.ContentHandler;
8   import org.xml.sax.XMLFilter;
9   import org.xml.sax.XMLReader;
10  
11  import javax.xml.transform.Result;
12  import javax.xml.transform.Templates;
13  import javax.xml.transform.TransformerException;
14  import javax.xml.transform.TransformerFactory;
15  import javax.xml.transform.sax.SAXSource;
16  import javax.xml.transform.sax.SAXTransformerFactory;
17  import javax.xml.transform.sax.TransformerHandler;
18  import javax.xml.transform.stream.StreamResult;
19  
20  import java.io.PrintStream;
21  
22  import java.util.HashMap;
23  import java.util.Iterator;
24  import java.util.Map;
25  
26  /***
27   * DOCUMENT ME!
28   * 
29   * @author tomp
30   */
31  public class TeeFilterCommand extends Chain {
32      /*** DOCUMENT ME! */
33      protected String var;
34  
35      /*** DOCUMENT ME! */
36      protected Map params = new HashMap();
37  
38      /***
39       * DOCUMENT ME!
40       * 
41       * @param v DOCUMENT ME!
42       */
43      public void setVar(String v) {
44          var = v;
45      }
46  
47      /***
48       * DOCUMENT ME!
49       * 
50       * @param k DOCUMENT ME!
51       * @param v DOCUMENT ME!
52       */
53      public void setParameter(String k, Object v) {
54          params.put(k, v);
55  
56          //System.out.println("Setting param "+k+"="+v);
57      }
58  
59      /***
60       * DOCUMENT ME!
61       * 
62       * @param s DOCUMENT ME!
63       * @throws UnsupportedOperationException DOCUMENT ME!
64       */
65      public void setSourceRef(String s) {
66          throw new UnsupportedOperationException("setSourceRef() on " + this);
67      }
68  
69      /***
70       * DOCUMENT ME!
71       * 
72       * @param context DOCUMENT ME!
73       * @return DOCUMENT ME!
74       * @throws Exception DOCUMENT ME!
75       */
76      public int execute(Context context) throws Exception {
77          PrintStream out = context.getOut();
78          XTFilterFactory xff = context.getXTFilterFactory();
79  
80          try {
81              TeeFilter filter = xff.newTeeFilter();
82  
83              context.put(var, filter);
84  
85              TransformerFactory tf = context.getTransformerFactory();
86  
87              if (!tf.getFeature(SAXSource.FEATURE)) {
88                  throw new TransformerException("Not a SAXTransformerFactory");
89              }
90  
91              SAXTransformerFactory stf = (SAXTransformerFactory) tf;
92  
93              Result result = resultRef.startsWith("$") ? context
94                      .refToResult(resultRef) : new StreamResult(context
95                      .getFile(resultRef));
96  
97              XMLReader f = filter;
98              XMLReader prev = filter;
99  
100             boolean first = true;
101 
102             Iterator i = filterStyleRefs.iterator();
103 
104             if (i.hasNext()) {
105                 while (i.hasNext()) {
106                     String ref = (String) i.next();
107                     Object value = context.get(ref);
108                     Templates t = null;
109                     TransformerHandler th = null;
110 
111                     //System.out.println("\nREF "+ref+"=>"+context.get(ref));
112                     if (!(value instanceof XMLFilter)) {
113                         t = context.refToStyle(ref);
114                     }
115 
116                     // FIXME: what if XMLFilter is the last
117                     if (i.hasNext()) {
118                         f = (t == null) ? context.refToXMLFilter(ref) : stf
119                                 .newXMLFilter(t);
120 
121                         //System.out.println("XMLFilter="+f);
122                         ((XMLFilter) f).setParent(prev);
123 
124                         if (first) {
125                             //System.out.println("first, hasNext():
126                             // setContentHandler2="+f);
127                             filter.setContentHandler2((ContentHandler) f);
128                         } else {
129                             prev.setContentHandler((ContentHandler) f);
130                         }
131                     } else {
132                         if (value instanceof XMLFilter) {
133                             f = context.refToXMLFilter(ref);
134                             ((XMLFilter) f).setParent(prev);
135 
136                             if (first) {
137                                 filter.setContentHandler2((ContentHandler) f);
138                             } else {
139                                 prev.setContentHandler((ContentHandler) f);
140                             }
141 
142                             th = stf.newTransformerHandler();
143                             f.setContentHandler(th);
144                         } else {
145                             //System.out.println("XMLFilter="+f);
146                             th = stf.newTransformerHandler(t);
147 
148                             if (first) {
149                                 filter.setContentHandler2(th);
150                             } else {
151                                 prev.setContentHandler(th);
152                             }
153                         }
154 
155                         //System.out.println("NOW PARSING");
156                         th.setResult(result);
157 
158                         //f.setContentHandler(th);
159                         //f.parse(SAXSource.sourceToInputSource(source));
160                         //System.out.println("END OF PARSING");
161                     }
162 
163                     prev = f;
164                     first = false;
165                 }
166             } else {
167                 //System.out.println("in TEECHAIN: empty transformation");
168                 TransformerHandler th = stf.newTransformerHandler();
169 
170                 th.setResult(result);
171                 filter.setContentHandler2(th);
172             }
173 
174             if (out != null) {
175                 out.print("OK " + this);
176             }
177 
178             return 0;
179         } catch (TransformerException te) {
180             if (out != null) {
181                 out.print("ERR " + this + ": " + te);
182             }
183 
184             return 1;
185         }
186     }
187 
188     /***
189      * DOCUMENT ME!
190      * 
191      * @return DOCUMENT ME!
192      */
193     public String toString() {
194         return "TEE FILTER CHAIN " + var + " -> " + resultRef + " STYLES ("
195                 + listList(filterStyleRefs) + ")";
196     }
197 }
198 
199 /*
200  * The contents of this file are subject to the Mozilla Public License Version
201  * 1.1 (the "License"); you may not use this file except in compliance with the
202  * License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
203  * Software distributed under the License is distributed on an "AS IS" basis,
204  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
205  * the specific language governing rights and limitations under the License. The
206  * Original Code is: all this file. The Initial Developer of the Original Code
207  * is: Tomas Pitner, Masaryk University in Brno, Czech Republic. Contributor(s):
208  */