docs: @FFDCIgnore(value = { NumberFormatException.class, Throwable.class })
      public void configure(Object instance,
                            String id,
                            Map<String, ?> configProps,
                            @Sensitive Map<String, Object> activationProps,
                            AdminObjectService adminObjSvc,
                            AtomicServiceReference<AdminObjectService> destinationRef) throws Exception {
          final String methodName = "configure";
          final boolean trace = TraceComponent.isAnyTracingEnabled();
          if (trace && tc.isEntryEnabled())
              Tr.entry(this, tc, methodName,
                       instance, id, configProps, activationProps, adminObjSvc, destinationRef);
  
          if (instance instanceof ResourceAdapterAssociation && resourceAdapter != null)
              ((ResourceAdapterAssociation) instance).setResourceAdapter(resourceAdapter);
  
          // Assume all configured properties are invalid until we find them
          Set<String> invalidPropNames = new HashSet<String>(configProps.keySet());
          if (activationProps != null)
              invalidPropNames.addAll(activationProps.keySet());
  
          Class<?> objectClass = instance.getClass();
          for (PropertyDescriptor descriptor : Introspector.getBeanInfo(objectClass).getPropertyDescriptors()) {
              Method writeMethod = descriptor.getWriteMethod();
              Class<?> type = descriptor.getPropertyType();
              String name = MetatypeGenerator.toCamelCase(descriptor.getName());
              Object value = null;
              if (activationProps != null) {
                  // be tolerant of activation config properties using either form
                  value = activationProps.get(name);
                  if (value == null)
                      value = activationProps.get(descriptor.getName());
              }
              try {
                  if (value == null) {
                      value = configProps.get(name);
                      if (value == null && writeMethod != null) {
                          PropertyDescriptor raPropDescriptor = propertyDescriptors.get(name);
                          Method getter = raPropDescriptor == null ? null : raPropDescriptor.getReadMethod();
                          value = getter == null ? properties.get(name) : getter.invoke(resourceAdapter);
                      }
                  }
                  if (value != null)
                      invalidPropNames.remove(name);
  
                  // Special case: destination on activationSpec or activation config properties
                  if (EndpointActivationService.DESTINATION.equals(name)) {
                      if (trace && tc.isDebugEnabled())
                          Tr.debug(tc, "name, value before getDestination", name, value);
                      value = getDestination(value,
                                             type,
                                             (String) configProps.get("destinationType"),
                                             destinationRef, // From server activationSpec
                                             activationProps,
                                             adminObjSvc); // from MDB runtime
                      if (trace && tc.isDebugEnabled())
                          Tr.debug(tc, "value after getDestination", value);
                  }
  
                  if (value != null) {
                      boolean isProtectedString = value instanceof SerializableProtectedString;
                      if (isProtectedString)
                          value = new String(((SerializableProtectedString) value).getChars());
                      if (value instanceof String && name.toUpperCase().indexOf("PASSWORD") >= 0) {
                          value = PasswordUtil.getCryptoAlgorithm((String) value) == null ? value : PasswordUtil.decode((String) value);
                          isProtectedString = true;
                          // Recommend using authentication alias instead if password is configured on a connection factory or activation spec
                          if (name.length() == 8 && (instance instanceof ManagedConnectionFactory
                                                     || activationProps != null && !activationProps.containsKey(EndpointActivationService.PASSWORD)))
                              ConnectorService.logMessage(Level.INFO, "RECOMMEND_AUTH_ALIAS_J2CA8050", id);
                      }
                      if (trace && tc.isDebugEnabled())
                          Tr.debug(tc, "set " + name + '=' + (isProtectedString ? "***" : value));
  
                      // Some ra.xml files specify everything as String even when that's not true. If so, try to convert it:
                      if (value instanceof String) {
                          if (!type.isAssignableFrom(value.getClass()))
                              if (SSLSocketFactory.class.equals(type)) {
                                  BundleContext bundleContext = Utils.priv.getBundleContext(componentContext);
                                  ServiceReference<SSLHelper> sslHelperRef = Utils.priv.getServiceReference(bundleContext, SSLHelper.class);
                                  SSLHelper sslHelper = Utils.priv.getService(bundleContext, SSLHelper.class);
                                  try {
                                      value = sslHelper.getSSLSocketFactory((String) value);
                                  } finally {
                                      bundleContext.ungetService(sslHelperRef);
                                  }
                              } else
                                  try {
                                      value = Utils.convert((String) value, type);
                                  } catch (NumberFormatException numFormatX) {
                                      // If the property type can't be converted to what the bean info wants,
                                      // then go looking for a matching method of the proper type (that isn't on the bean info).
                                      try {
                                          writeMethod = objectClass.getMethod(writeMethod.getName(), String.class);
                                      } catch (NoSuchMethodException x) {
                                          throw numFormatX;
                                      }
                                  }
                      }
                      // Allow the metatype to use primitive types instead of String, in which case we can easily convert to String:
                      else if (String.class.equals(type))
                          value = value.toString();
                      // When ibm:type="duration" is used, we always get Long. If necessary, convert to another numeric type:
                      else if (value instanceof Number && !type.isAssignableFrom(value.getClass()))
                          value = Utils.convert((Number) value, type);
  
                      writeMethod.invoke(instance, value);
                  }
              } catch (Throwable x) {
                  x = x instanceof InvocationTargetException ? x.getCause() : x;
                  x = Utils.ignoreWarnOrFail(tc, x, x.getClass(), "J2CA8500.config.prop.error", name, id, objectClass.getName(), x);
                  if (x != null) {
                      InvalidPropertyException propX = x instanceof InvalidPropertyException ? (InvalidPropertyException) x : new InvalidPropertyException(name, x);
                      propX.setInvalidPropertyDescriptors(new PropertyDescriptor[] { descriptor });
                      FFDCFilter.processException(propX, getClass().getName(), "134");
                      throw propX;
                  }
              }
          }
  
          // Invalid properties
          for (String name : invalidPropNames) {
              InvalidPropertyException x = Utils.ignoreWarnOrFail(tc, null, InvalidPropertyException.class, "J2CA8501.config.prop.unknown", name, id, objectClass.getName());
              if (x != null) {
                  FFDCFilter.processException(x, Utils.class.getName(), "146");
                  throw x;
              }
          }
          if (bvalHelper != null) {
              ComponentMetaData cmd = ComponentMetaDataAccessorImpl.getComponentMetaDataAccessor().getComponentMetaData();
              if (cmd != null) {
                  bvalHelper.validateInstance(cmd.getModuleMetaData(), resourceAdapterSvc.getClassLoader(), instance);
              }
          }
  
          if (trace && tc.isEntryEnabled())
              Tr.exit(this, tc, methodName);
      }