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 private final FlagChangeListener flagChangeListener;
043 private Folder folder;
044 private final MailboxFolder mbf;
045 private final long mockid;
046 protected final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(this.getClass());
047
048 protected MockMessage(final Message source, final Folder folder) throws MessagingException {
049 this((MimeMessage) source, ((MockMessage) source).mockid, ((MockMessage) source).mbf, ((MockMessage) source).flagChangeListener);
050 this.folder = folder;
051 this.setMessageNumber(source.getMessageNumber());
052 }
053
054 protected MockMessage(final MimeMessage source, final long mockid, final MailboxFolder mbf, final FlagChangeListener flagChangeListener)
055 throws MessagingException {
056 super(source);
057 this.mockid = mockid;
058 this.flagChangeListener = flagChangeListener;
059 this.mbf = mbf;
060
061 }
062
063 /* (non-Javadoc)
064 * @see javax.mail.internet.MimeMessage#addFrom(javax.mail.Address[])
065 */
066 @Override
067 public void addFrom(final Address[] addresses) throws MessagingException {
068
069 throw new IllegalWriteException("Mock messages are read-only");
070 }
071
072 /* (non-Javadoc)
073 * @see javax.mail.internet.MimeMessage#addHeader(java.lang.String, java.lang.String)
074 */
075 @Override
076 public void addHeader(final String name, final String value) throws MessagingException {
077 throw new IllegalWriteException("Mock messages are read-only");
078 }
079
080 /* (non-Javadoc)
081 * @see javax.mail.internet.MimeMessage#addHeaderLine(java.lang.String)
082 */
083 @Override
084 public void addHeaderLine(final String line) throws MessagingException {
085 throw new IllegalWriteException("Mock messages are read-only");
086 }
087
088 /* (non-Javadoc)
089 * @see javax.mail.Message#addRecipient(javax.mail.Message.RecipientType, javax.mail.Address)
090 */
091 @Override
092 public void addRecipient(final javax.mail.Message.RecipientType type, final Address address) throws MessagingException {
093 throw new IllegalWriteException("Mock messages are read-only");
094 }
095
096 /* (non-Javadoc)
097 * @see javax.mail.internet.MimeMessage#addRecipients(javax.mail.Message.RecipientType, javax.mail.Address[])
098 */
099 @Override
100 public void addRecipients(final javax.mail.Message.RecipientType type, final Address[] addresses) throws MessagingException {
101 throw new IllegalWriteException("Mock messages are read-only");
102 }
103
104 /* (non-Javadoc)
105 * @see javax.mail.internet.MimeMessage#addRecipients(javax.mail.Message.RecipientType, java.lang.String)
106 */
107 @Override
108 public void addRecipients(final javax.mail.Message.RecipientType type, final String addresses) throws MessagingException {
109 throw new IllegalWriteException("Mock messages are read-only");
110 }
111
112 @Override
113 public int compareTo(final MockMessage o) {
114
115 return new Long(this.getMockid()).compareTo(new Long(o.getMockid()));
116 }
117
118 @Override
119 public synchronized Folder getFolder() {
120 if (folder == null) {
121 throw new RuntimeException("wrong/unshaded mock message");
122 } else {
123 return folder;
124 }
125 }
126
127 /**
128 * @return the mockid
129 */
130 public long getMockid() {
131 return mockid;
132 }
133
134 // IllegalWriteException("Mock messages are read-only");
135
136 /* (non-Javadoc)
137 * @see javax.mail.internet.MimeMessage#removeHeader(java.lang.String)
138 */
139 @Override
140 public void removeHeader(final String name) throws MessagingException {
141 throw new IllegalWriteException("Mock messages are read-only");
142 }
143
144 /* (non-Javadoc)
145 * @see javax.mail.internet.MimeMessage#saveChanges()
146 */
147 @Override
148 public void saveChanges() throws MessagingException {
149 throw new IllegalWriteException("Mock messages are read-only");
150 }
151
152 /* (non-Javadoc)
153 * @see javax.mail.internet.MimeMessage#setContent(javax.mail.Multipart)
154 */
155 @Override
156 public void setContent(final Multipart mp) throws MessagingException {
157 throw new IllegalWriteException("Mock messages are read-only");
158 }
159
160 /* (non-Javadoc)
161 * @see javax.mail.internet.MimeMessage#setContent(java.lang.Object, java.lang.String)
162 */
163 @Override
164 public void setContent(final Object o, final String type) throws MessagingException {
165 throw new IllegalWriteException("Mock messages are read-only");
166 }
167
168 /* (non-Javadoc)
169 * @see javax.mail.internet.MimeMessage#setContentID(java.lang.String)
170 */
171 @Override
172 public void setContentID(final String cid) throws MessagingException {
173 throw new IllegalWriteException("Mock messages are read-only");
174 }
175
176 /* (non-Javadoc)
177 * @see javax.mail.internet.MimeMessage#setContentLanguage(java.lang.String[])
178 */
179 @Override
180 public void setContentLanguage(final String[] languages) throws MessagingException {
181 throw new IllegalWriteException("Mock messages are read-only");
182 }
183
184 /* (non-Javadoc)
185 * @see javax.mail.internet.MimeMessage#setContentMD5(java.lang.String)
186 */
187 @Override
188 public void setContentMD5(final String md5) throws MessagingException {
189 throw new IllegalWriteException("Mock messages are read-only");
190 }
191
192 @Override
193 public void setDataHandler(final DataHandler content) throws MessagingException {
194 throw new IllegalWriteException("Mock messages are read-only");
195 }
196
197 /* (non-Javadoc)
198 * @see javax.mail.internet.MimeMessage#setDescription(java.lang.String)
199 */
200 @Override
201 public void setDescription(final String description) throws MessagingException {
202 throw new IllegalWriteException("Mock messages are read-only");
203 }
204
205 /* (non-Javadoc)
206 * @see javax.mail.internet.MimeMessage#setDescription(java.lang.String, java.lang.String)
207 */
208 @Override
209 public void setDescription(final String description, final String charset) throws MessagingException {
210 throw new IllegalWriteException("Mock messages are read-only");
211 }
212
213 /* (non-Javadoc)
214 * @see javax.mail.internet.MimeMessage#setDisposition(java.lang.String)
215 */
216 @Override
217 public void setDisposition(final String disposition) throws MessagingException {
218 throw new IllegalWriteException("Mock messages are read-only");
219 }
220
221 /* (non-Javadoc)
222 * @see javax.mail.internet.MimeMessage#setFileName(java.lang.String)
223 */
224 @Override
225 public void setFileName(final String filename) throws MessagingException {
226 throw new IllegalWriteException("Mock messages are read-only");
227 }
228
229 /* (non-Javadoc)
230 * @see javax.mail.internet.MimeMessage#setFlags(javax.mail.Flags, boolean)
231 */
232 @Override
233 public synchronized void setFlags(final Flags flag, final boolean set) throws MessagingException {
234
235 super.setFlags(flag, set);
236
237 if (flagChangeListener != null) {
238 flagChangeListener.onFlagChange(this, flag, set);
239 }
240
241 }
242
243 /* (non-Javadoc)
244 * @see javax.mail.internet.MimeMessage#setFrom()
245 */
246 @Override
247 public void setFrom() throws MessagingException {
248 throw new IllegalWriteException("Mock messages are read-only");
249 }
250
251 /* (non-Javadoc)
252 * @see javax.mail.internet.MimeMessage#setFrom(javax.mail.Address)
253 */
254 @Override
255 public void setFrom(final Address address) throws MessagingException {
256 throw new IllegalWriteException("Mock messages are read-only");
257 }
258
259 /* (non-Javadoc)
260 * @see javax.mail.internet.MimeMessage#setFrom(java.lang.String)
261 */
262 @Override
263 public void setFrom(final String address) throws MessagingException {
264 throw new IllegalWriteException("Mock messages are read-only");
265 }
266
267 /* (non-Javadoc)
268 * @see javax.mail.internet.MimeMessage#setHeader(java.lang.String, java.lang.String)
269 */
270 @Override
271 public void setHeader(final String name, final String value) throws MessagingException {
272 throw new IllegalWriteException("Mock messages are read-only");
273 }
274
275 /* (non-Javadoc)
276 * @see javax.mail.Message#setRecipient(javax.mail.Message.RecipientType, javax.mail.Address)
277 */
278 @Override
279 public void setRecipient(final javax.mail.Message.RecipientType type, final Address address) throws MessagingException {
280 throw new IllegalWriteException("Mock messages are read-only");
281 }
282
283 /* (non-Javadoc)
284 * @see javax.mail.internet.MimeMessage#setRecipients(javax.mail.Message.RecipientType, javax.mail.Address[])
285 */
286 @Override
287 public void setRecipients(final javax.mail.Message.RecipientType type, final Address[] addresses) throws MessagingException {
288 throw new IllegalWriteException("Mock messages are read-only");
289 }
290
291 /* (non-Javadoc)
292 * @see javax.mail.internet.MimeMessage#setRecipients(javax.mail.Message.RecipientType, java.lang.String)
293 */
294 @Override
295 public void setRecipients(final javax.mail.Message.RecipientType type, final String addresses) throws MessagingException {
296 throw new IllegalWriteException("Mock messages are read-only");
297 }
298
299 /* (non-Javadoc)
300 * @see javax.mail.internet.MimeMessage#setReplyTo(javax.mail.Address[])
301 */
302 @Override
303 public void setReplyTo(final Address[] addresses) throws MessagingException {
304 throw new IllegalWriteException("Mock messages are read-only");
305 }
306
307 /* (non-Javadoc)
308 * @see javax.mail.internet.MimeMessage#setSender(javax.mail.Address)
309 */
310 @Override
311 public void setSender(final Address address) throws MessagingException {
312 throw new IllegalWriteException("Mock messages are read-only");
313 }
314
315 /* (non-Javadoc)
316 * @see javax.mail.internet.MimeMessage#setSentDate(java.util.Date)
317 */
318 @Override
319 public void setSentDate(final Date d) throws MessagingException {
320 throw new IllegalWriteException("Mock messages are read-only");
321 }
322
323 /* (non-Javadoc)
324 * @see javax.mail.internet.MimeMessage#setSubject(java.lang.String)
325 */
326 @Override
327 public void setSubject(final String subject) throws MessagingException {
328 throw new IllegalWriteException("Mock messages are read-only");
329 }
330
331 /* (non-Javadoc)
332 * @see javax.mail.internet.MimeMessage#setSubject(java.lang.String, java.lang.String)
333 */
334 @Override
335 public void setSubject(final String subject, final String charset) throws MessagingException {
336 throw new IllegalWriteException("Mock messages are read-only");
337 }
338
339 /* (non-Javadoc)
340 * @see javax.mail.internet.MimeMessage#setText(java.lang.String)
341 */
342 @Override
343 public void setText(final String text) throws MessagingException {
344 throw new IllegalWriteException("Mock messages are read-only");
345 }
346
347 /* (non-Javadoc)
348 * @see javax.mail.internet.MimeMessage#setText(java.lang.String, java.lang.String)
349 */
350 @Override
351 public void setText(final String text, final String charset) throws MessagingException {
352 throw new IllegalWriteException("Mock messages are read-only");
353 }
354
355 /* (non-Javadoc)
356 * @see javax.mail.internet.MimeMessage#setText(java.lang.String, java.lang.String, java.lang.String)
357 */
358 @Override
359 public void setText(final String text, final String charset, final String subtype) throws MessagingException {
360 throw new IllegalWriteException("Mock messages are read-only");
361 }
362
363 @Override
364 protected void setExpunged(final boolean expunged) {
365
366 super.setExpunged(expunged);
367 }
368
369 @Override
370 protected void setMessageNumber(final int msgnum) {
371
372 super.setMessageNumber(msgnum);
373 }
374
375 void setSpecialHeader(final String name, final String value) throws MessagingException {
376 super.addHeader(name, value);
377 }
378
379 public static interface FlagChangeListener {
380 void onFlagChange(MockMessage msg, Flags flags, boolean set);
381 }
382
383 }