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
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
97 if (!(value instanceof XMLFilter)) {
98 t = context.refToStyle(ref);
99 }
100
101
102 if (i.hasNext()) {
103 f = (t == null) ? context.refToXMLFilter(ref) : stf
104 .newXMLFilter(t);
105
106
107 ((XMLFilter) f).setParent(prev);
108
109 if (first) {
110
111
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
131 th = stf.newTransformerHandler(t);
132
133 if (first) {
134 filter.setContentHandler2(th);
135 } else {
136 prev.setContentHandler(th);
137 }
138 }
139
140
141 th.setResult(result);
142
143
144
145
146 }
147
148 prev = f;
149 first = false;
150 }
151 } else {
152
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
178
179
180
181
182
183
184
185