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
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
112 if (!(value instanceof XMLFilter)) {
113 t = context.refToStyle(ref);
114 }
115
116
117 if (i.hasNext()) {
118 f = (t == null) ? context.refToXMLFilter(ref) : stf
119 .newXMLFilter(t);
120
121
122 ((XMLFilter) f).setParent(prev);
123
124 if (first) {
125
126
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
146 th = stf.newTransformerHandler(t);
147
148 if (first) {
149 filter.setContentHandler2(th);
150 } else {
151 prev.setContentHandler(th);
152 }
153 }
154
155
156 th.setResult(result);
157
158
159
160
161 }
162
163 prev = f;
164 first = false;
165 }
166 } else {
167
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
201
202
203
204
205
206
207
208