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.command;
018    
019    import java.io.IOException;
020    import java.util.Properties;
021    import org.apache.activemq.state.CommandVisitor;
022    import org.apache.activemq.util.MarshallingSupport;
023    
024    /**
025     * When a client connects to a broker, the broker send the client a BrokerInfo
026     * so that the client knows which broker node he's talking to and also any peers
027     * that the node has in his cluster. This is the broker helping the client out
028     * in discovering other nodes in the cluster.
029     * 
030     * @openwire:marshaller code="2"
031     * 
032     */
033    public class BrokerInfo extends BaseCommand {
034        private static final String PASSIVE_SLAVE_KEY = "passiveSlave";
035        public static final byte DATA_STRUCTURE_TYPE = CommandTypes.BROKER_INFO;
036        BrokerId brokerId;
037        String brokerURL;
038        boolean slaveBroker;
039        boolean masterBroker;
040        boolean faultTolerantConfiguration;
041        boolean networkConnection;
042        boolean duplexConnection;
043        BrokerInfo peerBrokerInfos[];
044        String brokerName;
045        long connectionId;
046        String brokerUploadUrl;
047        String networkProperties;
048        transient int refCount = 0;
049        
050        public BrokerInfo copy() {
051            BrokerInfo copy = new BrokerInfo();
052            copy(copy);
053            return copy;
054        }
055        
056        private void copy(BrokerInfo copy) {
057            super.copy(copy);
058            copy.brokerId = this.brokerId;
059            copy.brokerURL = this.brokerURL;
060            copy.slaveBroker = this.slaveBroker;
061            copy.masterBroker = this.masterBroker;
062            copy.faultTolerantConfiguration = this.faultTolerantConfiguration;
063            copy.networkConnection = this.networkConnection;
064            copy.duplexConnection = this.duplexConnection;
065            copy.peerBrokerInfos = this.peerBrokerInfos;
066            copy.brokerName = this.brokerName;
067            copy.connectionId = this.connectionId;
068            copy.brokerUploadUrl = this.brokerUploadUrl;
069            copy.networkProperties = this.networkProperties;
070        } 
071    
072        @Override
073        public boolean isBrokerInfo() {
074            return true;
075        }
076    
077        public byte getDataStructureType() {
078            return DATA_STRUCTURE_TYPE;
079        }
080    
081        /**
082         * @openwire:property version=1 cache=true
083         */
084        public BrokerId getBrokerId() {
085            return brokerId;
086        }
087    
088        public void setBrokerId(BrokerId brokerId) {
089            this.brokerId = brokerId;
090        }
091    
092        /**
093         * @openwire:property version=1
094         */
095        public String getBrokerURL() {
096            return brokerURL;
097        }
098    
099        public void setBrokerURL(String brokerURL) {
100            this.brokerURL = brokerURL;
101        }
102    
103        /**
104         * @openwire:property version=1 testSize=0
105         */
106        public BrokerInfo[] getPeerBrokerInfos() {
107            return peerBrokerInfos;
108        }
109    
110        public void setPeerBrokerInfos(BrokerInfo[] peerBrokerInfos) {
111            this.peerBrokerInfos = peerBrokerInfos;
112        }
113    
114        /**
115         * @openwire:property version=1
116         */
117        public String getBrokerName() {
118            return brokerName;
119        }
120    
121        public void setBrokerName(String brokerName) {
122            this.brokerName = brokerName;
123        }
124    
125        public Response visit(CommandVisitor visitor) throws Exception {
126            return visitor.processBrokerInfo(this);
127        }
128    
129        /**
130         * @openwire:property version=1
131         */
132        public boolean isSlaveBroker() {
133            return slaveBroker;
134        }
135    
136        public void setSlaveBroker(boolean slaveBroker) {
137            this.slaveBroker = slaveBroker;
138        }
139    
140        /**
141         * @openwire:property version=1
142         */
143        public boolean isMasterBroker() {
144            return masterBroker;
145        }
146    
147        /**
148         * @param masterBroker The masterBroker to set.
149         */
150        public void setMasterBroker(boolean masterBroker) {
151            this.masterBroker = masterBroker;
152        }
153    
154        /**
155         * @openwire:property version=1
156         * @return Returns the faultTolerantConfiguration.
157         */
158        public boolean isFaultTolerantConfiguration() {
159            return faultTolerantConfiguration;
160        }
161    
162        /**
163         * @param faultTolerantConfiguration The faultTolerantConfiguration to set.
164         */
165        public void setFaultTolerantConfiguration(boolean faultTolerantConfiguration) {
166            this.faultTolerantConfiguration = faultTolerantConfiguration;
167        }
168    
169        /**
170         * @openwire:property version=2
171         * @return the duplexConnection
172         */
173        public boolean isDuplexConnection() {
174            return this.duplexConnection;
175        }
176    
177        /**
178         * @param duplexConnection the duplexConnection to set
179         */
180        public void setDuplexConnection(boolean duplexConnection) {
181            this.duplexConnection = duplexConnection;
182        }
183    
184        /**
185         * @openwire:property version=2
186         * @return the networkConnection
187         */
188        public boolean isNetworkConnection() {
189            return this.networkConnection;
190        }
191    
192        /**
193         * @param networkConnection the networkConnection to set
194         */
195        public void setNetworkConnection(boolean networkConnection) {
196            this.networkConnection = networkConnection;
197        }
198    
199        /**
200         * The broker assigns a each connection it accepts a connection id.
201         * 
202         * @openwire:property version=2
203         */
204        public long getConnectionId() {
205            return connectionId;
206        }
207    
208        public void setConnectionId(long connectionId) {
209            this.connectionId = connectionId;
210        }
211    
212        /**
213         * The URL to use when uploading BLOBs to the broker or some other external
214         * file/http server
215         * 
216         * @openwire:property version=3
217         */
218        public String getBrokerUploadUrl() {
219            return brokerUploadUrl;
220        }
221    
222        public void setBrokerUploadUrl(String brokerUploadUrl) {
223            this.brokerUploadUrl = brokerUploadUrl;
224        }
225    
226        /**
227         * @openwire:property version=3 cache=false
228         * @return the networkProperties
229         */
230        public String getNetworkProperties() {
231            return this.networkProperties;
232        }
233    
234        /**
235         * @param networkProperties the networkProperties to set
236         */
237        public void setNetworkProperties(String networkProperties) {
238            this.networkProperties = networkProperties;
239        }
240        
241        public boolean isPassiveSlave() {
242            boolean result = false;
243            Properties props = getProperties();
244            if (props != null) {
245                result = Boolean.parseBoolean(props.getProperty(PASSIVE_SLAVE_KEY, "false"));
246            }
247            return result;
248        }
249        
250        public void setPassiveSlave(boolean value) {
251            Properties props = new Properties();
252            props.put(PASSIVE_SLAVE_KEY, Boolean.toString(value));
253            try {
254                this.networkProperties=MarshallingSupport.propertiesToString(props);
255            } catch (IOException e) {
256                e.printStackTrace();
257            }
258        }
259        
260        public Properties getProperties() {
261            Properties result = null;
262            try {
263                result = MarshallingSupport.stringToProperties(getNetworkProperties());
264            } catch (IOException e) {
265               e.printStackTrace();
266            }
267            return result;
268        }
269    
270        public int getRefCount() {
271            return refCount;
272        }
273    
274        public void incrementRefCount() {
275            refCount++;
276        }
277        public int decrementRefCount() {
278            return --refCount;
279        }
280    }