docs: private Object createActivationSpec(@Sensitive Properties activationProperties,
                                          String authAlias,
                                          AdminObjectService adminObjSvc,
                                          String destinationID, // this is for the XAResource scenario and when MDB can not find the admin object
                                          String destinationIDOrJNDIName,
                                          String appName) throws Exception {
          final boolean trace = TraceComponent.isAnyTracingEnabled();
          if (trace && tc.isEntryEnabled())
              Tr.entry(this, tc, "createActivationSpec",
                       activationProperties, authAlias, adminObjSvc, destinationID, appName);
  
          BootstrapContextImpl bootstrapContext = bootstrapContextRef.getServiceWithException();
          Class<?> activationSpecClass = bootstrapContext.loadClass(activationSpecClassName);
          String adapterName = bootstrapContext.getResourceAdapterName();
          String embeddedApp = null;
          ResourceAdapterMetaData metadata = bootstrapContext.getResourceAdapterMetaData();
          if (metadata != null && metadata.isEmbedded()) { // metadata is null for SIB/MQ
              embeddedApp = metadata.getJ2EEName().getApplication();
              Utils.checkAccessibility(id, adapterName, embeddedApp, appName, true);
          }
          Object activationSpec = activationSpecClass.getConstructor().newInstance();
  
          // Activation config properties might be specified in the form "propName" or "PropName"
          Map<String, Object> activationProps = new HashMap<String, Object>();
          for (Map.Entry<?, ?> prop : activationProperties.entrySet()) {
              String key = (String) prop.getKey();
              char firstChar = key.charAt(0);
              if (Character.isUpperCase(firstChar))
                  key = new StringBuilder(key.length()).append(Character.toLowerCase(firstChar)).append(key.substring(1)).toString();
              activationProps.put(key, prop.getValue());
              if (trace && tc.isDebugEnabled())
                  Tr.debug(this, tc, "activation config: " + key + '=' + (key.toLowerCase().contains(PASSWORD) ? "***" : prop.getValue()));
          }
  
          boolean atLeastJCA17 = atLeastJCAVersion(JCARuntimeVersion.VERSION_1_7);
          if (!(activationProps.containsKey(DESTINATION) || atLeastJCA17 && activationProps.containsKey(DESTINATION_LOOKUP))) {
              boolean added = false;
              if (atLeastJCA17 && hasDestinationLookupProp(activationSpec)) {
                  String jndiName = destinationIDOrJNDIName == null ? destinationRef.getServiceWithException().getJndiName() : destinationIDOrJNDIName;
                  if (jndiName != null) {
                      if (trace && tc.isDebugEnabled())
                          Tr.debug(this, tc, "add destinationLookup " + jndiName + " to activation props");
                      activationProps.put(DESTINATION_LOOKUP, jndiName);
                      added = true;
                  }
              }
  
              if (!added && hasDestinationProp(activationSpec)) {
                  if (destinationID == null)
                      destinationID = destinationRef.getServiceWithException().getId();
                  if (destinationID == null)
                      destinationID = destinationRef.getServiceWithException().getJndiName();
                  if (destinationID != null) {
                      if (trace && tc.isDebugEnabled())
                          Tr.debug(this, tc, "add destination " + destinationID + " to activation props");
                      activationProps.put(DESTINATION, destinationID);
                  }
              }
          }
  
          if (authAlias != null)
              processAuthData(authAlias, activationProps);
          else if (authDataRef != null) {
              activationProps.put(USER_NAME, authDataRef.getProperty("user"));
              activationProps.put(PASSWORD, authDataRef.getProperty("password"));
          }
  
          if (requiredConfigProps != null)
              for (String name : requiredConfigProps)
                  if (!configProps.containsKey(name)
                      && !activationProps.containsKey(name)
                      && bootstrapContextRef.getReference().getProperty(name) == null
                      && (!DESTINATION.equals(name) || destinationRef.getService() == null))
                      throw new ResourceException(Tr.formatMessage(tc, "J2CA8813.required.activation.prop.not.set", name, id, bootstrapContext.getResourceAdapterName()));
  
          ComponentMetaDataAccessorImpl cmda = ComponentMetaDataAccessorImpl.getComponentMetaDataAccessor();
          try {
              if (metadata != null) // push ra metadata
                  cmda.beginContext(metadata);
              bootstrapContext.configure(activationSpec, id, configProps, activationProps, adminObjSvc, destinationRef);
          } finally {
              if (metadata != null) // pop ra metadata
                  cmda.endContext();
          }
          if (activationSpec instanceof ActivationSpec) {
              try {
                  ((ActivationSpec) activationSpec).validate();
              } catch (java.lang.UnsupportedOperationException uoe) {
                  if (trace && tc.isDebugEnabled()) {
                      Tr.debug(tc, "The ActivationSpec type " + activationSpec.getClass().getName() + " does not support the validate() method.", uoe);
                  }
              }
          }
  
          if (trace && tc.isEntryEnabled())
              Tr.exit(this, tc, "createActivationSpec", destinationRef);
          return activationSpec;
      }