docs: private void modified(Dictionary<String, ?> newProperties, boolean logMessage) {
          final boolean trace = TraceComponent.isAnyTracingEnabled();
          if (trace && tc.isEntryEnabled())
              Tr.entry(this, tc, "modified", newProperties);
  
          boolean replaced = false;
          lock.writeLock().lock();
          try {
              if (isInitialized) {
                  if (classloader != null) {
                      if (isDerbyEmbedded.compareAndSet(true, false)) // assume false for any future usage until shown otherwise
                          shutdownDerbyEmbedded();
                      classloader = null;
                  }
                  for (Iterator<Class<? extends CommonDataSource>> it = introspectedClasses.iterator(); it.hasNext(); it.remove())
                      Introspector.flushFromCaches(it.next());
  
                  replaced = true;
                  isInitialized = false;
              }
  
              if (newProperties != null)
                  properties = newProperties;
          } finally {
              lock.writeLock().unlock();
          }
  
          if (replaced)
              try {
                  setChanged();
                  notifyObservers();
              } catch (Throwable x) {
                  FFDCFilter.processException(x, getClass().getName(), "254", this);
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                      Tr.debug(this, tc, x.getMessage(), AdapterUtil.stackTraceToString(x));
              }
  
          if (trace && tc.isEntryEnabled())
              Tr.exit(this, tc, "modified");
      }