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.artemis.common.testjndi;
  
  import javax.jms.ConnectionFactory;
  import javax.jms.Queue;
  import javax.jms.Topic;
  import javax.naming.Context;
  import javax.naming.NamingException;
  import javax.naming.spi.InitialContextFactory;
  import java.util.Hashtable;
  import java.util.Map;
  import java.util.concurrent.ConcurrentHashMap;
  
  import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient;
  import org.apache.activemq.artemis.jndi.LazyCreateContext;
  import org.apache.activemq.artemis.uri.ConnectionFactoryParser;
  
  /**
   * A factory of the ActiveMQ Artemis InitialContext which contains {@link ConnectionFactory} instances as well as a
   * child context called
   * <i>destinations</i> which contain all of the current active destinations, in
   * child context depending on the QoS such as transient or durable and queue or topic.
   */
  public class TestContextFactory implements InitialContextFactory {
  
     public static final String REFRESH_TIMEOUT = "refreshTimeout";
     public static final String DISCOVERY_INITIAL_WAIT_TIMEOUT = "discoveryInitialWaitTimeout";
     public static final String DYNAMIC_QUEUE_CONTEXT = "dynamicQueues";
     public static final String DYNAMIC_TOPIC_CONTEXT = "dynamicTopics";
     private String connectionFactoryPrefix = "connectionFactory.";
     private String queuePrefix = "queue.";
     private String topicPrefix = "topic.";
  
     @Override
     public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException {
        // lets create a factory
        Map<String, Object> data = new ConcurrentHashMap<>();
        for (Map.Entry<?, ?> entry : environment.entrySet()) {
           String key = entry.getKey().toString();
           if (key.startsWith(connectionFactoryPrefix)) {
              String jndiName = key.substring(connectionFactoryPrefix.length());
              try {
                 ConnectionFactory factory = createConnectionFactory((String) environment.get(key), jndiName);
                 data.put(jndiName, factory);
              } catch (Exception e) {
                 e.printStackTrace();
                 throw new NamingException("Invalid broker URL");
              }
           }
        }
  
        createQueues(data, environment);
        createTopics(data, environment);
  
        data.put(DYNAMIC_QUEUE_CONTEXT, new LazyCreateContext() {
           private static final long serialVersionUID = 6503881346214855588L;
  
           @Override
           protected Object createEntry(String name) {
              return ActiveMQJMSClient.createQueue(name);
           }
        });
        data.put(DYNAMIC_TOPIC_CONTEXT, new LazyCreateContext() {
           private static final long serialVersionUID = 2019166796234979615L;
  
           @Override
           protected Object createEntry(String name) {
              return ActiveMQJMSClient.createTopic(name);
           }
        });
  
        return createContext(environment, data);
     }
  
     // Properties
     // -------------------------------------------------------------------------
     public String getTopicPrefix() {
        return topicPrefix;
     }
  
     public void setTopicPrefix(String topicPrefix) {
        this.topicPrefix = topicPrefix;
     }
  
     public String getQueuePrefix() {
        return queuePrefix;
     }
  
     public void setQueuePrefix(String queuePrefix) {
        this.queuePrefix = queuePrefix;
     }
  
     // Implementation methods
     // -------------------------------------------------------------------------
  
     protected Context createContext(Hashtable<?, ?> environment, Map<String, Object> data) {
        return new TestContext(environment, data);
     }
  
     protected void createQueues(Map<String, Object> data, Hashtable<?, ?> environment) {
        for (Map.Entry<?, ?> entry : environment.entrySet()) {
           String key = entry.getKey().toString();
           if (key.startsWith(queuePrefix)) {
              String jndiName = key.substring(queuePrefix.length());
              data.put(jndiName, createQueue(entry.getValue().toString()));
           }
        }
     }
  
     protected void createTopics(Map<String, Object> data, Hashtable<?, ?> environment) {
        for (Map.Entry<?, ?> entry : environment.entrySet()) {
           String key = entry.getKey().toString();
           if (key.startsWith(topicPrefix)) {
              String jndiName = key.substring(topicPrefix.length());
              data.put(jndiName, createTopic(entry.getValue().toString()));
           }
        }
     }
  
     /**
      * Factory method to create new Queue instances
      */
     protected Queue createQueue(String name) {
        return ActiveMQJMSClient.createQueue(name);
     }
  
     /**
      * Factory method to create new Topic instances
      */
     protected Topic createTopic(String name) {
        return ActiveMQJMSClient.createTopic(name);
     }
  
     /**
      * Factory method to create a new connection factory from the given environment
      */
     protected ConnectionFactory createConnectionFactory(String uri, String name) throws Exception {
        ConnectionFactoryParser parser = new ConnectionFactoryParser();
        return parser.newObject(parser.expandURI(uri), name);
     }
  }
  