001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel.component.mail;
018    
019    import java.util.Map;
020    import javax.activation.DataHandler;
021    import javax.mail.Message;
022    import javax.mail.MessagingException;
023    
024    import org.apache.camel.RuntimeCamelException;
025    import org.apache.camel.impl.DefaultMessage;
026    import org.apache.camel.util.ExchangeHelper;
027    
028    /**
029     * Represents a {@link org.apache.camel.Message} for working with Mail
030     *
031     * @version 
032     */
033    public class MailMessage extends DefaultMessage {
034        // we need a copy of the original message in case we need to workaround a charset issue when extracting
035        // mail content, see more in MailBinding
036        private Message originalMailMessage;
037        private Message mailMessage;
038    
039        public MailMessage() {
040        }
041    
042        public MailMessage(Message message) {
043            this.originalMailMessage = this.mailMessage = message;
044        }
045    
046        @Override
047        public String toString() {
048            if (mailMessage != null) {
049                return "MailMessage: " + MailUtils.dumpMessage(mailMessage);
050            } else {
051                return "MailMessage: " + getBody();
052            }
053        }
054    
055        public MailMessage copy() {
056            MailMessage answer = (MailMessage)super.copy();
057            answer.originalMailMessage = originalMailMessage;
058            answer.mailMessage = mailMessage;
059            return answer;
060        }
061    
062        /**
063         * Returns the original underlying Mail message
064         */
065        public Message getOriginalMessage() {
066            return originalMailMessage;
067        }
068    
069        /**
070         * Returns the underlying Mail message
071         */
072        public Message getMessage() {
073            return mailMessage;
074        }
075    
076        public void setMessage(Message mailMessage) {
077            if (this.originalMailMessage == null) {
078                this.originalMailMessage = mailMessage;
079            }
080            this.mailMessage = mailMessage;
081        }
082    
083        @Override
084        public MailMessage newInstance() {
085            return new MailMessage();
086        }
087    
088        @Override
089        protected Object createBody() {
090            if (mailMessage != null) {
091                MailBinding binding = ExchangeHelper.getBinding(getExchange(), MailBinding.class);
092                return binding != null ? binding.extractBodyFromMail(getExchange(), this) : null;
093            }
094            return null;
095        }
096    
097        @Override
098        protected void populateInitialHeaders(Map<String, Object> map) {
099            if (mailMessage != null) {
100                try {
101                    MailBinding binding = ExchangeHelper.getBinding(getExchange(), MailBinding.class);
102                    if (binding != null) {
103                        map.putAll(binding.extractHeadersFromMail(mailMessage, getExchange()));
104                    }
105                } catch (MessagingException e) {
106                    throw new RuntimeCamelException("Error accessing headers due to: " + e.getMessage(), e);
107                }
108            }
109        }
110    
111        @Override
112        protected void populateInitialAttachments(Map<String, DataHandler> map) {
113            if (mailMessage != null) {
114                try {
115                    MailBinding binding = ExchangeHelper.getBinding(getExchange(), MailBinding.class);
116                    if (binding != null) {
117                        binding.extractAttachmentsFromMail(mailMessage, map);
118                    }
119                } catch (Exception e) {
120                    throw new RuntimeCamelException("Error populating the initial mail message attachments", e);
121                }
122            }
123        }
124    
125        public void copyFrom(org.apache.camel.Message that) {
126            super.copyFrom(that);
127            if (that instanceof MailMessage) {
128                MailMessage mailMessage = (MailMessage) that;
129                this.originalMailMessage = mailMessage.originalMailMessage;
130                this.mailMessage = mailMessage.mailMessage;
131            }
132        }
133    
134    }