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.AtomType;
import uk.org.squirm3.model.type.def.BasicType;
public class SelfrepValidator implements AtomValidator {
private Atom chainStart;
private final AtomType[] chainTypes = {BasicType.A, BasicType.A,
BasicType.A, BasicType.A};
@Override
public void setup(final Collection<? extends Atom> atoms) {
final Collection<? extends Atom> potentialStarts = AtomSelector
.findAll(BasicType.E, 1, atoms);
for (final Atom atom : potentialStarts) {
if (atom.getBonds().size() == 1) {
chainStart = atom;
break;
}
}
Atom atom = chainStart;
for (int i = 0; i < 4; i++) {
atom = chainStart.getBonds().getFirst();
chainTypes[i] = atom.getType();
}
}
@Override
public String evaluate(final Collection<? extends Atom> atoms,
final LevelMessages messages) { // improved code from Ralph
// Hartley
final LinkedList<Atom> joined = new LinkedList<Atom>();
// there should be at least two bonded 'e' atoms in the world, each at
// the head of a copy
int n_found = 0;
int bound_atoms = 0;
for (final Atom first : atoms) { // include the original
if (first.getBonds().size() > 0) {
bound_atoms++;
if (first.getType() == BasicType.E) {
joined.clear();
first.getAllConnectedAtoms(joined);
if (joined.size() != 6) {
return messages.getError(1);
}
final Atom last = joined.getLast();
if (first.getBonds().size() != 1
|| last.getBonds().size() != 1
|| last.getType() != BasicType.F) {
return messages.getError(2);
}
for (int j = 1; j < joined.size() - 1; j++) {
final Atom a = joined.get(j);
if (a.getBonds().size() != 2) {
return messages.getError(3);
}
if (a.getType() != chainTypes[j - 1]) {
return messages.getError(4);
}
}
n_found++;
}
}
}
if (n_found == 0) {
return messages.getError(5);
}
if (n_found < 2) {
return messages.getError(6);
}
if (bound_atoms != 6 * n_found) {
return messages.getError(7);
}
return null;
}
}