code: public static boolean uninstall(AddOn addOn, AddOnUninstallationProgressCallback callback, Set<AddOn> installedAddOns) {
          Validate.notNull(addOn, "Parameter addOn must not be null.");
          validateCallbackNotNull(callback);
  
          try {
              boolean uninstalledWithoutErrors = true;
              uninstalledWithoutErrors &= uninstallAddOnPassiveScanRules(addOn, callback);
              uninstalledWithoutErrors &= uninstallAddOnActiveScanRules(addOn, callback);
              uninstalledWithoutErrors &= uninstallAddOnExtensions(addOn, callback);
              uninstalledWithoutErrors &= uninstallAddOnFiles(addOn, callback, installedAddOns);
              uninstallResourceBundle(addOn);
      
              return uninstalledWithoutErrors;
          } catch (Throwable e) {
              logger.error("An error occurred while uninstalling the add-on: " + addOn.getId(), e);
              return false;
          }
      }
docs: Uninstalls all the (dynamically installable) components ({@code Extension}s, {@code Plugin}s, {@code PassiveScanner}s and
  files) of the given {@code addOn}.
  <p>
  The components are uninstalled in the following order (inverse to installation):
  <ol>
  <li>Passive scanners;</li>
  <li>Active scanners;</li>
  <li>Extensions;</li>
  <li>Files (if not in use by other add-ons);</li>
  <li>{@link java.util.ResourceBundle ResourceBundle};</li>
  </ol>
  
  @param addOn the add-on that will be uninstalled.
  @param callback the callback that will be notified of the progress of the uninstallation.
  @param installedAddOns the add-ons currently installed.
  @return {@code true} if the add-on was uninstalled without errors, {@code false} otherwise.
  @throws IllegalArgumentException if {@code addOn} or {@code callback} are null.
  @since TODO add version
  @see #softUninstall(AddOn, AddOnUninstallationProgressCallback)
  @see Extension
  @see PassiveScanner
  @see org.parosproxy.paros.core.scanner.Plugin