private void readAbilities(String path, DataModel dataModel) {
		try {
			DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
			Document doc = docBuilder.parse(new File(path));

			// normalize text representation
			doc.getDocumentElement().normalize();

			NodeList listOfStats = doc.getElementsByTagName("ability");
			for (int s = 0; s < listOfStats.getLength(); s++) {

				Node statNode = listOfStats.item(s);
				if (statNode.getNodeType() == Node.ELEMENT_NODE) {

					Element abilityElement = (Element) statNode;

					String className = getTagValue("class", abilityElement);

					Ability ability = null;
					String tagValue = getTagValue("tag", abilityElement);
					if (className == null) {
						ability = new Ability(tagValue, LanguageTools.translate(getTagValue("name", abilityElement)));
					} else {
						String classPath = "dss.abilities." + className;
						@SuppressWarnings("unchecked")
						Class<Ability> abilityClass = (Class<Ability>) Class.forName(classPath);
						Constructor<Ability> constructor = abilityClass.getConstructor(String.class, String.class);
						ability = constructor.newInstance(tagValue,
								LanguageTools.translate(getTagValue("name", abilityElement)));
					}

					ability.setIconName(getTagValue("icon", abilityElement));

					ability.setCooldown((int) (1000 * Double.parseDouble(getTagValue("cooldown", abilityElement))));

					ability.setCasttime(Integer.parseInt(getTagValue("cast", abilityElement)));

					ability.setCost(Integer.parseInt(getTagValue("cost", abilityElement)));

					dataModel.getAvailableAbilities().add(tagValue, ability);
				}
			}

		} catch (SAXParseException err) {
			System.out.println("** Parsing error" + ", line " + err.getLineNumber() + ", uri " + err.getSystemId());
			System.out.println(" " + err.getMessage());

		} catch (SAXException e) {
			Exception x = e.getException();
			((x == null) ? e : x).printStackTrace();

		} catch (Throwable t) {
			t.printStackTrace();
		}

	}