package ring.mobiles.backbone; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import ring.items.Item; import ring.mobiles.BodyPart; import ring.persistence.RingConstants; /** * This class represents the equipment a mobile is currently wearing. Because * BodyParts are immutable, this class is necessary so that mobiles can actually * wear things. * * @author projectmoon * */ @XmlAccessorType(XmlAccessType.PROPERTY) @XmlRootElement @XmlType( namespace = RingConstants.RING_NAMESPACE, propOrder= { "entries" }) public class Equipment implements Iterable<Item>, Serializable { public static final long serialVersionUID = 1; /** * Inner class for transforming this object into something JAXB * can understand. * @author projectmoon * */ @XmlAccessorType(XmlAccessType.PROPERTY) @XmlType public static class EquipmentTuple { private BodyPart part; private Item item; public EquipmentTuple() {} public EquipmentTuple(BodyPart part, Item item) { this.part = part; this.item = item; } @XmlElement public BodyPart getBodyPart() { return part; } public void setBodyPart(BodyPart part) { this.part = part; } @XmlElement public Item getItem() { return item; } public void setItem(Item item) { this.item = item; } } protected HashMap<BodyPart, Item> equipment = new HashMap<BodyPart, Item>(); public Equipment() {} @XmlElement(name = "entry") public List<EquipmentTuple> getEntries() { List<EquipmentTuple> entries = new ArrayList<EquipmentTuple>(equipment.keySet().size()); for (BodyPart part : equipment.keySet()) { EquipmentTuple tuple = new EquipmentTuple(part, equipment.get(part)); entries.add(tuple); } return entries; } public void setEntries(List<EquipmentTuple> entries) { for (EquipmentTuple tuple : entries) { equipment.put(tuple.getBodyPart(), tuple.getItem()); } } public Item getItem(BodyPart part) { return equipment.get(part); } public void putItem(BodyPart part, Item item) { item.setPartWornOn(part); equipment.put(part, item); } public Item removeItem(BodyPart part) { Item item = equipment.remove(part); if (item != null) { //item.setPartWornOn(null); return item; } else { return null; } } public Item getItemByName(String name) { if (name.length() < 2) return null; name = name.toLowerCase(); for (Item item : equipment.values()) { if (item.getName().toLowerCase().indexOf(name) != -1) return item; } //Nothing to return, so return null return null; } public boolean hasItem(BodyPart part) { return equipment.containsKey(part); } public int size() { return equipment.size(); } public Iterator<Item> iterator() { return new ItemIterator(this); } public Collection<Item> getItems() { return equipment.values(); } /* (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((equipment == null) ? 0 : equipment.hashCode()); return result; } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Equipment other = (Equipment) obj; if (equipment == null) { if (other.equipment != null) return false; } else if (!equipment.equals(other.equipment)) return false; return true; } }