package com.lateensoft.pathfinder.toolkit.serialize; import com.google.common.collect.ImmutableBiMap; import com.lateensoft.pathfinder.toolkit.model.character.stats.AbilityType; import com.lateensoft.pathfinder.toolkit.model.character.stats.Skill; import com.lateensoft.pathfinder.toolkit.model.character.stats.SkillType; import org.dom4j.Element; import java.io.InvalidObjectException; /** * @author tsiemens */ public class SkillXMLAdapter extends XMLObjectAdapter<Skill> { public static final String ELEMENT_NAME = "skill"; private static final String SKILL_KEY_ATTR = "skill-key"; private static final String CLASS_SKILL_ATTR = "class-skill"; private static final String RANK_ATTR = "rank"; private static final String ABILITY_ATTR = "ability"; private static final String MISC_MOD_ATTR = "misc"; private static final String SUB_TYPE_ELMT = "sub-type"; public static final ImmutableBiMap<SkillType, String> SKILL_TYPE_STRINGS = buildSkillKeyStrings(); @Override public String getElementName() { return ELEMENT_NAME; } @Override protected Skill createObjectForElement(Element element) throws InvalidObjectException { String skillKeyString = getStringAttribute(element, SKILL_KEY_ATTR); ImmutableBiMap<String, SkillType> skillKeyStrings = SKILL_TYPE_STRINGS.inverse(); SkillType skillType = skillKeyStrings.get(skillKeyString); if (skillType == null) { throw new InvalidObjectException("Invalid skill: " + skillKeyString); } String abilityKeyString = getStringAttribute(element, ABILITY_ATTR); ImmutableBiMap<String, AbilityType> abilityKeyStrings = AbilityXMLAdapter.ABILITY_TYPE_STRINGS.inverse(); AbilityType abilityType = abilityKeyStrings.get(abilityKeyString); if (abilityType == null) { throw new InvalidObjectException("Invalid ability \"" + abilityKeyString + "\" for skill: " + skillKeyString); } Skill skill = new Skill(skillType, abilityType); skill.setClassSkill(getBooleanAttribute(element, CLASS_SKILL_ATTR)); skill.setRank(getBoundedIntAttribute(element, RANK_ATTR, -10, 40)); skill.setMiscMod(getBoundedIntAttribute(element, MISC_MOD_ATTR, -10, 40)); if (skillType.canBeSubTyped() && element.element(SUB_TYPE_ELMT) != null) { skill.setSubType(getSubElementText(element, SUB_TYPE_ELMT)); } return skill; } @Override protected void setElementContentForObject(Element element, Skill skill) { element.addAttribute(SKILL_KEY_ATTR, SKILL_TYPE_STRINGS.get(skill.getType())); element.addAttribute(ABILITY_ATTR, AbilityXMLAdapter.ABILITY_TYPE_STRINGS.get(skill.getAbility())); element.addAttribute(CLASS_SKILL_ATTR, Boolean.toString(skill.isClassSkill())); element.addAttribute(RANK_ATTR, Integer.toString(skill.getRank())); element.addAttribute(MISC_MOD_ATTR, Integer.toString(skill.getMiscMod())); if (skill.canBeSubTyped() && skill.getSubType() != null) { addSubElementText(element, SUB_TYPE_ELMT, skill.getSubType()); } } private static ImmutableBiMap<SkillType, String> buildSkillKeyStrings() { ImmutableBiMap.Builder<SkillType, String> builder = ImmutableBiMap.builder(); builder.put(SkillType.ACROBATICS, "Acrobatics"); builder.put(SkillType.APPRAISE, "Appraise"); builder.put(SkillType.BLUFF, "Bluff"); builder.put(SkillType.CLIMB, "Climb"); builder.put(SkillType.CRAFT, "Craft"); builder.put(SkillType.DIPLOMACY, "Diplomacy"); builder.put(SkillType.DISABLE_DEV, "DisableDevice"); builder.put(SkillType.DISGUISE, "Disguise"); builder.put(SkillType.ESCAPE, "EscapeArtist"); builder.put(SkillType.FLY, "Fly"); builder.put(SkillType.HANDLE_ANIMAL, "Handle Animal"); builder.put(SkillType.HEAL, "Heal"); builder.put(SkillType.INTIMIDATE, "Intimidate"); builder.put(SkillType.KNOW_ARCANA, "KnowledgeArcana"); builder.put(SkillType.KNOW_DUNGEON, "KnowledgeDungeoneering"); builder.put(SkillType.KNOW_ENG, "KnowledgeEngineering"); builder.put(SkillType.KNOW_GEO, "KnowledgeGeography"); builder.put(SkillType.KNOW_HIST, "KnowledgeHistory"); builder.put(SkillType.KNOW_LOCAL, "KnowledgeLocal"); builder.put(SkillType.KNOW_NATURE, "KnowledgeNature"); builder.put(SkillType.KNOW_NOBILITY, "KnowledgeNobility"); builder.put(SkillType.KNOW_PLANES, "KnowledgePlanes"); builder.put(SkillType.KNOW_RELIGION, "KnowledgeReligion"); builder.put(SkillType.LINGUISTICS, "Linguistics"); builder.put(SkillType.PERCEPTION, "Perception"); builder.put(SkillType.PERFORM, "Perform"); builder.put(SkillType.PROFESSION, "Profession"); builder.put(SkillType.RIDE, "Ride"); builder.put(SkillType.SENSE_MOTIVE, "SenseMotive"); builder.put(SkillType.SLEIGHT_OF_HAND, "SleightOfHand"); builder.put(SkillType.SPELLCRAFT, "Spellcraft"); builder.put(SkillType.STEALTH, "Stealth"); builder.put(SkillType.SURVIVAL, "Survival"); builder.put(SkillType.SWIM, "Swim"); builder.put(SkillType.USE_MAGIC_DEVICE, "UseMagicDevice"); return builder.build(); } }