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.1 lutingenerator/src/java/org/codelutin/generator/models/ui/javaxml/JavaXMLParser.java:1.2 --- lutingenerator/src/java/org/codelutin/generator/models/ui/javaxml/JavaXMLParser.java:1.1 Tue Aug 10 17:04:49 2004 +++ lutingenerator/src/java/org/codelutin/generator/models/ui/javaxml/JavaXMLParser.java Wed Aug 11 16:27:42 2004 @@ -23,9 +23,9 @@ * * @author Benjamin Poussin * Copyright Code Lutin -* @version $Revision: 1.1 $ +* @version $Revision: 1.2 $ * -* Mise a jour: $Date: 2004/08/10 17:04:49 $ +* Mise a jour: $Date: 2004/08/11 16:27:42 $ * par : $Author: mazelier $ */ @@ -61,9 +61,10 @@ public UIModelImpl parse(File file) throws DocumentException, MalformedURLException { return parse(file.toURI().toURL()); } + /** * Parses a xml file and return a uimodel - * @param file - xml file issue of XMLEncoder + * @param url - url of xml file issue of XMLEncoder * @return UIModelImpl */ public UIModelImpl parse(URL url) throws DocumentException, MalformedURLException { @@ -102,34 +103,35 @@ */ protected UIModelObjectImpl parseObject(Element current){ - System.out.println("current " + current); UIModelObjectImpl result = new UIModelObjectImpl(); String type = current.attributeValue("class"); result.setType(type); + // parse la liste des attributs UIModelArgumentsImpl arguments = parseArguments(current); result.setArguments(arguments); + // liste des enfants de l'objet (collection de UIModelChild) ArrayList children = parseChildren(current); result.setChildren(children); // liste des properties de l'objet courant, on est sur que le tag des properties est de la forme , ce tag est un enfant de l'objet courant List propertiesElement = current.selectNodes("void[@property]"); - System.out.println("SIZE OF PROPERTIES : " + propertiesElement.size()); + for(Iterator i = propertiesElement.iterator(); i.hasNext();){ Element propElement = (Element)i.next(); UIModelProperty prop = parseProperty(propElement); result.addProperty(prop); } - // liste des events de l'objet courant - // les evenements sont decrits par un tag - // addMethod sera utilisee pour decrire l'event - //sous ce tag un objet de type EventHandler avec sa methode create - // dessous on trouve l'ensemble des proprietes de l'event (source, action ...) + /* liste des events de l'objet courant + les evenements sont decrits par un tag + addMethod sera utilisee pour decrire l'event + sous ce tag un objet de type EventHandler avec sa methode create + dessous on trouve l'ensemble des proprietes de l'event (source, action ...)*/ List eventsElement = current.selectNodes("void/object[@class=\"java.beans.EventHandler\" and @method=\"create\"]"); - System.out.println("SIZE OF EVENTS : " + eventsElement.size()); + for(Iterator i = eventsElement.iterator(); i.hasNext();){ Element eventProp = (Element)i.next(); UIModelEvent event = parseEvent(eventProp); @@ -215,23 +217,31 @@ // recuperation de la valeur de addMethod dans le tag parent void de l'objet courant avec l'attribut method Element addMethodElement = (Element)current.selectSingleNode("parent::void[@method]"); - result.setAddMethod(addMethodElement.getText()); + result.setAddMethod(addMethodElement.attributeValue("method")); // la source est definie pour le tag class place juste en dessous de l'objet courant Element sourceElement = (Element)current.selectSingleNode("class"); - result.setSource(sourceElement.getText()); + if(sourceElement!=null){ + result.setSource(sourceElement.getText()); + } - // le handler sera toujours le deuxieme element string mais le troisieme element en tout - Element handlerElement = (Element)current.selectSingleNode("string[position()=2]"); - result.setHandler(handlerElement.getText()); + // le handler sera le troisieme element en tout + Element handlerElement = (Element)current.selectSingleNode("*[position()=3]"); + if(handlerElement!=null){ + result.setHandler(handlerElement.getText()); + } // on ne connait pas le type d'arguments (null ou string) d'ou * mais on sait que sa position sera toujours 4 ! Element argumentsElement = (Element)current.selectSingleNode("*[position()=4]"); - result.setArgument(argumentsElement.getText()); + if(argumentsElement!=null){ + result.setArgument(argumentsElement.getText()); + } // l'action est toujours de type string mais on ne peut pas vraiment determine sa position a cause de arguments : position= 4 si arguments est de type string 3 sinon mais on sait que action sera toujours en dernier position - Element actionElement = (Element)current.selectSingleNode("string[position()=last()]"); - result.setAction(actionElement.getText()); + Element actionElement = (Element)current.selectSingleNode("*[position()=last()]"); + if(actionElement!=null){ + result.setAction(actionElement.getText()); + } return result; } @@ -239,37 +249,43 @@ protected ArrayList parseChildren(Element parent){ ArrayList result = new ArrayList(); - //liste des enfants de l'objet eput etre recuperee selon deux cas : + //liste des enfants de l'objet - // premier cas : l'objet est identifie par un id + // 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 + // 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"); - System.out.println("SIZE OF CHILDREN : " + childrenElement.size()); + for(Iterator i = childrenElement.iterator(); i.hasNext();){ Element childElem = (Element)i.next(); String id = childElem.attributeValue("idref"); + // selectionner l'enfant qui possede le meme id que l'idref + // cet enfant se trouve dans les descendants du noeud root if(childElem.attributeValue("idref") != null){ childElem = (Element)rootElement.selectSingleNode("descendant::[@id=\""+id+"\"]"); } UIModelObjectImpl child = parseObject(childElem); id = childElem.attributeValue("id"); - Element constraintElem = (Element)parent.selectSingleNode("descendant::void[@property=\"layout\"]/object[(@class)]/void[@method=\"addLayoutComponent\"]/object[1][(@idref=\""+id+"\") or (@id=\""+id+"\")]/../object[2]"); + // selectionner la constraint + // sous la propriete layout de l'objet, il y a l'argument object layout + // 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)]"); UIModelConstraintImpl constraint = null; if(constraintElem != null){ - UIModelObjectImpl constraintObject = parseObject(childElem); - constraint = new UIModelConstraintImpl(); - constraint.setValue(constraintObject); + constraint = parseConstraint(constraintElem); } + // uimodelChild est compose un child et d'une contrainte UIModelChildImpl ch = new UIModelChildImpl(); ch.setObject(child); ch.setConstraint(constraint); - result.add(child); + result.add(ch); } return result; } @@ -283,84 +299,23 @@ */ protected UIModelConstraintImpl parseConstraint(Element current){ UIModelConstraintImpl result = new UIModelConstraintImpl(); + Object value = null; - UIModelObject value = parseObject(current); - result.setValue(value); - - return result; - - } + if (current.matches("self::object")){ + // la valeur de la constrainte est un objet + value = parseObject(current); + + }else if (current.matches("self::string")){ + // la valeur de la constrainte est une string + value = current.getData(); -} // JavaXMLParser - - -/* - // deuxieme cas : l'objet n'est pas ajoute au container selon la methode add mais lorsque la methode addLayoutComponent est appelee - if(childrenElement==null || childrenElement.size()==0){ - // l'objet possede un property layout sous laquelle se trouve la methode addLayoutComponent qui est la methode appelee lorsqu'un objet est ajoute a un container selon le layout - List childrenElem = current.selectNodes("void[@property=\"layout\"]/void[@method=\"addLayoutComponent\"]/object"); - for(Iterator i = childrenElem.iterator(); i.hasNext();){ - Element childElem = (Element)i.next(); - UIModelChild child = parseChild2(childElem); - result.addChild(child); - } } - */ - - - - - /* - * Returns a child with its constraint if the child has been referenced by the method add - * @param current - element to parse - * @return UIModelChildImpl - *) - protected UIModelChildImpl parseChild(Element current){ - - UIModelChildImpl result = new UIModelChildImpl(); - - // recuperation de l'id de l'enfant - String id = current.attributeValue("id"); - UIModelConstraint constraint = null; - - // cas ou l'objet est deja reference sous le void de la methode add - if(id != null){ - // on est sur l'enfant, on revient sur l'element puis encore sur le parent : on est donc sur le pere de l'enfant, on va aller chercher la propriete layout puis la methode addLayoutComponent pour recuperer l'objet contrainte de l'enfant qui a le meme id que l'enfant courant - Element constraintElem = (Element)current.selectSingleNode("parent::parent::/void[@property=\"layout\"]/object[(@class)]/void[@method=\"addLayoutComponent\"]/object[(@class) and (parent::object[@idref=\""+id+"\")]"); - - constraint = parseConstraint(constraintElem); - } - - UIModelObject child = parseObject(current); - result.setObject(child); - result.setConstraint(constraint); + result.setValue(value); return result; } - /** - * Returns a child with its constraint if the child hasn't been referenced - * by the method add - * @param current - element to parse - * @return UIModelChildImpl - *) - protected UIModelChildImpl parseChild2(Element current){ - - UIModelChildImpl result = new UIModelChildImpl(); - - // dans ce cas, l'objet n'est pas prealablement reference, il se trouve a la premiere position - Element childElem = (Element)current.selectSingleNode("object[position()=1]"); - UIModelObject child = parseObject(childElem); - - // la contrainte se trouve en deuxieme position, elle est definie par le type objet - Element constraintElem = (Element)current.selectSingleNode("object[position()=2]"); - UIModelConstraint constraint = parseConstraint(constraintElem); - - result.setObject(child); - result.setConstraint(constraint); +} // JavaXMLParser - return result; - } -*/