package games.strategy.triplea.delegate.dataObjects; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import games.strategy.engine.data.Unit; public class MoveValidationResult implements Serializable, Comparable<MoveValidationResult> { private static final long serialVersionUID = 6648363112533514955L; private String m_error = null; private final List<String> m_disallowedUnitWarnings; private final List<Collection<Unit>> m_disallowedUnitsList; private final List<String> m_unresolvedUnitWarnings; private final List<Collection<Unit>> m_unresolvedUnitsList; public MoveValidationResult() { m_disallowedUnitWarnings = new ArrayList<>(); m_disallowedUnitsList = new ArrayList<>(); m_unresolvedUnitWarnings = new ArrayList<>(); m_unresolvedUnitsList = new ArrayList<>(); } public MoveValidationResult(final MoveValidationResult toCopy) { this(); for (final String warning : toCopy.getDisallowedUnitWarnings()) { for (final Unit unit : toCopy.getDisallowedUnits(warning)) { addDisallowedUnit(warning, unit); } } for (final String warning : toCopy.getUnresolvedUnitWarnings()) { for (final Unit unit : toCopy.getUnresolvedUnits(warning)) { addUnresolvedUnit(warning, unit); } } setError(toCopy.getError()); } public void addDisallowedUnit(final String warning, final Unit unit) { int index = m_disallowedUnitWarnings.indexOf(warning); if (index == -1) { index = m_disallowedUnitWarnings.size(); m_disallowedUnitWarnings.add(warning); m_disallowedUnitsList.add(new ArrayList<>()); } final Collection<Unit> disallowedUnits = m_disallowedUnitsList.get(index); disallowedUnits.add(unit); } public void addUnresolvedUnit(final String warning, final Unit unit) { int index = m_unresolvedUnitWarnings.indexOf(warning); if (index == -1) { index = m_unresolvedUnitWarnings.size(); m_unresolvedUnitWarnings.add(warning); m_unresolvedUnitsList.add(new ArrayList<>()); } final Collection<Unit> unresolvedUnits = m_unresolvedUnitsList.get(index); unresolvedUnits.add(unit); } public boolean removeUnresolvedUnit(final String warning, final Unit unit) { final int index = m_unresolvedUnitWarnings.indexOf(warning); if (index == -1) { return false; } final Collection<Unit> unresolvedUnits = m_unresolvedUnitsList.get(index); if (!unresolvedUnits.remove(unit)) { return false; } if (unresolvedUnits.isEmpty()) { m_unresolvedUnitsList.remove(unresolvedUnits); m_unresolvedUnitWarnings.remove(warning); } return true; } public void setError(final String error) { m_error = error; } public MoveValidationResult setErrorReturnResult(final String error) { m_error = error; return this; } public String getError() { return m_error; } public Collection<Unit> getDisallowedUnits() { final Set<Unit> allDisallowedUnits = new LinkedHashSet<>(); for (final Collection<Unit> unitList : m_disallowedUnitsList) { for (final Unit unit : unitList) { allDisallowedUnits.add(unit); } } return allDisallowedUnits; } public Collection<Unit> getUnresolvedUnits() { final Set<Unit> allUnresolvedUnits = new LinkedHashSet<>(); for (final Collection<Unit> unitList : m_unresolvedUnitsList) { for (final Unit unit : unitList) { allUnresolvedUnits.add(unit); } } return allUnresolvedUnits; } public Collection<Unit> getDisallowedUnits(final String warning) { final int index = m_disallowedUnitWarnings.indexOf(warning); if (index == -1) { return Collections.emptyList(); } return new ArrayList<>(m_disallowedUnitsList.get(index)); } public Collection<Unit> getUnresolvedUnits(final String warning) { final int index = m_unresolvedUnitWarnings.indexOf(warning); if (index == -1) { return Collections.emptyList(); } return new ArrayList<>(m_unresolvedUnitsList.get(index)); } public Collection<String> getDisallowedUnitWarnings() { return new ArrayList<>(m_disallowedUnitWarnings); } public Collection<String> getUnresolvedUnitWarnings() { return new ArrayList<>(m_unresolvedUnitWarnings); } public String getDisallowedUnitWarning(final int index) { if (index < 0 || index >= m_disallowedUnitWarnings.size()) { return null; } return m_disallowedUnitWarnings.get(index); } public String getUnresolvedUnitWarning(final int index) { if (index < 0 || index >= m_unresolvedUnitWarnings.size()) { return null; } return m_unresolvedUnitWarnings.get(index); } public boolean hasError() { return m_error != null; } public boolean hasDisallowedUnits() { return m_disallowedUnitWarnings.size() > 0; } public int getDisallowedUnitCount() { return m_disallowedUnitWarnings.size(); } public boolean hasUnresolvedUnits() { return m_unresolvedUnitWarnings.size() > 0; } public int getUnresolvedUnitCount() { return m_unresolvedUnitWarnings.size(); } public boolean isMoveValid() { return !hasError() && !hasDisallowedUnits() && !hasUnresolvedUnits(); } public int getTotalWarningCount() { return m_unresolvedUnitWarnings.size() + m_disallowedUnitWarnings.size(); } @Override public int compareTo(final MoveValidationResult other) { if (!hasError() && other.hasError()) { return -1; } if (hasError() && !other.hasError()) { return 1; } if (getDisallowedUnitCount() < other.getDisallowedUnitCount()) { return -1; } if (getDisallowedUnitCount() > other.getDisallowedUnitCount()) { return 1; } if (getUnresolvedUnitCount() < other.getUnresolvedUnitCount()) { return -1; } if (getUnresolvedUnitCount() > other.getUnresolvedUnitCount()) { return 1; } return 0; } @Override public String toString() { return "Move Validation Results, error:" + m_error + " isValid():" + isMoveValid(); } }