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.test;
  
  import jakarta.jms.Connection;
  import jakarta.jms.ConnectionConsumer;
  import jakarta.jms.ConnectionFactory;
  import jakarta.jms.DeliveryMode;
  import jakarta.jms.Destination;
  import jakarta.jms.JMSException;
  import jakarta.jms.MessageConsumer;
  import jakarta.jms.MessageProducer;
  import jakarta.jms.ServerSessionPool;
  import jakarta.jms.Session;
  import jakarta.jms.Topic;
  
  import org.apache.activemq.ActiveMQConnectionFactory;
  
  /**
   * 
   */
  public class JmsResourceProvider {
  
      private String serverUri = "vm://localhost?broker.persistent=false";
      private boolean transacted;
      private int ackMode = Session.AUTO_ACKNOWLEDGE;
      private boolean isTopic;
      private int deliveryMode = DeliveryMode.PERSISTENT;
      private String durableName = "DummyName";
      private String clientID = getClass().getName();
  
      /**
       * Creates a connection factory.
       * 
       * @see org.apache.activemq.test.JmsResourceProvider#createConnectionFactory()
       */
      public ConnectionFactory createConnectionFactory() throws Exception {
          return new ActiveMQConnectionFactory(serverUri);
      }
  
      /**
       * Creates a connection.
       * 
       * @see org.apache.activemq.test.JmsResourceProvider#createConnection(jakarta.jms.ConnectionFactory)
       */
      public Connection createConnection(ConnectionFactory cf) throws JMSException {
          Connection connection = cf.createConnection();
          if (getClientID() != null) {
              connection.setClientID(getClientID());
          }
          return connection;
      }
  
      /**
       * @see org.apache.activemq.test.JmsResourceProvider#createSession(jakarta.jms.Connection)
       */
      public Session createSession(Connection conn) throws JMSException {
          return conn.createSession(transacted, ackMode);
      }
  
      /**
       * @see org.apache.activemq.test.JmsResourceProvider#createConsumer(jakarta.jms.Session,
       *      jakarta.jms.Destination)
       */
      public MessageConsumer createConsumer(Session session, Destination destination) throws JMSException {
          if (isDurableSubscriber()) {
              return session.createDurableSubscriber((Topic)destination, durableName);
          }
          return session.createConsumer(destination);
      }
  
      /**
       * Creates a connection for a consumer.
       * 
       * @param ssp - ServerSessionPool
       * @return ConnectionConsumer
       */
      public ConnectionConsumer createConnectionConsumer(Connection connection, Destination destination, ServerSessionPool ssp) throws JMSException {
          return connection.createConnectionConsumer(destination, null, ssp, 1);
      }
  
      /**
       * Creates a producer.
       * 
       * @see org.apache.activemq.test.JmsResourceProvider#createProducer(jakarta.jms.Session,
       *      jakarta.jms.Destination)
       */
      public MessageProducer createProducer(Session session, Destination destination) throws JMSException {
          MessageProducer producer = session.createProducer(destination);
          producer.setDeliveryMode(deliveryMode);
          return producer;
      }
  
      /**
       * Creates a destination, which can either a topic or a queue.
       * 
       * @see org.apache.activemq.test.JmsResourceProvider#createDestination(jakarta.jms.Session,
       *      java.lang.String)
       */
      public Destination createDestination(Session session, String name) throws JMSException {
          if (isTopic) {
              return session.createTopic("TOPIC." + name);
          } else {
              return session.createQueue("QUEUE." + name);
          }
      }
  
      /**
       * Returns true if the subscriber is durable.
       * 
       * @return isDurableSubscriber
       */
      public boolean isDurableSubscriber() {
          return isTopic && durableName != null;
      }
  
      /**
       * Returns the acknowledgement mode.
       * 
       * @return Returns the ackMode.
       */
      public int getAckMode() {
          return ackMode;
      }
  
      /**
       * Sets the acnknowledgement mode.
       * 
       * @param ackMode The ackMode to set.
       */
      public void setAckMode(int ackMode) {
          this.ackMode = ackMode;
      }
  
      /**
       * Returns true if the destination is a topic, false if the destination is a
       * queue.
       * 
       * @return Returns the isTopic.
       */
      public boolean isTopic() {
          return isTopic;
      }
  
      /**
       * @param isTopic The isTopic to set.
       */
      public void setTopic(boolean isTopic) {
          this.isTopic = isTopic;
      }
  
      /**
       * Returns the server URI.
       * 
       * @return Returns the serverUri.
       */
      public String getServerUri() {
          return serverUri;
      }
  
      /**
       * Sets the server URI.
       * 
       * @param serverUri - the server URI to set.
       */
      public void setServerUri(String serverUri) {
          this.serverUri = serverUri;
      }
  
      /**
       * Return true if the session is transacted.
       * 
       * @return Returns the transacted.
       */
      public boolean isTransacted() {
          return transacted;
      }
  
      /**
       * Sets the session to be transacted.
       * 
       * @param transacted
       */
      public void setTransacted(boolean transacted) {
          this.transacted = transacted;
          if (transacted) {
              setAckMode(Session.SESSION_TRANSACTED);
          }
      }
  
      /**
       * Returns the delivery mode.
       * 
       * @return deliveryMode
       */
      public int getDeliveryMode() {
          return deliveryMode;
      }
  
      /**
       * Sets the delivery mode.
       * 
       * @param deliveryMode
       */
      public void setDeliveryMode(int deliveryMode) {
          this.deliveryMode = deliveryMode;
      }
  
      /**
       * Returns the client id.
       * 
       * @return clientID
       */
      public String getClientID() {
          return clientID;
      }
  
      /**
       * Sets the client id.
       * 
       * @param clientID
       */
      public void setClientID(String clientID) {
          this.clientID = clientID;
      }
  
      /**
       * Returns the durable name of the provider.
       * 
       * @return durableName
       */
      public String getDurableName() {
          return durableName;
      }
  
      /**
       * Sets the durable name of the provider.
       * 
       * @param durableName
       */
      public void setDurableName(String durableName) {
          this.durableName = durableName;
      }
  }
  