docs: @Override
      public void validate() throws InvalidPropertyException {
  
          final String methodName = "validate";
          if (TraceComponent.isAnyTracingEnabled() && TRACE.isEntryEnabled()) {
              SibTr.entry(this, TRACE, methodName);
          }
  
          final List<String> failedPropsMessages = new ArrayList<String>();
  
          try {
              final List<PropertyDescriptor> invalidProperties = new ArrayList<PropertyDescriptor>();
  
              // Busname is required
              if ((null == _busName) || ("".equals(_busName))) {
                  if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                      SibTr.debug(this, TRACE, "Invalid BusName - BusName was "
                                               + _busName);
                  }
                  failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_BUSNAME_CWSJR1187"),
                                                                  null, null));
                  invalidProperties.add(new PropertyDescriptor("busName",
                                  JmsJcaActivationSpec.class));
              }
  
              // Destination required
              if (null == _destination) {
                  if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                      SibTr.debug(this, TRACE,
                                  "Invalid Destination - Destination was null");
                  }
                  failedPropsMessages.add(NLS.getFormattedMessage("INVALID_PROPERTY_DESTINATION_CWSJR1188", null, null));
                  invalidProperties.add(new PropertyDescriptor("destination",
                                  JmsJcaActivationSpec.class));
              }
  
              // Check destination type valid
              if (!(QUEUE.equals(_destinationType) || TOPIC
                              .equals(_destinationType))) {
                  if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                      SibTr.debug(this, TRACE,
                                  "Invalid Destination Type - We expected a destination type of "
                                                  + QUEUE + " or " + TOPIC + " but we got "
                                                  + _destinationType);
                  }
                  failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_DESTINATION_TYPE_CWSJR1189"),
                                                                  new Object[] { QUEUE, TOPIC, _destinationType }, null));
                  invalidProperties.add(new PropertyDescriptor("destinationType",
                                  JmsJcaActivationSpec.class));
              }
  
              // Check acknowledge mode valid
              if (!(AUTO_ACKNOWLEDGE.equals(_acknowledgeMode) || DUPS_OK_ACKNOWLEDGE
                              .equals(_acknowledgeMode))) {
                  if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                      SibTr.debug(this, TRACE,
                                  "Invalid Acknowledge Mode - We expected an acknowledge mode of "
                                                  + AUTO_ACKNOWLEDGE + " or "
                                                  + DUPS_OK_ACKNOWLEDGE + " but we got "
                                                  + _acknowledgeMode);
                  }
                  failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_ACKNOWLEDGE_MODE_CWSJR1190"),
                                                                  new Object[] { AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE, _acknowledgeMode },
                                                                  null));
                  invalidProperties.add(new PropertyDescriptor("acknowledgeMode",
                                  JmsJcaActivationSpec.class));
              }
  
              // Check read ahead valid
              if (!(ApiJmsConstants.READ_AHEAD_DEFAULT.equals(_readAhead)
                    || ApiJmsConstants.READ_AHEAD_ON.equals(_readAhead) || ApiJmsConstants.READ_AHEAD_OFF
                              .equals(_readAhead))) {
  
                  if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                      SibTr.debug(this, TRACE,
                                  "Invalid ReadAhead - We expected a read ahead of "
                                                  + ApiJmsConstants.READ_AHEAD_DEFAULT + ", "
                                                  + ApiJmsConstants.READ_AHEAD_ON + " or "
                                                  + ApiJmsConstants.READ_AHEAD_OFF
                                                  + " but we got " + _readAhead);
                  }
                  failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_READ_AHEAD_CWSJR1191"),
                                                                  new Object[] { ApiJmsConstants.READ_AHEAD_DEFAULT,
                                                                                ApiJmsConstants.READ_AHEAD_ON,
                                                                                ApiJmsConstants.READ_AHEAD_OFF,
                                                                                _acknowledgeMode },
                                                                  null));
                  invalidProperties.add(new PropertyDescriptor("readAhead",
                                  JmsJcaActivationSpec.class));
              }
  
              // For queues ...
              if (QUEUE.equals(_destinationType)) {
                  if (!(_destination instanceof JmsQueue)) {
                      if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                          SibTr.debug(this, TRACE,
                                      "Invalid Destination - We expect a destination object to be a "
                                                      + JmsQueue.class.getName()
                                                      + " but we got "
                                                      + _destination == null ? "null" : _destination.getClass().getName());
                      }
                      failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_QUEUE_CWSJR1192"),
                                                                      new Object[] { JmsQueue.class.getName(), _destination == null ? "null" : _destination.getClass().getName() },
                                                                      null));
                      invalidProperties.add(new PropertyDescriptor("destination",
                                      JmsJcaActivationSpec.class));
                  }
              }
  
              // For topics ...
              if (TOPIC.equals(_destinationType)) {
  
                  if (!(_destination instanceof JmsTopic)) {
                      if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                          SibTr.debug(this, TRACE,
                                      "Invalid Destination - We expect a destination object to be a "
                                                      + JmsTopic.class.getName()
                                                      + " but we got "
                                                      + _destination == null ? "null" : _destination.getClass().getName());
                      }
                      failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_TOPIC_CWSJR1193"),
                                                                      new Object[] { JmsTopic.class.getName(), _destination == null ? "null" : _destination.getClass().getName() },
                                                                      null));
                      invalidProperties.add(new PropertyDescriptor("destination",
                                      JmsJcaActivationSpec.class));
                  }
  
                  // ... check subscription durability valid
                  if (!(DURABLE.equals(_subscriptionDurability) || DURABLE_SHARED.equals(_subscriptionDurability) ||
                        NON_DURABLE.equals(_subscriptionDurability) || NON_DURABLE_SHARED.equals(_subscriptionDurability))) {
                      if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                          SibTr.debug(this, TRACE,
                                      "Invalid subscriptionDurability - We expect a value of "
                                                      + DURABLE + " or " + DURABLE_SHARED + " or " + NON_DURABLE + " or " + NON_DURABLE_SHARED
                                                      + " but we got "
                                                      + _subscriptionDurability);
                      }
                      failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_SUBDUR_CWSJR1194"),
                                                                      new Object[] { DURABLE, DURABLE_SHARED, NON_DURABLE, NON_DURABLE_SHARED, _subscriptionDurability },
                                                                      null));
                      invalidProperties.add(new PropertyDescriptor(
                                      "subscriptionDurability",
                                      JmsJcaActivationSpec.class));
                  }
  
                  if (DURABLE.equals(_subscriptionDurability)) {
                      // ... check client ID set
                      if ((null == _clientId) || ("".equals(_clientId))) {
                          failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_CLIENTID_CWSJR1183"),
                                                                          null, null));
                          invalidProperties.add(new PropertyDescriptor(
                                          "clientId", JmsJcaActivationSpec.class));
                      }
  
                  }
                  // For durable(and shared non durable) topic subscriptions ...
                  if (DURABLE.equals(_subscriptionDurability) ||
                      DURABLE_SHARED.equals(_subscriptionDurability) ||
                      NON_DURABLE_SHARED.equals(_subscriptionDurability)) {
                      // ... check client ID set
                      if ((null == _clientId) || ("".equals(_clientId))) {
                          failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_CLIENTID_CWSJR1183"),
                                                                          null, null));
                          invalidProperties.add(new PropertyDescriptor(
                                          "clientId", JmsJcaActivationSpec.class));
                      }
  
                      // durableSubscriptionHome is populated at the connectionImpl 
                      // or the ConnectionProxy for liberty.Hence the check is removed
  
                      // ... check subscription name set
                      if ((null == _subscriptionName)
                          || ("".equals(_subscriptionName))) {
  
                          failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_SUBNAME_CWSJR1196"),
                                                                          null, null));
                          invalidProperties
                                          .add(new PropertyDescriptor("subscriptionName",
                                                          JmsJcaActivationSpec.class));
  
                      }
  
                  }
              }
  
              // Check maximum concurrency greater than zero
              if ((null == _maxConcurrency) || (_maxConcurrency.intValue() < 1)) {
                  failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_MAXCONC_CWSJR1198"),
                                                                  null, null));
                  invalidProperties.add(new PropertyDescriptor("maxConcurrency",
                                  JmsJcaActivationSpec.class));
              }
  
              // Check maximum batch size greater than zero
              if ((null == _maxBatchSize) || (_maxBatchSize.intValue() < 1)) {
                  failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_MAXBATCH_CWSJR1199"),
                                                                  null, null));
                  invalidProperties.add(new PropertyDescriptor("maxBatchSize",
                                  JmsJcaActivationSpec.class));
              }
  
              // Check share data source with CMP is set - since this defaults to a value at
              // initialisation time this should never be encountered
              if (null == _shareDataSourceWithCMP) {
                  failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_SHARECMP_CWSJR1200"),
                                                                  null, null));
                  invalidProperties.add(new PropertyDescriptor(
                                  "shareDataSourceWithCMP", JmsJcaActivationSpec.class));
              }
  
              /**
               * For the target set of properties, use the defaults if none specified
               */
              if ("".equals(_target)) {
  
                  _target = JmsraConstants.DEFAULT_TARGET;
  
              }
  
              // Target type must be one of the predefined values
              if ((null == _targetType) || ("".equals(_targetType))) {
  
                  _targetType = JmsraConstants.DEFAULT_TARGET_TYPE;
  
              } else {
  
                  if (!((ApiJmsConstants.TARGET_TYPE_BUSMEMBER.equals(_targetType)) ||
                        (ApiJmsConstants.TARGET_TYPE_ME.equals(_targetType)) || (ApiJmsConstants.TARGET_TYPE_CUSTOM.equals(_targetType)))) {
  
                      failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_TARGET_TYPE_CWSJR1180"),
                                                                      new Object[] { ApiJmsConstants.TARGET_TYPE_BUSMEMBER,
                                                                                    ApiJmsConstants.TARGET_TYPE_ME,
                                                                                    ApiJmsConstants.TARGET_TYPE_CUSTOM,
                                                                                    _targetType },
                                                                      null));
                      invalidProperties.add(new PropertyDescriptor(
                                      "targetType",
                                      JmsJcaActivationSpec.class));
  
                  }
  
              }
  
              // Target significance must be one of the predefined values
              if ((null == _targetSignificance) || ("".equals(_targetSignificance))) {
  
                  _targetSignificance = JmsraConstants.DEFAULT_TARGET_SIGNIFICANCE;
  
              } else {
  
                  if (!((ApiJmsConstants.TARGET_SIGNIFICANCE_PREFERRED.equals(_targetSignificance)) || (ApiJmsConstants.TARGET_SIGNIFICANCE_REQUIRED.equals(_targetSignificance)))) {
  
                      failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_TARGET_SIGNIFICANCE_CWSJR1179"),
                                                                      new Object[] { ApiJmsConstants.TARGET_SIGNIFICANCE_PREFERRED,
                                                                                    ApiJmsConstants.TARGET_SIGNIFICANCE_REQUIRED,
                                                                                    _targetSignificance },
                                                                      null));
                      invalidProperties.add(new PropertyDescriptor(
                                      "targetSignificance",
                                      JmsJcaActivationSpec.class));
  
                  }
  
              }
  
              // If we have any invalid properties, throw an
              // InvalidPropertyException
              if (!invalidProperties.isEmpty()) {
  
                  final PropertyDescriptor[] invalidPropertyArray = invalidProperties
                                  .toArray(new PropertyDescriptor[invalidProperties
                                                  .size()]);
                  // Commented out in 284561 since we are now using failedPropsMessages instead
  /*
   * final List propertyNames = new ArrayList();
   * 
   * for (int i = 0; i < invalidPropertyArray.length; i++) {
   * propertyNames.add(invalidPropertyArray[i].getDisplayName());
   * }
   */
  
                  if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                      SibTr.debug(this, TRACE, "Invalid properties found:",
                                  failedPropsMessages);
                  }
  
                  final InvalidPropertyException exc = new InvalidPropertyException(
                                  NLS.getFormattedMessage(
                                                          ("INVALID_PROPERTIES_CWSJR1181"),
                                                          new Object[] { failedPropsMessages }, null));
                  exc.setInvalidPropertyDescriptors(invalidPropertyArray);
                  throw exc;
              }
  
          } catch (final IntrospectionException exception) {
  
              FFDCFilter.processException(exception, CLASS_NAME + "."
                                                     + methodName, FFDC_PROBE_1, this);
  
              SibTr.exception(this, TRACE, exception);
  
              throw new RuntimeException(NLS.getFormattedMessage(
                                                                 ("EXCEPTION_RECEIVED_CWSJR1185"),
                                                                 new Object[] { exception }, null), exception);
          }
  
          if (TraceComponent.isAnyTracingEnabled() && TRACE.isEntryEnabled()) {
              SibTr.exit(this, TRACE, methodName);
          }
  
      }