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