package regexgolf2.model; import java.util.ArrayList; import java.util.Collections; import java.util.EventObject; import java.util.HashSet; import java.util.List; import java.util.Set; import com.google.java.contract.Ensures; import com.google.java.contract.Requires; public class Challenge extends ObservableObject { private final Set<Requirement> _requirements = new HashSet<>(); private Solution _sampleSolution; private String _name = ""; private int _id; private ObjectChangedListener _requirementListener; public Challenge() { _sampleSolution = new Solution(); initRequirementListener(); initSampleSolutionListener(); } private void initRequirementListener() { _requirementListener = new ObjectChangedListener() { @Override public void objectChanged(EventObject event) { Object source = event.getSource(); if (!_requirements.contains(source)) throw new IllegalStateException( "The eventsource is not a Requirement that is owned " + "by this challenge, this listener should not be called!"); fireObjectChangedEvent(); } }; } private void initSampleSolutionListener() { _sampleSolution.addObjectChangedListener(new ObjectChangedListener() { @Override public void objectChanged(EventObject event) { fireObjectChangedEvent(); } }); } public int getId() { return _id; } public void setId(int id) { _id = id; } @Ensures("result != null") public String getName() { return _name; } @Requires("name != null") public void setName(String name) { if (_name.equals(name)) return; _name = name; fireObjectChangedEvent(); } @Ensures("result != null") public Solution getSampleSolution() { return _sampleSolution; } @Requires("requirement != null") public void addRequirement(Requirement requirement) { boolean elementWasAdded = _requirements.add(requirement); if (!elementWasAdded) return; requirement.addObjectChangedListener(_requirementListener); fireObjectChangedEvent(); } @Requires("requirement != null") public void removeRequirement(Requirement requirement) { boolean wasRemoved = _requirements.remove(requirement); if (wasRemoved) { requirement.removeObjectChangedListener(_requirementListener); fireObjectChangedEvent(); } } /** * Returns an unmodifiable View of the internal Set */ @Ensures("result != null") public Set<Requirement> getRequirements() { return Collections.unmodifiableSet(_requirements); } /** * Helper method to get filtered requirements * @param expectedMatchresult The value that should be filtered with */ @Ensures("result != null") public List<Requirement> getRequirements(boolean expectedMatchResult) { List<Requirement> requirements = new ArrayList<>(); for (Requirement r : getRequirements()) { if (r.getExpectedMatchResult() == expectedMatchResult) { requirements.add(r); } } return requirements; } public int getAmountRequirements() { return _requirements.size(); } }