1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.jsieve;
21
22 import java.util.ArrayList;
23 import java.util.Iterator;
24 import java.util.List;
25
26 import org.apache.jsieve.exception.SieveException;
27 import org.apache.jsieve.mail.MailAdapter;
28 import org.apache.jsieve.parser.generated.ASTargument;
29 import org.apache.jsieve.parser.generated.ASTarguments;
30 import org.apache.jsieve.parser.generated.ASTblock;
31 import org.apache.jsieve.parser.generated.ASTcommand;
32 import org.apache.jsieve.parser.generated.ASTcommands;
33 import org.apache.jsieve.parser.generated.ASTstart;
34 import org.apache.jsieve.parser.generated.ASTstring;
35 import org.apache.jsieve.parser.generated.ASTstring_list;
36 import org.apache.jsieve.parser.generated.ASTtest;
37 import org.apache.jsieve.parser.generated.ASTtest_list;
38 import org.apache.jsieve.parser.generated.SieveParserVisitor;
39 import org.apache.jsieve.parser.generated.SimpleNode;
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 public class SieveParserVisitorImpl implements SieveParserVisitor {
66 private final SieveContext context;
67
68
69
70
71 public SieveParserVisitorImpl(final SieveContext context) {
72 super();
73 this.context = context;
74 }
75
76
77
78
79
80
81
82
83
84
85 @SuppressWarnings("unchecked")
86 protected Object visitChildren(SimpleNode node, Object data)
87 throws SieveException {
88 List children = new ArrayList(node.jjtGetNumChildren());
89 node.childrenAccept(this, children);
90 ((List) data).addAll(children);
91 return data;
92 }
93
94
95
96
97 @SuppressWarnings("unchecked")
98 public Object visit(ASTargument node, Object data) throws SieveException {
99 List<String> children = new ArrayList<String>(node.jjtGetNumChildren());
100 Argument argument = null;
101
102 if (null != node.getValue()) {
103 argument = (Argument) node.getValue();
104 } else {
105 argument = new StringListArgument(((List) node.childrenAccept(this,
106 children)));
107 }
108 ((List) data).add(argument);
109
110 return data;
111 }
112
113
114
115
116 @SuppressWarnings("unchecked")
117 public Object visit(ASTarguments node, Object data) throws SieveException {
118 List children = new ArrayList(node.jjtGetNumChildren());
119 children = ((List) node.childrenAccept(this, children));
120
121
122 Iterator childrenIter = children.iterator();
123 TestList testList = null;
124 List<Argument> argList = new ArrayList<Argument>(children.size());
125 while (childrenIter.hasNext()) {
126 Object next = childrenIter.next();
127 if (next instanceof Test)
128 testList = new TestList((Test) next);
129 else if (next instanceof TestList)
130 testList = (TestList) next;
131 else if (next instanceof Argument) {
132 argList.add((Argument)next);
133 } else {
134 context.getLog().error("Expected an 'Argument' but was " + next);
135 }
136 }
137
138 Arguments arguments = new Arguments(argList, testList);
139 ((List) data).add(arguments);
140 return data;
141 }
142
143
144
145
146 @SuppressWarnings("unchecked")
147 public Object visit(ASTblock node, Object data) throws SieveException {
148
149
150 List children = new ArrayList(node.jjtGetNumChildren());
151 Commands commands = (Commands) ((List) node.childrenAccept(this,
152 children)).get(0);
153 Block block = new Block(commands);
154 ((List) data).add(block);
155 return data;
156 }
157
158
159
160
161 @SuppressWarnings("unchecked")
162 public Object visit(ASTcommand node, Object data) throws SieveException {
163 List children = new ArrayList(node.jjtGetNumChildren());
164 children = ((List) node.childrenAccept(this, children));
165
166
167 Iterator childrenIter = children.iterator();
168 Arguments arguments = null;
169 Block block = null;
170 while (childrenIter.hasNext()) {
171 Object next = childrenIter.next();
172 if (next instanceof Arguments)
173 arguments = (Arguments) next;
174 else if (next instanceof Block)
175 block = (Block) next;
176 }
177
178 context.setCoordinate(node.getCoordinate());
179 final ScriptCoordinate coordinate = context.getCoordinate();
180 Command command = new Command(node.getName(), arguments, block,
181 coordinate);
182 ((List) data).add(command);
183 return data;
184 }
185
186
187
188
189 @SuppressWarnings("unchecked")
190 public Object visit(ASTcommands node, Object data) throws SieveException {
191 List<Command> children = new ArrayList<Command>(node.jjtGetNumChildren());
192 Commands commands = new Commands(((List) node.childrenAccept(this,
193 children)));
194 ((List) data).add(commands);
195 return data;
196 }
197
198
199
200
201 public Object visit(ASTstart node, Object data) throws SieveException {
202
203 if (!(data instanceof MailAdapter))
204 throw new SieveException("Expecting an instance of "
205 + MailAdapter.class.getName()
206 + " as data, received an instance of "
207 + (data == null ? "<null>" : data.getClass().getName())
208 + ".");
209
210
211
212 List children = new ArrayList(node.jjtGetNumChildren());
213 Commands commands = (Commands) ((List) node.childrenAccept(this,
214 children)).get(0);
215 Block block = new Block(commands);
216 context.setCoordinate(node.getCoordinate());
217
218 return block.execute((MailAdapter) data, context);
219 }
220
221
222
223
224 public Object visit(ASTstring_list node, Object data) throws SieveException {
225 return visitChildren(node, data);
226 }
227
228
229
230
231 @SuppressWarnings("unchecked")
232 public Object visit(ASTstring node, Object data) {
233
234 final String value = (String) node.getValue();
235
236 ((List) data).add(value);
237 return data;
238 }
239
240
241
242
243 @SuppressWarnings("unchecked")
244 public Object visit(ASTtest_list node, Object data) throws SieveException {
245
246 List<Test> children = new ArrayList<Test>(node.jjtGetNumChildren());
247 TestList testList = new TestList(((List<Test>) node.childrenAccept(this,
248 children)));
249 ((List) data).add(testList);
250 return data;
251 }
252
253
254
255
256 @SuppressWarnings("unchecked")
257 public Object visit(ASTtest node, Object data) throws SieveException {
258 List children = new ArrayList(node.jjtGetNumChildren());
259 children = ((List) node.childrenAccept(this, children));
260
261
262 Iterator childrenIter = children.iterator();
263 Arguments arguments = null;
264 while (childrenIter.hasNext()) {
265 Object next = childrenIter.next();
266 if (next instanceof Arguments)
267 arguments = (Arguments) next;
268 }
269
270 context.setCoordinate(node.getCoordinate());
271 Test test = new Test(node.getName(), arguments);
272 ((List) data).add(test);
273 return data;
274 }
275
276
277
278
279 public Object visit(SimpleNode node, Object data) throws SieveException {
280 return visitChildren(node, data);
281 }
282
283 }