Author: bleny Date: 2010-08-23 11:48:32 +0200 (Mon, 23 Aug 2010) New Revision: 274 Url: http://nuiton.org/repositories/revision/wikitty/274 Log: better documentation support ; generating toString #783 Modified: branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTransformerUtil.java Modified: branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java =================================================================== --- branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2010-08-20 08:16:37 UTC (rev 273) +++ branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2010-08-23 09:48:32 UTC (rev 274) @@ -1,11 +1,12 @@ package org.nuiton.wikitty.generator; import java.util.ArrayList; -import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; @@ -15,7 +16,6 @@ import org.nuiton.eugene.models.object.ObjectModel; import org.nuiton.eugene.models.object.ObjectModelAttribute; import org.nuiton.eugene.models.object.ObjectModelClass; -import org.nuiton.eugene.models.object.ObjectModelClassifier; import org.nuiton.eugene.models.object.ObjectModelModifier; import org.nuiton.eugene.models.object.ObjectModelOperation; @@ -29,15 +29,25 @@ public class WikittyAbstractGenerator extends ObjectModelTransformerToJava { private static final Log log = LogFactory.getLog(WikittyAbstractGenerator.class); + + /** map busines entity from source model to generated abstract class */ + protected Map<ObjectModelClass, ObjectModelClass> processedClasses = + new HashMap<ObjectModelClass, ObjectModelClass>(); + /** pattern to parse toString tagValue + * for the string "abc{foo|bar}defrzeg{uvw|xyz}oeira" + * will match {foo|bar} and {uvw|xyz} with groups for foo, bar, uvw and xyz + */ + protected Pattern p = Pattern.compile("\\{(([^|}])*)(?:\\|([^}]*))?\\}"); + + /** map "Client.name" to "getName()" or any getter to read this attribute */ + protected Map<String, String> attributeToGetterName = new HashMap<String, String>(); + @Override protected Transformer<ObjectModel, ObjectModel> initPreviousTransformer() { return new WikittyPurifierTransformer(); } - - protected Map<ObjectModelClass, ObjectModelClass> processedClasses = - new HashMap<ObjectModelClass, ObjectModelClass>(); - + @Override public void transformFromModel(ObjectModel model) { @@ -75,6 +85,7 @@ addImports(abstractClassForThisEntity); addConstructors(abstractClassForThisEntity); addConstants(businessEntity, abstractClassForThisEntity); + addToString(businessEntity, abstractClassForThisEntity); } processedClasses.clear(); @@ -192,7 +203,7 @@ // finishing static block String extensionVersion = businessEntity.getTagValue("version"); if (extensionVersion == null || "".equals(extensionVersion)) { - extensionVersion = "0.1"; + extensionVersion = "1.0"; log.warn("no version specified in model for " + businessEntity.getQualifiedName() + " using " + extensionVersion); } @@ -252,7 +263,9 @@ // there is a conflict, purifier transformer give as the right name to use attributeName = attribute.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME); } - + + String getterName = null; + if (WikittyTransformerUtil.isAttributeCollection(attribute)) { // attributed is a collection, we will generate operations get, add, remove and clear @@ -261,7 +274,7 @@ // now, for this attribute, we will generate add, remove and clear methods // adding operations to contract - String getterName = "get" + StringUtils.capitalize(attributeName); + getterName = "get" + StringUtils.capitalize(attributeName); ObjectModelOperation getter = addOperation(abstractClass, getterName, attributeTypeSimpleNameInSet); addAnnotation(abstractClass, getter, "Override"); String getterBody = "" @@ -308,7 +321,7 @@ String getFieldMethodName = WikittyTransformerUtil.generateGetFieldAsCall(attribute); // adding getter and setter to contract - String getterName = "get" + StringUtils.capitalize(attributeName); + getterName = "get" + StringUtils.capitalize(attributeName); ObjectModelOperation getter = addOperation(abstractClass, getterName, attributeType); addAnnotation(abstractClass, getter, "Override"); setOperationBody(getter, "" @@ -328,6 +341,9 @@ return oldValue; }*/); } + + // save the getter name for this attribute + attributeToGetterName.put(businessEntity.getName() + "." + attributeName, getterName); } } } @@ -351,7 +367,65 @@ addInterface(abstractClass, superClass.getQualifiedName()); // extends } } + } + + /** add a toString method + * if a toString is tagValue is attached to businessEntity, it will be used + * to generate a toString as this : + * + * given "hello {Person.name|unknow}" + * + * will try to replace first {...} by name field value for extension Person. + * if this information is not available, will do unknow. + */ + protected void addToString(ObjectModelClass businessEntity, ObjectModelClass abstractClass) { + String toStringOperationBody = null; + if (businessEntity.hasTagValue(WikittyTransformerUtil.TAG_TO_STRING)) { + String toStringPattern = businessEntity.getTagValue(WikittyTransformerUtil.TAG_TO_STRING); + + // toStringPattern is something like + // "hello {Person.name|unknow} employe of {Company.name|unknow}" + // + + Matcher matcher = p.matcher(toStringPattern); + + while (matcher.find()) { + String wholeMatch = matcher.group(0); // "{foo|bar}" + String variableName = matcher.group(1); // "foo" + String defaultValue = matcher.group(3); // "bar", may be null + + if (defaultValue == null) { + defaultValue = ""; + } + + if (attributeToGetterName.containsKey(variableName)) { + String getterName = attributeToGetterName.get(variableName); + toStringPattern = toStringPattern.replace(wholeMatch, "" +/*{" + + <%=getterName%>().toString() + + "}*/); + } else { + log.warn("no field " + variableName + " in " + businessEntity.getQualifiedName()); + toStringPattern = toStringPattern.replace(wholeMatch, defaultValue); + } + } + + toStringOperationBody = "" +/*{ + return "<%=toStringPattern%>"; +}*/; + } else { + // no toString tagValue provided, generating a default toString + toStringOperationBody = "" +/*{ + return getWikitty().toString(); +}*/; + } + + ObjectModelOperation toString = addOperation(abstractClass, "toString", "String"); + addAnnotation(abstractClass, toString, "Override"); + setOperationBody(toString, toStringOperationBody); } } Modified: branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java =================================================================== --- branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2010-08-20 08:16:37 UTC (rev 273) +++ branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2010-08-23 09:48:32 UTC (rev 274) @@ -1,9 +1,7 @@ package org.nuiton.wikitty.generator; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; @@ -14,11 +12,9 @@ import org.nuiton.eugene.models.object.ObjectModel; import org.nuiton.eugene.models.object.ObjectModelAttribute; import org.nuiton.eugene.models.object.ObjectModelClass; -import org.nuiton.eugene.models.object.ObjectModelClassifier; import org.nuiton.eugene.models.object.ObjectModelInterface; import org.nuiton.eugene.models.object.ObjectModelModifier; import org.nuiton.eugene.models.object.ObjectModelOperation; -import org.nuiton.util.StringUtil; /*{generator option: writeString = }*/ /*{generator option: parentheses = false}*/ @@ -81,7 +77,12 @@ addImport(contract, java.util.Date.class); addImport(contract, java.util.LinkedHashSet.class); - setDocumentation(contract, businessEntity.getDocumentation()); + String documentation = businessEntity.getDocumentation(); + if (businessEntity.hasTagValue(WikittyTransformerUtil.TAG_DOCUMENTATION)) { + documentation += "\n\n"; + documentation += businessEntity.getTagValue(WikittyTransformerUtil.TAG_DOCUMENTATION); + } + setDocumentation(contract, documentation); // adding public static final String EXT_CLIENT = "Client"; addConstant(contract, @@ -168,7 +169,7 @@ for (ObjectModelClass superClass : superClasses) { addInterface(contract, superClass.getQualifiedName()); // extends ? if (WikittyTransformerUtil.isBusinessEntity(superClass)) { - // superclass must have benn processed first to have its operations set + // superclass must have been processed first to have its operations set if (! processedClasses.containsKey(superClass)) { processEntity(superClass); } Modified: branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTransformerUtil.java =================================================================== --- branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTransformerUtil.java 2010-08-20 08:16:37 UTC (rev 273) +++ branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTransformerUtil.java 2010-08-23 09:48:32 UTC (rev 274) @@ -19,6 +19,8 @@ protected static final String TAG_VERSION = "version"; protected static final String TAG_ALTERNATIVE_NAME = "alternativeName"; + protected static final String TAG_TO_STRING = "toString"; + protected static final String TAG_DOCUMENTATION = "documentation"; /** @deprecated name change : see ticket #798. use BUSINESS_ENTITY_STEREOTYPE_NAME */ @Deprecated