package uk.org.squirm3.model.level.validators; import java.util.Collection; import java.util.LinkedList; import uk.org.squirm3.model.Atom; import uk.org.squirm3.model.level.AtomSelector; import uk.org.squirm3.model.level.AtomValidator; import uk.org.squirm3.model.level.LevelMessages; import uk.org.squirm3.model.type.def.BasicType; public class LineCsValidator implements AtomValidator { private Atom seed; @Override public void setup(final Collection<? extends Atom> atoms) { seed = AtomSelector.findUnique(BasicType.C, 1, atoms); } @Override public String evaluate(final Collection<? extends Atom> atoms, final LevelMessages messages) { int single_bonded_atoms_found = 0, double_bonded_atoms_found = 0; // get the set of atoms joined to atom[0] final LinkedList<Atom> joined = new LinkedList<Atom>(); seed.getAllConnectedAtoms(joined); // fail on bonds<1 or >2, or not in 'joined' list for (final Atom atom2 : atoms) { final Atom atom = atom2; if (atom.getType() != BasicType.C) { if (atom.getBonds().size() != 0) { return messages.getError(1); } continue; // no other tests for non-'c' atoms } if (atom.getBonds().size() == 1) { single_bonded_atoms_found++; } else if (atom.getBonds().size() == 2) { double_bonded_atoms_found++; } else if (atom.getBonds().size() == 0) { return messages.getError(2); } else { return messages.getError(3); } if (!joined.contains(atom)) { return messages.getError(4); } } // one final check on chain configuration if (single_bonded_atoms_found != 2) { return messages.getError(5); } return null; } }