docs: public synchronized void preDelete(Transaction transaction)
                      throws ObjectManagerException
      {
          final String methodName = "preDelete";
          if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
              trace.entry(this, cclass,
                          methodName,
                          new Object[] { transaction });
  
          // The tree must be empty, apart from Entries this transaction will delete.
          Entry entry = null;
          if (root != null)
              entry = (Entry) AbstractTreeMap.minimum(getRoot());
          while (entry != null) {
              if (entry.willBeDeleted(transaction)) {
                  entry = (Entry) successor(entry);
              } else {
                  if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
                      trace.exit(this, cclass,
                                 methodName,
                                 "via CollentionNotEmptyException"
                                                 + "size=" + size + "(long)"
                                                 + " entry.state=" + entry.state + "(int) " + Entry.stateNames[entry.state]
                                                 + "\n entry.getTransactionLock=" + entry.getTransactionLock() + "(TransactionLock)"
                                      );
  
                  throw new CollectionNotEmptyException(this, size, transaction);
  
              } // if (  entry.willBeDeleted...
          } // while (entry != null).
  
          super.preDelete(transaction); // Also takes a lock.
          // Visibility is now restricted to our transaction only.
  
          if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
              trace.exit(this, cclass, methodName);
      }