View Javadoc

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