View Javadoc

    1   /***
    2    *
    3    * Copyright 2004 Protique Ltd
    4    *
    5    * Licensed under the Apache License, Version 2.0 (the "License");
    6    * you may not use this file except in compliance with the License.
    7    * You may obtain a copy of the License at
    8    *
    9    * http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   *
    17   **/
    18  package org.codehaus.activemq.transport;
    19
    20  import org.apache.commons.logging.Log;
    21  import org.apache.commons.logging.LogFactory;
    22  import org.codehaus.activemq.ConfigurationException;
    23  import org.codehaus.activemq.broker.BrokerContainer;
    24  import org.codehaus.activemq.util.MapHelper;
    25
    26  import javax.jms.JMSException;
    27  import java.util.HashMap;
    28  import java.util.Map;
    29
    30  /***
    31   * A {@link NetworkConnector} which uses discovery to find remote brokers
    32   * to connect to
    33   *
    34   * @version $Revision: 1.7 $
    35   */
    36  public class DiscoveryNetworkConnector extends NetworkConnector implements DiscoveryListener {
    37      private static final Log log = LogFactory.getLog(DiscoveryNetworkConnector.class);
    38
    39      private DiscoveryAgent discoveryAgent;
    40      private Map localDetails = new HashMap();
    41      private Map channelMap = new HashMap();
    42      private String remoteUserName;
    43      private String remotePassword;
    44
    45      public DiscoveryNetworkConnector(BrokerContainer brokerContainer) {
    46          super(brokerContainer);
    47      }
    48
    49      public void start() throws JMSException {
    50          DiscoveryAgent discoveryAgent = getBrokerContainer().getDiscoveryAgent();
    51          if (discoveryAgent == null) {
    52              throw new ConfigurationException("Must be configured with a discoveryAgent property");
    53          }
    54
    55          discoveryAgent.setDiscoveryListener(this);
    56
    57          super.start();
    58      }
    59
    60      public void addService(DiscoveryEvent event) {
    61          Map details = event.getServiceDetails();
    62          if (!getLocalBrokerName().equals(details.get("brokerName"))) {
    63              String url = MapHelper.getString(details, "connectURL");
    64              if (url != null) {
    65                  addChannel(url, details);
    66              }
    67          }
    68      }
    69
    70      public void removeService(DiscoveryEvent event) {
    71          Map details = event.getServiceDetails();
    72          if (!getLocalBrokerName().equals(details.get("brokerName"))) {
    73              String url = MapHelper.getString(details, "connectURL");
    74              if (url != null) {
    75                  removeChannel(url, details);
    76              }
    77          }
    78      }
    79
    80      // Properties
    81      //-------------------------------------------------------------------------
    82      public Map getLocalDetails() {
    83          return localDetails;
    84      }
    85
    86      public void setLocalDetails(Map localDetails) {
    87          this.localDetails = localDetails;
    88      }
    89
    90      public String getRemotePassword() {
    91          return remotePassword;
    92      }
    93
    94      public void setRemotePassword(String remotePassword) {
    95          this.remotePassword = remotePassword;
    96      }
    97
    98      public String getRemoteUserName() {
    99          return remoteUserName;
    100     }
    101
    102     public void setRemoteUserName(String remoteUserName) {
    103         this.remoteUserName = remoteUserName;
    104     }
    105
    106     // Implementation methods
    107     //-------------------------------------------------------------------------
    108     protected synchronized void addChannel(String url, Map details) {
    109         NetworkChannel channel = (NetworkChannel) channelMap.get(url);
    110         if (channel == null) {
    111             channel = createNetworkChannel(url, details);
    112             channel.setUri(url);
    113
    114             log.info(getLocalBrokerName() + ": Adding new NeworkChannel on: " + url + " with details: " + details);
    115
    116             try {
    117                 channel.start();
    118                 channelMap.put(url, channel);
    119             }
    120             catch (JMSException e) {
    121                 log.warn(getLocalBrokerName() + ": Could not start channel: " + channel + ". Reason: " + e, e);
    122             }
    123         }
    124     }
    125
    126     protected synchronized void removeChannel(String url, Map details) {
    127         NetworkChannel channel = (NetworkChannel) channelMap.remove(url);
    128         if (channel != null) {
    129             log.info(getLocalBrokerName() + ": Removing NeworkChannel: " + channel);
    130             try {
    131                 channel.stop();
    132             }
    133             catch (JMSException e) {
    134                 log.info("Failed to stop channel: " + channel + ". Reason: " + e, e);
    135             }
    136         }
    137     }
    138
    139     protected NetworkChannel createNetworkChannel(String url, Map details) {
    140         NetworkChannel answer = new NetworkChannel(getBrokerContainer(), url);
    141         answer.setRemoteUserName(getRemoteUserName());
    142         answer.setRemotePassword(getRemotePassword());
    143         return answer;
    144     }
    145
    146
    147     protected String getLocalBrokerName() {
    148         return getBrokerContainer().getBroker().getBrokerName();
    149     }
    150 }