docs: @Nonnull
    public EChange setUserData (@Nullable final String sUserID,
                                @Nonnull @Nonempty final String sNewLoginName,
                                @Nullable final String sNewEmailAddress,
                                @Nullable final String sNewFirstName,
                                @Nullable final String sNewLastName,
                                @Nullable final String sNewDescription,
                                @Nullable final Locale aNewDesiredLocale,
                                @Nullable final Map <String, String> aNewCustomAttrs,
                                final boolean bNewDisabled)
    {
      // Resolve user
      final User aUser = getOfID (sUserID);
      if (aUser == null)
      {
        AuditHelper.onAuditModifyFailure (User.OT, sUserID, "no-such-user-id");
        return EChange.UNCHANGED;
      }
  
      m_aRWLock.writeLock ().lock ();
      try
      {
        EChange eChange = aUser.setLoginName (sNewLoginName);
        eChange = eChange.or (aUser.setEmailAddress (sNewEmailAddress));
        eChange = eChange.or (aUser.setFirstName (sNewFirstName));
        eChange = eChange.or (aUser.setLastName (sNewLastName));
        eChange = eChange.or (aUser.setDescription (sNewDescription));
        eChange = eChange.or (aUser.setDesiredLocale (aNewDesiredLocale));
        eChange = eChange.or (aUser.setDisabled (bNewDisabled));
        eChange = eChange.or (aUser.attrs ().setAll (aNewCustomAttrs));
        if (eChange.isUnchanged ())
          return EChange.UNCHANGED;
  
        BusinessObjectHelper.setLastModificationNow (aUser);
        internalUpdateItem (aUser);
      }
      finally
      {
        m_aRWLock.writeLock ().unlock ();
      }
      AuditHelper.onAuditModifySuccess (User.OT,
                                        "all",
                                        aUser.getID (),
                                        sNewLoginName,
                                        sNewEmailAddress,
                                        sNewFirstName,
                                        sNewLastName,
                                        sNewDescription,
                                        aNewDesiredLocale,
                                        aNewCustomAttrs,
                                        Boolean.valueOf (bNewDisabled));
  
      // Execute callback as the very last action
      m_aCallbacks.forEach (aCB -> aCB.onUserUpdated (aUser));
  
      return EChange.CHANGED;
    }