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.jms;
018    
019    import javax.jms.Message;
020    
021    import org.apache.camel.Processor;
022    import org.apache.camel.PollingConsumer;
023    import org.apache.camel.impl.DefaultEndpoint;
024    import org.springframework.jms.core.JmsOperations;
025    import org.springframework.jms.core.JmsTemplate;
026    import org.springframework.jms.listener.AbstractMessageListenerContainer;
027    
028    /**
029     * A <a href="http://activemq.apache.org/jms.html">JMS Endpoint</a>
030     *
031      * @version $Revision:520964 $
032     */
033    public class JmsEndpoint extends DefaultEndpoint<JmsExchange> {
034        private JmsBinding binding;
035        private String destination;
036        private final boolean pubSubDomain;
037        private String selector;
038        private JmsConfiguration configuration;
039    
040        public JmsEndpoint(String uri, JmsComponent component, String destination, boolean pubSubDomain, JmsConfiguration configuration) {
041            super(uri, component);
042            this.configuration = configuration;
043            this.destination = destination;
044            this.pubSubDomain = pubSubDomain;
045        }
046    
047        public JmsProducer createProducer() throws Exception {
048            JmsOperations template = createJmsOperations();
049            return createProducer(template);
050        }
051    
052        /**
053         * Creates a producer using the given template
054         */
055        public JmsProducer createProducer(JmsOperations template) throws Exception {
056            if (template instanceof JmsTemplate) {
057                JmsTemplate jmsTemplate = (JmsTemplate) template;
058                jmsTemplate.setPubSubDomain(pubSubDomain);
059                jmsTemplate.setDefaultDestinationName(destination);
060            }
061            return new JmsProducer(this, template);
062        }
063    
064        public JmsConsumer createConsumer(Processor processor) throws Exception {
065            AbstractMessageListenerContainer listenerContainer = configuration.createMessageListenerContainer();
066            return createConsumer(processor, listenerContainer);
067        }
068    
069        /**
070         * Creates a consumer using the given processor and listener container
071         *
072         * @param processor the processor to use to process the messages
073         * @param listenerContainer the listener container
074         * @return a newly created consumer
075         * @throws Exception if the consumer cannot be created
076         */
077        public JmsConsumer createConsumer(Processor processor, AbstractMessageListenerContainer listenerContainer) throws Exception {
078            listenerContainer.setDestinationName(destination);
079            listenerContainer.setPubSubDomain(pubSubDomain);
080            if (selector != null) {
081                listenerContainer.setMessageSelector(selector);
082            }
083            return new JmsConsumer(this, processor, listenerContainer);
084        }
085    
086        @Override
087        public PollingConsumer<JmsExchange> createPollingConsumer() throws Exception {
088            JmsOperations template = createJmsOperations();
089            return new JmsPollingConsumer(this, template);
090        }
091    
092        public JmsExchange createExchange() {
093            return new JmsExchange(getContext(), getBinding());
094        }
095    
096        public JmsExchange createExchange(Message message) {
097            return new JmsExchange(getContext(), getBinding(), message);
098        }
099    
100        // Properties
101        //-------------------------------------------------------------------------
102        public JmsBinding getBinding() {
103            if (binding == null) {
104                binding = new JmsBinding();
105            }
106            return binding;
107        }
108    
109        /**
110         * Sets the binding used to convert from a Camel message to and from a JMS message
111         *
112         * @param binding the binding to use
113         */
114        public void setBinding(JmsBinding binding) {
115            this.binding = binding;
116        }
117    
118        public String getDestination() {
119            return destination;
120        }
121    
122        public JmsConfiguration getConfiguration() {
123            return configuration;
124        }
125    
126        public String getSelector() {
127            return selector;
128        }
129    
130        /**
131         * Sets the JMS selector to use
132         */
133        public void setSelector(String selector) {
134            this.selector = selector;
135        }
136    
137            public boolean isSingleton() {
138                    return false;
139            }
140    
141    
142        protected JmsOperations createJmsOperations() {
143            return configuration.createJmsOperations(pubSubDomain, destination);
144        }
145    
146    }