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    }