/**
  * Answer true if the resource has any enabled validators.
  *
  * @param resource a file, folder or project.
  * @param isManual if true then the validator must be turned on for manual validation. If false
  *     then the isManualValidation setting isn't used to filter out validators.
  * @param isBuild if true then the validator must be turned on for build based validation. If
  *     false then the isBuildValidation setting isn't used to filter out validators.
  */
 public boolean hasValidators(IResource resource, boolean isManual, boolean isBuild) {
   if (resource instanceof IProject) {
     IProject project = (IProject) resource;
     return ValManager.getDefault().getValidators(project).length > 0;
   } else if (resource instanceof IFolder) {
     IFolder folder = (IFolder) resource;
     HasValidatorVisitor v = new HasValidatorVisitor(isManual, isBuild);
     return v.hasValidator(folder);
   } else {
     ContentTypeWrapper ctw = new ContentTypeWrapper();
     for (Validator val : ValManager.getDefault().getValidators(resource.getProject())) {
       if (Friend.shouldValidate(val, resource, isManual, isBuild, ctw)) return true;
     }
   }
   return false;
 }
  /**
   * Accept a visitor for all the validators that are enabled for the given project, resource, and
   * validation mode.
   *
   * @param valType the type of validation request
   */
  public void accept(
      IValidatorVisitor visitor,
      IProject project,
      IResource resource,
      ValType valType,
      ValOperation operation,
      IProgressMonitor monitor) {

    if (isDisabled(project)) return;

    Map<String, IValidatorGroupListener[]> groupListeners =
        new HashMap<String, IValidatorGroupListener[]>();

    ValProperty vp = getValProperty(resource, valType, _configNumber.get());
    if (vp != null) {
      BitSet bs = vp.getConfigSet();
      for (Validator val : getValidators(project)) {
        if (!monitor.isCanceled()) {
          if (!bs.get(_idManager.getIndex(val.getId()))) continue;
          if (operation.isSuspended(val, project)) continue;
          Validator.V2 v2 = val.asV2Validator();
          if (v2 != null) {
            notifyGroupListenersStarting(
                resource, operation.getState(), monitor, groupListeners, v2);
          }
          try {
            visitor.visit(val, project, valType, operation, monitor);
          } catch (Exception e) {
            ValidationPlugin.getPlugin().handleException(e);
          }
        }
      }
      notifyGroupFinishing(resource, operation.getState(), monitor, groupListeners);
      return;
    }

    vp = new ValProperty();
    vp.setConfigNumber(_configNumber.get());
    ContentTypeWrapper ctw = new ContentTypeWrapper();
    for (Validator val : getValidators(project)) {
      if (!monitor.isCanceled()) {
        if (!ValidatorProjectManager.get().shouldValidate(val, project, valType)) continue;
        if (Friend.shouldValidate(val, resource, valType, ctw)) {
          vp.getConfigSet().set(_idManager.getIndex(val.getId()));
          // we do the suspend check after figuring out if it needs to be validated, because we save
          // this information for the session.
          if (operation.isSuspended(val, project)) continue;
          Validator.V2 v2 = val.asV2Validator();
          if (v2 != null) {
            notifyGroupListenersStarting(
                resource, operation.getState(), monitor, groupListeners, v2);
          }
          try {
            visitor.visit(val, project, valType, operation, monitor);
          } catch (Exception e) {
            ValidationPlugin.getPlugin().handleException(e);
          }
        }
      }
    }
    notifyGroupFinishing(resource, operation.getState(), monitor, groupListeners);
    putValProperty(vp, resource, valType);
  }