View Javadoc

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   * Licensed to the Apache Software Foundation (ASF) under one   *
23   * or more contributor license agreements.  See the NOTICE file *
24   * distributed with this work for additional information        *
25   * regarding copyright ownership.  The ASF licenses this file   *
26   * to you under the Apache License, Version 2.0 (the            *
27   * "License"); you may not use this file except in compliance   *
28   * with the License.  You may obtain a copy of the License at   *
29   *                                                              *
30   *   http://www.apache.org/licenses/LICENSE-2.0                 *
31   *                                                              *
32   * Unless required by applicable law or agreed to in writing,   *
33   * software distributed under the License is distributed on an  *
34   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
35   * KIND, either express or implied.  See the License for the    *
36   * specific language governing permissions and limitations      *
37   * under the License.                                           *
38   ****************************************************************/
39  
40  /**
41   * Validates nodes visited. Some checks are more conveniently carried out what
42   * then tree has already been constructed.
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                     // TODO: catching is inefficient, should just check
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 }