diff options
Diffstat (limited to 'src/eu/equalparts')
3 files changed, 156 insertions, 84 deletions
diff --git a/src/eu/equalparts/cardbase/Cardbase.java b/src/eu/equalparts/cardbase/Cardbase.java index 2d92d64..fac4ace 100644 --- a/src/eu/equalparts/cardbase/Cardbase.java +++ b/src/eu/equalparts/cardbase/Cardbase.java @@ -2,11 +2,7 @@ package eu.equalparts.cardbase;  import java.io.File;  import java.io.IOException; -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; @@ -14,9 +10,7 @@ import com.fasterxml.jackson.core.JsonGenerationException;  import com.fasterxml.jackson.core.JsonParseException;  import com.fasterxml.jackson.databind.JsonMappingException; -import eu.equalparts.cardbase.cards.Card;  import eu.equalparts.cardbase.cardstorage.StandaloneCardContainer; -import eu.equalparts.cardbase.comparator.CardComparator;  import eu.equalparts.cardbase.utils.JSON;  /** @@ -24,18 +18,9 @@ import eu.equalparts.cardbase.utils.JSON;   *    * @author Eduardo Pedroni   */ -public class Cardbase implements StandaloneCardContainer { +public class Cardbase extends StandaloneCardContainer {  	/** -	 * A map with card hashes as entry keys (calculated used {@code Card.hashCode()}) and card amounts as entry values. -	 */ -	@JsonProperty private Map<Integer, Integer> cardReferences = new HashMap<>(); -	/** -	 * A map with card hashes as entry keys (calculated used {@code Card.hashCode()}) -	 * and card objects as entry values. -	 */ -	@JsonProperty private Map<Integer, Card> cardData = new HashMap<>(); -	/**  	 * The decks which have been saved along with this collection of cards.  	 */  	@JsonProperty private Map<Integer, Object> decks; @@ -44,8 +29,6 @@ public class Cardbase implements StandaloneCardContainer {  	 * Creates a clean cardbase.  	 */  	public Cardbase() { -		cardReferences = new HashMap<>(); -		cardData = new HashMap<>();  		decks = new HashMap<>();  	} @@ -77,59 +60,4 @@ public class Cardbase implements StandaloneCardContainer {  	public void write(File outputFile) throws JsonGenerationException, JsonMappingException, IOException {  		JSON.mapper.writeValue(outputFile, this);  	} - -	@Override -	public int getCount(Card cardToCount) { -		int hashCode = cardToCount.hashCode(); -		return cardReferences.containsKey(hashCode) ? cardReferences.get(hashCode) : 0; -	} -	 -	@Override -	public void addCard(Card cardToAdd, int count) { -		int hashCode = cardToAdd.hashCode(); -		if (cardReferences.containsKey(hashCode)) { -			cardReferences.replace(hashCode, cardReferences.get(hashCode) + count); -		} else { -			cardReferences.put(hashCode, count); -		} -		cardData.putIfAbsent(hashCode, cardToAdd); -	} - -	@Override -	public int removeCard(Card cardToRemove, int count) { -		int hashCode = cardToRemove.hashCode(); -		int removed = 0; -		 -		if (cardReferences.containsKey(hashCode) && count > 0) { -			int oldCount = cardReferences.get(hashCode); -			 -			if (oldCount > count) { -				cardReferences.replace(hashCode, oldCount - count); -				removed = count; -			} else { -				cardReferences.remove(hashCode); -				cardData.remove(cardToRemove.hashCode()); -				removed = oldCount; -			} -		} - -		return removed; -	} -	 -	@Override -	public Card getCard(String setCode, String number) { -		return cardData.get(Card.makeHash(setCode, number)); -	} -	 -	@Override -	public Collection<Card> getCards() { -		return Collections.unmodifiableCollection(cardData.values()); -	} -	 -	@Override -	public Collection<Card> sortByField(String fieldName) throws NoSuchFieldException { -		List<Card> sortedCards = new ArrayList<Card>(getCards()); -		sortedCards.sort(new CardComparator(Card.class.getDeclaredField(fieldName))); -		return Collections.unmodifiableCollection(sortedCards); -	}  } diff --git a/src/eu/equalparts/cardbase/cardstorage/ReferenceCardContainer.java b/src/eu/equalparts/cardbase/cardstorage/ReferenceCardContainer.java index 34ea4c6..f43b76b 100644 --- a/src/eu/equalparts/cardbase/cardstorage/ReferenceCardContainer.java +++ b/src/eu/equalparts/cardbase/cardstorage/ReferenceCardContainer.java @@ -1,33 +1,137 @@  package eu.equalparts.cardbase.cardstorage; +import java.util.HashMap; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonProperty; +  import eu.equalparts.cardbase.cards.Card;  /** - * TODO fix comments - * A class which holds card counts by reference (hash). + * A class which contains card quantities with absolutely no other + * information about the cards themselves.   *    * @author Eduardo Pedroni   *   */ -public interface ReferenceCardContainer { +public class ReferenceCardContainer { + +	/** +	 * Land field initialised to 0, accessed with getter and updated with setter. +	 */ +	private int plains = 0, islands = 0, swamps = 0, forests = 0, mountains = 0; +	/** +	 * A map with card hashes as entry keys (calculated used {@code Card.hashCode()}) +	 * and card amounts as entry values. +	 */ +	@JsonProperty private Map<Integer, Integer> cardReferences = new HashMap<>(); +  	/**  	 * Returns the amount of the specified card. If the card is not present at all, return 0.  	 *   	 * @param cardToCount a card whose count is to be returned.  	 * @return the count of the returned card in the container.  	 */ -	public int getCount(Card cardToCount); +	public int getCount(Card cardToCount){ +		int cardHash = cardToCount.hashCode(); +		return cardReferences.containsKey(cardHash) ? cardReferences.get(cardHash) : 0; +	}  	/**  	 * @param cardToAdd the card to add the container.  	 * @param count the amount to add.  	 */ -	public void addCard(Card cardToAdd, int count); +	public void addCard(Card cardToAdd, int count) { +		cardReferences.put(cardToAdd.hashCode(), getCount(cardToAdd) + count); +	}  	/**  	 * @param cardToRemove the card to remove from the container.  	 * @param count the amount to remove. -	 * @return the amount that was effectively removed. Could be less than {@code count} depending on how many of the card were present. +	 * @return the amount that was effectively removed. Could be less than {@code count} +	 * depending on how many of the card were present. +	 */ +	public int removeCard(Card cardToRemove, int count) { +		int cardHash = cardToRemove.hashCode(); +		if (count <= 0 || !cardReferences.containsKey(cardHash)) { +			return 0; +		} +		 +		if (count >= cardReferences.get(cardHash)) { +			return cardReferences.remove(cardHash); +		} else { +			cardReferences.put(cardHash, cardReferences.get(cardHash) - count); +			return count; +		} +	} + +	/** +	 * @return the plains +	 */ +	public int getPlains() { +		return plains; +	} + +	/** +	 * @return the islands +	 */ +	public int getIslands() { +		return islands; +	} + +	/** +	 * @return the swamps +	 */ +	public int getSwamps() { +		return swamps; +	} + +	/** +	 * @return the forests +	 */ +	public int getForests() { +		return forests; +	} + +	/** +	 * @return the mountains +	 */ +	public int getMountains() { +		return mountains; +	} + +	/** +	 * @param plains the plains to set +	 */ +	public void setPlains(int plains) { +		this.plains = plains; +	} + +	/** +	 * @param islands the islands to set +	 */ +	public void setIslands(int islands) { +		this.islands = islands; +	} + +	/** +	 * @param swamps the swamps to set +	 */ +	public void setSwamps(int swamps) { +		this.swamps = swamps; +	} + +	/** +	 * @param forests the forests to set +	 */ +	public void setForests(int forests) { +		this.forests = forests; +	} + +	/** +	 * @param mountains the mountains to set  	 */ -	public int removeCard(Card cardToRemove, int count); +	public void setMountains(int mountains) { +		this.mountains = mountains; +	}  } diff --git a/src/eu/equalparts/cardbase/cardstorage/StandaloneCardContainer.java b/src/eu/equalparts/cardbase/cardstorage/StandaloneCardContainer.java index aa2a3cf..1a4315d 100644 --- a/src/eu/equalparts/cardbase/cardstorage/StandaloneCardContainer.java +++ b/src/eu/equalparts/cardbase/cardstorage/StandaloneCardContainer.java @@ -1,8 +1,16 @@  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;  /**   * TODO fix comments @@ -11,7 +19,13 @@ import eu.equalparts.cardbase.cards.Card;   * @author Eduardo Pedroni   *   */ -public interface StandaloneCardContainer extends ReferenceCardContainer { +public class StandaloneCardContainer extends ReferenceCardContainer { +	/** +	 * A map with card hashes as entry keys (calculated used {@code Card.hashCode()}) +	 * and card objects as entry values. +	 */ +	@JsonProperty private Map<Integer, Card> cardData = new HashMap<>(); +  	/**  	 * Returns a card from the cardbase by set code and number.  	 * If no such card is in the cardbase, returns null. @@ -20,7 +34,10 @@ public interface StandaloneCardContainer extends ReferenceCardContainer {  	 * @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); +	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. @@ -29,12 +46,35 @@ public interface StandaloneCardContainer extends ReferenceCardContainer {  	 *   	 * @return an unmodifiable list of all the cards in the cardbase.  	 */ -	public Collection<Card> getCards(); +	public Collection<Card> 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<Card> sortByField(String fieldName) throws NoSuchFieldException; +	public Collection<Card> sortByField(String fieldName) throws NoSuchFieldException { +		List<Card> sortedCards = new ArrayList<Card>(getCards()); +		sortedCards.sort(new CardComparator(Card.class.getDeclaredField(fieldName))); +		return Collections.unmodifiableCollection(sortedCards); +	} +	@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; +	}  }  | 
