package com.lateensoft.pathfinder.toolkit.serialize; import com.google.common.collect.ImmutableBiMap; import com.lateensoft.pathfinder.toolkit.model.character.stats.Ability; import com.lateensoft.pathfinder.toolkit.model.character.stats.AbilityType; import org.dom4j.Element; import java.io.InvalidObjectException; /** * @author tsiemens */ public class AbilityXMLAdapter extends XMLObjectAdapter<Ability> { public static final String ELEMENT_NAME = "ability"; private static final String ABILITY_ATTR = "ability-key"; private static final String SCORE_ATTR = "score"; private static final String TEMP_BONUS_ATTR = "temp-bonus"; public static final ImmutableBiMap<AbilityType, String> ABILITY_TYPE_STRINGS = buildAbilityKeyStrings(); @Override public String getElementName() { return ELEMENT_NAME; } @Override protected Ability createObjectForElement(Element element) throws InvalidObjectException { String abilityKeyString = getStringAttribute(element, ABILITY_ATTR); ImmutableBiMap<String, AbilityType> abilityKeyStrings = ABILITY_TYPE_STRINGS.inverse(); AbilityType abilityKey = abilityKeyStrings.get(abilityKeyString); if (abilityKey == null) { throw new InvalidObjectException("Invalid ability: " + abilityKeyString); } Ability ability = new Ability(abilityKey); ability.setScore(getBoundedIntAttribute(element, SCORE_ATTR, 0, 40)); ability.setTempBonus(getBoundedIntAttribute(element, TEMP_BONUS_ATTR, -20, 20)); return ability; } @Override protected void setElementContentForObject(Element element, Ability ability) { element.addAttribute(ABILITY_ATTR, ABILITY_TYPE_STRINGS.get(ability.getType())); element.addAttribute(SCORE_ATTR, Integer.toString(ability.getScore())); element.addAttribute(TEMP_BONUS_ATTR, Integer.toString(ability.getTempBonus())); } private static ImmutableBiMap<AbilityType, String> buildAbilityKeyStrings() { ImmutableBiMap.Builder<AbilityType, String> builder = ImmutableBiMap.builder(); builder.put(AbilityType.STR, "STR"); builder.put(AbilityType.DEX, "DEX"); builder.put(AbilityType.CON, "CON"); builder.put(AbilityType.INT, "INT"); builder.put(AbilityType.WIS, "WIS"); builder.put(AbilityType.CHA, "CHA"); return builder.build(); } }