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.ra;
  
  import java.io.Serializable;
  
  import jakarta.resource.spi.ConnectionRequestInfo;
  
  import org.apache.activemq.ActiveMQConnectionFactory;
  import org.apache.activemq.ActiveMQPrefetchPolicy;
  import org.apache.activemq.ActiveMQSslConnectionFactory;
  import org.apache.activemq.RedeliveryPolicy;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  /**
   * Must override equals and hashCode (JCA spec 16.4)
   */
  public class ActiveMQConnectionRequestInfo implements ConnectionRequestInfo, Serializable, Cloneable {
  
      private static final long serialVersionUID = -5754338187296859149L;
      protected Logger log = LoggerFactory.getLogger(getClass());
  
      private String userName;
      private String password;
      private String serverUrl;
      private String clientid;
      private Boolean useInboundSession;
      private RedeliveryPolicy redeliveryPolicy;
      private ActiveMQPrefetchPolicy prefetchPolicy;
      private Boolean useSessionArgs;
      private String trustStore;
      private String trustStorePassword;
      private String keyStore;
      private String keyStorePassword;
      private String keyStoreKeyPassword;
  
      public ActiveMQConnectionRequestInfo copy() {
          try {
              ActiveMQConnectionRequestInfo answer = (ActiveMQConnectionRequestInfo) clone();
              if (redeliveryPolicy != null) {
                  answer.redeliveryPolicy = redeliveryPolicy.copy();
              }
              return answer;
          } catch (CloneNotSupportedException e) {
              throw new RuntimeException("Could not clone: " + e, e);
          }
      }
  
      /**
       * Returns true if this object will configure an ActiveMQConnectionFactory
       * in any way
       */
      public boolean isConnectionFactoryConfigured() {
          return serverUrl != null || clientid != null || redeliveryPolicy != null || prefetchPolicy != null;
      }
  
      /**
       * Configures the given connection factory
       */
      public void configure(ActiveMQConnectionFactory factory, MessageActivationSpec activationSpec) {
          if (serverUrl != null) {
              factory.setBrokerURL(serverUrl);
          }
          if (clientid != null) {
              factory.setClientID(clientid);
          }
          if (redeliveryPolicy != null) {
              factory.setRedeliveryPolicy(redeliveryPolicy);
          }
          if (prefetchPolicy != null) {
              factory.setPrefetchPolicy(prefetchPolicy);
          }
          if (factory instanceof ActiveMQSslConnectionFactory) {
              String trustStore = defaultValue(activationSpec == null ? null : activationSpec.getTrustStore(), getTrustStore());
              String trustStorePassword = defaultValue(activationSpec == null ? null : activationSpec.getTrustStorePassword(), getTrustStorePassword());
              String keyStore = defaultValue(activationSpec == null ? null : activationSpec.getKeyStore(), getKeyStore());
              String keyStorePassword = defaultValue(activationSpec == null ? null : activationSpec.getKeyStorePassword(), getKeyStorePassword());
              String keyStoreKeyPassword = defaultValue(activationSpec == null ? null : activationSpec.getKeyStoreKeyPassword(), getKeyStoreKeyPassword());
              ActiveMQSslConnectionFactory sslFactory = (ActiveMQSslConnectionFactory) factory;
              if (trustStore != null) {
                  try {
                      sslFactory.setTrustStore(trustStore);
                  } catch (Exception e) {
                      log.warn("Unable to set TrustStore", e);
                  }
              }
              if (trustStorePassword != null) {
                  sslFactory.setTrustStorePassword(trustStorePassword);
              }
              if (keyStore != null) {
                  try {
                      sslFactory.setKeyStore(keyStore);
                  } catch (Exception e) {
                      log.warn("Unable to set KeyStore", e);
                  }
              }
              if (keyStorePassword != null) {
                  sslFactory.setKeyStorePassword(keyStorePassword);
              }
              if (keyStoreKeyPassword != null) {
                  sslFactory.setKeyStoreKeyPassword(keyStoreKeyPassword);
              }
          }
      }
  
      /**
       * @see javax.resource.spi.ConnectionRequestInfo#hashCode()
       */
      @Override
      public int hashCode() {
          int rc = 0;
          if (useInboundSession != null) {
              rc ^= useInboundSession.hashCode();
          }
          if (useSessionArgs != null) {
              rc ^= useSessionArgs.hashCode();
          }
          if (serverUrl != null) {
              rc ^= serverUrl.hashCode();
          }
          return rc;
      }
  
      /**
       * @see javax.resource.spi.ConnectionRequestInfo#equals(java.lang.Object)
       */
      @Override
      public boolean equals(Object o) {
          if (o == null) {
              return false;
          }
          if (!getClass().equals(o.getClass())) {
              return false;
          }
          ActiveMQConnectionRequestInfo i = (ActiveMQConnectionRequestInfo) o;
          if (notEqual(serverUrl, i.serverUrl)) {
              return false;
          }
          if (notEqual(useInboundSession, i.useInboundSession)) {
              return false;
          }
          if (notEqual(useSessionArgs, i.useSessionArgs)) {
              return false;
          }
          return true;
      }
  
      private boolean notEqual(Object o1, Object o2) {
          return (o1 == null ^ o2 == null) || (o1 != null && !o1.equals(o2));
      }
  
      /**
       * @return Returns the url.
       */
      public String getServerUrl() {
          return serverUrl;
      }
  
      /**
       * @param url
       *        The url to set.
       */
      public void setServerUrl(String url) {
          this.serverUrl = url;
      }
  
      /**
       * @return Returns the password.
       */
      public String getPassword() {
          return password;
      }
  
      /**
       * @param password
       *        The password to set.
       */
      public void setPassword(String password) {
          this.password = password;
      }
  
      /**
       * @return Returns the userid.
       */
      public String getUserName() {
          return userName;
      }
  
      /**
       * @param userid
       *        The userid to set.
       */
      public void setUserName(String userid) {
          this.userName = userid;
      }
  
      /**
       * @return Returns the clientid.
       */
      public String getClientid() {
          return clientid;
      }
  
      /**
       * @param clientid
       *        The clientid to set.
       */
      public void setClientid(String clientid) {
          this.clientid = clientid;
      }
  
      public String getTrustStore() {
          return trustStore;
      }
  
      public void setTrustStore(String trustStore) {
          this.trustStore = trustStore;
      }
  
      public String getTrustStorePassword() {
          return trustStorePassword;
      }
  
      public void setTrustStorePassword(String trustStorePassword) {
          this.trustStorePassword = trustStorePassword;
      }
  
      public String getKeyStore() {
          return keyStore;
      }
  
      public void setKeyStore(String keyStore) {
          this.keyStore = keyStore;
      }
  
      public String getKeyStorePassword() {
          return keyStorePassword;
      }
  
      public void setKeyStorePassword(String keyStorePassword) {
          this.keyStorePassword = keyStorePassword;
      }
  
      public String getKeyStoreKeyPassword() {
          return keyStoreKeyPassword;
      }
  
      public void setKeyStoreKeyPassword(String keyStoreKeyPassword) {
          this.keyStoreKeyPassword = keyStoreKeyPassword;
      }
  
      @Override
      public String toString() {
          return "ActiveMQConnectionRequestInfo{ userName = '" + userName + "' " + ", serverUrl = '" + serverUrl +
                  "' " + ", clientid = '" + clientid + "' " +
                  ", useSessionArgs = '" + useSessionArgs + "' " + ", useInboundSession = '" + useInboundSession + "'  }";
      }
  
      public Boolean getUseInboundSession() {
          return useInboundSession;
      }
  
      public void setUseInboundSession(Boolean useInboundSession) {
          this.useInboundSession = useInboundSession;
      }
  
      public boolean isUseInboundSessionEnabled() {
          return useInboundSession != null && useInboundSession;
      }
  
      public Double getRedeliveryBackOffMultiplier() {
          return redeliveryPolicy().getBackOffMultiplier();
      }
  
      public Long getInitialRedeliveryDelay() {
          return redeliveryPolicy().getInitialRedeliveryDelay();
      }
  
      public Long getMaximumRedeliveryDelay() {
          return redeliveryPolicy().getMaximumRedeliveryDelay();
      }
  
      public Integer getMaximumRedeliveries() {
          return redeliveryPolicy().getMaximumRedeliveries();
      }
  
      public Boolean getRedeliveryUseExponentialBackOff() {
          return redeliveryPolicy().isUseExponentialBackOff();
      }
  
      public void setRedeliveryBackOffMultiplier(Double value) {
          if (value != null) {
              redeliveryPolicy().setBackOffMultiplier(value);
          }
      }
  
      public void setInitialRedeliveryDelay(Long value) {
          if (value != null) {
              redeliveryPolicy().setInitialRedeliveryDelay(value);
          }
      }
  
      public void setMaximumRedeliveryDelay(Long value) {
          if (value != null) {
              redeliveryPolicy().setMaximumRedeliveryDelay(value);
          }
      }
  
      public void setMaximumRedeliveries(Integer value) {
          if (value != null) {
              redeliveryPolicy().setMaximumRedeliveries(value);
          }
      }
  
      public void setRedeliveryUseExponentialBackOff(Boolean value) {
          if (value != null) {
              redeliveryPolicy().setUseExponentialBackOff(value);
          }
      }
  
      public Integer getDurableTopicPrefetch() {
          return prefetchPolicy().getDurableTopicPrefetch();
      }
  
      public Integer getOptimizeDurableTopicPrefetch() {
          return prefetchPolicy().getOptimizeDurableTopicPrefetch();
      }
  
      @Deprecated
      public Integer getInputStreamPrefetch() {
          return 0;
      }
  
      public Integer getQueueBrowserPrefetch() {
          return prefetchPolicy().getQueueBrowserPrefetch();
      }
  
      public Integer getQueuePrefetch() {
          return prefetchPolicy().getQueuePrefetch();
      }
  
      public Integer getTopicPrefetch() {
          return prefetchPolicy().getTopicPrefetch();
      }
  
      public void setAllPrefetchValues(Integer i) {
          if (i != null) {
              prefetchPolicy().setAll(i);
          }
      }
  
      public void setDurableTopicPrefetch(Integer durableTopicPrefetch) {
          if (durableTopicPrefetch != null) {
              prefetchPolicy().setDurableTopicPrefetch(durableTopicPrefetch);
          }
      }
  
      public void setOptimizeDurableTopicPrefetch(Integer optimizeDurableTopicPrefetch) {
          if (optimizeDurableTopicPrefetch != null) {
              prefetchPolicy().setOptimizeDurableTopicPrefetch(optimizeDurableTopicPrefetch);
          }
      }
  
      public void setQueueBrowserPrefetch(Integer queueBrowserPrefetch) {
          if (queueBrowserPrefetch != null) {
              prefetchPolicy().setQueueBrowserPrefetch(queueBrowserPrefetch);
          }
      }
  
      public void setQueuePrefetch(Integer queuePrefetch) {
          if (queuePrefetch != null) {
              prefetchPolicy().setQueuePrefetch(queuePrefetch);
          }
      }
  
      public void setTopicPrefetch(Integer topicPrefetch) {
          if (topicPrefetch != null) {
              prefetchPolicy().setTopicPrefetch(topicPrefetch);
          }
      }
  
      /**
       * Returns the redelivery policy; not using bean properties to avoid
       * breaking compatibility with JCA configuration in J2EE
       */
      public RedeliveryPolicy redeliveryPolicy() {
          if (redeliveryPolicy == null) {
              redeliveryPolicy = new RedeliveryPolicy();
          }
          return redeliveryPolicy;
      }
  
      /**
       * Returns the prefetch policy; not using bean properties to avoid breaking
       * compatibility with JCA configuration in J2EE
       */
      public ActiveMQPrefetchPolicy prefetchPolicy() {
          if (prefetchPolicy == null) {
              prefetchPolicy = new ActiveMQPrefetchPolicy();
          }
          return prefetchPolicy;
      }
  
      public boolean isUseSessionArgs() {
          return useSessionArgs != null ? useSessionArgs : false;
      }
  
      public Boolean getUseSessionArgs() {
          return useSessionArgs;
      }
  
      public void setUseSessionArgs(Boolean useSessionArgs) {
          this.useSessionArgs = useSessionArgs;
      }
  
      protected String defaultValue(String value, String defaultValue) {
          if (value != null) {
              return value;
          }
          return defaultValue;
      }
  }
  