package uk.org.squirm3.model.level.validators;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
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;
import com.google.common.collect.Lists;
public class MembraneDivisionValidator implements AtomValidator {
private Atom loopSeed;
private List<Atom> loop;
@Override
public void setup(final Collection<? extends Atom> atoms) {
loopSeed = AtomSelector.findUnique(BasicType.A, 3, atoms);
loop = Lists.newArrayList();
for (final Atom atom : atoms) {
if (atom.getType() == BasicType.A) {
loop.add(atom);
}
}
}
@Override
public String evaluate(final Collection<? extends Atom> atoms,
final LevelMessages messages) {
final int N = 12; // original loop size (see setup code, above)
// starting from atom 0 there should be a neat closed loop of a atoms
final LinkedList<Atom> loop0 = new LinkedList<Atom>();
final LinkedList<Atom> loop1 = new LinkedList<Atom>();
loopSeed.getAllConnectedAtoms(loop0);
if (loop0.size() >= N) {
return messages.getError(1);
}
// and there should be a second loop of 'a' atoms made of the same atoms
for (final Atom atom : loop) {
if (!loop0.contains(atom)) {
atom.getAllConnectedAtoms(loop1);
}
}
if (loop0.size() + loop1.size() != N) {
return messages.getError(2);
}
// each atom in each group should of type 'a' and have exactly two bonds
// (hence a neat loop)
for (int i = 0; i < loop0.size(); i++) {
final Atom a = loop0.get(i);
if (a.getType() != BasicType.A || a.getBonds().size() != 2) {
return messages.getError(3);
}
}
for (int i = 0; i < loop1.size(); i++) {
final Atom a = loop1.get(i);
if (a.getType() != BasicType.A || a.getBonds().size() != 2) {
return messages.getError(3);
}
}
return null;
}
}