001    /**
002     *
003     * Licensed to the Apache Software Foundation (ASF) under one or more
004     * contributor license agreements.  See the NOTICE file distributed with
005     * this work for additional information regarding copyright ownership.
006     * The ASF licenses this file to You under the Apache License, Version 2.0
007     * (the "License"); you may not use this file except in compliance with
008     * the License.  You may obtain a copy of the License at
009     *
010     * http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    package org.apache.camel.component.mail;
019    
020    import org.apache.camel.Consumer;
021    import org.apache.camel.Processor;
022    import org.apache.camel.Producer;
023    import org.apache.camel.impl.ScheduledPollEndpoint;
024    import org.springframework.mail.javamail.JavaMailSender;
025    
026    import javax.mail.Message;
027    import javax.mail.Folder;
028    
029    /**
030     * @version $Revision:520964 $
031     */
032    public class MailEndpoint extends ScheduledPollEndpoint<MailExchange> {
033        private MailBinding binding;
034        private MailConfiguration configuration;
035    
036        public MailEndpoint(String uri, MailComponent component,  MailConfiguration configuration) {
037            super(uri, component);
038            this.configuration = configuration;
039        }
040    
041        public Producer<MailExchange> createProducer() throws Exception {
042            JavaMailSender sender = configuration.createJavaMailConnection(this);
043            return createProducer(sender);
044        }
045    
046        /**
047         * Creates a producer using the given sender
048         */
049        public Producer<MailExchange> createProducer(JavaMailSender sender) throws Exception {
050            return new MailProducer(this, sender);
051        }
052    
053        public Consumer<MailExchange> createConsumer(Processor processor) throws Exception {
054            JavaMailConnection connection = configuration.createJavaMailConnection(this);
055            String protocol = getConfiguration().getProtocol();
056            if (protocol.equals("smtp")) {
057                protocol = "pop3";
058            }
059            String folderName = getConfiguration().getFolderName();
060            Folder folder = connection.getFolder(protocol, folderName);
061            if (folder == null) {
062                throw new IllegalArgumentException("No folder for protocol: " + protocol + " and name: " + folderName);
063            }
064            return createConsumer(processor, folder);
065        }
066    
067        /**
068         * Creates a consumer using the given processor and transport
069         *
070         * @param processor the processor to use to process the messages
071         * @param folder the JavaMail Folder to use for inbound messages
072         * @return a newly created consumer
073         * @throws Exception if the consumer cannot be created
074         */
075        public Consumer<MailExchange> createConsumer(Processor processor, Folder folder) throws Exception {
076            MailConsumer answer = new MailConsumer(this, processor, folder);
077            configureConsumer(answer);
078            return answer;
079        }
080    
081        public MailExchange createExchange() {
082            return new MailExchange(getContext(), getBinding());
083        }
084    
085        public MailExchange createExchange(Message message) {
086            return new MailExchange(getContext(), getBinding(), message);
087        }
088    
089        // Properties
090        //-------------------------------------------------------------------------
091        public MailBinding getBinding() {
092            if (binding == null) {
093                binding = new MailBinding();
094            }
095            return binding;
096        }
097    
098        /**
099         * Sets the binding used to convert from a Camel message to and from a Mail message
100         *
101         * @param binding the binding to use
102         */
103        public void setBinding(MailBinding binding) {
104            this.binding = binding;
105        }
106    
107            public boolean isSingleton() {
108                    return false;
109            }
110    
111        public MailConfiguration getConfiguration() {
112            return configuration;
113        }
114    }