@Override
  public Collection<ValidatorMessage> check(InteractionEvidence interaction)
      throws ValidatorException {

    if (interaction.isNegative()) {
      MiContext context = RuleUtils.buildContext(interaction, "interaction");

      return Collections.singletonList(
          new ValidatorMessage(
              "Negative interactions are currently outside of the remit of IMEx and "
                  + "should be removed from the record.",
              MessageLevel.WARN,
              context,
              this));
    }

    return Collections.EMPTY_LIST;
  }
  @Override
  public Collection<ValidatorMessage> check(Confidence confidence) throws ValidatorException {
    if (confidence != null) {
      // list of messages to return
      List<ValidatorMessage> messages = Collections.EMPTY_LIST;
      final OntologyAccess access = ontologyManager.getOntologyAccess("MI");

      CvTerm type = confidence.getType();

      if (type == null
          || PsiXmlUtils.UNSPECIFIED.equals(type.getShortName())
          || MitabUtils.UNKNOWN_TYPE.equals(type.getShortName())) {
        MiContext xrefContext = RuleUtils.buildContext(confidence, "confidence");
        messages = new ArrayList<ValidatorMessage>();
        messages.add(
            new ValidatorMessage(
                "Confidences must have a valid confidence type.'",
                MessageLevel.ERROR,
                xrefContext,
                this));
      } else if (type != null && type.getMIIdentifier() != null) {
        final OntologyTermI dbTerm = access.getTermForAccession(type.getMIIdentifier());

        if (dbTerm == null) {
          MiContext context = RuleUtils.buildContext(confidence, "confidence");
          if (messages.isEmpty()) {
            messages = new ArrayList<ValidatorMessage>();
          }
          messages.add(
              new ValidatorMessage(
                  "The confidence type MI identifier "
                      + type.getMIIdentifier()
                      + "  does not exist in the PSI-MI ontology. The valid MI terms for confidence types are available here: http://www.ebi.ac.uk/ontology-lookup/browse.do?ontName=MI&termId=MI%3A1064&termName=interaction%20confidence",
                  MessageLevel.ERROR,
                  context,
                  this));
        } else {
          Collection<OntologyTermI> parents = access.getAllParents(dbTerm);

          boolean foundParent = false;

          for (OntologyTermI p : parents) {
            if ("MI:1064".equals(p.getTermAccession())) {
              foundParent = true;
              break;
            }
          }

          if (!foundParent) {
            MiContext context = RuleUtils.buildContext(confidence, "confidence");
            if (messages.isEmpty()) {
              messages = new ArrayList<ValidatorMessage>();
            }
            messages.add(
                new ValidatorMessage(
                    "The MI identifier "
                        + type.getMIIdentifier()
                        + " is not a valid MI identifier for confidence types. The valid MI terms for confidence types are available here: http://www.ebi.ac.uk/ontology-lookup/browse.do?ontName=MI&termId=MI%3A1064&termName=interaction%20confidence",
                    MessageLevel.ERROR,
                    context,
                    this));
          }
        }
      }

      if (confidence.getValue() == null
          || confidence.getValue().trim().length() == 0
          || PsiXmlUtils.UNSPECIFIED.equals(confidence.getValue())
          || MitabUtils.UNKNOWN_ID.equals(confidence.getValue())) {
        MiContext xrefContext = RuleUtils.buildContext(confidence, "confidence");
        if (messages.isEmpty()) {
          messages = new ArrayList<ValidatorMessage>();
        }
        messages.add(
            new ValidatorMessage(
                "Confidences must have a valid and non empty confidence value.'",
                MessageLevel.ERROR,
                xrefContext,
                this));
      }

      return messages;
    }
    return Collections.EMPTY_LIST;
  }