001 /*
002 * Copyright 2010 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package com.hs.mail.sieve;
017
018 import java.io.IOException;
019 import java.lang.reflect.InvocationTargetException;
020 import java.util.ArrayList;
021 import java.util.HashSet;
022 import java.util.Iterator;
023 import java.util.List;
024 import java.util.ListIterator;
025 import java.util.Set;
026
027 import org.apache.james.mime4j.field.address.AddressList;
028 import org.apache.james.mime4j.field.address.Mailbox;
029 import org.apache.james.mime4j.field.address.MailboxList;
030 import org.apache.james.mime4j.field.address.parser.ParseException;
031 import org.apache.james.mime4j.message.Header;
032 import org.apache.james.mime4j.parser.Field;
033 import org.apache.jsieve.exception.InternetAddressException;
034 import org.apache.jsieve.exception.SieveException;
035 import org.apache.jsieve.mail.Action;
036 import org.apache.jsieve.mail.AddressImpl;
037 import org.apache.jsieve.mail.MailAdapter;
038 import org.apache.jsieve.mail.SieveMailException;
039
040 import com.hs.mail.mailet.MailetContext;
041 import com.hs.mail.smtp.message.SmtpMessage;
042
043 public class SieveMailAdapter implements MailAdapter {
044
045 /**
046 * The Message being adapted.
047 */
048 private SmtpMessage fieldMessage;
049 /**
050 * List of Actions to perform.
051 */
052 private List fieldActions;
053 /**
054 * The MailetContext.
055 */
056 private MailetContext fieldMailetContext;
057 /**
058 * The sole intended recipient for the message being adapted;
059 */
060 private String soleRecipient;
061 /**
062 * The ID of sole intended recipient for the message being adapted;
063 */
064 private long soleRecipientID;
065 /**
066 * Constructor for SieveMailAdapter.
067 */
068 public SieveMailAdapter(MailetContext aMailetContext, String soleRecipient,
069 long soleRecipientID) {
070 super();
071 setMailetContext(aMailetContext);
072 setSoleRecipient(soleRecipient);
073 setSoleRecipientID(soleRecipientID);
074 }
075
076 /**
077 * @return Returns the fieldMessage.
078 */
079 public SmtpMessage getMessage() {
080 return fieldMessage;
081 }
082
083 /**
084 * @param fieldMessage The fieldMessage to set.
085 */
086 public void setMessage(SmtpMessage aMessage) {
087 this.fieldMessage = aMessage;
088 clearActions();
089 }
090
091 /**
092 * @return Returns the soleRecipient.
093 */
094 public String getSoleRecipient() {
095 return soleRecipient;
096 }
097
098 /**
099 * @param soleRecipient
100 * The soleRecipient to set.
101 */
102 public void setSoleRecipient(String soleRecipient) {
103 this.soleRecipient = soleRecipient;
104 }
105
106 /**
107 * @return Returns the ID of soleRecipient.
108 */
109 public long getSoleRecipientID() {
110 return soleRecipientID;
111 }
112
113 /**
114 * @param soleRecipientID
115 * The ID of soleRecipient to set.
116 */
117 public void setSoleRecipientID(long soleRecipientID) {
118 this.soleRecipientID = soleRecipientID;
119 }
120
121 /**
122 * Returns the List of actions.
123 *
124 * @return List
125 */
126 public List getActions() {
127 List actions = null;
128 if (null == (actions = getActionsBasic())) {
129 updateActions();
130 return getActions();
131 }
132 return actions;
133 }
134
135 /**
136 * Remove all actions.
137 *
138 */
139 private void clearActions() {
140 getActions().clear();
141 }
142
143 /**
144 * Returns a new List of actions.
145 *
146 * @return List
147 */
148 protected List computeActions() {
149 return new ArrayList();
150 }
151
152 /**
153 * Returns the List of actions.
154 *
155 * @return List
156 */
157 private List getActionsBasic() {
158 return fieldActions;
159 }
160
161 /**
162 * Adds an Action.
163 *
164 * @param action The action to set
165 */
166 public void addAction(Action action) {
167 getActions().add(action);
168 }
169
170 /**
171 * @see org.apache.jsieve.mail.MailAdapter#executeActions()
172 */
173 public void executeActions() throws SieveException {
174 ListIterator actionsIter = getActionsIterator();
175 while (actionsIter.hasNext()) {
176 Action action = (Action) actionsIter.next();
177 try {
178 ActionDispatcher.getInstance().execute(action, this,
179 getMailetContext());
180 } catch (IllegalArgumentException e) {
181 throw new SieveException(e.getMessage());
182 } catch (NoSuchMethodException e) {
183 throw new SieveException(e.getMessage());
184 } catch (IllegalAccessException e) {
185 throw new SieveException(e.getMessage());
186 } catch (InvocationTargetException e) {
187 throw new SieveException(e.getMessage());
188 }
189 }
190 }
191
192 /**
193 * Sets the actions.
194 *
195 * @param actions
196 * The actions to set
197 */
198 protected void setActions(List actions) {
199 fieldActions = actions;
200 }
201
202 /**
203 * Updates the actions.
204 */
205 protected void updateActions() {
206 setActions(computeActions());
207 }
208
209 /**
210 * @see org.apache.jsieve.mail.MailAdapter#getActionsIterator()
211 */
212 public ListIterator getActionsIterator() {
213 return getActions().listIterator();
214 }
215
216 public Object getContent() throws SieveMailException {
217 // TODO Auto-generated method stub
218 return null;
219 }
220
221 public String getContentType() throws SieveMailException {
222 // TODO Auto-generated method stub
223 return null;
224 }
225
226 /**
227 * @see org.apache.jsieve.mail.MailAdapter#getHeader(String)
228 */
229 public List getHeader(String name) throws SieveMailException {
230 List<Field> fields = getHeader().getFields(name);
231 List headers = new ArrayList(fields.size());
232 for (Field field : fields) {
233 headers.add(field.getBody());
234 }
235 return headers;
236 }
237
238 /**
239 * @see org.apache.jsieve.mail.MailAdapter#getHeaderNames()
240 */
241 public List getHeaderNames() throws SieveMailException {
242 List<Field> fields = getHeader().getFields();
243 Set headerNames = new HashSet();
244 for (Field field : fields) {
245 headerNames.add(field.getName());
246 }
247 return new ArrayList(headerNames);
248 }
249
250 /**
251 * @see org.apache.jsieve.mail.MailAdapter#getMatchingHeader(String)
252 */
253 public List getMatchingHeader(String name) throws SieveMailException {
254 Iterator headerNamesIter = getHeaderNames().iterator();
255 List matchedHeaderValues = new ArrayList(32);
256 while (headerNamesIter.hasNext()) {
257 String headerName = (String) headerNamesIter.next();
258 if (headerName.trim().equalsIgnoreCase(name)) {
259 matchedHeaderValues.addAll(getHeader(headerName));
260 }
261 }
262 return matchedHeaderValues;
263 }
264
265 /**
266 * @see org.apache.jsieve.mail.MailAdapter#getSize()
267 */
268 public int getSize() throws SieveMailException {
269 try {
270 return (int) fieldMessage.getMailMessage().getSize();
271 } catch (IOException e) {
272 throw new SieveMailException(e);
273 }
274 }
275
276 public Address[] parseAddresses(String headerName)
277 throws SieveMailException, InternetAddressException {
278 try {
279 Field field = getHeader().getField(headerName);
280 MailboxList list = AddressList.parse(field.getBody()).flatten();
281 final int size = list.size();
282 final Address[] results = new Address[size];
283 for (int i=0;i<size;i++) {
284 final Mailbox mailbox = list.get(i);
285 results[i] = new AddressImpl(mailbox.getLocalPart(), mailbox.getDomain());
286 }
287 return null;
288 } catch (ParseException e) {
289 throw new InternetAddressException(e);
290 }
291 }
292
293 private Header getHeader() {
294 try {
295 return fieldMessage.getMailMessage().getHeader().getHeader();
296 } catch (IOException e) {
297 return null;
298 }
299 }
300
301 /**
302 * Returns the mailetContext.
303 *
304 * @return MailetContext
305 */
306 public MailetContext getMailetContext() {
307 return fieldMailetContext;
308 }
309
310 /**
311 * Sets the mailetContext.
312 *
313 * @param mailetContext
314 * The mailetContext to set
315 */
316 protected void setMailetContext(MailetContext mailetContext) {
317 fieldMailetContext = mailetContext;
318 }
319
320 }