docs: 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>();
          final List<PropertyDescriptor> invalidProperties = new ArrayList<PropertyDescriptor>();
  
          try {
  
              if (isSet(_destinationName))
              {
                  // BusName must be set
                  if (!isSet(_busName)) {
  
                      if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                          SibTr.debug(this, TRACE, "Invalid BusName - BusName was "
                                                   + _busName);
                      }
                      failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_BUSNAME_CWSIV0504"),
                                                                      null, null));
                      invalidProperties.add(new PropertyDescriptor("BusName",
                                      SibRaActivationSpec.class));
  
                  }
  
                  // DestinationType must be valid
                  if (!DESTINATION_TYPES.keySet().contains(_destinationType)) {
  
                      if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                          SibTr.debug(this, TRACE,
                                      "Invalid Destination Type - We expected a destination type of "
                                                      + DESTINATION_TYPE_QUEUE + " or " + DESTINATION_TYPE_TOPIC_SPACE + " or "
                                                      + DESTINATION_TYPE_PORT + " or " + DESTINATION_TYPE_SERVICE
                                                      + " but we got "
                                                      + _destinationType);
                      }
  
                      failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_DESTINATION_TYPE_CWSIV0505"),
                                                                      new Object[] { DESTINATION_TYPE_QUEUE,
                                                                                    DESTINATION_TYPE_TOPIC_SPACE,
                                                                                    DESTINATION_TYPE_PORT,
                                                                                    DESTINATION_TYPE_SERVICE,
                                                                                    _destinationType }, null));
                      invalidProperties.add(new PropertyDescriptor(
                                      "DestinationType", SibRaActivationSpec.class));
  
                  }
  
                  // Make sure we are not using a topic space if wildcarded destinations are used.
                  if ((Boolean.TRUE.equals(_useDestinationWildcard))
                      && (DESTINATION_TYPE_TOPIC_SPACE.equals(_destinationType)))
                  {
                      failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_USEDESTWILDCARD_CWSIV0515"),
                                                                      null, null));
                      invalidProperties.add(new PropertyDescriptor(
                                      "UseDestinationWildcard",
                                      SibRaActivationSpec.class));
                  }
  
                  // For durable subscriptions...
                  if ((DESTINATION_TYPE_TOPIC_SPACE.equals(_destinationType))
                      && (isSet(_subscriptionName))) {
  
                      // ShareDurableSubscriptions must be valid
                      if (!SUBSCRIPTION_SHAREABILITY.keySet().contains(
                                                                       _shareDurableSubscriptions)) {
  
                          if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                              SibTr.debug(this, TRACE,
                                          "Invalid shareDurableSubscriptions - We expect a value of "
                                                          + SibRaDurableSubscriptionSharing.ALWAYS + ", "
                                                          + SibRaDurableSubscriptionSharing.NEVER + " or "
                                                          + SibRaDurableSubscriptionSharing.CLUSTER_ONLY + " but we got "
                                                          + _shareDurableSubscriptions);
                          }
                          failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_SHARE_DURSUB_CWSIV0506"),
                                                                          new Object[] { SibRaDurableSubscriptionSharing.ALWAYS,
                                                                                        SibRaDurableSubscriptionSharing.NEVER,
                                                                                        SibRaDurableSubscriptionSharing.CLUSTER_ONLY,
                                                                                        _shareDurableSubscriptions },
                                                                          null));
  
                          invalidProperties.add(new PropertyDescriptor(
                                          "ShareDurableSubscriptions",
                                          SibRaActivationSpec.class));
  
                      }
  
                      // DurableSubscriptionHome must be set
                      if (!isSet(_durableSubscriptionHome)) {
  
                          failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_DURSUBHOME_CWSIV0507"),
                                                                          null, null));
                          invalidProperties.add(new PropertyDescriptor(
                                          "DurableSubscriptionHome",
                                          SibRaActivationSpec.class));
  
                      }
  
                  }
  
              } else {
  
                  // DestinationType must be valid and not a topic space
                  if (!DESTINATION_TYPES.keySet().contains(_destinationType)
                      || DESTINATION_TYPE_TOPIC_SPACE
                                      .equals(_destinationType)) {
  
                      if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                          SibTr.debug(this, TRACE,
                                      "Invalid Destination Type - No destination was specified so we expected a destination type of "
                                                      + DESTINATION_TYPE_QUEUE + " or " + DESTINATION_TYPE_PORT + " or "
                                                      + DESTINATION_TYPE_SERVICE + " but we got "
                                                      + _destinationType);
                      }
  
                      failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_DESTINATION_TYPE_CWSIV0508"),
                                                                      new Object[] { DESTINATION_TYPE_QUEUE,
                                                                                    DESTINATION_TYPE_PORT,
                                                                                    DESTINATION_TYPE_SERVICE,
                                                                                    _destinationType }, null));
                      invalidProperties.add(new PropertyDescriptor(
                                      "DestinationType", SibRaActivationSpec.class));
  
                  }
  
              }
  
              // MaxBatchSize must be an Integer greater than zero
              if ((_maxBatchSize == null) || (_maxBatchSize.intValue() < 1)) {
  
                  failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_MAXBATCH_CWSIV0509"),
                                                                  null, null));
                  invalidProperties.add(new PropertyDescriptor("MaxBatchSize",
                                  SibRaActivationSpec.class));
  
              }
  
              // MessageDeletionMode must be valid
              if (!MESSAGE_DELETION_MODES.keySet().contains(_messageDeletionMode)) {
  
                  if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                      SibTr.debug(this, TRACE,
                                  "Invalid Message Deletion Mode we expected a mode of "
                                                  + SibRaMessageDeletionMode.SINGLE + " or "
                                                  + SibRaMessageDeletionMode.BATCH + " or "
                                                  + SibRaMessageDeletionMode.APPLICATION + " but we got "
                                                  + _messageDeletionMode);
                  }
  
                  failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_DELETION_MODE_CWSIV0510"),
                                                                  new Object[] { SibRaMessageDeletionMode.SINGLE,
                                                                                SibRaMessageDeletionMode.BATCH,
                                                                                SibRaMessageDeletionMode.APPLICATION,
                                                                                _messageDeletionMode }, null));
                  invalidProperties.add(new PropertyDescriptor(
                                  "MessageDeletionMode", SibRaActivationSpec.class));
  
              }
  
              // MaxConcurrency must be an Integer greater than zero
              if ((_maxConcurrency == null) || (_maxConcurrency.intValue() < 1)) {
  
                  failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_MAXCONC_CWSIV0511"),
                                                                  null, null));
                  invalidProperties.add(new PropertyDescriptor("MaxConcurrency",
                                  SibRaActivationSpec.class));
  
              }
  
              /**
               * For the target set of properties, use the defaults if none specified
               */
  
              if ("".equals(_targetType)) {
  
                  _targetType = JmsraConstants.DEFAULT_TARGET_TRANSPORT;
  
              }
  
              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_CWSIV0512"),
                                                                      new Object[] { ApiJmsConstants.TARGET_TYPE_BUSMEMBER,
                                                                                    ApiJmsConstants.TARGET_TYPE_ME,
                                                                                    ApiJmsConstants.TARGET_TYPE_CUSTOM,
                                                                                    _targetType },
                                                                      null));
  
                      invalidProperties.add(new PropertyDescriptor(
                                      "targetType",
                                      SibRaActivationSpec.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_CWSIV0513"),
                                                                      new Object[] { ApiJmsConstants.TARGET_SIGNIFICANCE_PREFERRED,
                                                                                    ApiJmsConstants.TARGET_SIGNIFICANCE_REQUIRED,
                                                                                    _targetSignificance },
                                                                      null));
                      invalidProperties.add(new PropertyDescriptor(
                                      "targetSignificance",
                                      SibRaActivationSpec.class));
  
                  }
  
              }
  
              if ((_useServerSubject.booleanValue()) && (isSet(_providerEndpoints)))
              {
                  failedPropsMessages.add(NLS.getFormattedMessage(("INVALID_PROPERTY_PROVIDER_ENDPOINTS_CWSIV0514"),
                                                                  new Object[] { _providerEndpoints },
                                                                  null));
                  invalidProperties.add(new PropertyDescriptor(
                                  "providerEndpoints",
                                  SibRaActivationSpec.class));
              }
  
          } catch (final IntrospectionException exception) {
  
              FFDCFilter.processException(exception, CLASS_NAME + "."
                                                     + methodName, FFDC_PROBE_1, this);
              // Should never happen
  
          }
  
          // If we have any invalid properties, throw an
          // InvalidPropertyException
          if (!invalidProperties.isEmpty()) {
  
              final PropertyDescriptor[] invalidPropertyArray = (PropertyDescriptor[]) invalidProperties
                              .toArray(new PropertyDescriptor[invalidProperties
                                              .size()]);
  
              if (TraceComponent.isAnyTracingEnabled() && TRACE.isDebugEnabled()) {
                  SibTr.debug(this, TRACE, "Invalid properties found:",
                              failedPropsMessages);
              }
  
              final InvalidPropertyException exc = new InvalidPropertyException(
                              NLS.getFormattedMessage(
                                                      ("INVALID_PROPERTIES_CWSIV0501"),
                                                      new Object[] { this, failedPropsMessages }, null));
              exc.setInvalidPropertyDescriptors(invalidPropertyArray);
              throw exc;
          }
  
          if (TraceComponent.isAnyTracingEnabled() && TRACE.isEntryEnabled()) {
              SibTr.exit(this, TRACE, methodName);
          }
  
      }