r656 - 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/xml eugene-test eugene-test/src/main/java/org/nuiton/eugene/test/generator eugene-test/src/main/resources
Author: fdesbois Date: 2009-10-22 17:54:03 +0200 (Thu, 22 Oct 2009) New Revision: 656 Added: branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/JavaGenerator.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/DTOBuilder.java 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/resources/log4j.properties 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/ObjectModel.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/main/java/org/nuiton/eugene/models/object/xml/ObjectModelImpl.java Log: - Simplify imports managment : put map of importsManager directly into ObjectModel - No longer use of JavaFile - Add template JavaGenerator Modified: 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-22 12:39:16 UTC (rev 655) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/JavaBuilder.java 2009-10-22 15:54:03 UTC (rev 656) @@ -1,20 +1,39 @@ 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.HashMap; -import java.util.Map; +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.builder.JavaClassFile; -import org.nuiton.eugene.models.object.builder.JavaFile; +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; /** * @@ -22,21 +41,16 @@ */ public abstract class JavaBuilder { + private static final Log log = LogFactory.getLog(JavaBuilder.class); + protected ObjectModelImpl objectModel; - protected Map<String, JavaFile> javaFiles; - private static ObjectModelBuilderHelper helper = new ObjectModelBuilderHelper(); public JavaBuilder() { this.objectModel = new ObjectModelImpl(); - this.javaFiles = new HashMap<String, JavaFile>(); } - public JavaFile getFile(String qualifiedName) { - return javaFiles.get(qualifiedName); - } - public ObjectModel getModel() { return objectModel; } @@ -45,24 +59,46 @@ return helper; } - protected void initFiles() { - javaFiles.clear(); - for (ObjectModelClass clazz : objectModel.getClasses()) { - JavaClassFile javaFile = new JavaClassFile(clazz); - javaFiles.put(clazz.getQualifiedName(), javaFile); + public void addImportForClassifier(ObjectModelClassifier classifier, String imports) { + ImportsManager manager = objectModel.getImportsManager(classifier.getQualifiedName()); + manager.addImport(imports); + } + + public void addImportForClassifier(ObjectModelClassifier classifier, Class<?> imports) { + ImportsManager manager = objectModel.getImportsManager(classifier.getQualifiedName()); + 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()); } - // init Imports ? } - protected JavaClassFile createJavaClassFile(ObjectModelClass clazz) { - if (javaFiles.containsKey(clazz.getQualifiedName())) { - throw new IllegalArgumentException("ClassFile '" + clazz.getQualifiedName() + "' already exist"); + private ImportsManager setImports(ObjectModelClassifier classifier) { + ImportsManager manager = objectModel.getImportsManager(classifier.getQualifiedName()); + // attributes + for (ObjectModelAttribute attribute : classifier.getAttributes()) { + manager.addImport(attribute.getType()); } - JavaClassFile javaFile = new JavaClassFile(clazz); - objectModel.addClass((ObjectModelClassImpl)clazz); - javaFiles.put(clazz.getQualifiedName(), javaFile); - // init Imports ? - return javaFile; + // implemented interfaces + for (ObjectModelInterface interfacez : classifier.getInterfaces()) { + manager.addImport(interfacez.getQualifiedName()); + } + // operations + for (ObjectModelOperation operation : classifier.getOperations()) { + manager.addImport(operation.getReturnType()); + for (ObjectModelParameter parameter : operation.getParameters()) { + manager.addImport(parameter.getType()); + } + } + return manager; } public void build() { @@ -71,7 +107,7 @@ public void build(ObjectModel objectModel) { this.objectModel = (ObjectModelImpl)objectModel; - initFiles(); + //initFiles(); build(); // Ajout elements, ... //String filename = getFilenameForModel(objectModel); @@ -136,5 +172,4 @@ public void buildFromEnumeration(ObjectModelEnumeration model) { } - } Modified: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModel.java =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModel.java 2009-10-22 12:39:16 UTC (rev 655) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModel.java 2009-10-22 15:54:03 UTC (rev 656) @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.List; +import org.nuiton.eugene.ImportsManager; import org.nuiton.eugene.models.Model; /** @@ -120,4 +121,12 @@ */ public List<String> getComments(); + /** + * Return specific ImportsManager for a classifier + * + * @param qualifiedName of the classifier + * @return the ImportsManager associated to the classifier, create a new one if not exist + */ + public List<String> getImports(ObjectModelClassifier element); + } //ObjectModel 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-22 12:39:16 UTC (rev 655) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassifierImpl.java 2009-10-22 15:54:03 UTC (rev 656) @@ -58,6 +58,7 @@ protected String type = null; + @Override public String toString() { return "" + getQualifiedName() + " implements " + getInterfaces(); } @@ -66,6 +67,7 @@ super(); } + @Override public void postInit() { super.postInit(); qualifiedName = packageName + "." + name; @@ -116,14 +118,17 @@ return extern; } + @Override public String getPackageName() { return packageName; } + @Override public String getQualifiedName() { return qualifiedName; } + @Override public Collection<ObjectModelInterface> getInterfaces() { if (interfaces == null) { interfaces = new ArrayList<ObjectModelInterface>(); @@ -134,6 +139,7 @@ return interfaces; } + @Override public Collection<ObjectModelOperation> getOperations(String name) { List<ObjectModelOperation> result = new ArrayList<ObjectModelOperation>(); for (Iterator<ObjectModelOperation> i = getOperations().iterator(); i @@ -146,6 +152,7 @@ return result; } + @Override public Collection<ObjectModelOperation> getOperations() { return operations; } Modified: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelImpl.java =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelImpl.java 2009-10-22 12:39:16 UTC (rev 655) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelImpl.java 2009-10-22 15:54:03 UTC (rev 656) @@ -26,6 +26,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +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; @@ -59,6 +60,8 @@ protected List<String> comments = new ArrayList<String>(); private Map<String, String> tagValues = new HashMap<String, String>(); + private Map<String, ImportsManager> importsManagers = new HashMap<String, ImportsManager>(); + private static Log log = LogFactory.getLog(ObjectModelImpl.class); public void setName(String name) { @@ -492,4 +495,23 @@ public String getTagValue(String tagValue) { return (tagValue == null ? null : (String) tagValues.get(tagValue)); } + + @Override + public List<String> getImports(ObjectModelClassifier classifier) { + ImportsManager manager = importsManagers.get(classifier.getQualifiedName()); + if (manager == null) { + throw new IllegalArgumentException("ImportsManager is not defined for classifier '" + + classifier.getQualifiedName() + "'"); + } + return manager.getImports(classifier.getPackageName()); + } + + public ImportsManager getImportsManager(String qualifiedName) { + ImportsManager manager = importsManagers.get(qualifiedName); + if (manager == null) { + manager = new ImportsManager(); + importsManagers.put(qualifiedName, manager); + } + return manager; + } } Modified: branches/1.1.0-Javabuilder/eugene-test/pom.xml =================================================================== --- branches/1.1.0-Javabuilder/eugene-test/pom.xml 2009-10-22 12:39:16 UTC (rev 655) +++ branches/1.1.0-Javabuilder/eugene-test/pom.xml 2009-10-22 15:54:03 UTC (rev 656) @@ -92,6 +92,24 @@ <groupId>org.nuiton.eugene</groupId> <artifactId>maven-eugene-plugin</artifactId> <version>${project.version}</version> + <!--executions> + <execution> + <id>Test Java Generator</id> + <phase>generate-test-sources</phase> + <configuration> + <includes>**/*.objectmodel</includes> + <templates>org.nuiton.eugene.test.generator.JavaGenerator</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> <!--plugin> Modified: 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-22 12:39:16 UTC (rev 655) +++ branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/DTOBuilder.java 2009-10-22 15:54:03 UTC (rev 656) @@ -2,6 +2,7 @@ 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; @@ -27,22 +28,24 @@ getHelper().addOperation(clazz, "set" + attributeNameCapitalize, null, attribute.getType(), attributeName); - getHelper().setOperationBody(operationSetter, "" /*{ - this.<%=attributeName%> = <%=attributeName%>; - }*/); + getHelper().setOperationBody(operationSetter, "" +/*{ + this.<%=attributeName%> = <%=attributeName%>; + }*/ + ); ObjectModelOperation operationGetter = getHelper().addOperation(clazz, "get" + attributeNameCapitalize, attribute.getType()); - getHelper().setOperationBody(operationGetter, "" /*{ - return this.<%=attributeName%>; - }*/); + getHelper().setOperationBody(operationGetter, "" +/*{ + return this.<%=attributeName%>; +}*/ + ); } - - - JavaFile file = getFile(clazz.getQualifiedName()); - file.addImport(List.class); + + this.addImportForClassifier(clazz, List.class); } } Added: 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 (rev 0) +++ branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/JavaGenerator.java 2009-10-22 15:54:03 UTC (rev 656) @@ -0,0 +1,196 @@ + +package org.nuiton.eugene.test.generator; + +import java.io.IOException; +import java.io.Writer; +import java.util.Collection; +import java.util.Iterator; +import java.util.Set; +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 { + + @Override + public String getFilenameForClass(ObjectModelClass clazz) { + return clazz.getName() + ".java"; + } + + @Override + public void generateFromClassifier(Writer output, ObjectModelClassifier classifier) { + + + } + + @Override + public void generateFromClass(Writer output, ObjectModelClass clazz) throws IOException { + + 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 ? + for (String imports : getModel().getImports(classifier)) { +/*{import <%=imports%>; + }*/ + } + + } + + protected void generateAttributes(Writer output, Collection<ObjectModelAttribute> attributes) throws IOException { + + for (ObjectModelAttribute attr : attributes) { + + if (!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 = getSimpleName(attr.getType()); + String attrStatic = attr.isStatic() ? " static " : " "; + String attrFinal = attr.isFinal() ? " final " : " "; + String attrValue = !attr.getDefaultValue().isEmpty() ? " = " + 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().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 = 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 = param.getType(); +/*{<%=comma%><%=paramType%> <%=paramName%>}*/ + comma = ", "; + } +/*{)}*/ + Set<String> exceptions = op.getExceptions(); + comma = " throws "; + for (String exception : exceptions) { +/*{<%=comma%><%=exception%>}*/ + comma = ", "; + } +/*{; + +}*/ + } + } + + private static String getSimpleName(String qualifiedName) { + String result = qualifiedName; + int dot = qualifiedName.lastIndexOf("."); + if (dot >- 1) { + result = qualifiedName.substring(dot + 1); + } + return result; + } +} 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-22 12:39:16 UTC (rev 655) +++ branches/1.1.0-Javabuilder/eugene-test/src/main/java/org/nuiton/eugene/test/generator/TestBuilder.java 2009-10-22 15:54:03 UTC (rev 656) @@ -6,11 +6,9 @@ import org.nuiton.eugene.JavaBuilder; 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 @@ -21,29 +19,27 @@ public void build() { createRole(); createPerson(); - - } private void createRole() { ObjectModelClass roleClass = getHelper().createClass("Role", "org.chorem.bonzoms"); - JavaFile roleFile = this.createJavaClassFile(roleClass); + this.addClassToModel(roleClass); getHelper().addAttribute(roleClass, "name", "String"); - roleFile.addImport(Date.class); + this.addImportForClassifier(roleClass, Date.class); getHelper().addAttribute(roleClass, "fromDate", "Date"); getHelper().addAttribute(roleClass, "thruDate", "Date"); } private void createPerson() { ObjectModelClass personneClass = getHelper().createClass("Person", "org.chorem.bonzoms"); - JavaFile personneFile = this.createJavaClassFile(personneClass); + this.addClassToModel(personneClass); getHelper().addAttribute(personneClass, "lastName", "String"); getHelper().addAttribute(personneClass, "firstName", "String"); - personneFile.addImport(List.class); + this.addImportForClassifier(personneClass, List.class); getHelper().addAttribute(personneClass, "roles", "List<Role>"); Modified: branches/1.1.0-Javabuilder/eugene-test/src/main/resources/log4j.properties =================================================================== --- branches/1.1.0-Javabuilder/eugene-test/src/main/resources/log4j.properties 2009-10-22 12:39:16 UTC (rev 655) +++ branches/1.1.0-Javabuilder/eugene-test/src/main/resources/log4j.properties 2009-10-22 15:54:03 UTC (rev 656) @@ -9,3 +9,4 @@ # package level log4j.logger.org.nuiton.eugene=INFO log4j.logger.org.nuiton.eugene.test=DEBUG +log4j.logger.org.nuiton.processor=DEBUG
participants (1)
-
fdesbois@users.nuiton.org