r666 - in branches/1.1.0-Javabuilder: eugene/src/main/java/org/nuiton/eugene eugene/src/main/java/org/nuiton/eugene/models/object eugene/src/main/java/org/nuiton/eugene/models/object/builder eugene/src/main/java/org/nuiton/eugene/models/object/xml eugene/src/test/resources eugene-test eugene-test/src/main/java/org/nuiton/eugene eugene-test/src/main/java/org/nuiton/eugene/java eugene-test/src/main/java/org/nuiton/eugene/test/generator eugene-test/src/test/java/org/nuiton/eugene eugene-test/s
Author: fdesbois Date: 2009-10-28 20:04:40 +0100 (Wed, 28 Oct 2009) New Revision: 666 Added: branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/ branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/JavaBuilderHelper.java branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/JavaGenerator.java branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/OM2JavaTransformer.java branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/BeanTransformer.java branches/1.1.0-Javabuilder/eugene-test/src/test/java/org/nuiton/eugene/java/ branches/1.1.0-Javabuilder/eugene-test/src/test/java/org/nuiton/eugene/java/JavaBuilderHelperTest.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/AbstractGenerator.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelTransformer.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/Transformer.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/builder/JavaBuilder.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelBuilderHelper.java Removed: branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/DTOBuilder.java branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/JavaGenerator.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/JavaBuilder.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelBuilderHelper.java Modified: branches/1.1.0-Javabuilder/eugene-test/pom.xml branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/TestBuilder.java branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/TestReader.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/Generator.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelGenerator.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/StateModelGenerator.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassifierImpl.java branches/1.1.0-Javabuilder/eugene/src/test/resources/log4j.properties Log: - Change hierarchy for Generator to have common root with Transformer - Create transformers - Begin translation BeanGenerator to BeanTransformer Added: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/AbstractGenerator.java =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/AbstractGenerator.java (rev 0) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/AbstractGenerator.java 2009-10-28 19:04:40 UTC (rev 666) @@ -0,0 +1,160 @@ +package org.nuiton.eugene; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import org.nuiton.eugene.models.Model; + +/** + * AbstractGenerator + * + * Created: 28 oct. 2009 + * + * @param <M> + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public abstract class AbstractGenerator<M extends Model> extends Generator<M> { + + protected AbstractGenerator<M> parent = null; + + public AbstractGenerator() { + super(); + } + + public AbstractGenerator(AbstractGenerator<M> parent) { + super(); + setParent(parent); + } + + public void setParent(AbstractGenerator<M> parent) { + this.parent = parent; + setEncoding(parent.getEncoding()); + } + + @Override + public boolean getOverwrite() { + if (parent != null) { + return getOverwrite(); + } + return overwrite; + } + + /** + * Permet de recuperer la proprieté passé en argument + * + * @param name le nom de la propriete + * @return la valeur de la propriété + */ + @Override + public String getProperty(String name) { + if (parent != null) { + return parent.getProperty(name); + } + return properties.getProperty(name); + } + + @Override + public long getLastModifiedSource() { + if (parent != null) { + return parent.getLastModifiedSource(); + } + return this.lastModifiedSource; + } + + /** + * @param file fichier a tester + * @return vrai si le fichier passé en parametre est plus recent que + * les sources sur generateur. + */ + protected boolean isNewerThanSource(File file) { + if (log.isDebugEnabled()) { + log.debug("source date: " + getLastModifiedSource() + + " file date: " + file.lastModified() + "(" + file + ")"); + } + return file.lastModified() > getLastModifiedSource(); + } + + protected File getDestinationFile(File destDir, String filename) { + return new File(destDir, filename); + } + + /** + * Test if given package is allowed for generation. + * + * An element can be generated if his package is in the {@link generatedPackages} list + * or if {@link generatedPackages} is null or empty. + * + * @param packageName package name to test + * @return generation allowed + */ + protected boolean canGeneratePackage(String packageName) { + boolean canGenerate = true; + if (parent != null) { + return parent.canGeneratePackage(packageName); + } + // if not generation restriction, generate everything + if (generatedPackages != null && !generatedPackages.isEmpty()) { + canGenerate = false; + + // on doit donc tester que le package courant + // soit est egal a un des element de la liste + // soit commence par ca + for (String generatedPackage : generatedPackages) { + + // cas egalité parfaites + if (packageName != null && packageName.equals(generatedPackage)) { + canGenerate = true; + } + + // cas commence par (on ajout un point à la fin) + String localGeneratedPackage = generatedPackage; + if (!localGeneratedPackage.endsWith(".")) { + localGeneratedPackage += "."; + } + if (packageName != null && packageName.startsWith(localGeneratedPackage)) { + canGenerate = true; + } + + } + } + + return canGenerate; + } + + protected void write(File outputFile, MonitorWriter out) { + File write0utputFile = outputFile; + if (out.isModified()) { + try { + write0utputFile = outputFile.getCanonicalFile(); + write0utputFile.getParentFile().mkdirs(); + + Writer output = null; + + if (encoding != null) { + if (log.isDebugEnabled()) { + log.debug("Force encoding to " + encoding + " : " + this); + } + output = new OutputStreamWriter(new FileOutputStream( + write0utputFile), encoding); + } else { + output = new OutputStreamWriter(new FileOutputStream( + write0utputFile)); + } + + output.write(out.getBuffer().toString()); + output.close(); + } catch (IOException eee) { + if (log.isWarnEnabled()) { + log.warn("Unable to write file : " + write0utputFile.getAbsolutePath(), eee); + } + throw new RuntimeException(eee); + } + } + } +} Modified: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/Generator.java =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/Generator.java 2009-10-28 19:04:32 UTC (rev 665) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/Generator.java 2009-10-28 19:04:40 UTC (rev 666) @@ -35,7 +35,7 @@ * * Created: 5 août 2004 * - * @param <M> Model associated to the generator + * @param <M> Model associated to the generator (input model) * * @author Cedric Pineau <pineau@codelutin.com> * @version $Revision$ @@ -64,33 +64,17 @@ /** date de derniere modification de la source la plus recente */ protected long lastModifiedSource = 0; + /** Model */ + protected M model; - protected Generator<M> parent = null; - public Generator() { } - public Generator(Generator<M> parent) { - setParent(parent); - } - - public void setParent(Generator<M> parent) { - this.parent = parent; - setEncoding(parent.getEncoding()); - } - - public void setProperties(Properties p) { - this.properties = p; - } - public void setOverwrite(boolean v) { overwrite = v; } public boolean getOverwrite() { - if (parent != null) { - return getOverwrite(); - } return overwrite; } @@ -101,6 +85,20 @@ public void setEncoding(String encoding) { this.encoding = encoding; } + + public void setProperties(Properties p) { + this.properties = p; + } + + /** + * Permet de recuperer la proprieté passé en argument + * + * @param name le nom de la propriete + * @return la valeur de la propriété + */ + public String getProperty(String name) { + return properties.getProperty(name); + } /** * Set list of package to allow generation. @@ -113,73 +111,14 @@ this.generatedPackages = generatedPackages; } - /** - * Permet de recuperer la proprieté passé en argument - * - * @param name le nom de la propriete - * @return la valeur de la propriété - */ - public String getProperty(String name) { - if (parent != null) { - return parent.getProperty(name); - } - return properties.getProperty(name); - } - public void setLastModifiedSource(long lastModifiedSource) { this.lastModifiedSource = lastModifiedSource; } - /** - * @param file fichier a tester - * @return vrai si le fichier passé en parametre est plus recent que - * les sources sur generateur. - */ - protected boolean isNewerThanSource(File file) { - if (log.isDebugEnabled()) { - log.debug("source date: " + lastModifiedSource - + " file date: " + file.lastModified() + "(" + file + ")"); - } - return file.lastModified() > lastModifiedSource; + public long getLastModifiedSource() { + return this.lastModifiedSource; } - - protected File getDestinationFile(File destDir, String filename) { - return new File(destDir, filename); - } - - protected void write(File outputFile, MonitorWriter out) { - File write0utputFile = outputFile; - if (out.isModified()) { - try { - write0utputFile = outputFile.getCanonicalFile(); - write0utputFile.getParentFile().mkdirs(); - - Writer output = null; - - if (encoding != null) { - if (log.isDebugEnabled()) { - log.debug("Force encoding to " + encoding + " : " - + this); - } - output = new OutputStreamWriter(new FileOutputStream( - write0utputFile), encoding); - } else { - output = new OutputStreamWriter(new FileOutputStream( - write0utputFile)); - } - - output.write(out.getBuffer().toString()); - output.close(); - } catch (IOException eee) { - if (log.isWarnEnabled()) { - log.warn("Unable to write file : " - + write0utputFile.getAbsolutePath(), eee); - } - throw new RuntimeException(eee); - } - } - } - + public List<String> getExcludeTemplates() { return excludeTemplates; } @@ -188,51 +127,13 @@ this.excludeTemplates = excludeTemplates; } + public M getModel() { + return this.model; + } + @Deprecated public abstract void generate(File[] file, File destDir); public abstract void generate(M model, File destDir); - /** - * Test if given package is allowed for generation. - * - * An element can be generated if his package is in the {@link generatedPackages} list - * or if {@link generatedPackages} is null or empty. - * - * @param packageName package name to test - * @return generation allowed - */ - protected boolean canGeneratePackage(String packageName) { - boolean canGenerate = true; - if (parent != null) { - return parent.canGeneratePackage(packageName); - } - // if not generation restriction, generate everything - if (generatedPackages != null && !generatedPackages.isEmpty()) { - canGenerate = false; - - // on doit donc tester que le package courant - // soit est egal a un des element de la liste - // soit commence par ca - for (String generatedPackage : generatedPackages) { - - // cas egalité parfaites - if (packageName != null && packageName.equals(generatedPackage)) { - canGenerate = true; - } - - // cas commence par (on ajout un point à la fin) - String localGeneratedPackage = generatedPackage; - if (!localGeneratedPackage.endsWith(".")) { - localGeneratedPackage += "."; - } - if (packageName != null && packageName.startsWith(localGeneratedPackage)) { - canGenerate = true; - } - - } - } - - return canGenerate; - } } Deleted: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/JavaBuilder.java =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/JavaBuilder.java 2009-10-28 19:04:32 UTC (rev 665) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/JavaBuilder.java 2009-10-28 19:04:40 UTC (rev 666) @@ -1,199 +0,0 @@ - -package org.nuiton.eugene; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.List; -import java.util.regex.Matcher; -import org.apache.commons.digester.Digester; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.eugene.models.object.ObjectModel; -import org.nuiton.eugene.models.object.ObjectModelAttribute; -import org.nuiton.eugene.models.object.ObjectModelBuilderHelper; -import org.nuiton.eugene.models.object.ObjectModelClass; -import org.nuiton.eugene.models.object.ObjectModelClassifier; -import org.nuiton.eugene.models.object.ObjectModelElement; -import org.nuiton.eugene.models.object.ObjectModelEnumeration; -import org.nuiton.eugene.models.object.ObjectModelInterface; -import org.nuiton.eugene.models.object.ObjectModelOperation; -import org.nuiton.eugene.models.object.ObjectModelParameter; -import org.nuiton.eugene.models.object.xml.DigesterObjectModelRuleSet; -import org.nuiton.eugene.models.object.xml.ObjectModelClassImpl; -import org.nuiton.eugene.models.object.xml.ObjectModelClassifierImpl; -import org.nuiton.eugene.models.object.xml.ObjectModelElementImpl; -import org.nuiton.eugene.models.object.xml.ObjectModelImpl; -import org.nuiton.eugene.models.object.xml.ObjectModelImplRef; -import org.nuiton.eugene.models.object.xml.ObjectModelImplTagValue; -import org.nuiton.util.FileUtil; -import org.nuiton.util.RecursiveProperties; -import org.nuiton.util.StringUtil; -import org.xml.sax.SAXException; - -/** - * - * @author fdesbois - */ -public abstract class JavaBuilder { - - private static final Log log = LogFactory.getLog(JavaBuilder.class); - - protected ObjectModelImpl objectModel; - - private static ObjectModelBuilderHelper helper = new ObjectModelBuilderHelper(); - - public JavaBuilder(String modelName) { - this.objectModel = new ObjectModelImpl(); - this.objectModel.setName(modelName); - } - - public JavaBuilder() { - this.objectModel = new ObjectModelImpl(); - } - - public ObjectModel getModel() { - return objectModel; - } - - public ObjectModelBuilderHelper getHelper() { - return helper; - } - - protected ImportsManager getImportsManager(ObjectModelClassifier classifier) { - ImportsManager manager = objectModel.getExtension(classifier.getQualifiedName(), ImportsManager.class); - if (manager == null) { - manager = new ImportsManager(); - objectModel.addExtension(classifier.getQualifiedName(), manager); - } - return manager; - } - - public void addImportForClassifier(ObjectModelClassifier classifier, String imports) { - ImportsManager manager = getImportsManager(classifier); - manager.addImport(imports); - } - - public void addImportForClassifier(ObjectModelClassifier classifier, Class<?> imports) { - ImportsManager manager = getImportsManager(classifier); - manager.addImport(imports); - } - - public void addClassToModel(ObjectModelClass clazz) { - objectModel.addClass((ObjectModelClassImpl)clazz); - ImportsManager manager = setImports(clazz); - - // extension for superclass - Iterator<ObjectModelClass> it = clazz.getSuperclasses().iterator(); - if (it.hasNext()) { - ObjectModelClass superclass = it.next(); - manager.addImport(superclass.getQualifiedName()); - } - } - - private ImportsManager setImports(ObjectModelClassifier classifier) { - ImportsManager manager = getImportsManager(classifier); - // attributes - for (ObjectModelAttribute attribute : classifier.getAttributes()) { - if (log.isInfoEnabled()) { - log.info("attribute add import for : " + attribute.getType()); - } - setImportsForType(manager, attribute.getType()); - setImportsForType(manager, attribute.getDefaultValue()); - } - // implemented interfaces - for (ObjectModelInterface interfacez : classifier.getInterfaces()) { - manager.addImport(interfacez.getQualifiedName()); - } - // operations - for (ObjectModelOperation operation : classifier.getOperations()) { - setImportsForType(manager, operation.getReturnType()); - for (ObjectModelParameter parameter : operation.getParameters()) { - setImportsForType(manager, parameter.getType()); - } - } - return manager; - } - - private void setImportsForType(ImportsManager manager, String type) { - for (String oneType : GeneratorUtil.getTypesList(type)) { - manager.addImport(oneType); - } - } - - public void build() { - - } - - public void build(ObjectModel objectModel) { - this.objectModel = (ObjectModelImpl)objectModel; - //initFiles(); - build(); // Ajout elements, ... - - //String filename = getFilenameForModel(objectModel); - buildFromElement(objectModel, ObjectModelType.OBJECT_MODEL); - - buildFromElements(objectModel.getClassifiers(), - ObjectModelType.OBJECT_MODEL_CLASSIFIER); - - buildFromElements(objectModel.getInterfaces(), - ObjectModelType.OBJECT_MODEL_INTERFACE); - - buildFromElements(objectModel.getClasses(), - ObjectModelType.OBJECT_MODEL_CLASS); - - buildFromElements(objectModel.getEnumerations(), - ObjectModelType.OBJECT_MODEL_ENUMERATION); - - } - - private void buildFromElements(Collection<? extends ObjectModelElement> elements, ObjectModelType type) { - for (ObjectModelElement element : elements) { - buildFromElement(element, type); - } - } - - protected void buildFromElement(Object element, ObjectModelType type) { - switch (type) { - case OBJECT_MODEL: - buildFromModel((ObjectModel)element); - break; - case OBJECT_MODEL_CLASSIFIER: - buildFromClassifier((ObjectModelClassifier)element); - break; - case OBJECT_MODEL_INTERFACE: - buildFromInterface((ObjectModelInterface)element); - break; - case OBJECT_MODEL_CLASS: - buildFromClass((ObjectModelClass)element); - break; - case OBJECT_MODEL_ENUMERATION: - buildFromEnumeration((ObjectModelEnumeration)element); - break; - } - } - - public void buildFromModel(ObjectModel model) { - - } - - public void buildFromClassifier(ObjectModelClassifier model) { - - } - - public void buildFromInterface(ObjectModelInterface model) { - - } - - public void buildFromClass(ObjectModelClass model) { - - } - - public void buildFromEnumeration(ObjectModelEnumeration model) { - - } -} Modified: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelGenerator.java =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelGenerator.java 2009-10-28 19:04:32 UTC (rev 665) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelGenerator.java 2009-10-28 19:04:40 UTC (rev 666) @@ -68,26 +68,20 @@ * * Mise a jour: $Date$ par : $Author$ */ -public class ObjectModelGenerator extends Generator<ObjectModel> { +public class ObjectModelGenerator extends AbstractGenerator<ObjectModel> { /** Logger for this class. */ private static Log log = LogFactory.getLog(ObjectModelGenerator.class); - protected ObjectModel model = null; public ObjectModelGenerator() { super(); } - public ObjectModelGenerator(Generator parent) { + public ObjectModelGenerator(AbstractGenerator<ObjectModel> parent) { super(parent); } - public ObjectModel getModel() { - return model; - } - - @Override @Deprecated public void generate(File[] files, File destDir) { @@ -112,13 +106,16 @@ * écrire alors le fichier sera généré. * @param model * @param destDir - * @throws IOException */@Override public void generate(ObjectModel model, File destDir) { // generateFromModel this.model = model; + if (log.isInfoEnabled()) { + log.info("inputModel : " + this.model); + } + //try { String filename = getFilenameForModel(model); generateFromElement(model, destDir, filename, Added: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelTransformer.java =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelTransformer.java (rev 0) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelTransformer.java 2009-10-28 19:04:40 UTC (rev 666) @@ -0,0 +1,221 @@ + +package org.nuiton.eugene; + +import org.nuiton.eugene.*; +import java.io.File; +import java.util.Collection; +import org.nuiton.eugene.models.Model; +import org.nuiton.eugene.models.object.ObjectModel; +import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelClassifier; +import org.nuiton.eugene.models.object.ObjectModelElement; +import org.nuiton.eugene.models.object.ObjectModelEnumeration; +import org.nuiton.eugene.models.object.ObjectModelInterface; + +/** + * ObjectModelTransformer + * + * Created: 28 oct. 2009 + * + * @param <O> + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public abstract class ObjectModelTransformer<O extends Model> extends Transformer<ObjectModel, O>{ + + public ObjectModelTransformer(Generator<O> output) { + super(output); + } + + protected abstract O initOutputModel(); + + /** + * 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)} puis boucle sur chaque + * interface en appelant a méthode + * {@link #generateFromInterface(Writer, ObjectModelInterface)} et enfin sur chaque + * énumération en appelant la méthode + * {@link #generateFromEnumeration(Writer, ObjectModelEnumeration)} + * 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 + */@Override + public void generate(ObjectModel model, File destDir) { + + // generateFromModel + this.model = model; // inputModel + initOutputModel(); + + //try { + //String filename = getFilenameForModel(model); + transformFromElement(model, ObjectModelType.OBJECT_MODEL); + + // generateFromClassifier + transformFromElements(model.getClassifiers(), ObjectModelType.OBJECT_MODEL_CLASSIFIER); + + // generateFromInterface + transformFromElements(model.getInterfaces(), ObjectModelType.OBJECT_MODEL_INTERFACE); + + // generateFromClass + transformFromElements(model.getClasses(), ObjectModelType.OBJECT_MODEL_CLASS); + + // generateFromEnumeration + transformFromElements(model.getEnumerations(), ObjectModelType.OBJECT_MODEL_ENUMERATION); + + /*} catch (IOException eee) { + if (log.isWarnEnabled()) { + log.warn("Unable to generate for file", eee); + } + }*/ + + outputGenerator.generate(getOutputModel(), destDir); + } + + /** + * Parcours une collection d'éléments pour la génération suivant un type d'éléments. + * Types possibles : ObjectModelClassifier, ObjectModelClass, ObjectModelInterface et + * ObjectModelEnumeration. + * Deux méthodes dépendent du type et peuvent être surchargées : + * getFilenameForXXX et generateFromXXX (XXX étant un type prédéfini pour une méthode existante). + * + * @see ObjectModelType + * + * @param elements Collection d'éléments d'un des types ci-dessus + * @param destDir dossier de destination pour le fichier généré + * @param type type explicite d'ObjectModel + */ + private void transformFromElements(Collection<? extends ObjectModelElement> elements, + ObjectModelType type) { + + for (ObjectModelElement element : elements) { + String filename = ""; + // Filename depends on type of element (Classifier, Class, Interface or Enumeration) + switch (type) { + case OBJECT_MODEL_CLASSIFIER: + filename = getFilenameForClassifier((ObjectModelClassifier)element); break; + case OBJECT_MODEL_INTERFACE: + filename = getFilenameForInterface((ObjectModelInterface)element); break; + case OBJECT_MODEL_CLASS: + filename = getFilenameForClass((ObjectModelClass)element); break; + case OBJECT_MODEL_ENUMERATION: + filename = getFilenameForEnumeration((ObjectModelEnumeration)element); + } + + transformFromElement(element, type); + } + } + + /** + * Génération pour un élément du modèle (ou le modèle lui-même). + * Types possibles : ObjectModel, ObjectModelClassifier, ObjectModelClass, + * ObjectModelInterface et ObjectModelEnumeration. + * La méthode generateFromXXX dépend du type d'élément et peut être surchargée. + * + * @see ObjectModelType + * + * @param element element à généré + * @param destDir dossier de destination + * @param filename nom du fichier de sortie + * @param type type d'ObjectModel + */ + protected void transformFromElement(Object element, ObjectModelType type) { + + switch (type) { + case OBJECT_MODEL: + transformFromModel((ObjectModel)element); + break; + case OBJECT_MODEL_CLASSIFIER: + transformFromClassifier((ObjectModelClassifier)element); + break; + case OBJECT_MODEL_INTERFACE: + transformFromInterface((ObjectModelInterface)element); + break; + case OBJECT_MODEL_CLASS: + transformFromClass((ObjectModelClass)element); + break; + case OBJECT_MODEL_ENUMERATION: + transformFromEnumeration((ObjectModelEnumeration)element); + break; + } + } + + /** + * Par defaut cette methode retourne le getName du model. Si l'on souhaite + * utiliser la methode generateFromModel il vaut mieux surcharger cette + * methode + * @param model + * @return + */ + 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 + * @param model + * @param packageName + * @return + */ + 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 + * @param interfacez + * @return + */ + 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 + * @param clazz + * @return + */ + 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 + * @param clazz + * @return + */ + public String getFilenameForClassifier(ObjectModelClassifier clazz) { + return clazz.getQualifiedName().replace('.', File.separatorChar); + } + + public String getFilenameForEnumeration(ObjectModelEnumeration enumeration) { + return enumeration.getQualifiedName().replace('.', File.separatorChar); + } + + public void transformFromModel(ObjectModel model) { + } + + public void transformFromInterface(ObjectModelInterface interfacez) { + } + + public void transformFromClass(ObjectModelClass clazz) { + } + + public void transformFromClassifier(ObjectModelClassifier clazz) { + } + + public void transformFromEnumeration(ObjectModelEnumeration enumeration) { + } + +} Modified: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/StateModelGenerator.java =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/StateModelGenerator.java 2009-10-28 19:04:32 UTC (rev 665) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/StateModelGenerator.java 2009-10-28 19:04:40 UTC (rev 666) @@ -46,18 +46,16 @@ * * Last update : $Date$ By : $Author$ */ -public class StateModelGenerator extends Generator<StateModel> { +public class StateModelGenerator extends AbstractGenerator<StateModel> { /** Logger for this class */ private static Log log = LogFactory.getLog(StateModelGenerator.class); - /** Model */ - protected StateModel model; - /** * Empty constructor */ public StateModelGenerator() { + super(); } /** @@ -65,17 +63,10 @@ * * @param parent parent generator */ - public StateModelGenerator(Generator parent) { + public StateModelGenerator(AbstractGenerator<StateModel> parent) { super(parent); } - /** - * @return the model - */ - public StateModel getModel() { - return model; - } - /* * @see org.nuiton.eugene.Generator#generate(java.io.File[], java.io.File) */ Added: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/Transformer.java =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/Transformer.java (rev 0) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/Transformer.java 2009-10-28 19:04:40 UTC (rev 666) @@ -0,0 +1,84 @@ + +package org.nuiton.eugene; + +import org.nuiton.eugene.*; +import java.io.File; +import java.util.List; +import java.util.Properties; +import org.nuiton.eugene.models.Model; + +/** + * Transformer + * + * Created: 28 oct. 2009 + * + * @param <I> input model to transform + * @param <O> output model transformed + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public abstract class Transformer<I extends Model, O extends Model> extends Generator<I> { + + protected Generator<O> outputGenerator; + + protected O outputModel; + + public Transformer(Generator<O> outputGenerator) { + super(); + this.outputGenerator = outputGenerator; + } + + @Override + public void setOverwrite(boolean v) { + outputGenerator.setOverwrite(v); + } + + @Override + public void setEncoding(String encoding) { + outputGenerator.setEncoding(encoding); + } + + @Override + public void setProperties(Properties p) { + outputGenerator.setProperties(p); + } + + /** + * Set list of package to allow generation. + * + * If {@code null} or empty, generate all packages. + * + * @param generatedPackages list of package to generate + */ + @Override + public void setGeneratedPackages(List<String> generatedPackages) { + outputGenerator.setGeneratedPackages(generatedPackages); + } + + @Override + public void setLastModifiedSource(long lastModifiedSource) { + outputGenerator.setLastModifiedSource(lastModifiedSource); + } + + @Override + public void setExcludeTemplates(List<String> excludeTemplates) { + outputGenerator.setExcludeTemplates(excludeTemplates); + } + + public Generator<O> getOutputGenerator() { + return this.outputGenerator; + } + + public O getOutputModel() { + return this.outputModel; + } + + @Override + @Deprecated + public void generate(File[] file, File destDir) { + getOutputGenerator().generate(file, destDir); + } +} Deleted: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelBuilderHelper.java =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelBuilderHelper.java 2009-10-28 19:04:32 UTC (rev 665) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelBuilderHelper.java 2009-10-28 19:04:40 UTC (rev 666) @@ -1,131 +0,0 @@ -/* *##% - * Copyright (c) 2009 poussin. All rights reserved. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - *##%*/ - -package org.nuiton.eugene.models.object; - - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.eugene.models.object.xml.ObjectModelAttributeImpl; -import org.nuiton.eugene.models.object.xml.ObjectModelClassImpl; -import org.nuiton.eugene.models.object.xml.ObjectModelClassifierImpl; -import org.nuiton.eugene.models.object.xml.ObjectModelInterfaceImpl; -import org.nuiton.eugene.models.object.xml.ObjectModelOperationImpl; -import org.nuiton.eugene.models.object.xml.ObjectModelParameterImpl; - -/** - * class that help to build java class or interface object. - * - * - * @author poussin - * @version $Revision$ - * - * Last update: $Date$ - * by : $Author$ - */ -public class ObjectModelBuilderHelper { - - public static final boolean PROP_SET_STATIC = true; - public static final boolean PROP_SET_NO_STATIC = false; - - /** to use log facility, just put in your code: log.info(\"...\"); */ - static private Log log = LogFactory.getLog(ObjectModelBuilderHelper.class); - - public ObjectModelClass createClass(String name, String packageName) { - ObjectModelClassImpl result = new ObjectModelClassImpl(); - result.setName(name); - result.setPackage(packageName); - return result; - } - - public ObjectModelClass createAbstractClass(String name, String packageName) { - ObjectModelClassImpl result = (ObjectModelClassImpl) createClass(name,packageName); - result.setAbstract(true); - return result; - } - - public ObjectModelInterface createInterface(String name, String packageName) { - ObjectModelInterfaceImpl result = new ObjectModelInterfaceImpl(); - result.setName(name); - result.setPackage(packageName); - return result; - } - - public ObjectModelAttribute addAttribute(ObjectModelClassifier classifier, String name, String type, String value, - String visibility, boolean isStatic, boolean isFinal) { - ObjectModelAttributeImpl attribute = new ObjectModelAttributeImpl(); - attribute.setFinal(isFinal); - attribute.setDefaultValue(value); - attribute.setName(name); - attribute.setStatic(isStatic); - attribute.setType(type); - attribute.setVisibility(visibility); - - ObjectModelClassifierImpl classifierImpl = (ObjectModelClassifierImpl)classifier; - classifierImpl.addAttribute(attribute); - return attribute; - } - - public ObjectModelAttribute addConstant(ObjectModelClassifier classifier, String name, String type, String value, String visibility) { - return addAttribute(classifier, name, type, value, visibility, true, true); - } - - public ObjectModelAttribute addAttribute(ObjectModelClassifier classifier, String name, String type, String value) { - return addAttribute(classifier, name, type, value, "protected", false, false); - } - - public ObjectModelAttribute addAttribute(ObjectModelClassifier classifier, String name, String type) { - return addAttribute(classifier, name, type, "", "protected", false, false); - } - - public ObjectModelOperation addOperation(ObjectModelClassifier clazz, - String name, String returnType, String... inputParameters) { - ObjectModelOperationImpl result = new ObjectModelOperationImpl(); - result.setName(name); - - result.setName(name); - result.setVisibility("public"); - ObjectModelParameterImpl returnParameter = new ObjectModelParameterImpl(); - if (returnType == null) { - returnType = "void"; - } - returnParameter.setType(returnType); - - result.setReturnParameter(returnParameter); - - int nbParameters = inputParameters.length; - if (nbParameters %2 != 0) { - throw new IllegalArgumentException("Unccorect number of parameters (" + nbParameters + ") : " + - "each inputParameter must have name and type"); - } - for (int i = 0; i < inputParameters.length; i+=2) { - ObjectModelParameterImpl parameter = new ObjectModelParameterImpl(); - parameter.setType(inputParameters[i]); - parameter.setName(inputParameters[i+1]); - //importsManager.addImport(inputParameters[i+1]); - result.addParameter(parameter); - } - - ((ObjectModelClassifierImpl)clazz).addOperation(result); - return result; - } - - public void setOperationBody(ObjectModelOperation operation, String body) { - ObjectModelOperationImpl operationImpl = (ObjectModelOperationImpl) operation; - operationImpl.setBodyCode(body); - } -} Copied: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/builder/JavaBuilder.java (from rev 662, branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/JavaBuilder.java) =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/builder/JavaBuilder.java (rev 0) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/builder/JavaBuilder.java 2009-10-28 19:04:40 UTC (rev 666) @@ -0,0 +1,109 @@ + +package org.nuiton.eugene.models.object.builder; + +import org.nuiton.eugene.*; +import java.util.Collection; +import java.util.Iterator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.models.object.ObjectModel; +import org.nuiton.eugene.models.object.ObjectModelAttribute; +import org.nuiton.eugene.models.object.xml.ObjectModelBuilderHelper; +import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelClassifier; +import org.nuiton.eugene.models.object.ObjectModelElement; +import org.nuiton.eugene.models.object.ObjectModelEnumeration; +import org.nuiton.eugene.models.object.ObjectModelInterface; +import org.nuiton.eugene.models.object.ObjectModelOperation; +import org.nuiton.eugene.models.object.ObjectModelParameter; +import org.nuiton.eugene.models.object.xml.ObjectModelClassImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelImpl; + +/** + * + * @author fdesbois + */ +public abstract class JavaBuilder { + + private static final Log log = LogFactory.getLog(JavaBuilder.class); + + protected ObjectModelImpl objectModel; + + private static ObjectModelBuilderHelper helper = new ObjectModelBuilderHelper(); + + public JavaBuilder(String modelName) { + this.objectModel = new ObjectModelImpl(); + this.objectModel.setName(modelName); + } + + public ObjectModel getModel() { + return objectModel; + } + + public ObjectModelBuilderHelper getHelper() { + return helper; + } + + protected ImportsManager getImportsManager(ObjectModelClassifier classifier) { + ImportsManager manager = objectModel.getExtension(classifier.getQualifiedName(), ImportsManager.class); + if (manager == null) { + manager = new ImportsManager(); + objectModel.addExtension(classifier.getQualifiedName(), manager); + } + return manager; + } + + public void addImportForClassifier(ObjectModelClassifier classifier, String imports) { + ImportsManager manager = getImportsManager(classifier); + manager.addImport(imports); + } + + public void addImportForClassifier(ObjectModelClassifier classifier, Class<?> imports) { + ImportsManager manager = getImportsManager(classifier); + manager.addImport(imports); + } + + public void addClassToModel(ObjectModelClass clazz) { + objectModel.addClass((ObjectModelClassImpl)clazz); + ImportsManager manager = setImports(clazz); + + // extension for superclass + Iterator<ObjectModelClass> it = clazz.getSuperclasses().iterator(); + if (it.hasNext()) { + ObjectModelClass superclass = it.next(); + manager.addImport(superclass.getQualifiedName()); + } + } + + private ImportsManager setImports(ObjectModelClassifier classifier) { + ImportsManager manager = getImportsManager(classifier); + // attributes + for (ObjectModelAttribute attribute : classifier.getAttributes()) { + if (log.isInfoEnabled()) { + log.info("attribute add import for : " + attribute.getType()); + } + setImportsForType(manager, attribute.getType()); + setImportsForType(manager, attribute.getDefaultValue()); + } + // implemented interfaces + for (ObjectModelInterface interfacez : classifier.getInterfaces()) { + manager.addImport(interfacez.getQualifiedName()); + } + // operations + for (ObjectModelOperation operation : classifier.getOperations()) { + setImportsForType(manager, operation.getReturnType()); + for (ObjectModelParameter parameter : operation.getParameters()) { + setImportsForType(manager, parameter.getType()); + } + } + return manager; + } + + private void setImportsForType(ImportsManager manager, String type) { + for (String oneType : GeneratorUtil.getTypesList(type)) { + manager.addImport(oneType); + } + } + + public abstract void build(); +} Property changes on: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/builder/JavaBuilder.java ___________________________________________________________________ Added: svn:mergeinfo + Copied: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelBuilderHelper.java (from rev 653, branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelBuilderHelper.java) =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelBuilderHelper.java (rev 0) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelBuilderHelper.java 2009-10-28 19:04:40 UTC (rev 666) @@ -0,0 +1,167 @@ +/* *##% + * Copyright (c) 2009 poussin. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + *##%*/ + +package org.nuiton.eugene.models.object.xml; + + +import org.nuiton.eugene.models.object.*; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.models.object.xml.ObjectModelAttributeImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelClassImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelClassifierImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelImplRef; +import org.nuiton.eugene.models.object.xml.ObjectModelInterfaceImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelOperationImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelParameterImpl; + +/** + * class that help to build java class or interface object. + * + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class ObjectModelBuilderHelper { + + public static final boolean PROP_SET_STATIC = true; + public static final boolean PROP_SET_NO_STATIC = false; + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(ObjectModelBuilderHelper.class); + + public ObjectModelClass createClass(String name, String packageName) { + ObjectModelClassImpl result = new ObjectModelClassImpl(); + result.setName(name); + result.setPackage(packageName); + return result; + } + + public ObjectModelClass createAbstractClass(String name, String packageName) { + ObjectModelClassImpl result = (ObjectModelClassImpl) createClass(name,packageName); + result.setAbstract(true); + return result; + } + + public ObjectModelInterface createInterface(String name, String packageName) { + ObjectModelInterfaceImpl result = new ObjectModelInterfaceImpl(); + result.setName(name); + result.setPackage(packageName); + return result; + } + + public ObjectModelAttribute addAttribute(ObjectModelClassifier classifier, String name, String type, String value, + String visibility, boolean isStatic, boolean isFinal) { + ObjectModelAttributeImpl attribute = new ObjectModelAttributeImpl(); + attribute.setFinal(isFinal); + attribute.setDefaultValue(value); + attribute.setName(name); + attribute.setStatic(isStatic); + attribute.setType(type); + attribute.setVisibility(visibility); + + ObjectModelClassifierImpl classifierImpl = (ObjectModelClassifierImpl)classifier; + classifierImpl.addAttribute(attribute); + return attribute; + } + + public ObjectModelAttribute addConstant(ObjectModelClassifier classifier, String name, String type, String value, String visibility) { + return addAttribute(classifier, name, type, value, visibility, true, true); + } + + public ObjectModelAttribute addAttribute(ObjectModelClassifier classifier, String name, String type, String value) { + return addAttribute(classifier, name, type, value, "protected", false, false); + } + + public ObjectModelAttribute addAttribute(ObjectModelClassifier classifier, String name, String type) { + return addAttribute(classifier, name, type, "", "protected", false, false); + } + + public ObjectModelOperation addOperation(ObjectModelClassifier clazz, + String name, String returnType, String... inputParameters) { + ObjectModelOperationImpl result = new ObjectModelOperationImpl(); + result.setName(name); + + result.setName(name); + result.setVisibility("public"); + ObjectModelParameterImpl returnParameter = new ObjectModelParameterImpl(); + if (returnType == null) { + returnType = "void"; + } + returnParameter.setType(returnType); + + result.setReturnParameter(returnParameter); + + int nbParameters = inputParameters.length; + if (nbParameters %2 != 0) { + throw new IllegalArgumentException("Unccorect number of parameters (" + nbParameters + ") : " + + "each inputParameter must have name and type"); + } + for (int i = 0; i < inputParameters.length; i+=2) { + ObjectModelParameterImpl parameter = new ObjectModelParameterImpl(); + parameter.setType(inputParameters[i]); + parameter.setName(inputParameters[i+1]); + //importsManager.addImport(inputParameters[i+1]); + result.addParameter(parameter); + } + + ((ObjectModelClassifierImpl)clazz).addOperation(result); + return result; + } + + public void setOperationBody(ObjectModelOperation operation, String body) { + ObjectModelOperationImpl operationImpl = (ObjectModelOperationImpl) operation; + operationImpl.setBodyCode(body); + } + + public void addInterface(ObjectModelClassifier classifier, String interfaceQualifiedName) { + ObjectModelClassifierImpl impl = (ObjectModelClassifierImpl) classifier; + + ObjectModelImplRef interfacez = new ObjectModelImplRef(); + interfacez.setName(interfaceQualifiedName); + + impl.addInterface(interfacez); + } + + public void addSuperclass(ObjectModelClass clazz, String superclassQualifiedName) { + ObjectModelClassImpl impl = (ObjectModelClassImpl) clazz; + + ObjectModelImplRef superclass = new ObjectModelImplRef(); + superclass.setName(superclassQualifiedName); + + impl.addSuperclass(superclass); + } + + public ObjectModelParameter addParameter(ObjectModelOperation operation, String type, String name) { + ObjectModelOperationImpl impl = (ObjectModelOperationImpl) operation; + ObjectModelParameterImpl param = new ObjectModelParameterImpl(); + param.setType(type); + param.setName(name); + impl.addParameter(param); + return param; + } + + public void addException(ObjectModelOperation operation, String exception) { + ObjectModelOperationImpl impl = (ObjectModelOperationImpl) operation; + ObjectModelParameterImpl param = new ObjectModelParameterImpl(); + param.setType(exception); + impl.addExceptionParameter(param); + } +} Modified: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassifierImpl.java =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassifierImpl.java 2009-10-28 19:04:32 UTC (rev 665) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassifierImpl.java 2009-10-28 19:04:40 UTC (rev 666) @@ -133,7 +133,20 @@ if (interfaces == null) { interfaces = new ArrayList<ObjectModelInterface>(); for(ObjectModelImplRef ref : interfacesRefs) { - interfaces.add(objectModelImpl.getInterface(ref.getName())); + // QUICK FIX for interface not include in the model (ex : Serializable) + ObjectModelInterfaceImpl interfacez = + (ObjectModelInterfaceImpl)objectModelImpl.getInterface(ref.getName()); + if (interfacez == null) { + interfacez = new ObjectModelInterfaceImpl(); + String fqn = ref.getName(); + int index = fqn.indexOf("."); + String packageName = fqn.substring(0, index); + String name = fqn.substring(index+1); + interfacez.setName(name); + interfacez.setPackage(packageName); + interfacez.postInit(); // to create qualifiedName + } + interfaces.add(interfacez); } } return interfaces; Modified: branches/1.1.0-Javabuilder/eugene/src/test/resources/log4j.properties =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/test/resources/log4j.properties 2009-10-28 19:04:32 UTC (rev 665) +++ branches/1.1.0-Javabuilder/eugene/src/test/resources/log4j.properties 2009-10-28 19:04:40 UTC (rev 666) @@ -7,5 +7,5 @@ log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) %M - %m%n # package level -log4j.logger.org.nuiton.eugene=INFO +log4j.logger.org.nuiton.eugene=DEBUG log4j.logger.org.apache.commons.digester=INFO \ No newline at end of file Modified: branches/1.1.0-Javabuilder/eugene-test/pom.xml =================================================================== --- branches/1.1.0-Javabuilder/eugene-test/pom.xml 2009-10-28 19:04:32 UTC (rev 665) +++ branches/1.1.0-Javabuilder/eugene-test/pom.xml 2009-10-28 19:04:40 UTC (rev 666) @@ -93,8 +93,8 @@ <artifactId>maven-eugene-plugin</artifactId> <version>${project.version}</version> <executions> - <execution> - <id>Test Generator</id> + <!--execution> + <id>Test Regression Generator</id> <phase>generate-test-sources</phase> <configuration> <reader>org.nuiton.eugene.ObjectModelReader</reader> @@ -109,14 +109,14 @@ <goals> <goal>generate</goal> </goals> - </execution> + </execution--> <execution> <id>Test Java Generator</id> <phase>generate-test-sources</phase> <configuration> <reader>org.nuiton.eugene.test.generator.TestReader</reader> <includes>**/*.objectmodel</includes> - <templates>org.nuiton.eugene.test.generator.JavaGenerator</templates> + <templates>org.nuiton.eugene.java.JavaGenerator</templates> <defaultPackage>org.nuiton.eugene.test</defaultPackage> <extraClassPathDirectory>target/classes</extraClassPathDirectory> <generateResources> @@ -127,6 +127,23 @@ <goal>generate</goal> </goals> </execution> + <execution> + <id>Test Bean Transformer</id> + <phase>generate-test-sources</phase> + <configuration> + <reader>org.nuiton.eugene.ObjectModelReader</reader> + <includes>**/*.objectmodel</includes> + <templates>org.nuiton.eugene.test.generator.BeanTransformer</templates> + <defaultPackage>org.nuiton.eugene.test</defaultPackage> + <extraClassPathDirectory>target/classes</extraClassPathDirectory> + <generateResources> + <input>src/main/models</input> + </generateResources> + </configuration> + <goals> + <goal>generate</goal> + </goals> + </execution> </executions> </plugin> Added: branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/JavaBuilderHelper.java =================================================================== --- branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/JavaBuilderHelper.java (rev 0) +++ branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/JavaBuilderHelper.java 2009-10-28 19:04:40 UTC (rev 666) @@ -0,0 +1,204 @@ + +package org.nuiton.eugene.java; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.models.object.ObjectModelAttribute; +import org.nuiton.eugene.models.object.xml.ObjectModelBuilderHelper; +import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelClassifier; +import org.nuiton.eugene.models.object.ObjectModelOperation; +import org.nuiton.eugene.models.object.xml.ObjectModelAttributeImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelClassImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelClassifierImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelOperationImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelParameterImpl; + +/** + * JavaBuilderHelper + * + * Created: 28 oct. 2009 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public class JavaBuilderHelper extends ObjectModelBuilderHelper { + + private static final Log log = LogFactory.getLog(JavaBuilderHelper.class); + + /** + * Add attribute to a classifier with properties in parse string. + * Use java syntax to define properties of the attribute : + * ex : "public static final java.util.Date maDate = new java.util.Date()" + * @param classifier the classifier to add the attribute + * @param parse the properties of the attribute to parse + * @return a new ObjectModelAttribute corresponding to the new attribute added to the classifier + */ + public ObjectModelAttribute addAttribute(ObjectModelClassifier classifier, String parse) { + ObjectModelAttributeImpl attribute = new ObjectModelAttributeImpl(); + + // Visibility + if (parse.contains("public ")) { + attribute.setVisibility("public"); + parse = parse.replace("public ", ""); + } else if (parse.contains("protected ")) { + attribute.setVisibility("protected"); + parse = parse.replace("protected ", ""); + } else if (parse.contains("private ")) { + attribute.setVisibility("private"); + parse = parse.replace("private ", ""); + } else { + attribute.setVisibility(""); + } + + // Static + if (parse.contains("static ")) { + attribute.setStatic(true); + parse = parse.replace("static ", ""); + } + // Final + if (parse.contains("final ")) { + attribute.setFinal(true); + parse = parse.replace("final ", ""); + } + + // Type + int typeIndex = parse.indexOf(" "); + String type = parse.substring(0, typeIndex).trim(); + attribute.setType(type); + parse = parse.substring(typeIndex+1); + + // Name + int nameIndex = parse.indexOf("="); + String name = ""; + if (nameIndex != -1) { + name = parse.substring(0, nameIndex).trim(); + parse = parse.substring(nameIndex); + + // DefaultValue + int equalsIndex = parse.indexOf("="); + String value = parse.substring(equalsIndex+1).trim(); + attribute.setDefaultValue(value); + + } else { // Il ne reste que le nom si pas de = + name = parse; + } + attribute.setName(name); + + ObjectModelClassifierImpl classifierImpl = (ObjectModelClassifierImpl)classifier; + classifierImpl.addAttribute(attribute); + return attribute; + } + + public ObjectModelOperation addOperation(ObjectModelClassifier classifier, String parse) + throws IllegalArgumentException{ + ObjectModelOperationImpl operation = new ObjectModelOperationImpl(); + String result = ""; + + try { + // Visibility + if (parse.contains("public ")) { + operation.setVisibility("public"); + result = parse.replace("public ", ""); + } else if (parse.contains("protected ")) { + operation.setVisibility("protected"); + result = parse.replace("protected ", ""); + } else if (parse.contains("private ")) { + operation.setVisibility("private"); + result = parse.replace("private ", ""); + } else { + operation.setVisibility(""); + } + + // Static + if (result.contains("static ")) { + operation.setStatic(true); + result = result.replace("static ", ""); + } + // Abstract + if (result.contains("abstract ")) { + operation.setAbstract(true); + result = result.replace("abstract ", ""); + } + + // Return Parameter + int typeIndex = result.indexOf(" "); + String type = result.substring(0, typeIndex).trim(); + ObjectModelParameterImpl returnParameter = new ObjectModelParameterImpl(); + returnParameter.setType(type); + operation.setReturnParameter(returnParameter); + result = result.substring(typeIndex + 1); + + if (log.isDebugEnabled()) { + log.debug("parse before name : " + result); + } + + int nameIndex = result.indexOf("("); + String methodName = ""; + if (nameIndex != -1) { + methodName = result.substring(0, nameIndex).trim(); + result = result.substring(nameIndex); + + // Input parameters + if (result.contains("(")) { + int parentheseIndex = result.indexOf("("); + int parentheseEndIndex = result.indexOf(")"); + result = result.substring(parentheseIndex + 1, parentheseEndIndex); + + String paramName = ""; + for (String param : result.split(",")) { + typeIndex = param.indexOf(" "); + type = param.substring(0, typeIndex).trim(); + paramName = param.substring(typeIndex + 1).trim(); + + ObjectModelParameterImpl parameter = new ObjectModelParameterImpl(); + parameter.setType(type); + parameter.setName(paramName); + operation.addParameter(parameter); + } + } + + } else { // Il ne reste que le nom si pas de ( + methodName = result; + } + operation.setName(methodName); + + ObjectModelClassifierImpl classifierImpl = (ObjectModelClassifierImpl) classifier; + classifierImpl.addOperation(operation); + } catch (StringIndexOutOfBoundsException eee) { + throw new IllegalArgumentException("Can't add Operation : Illegal parse parameter : " + + "input = " + parse + " _ current = " + result, eee); + } + return operation; + } + + public ObjectModelAttribute addAttribute(ObjectModelClassifier classifier, ObjectModelAttribute attribute) { + ObjectModelAttributeImpl impl = new ObjectModelAttributeImpl(); + impl.setType(attribute.getType()); + impl.setName(attribute.getName()); + impl.setVisibility(attribute.getVisibility()); + impl.setFinal(attribute.isFinal()); + impl.setStatic(attribute.isStatic()); + impl.setDefaultValue(attribute.getDefaultValue()); + return impl; + } + + public void setSuperClass(ObjectModelClass classifier, String superclassQualifiedName) { + ObjectModelClassImpl impl = (ObjectModelClassImpl)classifier; + impl.getSuperclasses().clear(); + addSuperclass(impl, superclassQualifiedName); + } + + public ObjectModelOperation addConstructor(ObjectModelClass clazz, String visibility) { + ObjectModelOperationImpl operation = new ObjectModelOperationImpl(); + operation.setVisibility(visibility); + operation.setName(clazz.getName()); + + ObjectModelClassImpl classifierImpl = (ObjectModelClassImpl)clazz; + classifierImpl.addOperation(operation); + return operation; + } +} Copied: branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/JavaGenerator.java (from rev 662, branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/JavaGenerator.java) =================================================================== --- branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/JavaGenerator.java (rev 0) +++ branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/JavaGenerator.java 2009-10-28 19:04:40 UTC (rev 666) @@ -0,0 +1,205 @@ + +package org.nuiton.eugene.java; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.Collection; +import java.util.Iterator; +import java.util.Set; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.ImportsManager; +import org.nuiton.eugene.ObjectModelGenerator; +import org.nuiton.eugene.models.object.ObjectModelAttribute; +import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelClassifier; +import org.nuiton.eugene.models.object.ObjectModelInterface; +import org.nuiton.eugene.models.object.ObjectModelOperation; +import org.nuiton.eugene.models.object.ObjectModelParameter; + +/*{generator option: parentheses = true}*/ +/*{generator option: writeString = output.write}*/ +/** + * JavaGenerator + * + * Created: 22 oct. 2009 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public class JavaGenerator extends ObjectModelGenerator { + + private static final Log log = LogFactory.getLog(JavaGenerator.class); + + @Override + public String getFilenameForClass(ObjectModelClass clazz) { + return clazz.getQualifiedName().replace('.', File.separatorChar) + ".java";//return clazz.getName() + ".java"; + } + + @Override + public void generateFromClass(Writer output, ObjectModelClass clazz) throws IOException { + + if (log.isInfoEnabled()) { + log.info("generate : " + clazz.getName()); + } + + this.generateHeader(output, clazz); // Imports, package et documentation + + String abstractStr = clazz.isAbstract() ? " abstract " : " "; + String className = clazz.getName(); + + String extend = ""; + Iterator<ObjectModelClass> j = clazz.getSuperclasses().iterator(); + if (j.hasNext()) { + ObjectModelClassifier p = j.next(); + extend += p.getName(); + } + + String implement = ""; + for (Iterator<ObjectModelInterface> i = clazz.getInterfaces().iterator(); i.hasNext();) { + ObjectModelClassifier parentInterface = i.next(); + implement += parentInterface.getName(); + if (i.hasNext()) { + implement += ", "; + } + } + +/*{ +public<%=abstractStr%>class <%=className%>}*/ + +/* + * Définition de la super classe : il ne doit y avoir qu'une + */ + if (extend.length() > 0) { +/*{ extends <%=extend%>}*/ + } + + if (implement.length() > 0) { +/*{ implements <%=implement%> { + +}*/ + } else { + /*{ { + +}*/ + } + + this.generateAttributes(output, clazz.getAttributes()); + this.generateOperations(output, clazz.getOperations()); +/*{ +} //<%=clazz.getName()%> +}*/ + } + + protected void generateHeader(Writer output, ObjectModelClassifier classifier) throws IOException { + + String packageName = classifier.getPackageName(); +/*{package <%=packageName%>; + +}*/ + // potentiel crash si imports non defini + // dans ce cas, probleme de config utilisateur ! obligation de passer par un builder ? + ImportsManager manager = getModel().getExtension(classifier.getQualifiedName(), ImportsManager.class); + for (String imports : manager.getImports(classifier.getPackageName())) { +/*{import <%=imports%>; + }*/ + } + + } + + protected void generateAttributes(Writer output, Collection<ObjectModelAttribute> attributes) throws IOException { + + for (ObjectModelAttribute attr : attributes) { + + if (attr.getDocumentation() != null && !attr.getDocumentation().isEmpty()) { +/*{ /** + * <%=attr.getDocumentation()%> + *) +}*/ + } + +// String annotation = attr.getTagValue(TAG_ANNOTATION); +// if (annotation != null && annotation.length() > 0) { +///* <%=annotation%> +//*/ +// } + + String attrName = attr.getName(); + String attrVisibility = attr.getVisibility(); + String attrType = GeneratorUtil.getSimpleName(attr.getType()); + String attrStatic = attr.isStatic() ? " static " : " "; + String attrFinal = attr.isFinal() ? " final " : " "; + String attrValue = attr.getDefaultValue() != null && !attr.getDefaultValue().isEmpty() ? + " = " + GeneratorUtil.getSimpleName(attr.getDefaultValue()) : ""; + +/*{ <%=attrVisibility%><%=attrStatic%><%=attrFinal%><%=attrType%> <%=attrName%><%=attrValue%>; +}*/ + } + } + + protected void generateOperations(Writer output, Collection<ObjectModelOperation> operations) throws IOException { + for (ObjectModelOperation op : operations) { + String opName = op.getName(); +/*{ /** +}*/ + if (op.getDocumentation() != null && !op.getDocumentation().isEmpty()) { + String opDocumentation = op.getDocumentation(); +/*{ * <%=opName%> : <%=opDocumentation%> +}*/ + } + Collection<ObjectModelParameter> params = op.getParameters(); + for (ObjectModelParameter param : params) { + String paramName = param.getName(); + String paramDocumentation = param.getDocumentation(); +/*{ * @param <%=paramName%> <%=paramDocumentation%> + }*/ + } + String opVisibility = op.getVisibility(); + String opStatic = op.isStatic() ? "static " : ""; + String opAbstract = op.isAbstract() ? " abstract " : ""; + + ObjectModelParameter returnParam = op.getReturnParameter(); + String opReturn = ""; + if (returnParam != null) { + opReturn = GeneratorUtil.getSimpleName(returnParam.getType()); + if (!opReturn.equals("void")) { + String paramDocumentation = returnParam.getDocumentation(); +/*{ * @return <%=paramDocumentation%> + }*/ + } + } +/*{ *) + <%=opVisibility%> <%=opStatic%><%=opAbstract%><%=opReturn%> <%=opName%>(}*/ + String comma = ""; + for (ObjectModelParameter param : params) { + String paramName = param.getName(); + String paramType = GeneratorUtil.getSimpleName(param.getType()); +/*{<%=comma%><%=paramType%> <%=paramName%>}*/ + comma = ", "; + } +/*{)}*/ + Set<String> exceptions = op.getExceptions(); + comma = " throws "; + for (String exception : exceptions) { +/*{<%=comma%><%=exception%>}*/ + comma = ", "; + } + + if (!op.getBodyCode().isEmpty()) { +/*{ {<%=op.getBodyCode()%>} + +}*/ + } else { +/*{; + +}*/ + } + } + } + +} Property changes on: branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/JavaGenerator.java ___________________________________________________________________ Added: svn:mergeinfo + Added: branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/OM2JavaTransformer.java =================================================================== --- branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/OM2JavaTransformer.java (rev 0) +++ branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/java/OM2JavaTransformer.java 2009-10-28 19:04:40 UTC (rev 666) @@ -0,0 +1,161 @@ + +package org.nuiton.eugene.java; + +import org.nuiton.eugene.ObjectModelTransformer; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.ImportsManager; +import org.nuiton.eugene.models.object.ObjectModel; +import org.nuiton.eugene.models.object.ObjectModelAttribute; +import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelClassifier; +import org.nuiton.eugene.models.object.ObjectModelOperation; +import org.nuiton.eugene.models.object.ObjectModelParameter; +import org.nuiton.eugene.models.object.xml.ObjectModelClassImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelImpl; + +/** + * OM2JavaTransformer + * + * Created: 28 oct. 2009 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public class OM2JavaTransformer extends ObjectModelTransformer<ObjectModel> { + + private static final Log log = LogFactory.getLog(OM2JavaTransformer.class); + + protected ObjectModelImpl outputModel; + + private static JavaBuilderHelper helper = new JavaBuilderHelper(); + + public OM2JavaTransformer() { + super(new JavaGenerator()); + this.outputModel = new ObjectModelImpl(); + } + + @Override + protected ObjectModel initOutputModel() { + if (log.isInfoEnabled()) { + log.info("inputModelName = " + getModel().getName()); + } + outputModel.setName(getModel().getName()); + return outputModel; + } + + @Override + public ObjectModel getOutputModel() { + return this.outputModel; + } + + public JavaBuilderHelper getHelper() { + return helper; + } + + protected ImportsManager getImportsManager(ObjectModelClassifier classifier) { + ImportsManager manager = outputModel.getExtension(classifier.getQualifiedName(), ImportsManager.class); + if (manager == null) { + manager = new ImportsManager(); + outputModel.addExtension(classifier.getQualifiedName(), manager); + } + return manager; + } + + protected void addImportForClassifier(ObjectModelClassifier classifier, String imports) { + ImportsManager manager = getImportsManager(classifier); + manager.addImport(imports); + } + + protected void addImportForClassifier(ObjectModelClassifier classifier, Class<?> imports) { + ImportsManager manager = getImportsManager(classifier); + manager.addImport(imports); + } + + protected void addClassToModel(ObjectModelClass clazz) { + outputModel.addClass((ObjectModelClassImpl)clazz); + //ImportsManager manager = setImports(clazz); + + // extension for superclass + /*Iterator<ObjectModelClass> it = clazz.getSuperclasses().iterator(); + if (it.hasNext()) { + ObjectModelClass superclass = it.next(); + manager.addImport(superclass.getQualifiedName()); + }*/ + } + + /*private ImportsManager setImports(ObjectModelClassifier classifier) { + ImportsManager manager = getImportsManager(classifier); + // attributes + for (ObjectModelAttribute attribute : classifier.getAttributes()) { + if (log.isInfoEnabled()) { + log.info("attribute add import for : " + attribute.getType()); + } + setImportsForType(manager, attribute.getType()); + setImportsForType(manager, attribute.getDefaultValue()); + } + // implemented interfaces + for (ObjectModelInterface interfacez : classifier.getInterfaces()) { + manager.addImport(interfacez.getQualifiedName()); + } + // operations + for (ObjectModelOperation operation : classifier.getOperations()) { + setImportsForType(manager, operation.getReturnType()); + for (ObjectModelParameter parameter : operation.getParameters()) { + setImportsForType(manager, parameter.getType()); + } + } + return manager; + }*/ + + private void addImport(ObjectModelClassifier classifier, String imports) { + ImportsManager manager = getImportsManager(classifier); + for (String oneType : GeneratorUtil.getTypesList(imports)) { + manager.addImport(oneType); + } + } + + protected void setSuperClass(ObjectModelClass classifier, String superclassQualifiedName) { + getHelper().setSuperClass(classifier, superclassQualifiedName); + addImport(classifier, superclassQualifiedName); + } + + protected void addInterface(ObjectModelClassifier classifier, String interfaceQualifiedName) { + getHelper().addInterface(classifier, interfaceQualifiedName); + addImport(classifier, interfaceQualifiedName); + } + + protected ObjectModelAttribute addAttribute(ObjectModelClassifier classifier, String parse) { + ObjectModelAttribute attribute = getHelper().addAttribute(classifier, parse); + addImport(classifier, attribute.getType()); + return attribute; + } + + protected ObjectModelAttribute addAttribute(ObjectModelClassifier classifier, ObjectModelAttribute attribute) { + getHelper().addAttribute(classifier, attribute); + addImport(classifier, attribute.getType()); + return attribute; + } + + protected ObjectModelOperation addOperation(ObjectModelClassifier classifier, String parse) { + ObjectModelOperation operation = getHelper().addOperation(classifier, parse); + addImport(classifier, operation.getReturnType()); + return operation; + } + + protected ObjectModelParameter addParameter(ObjectModelOperation operation, String type, String name) { + ObjectModelParameter param = getHelper().addParameter(operation, type, name); + addImport((ObjectModelClassifier)operation.getDeclaringElement(), type); + return param; + } + + protected void addException(ObjectModelOperation operation, String exception) { + getHelper().addException(operation, exception); + addImport((ObjectModelClassifier)operation.getDeclaringElement(), exception); + } + +} Added: branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/BeanTransformer.java =================================================================== --- branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/BeanTransformer.java (rev 0) +++ branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/BeanTransformer.java 2009-10-28 19:04:40 UTC (rev 666) @@ -0,0 +1,154 @@ + +package org.nuiton.eugene.test.generator; + +import org.nuiton.eugene.java.OM2JavaTransformer; +import java.beans.PropertyChangeListener; +import java.io.Serializable; +import java.util.Iterator; +import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.models.object.ObjectModelAttribute; +import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelClassifier; +import org.nuiton.eugene.models.object.ObjectModelInterface; +import org.nuiton.eugene.models.object.ObjectModelOperation; +import org.nuiton.eugene.models.object.ObjectModelParameter; + +/*{generator option: parentheses = false}*/ +/*{generator option: writeString = +}*/ +/** + * BeanTransformer + * + * Created: 28 oct. 2009 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public class BeanTransformer extends OM2JavaTransformer { + + public BeanTransformer() { + super(); + } + + @Override + public void transformFromClass(ObjectModelClass clazz) { + if (!clazz.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_BEAN) && + !clazz.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_DTO)) { + return; + } + + ObjectModelClass resultClass = getHelper().createClass(clazz.getName(), clazz.getPackageName()); + + // Set superclass + Iterator<ObjectModelClass> j = clazz.getSuperclasses().iterator(); + if (j.hasNext()) { + ObjectModelClass p = j.next(); + this.setSuperClass(resultClass, p.getQualifiedName()); + } + + // Add interfaces from inputModel + for (Iterator<ObjectModelInterface> i=clazz.getInterfaces().iterator(); i.hasNext();) { + ObjectModelClassifier parentInterface = i.next(); + this.addInterface(resultClass, parentInterface.getQualifiedName()); + } + + this.createListeners(resultClass, clazz); + + // Add attributes + for (ObjectModelAttribute attr : clazz.getAttributes()) { + + if (attr.isNavigable() || attr.hasAssociationClass()) { + + if (GeneratorUtil.isNMultiplicity(attr)) { + if (attr.isOrdered()) { + //type = List.class.getName(); + } else { + //type = Collection.class.getName(); + } + } + + this.addAttribute(resultClass, attr); + } + } + + // Add operations + for (ObjectModelOperation op : clazz.getOperations()) { + ObjectModelOperation resultOperation = this.addOperation(resultClass, + op.getVisibility() + " abstract " + op.getReturnType() + " " + op.getName()); + + for (ObjectModelParameter param : op.getParameters()) { + ObjectModelParameter resultParameter = this.addParameter(resultOperation, + param.getType(), param.getName()); + } + + for (String exception : op.getExceptions()) { + this.addException(resultOperation, exception); + } + } + + this.addClassToModel(resultClass); + } + + private void createForDTO(ObjectModelClass resultClass, ObjectModelClass inputClass) { + + // Add Serializable implements for DTO generation + if (inputClass.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_DTO)) { + this.addInterface(resultClass, Serializable.class.getName()); + } + + String svUID = TopiaGeneratorUtil.findTagValue("dto-serialVersionUID", inputClass, getModel()); + this.addAttribute(resultClass, "public static final long serialVersionUID = " + svUID); + } + + protected void createListeners(ObjectModelClass resultClass, ObjectModelClass inputClass) { + + this.addAttribute(resultClass, "protected final PropertyChangeSupport pcs"); + + // Default constructor + ObjectModelOperation constructor = getHelper().addConstructor(inputClass, "public"); + getHelper().setOperationBody(constructor, "" + /*{ + pcs = new PropertyChangeSupport(this); + }*/ + ); + + // Add PropertyListener + String propType = PropertyChangeListener.class.getName(); + String strType = String.class.getName(); + ObjectModelOperation addPropertyChangeListener = this.addOperation(inputClass, + "public void addPropertyChangeListener(" + propType + " listener)"); + getHelper().setOperationBody(addPropertyChangeListener, "" + /*{ + pcs.addPropertyChangeListener(listener); + }*/ + ); + + ObjectModelOperation addPropertyChangeListenerPlus =this.addOperation(inputClass, + "public void addPropertyChangeListener(" + strType + " propertyName," + propType + " listener)"); + getHelper().setOperationBody(addPropertyChangeListenerPlus, "" + /*{ + pcs.addPropertyChangeListener(propertyName, listener); + }*/ + ); + + ObjectModelOperation removePropertyChangeListener = this.addOperation(inputClass, + "public void removePropertyChangeListener(" + propType + " listener)"); + getHelper().setOperationBody(removePropertyChangeListener, "" + /*{ + pcs.removePropertyChangeListener(listener); + }*/ + ); + + ObjectModelOperation removePropertyChangeListenerPlus =this.addOperation(inputClass, + "public void removePropertyChangeListener(" + strType + " propertyName," + propType + " listener)"); + getHelper().setOperationBody(removePropertyChangeListenerPlus, "" + /*{ + pcs.removePropertyChangeListener(propertyName, listener); + }*/ + ); + } + + +} Deleted: branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/DTOBuilder.java =================================================================== --- branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/DTOBuilder.java 2009-10-28 19:04:32 UTC (rev 665) +++ branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/DTOBuilder.java 2009-10-28 19:04:40 UTC (rev 666) @@ -1,52 +0,0 @@ -package org.nuiton.eugene.test.generator; - -import java.util.List; -import org.apache.commons.lang.StringUtils; -import org.nuiton.eugene.ImportsManager; -import org.nuiton.eugene.JavaBuilder; -import org.nuiton.eugene.models.object.ObjectModelAttribute; -import org.nuiton.eugene.models.object.ObjectModelClass; -import org.nuiton.eugene.models.object.ObjectModelOperation; -import org.nuiton.eugene.models.object.builder.JavaFile; - -/*{generator option: parentheses = false}*/ -/*{generator option: writeString = +}*/ -/** - * - * @author fdesbois - */ -public class DTOBuilder extends JavaBuilder { - - @Override - public void buildFromClass(ObjectModelClass clazz) { - - if (!clazz.hasStereotype("dto")) { - for (ObjectModelAttribute attribute : clazz.getAttributes()) { - String attributeNameCapitalize = StringUtils.capitalize(attribute.getName()); - String attributeName = attribute.getName(); - ObjectModelOperation operationSetter = - getHelper().addOperation(clazz, "set" + attributeNameCapitalize, - null, attribute.getType(), attributeName); - - getHelper().setOperationBody(operationSetter, "" -/*{ - this.<%=attributeName%> = <%=attributeName%>; - }*/ - ); - - ObjectModelOperation operationGetter = - getHelper().addOperation(clazz, "get" + attributeNameCapitalize, - attribute.getType()); - - getHelper().setOperationBody(operationGetter, "" -/*{ - return this.<%=attributeName%>; -}*/ - ); - } - - this.addImportForClassifier(clazz, List.class); - } - - } -} Deleted: branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/JavaGenerator.java =================================================================== --- branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/JavaGenerator.java 2009-10-28 19:04:32 UTC (rev 665) +++ branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/JavaGenerator.java 2009-10-28 19:04:40 UTC (rev 666) @@ -1,201 +0,0 @@ - -package org.nuiton.eugene.test.generator; - -import java.io.File; -import java.io.IOException; -import java.io.Writer; -import java.util.Collection; -import java.util.Iterator; -import java.util.Set; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.eugene.GeneratorUtil; -import org.nuiton.eugene.ImportsManager; -import org.nuiton.eugene.ObjectModelGenerator; -import org.nuiton.eugene.models.object.ObjectModelAttribute; -import org.nuiton.eugene.models.object.ObjectModelClass; -import org.nuiton.eugene.models.object.ObjectModelClassifier; -import org.nuiton.eugene.models.object.ObjectModelInterface; -import org.nuiton.eugene.models.object.ObjectModelOperation; -import org.nuiton.eugene.models.object.ObjectModelParameter; - -/*{generator option: parentheses = true}*/ -/*{generator option: writeString = output.write}*/ -/** - * JavaGenerator - * - * Created: 22 oct. 2009 - * - * @author fdesbois - * @version $Revision$ - * - * Mise a jour: $Date$ - * par : $Author$ - */ -public class JavaGenerator extends ObjectModelGenerator { - - private static final Log log = LogFactory.getLog(JavaGenerator.class); - - @Override - public String getFilenameForClass(ObjectModelClass clazz) { - return clazz.getQualifiedName().replace('.', File.separatorChar) + ".java";//return clazz.getName() + ".java"; - } - - @Override - public void generateFromClass(Writer output, ObjectModelClass clazz) throws IOException { - - if (log.isInfoEnabled()) { - log.info("generate : " + clazz.getName()); - } - - this.generateHeader(output, clazz); // Imports, package et documentation - - String abstractStr = clazz.isAbstract() ? " abstract " : " "; - String className = clazz.getName(); - - String extend = ""; - Iterator<ObjectModelClass> j = clazz.getSuperclasses().iterator(); - if (j.hasNext()) { - ObjectModelClassifier p = j.next(); - extend += p.getName(); - } - - String implement = ""; - for (Iterator<ObjectModelInterface> i = clazz.getInterfaces().iterator(); i.hasNext();) { - ObjectModelClassifier parentInterface = i.next(); - implement += parentInterface.getName(); - if (i.hasNext()) { - implement += ", "; - } - } - -/*{ -public<%=abstractStr%>class <%=className%>}*/ - -/* - * Définition de la super classe : il ne doit y avoir qu'une - */ - if (extend.length() > 0) { -/*{ extends <%=extend%>}*/ - } - - if (implement.length() > 0) { -/*{ implements <%=implement%> { - -}*/ - } else { - /*{ { - -}*/ - } - - this.generateAttributes(output, clazz.getAttributes()); - this.generateOperations(output, clazz.getOperations()); -/*{ -} //<%=clazz.getName()%> -}*/ - } - - protected void generateHeader(Writer output, ObjectModelClassifier classifier) throws IOException { - - String packageName = classifier.getPackageName(); -/*{package <%=packageName%>; - -}*/ - // potentiel crash si imports non defini - // dans ce cas, probleme de config utilisateur ! obligation de passer par un builder ? - ImportsManager manager = getModel().getExtension(classifier.getQualifiedName(), ImportsManager.class); - for (String imports : manager.getImports(classifier.getPackageName())) { -/*{import <%=imports%>; - }*/ - } - - } - - protected void generateAttributes(Writer output, Collection<ObjectModelAttribute> attributes) throws IOException { - - for (ObjectModelAttribute attr : attributes) { - - if (attr.getDocumentation() != null && !attr.getDocumentation().isEmpty()) { -/*{ /** - * <%=attr.getDocumentation()%> - *) -}*/ - } - -// String annotation = attr.getTagValue(TAG_ANNOTATION); -// if (annotation != null && annotation.length() > 0) { -///* <%=annotation%> -//*/ -// } - - String attrName = attr.getName(); - String attrVisibility = attr.getVisibility(); - String attrType = GeneratorUtil.getSimpleName(attr.getType()); - String attrStatic = attr.isStatic() ? " static " : " "; - String attrFinal = attr.isFinal() ? " final " : " "; - String attrValue = !attr.getDefaultValue().isEmpty() ? " = " + GeneratorUtil.getSimpleName(attr.getDefaultValue()) : ""; - -/*{ <%=attrVisibility%><%=attrStatic%><%=attrFinal%><%=attrType%> <%=attrName%><%=attrValue%>; -}*/ - } - } - - protected void generateOperations(Writer output, Collection<ObjectModelOperation> operations) throws IOException { - for (ObjectModelOperation op : operations) { - String opName = op.getName(); -/*{ /** -}*/ - if (op.getDocumentation() != null && !op.getDocumentation().isEmpty()) { - String opDocumentation = op.getDocumentation(); -/*{ * <%=opName%> : <%=opDocumentation%> -}*/ - } - Collection<ObjectModelParameter> params = op.getParameters(); - for (ObjectModelParameter param : params) { - String paramName = param.getName(); - String paramDocumentation = param.getDocumentation(); -/*{ * @param <%=paramName%> <%=paramDocumentation%> - }*/ - } - String opVisibility = op.getVisibility(); - String opStatic = op.isStatic() ? " static " : ""; - String opAbstract = op.isAbstract() ? " abstract " : ""; - - ObjectModelParameter returnParam = op.getReturnParameter(); - String opReturn = GeneratorUtil.getSimpleName(returnParam.getType()); - if (!opReturn.equals("void")) { - String paramDocumentation = returnParam.getDocumentation(); -/*{ * @return <%=paramDocumentation%> - }*/ - } -/*{ *) - <%=opVisibility%><%=opStatic%><%=opAbstract%> <%=opReturn%> <%=opName%>(}*/ - String comma = ""; - for (ObjectModelParameter param : params) { - String paramName = param.getName(); - String paramType = GeneratorUtil.getSimpleName(param.getType()); -/*{<%=comma%><%=paramType%> <%=paramName%>}*/ - comma = ", "; - } -/*{)}*/ - Set<String> exceptions = op.getExceptions(); - comma = " throws "; - for (String exception : exceptions) { -/*{<%=comma%><%=exception%>}*/ - comma = ", "; - } - - if (!op.getBodyCode().isEmpty()) { -/*{ {<%=op.getBodyCode()%>} - -}*/ - } else { -/*{; - -}*/ - } - } - } - -} Modified: branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/TestBuilder.java =================================================================== --- branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/TestBuilder.java 2009-10-28 19:04:32 UTC (rev 665) +++ branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/TestBuilder.java 2009-10-28 19:04:40 UTC (rev 666) @@ -1,7 +1,7 @@ package org.nuiton.eugene.test.generator; -import org.nuiton.eugene.JavaBuilder; +import org.nuiton.eugene.models.object.builder.JavaBuilder; import org.nuiton.eugene.models.object.ObjectModelClass; import org.nuiton.eugene.models.object.ObjectModelOperation; Modified: branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/TestReader.java =================================================================== --- branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/TestReader.java 2009-10-28 19:04:32 UTC (rev 665) +++ branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/TestReader.java 2009-10-28 19:04:40 UTC (rev 666) @@ -2,7 +2,7 @@ package org.nuiton.eugene.test.generator; import java.io.File; -import org.nuiton.eugene.JavaBuilder; +import org.nuiton.eugene.models.object.builder.JavaBuilder; import org.nuiton.eugene.ModelReader; import org.nuiton.eugene.models.object.ObjectModel; Added: branches/1.1.0-Javabuilder/eugene-test/src/test/java/org/nuiton/eugene/java/JavaBuilderHelperTest.java =================================================================== --- branches/1.1.0-Javabuilder/eugene-test/src/test/java/org/nuiton/eugene/java/JavaBuilderHelperTest.java (rev 0) +++ branches/1.1.0-Javabuilder/eugene-test/src/test/java/org/nuiton/eugene/java/JavaBuilderHelperTest.java 2009-10-28 19:04:40 UTC (rev 666) @@ -0,0 +1,110 @@ + +package org.nuiton.eugene.java; + +import org.nuiton.eugene.java.JavaBuilderHelper; +import java.util.List; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; +import org.nuiton.eugene.models.object.ObjectModelAttribute; +import org.nuiton.eugene.models.object.ObjectModelClassifier; +import org.nuiton.eugene.models.object.ObjectModelOperation; +import org.nuiton.eugene.models.object.ObjectModelParameter; +import org.nuiton.eugene.models.object.xml.ObjectModelClassImpl; + +/** + * + * @author fdesbois + */ +public class JavaBuilderHelperTest { + + public JavaBuilderHelperTest() { + } + + @BeforeClass + public static void setUpClass() throws Exception { + } + + @AfterClass + public static void tearDownClass() throws Exception { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + /** + * Test of addAttribute method, of class JavaBuilderHelper. + */ + @Test + public void testAddAttribute() { + System.out.println("addAttribute"); + JavaBuilderHelper instance = new JavaBuilderHelper(); + + ObjectModelClassifier classifier = new ObjectModelClassImpl(); + + String parse = "public java.lang.String bilou"; + ObjectModelAttribute result = instance.addAttribute(classifier, parse); + assertNotNull(result); + assertEquals(result.getName(), "bilou"); + assertEquals(result.getType(), "java.lang.String"); + assertEquals(result.getVisibility(), "public"); + + parse = "public static final long uid = 12534sdf78ef9"; + result = instance.addAttribute(classifier, parse); + assertNotNull(result); + assertTrue(result.isFinal()); + assertTrue(result.isStatic()); + assertEquals(result.getName(), "uid"); + assertEquals(result.getType(), "long"); + assertEquals(result.getVisibility(), "public"); + assertEquals(result.getDefaultValue(), "12534sdf78ef9"); + + parse = "private java.util.Date publicDate = new java.util.Date()"; + result = instance.addAttribute(classifier, parse); + assertNotNull(result); + assertEquals(result.getName(), "publicDate"); + assertEquals(result.getType(), "java.util.Date"); + assertEquals(result.getVisibility(), "private"); + assertEquals(result.getDefaultValue(), "new java.util.Date()"); + + } + + @Test + public void testAddOperation() { + System.out.println("addOperation"); + + JavaBuilderHelper instance = new JavaBuilderHelper(); + + ObjectModelClassifier classifier = new ObjectModelClassImpl(); + + String parse = "public abstract java.util.List<java.lang.String> methodName"; + ObjectModelOperation result = instance.addOperation(classifier, parse); + assertNotNull(result); + assertTrue(result.isAbstract()); + assertEquals(result.getName(), "methodName"); + assertEquals(result.getReturnType(), "java.util.List<java.lang.String>"); + assertEquals(result.getVisibility(), "public"); + + parse = "public void addPropertyChangeListener(java.lang.String propertyName)"; + result = instance.addOperation(classifier, parse); + assertNotNull(result); + assertEquals(result.getName(), "addPropertyChangeListener"); + assertEquals(result.getReturnType(), "void"); + assertEquals(result.getVisibility(), "public"); + assertEquals(result.getParameters().size(), 1); + + List<ObjectModelParameter> listParams = (List<ObjectModelParameter>)result.getParameters(); + ObjectModelParameter param1 = listParams.get(0); + assertEquals(param1.getName(), "propertyName"); + assertEquals(param1.getType(), "java.lang.String"); + } + +} \ No newline at end of file
participants (1)
-
fdesbois@users.nuiton.org