1 /************************************************************************
2 * Copyright (c) 2000-2006 The Apache Software Foundation. *
3 * All rights reserved. *
4 * ------------------------------------------------------------------- *
5 * Licensed under the Apache License, Version 2.0 (the "License"); you *
6 * may not use this file except in compliance with the License. You *
7 * may obtain a copy of the License at: *
8 * *
9 * http://www.apache.org/licenses/LICENSE-2.0 *
10 * *
11 * Unless required by applicable law or agreed to in writing, software *
12 * distributed under the License is distributed on an "AS IS" BASIS, *
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or *
14 * implied. See the License for the specific language governing *
15 * permissions and limitations under the License. *
16 ***********************************************************************/
17
18 package org.apache.james.transport.matchers;
19
20 import java.util.Collection;
21
22 import javax.mail.MessagingException;
23
24 import org.apache.mailet.GenericMatcher;
25 import org.apache.mailet.Mail;
26 import org.apache.mailet.MatcherConfig;
27
28 /***
29 * <p>This Matcher determines if the mail contains the attribute specified in
30 * the condition and if the value answered when the method toString() is
31 * invoked on the attribute is equal to the String value specified in the
32 * condition. If both tests are true, all recipients are returned, else null.
33 * </p>
34 *
35 * <p>Notes:</p>
36 * <p>The current matcher implementation expects a single String value to match
37 * on. This matcher requires two values, the attribute name and attribute
38 * value. This requires some implicit rules to govern how the single value
39 * supplied to the matcher is parsed into two values.</p>
40 * <ul>
41 * <li>In the match condition, the split between the attribute name and the
42 * attribute value is made at the first comma. Attribute names that include
43 * a comma will parse incorrectly and therefore are not supported by this
44 * matcher.
45 * </li>
46 * <li>Leading and trailing spaces are removed from both the attribute name and
47 * attribute value specified in the condition and the tested attribute value in
48 * the mail prior to matching. Therefore, "abc" , " abc", "abc " and " abc "
49 * are considered equivalent.
50 * </li>
51 * <li>To test for an empty string, do not specify an attribute value after the
52 * comma.
53 * </li>
54 * </ul>
55 *
56 * <p>Sample configuration:</p>
57 * <pre><code>
58 * <mailet match="HasMailAttributeWithValue=name, value" class="<any-class>">
59 * </code></pre>
60 *
61 * @version CVS $Revision: 365582 $ $Date: 2006-01-03 08:51:21 +0000 (mar, 03 gen 2006) $
62 * @since 2.2.0
63 **/
64 public class HasMailAttributeWithValue extends GenericMatcher
65 {
66
67 /***
68 * The name of the attribute to match
69 */
70 private String fieldAttributeName;
71
72 /***
73 * The value of the attribute to match
74 */
75 private String fieldAttributeValue;
76
77
78 /***
79 * <p>Answers the recipients of the mail if the attribute is present,
80 * and has a toString() value equal to the configured value.</p>
81 *
82 * @see org.apache.mailet.Matcher#match(Mail)
83 */
84 public Collection match(Mail mail) throws MessagingException
85 {
86 Object attributeValue = mail.getAttribute(getAttributeName());
87
88 if (attributeValue != null
89 && attributeValue.toString().trim().equals(getAttributeValue()))
90 return mail.getRecipients();
91 return null;
92 }
93
94 /***
95 * Returns the attributeName.
96 * @return String
97 */
98 protected String getAttributeName()
99 {
100 return fieldAttributeName;
101 }
102
103 /***
104 * Returns the attributeValue.
105 * @return String
106 */
107 protected String getAttributeValue()
108 {
109 return fieldAttributeValue;
110 }
111
112 /***
113 * Sets the attributeName.
114 * @param attributeName The attributeName to set
115 */
116 protected void setAttributeName(String attributeName)
117 {
118 fieldAttributeName = attributeName;
119 }
120
121 /***
122 * Sets the attributeValue.
123 * @param attributeValue The attributeValue to set
124 */
125 protected void setAttributeValue(String attributeValue)
126 {
127 fieldAttributeValue = attributeValue;
128 }
129
130 /***
131 * @see org.apache.mailet.Matcher#init(MatcherConfig)
132 */
133 public void init(MatcherConfig config) throws MessagingException
134 {
135 super.init(config);
136 String condition = config.getCondition().trim();
137 int commaPosition = condition.indexOf(',');
138
139 if (-1 == commaPosition)
140 throw new MessagingException("Syntax Error. Missing ','.");
141
142 if (0 == commaPosition)
143 throw new MessagingException("Syntax Error. Missing attribute name.");
144
145 setAttributeName(condition.substring(0, commaPosition).trim());
146 setAttributeValue(condition.substring(commaPosition + 1).trim());
147 }
148
149 /***
150 * Return a string describing this matcher.
151 *
152 * @return a string describing this matcher
153 */
154 public String getMatcherInfo() {
155 return "Has Mail Attribute With Value Matcher";
156 }
157 }