Author: tchemit Date: 2008-12-15 02:16:34 +0000 (Mon, 15 Dec 2008) New Revision: 402 Added: lutingenerator/tags/0.63/ lutingenerator/tags/0.63/README.txt lutingenerator/tags/0.63/changelog.txt lutingenerator/tags/0.63/pom.xml lutingenerator/tags/0.63/src/main/java/org/codelutin/generator/ObjectModelGenerator.java Removed: lutingenerator/tags/0.63/changelog lutingenerator/tags/0.63/pom.xml lutingenerator/tags/0.63/src/main/java/org/codelutin/generator/ObjectModelGenerator.java Log: [maven-release-plugin] copy for tag 0.63 Copied: lutingenerator/tags/0.63 (from rev 387, lutingenerator/trunk) Copied: lutingenerator/tags/0.63/README.txt (from rev 388, lutingenerator/trunk/README.txt) =================================================================== --- lutingenerator/tags/0.63/README.txt (rev 0) +++ lutingenerator/tags/0.63/README.txt 2008-12-15 02:16:34 UTC (rev 402) @@ -0,0 +1,2 @@ +To deploy new version of pom: mvn deploy +To install localy: mvn install Deleted: lutingenerator/tags/0.63/changelog =================================================================== --- lutingenerator/trunk/changelog 2008-12-09 09:49:14 UTC (rev 387) +++ lutingenerator/tags/0.63/changelog 2008-12-15 02:16:34 UTC (rev 402) @@ -1,78 +0,0 @@ -0.62-SNAPSHOT - * 20081208 [chorlet] correction bug #1737: Prise en compte du MetaModel UML dans les fichiers XMI - - ajout du support des fichiers default-java.xml et default-uml14.xmi - -0.62 chemit 200811?? - * 20081203 [chemit] add a encoding property on generator to control file generation encoding - * 20081118 [chemit] use lutinproject 3.1 - * 20081117 [chemit] : GeneratorTask can have a dedicated classLoader to be used to instanciate generator implementations - -0.61 chatellier 20081114 - * 20081101 [chemit] - - add a parent setter on ChildGenerator - - add an excludeTemplates property on Generator and GeneratorTask to permit exclusion of generators for some composite generator - -0.60 chemit 20081013 - * 20081013 [chemit] - - make tests works again - - clean pom - -ver-0-51 thimel 20080925 - - * 20080925 [thimel] super pom in version 3.0 - * 20080901 [chatellier] Maven2 layout and LGPL3 - * 20070528 [chatellier] add tag values support to stateModel - * 20070528 [chatellier] modify defaut stateModel generation - * 20070523 [chatellier] remove lutinxml dependency - * 20070523 [chatellier] UIModel implementation over digester : - - use generics - - non tested - - no digester rules definided (no samples available) - * 20070523 [chatellier] change property reverveAttribute to - reverveAttributeName to resolve conflict in objectModel model. - * 20070522 [chatellier] modify ObjectModel implementation : - - to use JavaBeans conventions - - parsed with commons-digester - - to use generics - * 20070520 [chatellier] add stateModel (parsed with commons-digester) - * 20070520 [chatellier] correct generic type error on objectModel interfaces - -ver-0-50 poussin 20070425 - - * add associationType for all attributes - * 20070420 [chatellier] Ajout de l'export de la version du modèle xmi dans - xmi1.2ToObjectModel.xsl - * 20070420 [chatellier] ajout de la DTD objectModel - -ver-0-31 thimel 20060825 - - * ajout de isIndexed sur les attributs - * isOrdered est vrai si isIndexed est vrai ou que le tagValue order-by est - present ou que ordering fixe sur ordered - * Ajout de validateurs de modele + impl de validateur "basiques" base sur des - noms (attributs, classes, ...). - -ver-0-30 thimel 20060303 - - * Ajout des exceptions pour les operations - * Correction du support des interfaces et classes abstraites - * Double compatibilite Poseidon 3.2 / 4 - -ver-0-29 thimel 20060228 - - * Support de l'hértage pour les classes d'association - -ver-0-28 thimel 20060224 - - * Support de Poseidon4 - * Possibilite d'avoir des tagValues sur les modeles - * Ajout de l'extraction de ordered et de la navigabilite - -ver-0-27 thimel 20051213 - - * Ajout d'une methode pour avoir la liste des attributs d'une classe - * Correction erreur de fonctionnement dans ObjectModelImpl(XML).getInterface (doit renvoyer null si non trouve) - -0.26 - - * Ajout du support des stereotypes sur les attributs Copied: lutingenerator/tags/0.63/changelog.txt (from rev 388, lutingenerator/trunk/changelog.txt) =================================================================== --- lutingenerator/tags/0.63/changelog.txt (rev 0) +++ lutingenerator/tags/0.63/changelog.txt 2008-12-15 02:16:34 UTC (rev 402) @@ -0,0 +1,78 @@ +0.62 chemit 20081210 + * 20081210 [chemit] use lutinproject 3.2 and lutinutil 1.0 + * 20081208 [chorlet] - correction bug #1737: Prise en compte du MetaModel UML dans les fichiers XMI + - ajout du support des fichiers default-java.xml et default-uml14.xmi + + * 20081203 [chemit] add a encoding property on generator to control file generation encoding + * 20081118 [chemit] use lutinproject 3.1 + * 20081117 [chemit] : GeneratorTask can have a dedicated classLoader to be used to instanciate generator implementations + +0.61 chatellier 20081114 + * 20081101 [chemit] + - add a parent setter on ChildGenerator + - add an excludeTemplates property on Generator and GeneratorTask to permit exclusion of generators for some composite generator + +0.60 chemit 20081013 + * 20081013 [chemit] + - make tests works again + - clean pom + +ver-0-51 thimel 20080925 + + * 20080925 [thimel] super pom in version 3.0 + * 20080901 [chatellier] Maven2 layout and LGPL3 + * 20070528 [chatellier] add tag values support to stateModel + * 20070528 [chatellier] modify defaut stateModel generation + * 20070523 [chatellier] remove lutinxml dependency + * 20070523 [chatellier] UIModel implementation over digester : + - use generics + - non tested + - no digester rules definided (no samples available) + * 20070523 [chatellier] change property reverveAttribute to + reverveAttributeName to resolve conflict in objectModel model. + * 20070522 [chatellier] modify ObjectModel implementation : + - to use JavaBeans conventions + - parsed with commons-digester + - to use generics + * 20070520 [chatellier] add stateModel (parsed with commons-digester) + * 20070520 [chatellier] correct generic type error on objectModel interfaces + +ver-0-50 poussin 20070425 + + * add associationType for all attributes + * 20070420 [chatellier] Ajout de l'export de la version du modèle xmi dans + xmi1.2ToObjectModel.xsl + * 20070420 [chatellier] ajout de la DTD objectModel + +ver-0-31 thimel 20060825 + + * ajout de isIndexed sur les attributs + * isOrdered est vrai si isIndexed est vrai ou que le tagValue order-by est + present ou que ordering fixe sur ordered + * Ajout de validateurs de modele + impl de validateur "basiques" base sur des + noms (attributs, classes, ...). + +ver-0-30 thimel 20060303 + + * Ajout des exceptions pour les operations + * Correction du support des interfaces et classes abstraites + * Double compatibilite Poseidon 3.2 / 4 + +ver-0-29 thimel 20060228 + + * Support de l'hértage pour les classes d'association + +ver-0-28 thimel 20060224 + + * Support de Poseidon4 + * Possibilite d'avoir des tagValues sur les modeles + * Ajout de l'extraction de ordered et de la navigabilite + +ver-0-27 thimel 20051213 + + * Ajout d'une methode pour avoir la liste des attributs d'une classe + * Correction erreur de fonctionnement dans ObjectModelImpl(XML).getInterface (doit renvoyer null si non trouve) + +0.26 + + * Ajout du support des stereotypes sur les attributs \ No newline at end of file Deleted: lutingenerator/tags/0.63/pom.xml =================================================================== --- lutingenerator/trunk/pom.xml 2008-12-09 09:49:14 UTC (rev 387) +++ lutingenerator/tags/0.63/pom.xml 2008-12-15 02:16:34 UTC (rev 402) @@ -1,104 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - - <modelVersion>4.0.0</modelVersion> - - <!-- ************************************************************* --> - <!-- *** POM Relationships *************************************** --> - <!-- ************************************************************* --> - <parent> - <groupId>org.codelutin</groupId> - <artifactId>lutinproject</artifactId> - <version>3.1</version> - </parent> - - <artifactId>lutingenerator</artifactId> - - <!-- POM Relationships : Inheritance : Dependencies --> - <dependencies> - - <dependency> - <groupId>commons-digester</groupId> - <artifactId>commons-digester</artifactId> - <version>1.8</version> - <scope>compile</scope> - </dependency> - - <dependency> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - <version>2.4</version> - <scope>compile</scope> - </dependency> - - <dependency> - <groupId>org.apache.ant</groupId> - <artifactId>ant</artifactId> - <version>1.7.1</version> - <scope>compile</scope> - </dependency> - - <dependency> - <groupId>org.codelutin</groupId> - <artifactId>lutinutil</artifactId> - <version>0.31</version> - <scope>compile</scope> - </dependency> - - <dependency> - <groupId>dom4j</groupId> - <artifactId>dom4j</artifactId> - <version>1.6.1</version> - <scope>compile</scope> - </dependency> - - <dependency> - <groupId>jaxen</groupId> - <artifactId>jaxen</artifactId> - <version>1.1.1</version> - <scope>compile</scope> - </dependency> - </dependencies> - - <!-- ************************************************************* --> - <!-- *** Project Information ************************************* --> - <!-- ************************************************************* --> - <name>Lutin Generator</name> - <version>0.62-SNAPSHOT</version> - <description>Générateurs en tout genre.</description> - <inceptionYear>2004</inceptionYear> - - <!-- ************************************************************* --> - <!-- *** Build Settings ****************************************** --> - <!-- ************************************************************* --> - <packaging>jar</packaging> - - <properties> - - <!-- id du projet du labs --> - <labs.id>39</labs.id> - - </properties> - - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - </plugin> - - </plugins> - </build> - - <!-- ************************************************************* --> - <!-- *** Build Environment ************************************** --> - <!-- ************************************************************* --> - - <!--Source control management--> - <scm> - <connection>${maven.scm.connection}</connection> - <developerConnection>${maven.scm.developerConnection}</developerConnection> - <url>${maven.scm.url}</url> - </scm> - -</project> Copied: lutingenerator/tags/0.63/pom.xml (from rev 401, lutingenerator/trunk/pom.xml) =================================================================== --- lutingenerator/tags/0.63/pom.xml (rev 0) +++ lutingenerator/tags/0.63/pom.xml 2008-12-15 02:16:34 UTC (rev 402) @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <!-- ************************************************************* --> + <!-- *** POM Relationships *************************************** --> + <!-- ************************************************************* --> + <parent> + <groupId>org.codelutin</groupId> + <artifactId>lutinproject</artifactId> + <version>3.2</version> + </parent> + + <artifactId>lutingenerator</artifactId> + <version>0.63</version> + + <!-- POM Relationships : Inheritance : Dependencies --> + <dependencies> + + <dependency> + <groupId>org.codelutin</groupId> + <artifactId>lutinutil</artifactId> + <version>${lutinutil.version}</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>commons-digester</groupId> + <artifactId>commons-digester</artifactId> + <version>1.8</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + <version>2.4</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>org.apache.ant</groupId> + <artifactId>ant</artifactId> + <version>1.7.1</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>dom4j</groupId> + <artifactId>dom4j</artifactId> + <version>1.6.1</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>jaxen</groupId> + <artifactId>jaxen</artifactId> + <version>1.1.1</version> + <scope>compile</scope> + </dependency> + </dependencies> + + <!-- ************************************************************* --> + <!-- *** Project Information ************************************* --> + <!-- ************************************************************* --> + <name>Lutin Generator</name> + + <description>Générateurs en tout genre.</description> + <inceptionYear>2004</inceptionYear> + + <!-- ************************************************************* --> + <!-- *** Build Settings ****************************************** --> + <!-- ************************************************************* --> + <packaging>jar</packaging> + + <properties> + + <!-- id du projet du labs --> + <labs.id>39</labs.id> + + <!-- name du projet du labs --> + <labs.project>lutingenerator</labs.project> + + <!-- lutinutil version --> + <lutinutil.version>1.0</lutinutil.version> + + </properties> + + <build> + <plugins> + + <plugin> + <artifactId>maven-javadoc-plugin</artifactId> + </plugin> + + </plugins> + </build> + + <!-- ************************************************************* --> + <!-- *** Build Environment ************************************** --> + <!-- ************************************************************* --> + + <!--Source control management--> + <scm> + <connection>scm:svn:svn://anonymous@labs.libre-entreprise.org/svnroot/lutingenerator/lutingenerator/tags/0.63</connection> + <developerConnection>scm:svn:svn+ssh://tchemit@labs.libre-entreprise.org/svnroot/lutingenerator/lutingenerator/tags/0.63</developerConnection> + <url>http://labs.libre-entreprise.org/plugins/scmsvn/viewcvs.php/lutingenerator/tags/0.63?root=lutingenerator</url> + </scm> + +</project> Deleted: lutingenerator/tags/0.63/src/main/java/org/codelutin/generator/ObjectModelGenerator.java =================================================================== --- lutingenerator/trunk/src/main/java/org/codelutin/generator/ObjectModelGenerator.java 2008-12-09 09:49:14 UTC (rev 387) +++ lutingenerator/tags/0.63/src/main/java/org/codelutin/generator/ObjectModelGenerator.java 2008-12-15 02:16:34 UTC (rev 402) @@ -1,430 +0,0 @@ -/* *##% Lutin Generator - * Copyright (C) 2004 - 2008 CodeLutin - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. ##%*/ - -/******************************************************************************* - * ObjectModelGenerator.java - * - * Created: 14 mars 2004 - * - * @author Benjamin Poussin <poussin@codelutin.com> Copyright Code Lutin - * - * @version $Revision$ - * - * Mise a jour: $Date$ par : $Author$ - */ - -package org.codelutin.generator; - -import org.apache.commons.digester.Digester; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.codelutin.generator.models.object.ObjectModel; -import org.codelutin.generator.models.object.ObjectModelClass; -import org.codelutin.generator.models.object.ObjectModelClassifier; -import org.codelutin.generator.models.object.ObjectModelElement; -import org.codelutin.generator.models.object.ObjectModelInterface; -import org.codelutin.generator.models.object.xml.DigesterObjectModelRuleSet; -import org.codelutin.generator.models.object.xml.ObjectModelClassifierImpl; -import org.codelutin.generator.models.object.xml.ObjectModelElementImpl; -import org.codelutin.generator.models.object.xml.ObjectModelImpl; -import org.codelutin.generator.models.object.xml.ObjectModelImplRef; -import org.codelutin.generator.models.object.xml.ObjectModelImplTagValue; -import org.codelutin.util.FileUtil; -import org.codelutin.util.RecursiveProperties; -import org.codelutin.util.StringUtil; -import org.xml.sax.SAXException; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Pour utiliser ce type de générateur il faut implanter au moins une des trois - * méthodes generateFrom... et le getFilenameFor... associé si l'on souhaite un - * nom de fichier convenable. Si dans une méthode generateFrom... on utilise pas - * le Writer alors aucun fichier n'est généré. - * - * <pre> - * public String getFilenameForClass(ObjectModelClass clazz){ - * return super.getFilenameForClass(Clazz) + "Service.java"; - * } - * - * public void generateFromClass(Writer output, ObjectModelClass clazz) throws IOException{ - * if(clazz.getType().equals("service")){ - * / *{ - * public class .... { - * - * } - * }* / - * } - * } - * </pre> - * - * Le nom de l'argument writer doit absolument etre output et pas autre chose si - * vous souhaitez utiliser le processeur - * {@link org.codelutin.processor.filters.GeneratorTemplatesFilter} pour vous - * s'implifier l'écriture des templates. - */ -public class ObjectModelGenerator extends ChildGenerator { - - /** - * Logger for this class - */ - private static final Log log = LogFactory - .getLog(ObjectModelGenerator.class); - - protected ObjectModel model = null; - - /** - * - * l'expression réguliere match les chaines de type - * <package.ClassName>.<class|attribute|operation>.[name].<stereotype|tagvalue>.[tag] - * fr.isisfish.entities.Population.class.stereotype=entity - * fr.isisfish.entities.Population.class.tagvalue.persistenceType=flatfile - * fr.isisfish.entities.Population.attribute.name.stereotype=... - * fr.isisfish.entities.Population.attribute.name.tagvalue.pk=topiaId - * fr.isisfish.entities.Population.operation.getRegion.stereotype=... - * fr.isisfish.entities.Population.operation.getRegion.tagvalue.pk=... - */ - Pattern propertiesPattern = Pattern - .compile("((?:[_a-zA-Z0-9]+\\.)+(?:_?[A-Z][_a-zA-Z0-9]*\\.)+)(?:(class|attribute|operation)\\.)(?:([_a-z0-9][_a-zA-Z0-9]*)\\.)?(?:(stereotype|tagvalue)\\.?)([_a-z0-9][_a-zA-Z0-9]*)?"); - - public ObjectModelGenerator() { - super(); - } - - public ObjectModelGenerator(Generator parent) { - super(parent); - } - - public ObjectModel getModel() { - return model; - } - - /** - * @param files les noms des fichiers existant contenant du XML représentant - * des ObjectModel. Il est automatiquement recherche un fichier de - * propriété associé a ce fichier pour pouvoir ajouter des - * stereotype ou des tag value sur les class, attribute ou operation - * @param destDir le répertoire dans lequel il faudra mettre les fichiers - * générés - */ - public void generate(File[] files, File destDir) { - setLastModifiedSource(files); - ObjectModel objectModel = new ObjectModelImpl(); - - // Digester parser configuration - Digester digester = new Digester(); - digester.addRuleSet(new DigesterObjectModelRuleSet()); - - for (File file : files) { - try { - digester.push(objectModel); - objectModel = (ObjectModel) digester.parse(file); - } catch (IOException e) { - log.warn("Unable to parse ObjectModel input file : " - + file, e); - } catch (SAXException e) { - log.warn("Unable to parse ObjectModel input file : " - + file, e); - } - - // recherche est charge le fichier propriete associe au modele - File dir = file.getParentFile(); - String ext = FileUtil.extension(file); - String name = FileUtil.basename(file, "." + ext); - File propFile = new File(dir, name + ".properties"); - RecursiveProperties prop = new RecursiveProperties(); - if (!propFile.exists()) { - if (log.isInfoEnabled()) { - log.info("Pas de fichier de propriete " + propFile - + " associé au model"); - } - } else { - if (log.isInfoEnabled()) { - log.info("Lecture du fichier de propriete " + propFile - + " associé au model"); - } - try { - prop.load(new FileInputStream(propFile)); - } catch (IOException eee) { - log.warn("Impossible de lire le fichier de propriete " - + propFile, eee); - } - - // on ajoute les proprietes du fichier associe au model - for (Enumeration e = prop.keys(); e.hasMoreElements();) { - String key = (String) e.nextElement(); - String value = prop.getProperty(key); - - if (key.startsWith("model")) { - if (!key.startsWith("model.tagvalue.")) { - log.warn("only tagvalue is allowed on model in properties"); - } else { - String tag = key.substring("model.tagvalue.".length()); - - ObjectModelImplTagValue tagvalue = new ObjectModelImplTagValue(); - tagvalue.setName(tag); - tagvalue.setValue(value); - ((ObjectModelImpl) objectModel).addTagValue(tagvalue); - } - } else { - - Matcher matcher = propertiesPattern.matcher(key); - - if (log.isDebugEnabled()) { - log.debug("Propriete: '" + key + "'"); - } - - if (matcher.find()) { - // fqn is fully qualified name of class - String fqn = matcher.group(1); - fqn = StringUtil.substring(fqn, 0, -1); // remove ended - // . - // target is class, attribute or operation - String target = matcher.group(2); - String targetName = matcher.group(3); - // type is stereotype or tagvalue - String type = matcher.group(4); - String tag = matcher.group(5); - - if (log.isDebugEnabled()) { - log.debug("Propriete: '" + key + "' => " + "fqn:" - + fqn + " target:" + target - + " targetName:" + targetName + " type:" - + type + " tag:" + tag); - } - - ObjectModelClassifier omc = objectModel - .getClassifier(fqn); - if (omc instanceof ObjectModelClassifierImpl) { - // on utilise une liste car il peut y avoir plusieur - // operation avec le nom donné - List<ObjectModelElement> elems = new ArrayList<ObjectModelElement>(); - if ("class".equals(target)) { - elems.add((ObjectModelElementImpl) omc); - } else if ("attribute".equals(target)) { - ObjectModelClass classmodel = (ObjectModelClass) omc; - elems.add((ObjectModelElementImpl) classmodel - .getAttribute(targetName)); - } else if ("operation".equals(target)) { - elems.addAll(omc - .getOperations(targetName)); - } - for (Iterator it = elems.iterator(); it.hasNext();) { - ObjectModelElementImpl elem = (ObjectModelElementImpl) it - .next(); - if ("stereotype".equals(type)) { - // pour les stereotypes - ObjectModelImplRef stereotype = new ObjectModelImplRef(); - stereotype.setName(value); - elem.addStereotype(stereotype); - } else if ("tagvalue".equals(type)) { - // pour les tagvalues - ObjectModelImplTagValue tagvalue = new ObjectModelImplTagValue(); - tagvalue.setName(tag); - tagvalue.setValue(value); - elem.addTagValue(tagvalue); - } - } - } else { - // TODO il faudra avoir des methodes d'acces en - // Set sur l'interface pour eviter ce message - log.warn("Can't add properties to model, it's not an ObjectModelClassifierImpl"); - } - } - } - } - } - } - try { - generate(objectModel, destDir); - } catch (IOException eee) { - if (log.isWarnEnabled()) { - log.warn("Unable to generate for file", eee); - } - } - } - - /** - * Par defaut la methode appelle la methode - * {@link #generateFromModel(Writer, ObjectModel)} puis boucle sur chaque - * class en appelant la m?thode - * {@link #generateFromClass(Writer, ObjectModelClass)} et enfin sur chaque - * interface en appelant a méthode - * {@link #generateFromInterface(Writer, ObjectModelInterface)} Le nom de - * fichier est récupérer pour chacun d'eux en appelant la méthode - * getFilenameFor.... La methode generateFrom... n'utilise pas le Writer - * alors le fichier n'est pas généré, si on l'utilise m?me pour ne rien - * écrire alors le fichier sera généré. - * @param model - * @param destDir - * @throws java.io.IOException - */ - public void generate(ObjectModel model, File destDir) throws IOException { - { - this.model = model; - - String filename = getFilenameForModel(model); - File outputFile = getDestinationFile(destDir, filename); - if (getOverwrite() || !isNewerThanSource(outputFile)) { - try { - StringWriter out = new StringWriter(); - MonitorWriter monitorOut = new MonitorWriter(out); - generateFromModel(monitorOut, model); - write(outputFile, monitorOut); - } catch (Exception eee) { - log.warn("Erreur lors de la génération du fichier " + outputFile); - throw new RuntimeException("Erreur lors de la génération du fichier " + outputFile, eee); - } - } else { - Logger.getLogger(getClass().getName() + ".generate").log( - Level.FINE, "file " + outputFile + " is up-to-date"); - } - } - - for (Object o : model.getClassifiers()) { - ObjectModelClassifier clazz = (ObjectModelClassifier) o; - - String filename = getFilenameForClassifier(clazz); - File outputFile = getDestinationFile(destDir, filename); - if (getOverwrite() || !isNewerThanSource(outputFile)) { - try { - StringWriter out = new StringWriter(); - MonitorWriter monitorOut = new MonitorWriter(out); - generateFromClassifier(monitorOut, clazz); - write(outputFile, monitorOut); - } catch (Exception eee) { - log.warn("Erreur lors de la génération du fichier " + outputFile); - throw new RuntimeException("Erreur lors de la génération du fichier " + outputFile, eee); - } - } else { - Logger.getLogger(getClass().getName() + ".generate").log( - Level.FINE, "file " + outputFile + " is up-to-date"); - } - } - - for (Object o : model.getInterfaces()) { - ObjectModelInterface interfacez = (ObjectModelInterface) o; - - String filename = getFilenameForInterface(interfacez); - File outputFile = getDestinationFile(destDir, filename); - if (getOverwrite() || !isNewerThanSource(outputFile)) { - try { - StringWriter out = new StringWriter(); - MonitorWriter monitorOut = new MonitorWriter(out); - generateFromInterface(monitorOut, interfacez); - write(outputFile, monitorOut); - } catch (Exception eee) { - log.warn("Erreur lors de la génération du fichier " + outputFile); - throw new RuntimeException("Erreur lors de la génération du fichier " + outputFile, eee); - } - } else { - Logger.getLogger(getClass().getName() + ".generate").log( - Level.FINE, "file " + outputFile + " is up-to-date"); - } - } - - for (Object o : model.getClasses()) { - ObjectModelClass clazz = (ObjectModelClass) o; - - String filename = getFilenameForClass(clazz); - File outputFile = getDestinationFile(destDir, filename); - if (getOverwrite() || !isNewerThanSource(outputFile)) { - try { - StringWriter out = new StringWriter(); - MonitorWriter monitorOut = new MonitorWriter(out); - generateFromClass(monitorOut, clazz); - write(outputFile, monitorOut); - } catch (Exception eee) { - log.warn("Erreur lors de la génération du fichier " + outputFile); - throw new RuntimeException("Erreur lors de la génération du fichier " + outputFile, eee); - } - } else { - Logger.getLogger(getClass().getName() + ".generate").log( - Level.FINE, "file " + outputFile + " is up-to-date"); - } - } - } - - /** - * Par defaut cette methode retourne le getName du model. Si l'on souhaite - * utiliser la methode generateFromModel il vaut mieux surcharger cette - * m?thode - */ - public String getFilenameForModel(ObjectModel model) { - return model.getName(); - } - - /** - * Par defaut cette methode retourne le QualifiedName convertie en chemin - * par exemple pour org.codelutin.Toto on aurait org/codelutin/Toto - */ - public String getFilenameForPackage(ObjectModel model, String packageName) { - return packageName.replace('.', File.separatorChar); - } - - /** - * Par defaut cette methode retourne le QualifiedName convertie en chemin - * par exemple pour org.codelutin.Toto on aurait org/codelutin/Toto - */ - public String getFilenameForInterface(ObjectModelInterface interfacez) { - return interfacez.getQualifiedName().replace('.', File.separatorChar); - } - - /** - * Par defaut cette methode retourne le QualifiedName convertie en chemin - * par exemple pour org.codelutin.Toto on aurait org/codelutin/Toto - */ - public String getFilenameForClass(ObjectModelClass clazz) { - return clazz.getQualifiedName().replace('.', File.separatorChar); - } - - /** - * Par defaut cette methode retourne le QualifiedName convertie en chemin - * par exemple pour org.codelutin.Toto on aurait org/codelutin/Toto - */ - public String getFilenameForClassifier(ObjectModelClassifier clazz) { - return clazz.getQualifiedName().replace('.', File.separatorChar); - } - - public void generateFromModel(Writer output, ObjectModel model) - throws IOException { - } - - public void generateFromInterface(Writer output, - ObjectModelInterface interfacez) throws IOException { - } - - public void generateFromClass(Writer output, ObjectModelClass clazz) - throws IOException { - } - - public void generateFromClassifier(Writer output, - ObjectModelClassifier clazz) throws IOException { - } -} Copied: lutingenerator/tags/0.63/src/main/java/org/codelutin/generator/ObjectModelGenerator.java (from rev 400, lutingenerator/trunk/src/main/java/org/codelutin/generator/ObjectModelGenerator.java) =================================================================== --- lutingenerator/tags/0.63/src/main/java/org/codelutin/generator/ObjectModelGenerator.java (rev 0) +++ lutingenerator/tags/0.63/src/main/java/org/codelutin/generator/ObjectModelGenerator.java 2008-12-15 02:16:34 UTC (rev 402) @@ -0,0 +1,451 @@ +/* *##% Lutin Generator + * Copyright (C) 2004 - 2008 CodeLutin + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. ##%*/ + +/******************************************************************************* + * ObjectModelGenerator.java + * + * Created: 14 mars 2004 + * + * @author Benjamin Poussin <poussin@codelutin.com> Copyright Code Lutin + * + * @version $Revision$ + * + * Mise a jour: $Date$ par : $Author$ + */ + +package org.codelutin.generator; + +import org.apache.commons.digester.Digester; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.codelutin.generator.models.object.ObjectModel; +import org.codelutin.generator.models.object.ObjectModelClass; +import org.codelutin.generator.models.object.ObjectModelClassifier; +import org.codelutin.generator.models.object.ObjectModelElement; +import org.codelutin.generator.models.object.ObjectModelInterface; +import org.codelutin.generator.models.object.xml.DigesterObjectModelRuleSet; +import org.codelutin.generator.models.object.xml.ObjectModelClassifierImpl; +import org.codelutin.generator.models.object.xml.ObjectModelElementImpl; +import org.codelutin.generator.models.object.xml.ObjectModelImpl; +import org.codelutin.generator.models.object.xml.ObjectModelImplRef; +import org.codelutin.generator.models.object.xml.ObjectModelImplTagValue; +import org.codelutin.util.FileUtil; +import org.codelutin.util.RecursiveProperties; +import org.codelutin.util.StringUtil; +import org.xml.sax.SAXException; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Pour utiliser ce type de générateur il faut implanter au moins une des trois + * méthodes generateFrom... et le getFilenameFor... associé si l'on souhaite un + * nom de fichier convenable. Si dans une méthode generateFrom... on utilise pas + * le Writer alors aucun fichier n'est généré. + * + * <pre> + * public String getFilenameForClass(ObjectModelClass clazz){ + * return super.getFilenameForClass(Clazz) + "Service.java"; + * } + * + * public void generateFromClass(Writer output, ObjectModelClass clazz) throws IOException{ + * if(clazz.getType().equals("service")){ + * / *{ + * public class .... { + * + * } + * }* / + * } + * } + * </pre> + * + * Le nom de l'argument writer doit absolument etre output et pas autre chose si + * vous souhaitez utiliser le processeur + * org.codelutin.processor.filters.GeneratorTemplatesFilter pour vous + * s'implifier l'écriture des templates. + */ +public class ObjectModelGenerator extends ChildGenerator { + + /** + * Logger for this class + */ + private static final Log log = LogFactory + .getLog(ObjectModelGenerator.class); + + protected ObjectModel model = null; + + /** + * + * l'expression réguliere match les chaines de type + * <package.ClassName>.<class|attribute|operation>.[name].<stereotype|tagvalue>.[tag] + * fr.isisfish.entities.Population.class.stereotype=entity + * fr.isisfish.entities.Population.class.tagvalue.persistenceType=flatfile + * fr.isisfish.entities.Population.attribute.name.stereotype=... + * fr.isisfish.entities.Population.attribute.name.tagvalue.pk=topiaId + * fr.isisfish.entities.Population.operation.getRegion.stereotype=... + * fr.isisfish.entities.Population.operation.getRegion.tagvalue.pk=... + */ + Pattern propertiesPattern = Pattern + .compile("((?:[_a-zA-Z0-9]+\\.)+(?:_?[A-Z][_a-zA-Z0-9]*\\.)+)(?:(class|attribute|operation)\\.)(?:([_a-z0-9][_a-zA-Z0-9]*)\\.)?(?:(stereotype|tagvalue)\\.?)([_a-z0-9][_a-zA-Z0-9]*)?"); + + public ObjectModelGenerator() { + super(); + } + + public ObjectModelGenerator(Generator parent) { + super(parent); + } + + public ObjectModel getModel() { + return model; + } + + /** + * @param files les noms des fichiers existant contenant du XML représentant + * des ObjectModel. Il est automatiquement recherche un fichier de + * propriété associé a ce fichier pour pouvoir ajouter des + * stereotype ou des tag value sur les class, attribute ou operation + * @param destDir le répertoire dans lequel il faudra mettre les fichiers + * générés + */ + public void generate(File[] files, File destDir) { + setLastModifiedSource(files); + ObjectModel objectModel = new ObjectModelImpl(); + + // Digester parser configuration + Digester digester = new Digester(); + digester.addRuleSet(new DigesterObjectModelRuleSet()); + + for (File file : files) { + try { + digester.push(objectModel); + objectModel = (ObjectModel) digester.parse(file); + } catch (IOException e) { + log.warn("Unable to parse ObjectModel input file : " + + file, e); + } catch (SAXException e) { + log.warn("Unable to parse ObjectModel input file : " + + file, e); + } + + // recherche est charge le fichier propriete associe au modele + File dir = file.getParentFile(); + String ext = FileUtil.extension(file); + String name = FileUtil.basename(file, "." + ext); + File propFile = new File(dir, name + ".properties"); + RecursiveProperties prop = new RecursiveProperties(); + if (!propFile.exists()) { + if (log.isInfoEnabled()) { + log.info("Pas de fichier de propriete " + propFile + + " associé au model"); + } + } else { + if (log.isInfoEnabled()) { + log.info("Lecture du fichier de propriete " + propFile + + " associé au model"); + } + try { + prop.load(new FileInputStream(propFile)); + } catch (IOException eee) { + log.warn("Impossible de lire le fichier de propriete " + + propFile, eee); + } + + // on ajoute les proprietes du fichier associe au model + for (Enumeration e = prop.keys(); e.hasMoreElements();) { + String key = (String) e.nextElement(); + String value = prop.getProperty(key); + + if (key.startsWith("model")) { + if (!key.startsWith("model.tagvalue.")) { + log.warn("only tagvalue is allowed on model in properties"); + } else { + String tag = key.substring("model.tagvalue.".length()); + + ObjectModelImplTagValue tagvalue = new ObjectModelImplTagValue(); + tagvalue.setName(tag); + tagvalue.setValue(value); + ((ObjectModelImpl) objectModel).addTagValue(tagvalue); + } + } else { + + Matcher matcher = propertiesPattern.matcher(key); + + if (log.isDebugEnabled()) { + log.debug("Propriete: '" + key + "'"); + } + + if (matcher.find()) { + // fqn is fully qualified name of class + String fqn = matcher.group(1); + fqn = StringUtil.substring(fqn, 0, -1); // remove ended + // . + // target is class, attribute or operation + String target = matcher.group(2); + String targetName = matcher.group(3); + // type is stereotype or tagvalue + String type = matcher.group(4); + String tag = matcher.group(5); + + if (log.isDebugEnabled()) { + log.debug("Propriete: '" + key + "' => " + "fqn:" + + fqn + " target:" + target + + " targetName:" + targetName + " type:" + + type + " tag:" + tag); + } + + ObjectModelClassifier omc = objectModel + .getClassifier(fqn); + if (omc instanceof ObjectModelClassifierImpl) { + // on utilise une liste car il peut y avoir plusieur + // operation avec le nom donné + List<ObjectModelElement> elems = new ArrayList<ObjectModelElement>(); + if ("class".equals(target)) { + elems.add(omc); + } else if ("attribute".equals(target)) { + ObjectModelClass classmodel = (ObjectModelClass) omc; + elems.add(classmodel + .getAttribute(targetName)); + } else if ("operation".equals(target)) { + elems.addAll(omc + .getOperations(targetName)); + } + for (Object elem1 : elems) { + ObjectModelElementImpl elem = (ObjectModelElementImpl) elem1; + if ("stereotype".equals(type)) { + // pour les stereotypes + ObjectModelImplRef stereotype = new ObjectModelImplRef(); + stereotype.setName(value); + elem.addStereotype(stereotype); + continue; + } + + if ("tagvalue".equals(type)) { + // pour les tagvalues + ObjectModelImplTagValue tagvalue = new ObjectModelImplTagValue(); + tagvalue.setName(tag); + tagvalue.setValue(value); + if (log.isDebugEnabled()) { + log.debug("tagValue:"+tagvalue+", tag:" + tag + ", value:" + value+", element:"+elem); + } + if (elem == null) { + log.warn("can not attach tagValue " + key); + } else { + elem.addTagValue(tagvalue); + } + } + } + } else { + // TODO il faudra avoir des methodes d'acces en + // Set sur l'interface pour eviter ce message + log.warn("Can't add properties to model, it's not an ObjectModelClassifierImpl"); + } + } + } + } + } + } + try { + generate(objectModel, destDir); + } catch (IOException eee) { + if (log.isWarnEnabled()) { + log.warn("Unable to generate for file", eee); + } + } + } + + /** + * Par defaut la methode appelle la methode + * {@link #generateFromModel(Writer, ObjectModel)} puis boucle sur chaque + * class en appelant la m?thode + * {@link #generateFromClass(Writer, ObjectModelClass)} et enfin sur chaque + * interface en appelant a méthode + * {@link #generateFromInterface(Writer, ObjectModelInterface)} Le nom de + * fichier est récupérer pour chacun d'eux en appelant la méthode + * getFilenameFor.... La methode generateFrom... n'utilise pas le Writer + * alors le fichier n'est pas généré, si on l'utilise m?me pour ne rien + * écrire alors le fichier sera généré. + * @param model + * @param destDir + * @throws java.io.IOException + */ + public void generate(ObjectModel model, File destDir) throws IOException { + long newTime = System.currentTimeMillis(); + { + + this.model = model; + + String filename = getFilenameForModel(model); + File outputFile = getDestinationFile(destDir, filename); + if (!getOverwrite() && isNewerThanSource(outputFile)) { + if (log.isDebugEnabled()) { + log.debug("file " + outputFile + " is up-to-date"); + } + } else { + if (!outputFile.exists() && log.isDebugEnabled()) { + log.debug("not up-to-date "+outputFile.lastModified()+" <"+outputFile+">"); + } + try { + StringWriter out = new StringWriter(); + MonitorWriter monitorOut = new MonitorWriter(out); + generateFromModel(monitorOut, model); + write(outputFile, monitorOut); + } catch (Exception eee) { + log.warn("Erreur lors de la génération du fichier " + outputFile); + throw new RuntimeException("Erreur lors de la génération du fichier " + outputFile, eee); + } + } + } + + for (ObjectModelClassifier clazz : model.getClassifiers()) { + + String filename = getFilenameForClassifier(clazz); + File outputFile = getDestinationFile(destDir, filename); + if (!getOverwrite() && isNewerThanSource(outputFile)) { + if (log.isDebugEnabled()) { + log.debug("file " + outputFile + " is up-to-date"); + } + continue; + } + if (!outputFile.exists() && log.isDebugEnabled()) { + log.debug("not up-to-date "+outputFile.lastModified()+" <"+outputFile+">"); + } + try { + StringWriter out = new StringWriter(); + MonitorWriter monitorOut = new MonitorWriter(out); + generateFromClassifier(monitorOut, clazz); + write(outputFile, monitorOut); + } catch (Exception eee) { + log.warn("Erreur lors de la génération du fichier " + outputFile); + throw new RuntimeException("Erreur lors de la génération du fichier " + outputFile, eee); + } + } + + for (ObjectModelInterface interfacez : model.getInterfaces()) { + + String filename = getFilenameForInterface(interfacez); + File outputFile = getDestinationFile(destDir, filename); + if (!getOverwrite() && isNewerThanSource(outputFile)) { + if (log.isDebugEnabled()) { + log.debug("file " + outputFile + " is up-to-date"); + } + continue; + } + if (!outputFile.exists() && log.isDebugEnabled()) { + log.debug("not up-to-date "+outputFile.lastModified()+" <"+outputFile+">"); + } + try { + StringWriter out = new StringWriter(); + MonitorWriter monitorOut = new MonitorWriter(out); + generateFromInterface(monitorOut, interfacez); + write(outputFile, monitorOut); + } catch (Exception eee) { + log.warn("Erreur lors de la génération du fichier " + outputFile); + throw new RuntimeException("Erreur lors de la génération du fichier " + outputFile, eee); + } + } + + for (ObjectModelClass clazz : model.getClasses()) { + + String filename = getFilenameForClass(clazz); + File outputFile = getDestinationFile(destDir, filename); + if (!getOverwrite() && isNewerThanSource(outputFile)) { + if (log.isDebugEnabled()) { + log.debug("file " + outputFile + " is up-to-date"); + } + continue; + } + if (!outputFile.exists() && log.isDebugEnabled()) { + log.debug("not up-to-date "+outputFile.lastModified()+" <"+outputFile+">"); + } + try { + StringWriter out = new StringWriter(); + MonitorWriter monitorOut = new MonitorWriter(out); + generateFromClass(monitorOut, clazz); + write(outputFile, monitorOut); + } catch (Exception eee) { + log.warn("Erreur lors de la génération du fichier " + outputFile); + throw new RuntimeException("Erreur lors de la génération du fichier " + outputFile, eee); + } + } + } + + /** + * Par defaut cette methode retourne le getName du model. Si l'on souhaite + * utiliser la methode generateFromModel il vaut mieux surcharger cette + * m?thode + */ + public String getFilenameForModel(ObjectModel model) { + return model.getName(); + } + + /** + * Par defaut cette methode retourne le QualifiedName convertie en chemin + * par exemple pour org.codelutin.Toto on aurait org/codelutin/Toto + */ + public String getFilenameForPackage(ObjectModel model, String packageName) { + return packageName.replace('.', File.separatorChar); + } + + /** + * Par defaut cette methode retourne le QualifiedName convertie en chemin + * par exemple pour org.codelutin.Toto on aurait org/codelutin/Toto + */ + public String getFilenameForInterface(ObjectModelInterface interfacez) { + return interfacez.getQualifiedName().replace('.', File.separatorChar); + } + + /** + * Par defaut cette methode retourne le QualifiedName convertie en chemin + * par exemple pour org.codelutin.Toto on aurait org/codelutin/Toto + */ + public String getFilenameForClass(ObjectModelClass clazz) { + return clazz.getQualifiedName().replace('.', File.separatorChar); + } + + /** + * Par defaut cette methode retourne le QualifiedName convertie en chemin + * par exemple pour org.codelutin.Toto on aurait org/codelutin/Toto + */ + public String getFilenameForClassifier(ObjectModelClassifier clazz) { + return clazz.getQualifiedName().replace('.', File.separatorChar); + } + + public void generateFromModel(Writer output, ObjectModel model) + throws IOException { + } + + public void generateFromInterface(Writer output, + ObjectModelInterface interfacez) throws IOException { + } + + public void generateFromClass(Writer output, ObjectModelClass clazz) + throws IOException { + } + + public void generateFromClassifier(Writer output, + ObjectModelClassifier clazz) throws IOException { + } +}