Re: [Wikitty-devel] [Wikitty-commits] r54 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty wikitty-generators/src/main/java/org/nuiton/wikitty/generator
Yo, Petites questions innocentes : 1) tu utilise les tranformer ? 2) tu as vu les évolution d'eugene ? Car il serait bien qu'on commence à mutualiser un peu les templates. Plutôt que de continuer a écrire des Générators inmaintenables... Le Mon, 17 May 2010 10:38:51 +0200 (CEST), echatellier@users.nuiton.org a écrit :
Author: echatellier Date: 2010-05-17 10:38:51 +0200 (Mon, 17 May 2010) New Revision: 54
Url: http://nuiton.org/repositories/revision/wikitty/54
Log: Add interface/abstract/impl generation. Add property change support.
Added: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityAbstractGenerator.java trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityImplGenerator.java Removed: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityGenerator.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntity.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityBean.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityWikitty.java trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityBeanGenerator.java trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityInterfaceGenerator.java trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyMetaGenerator.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntity.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntity.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntity.java 2010-05-17 08:38:51 UTC (rev 54) @@ -17,6 +17,7 @@
package org.nuiton.wikitty;
+import java.beans.PropertyChangeListener; import java.io.Serializable; import java.util.Collection;
@@ -77,5 +78,35 @@ * @return */ public FieldType getFieldType(String ext, String fieldName); + + /** + * Ajoute un listener gloable + * + * @param listener le listener à ajouter + */ + void addPropertyChangeListener(PropertyChangeListener listener);
+ /** + * Supprime un listener globable. + * + * @param listener le listener à supprimer + */ + void removePropertyChangeListener(PropertyChangeListener listener); + + /** + * Ajoute un listener sur la propriété {@code propertyName} + * + * @param propertyName le nom de la propriété + * @param listener le listener à ajouter + */ + void addPropertyChangeListener(String propertyName, PropertyChangeListener listener); + + /** + * Supprime un listener sur la propriété {@code propertyName} + * + * @param propertyName le nom de la propriété + * @param listener le listener à supprimer + */ + void removePropertyChangeListener(String propertyName, PropertyChangeListener listener); + }
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityBean.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityBean.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityBean.java 2010-05-17 08:38:51 UTC (rev 54) @@ -17,6 +17,8 @@
package org.nuiton.wikitty;
+import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; @@ -32,8 +34,11 @@ */ public class BusinessEntityBean implements BusinessEntity {
- private static final long serialVersionUID = 1L; + /** serialVersionUID. */ + private static final long serialVersionUID = 5245199905431320116L;
+ protected transient PropertyChangeSupport propertyChangeSupport; + protected String id; protected String version;
@@ -89,4 +94,37 @@ throw new UnsupportedOperationException("Not supported yet."); }
+ /* + * @see org.nuiton.wikitty.BusinessEntity#addPropertyChangeListener(java.beans.PropertyChangeListener) + */ + @Override + public void addPropertyChangeListener(PropertyChangeListener listener) { + propertyChangeSupport.addPropertyChangeListener(listener); + } + + /* + * @see org.nuiton.wikitty.BusinessEntity#removePropertyChangeListener(java.beans.PropertyChangeListener) + */ + @Override + public void removePropertyChangeListener(PropertyChangeListener listener) { + propertyChangeSupport.removePropertyChangeListener(listener); + } + + /* + * @see org.nuiton.wikitty.BusinessEntity#addPropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener) + */ + @Override + public void addPropertyChangeListener(String propertyName, + PropertyChangeListener listener) { + propertyChangeSupport.addPropertyChangeListener(propertyName, listener); + } + + /* + * @see org.nuiton.wikitty.BusinessEntity#removePropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener) + */ + @Override + public void removePropertyChangeListener(String propertyName, + PropertyChangeListener listener) { + propertyChangeSupport.removePropertyChangeListener(propertyName, listener); + } }
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityWikitty.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityWikitty.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityWikitty.java 2010-05-17 08:38:51 UTC (rev 54) @@ -17,6 +17,8 @@
package org.nuiton.wikitty;
+import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; import java.util.Collection; import java.util.Collections;
@@ -32,16 +34,20 @@ */ public class BusinessEntityWikitty implements BusinessEntity {
- private static final long serialVersionUID = 1L; + /** serialVersionUID. */ + private static final long serialVersionUID = -4399752739887114180L;
+ protected transient PropertyChangeSupport propertyChangeSupport; + protected Wikitty wikitty;
public BusinessEntityWikitty(Wikitty wi) { + propertyChangeSupport = new PropertyChangeSupport(this); setWikitty(wi); }
public BusinessEntityWikitty() { - setWikitty(new Wikitty()); + this(new Wikitty()); }
public String getWikittyId() { @@ -98,4 +104,38 @@ public Collection<WikittyExtension> getStaticExtensions() { return Collections.emptyList(); } + + /* + * @see org.nuiton.wikitty.BusinessEntity#addPropertyChangeListener(java.beans.PropertyChangeListener) + */ + @Override + public void addPropertyChangeListener(PropertyChangeListener listener) { + propertyChangeSupport.addPropertyChangeListener(listener); + } + + /* + * @see org.nuiton.wikitty.BusinessEntity#removePropertyChangeListener(java.beans.PropertyChangeListener) + */ + @Override + public void removePropertyChangeListener(PropertyChangeListener listener) { + propertyChangeSupport.removePropertyChangeListener(listener); + } + + /* + * @see org.nuiton.wikitty.BusinessEntity#addPropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener) + */ + @Override + public void addPropertyChangeListener(String propertyName, + PropertyChangeListener listener) { + propertyChangeSupport.addPropertyChangeListener(propertyName, listener); + } + + /* + * @see org.nuiton.wikitty.BusinessEntity#removePropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener) + */ + @Override + public void removePropertyChangeListener(String propertyName, + PropertyChangeListener listener) { + propertyChangeSupport.removePropertyChangeListener(propertyName, listener); + } }
Added: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityAbstractGenerator.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityAbstractGenerator.java (rev 0) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityAbstractGenerator.java 2010-05-17 08:38:51 UTC (rev 54) @@ -0,0 +1,445 @@ +package org.nuiton.wikitty.generator; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.models.object.ObjectModelAttribute; +import org.nuiton.eugene.models.object.ObjectModelClass; + +/** + * Possible enhancement: + * - generateParentMethod can generate attribut method access that call + * the same method on parent instance class. For that we must have one attribut + * instance by parent. This attribut we must be created in setWikitty method + * and used same wikitty object. + * + * @author poussin + */ +public class BusinessEntityAbstractGenerator extends WikengoCommonGenerator { + + private static final Log log = LogFactory.getLog(BusinessEntityAbstractGenerator.class); + + static protected Pattern extractTypeOnCollection = Pattern.compile("\\w*<(\\w+)>"); + + protected String EXT_NAME; + + @Override + public String getFilenameForClass(ObjectModelClass clazz) { + String fqn = clazz.getQualifiedName(); + log.info( "Filename for " + clazz.getName() + " is " + fqn.replace('.', File.separatorChar) + ".java"); + return fqn.replace('.', File.separatorChar) + "Abstract.java"; + } + + public void generateFromClass(Writer output, ObjectModelClass clazz) + throws IOException { + if (!EugengoUtils.isBusinessEntity(clazz)) { + log.info( clazz.getName() + " is not a business entity"); + return; + } + + log.info("Generate Business entity abstract" + clazz.getName() + "... "); + generateCopyright(output); + + EXT_NAME = "EXT_" + clazz.getName().toUpperCase(); + + String packageName = clazz.getPackageName(); + String name = clazz.getName() + "Abstract"; +/*{package <%=packageName%>; + +}*/ + ObjectModelClass superClass = findSuperClass(clazz); + + clearImports(); + addImport(clazz); + addImport(superClass); + addImport("org.nuiton.wikitty.WikittyUtil"); + addImport("org.nuiton.wikitty.Wikitty"); + addImport("org.nuiton.wikitty.BusinessEntityWikitty"); + addImport("org.nuiton.wikitty.WikittyExtension"); + addImport(Collection.class); + addImport(Collections.class); + addImport(List.class); + addImport(ArrayList.class); + String parentImpl = null; + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { + addImport(parent); + parentImpl = parent.getQualifiedName() + "Impl"; + addImport( parentImpl ); + } + } + lookForAttributeImports(clazz); + generateImports(output, packageName); + + generateClazzDocumentation(output, clazz); + String extendsString = " extends " + ( parentImpl != null ? parentImpl : getType("org.nuiton.wikitty.BusinessEntityWikitty") ); + + String implementsString = "implements " + getType(clazz.getQualifiedName()); + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { + implementsString += ", " + getType(parent.getQualifiedName()); + } + } + +/*{public abstract class <%=name%><%=extendsString%> <%=implementsString%> { + +}*/ + + String svUID = GeneratorUtil.computeSerialVersionUID(clazz); +/*{ private static final long serialVersionUID = <%=svUID%>; + +}*/ + + generateWikittyExtension(output, clazz); + + generateStaticAttributes(output, clazz); + +/*{ + public <%=name%>() { + super(); + } + + public <%=name%>(BusinessEntityWikitty wi) { + super(wi.getWikitty()); + } + + public <%=name%>(Wikitty wi) { + super(wi); + } + +}*/ + + generateAttributeAccessMethod(output, clazz); + + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { + generateParentMethod(output, parent); + } + } + +/*{ @Override + public Collection<WikittyExtension> getStaticExtensions() { + return extensions; + } + + +} //<%=name%> +}*/ + + } + + + + // Utilitarian methods + + public void generateAttributeAccessMethod(Writer output, ObjectModelClass clazz) throws IOException { + for (ObjectModelAttribute attr : clazz.getAttributes()) { + if (attr.isNavigable() && !attr.isStatic() + && (attr.getStereotypes() == null || attr.getStereotypes().isEmpty())) { + if ((attr.getMaxMultiplicity() != 0 && attr.getMaxMultiplicity() != 1)) { + //TODO ymartel 20090812: when dataType "List", "Set" or "Collection" in model, must be here! + generateCollectionAttributeAccessors(output, attr); + } else { + generateWikittyAttributeAccessors(output, attr); + } + } + } + } + + private void generateWikittyExtension(Writer output, + ObjectModelClass clazz) throws IOException { + String version = clazz.getTagValue("version"); + + // Since wikitty 1.3, version need to be dotted + if ( version == null ) { + version = "1.0"; + } + + // get requires from parent + String requires = null; + String separator = ""; + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { + String parentExtName = "EXT_" + parent.getName().toUpperCase(); + + if (requires == null) { + requires = ""; + } + + requires += separator + parent.getName() + "." + parentExtName; + // dans le cas où on aurait un heritage multiple :) + // FIXME EC-20100420 gerer les extensions multiples + separator = " + \",\" /* FIXME Multiples extentions are not yet supported */ + "; + } + } + +/*{ static final protected List<WikittyExtension> extensions; + static final public WikittyExtension extension<%=clazz.getName()%> = + new WikittyExtension(<%=EXT_NAME%>, "<%=version%>", <%=requires%>, + WikittyUtil.buildFieldMapExtension(}*/ + + separator = ""; + for (ObjectModelAttribute attr : clazz.getAttributes()) { + if (attr.isNavigable() && !attr.isStatic() && + (attr.getStereotypes() == null || attr.getStereotypes().isEmpty())) { +/*{<%=separator%> + }*/ + generateAttribute(output, attr); + separator = ","; + } + } +/*{)); + static { + ArrayList<WikittyExtension> exts = new ArrayList<WikittyExtension>(); +}*/ + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { +/*{ + exts.addAll(<%=parent.getName()%>Abstract.extensions); +}*/ + } + } +/*{ + // EC-20100420 add current extension after parent ones + // if current is loaded before required extension + // load failed because required extension is missing + exts.add(extension<%=clazz.getName()%>); + + extensions = Collections.unmodifiableList(exts); + } +}*/ + } + + private void generateAttribute(Writer output, ObjectModelAttribute attr) + throws IOException { + String attrType = computeType(attr); + if (EugengoUtils.notEmpty(attrType)) { + attrType = getType(attrType); + } else { + return; + } + + String attrName = attr.getName(); + String card = ""; + + //TODO ymartel 20090812: a better way to manage those DataTypes in the model? + if (attrType.contains("Collection") || attrType.contains("List") || attrType.contains("Set")) { + card = "[0-*]"; + // List<String> + Matcher match = extractTypeOnCollection.matcher(attrType); + if (match.matches()) { + attrType = match.group(1); + } + } + + if (!commonTypes.contains(attrType)) { + attrType = "Wikitty"; + } else if(commonNumerics.contains(attrType)) { + attrType = "Numeric"; + } else if(commonStrings.contains(attrType)) { + attrType = "String"; + } + + + int maxMultiplicity = attr.getMaxMultiplicity(); + if ((maxMultiplicity != 0 && maxMultiplicity != 1)){ + card = "[" + attr.getMinMultiplicity() + "-"; + if (maxMultiplicity == -1) { + card += "*]"; + } else { + card += maxMultiplicity + "]"; + } + } + + // FIXME EC-20100420 attr.isUnique() always return true for + // attributes (maybe use tagValue instead) + String unique = attr.isUnique() ? " unique" : ""; + + String tagValues = ""; + if ("designation".equals(attr.getName())) { + System.out.println("+++ DEBUG +++ " + attr.getName() + " " + attr.getTagValues()); + } + for (String tag : attr.getTagValues().keySet()) { + String value = attr.getTagValue(tag); + tagValues += " " + tag + "=" + value; + } + +/*{"<%=attrType%> <%=attrName%><%=card%><%=unique%><%=tagValues%>"}*/ + } + + private void generateParentMethod(Writer output, + ObjectModelClass clazz) throws IOException { + + // we must generate method for parent of parent + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { + generateParentMethod(output, parent); + } + } + + // generate method acces for parent attribut + generateAttributeAccessMethod(output, clazz); + } + + protected void generateWikittyAttributeAccessors(Writer output, + ObjectModelAttribute attr) throws IOException { + + EXT_NAME = "EXT_" + attr.getDeclaringElement().getName().toUpperCase(); + + String attrType = computeType(attr); + if (EugengoUtils.notEmpty(attrType)) { + attrType = getType(attrType, true); + } else { + return; + } + + // FIXME EC-20100421 cette methode peut retourner List<String> + // et generer la methode getWikitty().getFieldAsList<String>() + // qui ne peut pas compiler + String methodAccessName = getFieldAccessMethodName(attr); + + String attrName = attr.getName(); + String attrNameCapitalized = EugengoUtils.toUpperCaseFirstLetter(attrName); + +/*{ + public void set<%=attrNameCapitalized%>(<%=attrType%> <%=attrName%>) { + Object oldValue = getField(<%=EXT_NAME%>, "<%=attrName%>"); + getWikitty().setField(<%=EXT_NAME%>, "<%=attrName%>", <%=attrName%>); + propertyChangeSupport.firePropertyChange("<%=attrName%>", oldValue, <%=attrName%>); + } + + public <%=attrType%> get<%=attrNameCapitalized%>() { + <%=attrType%> result = getWikitty().getFieldAs<%=methodAccessName%>(<%=EXT_NAME%>, "<%=attrName%>"); + return result; + } + +}*/ + } + + /** + * Give the string to put after getFieldAs???, only some type is accepted + * and we must convert BusinessEntity to Wikitty string + * @param type + * @return + */ + protected String getFieldAccessMethodName(ObjectModelAttribute attr) { + String result = computeType(attr); + result = getType(result, true); + + boolean isCollection = (attr.getMaxMultiplicity() != 0 + && attr.getMaxMultiplicity() != 1); + if (isCollection) { + if (attr.isUnique()) { + result = "Set"; + } else { + result = "List"; + } + } else { + // test for Date + if ("java.util.Date".equals(result) || "Date".equals(result)) { + result = "Date"; + } else if (getModel().hasClass(result)) { // test for Wikitty object + ObjectModelClass fieldClass = getModel().getClass(result); + if (EugengoUtils.isBusinessEntity(fieldClass)) { + // for wikittyDto we use String for Id + result = "Wikitty"; + } + } else if (null != getModel().getEnumeration(result)) { + result = "String"; + } + } + result = EugengoUtils.toUpperCaseFirstLetter(result); + + return result; + } + + protected void generateCollectionAttributeAccessors(Writer output, + ObjectModelAttribute attr) throws IOException { + + EXT_NAME = "EXT_" + attr.getDeclaringElement().getName().toUpperCase(); + + String attrType = computeType(attr); + if (EugengoUtils.notEmpty(attrType)) { + attrType = getType(attrType, true); + } else { + return; + } + + // get collection element type for add and remove method arguement type + String elementType = getType(attr.getType(), true); + + String methodAccessName = getFieldAccessMethodName(attr); + + String attrName = attr.getName(); + String attrNameCapitalized = EugengoUtils.toUpperCaseFirstLetter(attrName); +/*{ public <%=attrType%> get<%=attrNameCapitalized%>() { + <%=attrType%> result = getWikitty().getFieldAs<%=methodAccessName%>(<%=EXT_NAME%>, "<%=attrName%>", <%=getClassAndGeneric(attrType)[1]%>.class); + return result; + } + + public void add<%=attrNameCapitalized%>(<%=elementType%> element) { + getWikitty().addToField(<%=EXT_NAME%>, "<%=attrName%>", element); + propertyChangeSupport.firePropertyChange("<%=attrName%>", null, get<%=attrNameCapitalized%>()); + } + + public void remove<%=attrNameCapitalized%>(<%=elementType%> element) { + getWikitty().removeFromField(<%=EXT_NAME%>, "<%=attrName%>", element); + propertyChangeSupport.firePropertyChange("<%=attrName%>", null, get<%=attrNameCapitalized%>()); + } + + public void clear<%=attrNameCapitalized%>() { + getWikitty().clearField(<%=EXT_NAME%>, "<%=attrName%>"); + propertyChangeSupport.firePropertyChange("<%=attrName%>", null, get<%=attrNameCapitalized%>()); + } + +}*/ + } + + private static Set<String> commonNumerics; + static { + commonNumerics = new HashSet<String>(); + commonNumerics.add("byte"); + commonNumerics.add("Byte"); + commonNumerics.add("short"); + commonNumerics.add("Short"); + commonNumerics.add("int"); + commonNumerics.add("Integer"); + commonNumerics.add("long"); + commonNumerics.add("Long"); + commonNumerics.add("float"); + commonNumerics.add("Float"); + commonNumerics.add("double"); + commonNumerics.add("Double"); + } + + private static Set<String> commonStrings; + static { + commonStrings = new HashSet<String>(); + commonStrings.add("char"); + commonStrings.add("Char"); + commonStrings.add("String"); + } + + private static Set<String> commonTypes; + static { + commonTypes = new HashSet<String>(); + commonTypes.addAll(commonNumerics); + commonTypes.addAll(commonStrings); + commonTypes.add("boolean"); + commonTypes.add("Boolean"); + commonTypes.add("Date"); + } + +}
Property changes on: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityAbstractGenerator.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityBeanGenerator.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityBeanGenerator.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityBeanGenerator.java 2010-05-17 08:38:51 UTC (rev 54) @@ -24,10 +24,7 @@ * Generate pure Bean Object (no wikitty object internaly stored) * * @author poussin - * - * @deprecated since 2.0 will be removed soon */ -@Deprecated public class BusinessEntityBeanGenerator extends WikengoCommonGenerator {
private static final Log log = LogFactory.getLog(BusinessEntityBeanGenerator.class); @@ -88,7 +85,9 @@ generateClazzDocumentation(output, clazz); String extendsString = " extends " + ( parentBean != null ? parentBean : getType("org.nuiton.wikitty.BusinessEntityBean") ); String abstractString = ""; - if (clazz.isAbstract()) { + + // Temp fix, if operation, set it as abstract + if (clazz.isAbstract() || !clazz.getOperations().isEmpty()) { abstractString += "abstract "; }
@@ -99,11 +98,7 @@ } }
-/*{/** - * @deprecated since 2.0 will be removed soon - *) -@Deprecated -public <%=abstractString%>class <%=name%><%=extendsString%> <%=implementsString%> { +/*{public <%=abstractString%>class <%=name%><%=extendsString%> <%=implementsString%> {
}*/
Deleted: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityGenerator.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityGenerator.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityGenerator.java 2010-05-17 08:38:51 UTC (rev 54) @@ -1,444 +0,0 @@ -package org.nuiton.wikitty.generator; - -import java.io.File; -import java.io.IOException; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.eugene.GeneratorUtil; -import org.nuiton.eugene.models.object.ObjectModelAttribute; -import org.nuiton.eugene.models.object.ObjectModelClass; - -/** - * Possible enhancement: - * - generateParentMethod can generate attribut method access that call - * the same method on parent instance class. For that we must have one attribut - * instance by parent. This attribut we must be created in setWikitty method - * and used same wikitty object. - * - * @author poussin - */ -public class BusinessEntityGenerator extends WikengoCommonGenerator { - - private static final Log log = LogFactory.getLog(BusinessEntityGenerator.class); - - static protected Pattern extractTypeOnCollection = Pattern.compile("\\w*<(\\w+)>"); - - protected String EXT_NAME; - - @Override - public String getFilenameForClass(ObjectModelClass clazz) { - String fqn = clazz.getQualifiedName(); - log.info( "Filename for " + clazz.getName() + " is " + fqn.replace('.', File.separatorChar) + ".java"); - return fqn.replace('.', File.separatorChar) + "Impl.java"; - } - - public void generateFromClass(Writer output, ObjectModelClass clazz) - throws IOException { - if (!EugengoUtils.isBusinessEntity(clazz)) { - log.info( clazz.getName() + " is not a business entity"); - return; - } - - log.info("Generate Business entity " + clazz.getName() + "... "); - generateCopyright(output); - - EXT_NAME = "EXT_" + clazz.getName().toUpperCase(); - - String packageName = clazz.getPackageName(); - String name = clazz.getName() + "Impl"; -/*{package <%=packageName%>; - -}*/ - ObjectModelClass superClass = findSuperClass(clazz); - - clearImports(); - addImport(clazz); - addImport(superClass); - addImport("org.nuiton.wikitty.WikittyUtil"); - addImport("org.nuiton.wikitty.Wikitty"); - addImport("org.nuiton.wikitty.BusinessEntityWikitty"); - addImport("org.nuiton.wikitty.WikittyExtension"); - addImport(Collection.class); - addImport(Collections.class); - addImport(List.class); - addImport(ArrayList.class); - String parentImpl = null; - for (ObjectModelClass parent : clazz.getSuperclasses()) { - if (EugengoUtils.isBusinessEntity(parent)) { - addImport(parent); - parentImpl = parent.getQualifiedName() + "Impl"; - addImport( parentImpl ); - } - } - lookForAttributeImports(clazz); - generateImports(output, packageName); - - generateClazzDocumentation(output, clazz); - String extendsString = " extends " + ( parentImpl != null ? parentImpl : getType("org.nuiton.wikitty.BusinessEntityWikitty") ); - String abstractString = ""; - if (clazz.isAbstract()) { - abstractString += "abstract "; - } - - String implementsString = "implements " + getType(clazz.getQualifiedName()); - for (ObjectModelClass parent : clazz.getSuperclasses()) { - if (EugengoUtils.isBusinessEntity(parent)) { - implementsString += ", " + getType(parent.getQualifiedName()); - } - } - -/*{public <%=abstractString%>class <%=name%><%=extendsString%> <%=implementsString%> { - -}*/ - - String svUID = GeneratorUtil.computeSerialVersionUID(clazz); -/*{ private static final long serialVersionUID = <%=svUID%>; - -}*/ - - generateWikittyExtension(output, clazz); - - generateStaticAttributes(output, clazz); - -/*{ - public <%=name%>() { - super(); - } - - public <%=name%>(BusinessEntityWikitty wi) { - super(wi.getWikitty()); - } - - public <%=name%>(Wikitty wi) { - super(wi); - } - -}*/ - - generateAttributeAccessMethod(output, clazz); - - for (ObjectModelClass parent : clazz.getSuperclasses()) { - if (EugengoUtils.isBusinessEntity(parent)) { - generateParentMethod(output, parent); - } - } - -/*{ @Override - public Collection<WikittyExtension> getStaticExtensions() { - return extensions; - } - - -} //<%=name%> -}*/ - - } - - - - // Utilitarian methods - - public void generateAttributeAccessMethod(Writer output, ObjectModelClass clazz) throws IOException { - for (ObjectModelAttribute attr : clazz.getAttributes()) { - if (attr.isNavigable() && !attr.isStatic() - && (attr.getStereotypes() == null || attr.getStereotypes().isEmpty())) { - if ((attr.getMaxMultiplicity() != 0 && attr.getMaxMultiplicity() != 1)) { - //TODO ymartel 20090812: when dataType "List", "Set" or "Collection" in model, must be here! - generateCollectionAttributeAccessors(output, attr); - } else { - generateWikittyAttributeAccessors(output, attr); - } - } - } - } - - private void generateWikittyExtension(Writer output, - ObjectModelClass clazz) throws IOException { - String version = clazz.getTagValue("version"); - - // Since wikitty 1.3, version need to be dotted - if ( version == null ) { - version = "1.0"; - } - - // get requires from parent - String requires = null; - String separator = ""; - for (ObjectModelClass parent : clazz.getSuperclasses()) { - if (EugengoUtils.isBusinessEntity(parent)) { - String parentExtName = "EXT_" + parent.getName().toUpperCase(); - - if (requires == null) { - requires = ""; - } - - requires += separator + parent.getName() + "." + parentExtName; - // dans le cas où on aurait un heritage multiple :) - // FIXME EC-20100420 gerer les extensions multiples - separator = " + \",\" /* FIXME Multiples extentions are not yet supported */ + "; - } - } - -/*{ static final protected List<WikittyExtension> extensions; - static final public WikittyExtension extension<%=clazz.getName()%> = - new WikittyExtension(<%=EXT_NAME%>, "<%=version%>", <%=requires%>, - WikittyUtil.buildFieldMapExtension(}*/ - - separator = ""; - for (ObjectModelAttribute attr : clazz.getAttributes()) { - if (attr.isNavigable() && !attr.isStatic() && - (attr.getStereotypes() == null || attr.getStereotypes().isEmpty())) { -/*{<%=separator%> - }*/ - generateAttribute(output, attr); - separator = ","; - } - } -/*{)); - static { - ArrayList<WikittyExtension> exts = new ArrayList<WikittyExtension>(); -}*/ - for (ObjectModelClass parent : clazz.getSuperclasses()) { - if (EugengoUtils.isBusinessEntity(parent)) { -/*{ - exts.addAll(<%=parent.getName()%>Impl.extensions); -}*/ - } - } -/*{ - // EC-20100420 add current extension after parent ones - // if current is loaded before required extension - // load failed because required extension is missing - exts.add(extension<%=clazz.getName()%>); - - extensions = Collections.unmodifiableList(exts); - } -}*/ - } - - private void generateAttribute(Writer output, ObjectModelAttribute attr) - throws IOException { - String attrType = computeType(attr); - if (EugengoUtils.notEmpty(attrType)) { - attrType = getType(attrType); - } else { - return; - } - - String attrName = attr.getName(); - String card = ""; - - //TODO ymartel 20090812: a better way to manage those DataTypes in the model? - if (attrType.contains("Collection") || attrType.contains("List") || attrType.contains("Set")) { - card = "[0-*]"; - // List<String> - Matcher match = extractTypeOnCollection.matcher(attrType); - if (match.matches()) { - attrType = match.group(1); - } - } - - if (!commonTypes.contains(attrType)) { - attrType = "Wikitty"; - } else if(commonNumerics.contains(attrType)) { - attrType = "Numeric"; - } else if(commonStrings.contains(attrType)) { - attrType = "String"; - } - - - int maxMultiplicity = attr.getMaxMultiplicity(); - if ((maxMultiplicity != 0 && maxMultiplicity != 1)){ - card = "[" + attr.getMinMultiplicity() + "-"; - if (maxMultiplicity == -1) { - card += "*]"; - } else { - card += maxMultiplicity + "]"; - } - } - - // FIXME EC-20100420 attr.isUnique() always return true for - // attributes (maybe use tagValue instead) - String unique = attr.isUnique() ? " unique" : ""; - - String tagValues = ""; - if ("designation".equals(attr.getName())) { - System.out.println("+++ DEBUG +++ " + attr.getName() + " " + attr.getTagValues()); - } - for (String tag : attr.getTagValues().keySet()) { - String value = attr.getTagValue(tag); - tagValues += " " + tag + "=" + value; - } - -/*{"<%=attrType%> <%=attrName%><%=card%><%=unique%><%=tagValues%>"}*/ - } - - private void generateParentMethod(Writer output, - ObjectModelClass clazz) throws IOException { - - // we must generate method for parent of parent - for (ObjectModelClass parent : clazz.getSuperclasses()) { - if (EugengoUtils.isBusinessEntity(parent)) { - generateParentMethod(output, parent); - } - } - - // generate method acces for parent attribut - generateAttributeAccessMethod(output, clazz); - } - - protected void generateWikittyAttributeAccessors(Writer output, - ObjectModelAttribute attr) throws IOException { - - EXT_NAME = "EXT_" + attr.getDeclaringElement().getName().toUpperCase(); - - String attrType = computeType(attr); - if (EugengoUtils.notEmpty(attrType)) { - attrType = getType(attrType, true); - } else { - return; - } - - // FIXME EC-20100421 cette methode peut retourner List<String> - // et generer la methode getWikitty().getFieldAsList<String>() - // qui ne peut pas compiler - String methodAccessName = getFieldAccessMethodName(attr); - - String attrName = attr.getName(); - String attrNameCapitalized = EugengoUtils.toUpperCaseFirstLetter(attrName); - -/*{ - public void set<%=attrNameCapitalized%>(<%=attrType%> <%=attrName%>) { - getWikitty().setField(<%=EXT_NAME%>, "<%=attrName%>", <%=attrName%>); - } - - public <%=attrType%> get<%=attrNameCapitalized%>() { - <%=attrType%> result = getWikitty().getFieldAs<%=methodAccessName%>(<%=EXT_NAME%>, "<%=attrName%>"); - return result; - } - -}*/ - } - - /** - * Give the string to put after getFieldAs???, only some type is accepted - * and we must convert BusinessEntity to Wikitty string - * @param type - * @return - */ - protected String getFieldAccessMethodName(ObjectModelAttribute attr) { - String result = computeType(attr); - result = getType(result, true); - - boolean isCollection = (attr.getMaxMultiplicity() != 0 - && attr.getMaxMultiplicity() != 1); - if (isCollection) { - if (attr.isUnique()) { - result = "Set"; - } else { - result = "List"; - } - } else { - // test for Date - if ("java.util.Date".equals(result) || "Date".equals(result)) { - result = "Date"; - } else if (getModel().hasClass(result)) { // test for Wikitty object - ObjectModelClass fieldClass = getModel().getClass(result); - if (EugengoUtils.isBusinessEntity(fieldClass)) { - // for wikittyDto we use String for Id - result = "Wikitty"; - } - } else if (null != getModel().getEnumeration(result)) { - result = "String"; - } - } - result = EugengoUtils.toUpperCaseFirstLetter(result); - - return result; - } - - protected void generateCollectionAttributeAccessors(Writer output, - ObjectModelAttribute attr) throws IOException { - - EXT_NAME = "EXT_" + attr.getDeclaringElement().getName().toUpperCase(); - - String attrType = computeType(attr); - if (EugengoUtils.notEmpty(attrType)) { - attrType = getType(attrType, true); - } else { - return; - } - - // get collection element type for add and remove method arguement type - String elementType = getType(attr.getType(), true); - - String methodAccessName = getFieldAccessMethodName(attr); - - String attrName = attr.getName(); - String attrNameCapitalized = EugengoUtils.toUpperCaseFirstLetter(attrName); -/*{ public <%=attrType%> get<%=attrNameCapitalized%>() { - <%=attrType%> result = getWikitty().getFieldAs<%=methodAccessName%>(<%=EXT_NAME%>, "<%=attrName%>", <%=getClassAndGeneric(attrType)[1]%>.class); - return result; - } - - public void add<%=attrNameCapitalized%>(<%=elementType%> element) { - getWikitty().addToField(<%=EXT_NAME%>, "<%=attrName%>", element); - } - - public void remove<%=attrNameCapitalized%>(<%=elementType%> element) { - getWikitty().removeFromField(<%=EXT_NAME%>, "<%=attrName%>", element); - } - - public void clear<%=attrNameCapitalized%>() { - getWikitty().clearField(<%=EXT_NAME%>, "<%=attrName%>"); - } - -}*/ - } - - private static Set<String> commonNumerics; - static { - commonNumerics = new HashSet<String>(); - commonNumerics.add("byte"); - commonNumerics.add("Byte"); - commonNumerics.add("short"); - commonNumerics.add("Short"); - commonNumerics.add("int"); - commonNumerics.add("Integer"); - commonNumerics.add("long"); - commonNumerics.add("Long"); - commonNumerics.add("float"); - commonNumerics.add("Float"); - commonNumerics.add("double"); - commonNumerics.add("Double"); - } - - private static Set<String> commonStrings; - static { - commonStrings = new HashSet<String>(); - commonStrings.add("char"); - commonStrings.add("Char"); - commonStrings.add("String"); - } - - private static Set<String> commonTypes; - static { - commonTypes = new HashSet<String>(); - commonTypes.addAll(commonNumerics); - commonTypes.addAll(commonStrings); - commonTypes.add("boolean"); - commonTypes.add("Boolean"); - commonTypes.add("Date"); - } - -}
Added: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityImplGenerator.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityImplGenerator.java (rev 0) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityImplGenerator.java 2010-05-17 08:38:51 UTC (rev 54) @@ -0,0 +1,150 @@ +package org.nuiton.wikitty.generator; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.models.object.ObjectModelAttribute; +import org.nuiton.eugene.models.object.ObjectModelClass; + +/** + * Possible enhancement: + * - generateParentMethod can generate attribut method access that call + * the same method on parent instance class. For that we must have one attribut + * instance by parent. This attribut we must be created in setWikitty method + * and used same wikitty object. + * + * @author poussin + */ +public class BusinessEntityImplGenerator extends WikengoCommonGenerator { + + private static final Log log = LogFactory.getLog(BusinessEntityImplGenerator.class); + + @Override + public String getFilenameForClass(ObjectModelClass clazz) { + String fqn = clazz.getQualifiedName(); + log.info( "Filename for " + clazz.getName() + " is " + fqn.replace('.', File.separatorChar) + ".java"); + return fqn.replace('.', File.separatorChar) + "Impl.java"; + } + + public void generateFromClass(Writer output, ObjectModelClass clazz) + throws IOException { + if (!EugengoUtils.isBusinessEntity(clazz)) { + log.info( clazz.getName() + " is not a business entity"); + return; + } + + // On ne génère pas le impl si l'entité a des opérations + if (clazz.getOperations().size() > 0) { + return; + } + + log.info("Generate Business entity impl" + clazz.getName() + "... "); + generateCopyright(output); + + String packageName = clazz.getPackageName(); + String className = clazz.getName(); + String name = className + "Impl"; +/*{package <%=packageName%>; + +}*/ + ObjectModelClass superClass = findSuperClass(clazz); + + clearImports(); + addImport(clazz); + addImport(superClass); + addImport("org.nuiton.wikitty.WikittyUtil"); + addImport("org.nuiton.wikitty.Wikitty"); + addImport("org.nuiton.wikitty.BusinessEntityWikitty"); + addImport("org.nuiton.wikitty.WikittyExtension"); + addImport(Collection.class); + addImport(Collections.class); + addImport(List.class); + addImport(ArrayList.class); + String parentImpl = null; + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { + addImport(parent); + parentImpl = parent.getQualifiedName() + "Impl"; + addImport( parentImpl ); + } + } + lookForAttributeImports(clazz); + generateImports(output, packageName); + + generateClazzDocumentation(output, clazz); + String abstractString = ""; + if (clazz.isAbstract()) { + abstractString += "abstract "; + } + +/*{public <%=abstractString%>class <%=className%>Impl extends <%=className%>Abstract { + +}*/ + + String svUID = GeneratorUtil.computeSerialVersionUID(clazz); +/*{ private static final long serialVersionUID = <%=svUID%>; + + public <%=name%>() { + super(); + } + + public <%=name%>(BusinessEntityWikitty wi) { + super(wi.getWikitty()); + } + + public <%=name%>(Wikitty wi) { + super(wi); + } + +} //<%=name%> +}*/ + } + + private static Set<String> commonNumerics; + static { + commonNumerics = new HashSet<String>(); + commonNumerics.add("byte"); + commonNumerics.add("Byte"); + commonNumerics.add("short"); + commonNumerics.add("Short"); + commonNumerics.add("int"); + commonNumerics.add("Integer"); + commonNumerics.add("long"); + commonNumerics.add("Long"); + commonNumerics.add("float"); + commonNumerics.add("Float"); + commonNumerics.add("double"); + commonNumerics.add("Double"); + } + + private static Set<String> commonStrings; + static { + commonStrings = new HashSet<String>(); + commonStrings.add("char"); + commonStrings.add("Char"); + commonStrings.add("String"); + } + + private static Set<String> commonTypes; + static { + commonTypes = new HashSet<String>(); + commonTypes.addAll(commonNumerics); + commonTypes.addAll(commonStrings); + commonTypes.add("boolean"); + commonTypes.add("Boolean"); + commonTypes.add("Date"); + } + +}
Property changes on: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityImplGenerator.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityInterfaceGenerator.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityInterfaceGenerator.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityInterfaceGenerator.java 2010-05-17 08:38:51 UTC (rev 54) @@ -3,11 +3,16 @@ import java.io.File; import java.io.IOException; import java.io.Writer; +import java.util.Collection; +import java.util.Set;
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.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelClassifier; +import org.nuiton.eugene.models.object.ObjectModelOperation; +import org.nuiton.eugene.models.object.ObjectModelParameter;
/** * Interface for BusinessEntity, interfaces are needed for multiple inheritance @@ -74,6 +79,8 @@ generateStaticAttributes(output, clazz);
generateAttributeAccessMethod(output, clazz); + + generateInterfaceOperations(output, clazz);
/*{ } //<%=name%> @@ -149,4 +156,45 @@ }*/ }
+ private void generateInterfaceOperations(Writer output, ObjectModelClassifier classifier) throws IOException { + for (ObjectModelOperation op : classifier.getOperations()) { + String opName = op.getName(); +/*{ /** +}*/ + if (EugengoUtils.hasDocumentation(op)) { + 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 opType = op.getReturnType(); +/*{ *) + <%=opVisibility%> <%=opType%> <%=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 = ", "; + } +/*{; + +}*/ + } + } + }
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyMetaGenerator.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyMetaGenerator.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyMetaGenerator.java 2010-05-17 08:38:51 UTC (rev 54) @@ -31,7 +31,8 @@
// Wikitty (Interface, impl...) BusinessEntityInterfaceGenerator.class, - BusinessEntityGenerator.class, + BusinessEntityAbstractGenerator.class, + BusinessEntityImplGenerator.class, BusinessEntityBeanGenerator.class
));
_______________________________________________ Wikitty-commits mailing list Wikitty-commits@list.nuiton.org http://list.nuiton.org/cgi-bin/mailman/listinfo/wikitty-commits
-- Tony Chemit -------------------- tél: +33 (0) 2 40 50 29 28 email: chemit@codelutin.com http://www.codelutin.com
Le Mon, 17 May 2010 10:48:49 +0200, Tony Chemit <chemit@codelutin.com> a écrit :
Yo,
Petites questions innocentes :
1) tu utilise les tranformer ? 2) tu as vu les évolution d'eugene ?
Car il serait bien qu'on commence à mutualiser un peu les templates.
Plutôt que de continuer a écrire des Générators inmaintenables...
Et de réinventer la roue pour écrire quelque chose déjà réécrit au moins 3 fois auparavant sur les bean. Y'a une classe JavaGeneratorUtil dans EUGene quand lequel on devrait mettre des méthodes pour la génération java : Par exemple : - génération de PropertyChangeSupport (voir pour tous les listeners JavaBeans ?) - génération getter/setter Et y'a une évolution qui en parle je crois : http://nuiton.org/issues/show/611
Le Mon, 17 May 2010 10:38:51 +0200 (CEST), echatellier@users.nuiton.org a écrit :
Author: echatellier Date: 2010-05-17 10:38:51 +0200 (Mon, 17 May 2010) New Revision: 54
Url: http://nuiton.org/repositories/revision/wikitty/54
Log: Add interface/abstract/impl generation. Add property change support.
Added: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityAbstractGenerator.java trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityImplGenerator.java Removed: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityGenerator.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntity.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityBean.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityWikitty.java trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityBeanGenerator.java trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityInterfaceGenerator.java trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyMetaGenerator.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntity.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntity.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntity.java 2010-05-17 08:38:51 UTC (rev 54) @@ -17,6 +17,7 @@
package org.nuiton.wikitty;
+import java.beans.PropertyChangeListener; import java.io.Serializable; import java.util.Collection;
@@ -77,5 +78,35 @@ * @return */ public FieldType getFieldType(String ext, String fieldName); + + /** + * Ajoute un listener gloable + * + * @param listener le listener à ajouter + */ + void addPropertyChangeListener(PropertyChangeListener listener);
+ /** + * Supprime un listener globable. + * + * @param listener le listener à supprimer + */ + void removePropertyChangeListener(PropertyChangeListener listener); + + /** + * Ajoute un listener sur la propriété {@code propertyName} + * + * @param propertyName le nom de la propriété + * @param listener le listener à ajouter + */ + void addPropertyChangeListener(String propertyName, PropertyChangeListener listener); + + /** + * Supprime un listener sur la propriété {@code propertyName} + * + * @param propertyName le nom de la propriété + * @param listener le listener à supprimer + */ + void removePropertyChangeListener(String propertyName, PropertyChangeListener listener); + }
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityBean.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityBean.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityBean.java 2010-05-17 08:38:51 UTC (rev 54) @@ -17,6 +17,8 @@
package org.nuiton.wikitty;
+import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; @@ -32,8 +34,11 @@ */ public class BusinessEntityBean implements BusinessEntity {
- private static final long serialVersionUID = 1L; + /** serialVersionUID. */ + private static final long serialVersionUID = 5245199905431320116L;
+ protected transient PropertyChangeSupport propertyChangeSupport; + protected String id; protected String version;
@@ -89,4 +94,37 @@ throw new UnsupportedOperationException("Not supported yet."); }
+ /* + * @see org.nuiton.wikitty.BusinessEntity#addPropertyChangeListener(java.beans.PropertyChangeListener) + */ + @Override + public void addPropertyChangeListener(PropertyChangeListener listener) { + propertyChangeSupport.addPropertyChangeListener(listener); + } + + /* + * @see org.nuiton.wikitty.BusinessEntity#removePropertyChangeListener(java.beans.PropertyChangeListener) + */ + @Override + public void removePropertyChangeListener(PropertyChangeListener listener) { + propertyChangeSupport.removePropertyChangeListener(listener); + } + + /* + * @see org.nuiton.wikitty.BusinessEntity#addPropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener) + */ + @Override + public void addPropertyChangeListener(String propertyName, + PropertyChangeListener listener) { + propertyChangeSupport.addPropertyChangeListener(propertyName, listener); + } + + /* + * @see org.nuiton.wikitty.BusinessEntity#removePropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener) + */ + @Override + public void removePropertyChangeListener(String propertyName, + PropertyChangeListener listener) { + propertyChangeSupport.removePropertyChangeListener(propertyName, listener); + } }
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityWikitty.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityWikitty.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityWikitty.java 2010-05-17 08:38:51 UTC (rev 54) @@ -17,6 +17,8 @@
package org.nuiton.wikitty;
+import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; import java.util.Collection; import java.util.Collections;
@@ -32,16 +34,20 @@ */ public class BusinessEntityWikitty implements BusinessEntity {
- private static final long serialVersionUID = 1L; + /** serialVersionUID. */ + private static final long serialVersionUID = -4399752739887114180L;
+ protected transient PropertyChangeSupport propertyChangeSupport; + protected Wikitty wikitty;
public BusinessEntityWikitty(Wikitty wi) { + propertyChangeSupport = new PropertyChangeSupport(this); setWikitty(wi); }
public BusinessEntityWikitty() { - setWikitty(new Wikitty()); + this(new Wikitty()); }
public String getWikittyId() { @@ -98,4 +104,38 @@ public Collection<WikittyExtension> getStaticExtensions() { return Collections.emptyList(); } + + /* + * @see org.nuiton.wikitty.BusinessEntity#addPropertyChangeListener(java.beans.PropertyChangeListener) + */ + @Override + public void addPropertyChangeListener(PropertyChangeListener listener) { + propertyChangeSupport.addPropertyChangeListener(listener); + } + + /* + * @see org.nuiton.wikitty.BusinessEntity#removePropertyChangeListener(java.beans.PropertyChangeListener) + */ + @Override + public void removePropertyChangeListener(PropertyChangeListener listener) { + propertyChangeSupport.removePropertyChangeListener(listener); + } + + /* + * @see org.nuiton.wikitty.BusinessEntity#addPropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener) + */ + @Override + public void addPropertyChangeListener(String propertyName, + PropertyChangeListener listener) { + propertyChangeSupport.addPropertyChangeListener(propertyName, listener); + } + + /* + * @see org.nuiton.wikitty.BusinessEntity#removePropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener) + */ + @Override + public void removePropertyChangeListener(String propertyName, + PropertyChangeListener listener) { + propertyChangeSupport.removePropertyChangeListener(propertyName, listener); + } }
Added: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityAbstractGenerator.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityAbstractGenerator.java (rev 0) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityAbstractGenerator.java 2010-05-17 08:38:51 UTC (rev 54) @@ -0,0 +1,445 @@ +package org.nuiton.wikitty.generator; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.models.object.ObjectModelAttribute; +import org.nuiton.eugene.models.object.ObjectModelClass; + +/** + * Possible enhancement: + * - generateParentMethod can generate attribut method access that call + * the same method on parent instance class. For that we must have one attribut + * instance by parent. This attribut we must be created in setWikitty method + * and used same wikitty object. + * + * @author poussin + */ +public class BusinessEntityAbstractGenerator extends WikengoCommonGenerator { + + private static final Log log = LogFactory.getLog(BusinessEntityAbstractGenerator.class); + + static protected Pattern extractTypeOnCollection = Pattern.compile("\\w*<(\\w+)>"); + + protected String EXT_NAME; + + @Override + public String getFilenameForClass(ObjectModelClass clazz) { + String fqn = clazz.getQualifiedName(); + log.info( "Filename for " + clazz.getName() + " is " + fqn.replace('.', File.separatorChar) + ".java"); + return fqn.replace('.', File.separatorChar) + "Abstract.java"; + } + + public void generateFromClass(Writer output, ObjectModelClass clazz) + throws IOException { + if (!EugengoUtils.isBusinessEntity(clazz)) { + log.info( clazz.getName() + " is not a business entity"); + return; + } + + log.info("Generate Business entity abstract" + clazz.getName() + "... "); + generateCopyright(output); + + EXT_NAME = "EXT_" + clazz.getName().toUpperCase(); + + String packageName = clazz.getPackageName(); + String name = clazz.getName() + "Abstract"; +/*{package <%=packageName%>; + +}*/ + ObjectModelClass superClass = findSuperClass(clazz); + + clearImports(); + addImport(clazz); + addImport(superClass); + addImport("org.nuiton.wikitty.WikittyUtil"); + addImport("org.nuiton.wikitty.Wikitty"); + addImport("org.nuiton.wikitty.BusinessEntityWikitty"); + addImport("org.nuiton.wikitty.WikittyExtension"); + addImport(Collection.class); + addImport(Collections.class); + addImport(List.class); + addImport(ArrayList.class); + String parentImpl = null; + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { + addImport(parent); + parentImpl = parent.getQualifiedName() + "Impl"; + addImport( parentImpl ); + } + } + lookForAttributeImports(clazz); + generateImports(output, packageName); + + generateClazzDocumentation(output, clazz); + String extendsString = " extends " + ( parentImpl != null ? parentImpl : getType("org.nuiton.wikitty.BusinessEntityWikitty") ); + + String implementsString = "implements " + getType(clazz.getQualifiedName()); + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { + implementsString += ", " + getType(parent.getQualifiedName()); + } + } + +/*{public abstract class <%=name%><%=extendsString%> <%=implementsString%> { + +}*/ + + String svUID = GeneratorUtil.computeSerialVersionUID(clazz); +/*{ private static final long serialVersionUID = <%=svUID%>; + +}*/ + + generateWikittyExtension(output, clazz); + + generateStaticAttributes(output, clazz); + +/*{ + public <%=name%>() { + super(); + } + + public <%=name%>(BusinessEntityWikitty wi) { + super(wi.getWikitty()); + } + + public <%=name%>(Wikitty wi) { + super(wi); + } + +}*/ + + generateAttributeAccessMethod(output, clazz); + + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { + generateParentMethod(output, parent); + } + } + +/*{ @Override + public Collection<WikittyExtension> getStaticExtensions() { + return extensions; + } + + +} //<%=name%> +}*/ + + } + + + + // Utilitarian methods + + public void generateAttributeAccessMethod(Writer output, ObjectModelClass clazz) throws IOException { + for (ObjectModelAttribute attr : clazz.getAttributes()) { + if (attr.isNavigable() && !attr.isStatic() + && (attr.getStereotypes() == null || attr.getStereotypes().isEmpty())) { + if ((attr.getMaxMultiplicity() != 0 && attr.getMaxMultiplicity() != 1)) { + //TODO ymartel 20090812: when dataType "List", "Set" or "Collection" in model, must be here! + generateCollectionAttributeAccessors(output, attr); + } else { + generateWikittyAttributeAccessors(output, attr); + } + } + } + } + + private void generateWikittyExtension(Writer output, + ObjectModelClass clazz) throws IOException { + String version = clazz.getTagValue("version"); + + // Since wikitty 1.3, version need to be dotted + if ( version == null ) { + version = "1.0"; + } + + // get requires from parent + String requires = null; + String separator = ""; + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { + String parentExtName = "EXT_" + parent.getName().toUpperCase(); + + if (requires == null) { + requires = ""; + } + + requires += separator + parent.getName() + "." + parentExtName; + // dans le cas où on aurait un heritage multiple :) + // FIXME EC-20100420 gerer les extensions multiples + separator = " + \",\" /* FIXME Multiples extentions are not yet supported */ + "; + } + } + +/*{ static final protected List<WikittyExtension> extensions; + static final public WikittyExtension extension<%=clazz.getName()%> = + new WikittyExtension(<%=EXT_NAME%>, "<%=version%>", <%=requires%>, + WikittyUtil.buildFieldMapExtension(}*/ + + separator = ""; + for (ObjectModelAttribute attr : clazz.getAttributes()) { + if (attr.isNavigable() && !attr.isStatic() && + (attr.getStereotypes() == null || attr.getStereotypes().isEmpty())) { +/*{<%=separator%> + }*/ + generateAttribute(output, attr); + separator = ","; + } + } +/*{)); + static { + ArrayList<WikittyExtension> exts = new ArrayList<WikittyExtension>(); +}*/ + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { +/*{ + exts.addAll(<%=parent.getName()%>Abstract.extensions); +}*/ + } + } +/*{ + // EC-20100420 add current extension after parent ones + // if current is loaded before required extension + // load failed because required extension is missing + exts.add(extension<%=clazz.getName()%>); + + extensions = Collections.unmodifiableList(exts); + } +}*/ + } + + private void generateAttribute(Writer output, ObjectModelAttribute attr) + throws IOException { + String attrType = computeType(attr); + if (EugengoUtils.notEmpty(attrType)) { + attrType = getType(attrType); + } else { + return; + } + + String attrName = attr.getName(); + String card = ""; + + //TODO ymartel 20090812: a better way to manage those DataTypes in the model? + if (attrType.contains("Collection") || attrType.contains("List") || attrType.contains("Set")) { + card = "[0-*]"; + // List<String> + Matcher match = extractTypeOnCollection.matcher(attrType); + if (match.matches()) { + attrType = match.group(1); + } + } + + if (!commonTypes.contains(attrType)) { + attrType = "Wikitty"; + } else if(commonNumerics.contains(attrType)) { + attrType = "Numeric"; + } else if(commonStrings.contains(attrType)) { + attrType = "String"; + } + + + int maxMultiplicity = attr.getMaxMultiplicity(); + if ((maxMultiplicity != 0 && maxMultiplicity != 1)){ + card = "[" + attr.getMinMultiplicity() + "-"; + if (maxMultiplicity == -1) { + card += "*]"; + } else { + card += maxMultiplicity + "]"; + } + } + + // FIXME EC-20100420 attr.isUnique() always return true for + // attributes (maybe use tagValue instead) + String unique = attr.isUnique() ? " unique" : ""; + + String tagValues = ""; + if ("designation".equals(attr.getName())) { + System.out.println("+++ DEBUG +++ " + attr.getName() + " " + attr.getTagValues()); + } + for (String tag : attr.getTagValues().keySet()) { + String value = attr.getTagValue(tag); + tagValues += " " + tag + "=" + value; + } + +/*{"<%=attrType%> <%=attrName%><%=card%><%=unique%><%=tagValues%>"}*/ + } + + private void generateParentMethod(Writer output, + ObjectModelClass clazz) throws IOException { + + // we must generate method for parent of parent + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { + generateParentMethod(output, parent); + } + } + + // generate method acces for parent attribut + generateAttributeAccessMethod(output, clazz); + } + + protected void generateWikittyAttributeAccessors(Writer output, + ObjectModelAttribute attr) throws IOException { + + EXT_NAME = "EXT_" + attr.getDeclaringElement().getName().toUpperCase(); + + String attrType = computeType(attr); + if (EugengoUtils.notEmpty(attrType)) { + attrType = getType(attrType, true); + } else { + return; + } + + // FIXME EC-20100421 cette methode peut retourner List<String> + // et generer la methode getWikitty().getFieldAsList<String>() + // qui ne peut pas compiler + String methodAccessName = getFieldAccessMethodName(attr); + + String attrName = attr.getName(); + String attrNameCapitalized = EugengoUtils.toUpperCaseFirstLetter(attrName); + +/*{ + public void set<%=attrNameCapitalized%>(<%=attrType%> <%=attrName%>) { + Object oldValue = getField(<%=EXT_NAME%>, "<%=attrName%>"); + getWikitty().setField(<%=EXT_NAME%>, "<%=attrName%>", <%=attrName%>); + propertyChangeSupport.firePropertyChange("<%=attrName%>", oldValue, <%=attrName%>); + } + + public <%=attrType%> get<%=attrNameCapitalized%>() { + <%=attrType%> result = getWikitty().getFieldAs<%=methodAccessName%>(<%=EXT_NAME%>, "<%=attrName%>"); + return result; + } + +}*/ + } + + /** + * Give the string to put after getFieldAs???, only some type is accepted + * and we must convert BusinessEntity to Wikitty string + * @param type + * @return + */ + protected String getFieldAccessMethodName(ObjectModelAttribute attr) { + String result = computeType(attr); + result = getType(result, true); + + boolean isCollection = (attr.getMaxMultiplicity() != 0 + && attr.getMaxMultiplicity() != 1); + if (isCollection) { + if (attr.isUnique()) { + result = "Set"; + } else { + result = "List"; + } + } else { + // test for Date + if ("java.util.Date".equals(result) || "Date".equals(result)) { + result = "Date"; + } else if (getModel().hasClass(result)) { // test for Wikitty object + ObjectModelClass fieldClass = getModel().getClass(result); + if (EugengoUtils.isBusinessEntity(fieldClass)) { + // for wikittyDto we use String for Id + result = "Wikitty"; + } + } else if (null != getModel().getEnumeration(result)) { + result = "String"; + } + } + result = EugengoUtils.toUpperCaseFirstLetter(result); + + return result; + } + + protected void generateCollectionAttributeAccessors(Writer output, + ObjectModelAttribute attr) throws IOException { + + EXT_NAME = "EXT_" + attr.getDeclaringElement().getName().toUpperCase(); + + String attrType = computeType(attr); + if (EugengoUtils.notEmpty(attrType)) { + attrType = getType(attrType, true); + } else { + return; + } + + // get collection element type for add and remove method arguement type + String elementType = getType(attr.getType(), true); + + String methodAccessName = getFieldAccessMethodName(attr); + + String attrName = attr.getName(); + String attrNameCapitalized = EugengoUtils.toUpperCaseFirstLetter(attrName); +/*{ public <%=attrType%> get<%=attrNameCapitalized%>() { + <%=attrType%> result = getWikitty().getFieldAs<%=methodAccessName%>(<%=EXT_NAME%>, "<%=attrName%>", <%=getClassAndGeneric(attrType)[1]%>.class); + return result; + } + + public void add<%=attrNameCapitalized%>(<%=elementType%> element) { + getWikitty().addToField(<%=EXT_NAME%>, "<%=attrName%>", element); + propertyChangeSupport.firePropertyChange("<%=attrName%>", null, get<%=attrNameCapitalized%>()); + } + + public void remove<%=attrNameCapitalized%>(<%=elementType%> element) { + getWikitty().removeFromField(<%=EXT_NAME%>, "<%=attrName%>", element); + propertyChangeSupport.firePropertyChange("<%=attrName%>", null, get<%=attrNameCapitalized%>()); + } + + public void clear<%=attrNameCapitalized%>() { + getWikitty().clearField(<%=EXT_NAME%>, "<%=attrName%>"); + propertyChangeSupport.firePropertyChange("<%=attrName%>", null, get<%=attrNameCapitalized%>()); + } + +}*/ + } + + private static Set<String> commonNumerics; + static { + commonNumerics = new HashSet<String>(); + commonNumerics.add("byte"); + commonNumerics.add("Byte"); + commonNumerics.add("short"); + commonNumerics.add("Short"); + commonNumerics.add("int"); + commonNumerics.add("Integer"); + commonNumerics.add("long"); + commonNumerics.add("Long"); + commonNumerics.add("float"); + commonNumerics.add("Float"); + commonNumerics.add("double"); + commonNumerics.add("Double"); + } + + private static Set<String> commonStrings; + static { + commonStrings = new HashSet<String>(); + commonStrings.add("char"); + commonStrings.add("Char"); + commonStrings.add("String"); + } + + private static Set<String> commonTypes; + static { + commonTypes = new HashSet<String>(); + commonTypes.addAll(commonNumerics); + commonTypes.addAll(commonStrings); + commonTypes.add("boolean"); + commonTypes.add("Boolean"); + commonTypes.add("Date"); + } + +}
Property changes on: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityAbstractGenerator.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityBeanGenerator.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityBeanGenerator.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityBeanGenerator.java 2010-05-17 08:38:51 UTC (rev 54) @@ -24,10 +24,7 @@ * Generate pure Bean Object (no wikitty object internaly stored) * * @author poussin - * - * @deprecated since 2.0 will be removed soon */ -@Deprecated public class BusinessEntityBeanGenerator extends WikengoCommonGenerator {
private static final Log log = LogFactory.getLog(BusinessEntityBeanGenerator.class); @@ -88,7 +85,9 @@ generateClazzDocumentation(output, clazz); String extendsString = " extends " + ( parentBean != null ? parentBean : getType("org.nuiton.wikitty.BusinessEntityBean") ); String abstractString = ""; - if (clazz.isAbstract()) { + + // Temp fix, if operation, set it as abstract + if (clazz.isAbstract() || !clazz.getOperations().isEmpty()) { abstractString += "abstract "; }
@@ -99,11 +98,7 @@ } }
-/*{/** - * @deprecated since 2.0 will be removed soon - *) -@Deprecated -public <%=abstractString%>class <%=name%><%=extendsString%> <%=implementsString%> { +/*{public <%=abstractString%>class <%=name%><%=extendsString%> <%=implementsString%> {
}*/
Deleted: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityGenerator.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityGenerator.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityGenerator.java 2010-05-17 08:38:51 UTC (rev 54) @@ -1,444 +0,0 @@ -package org.nuiton.wikitty.generator; - -import java.io.File; -import java.io.IOException; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.eugene.GeneratorUtil; -import org.nuiton.eugene.models.object.ObjectModelAttribute; -import org.nuiton.eugene.models.object.ObjectModelClass; - -/** - * Possible enhancement: - * - generateParentMethod can generate attribut method access that call - * the same method on parent instance class. For that we must have one attribut - * instance by parent. This attribut we must be created in setWikitty method - * and used same wikitty object. - * - * @author poussin - */ -public class BusinessEntityGenerator extends WikengoCommonGenerator { - - private static final Log log = LogFactory.getLog(BusinessEntityGenerator.class); - - static protected Pattern extractTypeOnCollection = Pattern.compile("\\w*<(\\w+)>"); - - protected String EXT_NAME; - - @Override - public String getFilenameForClass(ObjectModelClass clazz) { - String fqn = clazz.getQualifiedName(); - log.info( "Filename for " + clazz.getName() + " is " + fqn.replace('.', File.separatorChar) + ".java"); - return fqn.replace('.', File.separatorChar) + "Impl.java"; - } - - public void generateFromClass(Writer output, ObjectModelClass clazz) - throws IOException { - if (!EugengoUtils.isBusinessEntity(clazz)) { - log.info( clazz.getName() + " is not a business entity"); - return; - } - - log.info("Generate Business entity " + clazz.getName() + "... "); - generateCopyright(output); - - EXT_NAME = "EXT_" + clazz.getName().toUpperCase(); - - String packageName = clazz.getPackageName(); - String name = clazz.getName() + "Impl"; -/*{package <%=packageName%>; - -}*/ - ObjectModelClass superClass = findSuperClass(clazz); - - clearImports(); - addImport(clazz); - addImport(superClass); - addImport("org.nuiton.wikitty.WikittyUtil"); - addImport("org.nuiton.wikitty.Wikitty"); - addImport("org.nuiton.wikitty.BusinessEntityWikitty"); - addImport("org.nuiton.wikitty.WikittyExtension"); - addImport(Collection.class); - addImport(Collections.class); - addImport(List.class); - addImport(ArrayList.class); - String parentImpl = null; - for (ObjectModelClass parent : clazz.getSuperclasses()) { - if (EugengoUtils.isBusinessEntity(parent)) { - addImport(parent); - parentImpl = parent.getQualifiedName() + "Impl"; - addImport( parentImpl ); - } - } - lookForAttributeImports(clazz); - generateImports(output, packageName); - - generateClazzDocumentation(output, clazz); - String extendsString = " extends " + ( parentImpl != null ? parentImpl : getType("org.nuiton.wikitty.BusinessEntityWikitty") ); - String abstractString = ""; - if (clazz.isAbstract()) { - abstractString += "abstract "; - } - - String implementsString = "implements " + getType(clazz.getQualifiedName()); - for (ObjectModelClass parent : clazz.getSuperclasses()) { - if (EugengoUtils.isBusinessEntity(parent)) { - implementsString += ", " + getType(parent.getQualifiedName()); - } - } - -/*{public <%=abstractString%>class <%=name%><%=extendsString%> <%=implementsString%> { - -}*/ - - String svUID = GeneratorUtil.computeSerialVersionUID(clazz); -/*{ private static final long serialVersionUID = <%=svUID%>; - -}*/ - - generateWikittyExtension(output, clazz); - - generateStaticAttributes(output, clazz); - -/*{ - public <%=name%>() { - super(); - } - - public <%=name%>(BusinessEntityWikitty wi) { - super(wi.getWikitty()); - } - - public <%=name%>(Wikitty wi) { - super(wi); - } - -}*/ - - generateAttributeAccessMethod(output, clazz); - - for (ObjectModelClass parent : clazz.getSuperclasses()) { - if (EugengoUtils.isBusinessEntity(parent)) { - generateParentMethod(output, parent); - } - } - -/*{ @Override - public Collection<WikittyExtension> getStaticExtensions() { - return extensions; - } - - -} //<%=name%> -}*/ - - } - - - - // Utilitarian methods - - public void generateAttributeAccessMethod(Writer output, ObjectModelClass clazz) throws IOException { - for (ObjectModelAttribute attr : clazz.getAttributes()) { - if (attr.isNavigable() && !attr.isStatic() - && (attr.getStereotypes() == null || attr.getStereotypes().isEmpty())) { - if ((attr.getMaxMultiplicity() != 0 && attr.getMaxMultiplicity() != 1)) { - //TODO ymartel 20090812: when dataType "List", "Set" or "Collection" in model, must be here! - generateCollectionAttributeAccessors(output, attr); - } else { - generateWikittyAttributeAccessors(output, attr); - } - } - } - } - - private void generateWikittyExtension(Writer output, - ObjectModelClass clazz) throws IOException { - String version = clazz.getTagValue("version"); - - // Since wikitty 1.3, version need to be dotted - if ( version == null ) { - version = "1.0"; - } - - // get requires from parent - String requires = null; - String separator = ""; - for (ObjectModelClass parent : clazz.getSuperclasses()) { - if (EugengoUtils.isBusinessEntity(parent)) { - String parentExtName = "EXT_" + parent.getName().toUpperCase(); - - if (requires == null) { - requires = ""; - } - - requires += separator + parent.getName() + "." + parentExtName; - // dans le cas où on aurait un heritage multiple :) - // FIXME EC-20100420 gerer les extensions multiples - separator = " + \",\" /* FIXME Multiples extentions are not yet supported */ + "; - } - } - -/*{ static final protected List<WikittyExtension> extensions; - static final public WikittyExtension extension<%=clazz.getName()%> = - new WikittyExtension(<%=EXT_NAME%>, "<%=version%>", <%=requires%>, - WikittyUtil.buildFieldMapExtension(}*/ - - separator = ""; - for (ObjectModelAttribute attr : clazz.getAttributes()) { - if (attr.isNavigable() && !attr.isStatic() && - (attr.getStereotypes() == null || attr.getStereotypes().isEmpty())) { -/*{<%=separator%> - }*/ - generateAttribute(output, attr); - separator = ","; - } - } -/*{)); - static { - ArrayList<WikittyExtension> exts = new ArrayList<WikittyExtension>(); -}*/ - for (ObjectModelClass parent : clazz.getSuperclasses()) { - if (EugengoUtils.isBusinessEntity(parent)) { -/*{ - exts.addAll(<%=parent.getName()%>Impl.extensions); -}*/ - } - } -/*{ - // EC-20100420 add current extension after parent ones - // if current is loaded before required extension - // load failed because required extension is missing - exts.add(extension<%=clazz.getName()%>); - - extensions = Collections.unmodifiableList(exts); - } -}*/ - } - - private void generateAttribute(Writer output, ObjectModelAttribute attr) - throws IOException { - String attrType = computeType(attr); - if (EugengoUtils.notEmpty(attrType)) { - attrType = getType(attrType); - } else { - return; - } - - String attrName = attr.getName(); - String card = ""; - - //TODO ymartel 20090812: a better way to manage those DataTypes in the model? - if (attrType.contains("Collection") || attrType.contains("List") || attrType.contains("Set")) { - card = "[0-*]"; - // List<String> - Matcher match = extractTypeOnCollection.matcher(attrType); - if (match.matches()) { - attrType = match.group(1); - } - } - - if (!commonTypes.contains(attrType)) { - attrType = "Wikitty"; - } else if(commonNumerics.contains(attrType)) { - attrType = "Numeric"; - } else if(commonStrings.contains(attrType)) { - attrType = "String"; - } - - - int maxMultiplicity = attr.getMaxMultiplicity(); - if ((maxMultiplicity != 0 && maxMultiplicity != 1)){ - card = "[" + attr.getMinMultiplicity() + "-"; - if (maxMultiplicity == -1) { - card += "*]"; - } else { - card += maxMultiplicity + "]"; - } - } - - // FIXME EC-20100420 attr.isUnique() always return true for - // attributes (maybe use tagValue instead) - String unique = attr.isUnique() ? " unique" : ""; - - String tagValues = ""; - if ("designation".equals(attr.getName())) { - System.out.println("+++ DEBUG +++ " + attr.getName() + " " + attr.getTagValues()); - } - for (String tag : attr.getTagValues().keySet()) { - String value = attr.getTagValue(tag); - tagValues += " " + tag + "=" + value; - } - -/*{"<%=attrType%> <%=attrName%><%=card%><%=unique%><%=tagValues%>"}*/ - } - - private void generateParentMethod(Writer output, - ObjectModelClass clazz) throws IOException { - - // we must generate method for parent of parent - for (ObjectModelClass parent : clazz.getSuperclasses()) { - if (EugengoUtils.isBusinessEntity(parent)) { - generateParentMethod(output, parent); - } - } - - // generate method acces for parent attribut - generateAttributeAccessMethod(output, clazz); - } - - protected void generateWikittyAttributeAccessors(Writer output, - ObjectModelAttribute attr) throws IOException { - - EXT_NAME = "EXT_" + attr.getDeclaringElement().getName().toUpperCase(); - - String attrType = computeType(attr); - if (EugengoUtils.notEmpty(attrType)) { - attrType = getType(attrType, true); - } else { - return; - } - - // FIXME EC-20100421 cette methode peut retourner List<String> - // et generer la methode getWikitty().getFieldAsList<String>() - // qui ne peut pas compiler - String methodAccessName = getFieldAccessMethodName(attr); - - String attrName = attr.getName(); - String attrNameCapitalized = EugengoUtils.toUpperCaseFirstLetter(attrName); - -/*{ - public void set<%=attrNameCapitalized%>(<%=attrType%> <%=attrName%>) { - getWikitty().setField(<%=EXT_NAME%>, "<%=attrName%>", <%=attrName%>); - } - - public <%=attrType%> get<%=attrNameCapitalized%>() { - <%=attrType%> result = getWikitty().getFieldAs<%=methodAccessName%>(<%=EXT_NAME%>, "<%=attrName%>"); - return result; - } - -}*/ - } - - /** - * Give the string to put after getFieldAs???, only some type is accepted - * and we must convert BusinessEntity to Wikitty string - * @param type - * @return - */ - protected String getFieldAccessMethodName(ObjectModelAttribute attr) { - String result = computeType(attr); - result = getType(result, true); - - boolean isCollection = (attr.getMaxMultiplicity() != 0 - && attr.getMaxMultiplicity() != 1); - if (isCollection) { - if (attr.isUnique()) { - result = "Set"; - } else { - result = "List"; - } - } else { - // test for Date - if ("java.util.Date".equals(result) || "Date".equals(result)) { - result = "Date"; - } else if (getModel().hasClass(result)) { // test for Wikitty object - ObjectModelClass fieldClass = getModel().getClass(result); - if (EugengoUtils.isBusinessEntity(fieldClass)) { - // for wikittyDto we use String for Id - result = "Wikitty"; - } - } else if (null != getModel().getEnumeration(result)) { - result = "String"; - } - } - result = EugengoUtils.toUpperCaseFirstLetter(result); - - return result; - } - - protected void generateCollectionAttributeAccessors(Writer output, - ObjectModelAttribute attr) throws IOException { - - EXT_NAME = "EXT_" + attr.getDeclaringElement().getName().toUpperCase(); - - String attrType = computeType(attr); - if (EugengoUtils.notEmpty(attrType)) { - attrType = getType(attrType, true); - } else { - return; - } - - // get collection element type for add and remove method arguement type - String elementType = getType(attr.getType(), true); - - String methodAccessName = getFieldAccessMethodName(attr); - - String attrName = attr.getName(); - String attrNameCapitalized = EugengoUtils.toUpperCaseFirstLetter(attrName); -/*{ public <%=attrType%> get<%=attrNameCapitalized%>() { - <%=attrType%> result = getWikitty().getFieldAs<%=methodAccessName%>(<%=EXT_NAME%>, "<%=attrName%>", <%=getClassAndGeneric(attrType)[1]%>.class); - return result; - } - - public void add<%=attrNameCapitalized%>(<%=elementType%> element) { - getWikitty().addToField(<%=EXT_NAME%>, "<%=attrName%>", element); - } - - public void remove<%=attrNameCapitalized%>(<%=elementType%> element) { - getWikitty().removeFromField(<%=EXT_NAME%>, "<%=attrName%>", element); - } - - public void clear<%=attrNameCapitalized%>() { - getWikitty().clearField(<%=EXT_NAME%>, "<%=attrName%>"); - } - -}*/ - } - - private static Set<String> commonNumerics; - static { - commonNumerics = new HashSet<String>(); - commonNumerics.add("byte"); - commonNumerics.add("Byte"); - commonNumerics.add("short"); - commonNumerics.add("Short"); - commonNumerics.add("int"); - commonNumerics.add("Integer"); - commonNumerics.add("long"); - commonNumerics.add("Long"); - commonNumerics.add("float"); - commonNumerics.add("Float"); - commonNumerics.add("double"); - commonNumerics.add("Double"); - } - - private static Set<String> commonStrings; - static { - commonStrings = new HashSet<String>(); - commonStrings.add("char"); - commonStrings.add("Char"); - commonStrings.add("String"); - } - - private static Set<String> commonTypes; - static { - commonTypes = new HashSet<String>(); - commonTypes.addAll(commonNumerics); - commonTypes.addAll(commonStrings); - commonTypes.add("boolean"); - commonTypes.add("Boolean"); - commonTypes.add("Date"); - } - -}
Added: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityImplGenerator.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityImplGenerator.java (rev 0) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityImplGenerator.java 2010-05-17 08:38:51 UTC (rev 54) @@ -0,0 +1,150 @@ +package org.nuiton.wikitty.generator; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.models.object.ObjectModelAttribute; +import org.nuiton.eugene.models.object.ObjectModelClass; + +/** + * Possible enhancement: + * - generateParentMethod can generate attribut method access that call + * the same method on parent instance class. For that we must have one attribut + * instance by parent. This attribut we must be created in setWikitty method + * and used same wikitty object. + * + * @author poussin + */ +public class BusinessEntityImplGenerator extends WikengoCommonGenerator { + + private static final Log log = LogFactory.getLog(BusinessEntityImplGenerator.class); + + @Override + public String getFilenameForClass(ObjectModelClass clazz) { + String fqn = clazz.getQualifiedName(); + log.info( "Filename for " + clazz.getName() + " is " + fqn.replace('.', File.separatorChar) + ".java"); + return fqn.replace('.', File.separatorChar) + "Impl.java"; + } + + public void generateFromClass(Writer output, ObjectModelClass clazz) + throws IOException { + if (!EugengoUtils.isBusinessEntity(clazz)) { + log.info( clazz.getName() + " is not a business entity"); + return; + } + + // On ne génère pas le impl si l'entité a des opérations + if (clazz.getOperations().size() > 0) { + return; + } + + log.info("Generate Business entity impl" + clazz.getName() + "... "); + generateCopyright(output); + + String packageName = clazz.getPackageName(); + String className = clazz.getName(); + String name = className + "Impl"; +/*{package <%=packageName%>; + +}*/ + ObjectModelClass superClass = findSuperClass(clazz); + + clearImports(); + addImport(clazz); + addImport(superClass); + addImport("org.nuiton.wikitty.WikittyUtil"); + addImport("org.nuiton.wikitty.Wikitty"); + addImport("org.nuiton.wikitty.BusinessEntityWikitty"); + addImport("org.nuiton.wikitty.WikittyExtension"); + addImport(Collection.class); + addImport(Collections.class); + addImport(List.class); + addImport(ArrayList.class); + String parentImpl = null; + for (ObjectModelClass parent : clazz.getSuperclasses()) { + if (EugengoUtils.isBusinessEntity(parent)) { + addImport(parent); + parentImpl = parent.getQualifiedName() + "Impl"; + addImport( parentImpl ); + } + } + lookForAttributeImports(clazz); + generateImports(output, packageName); + + generateClazzDocumentation(output, clazz); + String abstractString = ""; + if (clazz.isAbstract()) { + abstractString += "abstract "; + } + +/*{public <%=abstractString%>class <%=className%>Impl extends <%=className%>Abstract { + +}*/ + + String svUID = GeneratorUtil.computeSerialVersionUID(clazz); +/*{ private static final long serialVersionUID = <%=svUID%>; + + public <%=name%>() { + super(); + } + + public <%=name%>(BusinessEntityWikitty wi) { + super(wi.getWikitty()); + } + + public <%=name%>(Wikitty wi) { + super(wi); + } + +} //<%=name%> +}*/ + } + + private static Set<String> commonNumerics; + static { + commonNumerics = new HashSet<String>(); + commonNumerics.add("byte"); + commonNumerics.add("Byte"); + commonNumerics.add("short"); + commonNumerics.add("Short"); + commonNumerics.add("int"); + commonNumerics.add("Integer"); + commonNumerics.add("long"); + commonNumerics.add("Long"); + commonNumerics.add("float"); + commonNumerics.add("Float"); + commonNumerics.add("double"); + commonNumerics.add("Double"); + } + + private static Set<String> commonStrings; + static { + commonStrings = new HashSet<String>(); + commonStrings.add("char"); + commonStrings.add("Char"); + commonStrings.add("String"); + } + + private static Set<String> commonTypes; + static { + commonTypes = new HashSet<String>(); + commonTypes.addAll(commonNumerics); + commonTypes.addAll(commonStrings); + commonTypes.add("boolean"); + commonTypes.add("Boolean"); + commonTypes.add("Date"); + } + +}
Property changes on: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityImplGenerator.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityInterfaceGenerator.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityInterfaceGenerator.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/BusinessEntityInterfaceGenerator.java 2010-05-17 08:38:51 UTC (rev 54) @@ -3,11 +3,16 @@ import java.io.File; import java.io.IOException; import java.io.Writer; +import java.util.Collection; +import java.util.Set;
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.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelClassifier; +import org.nuiton.eugene.models.object.ObjectModelOperation; +import org.nuiton.eugene.models.object.ObjectModelParameter;
/** * Interface for BusinessEntity, interfaces are needed for multiple inheritance @@ -74,6 +79,8 @@ generateStaticAttributes(output, clazz);
generateAttributeAccessMethod(output, clazz); + + generateInterfaceOperations(output, clazz);
/*{ } //<%=name%> @@ -149,4 +156,45 @@ }*/ }
+ private void generateInterfaceOperations(Writer output, ObjectModelClassifier classifier) throws IOException { + for (ObjectModelOperation op : classifier.getOperations()) { + String opName = op.getName(); +/*{ /** +}*/ + if (EugengoUtils.hasDocumentation(op)) { + 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 opType = op.getReturnType(); +/*{ *) + <%=opVisibility%> <%=opType%> <%=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 = ", "; + } +/*{; + +}*/ + } + } + }
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyMetaGenerator.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyMetaGenerator.java 2010-05-12 15:08:48 UTC (rev 53) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyMetaGenerator.java 2010-05-17 08:38:51 UTC (rev 54) @@ -31,7 +31,8 @@
// Wikitty (Interface, impl...) BusinessEntityInterfaceGenerator.class, - BusinessEntityGenerator.class, + BusinessEntityAbstractGenerator.class, + BusinessEntityImplGenerator.class, BusinessEntityBeanGenerator.class
));
_______________________________________________ Wikitty-commits mailing list Wikitty-commits@list.nuiton.org http://list.nuiton.org/cgi-bin/mailman/listinfo/wikitty-commits
-- Tony Chemit -------------------- tél: +33 (0) 2 40 50 29 28 email: chemit@codelutin.com http://www.codelutin.com
On Mon, 17 May 2010 10:48:49 +0200 Tony Chemit <chemit@codelutin.com> wrote:
Yo,
Petites questions innocentes :
1) tu utilise les tranformer ? 2) tu as vu les évolution d'eugene ?
Car il serait bien qu'on commence à mutualiser un peu les templates.
Plutôt que de continuer a écrire des Générators inmaintenables...
Je pense qu'il faut que les choses se stabilise un peu, ou que l'on profite d'un besoin d'une modification des templates pour les passer sur les transformer. Mais il y a beaucoup d'autres choses plus urgentes sur wikitty avant de peaufiner la generation qui est presque secondaire dans wikitty. Il y a meme des generateurs qui vont etre supprimer (car besoin specifique GWT) si ce n'est deja fait. -- Benjamin -------------------- tél: +33 (0) 2 40 50 29 28 email: poussin@codelutin.com () campagne du ruban ascii http://www.codelutin.com /\ pour les mails en ascii
participants (2)
-
Benjamin POUSSIN -
Tony Chemit