content: /**
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package org.apache.activemq.broker.util;
  
  import org.apache.activemq.broker.BrokerPluginSupport;
  import org.apache.activemq.broker.ConnectionContext;
  import org.apache.activemq.broker.ConsumerBrokerExchange;
  import org.apache.activemq.broker.ProducerBrokerExchange;
  import org.apache.activemq.broker.region.Destination;
  import org.apache.activemq.broker.region.Subscription;
  import org.apache.activemq.command.*;
  import org.apache.activemq.filter.DestinationPath;
  
  import java.util.ArrayList;
  import java.util.List;
  import java.util.StringTokenizer;
  
  /**
   * @org.apache.xbean.XBean element="destinationPathSeparatorPlugin"
   */
  
  public class DestinationPathSeparatorBroker extends BrokerPluginSupport {
  
      String pathSeparator = "/";
  
      protected ActiveMQDestination convertDestination(ActiveMQDestination destination) {
          if (destination != null && destination.getPhysicalName().contains(pathSeparator)) {
              List<String> l = new ArrayList<String>();
              StringTokenizer iter = new StringTokenizer(destination.getPhysicalName(), pathSeparator);
              while (iter.hasMoreTokens()) {
                  String name = iter.nextToken().trim();
                  if (name.length() == 0) {
                      continue;
                  }
                  l.add(name);
              }
  
              String newName = DestinationPath.toString(l.toArray(new String[l.size()]));
              return ActiveMQDestination.createDestination(newName, destination.getDestinationType());
          } else {
              return destination;
          }
      }
  
  
      @Override
      public void acknowledge(ConsumerBrokerExchange consumerExchange, MessageAck ack) throws Exception {
          ack.setDestination(convertDestination(ack.getDestination()));
          super.acknowledge(consumerExchange, ack);    
      }
  
      @Override
      public Subscription addConsumer(ConnectionContext context, ConsumerInfo info) throws Exception {
          info.setDestination(convertDestination(info.getDestination()));
          return super.addConsumer(context, info);    
      }
  
      @Override
      public void addProducer(ConnectionContext context, ProducerInfo info) throws Exception {
          info.setDestination(convertDestination(info.getDestination()));
          super.addProducer(context, info);    
      }
  
      @Override
      public void removeConsumer(ConnectionContext context, ConsumerInfo info) throws Exception {
          info.setDestination(convertDestination(info.getDestination()));
          super.removeConsumer(context, info);    
      }
  
      @Override
      public void removeProducer(ConnectionContext context, ProducerInfo info) throws Exception {
          info.setDestination(convertDestination(info.getDestination()));
          super.removeProducer(context, info);    
      }
  
      @Override
      public void send(ProducerBrokerExchange producerExchange, Message messageSend) throws Exception {
          messageSend.setDestination(convertDestination(messageSend.getDestination()));
          super.send(producerExchange, messageSend);    
      }
  
      @Override
      public Destination addDestination(ConnectionContext context, ActiveMQDestination destination, boolean createIfTemporary) throws Exception {
          return super.addDestination(context, convertDestination(destination), createIfTemporary);
      }
  
      @Override
      public void removeDestination(ConnectionContext context, ActiveMQDestination destination, long timeout) throws Exception {
          super.removeDestination(context, convertDestination(destination), timeout);
      }
  
      @Override
      public void addDestinationInfo(ConnectionContext context, DestinationInfo info) throws Exception {
          info.setDestination(convertDestination(info.getDestination()));
          super.addDestinationInfo(context, info);    
      }
  
      @Override
      public void removeDestinationInfo(ConnectionContext context, DestinationInfo info) throws Exception {
          info.setDestination(convertDestination(info.getDestination()));
          super.removeDestinationInfo(context, info);    
      }
  
      @Override
      public void processConsumerControl(ConsumerBrokerExchange consumerExchange, ConsumerControl control) {
          control.setDestination(convertDestination(control.getDestination()));
          super.processConsumerControl(consumerExchange, control);
      }
  
      @Override
      public Response messagePull(ConnectionContext context, MessagePull pull) throws Exception {
          pull.setDestination(convertDestination(pull.getDestination()));
          return super.messagePull(context, pull);
      }
  
      public void setPathSeparator(String pathSeparator) {
          this.pathSeparator = pathSeparator;
      }
  }
  