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.activemq.camel.component;
018    
019    import java.util.concurrent.CopyOnWriteArrayList;
020    
021    import org.apache.activemq.Service;
022    import org.apache.camel.CamelContext;
023    import org.apache.camel.component.jms.JmsComponent;
024    import org.apache.camel.component.jms.JmsConfiguration;
025    import org.springframework.jms.connection.SingleConnectionFactory;
026    
027    /**
028     * The <a href="http://activemq.apache.org/camel/activemq.html">ActiveMQ Component</a>
029     *
030     * @version $Revision: 910986 $
031     */
032    public class ActiveMQComponent extends JmsComponent {
033        private final CopyOnWriteArrayList<SingleConnectionFactory> singleConnectionFactoryList =
034            new CopyOnWriteArrayList<SingleConnectionFactory>();
035        private final CopyOnWriteArrayList<Service> pooledConnectionFactoryServiceList =
036            new CopyOnWriteArrayList<Service>();
037        private boolean exposeAllQueues;
038        private CamelEndpointLoader endpointLoader;
039    
040        /**
041         * Creates an <a href="http://activemq.apache.org/camel/activemq.html">ActiveMQ Component</a>
042         *
043         * @return the created component
044         */
045        public static ActiveMQComponent activeMQComponent() {
046            return new ActiveMQComponent();
047        }
048    
049        /**
050         * Creates an <a href="http://activemq.apache.org/camel/activemq.html">ActiveMQ Component</a>
051         * connecting to the given <a href="http://activemq.apache.org/configuring-transports.html">broker URL</a>
052         *
053         * @param brokerURL the URL to connect to
054         * @return the created component
055         */
056        public static ActiveMQComponent activeMQComponent(String brokerURL) {
057            ActiveMQComponent answer = new ActiveMQComponent();
058            if (answer.getConfiguration() instanceof ActiveMQConfiguration) {
059                ((ActiveMQConfiguration) answer.getConfiguration())
060                        .setBrokerURL(brokerURL);
061            }
062            return answer;
063        }
064    
065        public ActiveMQComponent() {
066        }
067    
068        public ActiveMQComponent(CamelContext context) {
069            super(context);
070        }
071    
072        public ActiveMQComponent(ActiveMQConfiguration configuration) {
073            super(configuration);
074        }
075    
076       
077        public void setBrokerURL(String brokerURL) {
078            if (getConfiguration() instanceof ActiveMQConfiguration) {
079                ((ActiveMQConfiguration)getConfiguration()).setBrokerURL(brokerURL);
080            }
081        }
082    
083        public void setUserName(String userName) {
084            if (getConfiguration() instanceof ActiveMQConfiguration) {
085                ((ActiveMQConfiguration)getConfiguration()).setUserName(userName);
086            }
087        }
088    
089        public void setPassword(String password) {
090            if (getConfiguration() instanceof ActiveMQConfiguration) {
091                ((ActiveMQConfiguration)getConfiguration()).setPassword(password);
092            }
093        }
094    
095        public boolean isExposeAllQueues() {
096            return exposeAllQueues;
097        }
098    
099        /**
100         * If enabled this will cause all Queues in the ActiveMQ broker to be eagerly populated into the CamelContext
101         * so that they can be easily browsed by any Camel tooling. This option is disabled by default.
102         *
103         * @param exposeAllQueues
104         */
105        public void setExposeAllQueues(boolean exposeAllQueues) {
106            this.exposeAllQueues = exposeAllQueues;
107        }
108    
109        public void setUsePooledConnection(boolean usePooledConnection) {
110            if (getConfiguration() instanceof ActiveMQConfiguration) {
111                ((ActiveMQConfiguration)getConfiguration()).setUsePooledConnection(usePooledConnection);
112            }
113        }
114    
115        public void setUseSingleConnection(boolean useSingleConnection) {
116            if (getConfiguration() instanceof ActiveMQConfiguration) {
117                ((ActiveMQConfiguration)getConfiguration()).setUseSingleConnection(useSingleConnection);
118            }
119        }
120    
121        protected void addPooledConnectionFactoryService(Service pooledConnectionFactoryService) {
122            pooledConnectionFactoryServiceList.add(pooledConnectionFactoryService);
123        }
124    
125        protected void addSingleConnectionFactory(SingleConnectionFactory singleConnectionFactory) {
126            singleConnectionFactoryList.add(singleConnectionFactory);
127        }
128    
129        @Override
130        protected void doStart() throws Exception {
131            super.doStart();
132            if (isExposeAllQueues()) {
133                endpointLoader = new CamelEndpointLoader(getCamelContext());
134                endpointLoader.afterPropertiesSet();
135            }
136        }
137    
138        @Override
139        protected void doStop() throws Exception {
140            if (endpointLoader != null) {
141                endpointLoader.destroy();
142                endpointLoader = null;
143            }
144            for (Service s : pooledConnectionFactoryServiceList) {
145                s.stop();
146            }
147            pooledConnectionFactoryServiceList.clear();
148            for (SingleConnectionFactory s : singleConnectionFactoryList) {
149                s.destroy();
150            }
151            singleConnectionFactoryList.clear();
152            super.doStop();
153        }
154    
155        @Override
156        public void setConfiguration(JmsConfiguration configuration) {
157            if (configuration instanceof ActiveMQConfiguration) {
158                ((ActiveMQConfiguration) configuration).setActiveMQComponent(this);
159            }
160            super.setConfiguration(configuration);
161        }
162    
163        @Override
164        protected JmsConfiguration createConfiguration() {
165            ActiveMQConfiguration answer = new ActiveMQConfiguration();
166            answer.setActiveMQComponent(this);
167            return answer;
168        }
169    }