001 /***********************************************************************************************************************
002 *
003 * JavaMail Mock2 Provider - open source mock classes for mock up JavaMail
004 * =======================================================================
005 *
006 * Copyright (C) 2014 by Hendrik Saly (http://saly.de)
007 *
008 * Based on ideas from Kohsuke Kawaguchi's Mock-javamail (https://java.net/projects/mock-javamail)
009 *
010 ***********************************************************************************************************************
011 *
012 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
013 * the License. You may obtain a copy of the License at
014 *
015 * http://www.apache.org/licenses/LICENSE-2.0
016 *
017 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
018 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
019 * specific language governing permissions and limitations under the License.
020 *
021 ***********************************************************************************************************************
022 *
023 * $Id:$
024 *
025 **********************************************************************************************************************/
026 package de.saly.javamail.mock2;
027
028 import java.util.Date;
029
030 import javax.activation.DataHandler;
031 import javax.mail.Address;
032 import javax.mail.Flags;
033 import javax.mail.Folder;
034 import javax.mail.IllegalWriteException;
035 import javax.mail.Message;
036 import javax.mail.MessagingException;
037 import javax.mail.Multipart;
038 import javax.mail.internet.MimeMessage;
039
040 public class MockMessage extends MimeMessage implements Comparable<MockMessage> {
041
042 public static interface FlagChangeListener {
043 void onFlagChange(MockMessage msg, Flags flags, boolean set);
044 }
045
046 private final FlagChangeListener flagChangeListener;
047 private Folder folder;
048 protected final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(this.getClass());
049 private final MailboxFolder mbf;
050
051 private final long mockid;
052
053 protected MockMessage(final Message source, final Folder folder) throws MessagingException {
054 this((MimeMessage) source, ((MockMessage) source).mockid, ((MockMessage) source).mbf, ((MockMessage) source).flagChangeListener);
055 this.folder = folder;
056 this.setMessageNumber(source.getMessageNumber());
057 }
058
059 protected MockMessage(final MimeMessage source, final long mockid, final MailboxFolder mbf, final FlagChangeListener flagChangeListener)
060 throws MessagingException {
061 super(source);
062 this.mockid = mockid;
063 this.flagChangeListener = flagChangeListener;
064 this.mbf = mbf;
065
066 }
067
068 /* (non-Javadoc)
069 * @see javax.mail.internet.MimeMessage#addFrom(javax.mail.Address[])
070 */
071 @Override
072 public void addFrom(final Address[] addresses) throws MessagingException {
073
074 throw new IllegalWriteException("Mock messages are read-only");
075 }
076
077 /* (non-Javadoc)
078 * @see javax.mail.internet.MimeMessage#addHeader(java.lang.String, java.lang.String)
079 */
080 @Override
081 public void addHeader(final String name, final String value) throws MessagingException {
082 throw new IllegalWriteException("Mock messages are read-only");
083 }
084
085 /* (non-Javadoc)
086 * @see javax.mail.internet.MimeMessage#addHeaderLine(java.lang.String)
087 */
088 @Override
089 public void addHeaderLine(final String line) throws MessagingException {
090 throw new IllegalWriteException("Mock messages are read-only");
091 }
092
093 /* (non-Javadoc)
094 * @see javax.mail.Message#addRecipient(javax.mail.Message.RecipientType, javax.mail.Address)
095 */
096 @Override
097 public void addRecipient(final javax.mail.Message.RecipientType type, final Address address) throws MessagingException {
098 throw new IllegalWriteException("Mock messages are read-only");
099 }
100
101 /* (non-Javadoc)
102 * @see javax.mail.internet.MimeMessage#addRecipients(javax.mail.Message.RecipientType, javax.mail.Address[])
103 */
104 @Override
105 public void addRecipients(final javax.mail.Message.RecipientType type, final Address[] addresses) throws MessagingException {
106 throw new IllegalWriteException("Mock messages are read-only");
107 }
108
109 /* (non-Javadoc)
110 * @see javax.mail.internet.MimeMessage#addRecipients(javax.mail.Message.RecipientType, java.lang.String)
111 */
112 @Override
113 public void addRecipients(final javax.mail.Message.RecipientType type, final String addresses) throws MessagingException {
114 throw new IllegalWriteException("Mock messages are read-only");
115 }
116
117 @Override
118 public int compareTo(final MockMessage o) {
119
120 return new Long(this.getMockid()).compareTo(new Long(o.getMockid()));
121 }
122
123 @Override
124 public synchronized Folder getFolder() {
125 if (folder == null) {
126 throw new RuntimeException("wrong/unshaded mock message");
127 } else {
128 return folder;
129 }
130 }
131
132 // IllegalWriteException("Mock messages are read-only");
133
134 /**
135 * @return the mockid
136 */
137 public long getMockid() {
138 return mockid;
139 }
140
141 /* (non-Javadoc)
142 * @see javax.mail.internet.MimeMessage#removeHeader(java.lang.String)
143 */
144 @Override
145 public void removeHeader(final String name) throws MessagingException {
146 throw new IllegalWriteException("Mock messages are read-only");
147 }
148
149 /* (non-Javadoc)
150 * @see javax.mail.internet.MimeMessage#saveChanges()
151 */
152 @Override
153 public void saveChanges() throws MessagingException {
154 throw new IllegalWriteException("Mock messages are read-only");
155 }
156
157 /* (non-Javadoc)
158 * @see javax.mail.internet.MimeMessage#setContent(javax.mail.Multipart)
159 */
160 @Override
161 public void setContent(final Multipart mp) throws MessagingException {
162 throw new IllegalWriteException("Mock messages are read-only");
163 }
164
165 /* (non-Javadoc)
166 * @see javax.mail.internet.MimeMessage#setContent(java.lang.Object, java.lang.String)
167 */
168 @Override
169 public void setContent(final Object o, final String type) throws MessagingException {
170 throw new IllegalWriteException("Mock messages are read-only");
171 }
172
173 /* (non-Javadoc)
174 * @see javax.mail.internet.MimeMessage#setContentID(java.lang.String)
175 */
176 @Override
177 public void setContentID(final String cid) throws MessagingException {
178 throw new IllegalWriteException("Mock messages are read-only");
179 }
180
181 /* (non-Javadoc)
182 * @see javax.mail.internet.MimeMessage#setContentLanguage(java.lang.String[])
183 */
184 @Override
185 public void setContentLanguage(final String[] languages) throws MessagingException {
186 throw new IllegalWriteException("Mock messages are read-only");
187 }
188
189 /* (non-Javadoc)
190 * @see javax.mail.internet.MimeMessage#setContentMD5(java.lang.String)
191 */
192 @Override
193 public void setContentMD5(final String md5) throws MessagingException {
194 throw new IllegalWriteException("Mock messages are read-only");
195 }
196
197 @Override
198 public void setDataHandler(final DataHandler content) throws MessagingException {
199 throw new IllegalWriteException("Mock messages are read-only");
200 }
201
202 /* (non-Javadoc)
203 * @see javax.mail.internet.MimeMessage#setDescription(java.lang.String)
204 */
205 @Override
206 public void setDescription(final String description) throws MessagingException {
207 throw new IllegalWriteException("Mock messages are read-only");
208 }
209
210 /* (non-Javadoc)
211 * @see javax.mail.internet.MimeMessage#setDescription(java.lang.String, java.lang.String)
212 */
213 @Override
214 public void setDescription(final String description, final String charset) throws MessagingException {
215 throw new IllegalWriteException("Mock messages are read-only");
216 }
217
218 /* (non-Javadoc)
219 * @see javax.mail.internet.MimeMessage#setDisposition(java.lang.String)
220 */
221 @Override
222 public void setDisposition(final String disposition) throws MessagingException {
223 throw new IllegalWriteException("Mock messages are read-only");
224 }
225
226 @Override
227 protected void setExpunged(final boolean expunged) {
228
229 super.setExpunged(expunged);
230 }
231
232 /* (non-Javadoc)
233 * @see javax.mail.internet.MimeMessage#setFileName(java.lang.String)
234 */
235 @Override
236 public void setFileName(final String filename) throws MessagingException {
237 throw new IllegalWriteException("Mock messages are read-only");
238 }
239
240 /* (non-Javadoc)
241 * @see javax.mail.internet.MimeMessage#setFlags(javax.mail.Flags, boolean)
242 */
243 @Override
244 public synchronized void setFlags(final Flags flag, final boolean set) throws MessagingException {
245
246 super.setFlags(flag, set);
247
248 if (flagChangeListener != null) {
249 flagChangeListener.onFlagChange(this, flag, set);
250 }
251
252 }
253
254 /* (non-Javadoc)
255 * @see javax.mail.internet.MimeMessage#setFrom()
256 */
257 @Override
258 public void setFrom() throws MessagingException {
259 throw new IllegalWriteException("Mock messages are read-only");
260 }
261
262 /* (non-Javadoc)
263 * @see javax.mail.internet.MimeMessage#setFrom(javax.mail.Address)
264 */
265 @Override
266 public void setFrom(final Address address) throws MessagingException {
267 throw new IllegalWriteException("Mock messages are read-only");
268 }
269
270 /* (non-Javadoc)
271 * @see javax.mail.internet.MimeMessage#setFrom(java.lang.String)
272 */
273 @Override
274 public void setFrom(final String address) throws MessagingException {
275 throw new IllegalWriteException("Mock messages are read-only");
276 }
277
278 /* (non-Javadoc)
279 * @see javax.mail.internet.MimeMessage#setHeader(java.lang.String, java.lang.String)
280 */
281 @Override
282 public void setHeader(final String name, final String value) throws MessagingException {
283 throw new IllegalWriteException("Mock messages are read-only");
284 }
285
286 @Override
287 protected void setMessageNumber(final int msgnum) {
288
289 super.setMessageNumber(msgnum);
290 }
291
292 /* (non-Javadoc)
293 * @see javax.mail.Message#setRecipient(javax.mail.Message.RecipientType, javax.mail.Address)
294 */
295 @Override
296 public void setRecipient(final javax.mail.Message.RecipientType type, final Address address) throws MessagingException {
297 throw new IllegalWriteException("Mock messages are read-only");
298 }
299
300 /* (non-Javadoc)
301 * @see javax.mail.internet.MimeMessage#setRecipients(javax.mail.Message.RecipientType, javax.mail.Address[])
302 */
303 @Override
304 public void setRecipients(final javax.mail.Message.RecipientType type, final Address[] addresses) throws MessagingException {
305 throw new IllegalWriteException("Mock messages are read-only");
306 }
307
308 /* (non-Javadoc)
309 * @see javax.mail.internet.MimeMessage#setRecipients(javax.mail.Message.RecipientType, java.lang.String)
310 */
311 @Override
312 public void setRecipients(final javax.mail.Message.RecipientType type, final String addresses) throws MessagingException {
313 throw new IllegalWriteException("Mock messages are read-only");
314 }
315
316 /* (non-Javadoc)
317 * @see javax.mail.internet.MimeMessage#setReplyTo(javax.mail.Address[])
318 */
319 @Override
320 public void setReplyTo(final Address[] addresses) throws MessagingException {
321 throw new IllegalWriteException("Mock messages are read-only");
322 }
323
324 /* (non-Javadoc)
325 * @see javax.mail.internet.MimeMessage#setSender(javax.mail.Address)
326 */
327 @Override
328 public void setSender(final Address address) throws MessagingException {
329 throw new IllegalWriteException("Mock messages are read-only");
330 }
331
332 /* (non-Javadoc)
333 * @see javax.mail.internet.MimeMessage#setSentDate(java.util.Date)
334 */
335 @Override
336 public void setSentDate(final Date d) throws MessagingException {
337 throw new IllegalWriteException("Mock messages are read-only");
338 }
339
340 void setSpecialHeader(final String name, final String value) throws MessagingException {
341 super.addHeader(name, value);
342 }
343
344 /* (non-Javadoc)
345 * @see javax.mail.internet.MimeMessage#setSubject(java.lang.String)
346 */
347 @Override
348 public void setSubject(final String subject) throws MessagingException {
349 throw new IllegalWriteException("Mock messages are read-only");
350 }
351
352 /* (non-Javadoc)
353 * @see javax.mail.internet.MimeMessage#setSubject(java.lang.String, java.lang.String)
354 */
355 @Override
356 public void setSubject(final String subject, final String charset) throws MessagingException {
357 throw new IllegalWriteException("Mock messages are read-only");
358 }
359
360 /* (non-Javadoc)
361 * @see javax.mail.internet.MimeMessage#setText(java.lang.String)
362 */
363 @Override
364 public void setText(final String text) throws MessagingException {
365 throw new IllegalWriteException("Mock messages are read-only");
366 }
367
368 /* (non-Javadoc)
369 * @see javax.mail.internet.MimeMessage#setText(java.lang.String, java.lang.String)
370 */
371 @Override
372 public void setText(final String text, final String charset) throws MessagingException {
373 throw new IllegalWriteException("Mock messages are read-only");
374 }
375
376 /* (non-Javadoc)
377 * @see javax.mail.internet.MimeMessage#setText(java.lang.String, java.lang.String, java.lang.String)
378 */
379 @Override
380 public void setText(final String text, final String charset, final String subtype) throws MessagingException {
381 throw new IllegalWriteException("Mock messages are read-only");
382 }
383
384 }