1 package net.sf.tomp.xtcl.command;
2
3 import net.sf.tomp.xtcl.Context;
4
5 import javax.xml.transform.Result;
6 import javax.xml.transform.Source;
7 import javax.xml.transform.Templates;
8 import javax.xml.transform.Transformer;
9 import javax.xml.transform.TransformerException;
10 import javax.xml.transform.TransformerFactory;
11 import javax.xml.transform.stream.StreamResult;
12 import javax.xml.transform.stream.StreamSource;
13
14 import java.io.PrintStream;
15
16 import java.util.HashMap;
17 import java.util.Iterator;
18 import java.util.Map;
19
20 /***
21 * DOCUMENT ME!
22 *
23 * @author tomp
24 */
25 public class Transform extends AbstractCommand {
26 /*** DOCUMENT ME! */
27 protected String sourceRef;
28
29 /*** DOCUMENT ME! */
30 protected String styleRef;
31
32 /*** DOCUMENT ME! */
33 protected String resultRef;
34
35 /*** DOCUMENT ME! */
36 protected Map params = new HashMap();
37
38 /*** DOCUMENT ME! */
39 protected Map realParams = new HashMap();
40
41 /*** DOCUMENT ME! */
42 protected Source source;
43
44 /*** DOCUMENT ME! */
45 protected Templates templates;
46
47 /*** DOCUMENT ME! */
48 protected Result result;
49
50 /***
51 * DOCUMENT ME!
52 *
53 * @param s DOCUMENT ME!
54 */
55 public void setSourceRef(String s) {
56 sourceRef = s;
57 }
58
59 /***
60 * DOCUMENT ME!
61 *
62 * @param s DOCUMENT ME!
63 */
64 public void setStyleRef(String s) {
65 styleRef = s;
66 }
67
68 /***
69 * DOCUMENT ME!
70 *
71 * @param s DOCUMENT ME!
72 */
73 public void setResultRef(String s) {
74
75 resultRef = s;
76 }
77
78 /***
79 * DOCUMENT ME!
80 *
81 * @param context DOCUMENT ME!
82 * @return DOCUMENT ME!
83 * @throws Exception DOCUMENT ME!
84 */
85 public int execute(Context context) throws Exception {
86 PrintStream out = context.getOut();
87 TransformerFactory tf = context.getTransformerFactory();
88
89 try {
90 source = sourceRef.startsWith("$") ? context.refToSource(sourceRef)
91 : new StreamSource(context.getFile(sourceRef));
92
93 templates = styleRef.startsWith("$") ? context.refToStyle(styleRef)
94 : null;
95
96 result = resultRef.startsWith("$") ? context.refToResult(resultRef)
97 : new StreamResult(context.getFile(resultRef));
98
99 Transformer t = (templates == null) ? tf
100 .newTransformer(new StreamSource(context.getFile(styleRef)))
101 : templates.newTransformer();
102
103 initTransformer(t, context);
104
105
106
107
108
109 t.transform(source, result);
110
111 if (out != null) {
112 out.print("OK " + this);
113 }
114
115 return 0;
116 } catch (TransformerException te) {
117 if (out != null) {
118 out.print("ERR " + this + ": " + te);
119 }
120
121 return 1;
122 }
123 }
124
125 /***
126 * DOCUMENT ME!
127 *
128 * @return DOCUMENT ME!
129 */
130 public String toString() {
131 return "TRANSFORM " + sourceRef + " STYLE " + styleRef + " -> "
132 + resultRef + " (" + listMap(realParams) + ")";
133 }
134
135 /***
136 * DOCUMENT ME!
137 *
138 * @param k DOCUMENT ME!
139 * @param v DOCUMENT ME!
140 */
141 public void setParameter(String k, Object v) {
142 params.put(k, v);
143
144
145 }
146
147 /***
148 * DOCUMENT ME!
149 *
150 * @param t DOCUMENT ME!
151 * @param context DOCUMENT ME!
152 */
153 protected void initTransformer(Transformer t, Context context) {
154 for (Iterator i = params.keySet().iterator(); i.hasNext();) {
155 String k = (String) i.next();
156 Object v = params.get(k);
157
158 if (v instanceof String && ((String) v).startsWith("$")) {
159
160 v = context.get(v);
161 }
162
163 t.setParameter(k, v);
164 realParams.put(k, v);
165 }
166 }
167 }
168
169
170
171
172
173
174
175
176
177
178