Coverage Report - org.apache.camel.component.mail.MailConsumer
 
Classes in this File Line Coverage Branch Coverage Complexity
MailConsumer
72% 
75% 
0
 
 1  
 /**
 2  
  * Licensed to the Apache Software Foundation (ASF) under one or more
 3  
  * contributor license agreements.  See the NOTICE file distributed with
 4  
  * this work for additional information regarding copyright ownership.
 5  
  * The ASF licenses this file to You under the Apache License, Version 2.0
 6  
  * (the "License"); you may not use this file except in compliance with
 7  
  * the License.  You 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 implied.
 14  
  * See the License for the specific language governing permissions and
 15  
  * limitations under the License.
 16  
  */
 17  
 package org.apache.camel.component.mail;
 18  
 
 19  
 import javax.mail.Flags;
 20  
 import javax.mail.Folder;
 21  
 import javax.mail.Message;
 22  
 import javax.mail.MessagingException;
 23  
 import javax.mail.event.MessageCountEvent;
 24  
 import javax.mail.event.MessageCountListener;
 25  
 
 26  
 import org.apache.camel.Processor;
 27  
 import org.apache.camel.impl.ScheduledPollConsumer;
 28  
 import org.apache.commons.logging.Log;
 29  
 import org.apache.commons.logging.LogFactory;
 30  
 
 31  
 /**
 32  
  * A {@link Consumer} which consumes messages from JavaMail using a
 33  
  * {@link Transport} and dispatches them to the {@link Processor}
 34  
  * 
 35  
  * @version $Revision: 523430 $
 36  
  */
 37  
 public class MailConsumer extends ScheduledPollConsumer<MailExchange> implements MessageCountListener {
 38  1
     private static final transient Log LOG = LogFactory.getLog(MailConsumer.class);
 39  
     private final MailEndpoint endpoint;
 40  
     private final Folder folder;
 41  
 
 42  
     public MailConsumer(MailEndpoint endpoint, Processor processor, Folder folder) {
 43  4
         super(endpoint, processor);
 44  4
         this.endpoint = endpoint;
 45  4
         this.folder = folder;
 46  4
     }
 47  
 
 48  
     @Override
 49  
     protected void doStart() throws Exception {
 50  4
         super.doStart();
 51  4
         ensureFolderIsOpen();
 52  4
         folder.addMessageCountListener(this);
 53  4
     }
 54  
 
 55  
     @Override
 56  
     protected void doStop() throws Exception {
 57  4
         folder.removeMessageCountListener(this);
 58  4
         folder.close(true);
 59  4
         super.doStop();
 60  4
     }
 61  
 
 62  
     public void messagesAdded(MessageCountEvent event) {
 63  12
         Message[] messages = event.getMessages();
 64  27
         for (Message message : messages) {
 65  
             try {
 66  15
                 if (!message.getFlags().contains(Flags.Flag.DELETED)) {
 67  4
                     processMessage(message);
 68  
 
 69  4
                     flagMessageDeleted(message);
 70  
                 }
 71  0
             } catch (MessagingException e) {
 72  0
                 handleException(e);
 73  15
             }
 74  
         }
 75  12
     }
 76  
 
 77  
     public void messagesRemoved(MessageCountEvent event) {
 78  0
         Message[] messages = event.getMessages();
 79  0
         for (Message message : messages) {
 80  0
             if (LOG.isDebugEnabled()) {
 81  
                 try {
 82  0
                     LOG.debug("Removing message: " + message.getSubject());
 83  0
                 } catch (MessagingException e) {
 84  0
                     LOG.debug("Ignored: " + e);
 85  0
                 }
 86  
             }
 87  
         }
 88  0
     }
 89  
 
 90  
     protected void poll() throws Exception {
 91  12
         ensureFolderIsOpen();
 92  
 
 93  12
         int count = folder.getMessageCount();
 94  12
         if (count > 0) {
 95  12
             Message[] messages = folder.getMessages();
 96  12
             MessageCountEvent event = new MessageCountEvent(folder, MessageCountEvent.ADDED, true, messages);
 97  12
             messagesAdded(event);
 98  12
         } else if (count == -1) {
 99  0
             throw new MessagingException("Folder: " + folder.getFullName() + " is closed");
 100  
         }
 101  
 
 102  12
         folder.close(true);
 103  12
     }
 104  
 
 105  
     protected void processMessage(Message message) {
 106  
         try {
 107  4
             MailExchange exchange = endpoint.createExchange(message);
 108  4
             getProcessor().process(exchange);
 109  0
         } catch (Throwable e) {
 110  0
             handleException(e);
 111  4
         }
 112  4
     }
 113  
 
 114  
     protected void ensureFolderIsOpen() throws MessagingException {
 115  16
         if (!folder.isOpen()) {
 116  0
             folder.open(Folder.READ_WRITE);
 117  
         }
 118  16
     }
 119  
 
 120  
     protected void flagMessageDeleted(Message message) throws MessagingException {
 121  4
         if (endpoint.getConfiguration().isDeleteProcessedMessages()) {
 122  4
             message.setFlag(Flags.Flag.DELETED, true);
 123  4
         } else {
 124  0
             message.setFlag(Flags.Flag.SEEN, true);
 125  
         }
 126  4
     }
 127  
 }