public MetabolicParticipantImplementation parseParticipant(
      final String participant, final Compartment defaultCompartment, final PreparsedReaction rxn)
      throws UnparsableReactionError {

    String entityAbbr = participant.trim();
    String entityAbbrComp = entityAbbr;
    Compartment compartment = defaultCompartment;
    Double coef = 1d;

    // stoichiometric coefficients
    Matcher coefMatcher = COEFFICIENT_PATTERN.matcher(entityAbbr);
    if (coefMatcher.find()) {
      coef =
          Double.parseDouble(
              coefMatcher.group(1) == null ? coefMatcher.group(2) : coefMatcher.group(1));
      entityAbbr = coefMatcher.replaceAll("");
      entityAbbrComp = entityAbbr;
    }

    // compartment
    Matcher compartmentMatcher = COMPARTMENT_PATTERN.matcher(entityAbbr);
    if (compartmentMatcher.find()) {
      compartment = resolver.getCompartment(compartmentMatcher.group(1));
      entityAbbr = compartmentMatcher.replaceAll("");
    }

    // trim the abbreviation
    entityAbbr = entityAbbr.trim();

    // try fetching with compartment attached and without
    //        PreparsedMetabolite entity = entites.getEntity(entityAbbrComp.trim());
    Metabolite entity = entites.getReconciledMetabolite(entityAbbr);

    if (entity != null) {
      // System.out.println( coef + " " + entity.getName() + " " + compartment );
      return new MetabolicParticipantImplementation(entity, coef, (Compartment) compartment);
    } else {
      messages.add(
          new WarningMessage(
              "The metabolite "
                  + entityAbbr
                  + " was not found in the metabolite sheet for reaction "
                  + rxn));
      entity = entites.getNonReconciledMetabolite(entityAbbr);
      return new MetabolicParticipantImplementation(entity, coef, (Compartment) compartment);
    }

    // TODO:
    // ?ion match
    // ?remove _ext part
    // pmf associated?
    // match name with + and without + and then with number and without numbers
    // e.g.
    // YGH+FHD, 1) YGH+FHD 2) YGH, FHD
    // 35FGD+1400DH 1) 35FGD+1400DH 2) 35FGD 1400DH 3) FGD, DH
  }
 public Collection<Report> collectMessages() {
   Set collected = new HashSet();
   collected.addAll(messages);
   messages.clear();
   return collected;
 }