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.activemq.spring;
019    
020    import java.util.ArrayList;
021    import java.util.List;
022    
023    import org.springframework.beans.factory.FactoryBean;
024    
025    /**
026     * A helper class for creating a failover configured {@link ActiveMQConnectionFactory}
027     * which supports one or more TCP based hostname/ports which can all be configured in a
028     * consistent way without too much URL hacking.
029     *
030     * 
031     */
032    public class ActiveMQConnectionFactoryFactoryBean implements FactoryBean {
033        private List<String> tcpHostAndPorts = new ArrayList<String>();
034    
035        // tcp properties
036        private Long maxInactivityDuration;
037        private String tcpProperties;
038    
039        // failover properties
040        private Long maxReconnectDelay;
041        private String failoverProperties;
042    
043        public Object getObject() throws Exception {
044            ActiveMQConnectionFactory answer = new ActiveMQConnectionFactory();
045            String brokerURL = getBrokerURL();
046            answer.setBrokerURL(brokerURL);
047            return answer;
048        }
049    
050        public String getBrokerURL() {
051            StringBuffer buffer = new StringBuffer("failover:(");
052            int counter = 0;
053            for (String tcpHostAndPort : tcpHostAndPorts) {
054                if (counter++ > 0) {
055                    buffer.append(",");
056                }
057                buffer.append(createTcpHostAndPortUrl(tcpHostAndPort));
058            }
059            buffer.append(")");
060    
061            List<String> parameters = new ArrayList<String>();
062            if (maxReconnectDelay != null) {
063                parameters.add("maxReconnectDelay=" + maxReconnectDelay);
064            }
065            if (notEmpty(failoverProperties)) {
066                parameters.add(failoverProperties);
067            }
068            buffer.append(asQueryString(parameters));
069            return buffer.toString();
070        }
071    
072        public Class getObjectType() {
073            return ActiveMQConnectionFactory.class;
074        }
075    
076        public boolean isSingleton() {
077            return true;
078        }
079    
080        // Properties
081        //-------------------------------------------------------------------------
082    
083        public List<String> getTcpHostAndPorts() {
084            return tcpHostAndPorts;
085        }
086    
087        public void setTcpHostAndPorts(List<String> tcpHostAndPorts) {
088            this.tcpHostAndPorts = tcpHostAndPorts;
089        }
090    
091        public void setTcpHostAndPort(String tcpHostAndPort) {
092            tcpHostAndPorts = new ArrayList<String>();
093            tcpHostAndPorts.add(tcpHostAndPort);
094        }
095    
096        public Long getMaxInactivityDuration() {
097            return maxInactivityDuration;
098        }
099    
100        public void setMaxInactivityDuration(Long maxInactivityDuration) {
101            this.maxInactivityDuration = maxInactivityDuration;
102        }
103    
104        public String getTcpProperties() {
105            return tcpProperties;
106        }
107    
108        public void setTcpProperties(String tcpProperties) {
109            this.tcpProperties = tcpProperties;
110        }
111    
112        public Long getMaxReconnectDelay() {
113            return maxReconnectDelay;
114        }
115    
116        public void setMaxReconnectDelay(Long maxReconnectDelay) {
117            this.maxReconnectDelay = maxReconnectDelay;
118        }
119    
120        public String getFailoverProperties() {
121            return failoverProperties;
122        }
123    
124        public void setFailoverProperties(String failoverProperties) {
125            this.failoverProperties = failoverProperties;
126        }
127    
128        // Implementation methods
129        //-------------------------------------------------------------------------
130    
131        /**
132         * Turns a list of query string key=value strings into a query URL string
133         * of the form "?a=x&b=y"
134         */
135        protected String asQueryString(List<String> parameters) {
136            int size = parameters.size();
137            if (size < 1) {
138                return "";
139            }
140            else {
141                StringBuffer buffer = new StringBuffer("?");
142                buffer.append(parameters.get(0));
143                for (int i = 1; i < size; i++) {
144                    buffer.append("&");
145                    buffer.append(parameters.get(i));
146                }
147                return buffer.toString();
148            }
149        }
150    
151        /**
152         * Allows us to add any TCP specific URI configurations
153         */
154        protected String createTcpHostAndPortUrl(String tcpHostAndPort) {
155            List<String> parameters = new ArrayList<String>();
156            if (maxInactivityDuration != null) {
157                parameters.add("wireFormat.maxInactivityDuration=" + maxInactivityDuration);
158            }
159            if (notEmpty(tcpProperties)) {
160                parameters.add(tcpProperties);
161            }
162            return tcpHostAndPort + asQueryString(parameters);
163        }
164    
165    
166        protected boolean notEmpty(String text) {
167            return text != null && text.length() > 0;
168        }
169    
170    }