1 package org.apache.jsieve;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.apache.jsieve.exception.LookupException;
7 import org.apache.jsieve.exception.SieveException;
8 import org.apache.jsieve.parser.generated.ASTargument;
9 import org.apache.jsieve.parser.generated.ASTarguments;
10 import org.apache.jsieve.parser.generated.ASTblock;
11 import org.apache.jsieve.parser.generated.ASTcommand;
12 import org.apache.jsieve.parser.generated.ASTcommands;
13 import org.apache.jsieve.parser.generated.ASTstart;
14 import org.apache.jsieve.parser.generated.ASTstring;
15 import org.apache.jsieve.parser.generated.ASTstring_list;
16 import org.apache.jsieve.parser.generated.ASTtest;
17 import org.apache.jsieve.parser.generated.ASTtest_list;
18 import org.apache.jsieve.parser.generated.SieveParserVisitor;
19 import org.apache.jsieve.parser.generated.SimpleNode;
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 public class SieveValidationVisitor implements SieveParserVisitor {
45
46 private final CommandManager commandManager;
47
48 private final TestManager testManager;
49
50 private boolean requireAllowed = true;
51
52 private boolean isInRequire = false;
53
54 protected SieveValidationVisitor(final CommandManager commandManager,
55 final TestManager testManager) {
56 super();
57 this.commandManager = commandManager;
58 this.testManager = testManager;
59 }
60
61 public Object visit(SimpleNode node, Object data) throws SieveException {
62 return visitNode(node, data);
63 }
64
65 private Object visitNode(SimpleNode node, Object data)
66 throws SieveException {
67 List children = new ArrayList(node.jjtGetNumChildren());
68 node.childrenAccept(this, children);
69 return data;
70 }
71
72 public Object visit(ASTstart node, Object data) throws SieveException {
73 return visitNode(node, data);
74 }
75
76 public Object visit(ASTcommands node, Object data) throws SieveException {
77 return visitNode(node, data);
78 }
79
80 public Object visit(ASTcommand node, Object data) throws SieveException {
81 final String name = node.getName();
82 commandManager.getCommand(name);
83 if ("require".equalsIgnoreCase(name)) {
84 if (requireAllowed) {
85 isInRequire = true;
86 } else {
87 throw new SieveException(
88 "'require' is only allowed before other commands");
89 }
90 } else {
91 requireAllowed = false;
92 isInRequire = false;
93 }
94 return visitNode(node, data);
95 }
96
97 public Object visit(ASTblock node, Object data) throws SieveException {
98 return visitNode(node, data);
99 }
100
101 public Object visit(ASTarguments node, Object data) throws SieveException {
102
103 return visitNode(node, data);
104 }
105
106 public Object visit(ASTargument node, Object data) throws SieveException {
107 return visitNode(node, data);
108 }
109
110 public Object visit(ASTtest node, Object data) throws SieveException {
111 return visitNode(node, data);
112 }
113
114 public Object visit(ASTtest_list node, Object data) throws SieveException {
115 return visitNode(node, data);
116 }
117
118 public Object visit(ASTstring node, Object data) throws SieveException {
119 if (isInRequire) {
120 final Object value = node.getValue();
121 if (value != null && value instanceof String) {
122 final String name = (String) value;
123 try {
124 commandManager.getCommand(name);
125 } catch (LookupException e) {
126
127 testManager.getTest(name);
128 }
129 }
130 }
131 return visitNode(node, data);
132 }
133
134 public Object visit(ASTstring_list node, Object data) throws SieveException {
135 return visitNode(node, data);
136 }
137
138 }