/**
  * Session is NOT committed. Profiles marked as "default" for a language can't be deleted, except
  * if the parameter <code>force</code> is true.
  */
 void delete(DbSession session, String key, boolean force) {
   QualityProfileDto profile = db.qualityProfileDao().getNonNullByKey(session, key);
   List<QualityProfileDto> descendants = db.qualityProfileDao().findDescendants(session, key);
   if (!force) {
     QualityProfileDto defaultProfile = getDefault(session, profile.getLanguage());
     checkNotDefault(defaultProfile, profile);
     for (QualityProfileDto descendant : descendants) {
       checkNotDefault(defaultProfile, descendant);
     }
   }
   // delete bottom-up
   for (QualityProfileDto descendant : Lists.reverse(descendants)) {
     doDelete(session, descendant);
   }
   doDelete(session, profile);
 }