docs: protected void modified(ComponentContext context, Map<String, Object> newProperties) throws Exception {
          final boolean trace = TraceComponent.isAnyTracingEnabled();
          if (trace && tc.isEntryEnabled())
              Tr.entry(this, tc, "modified", AdapterUtil.toString(newProperties));
  
          String jndiName = (String) newProperties.get(JNDI_NAME);
  
          lock.writeLock().lock();
          try {
              componentContext = context;
              if (!AdapterUtil.match(jndiName, properties.get(JNDI_NAME))) {
                  // To change JNDI name, must re-run the activate code
                  deactivate(context);
                  activate(context, newProperties);
                  if (trace && tc.isEntryEnabled())
                      Tr.exit(this, tc, "modified", "jndiName changed");
                  return;
              } else if (isInitialized.get()) {
                  PropertyService vProps = new PropertyService();
                  NavigableMap<String, Object> wProps = parseConfiguration(newProperties, vProps);
                  wProps.remove(JNDI_NAME);
                  DSConfig config = dsConfigRef.get();
                  if (!match(newProperties.get(DSConfig.CONNECTION_MANAGER_REF), properties.get(DSConfig.CONNECTION_MANAGER_REF))
                      || !match(newProperties.get(DSConfig.JDBC_DRIVER_REF), properties.get(DSConfig.JDBC_DRIVER_REF))
                      || !match(newProperties.get(DSConfig.ON_CONNECT), properties.get(DSConfig.ON_CONNECT))
                      || !match(newProperties.get(DataSourceDef.transactional.name()), properties.get(DataSourceDef.transactional.name()))) {
                      // Destroy everything, and allow lazy initialization to recreate
                      destroyConnectionFactories(true);
                  } else if (!AdapterUtil.match(vProps, config.vendorProps)
                             || !AdapterUtil.match(wProps.get(DSConfig.SUPPLEMENTAL_JDBC_TRACE), properties.get(DSConfig.SUPPLEMENTAL_JDBC_TRACE))
                             || !AdapterUtil.match(wProps.remove(DSConfig.TYPE), properties.get(DSConfig.TYPE))) {
                      // Reinitialize with a new MCF and let the old connections go away via agedTimeout or claim victim
                      // Defer the destroy until later, unless we are using Derby Embedded, in which case we need
                      // to issue a shutdown of the Derby database in order to free it up for other class loaders.
                      // Destroy now if switching to/from UCP to ensure that the connection manager is initialized
                      // with the proper properties to disable/enable Liberty connection pooling
                      isUCP = isUCP || "com.ibm.ws.jdbc.dataSource.properties.oracle.ucp".equals(newProperties.get("properties.0.config.referenceType"));
                      destroyConnectionFactories(isDerbyEmbedded || isUCP);
                  } else {
                      parseIsolationLevel(wProps, vendorImplClassName);
                      
                      if(isUCP) {
                          updateConfigForUCP(wProps);
                      }
                      
                      // Swap the reference to the configuration - the WAS data source will start honoring it
                      dsConfigRef.set(new DSConfig(config, wProps));
                  }
              } // else hasn't been used yet, just swap the properties
  
              properties = newProperties;
          } finally {
              lock.writeLock().unlock();
          }
  
          if (trace && tc.isEntryEnabled())
              Tr.exit(this, tc, "modified");
      }