package vooga.towerdefense.gameeditor.gameloader.xmlloaders; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.w3c.dom.Element; import util.XMLTool; import vooga.towerdefense.factories.rulefactories.RuleFactory; import vooga.towerdefense.model.GameModel; import vooga.towerdefense.model.rules.Rule; /** * This class is responsible for loading Rule objects * from an XML document. * * @author Erick Gonzalez */ public class RulesXMLLoader { private XMLTool myXMLTool; /** * * @param xmlTool an XMLTool containing the xml document */ public RulesXMLLoader (XMLTool xmlTool) { myXMLTool = xmlTool; } /** * * @param gameModel a game model * @param rulesElement the rules xml element * @return the list of rules */ public List<Rule> getRules(GameModel gameModel, Element rulesElement) { List<RuleFactory> ruleFactories = getRuleFactories(rulesElement); List<Rule> rules = new ArrayList<Rule>(); for (RuleFactory rf : ruleFactories) { rules.add(rf.create(gameModel)); } return rules; } /** * Given a rules xml element, return a list of rule factory objects. * * @param rulesElement * @return a list of RuleFactory objects */ public List<RuleFactory> getRuleFactories(Element rulesElement) { Map<String, Element> subElements = myXMLTool.getChildrenElementMap(rulesElement); List<RuleFactory> ruleFactories = new ArrayList<RuleFactory>(); for (Element ruleElement : subElements.values()) { ruleFactories.add(getRuleFactory(ruleElement)); } return ruleFactories; } @SuppressWarnings("rawtypes") private RuleFactory getRuleFactory (Element ruleNameElement) { List<String> constructorParams = getRuleFactoryConstructorParameters(ruleNameElement); try { Class ruleFactoryClass = Class.forName("vooga.towerdefense.factories.rulefactories." + myXMLTool.getTagName(ruleNameElement)+ "Factory"); // There only exists one rule constructor Constructor c = ruleFactoryClass.getConstructors()[0]; RuleFactory ruleFactory = (RuleFactory) c.newInstance(constructorParams.toArray()); return ruleFactory; } catch (InstantiationException e) { return null; } catch (IllegalAccessException e) { return null; } catch (IllegalArgumentException e) { return null; } catch (InvocationTargetException e) { return null; } catch (ClassNotFoundException e) { return null; } } private List<String> getRuleFactoryConstructorParameters (Element ruleNameElement) { List<Element> subElements = myXMLTool.getChildrenList(ruleNameElement); List<String> ruleFactoryConstructorParameters = new ArrayList<String>(); for (Element subElement : subElements) { ruleFactoryConstructorParameters.add(getRuleFactoryConstructorParameter(subElement)); } return ruleFactoryConstructorParameters; } private String getRuleFactoryConstructorParameter (Element ruleParameterElement) { return myXMLTool.getContent(ruleParameterElement); } }