r54 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty wikitty-generators/src/main/java/org/nuiton/wikitty/generator
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 ));
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
participants (2)
-
echatellier@users.nuiton.org -
Tony Chemit