Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package MCHelper; import java.io.*; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import org.jdom2.*; import org.jdom2.input.*; import org.jdom2.filter.*; import java.util.List; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; /** * S'occupe de construire un arbre en mmoire partir d'un fichier XML * La structure est un peu particulire : dans un arbre normal, on a une racine, qui connait * ses propres enfants, et les enfants connaissent leur propres enfants galement, etc. * L'arbre en lui-mme ne connait pas ses noeuds et feuilles. * Ici, l'arbre construit connait en plus de sa racine tous ses noeuds et feuilles. * Les liens de "parent" restent grs au niveau des noeuds cependant. * Ceci permet de rcuprer une feuille en accs alatoire, pas besoin de parcours ou quoi que ce soit. * @author Franois */ public abstract class ToTree { private static Document doc; private static Element root; private static List<Element> recipes; private static List<Element> resources; private static void open(URL document) { SAXBuilder sxb = new SAXBuilder(); try { doc = sxb.build(document); root = doc.getRootElement(); } catch (Exception e) { System.out.println("Erreur : " + e); } } //Rcupre tous les produits des recettes du fichier XML, //ainsi que toutes les ressources dcrites dans celui-ci. //(les liste des recettes, de ressources, et des noeuds sont //stockes dans des variables de classe pour future rutilisation) private static void buildLeaves(Tree t) { recipes = root.getChildren("Recipe"); //Rcuprer les recettes Iterator i = recipes.iterator(); //Itrer sur la liste while (i.hasNext()) { Element cur = (Element) i.next(); //On rcupre une des recettes, Element prod = (Element) cur.getChild("Outcome");//le noeud du produit String name = prod.getText(); //son nom Attribute curQtAttr = prod.getAttribute("qt"); //la quantit cre int curQt = 1; try { curQt = curQtAttr.getIntValue(); //en tant que int } catch (Exception ex) { System.out.println("Erreur :" + ex); } t.addLeave(name, curQt); //On cr un noeud son nom et on le stocke } resources = root.getChildren("Resource"); //On rcupre maintenant les ressources i = resources.iterator(); //Et on itre dessus while (i.hasNext()) { Element cur = (Element) i.next(); //Pour chacune des ressources, String name = cur.getText(); //On rcupre son nom t.addLeave(name, true); //Et on lui fait un noeud (en indiquant que c'est une ressource) qu'on stocke } //A la fin de ces boucles, tous les objets du jeu ont d tre recenss : //Tous peuvent soit tre trouvs naturellement, ou bien fabriqus. } //Cr les liens entres toutes les feuilles et se charge de leur pondration private static void buildTree(Tree t) { Iterator i = recipes.iterator(); while (i.hasNext()) { try { Element curRec = (Element) i.next(); //On rcupre le noeud XML de la recette pioche en bois, Element out = curRec.getChild("Outcome"); //le noeud XML du produit pioche en bois, String recName = out.getText(); //le nom du produit pioche en bois, List<Element> ingredients = curRec.getChildren("Ingredient"); //On fait une liste des ingrdients Iterator j = ingredients.iterator(); //et on itre dessus //Pour chacun des ingrdients, on veut ajouter le noeud correspondant son nom //dans les enfants de curRec (un ingrdient est un enfant du produit d'une recette). while (j.hasNext()) { Element curIng = (Element) j.next(); //On rcupre le noeud XML de l'ingrdient bton, String ingName = curIng.getText(); //le nom de l'ingrdient bton, Attribute qtAttr = curIng.getAttribute("qt"); //et la quantit (attribut) de bton ncessaires pour fabriquer la pioche en bois int qt = qtAttr.getIntValue(); //on convertit en int t.addChildToLeave(recName, ingName, qt); //On lie les feuilles } } catch (Exception e) { System.out.println("Erreur: " + e); } } //System.out.println(leaves); } public static Tree prepareTree(URL uri, Tree t) { open(uri); //On ouvre le fichier XML et on rcupre sa racine buildLeaves(t); //On cr toutes les feuilles buildTree(t); //On lie les feuilles entre elles for (Entry<String, Node> e : t.getLeavesMap().entrySet()) { if (!e.getValue().hasParent()) //Si la feuille considre n'a pas de parent => n'intervient dans aucune recette { t.root().addChild(e.getKey(), 0); //On ajoute une feuille sous la "racine virtuelle" de l'arbre } } return t; } }