1 /****************************************************************
2 * Licensed to the Apache Software Foundation (ASF) under one *
3 * or more contributor license agreements. See the NOTICE file *
4 * distributed with this work for additional information *
5 * regarding copyright ownership. The ASF licenses this file *
6 * to you under the Apache License, Version 2.0 (the *
7 * "License"); you may not use this file except in compliance *
8 * with the License. You may obtain a copy of the License at *
9 * *
10 * http://www.apache.org/licenses/LICENSE-2.0 *
11 * *
12 * Unless required by applicable law or agreed to in writing, *
13 * software distributed under the License is distributed on an *
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
15 * KIND, either express or implied. See the License for the *
16 * specific language governing permissions and limitations *
17 * under the License. *
18 ****************************************************************/
19
20 package org.apache.jsieve;
21
22 import org.apache.commons.logging.Log;
23 import org.apache.jsieve.exception.SieveException;
24 import org.apache.jsieve.mail.MailAdapter;
25
26 /**
27 * <p>
28 * A parsed representation of the RFC3028 BNF...
29 * </p>
30 *
31 * <code>command = identifier arguments ( ";" / block )</code>
32 */
33 public class Command implements Executable {
34
35 /** The name of this Command */
36 private String fieldName;
37
38 /** The Arguments for this Command */
39 private Arguments fieldArguments;
40
41 /** The Block for this Command */
42 private Block fieldBlock;
43
44 /**
45 * Script coordinate for this command. Commands are executed after the
46 * document has been parse. So this must be recorded on construction and
47 * stored for later use.
48 */
49 private ScriptCoordinate coordinate;
50
51 /**
52 * Constructor for Test.
53 */
54 private Command() {
55 super();
56 }
57
58 /**
59 * Constructor for Command.
60 *
61 * @param name
62 * @param arguments
63 * @param block
64 */
65 public Command(String name, Arguments arguments, Block block,
66 ScriptCoordinate coordinate) {
67 this();
68 this.coordinate = coordinate;
69 setName(name);
70 setArguments(arguments);
71 setBlock(block);
72 }
73
74 /**
75 * Returns the name.
76 *
77 * @return String
78 */
79 public String getName() {
80 return fieldName;
81 }
82
83 /**
84 * Sets the name.
85 *
86 * @param name
87 * The name to set
88 */
89 protected void setName(String name) {
90 fieldName = name;
91 }
92
93 /**
94 * @see java.lang.Object#toString()
95 */
96 public String toString() {
97 return "Command name: "
98 + getName()
99 + " "
100 + ((getArguments() == null) ? "null" : getArguments()
101 .toString()) + " Block: "
102 + ((getBlock() == null) ? "null" : getBlock().toString());
103 }
104
105 /**
106 * Returns the arguments.
107 *
108 * @return Arguments
109 */
110 public Arguments getArguments() {
111 return fieldArguments;
112 }
113
114 /**
115 * Returns the block.
116 *
117 * @return Block
118 */
119 public Block getBlock() {
120 return fieldBlock;
121 }
122
123 /**
124 * Sets the arguments.
125 *
126 * @param arguments
127 * The arguments to set
128 */
129 protected void setArguments(Arguments arguments) {
130 fieldArguments = arguments;
131 }
132
133 /**
134 * Sets the block.
135 *
136 * @param block
137 * The block to set
138 */
139 protected void setBlock(Block block) {
140 fieldBlock = block;
141 }
142
143 /**
144 * @see org.apache.jsieve.Executable#execute(MailAdapter, SieveContext)
145 */
146 public Object execute(MailAdapter mail, SieveContext context)
147 throws SieveException {
148 Log log = context.getLog();
149 if (log.isDebugEnabled()) {
150 log.debug(toString());
151 coordinate.debugDiagnostics(log);
152 }
153 // commands are executed after the parsing phase
154 // recursively from the top level block
155 // so need to use the coordinate recorded from the parse
156 context.setCoordinate(coordinate);
157 final ExecutableCommand executable = context.getCommand(getName());
158 final Object result = executable.execute(mail, getArguments(),
159 getBlock(), context);
160 return result;
161 }
162 }