package eu.equalparts.cardbase.cardstorage; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import com.fasterxml.jackson.annotation.JsonProperty; import eu.equalparts.cardbase.cards.Card; import eu.equalparts.cardbase.comparator.CardComparator; public abstract class StandaloneCardContainer extends ReferenceCardContainer { @JsonProperty private Map cardData; public StandaloneCardContainer() { super(); cardData = new HashMap<>(); } @Override public void addCard(Card cardToAdd, int count) { super.addCard(cardToAdd, count); cardData.putIfAbsent(cardToAdd.hashCode(), cardToAdd); } @Override public int removeCard(Card cardToRemove, int count) { int removed = super.removeCard(cardToRemove, count); if (getCount(cardToRemove) <= 0) { cardData.remove(cardToRemove.hashCode()); } return removed; } /** * Returns a card from the cardbase by set code and number. * If no such card is in the cardbase, returns null. * * @param setCode the set to which the requested card belongs. * @param number the requested card's set number. * @return the requested {@code Card} or null if no card is found. */ public Card getCard(String setCode, String number) { return cardData.get(Card.makeHash(setCode, number)); } /** * This method is intended to allow iteration directly on the list of cards, * while at the same time retaining control over the insert and remove procedures. * The returned {@code List} is a read-only; trying to modify its structure will * result in an {@code UnsupportedOperationException}. * * @return an unmodifiable list of all the cards in the cardbase. */ public Collection getCards() { return Collections.unmodifiableCollection(cardData.values()); } /** * @param fieldName the name of the field by which to sort. * @return an unmodifiable collection representing the cardbase sorted in the required order. * @throws NoSuchFieldException if the field provided is invalid. */ public Collection sortByField(String fieldName) throws NoSuchFieldException { List sortedCards = new ArrayList(getCards()); sortedCards.sort(new CardComparator(Card.class.getDeclaredField(fieldName))); return Collections.unmodifiableCollection(sortedCards); } }