Index: lutingenerator/src/java/org/codelutin/generator/models/ui/javaxml/JavaXMLParser.java diff -u lutingenerator/src/java/org/codelutin/generator/models/ui/javaxml/JavaXMLParser.java:1.3 lutingenerator/src/java/org/codelutin/generator/models/ui/javaxml/JavaXMLParser.java:1.4 --- lutingenerator/src/java/org/codelutin/generator/models/ui/javaxml/JavaXMLParser.java:1.3 Thu Aug 12 08:21:29 2004 +++ lutingenerator/src/java/org/codelutin/generator/models/ui/javaxml/JavaXMLParser.java Thu Aug 19 15:25:51 2004 @@ -23,9 +23,9 @@ * * @author Benjamin Poussin * Copyright Code Lutin -* @version $Revision: 1.3 $ +* @version $Revision: 1.4 $ * -* Mise a jour: $Date: 2004/08/12 08:21:29 $ +* Mise a jour: $Date: 2004/08/19 15:25:51 $ * par : $Author: mazelier $ */ @@ -52,6 +52,7 @@ */ public class JavaXMLParser { // JavaXMLParser protected Element rootElement; + protected UIModelImpl uimodel; /** * Parses a xml file and return a uimodel @@ -82,17 +83,17 @@ * @return UIModelImpl */ protected UIModelImpl parseModel(Element current){ - UIModelImpl result = new UIModelImpl(); + uimodel = new UIModelImpl(); String version = current.attributeValue("version"); - result.setVersion(version); + uimodel.setVersion(version); // selectionne l'unique object racine de l'arbre Element rootElement = (Element)current.selectSingleNode("/java/object"); - UIModelObject root = parseObject(rootElement); - result.setRoot(root); + UIModelObject root = parseObject(rootElement, null); + uimodel.setRoot(root); - return result; + return uimodel; } /** @@ -101,15 +102,19 @@ * @param current - element to parse * @return UIModelObjectImpl */ - protected UIModelObjectImpl parseObject(Element current){ + protected UIModelObjectImpl parseObject(Element current, UIModelObject parent){ UIModelObjectImpl result = new UIModelObjectImpl(); + result.setModel(uimodel); + result.setParent(parent); + uimodel.addObject(result); + String type = current.attributeValue("class"); result.setType(type); // parse la liste des attributs - UIModelArgumentsImpl arguments = parseArguments(current); + UIModelArgumentsImpl arguments = parseArguments(current, result); result.setArguments(arguments); // liste des enfants de l'objet (collection de UIModelChild) @@ -119,9 +124,9 @@ Element contentPaneElem = (Element)current.selectSingleNode("void[@property=\"contentPane\"]"); if (contentPaneElem!=null){ - children = parseChildren(contentPaneElem); + children = parseChildren(contentPaneElem, result); }else{ - children = parseChildren(current); + children = parseChildren(current, result); } result.setChildren(children); @@ -131,7 +136,7 @@ for(Iterator i = propertiesElement.iterator(); i.hasNext();){ Element propElement = (Element)i.next(); - UIModelProperty prop = parseProperty(propElement); + UIModelProperty prop = parseProperty(propElement, result); result.addProperty(prop); } @@ -157,7 +162,7 @@ * @param current - element to parse * @return UIModelArgumentsImpl */ - protected UIModelArgumentsImpl parseArguments(Element current){ + protected UIModelArgumentsImpl parseArguments(Element current, UIModelObject parent){ UIModelArgumentsImpl result = new UIModelArgumentsImpl(); @@ -175,7 +180,7 @@ for(Iterator i = listObjectElement.iterator(); i.hasNext();){ Element objectElement = (Element)i.next(); - UIModelObjectImpl value = parseObject(objectElement); + UIModelObjectImpl value = parseObject(objectElement, parent); result.addArgument(value); } @@ -188,7 +193,7 @@ * @param current - element to parse * @return UIModelPropertyImpl */ - protected UIModelPropertyImpl parseProperty(Element current){ + protected UIModelPropertyImpl parseProperty(Element current, UIModelObject parent){ // la propriete possede un nom definit par la valeur de l'attribut property UIModelPropertyImpl result = new UIModelPropertyImpl(); @@ -196,7 +201,7 @@ result.setName(name); // la propriete possede aussi une liste d'arguments - UIModelArgumentsImpl arguments = parseArguments(current); + UIModelArgumentsImpl arguments = parseArguments(current, parent); result.setArguments(arguments); return result; @@ -256,7 +261,7 @@ return result; } - protected ArrayList parseChildren(Element parent){ + protected ArrayList parseChildren(Element current, UIModelObject parent){ ArrayList result = new ArrayList(); //liste des enfants de l'objet @@ -264,7 +269,7 @@ // l'objet est identifie par un id //un enfant est un objet qui a ete ajoute par la methode add au container // sous l'objet courant, on cherche la methode add du tag void puis on recupere l'objet se trouvant sous ce tag. L'enfant est alors identifie par un id ou idref (si l'objet a deja ete defini) - List childrenElement = parent.selectNodes("void[@method=\"add\"]/object"); + List childrenElement = current.selectNodes("void[@method=\"add\"]/object"); for(Iterator i = childrenElement.iterator(); i.hasNext();){ Element childElem = (Element)i.next(); @@ -274,7 +279,7 @@ if(childElem.attributeValue("idref") != null){ childElem = (Element)rootElement.selectSingleNode("descendant::[@id=\""+id+"\"]"); } - UIModelObjectImpl child = parseObject(childElem); + UIModelObjectImpl child = parseObject(childElem, parent); id = childElem.attributeValue("id"); // selectionner la constraint @@ -282,17 +287,17 @@ // sous cet objet layout, se trouve la methode addLayoutComponent // avec object ajoute au container avec un idref qui doit etre identique a l'un des enfants vus precedemment (definis dans la methode add) (cet objet est toujours en premiere position // en deuxieme position se trouve la constrainte du premier object (string ou object) - Element constraintElem = (Element)parent.selectSingleNode("descendant::void[@property=\"layout\"]/object[(@class)]/void[@method=\"addLayoutComponent\"]/object[1][(@idref=\""+id+"\") or (@id=\""+id+"\")]/../*[2][(self::object) or (self::string)]"); + Element constraintElem = (Element)current.selectSingleNode("descendant::void[@property=\"layout\"]/object[(@class)]/void[@method=\"addLayoutComponent\"]/object[1][(@idref=\""+id+"\") or (@id=\""+id+"\")]/../*[2][(self::object) or (self::string)]"); // ATTENTION : dans l'expression XPath on trouve deux conditions car dans le cas des panels generes l'argument de la proptriete layout n'apparait pas, nous n'avons pas du determine l'origine de l'erreur if(constraintElem==null){ - constraintElem = (Element)parent.selectSingleNode("descendant::void[@property=\"layout\"]/void[@method=\"addLayoutComponent\"]/object[1][(@idref=\""+id+"\") or (@id=\""+id+"\")]/../*[2][(self::object) or (self::string)]"); + constraintElem = (Element)current.selectSingleNode("descendant::void[@property=\"layout\"]/void[@method=\"addLayoutComponent\"]/object[1][(@idref=\""+id+"\") or (@id=\""+id+"\")]/../*[2][(self::object) or (self::string)]"); } UIModelConstraintImpl constraint = null; if(constraintElem != null){ - constraint = parseConstraint(constraintElem); + constraint = parseConstraint(constraintElem, parent); } // uimodelChild est compose un child et d'une contrainte @@ -300,6 +305,8 @@ ch.setObject(child); ch.setConstraint(constraint); + child.setConstraint(constraint); + result.add(ch); } return result; @@ -312,13 +319,13 @@ * @param current - element to parse * @return UIModelConstraintImpl */ - protected UIModelConstraintImpl parseConstraint(Element current){ + protected UIModelConstraintImpl parseConstraint(Element current, UIModelObject parent){ UIModelConstraintImpl result = new UIModelConstraintImpl(); Object value = null; if (current.matches("self::object")){ // la valeur de la constrainte est un objet - value = parseObject(current); + value = parseObject(current, parent); }else if (current.matches("self::string")){ // la valeur de la constrainte est une string