package com.lateensoft.pathfinder.toolkit.serialize; import com.lateensoft.pathfinder.toolkit.model.character.items.Armor; import com.lateensoft.pathfinder.toolkit.model.character.items.Size; import org.dom4j.Element; import java.io.InvalidObjectException; /** * @author trevsiemens */ public class ArmorXMLAdapter extends XMLObjectAdapter<Armor> { public static final String ELEMENT_NAME = "armor"; public static final String ATTR_WORN = "worn"; public static final String ATTR_AC_BONUS = "ac"; public static final String ATTR_ARMOR_CHECK_PENALTY = "armor-check-penalty"; public static final String ATTR_MAX_DEX = "max-dex"; public static final String ATTR_SPELL_FAIL = "spell-failure"; public static final String ATTR_SPEED = "speed"; public static final String ELMT_SPEC_PROPS = "special-properties"; public static final String ATTR_SIZE = "size"; private final ItemXMLAdapter m_itemXMLAdapter = new ItemXMLAdapter(); @Override public String getElementName() { return ELEMENT_NAME; } @Override protected Armor createObjectForElement(Element element) throws InvalidObjectException { Armor armor = new Armor(); setObjectContentForElement(armor, element); return armor; } void setObjectContentForElement(Armor armor, Element element) throws InvalidObjectException { m_itemXMLAdapter.setObjectContentForElement(armor, element); armor.setWorn(getBooleanAttribute(element, ATTR_WORN)); armor.setACBonus(getBoundedIntAttribute(element, ATTR_AC_BONUS, -20, 20)); armor.setArmorCheckPenalty(getBoundedIntAttribute(element, ATTR_ARMOR_CHECK_PENALTY, -20, 0)); armor.setMaxDex(getBoundedIntAttribute(element, ATTR_MAX_DEX, 0, 40)); armor.setSpellFail(getBoundedIntAttribute(element, ATTR_SPELL_FAIL, 0, 95)); armor.setSpeed(getBoundedIntAttribute(element, ATTR_SPEED, 0, 120)); armor.setSpecialProperties(getSubElementText(element, ELMT_SPEC_PROPS)); String sizeString = getStringAttribute(element, ATTR_SIZE); try { Size size = Size.forKey(sizeString); armor.setSize(size); } catch (Exception e) { throw new InvalidObjectException("Armor attribute 'size' invalid. Must be 'S', 'M', or 'L'."); } } @Override protected void setElementContentForObject(Element element, Armor armor) { m_itemXMLAdapter.setElementContentForObject(element, armor); element.addAttribute(ATTR_WORN, Boolean.toString(armor.isWorn())); element.addAttribute(ATTR_AC_BONUS, Integer.toString(armor.getACBonus())); element.addAttribute(ATTR_ARMOR_CHECK_PENALTY, Integer.toString(armor.getArmorCheckPenalty())); element.addAttribute(ATTR_MAX_DEX, Integer.toString(armor.getMaxDex())); element.addAttribute(ATTR_SPELL_FAIL, Integer.toString(armor.getSpellFail())); element.addAttribute(ATTR_SPEED, Integer.toString(armor.getSpeed())); element.addAttribute(ATTR_SIZE, armor.getSize().getKey()); addSubElementText(element, ELMT_SPEC_PROPS, armor.getSpecialProperties()); } }