package uk.org.squirm3.model.level.validators;
import java.util.Collection;
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 BreakMoleculeValidator implements AtomValidator {
private final Collection<Atom> extremities = Lists.newArrayList();
private final Collection<Atom> innerMolecule = Lists.newArrayList();
private final Collection<Atom> gate = Lists.newArrayList();
@Override
public void setup(final Collection<? extends Atom> atoms) {
setupMemory(AtomSelector.findAll(BasicType.A, 1, atoms));
setupMemory(AtomSelector.findAll(BasicType.D, 1, atoms));
}
private void setupMemory(final Collection<? extends Atom> atoms) {
for (final Atom atom : atoms) {
if (atom.getBonds().size() == 1) {
extremities.add(atom);
continue;
}
for (final Atom other : atom.getBonds()) {
if (other.getType() != atom.getType()) {
gate.add(atom);
continue;
}
}
innerMolecule.add(atom);
}
}
@Override
public String evaluate(final Collection<? extends Atom> atoms,
final LevelMessages messages) {
for (final Atom atom : extremities) {
if (atom.getBonds().size() != 1) {
return messages.getError(1);
}
}
for (final Atom atom : innerMolecule) {
if (atom.getBonds().size() != 2) {
return messages.getError(1);
}
}
for (final Atom atom : gate) {
if (atom.getBonds().size() != 1) {
return messages.getError(1);
}
}
return null;
}
}