Author: bleny Date: 2010-09-27 10:49:33 +0200 (Mon, 27 Sep 2010) New Revision: 345 Url: http://nuiton.org/repositories/revision/wikitty/345 Log: begining suport of meta-extension code generation 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/WikittyHelperGenerator.java branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyImplementationGenerator.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-09-27 07:49:11 UTC (rev 344) +++ branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2010-09-27 08:49:33 UTC (rev 345) @@ -16,6 +16,7 @@ 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.ObjectModelInterface; import org.nuiton.eugene.models.object.ObjectModelModifier; import org.nuiton.eugene.models.object.ObjectModelOperation; @@ -59,8 +60,7 @@ modelBusinessEntities.add(clazz); } } - - + for (ObjectModelClass businessEntity : modelBusinessEntities) { ObjectModelClass abstractClass = createAbstractClass(WikittyTransformerUtil.businessEntityToAbstractName(businessEntity), businessEntity.getPackageName()); @@ -87,11 +87,18 @@ addConstants(businessEntity, abstractClassForThisEntity); addToString(businessEntity, abstractClassForThisEntity); } + + // for all classes of model, check if steroptyped with "meta" + for (ObjectModelClass clazz : model.getClasses()) { + if (WikittyTransformerUtil.isMetaExtension(clazz)) { + // if so, add operations + addMetaExtensionOperations(clazz, processedClasses.get(clazz)); + } + } processedClasses.clear(); } - - + protected void addImports(ObjectModelClass clazz) { // TODO 20100811 bleny remove unused imports addImport(clazz, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN); @@ -251,6 +258,9 @@ String extensionVariableName = WikittyTransformerUtil.classToExtensionVariableName(businessEntity, true); String helperClassName = WikittyTransformerUtil.businessEntityToHelperName(businessEntity); + boolean isMetaExtension = WikittyTransformerUtil.isMetaExtension(businessEntity); + + // generating operations with bodies to realize contract for (ObjectModelAttribute attribute : businessEntity.getAttributes()) { if (attribute.isNavigable()) { @@ -277,22 +287,51 @@ getterName = "get" + StringUtils.capitalize(attributeName); ObjectModelOperation getter = addOperation(abstractClass, getterName, attributeTypeSimpleNameInSet); addAnnotation(abstractClass, getter, "Override"); - String getterBody = "" + String getterBody; + if (isMetaExtension) { + getterBody = "" /*{ + <%=attributeTypeSimpleNameInSet%> result; + if (extensionForMetaExtension == null) { + result = <%=helperClassName%>.<%=getterName%>(getWikitty()); + } else { + result = <%=helperClassName%>.<%=getterName%>(extensionForMetaExtension, getWikitty()); + } + return result; +}*/; + } else { + getterBody = "" +/*{ <%=attributeTypeSimpleNameInSet%> result = <%=helperClassName%>.<%=getterName%>(getWikitty()); return result; -}*/; +}*/; + } setOperationBody(getter, getterBody); String addName = "add" + StringUtils.capitalize(attributeName); ObjectModelOperation adder = addOperation(abstractClass, addName, "void"); addAnnotation(abstractClass, adder, "Override"); addParameter(adder, "String", "element"); - String adderBody = "" + String adderBody; + if (isMetaExtension) { + adderBody = "" /*{ + if (extensionForMetaExtension == null) { + <%=helperClassName%>.<%=addName%>(getWikitty(), element); + getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%= getter.getName() %>()); + } else { + <%=helperClassName%>.<%=addName%>(extensionForMetaExtension, getWikitty(), element); + String fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>"); + getPropertyChangeSupport().firePropertyChange(fieldName, null, <%= getter.getName() %>()); + } +}*/; + } else { + adderBody = "" +/*{ <%=helperClassName%>.<%=addName%>(getWikitty(), element); getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%= getter.getName() %>()); }*/; + } setOperationBody(adder, adderBody); String removeName = "remove" + StringUtils.capitalize(attributeName); @@ -435,4 +474,24 @@ addAnnotation(abstractClass, toString, "Override"); setOperationBody(toString, toStringOperationBody); } + + protected void addMetaExtensionOperations(ObjectModelClass metaExtension, + ObjectModelClass abstractClassForThisMetaExtension) { + + ObjectModelAttribute extension = addAttribute(abstractClassForThisMetaExtension, "extensionForMetaExtension", WikittyTransformerUtil.WIKITTY_EXTENSION_CLASS_FQN); + setDocumentation(extension, "the metaExtension operations target this extension, may be null"); + + ObjectModelOperation addMetaExtension = addOperation(abstractClassForThisMetaExtension, "addMetaExtension", "void"); + addAnnotation(abstractClassForThisMetaExtension, addMetaExtension, "Override"); + addParameter(addMetaExtension, WikittyTransformerUtil.WIKITTY_EXTENSION_CLASS_FQN, "extension"); + setDocumentation(addMetaExtension, String.format( + "add %s meta-extension on given extension to this entity", + metaExtension.getName())); + String helperName = WikittyTransformerUtil.businessEntityToHelperName(metaExtension); + setOperationBody(addMetaExtension, "" +/*{ + extensionForMetaExtension = extension; + <%=helperName%>.addMetaExtension(extension, getWikitty()); +}*/); + } } 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-09-27 07:49:11 UTC (rev 344) +++ branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2010-09-27 08:49:33 UTC (rev 345) @@ -32,7 +32,11 @@ return new WikittyPurifierTransformer(); } - + /** will permet to get the result of a processed class + * it is useful for dealing with inheritence : when an extension depend + * of another. In this case the child can find the processed class of the parent + * and then look into it to find methods and data to copy + */ protected Map<ObjectModelClass, ObjectModelInterface> processedClasses = new HashMap<ObjectModelClass, ObjectModelInterface>(); @@ -46,44 +50,70 @@ processEntity(clazz); } } + + for (ObjectModelClass clazz : model.getClasses()) { + if (WikittyTransformerUtil.isMetaExtension(clazz)) { + processMetaExtension(clazz); + } + } processedClasses.clear(); } + + /** contains code commons to entities and meta-extensions */ + protected ObjectModelInterface prepareOutputClass(ObjectModelClass businessEntity) { + + ObjectModelInterface contract; + + if (processedClasses.containsKey(businessEntity)) { - protected void processEntity(ObjectModelClass businessEntity) { - log.info("will process " + businessEntity.getPackageName() + ".." + businessEntity.getName()); - ObjectModelInterface contract = createInterface(WikittyTransformerUtil.businessEntityToContractName(businessEntity), - businessEntity.getPackageName()); - addInterface(contract, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN); + contract = processedClasses.get(businessEntity); - // TODO 20100811 bleny remove unused imports - addImport(contract, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN); - addImport(contract, WikittyTransformerUtil.BUSINESS_ENTITY_WIKITTY_CLASS_FQN); - addImport(contract, WikittyTransformerUtil.WIKITTY_CLASS_FQN); - addImport(contract, "org.nuiton.wikitty.WikittyExtension"); - addImport(contract, "org.nuiton.wikitty.WikittyUtil"); - addImport(contract, "org.nuiton.wikitty.WikittyUser"); - addImport(contract, "org.nuiton.wikitty.WikittyUserAbstract"); - addImport(contract, "org.nuiton.wikitty.WikittyUserImpl"); - addImport(contract, "org.nuiton.wikitty.TreeNode"); - addImport(contract, "org.nuiton.wikitty.TreeNodeAbstract"); - addImport(contract, "org.nuiton.wikitty.TreeNodeImpl"); - addImport(contract, java.util.List.class); - addImport(contract, java.util.ArrayList.class); - addImport(contract, java.util.Collection.class); - addImport(contract, java.util.Collections.class); - addImport(contract, java.util.Set.class); - addImport(contract, java.util.Date.class); - addImport(contract, java.util.LinkedHashSet.class); + } else { - String documentation = businessEntity.getDocumentation(); - if (businessEntity.hasTagValue(WikittyTransformerUtil.TAG_DOCUMENTATION)) { - documentation += "\n\n"; - documentation += businessEntity.getTagValue(WikittyTransformerUtil.TAG_DOCUMENTATION); + log.info("will process " + businessEntity.getPackageName() + ".." + businessEntity.getName()); + contract = createInterface(WikittyTransformerUtil.businessEntityToContractName(businessEntity), + businessEntity.getPackageName()); + addInterface(contract, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN); + + // TODO 20100811 bleny remove unused imports + addImport(contract, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN); + addImport(contract, WikittyTransformerUtil.BUSINESS_ENTITY_WIKITTY_CLASS_FQN); + addImport(contract, WikittyTransformerUtil.WIKITTY_CLASS_FQN); + addImport(contract, "org.nuiton.wikitty.WikittyExtension"); + addImport(contract, "org.nuiton.wikitty.WikittyUtil"); + addImport(contract, "org.nuiton.wikitty.WikittyUser"); + addImport(contract, "org.nuiton.wikitty.WikittyUserAbstract"); + addImport(contract, "org.nuiton.wikitty.WikittyUserImpl"); + addImport(contract, "org.nuiton.wikitty.TreeNode"); + addImport(contract, "org.nuiton.wikitty.TreeNodeAbstract"); + addImport(contract, "org.nuiton.wikitty.TreeNodeImpl"); + addImport(contract, java.util.List.class); + addImport(contract, java.util.ArrayList.class); + addImport(contract, java.util.Collection.class); + addImport(contract, java.util.Collections.class); + addImport(contract, java.util.Set.class); + addImport(contract, java.util.Date.class); + addImport(contract, java.util.LinkedHashSet.class); + + String documentation = businessEntity.getDocumentation(); + if (businessEntity.hasTagValue(WikittyTransformerUtil.TAG_DOCUMENTATION)) { + documentation += "\n\n"; + documentation += businessEntity.getTagValue(WikittyTransformerUtil.TAG_DOCUMENTATION); + } + + setDocumentation(contract, documentation); + + processedClasses.put(businessEntity, contract); } - setDocumentation(contract, documentation); + + return contract; + } + protected void processEntity(ObjectModelClass businessEntity) { + ObjectModelInterface contract = prepareOutputClass(businessEntity); + // adding public static final String EXT_CLIENT = "Client"; addConstant(contract, "EXT_" + businessEntity.getName().toUpperCase(), @@ -180,7 +210,21 @@ } } } - + processedClasses.put(businessEntity, contract); } + + /** add stuff if input model element is stereotyped as "meta" */ + protected void processMetaExtension(ObjectModelClass metaExtension) { + + ObjectModelInterface contract = prepareOutputClass(metaExtension); + + ObjectModelOperation addMetaExtension = addOperation(contract, "addMetaExtension", "void"); + addParameter(addMetaExtension, WikittyTransformerUtil.WIKITTY_EXTENSION_CLASS_FQN, "extension"); + setDocumentation(addMetaExtension, String.format( + "add %s meta-extension on given extension to this entity", + metaExtension.getName())); + + + } } Modified: branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java =================================================================== --- branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java 2010-09-27 07:49:11 UTC (rev 344) +++ branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java 2010-09-27 08:49:33 UTC (rev 345) @@ -16,12 +16,10 @@ */ public class WikittyHelperGenerator extends ObjectModelTransformerToJava { + protected static final String META_EXTENSION_SEPARATOR = ":"; + @Override public void transformFromClass(ObjectModelClass clazz) { - - if (! WikittyTransformerUtil.isBusinessEntity(clazz)) { - return ; - } ObjectModelClass helper = createClass(WikittyTransformerUtil.businessEntityToHelperName(clazz), clazz.getPackageName()); @@ -51,10 +49,23 @@ setDocumentation(constructor, "utility class all provided methods are accessible the static way"); setOperationBody(constructor, "// empty\n"); // empty implementation - String extensionVariableName = WikittyTransformerUtil.classToExtensionVariableName(clazz, true); + if ( WikittyTransformerUtil.isBusinessEntity(clazz) ) { + createOperationsForBusinessEntity(clazz, helper); + } - // generating operations with bodies to realize contract - for (ObjectModelAttribute attribute : clazz.getAttributes()) { + if ( WikittyTransformerUtil.isMetaExtension(clazz)) { + createOperationForMetaExtension(clazz, helper); + } + } + + /** add operation if input model element has stereotype "entity" */ + protected void createOperationsForBusinessEntity(ObjectModelClass entity, + ObjectModelClass helper) { + + String extensionVariableName = WikittyTransformerUtil.classToExtensionVariableName(entity, true); + + // generating operations with bodies + for (ObjectModelAttribute attribute : entity.getAttributes()) { if (attribute.isNavigable()) { // needed below, in templates String fieldVariableName = WikittyTransformerUtil.attributeToFielVariableName(attribute, true); @@ -142,6 +153,9 @@ } + + // now, adding the equals(w1, w2) + ObjectModelOperation equals = addOperation(helper, "equals", "boolean", ObjectModelModifier.STATIC); addParameter(equals, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "w1"); addParameter(equals, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "w2"); @@ -152,7 +166,7 @@ boolean result = true; }*/; - for(ObjectModelAttribute attribute : clazz.getAttributes()) { + for(ObjectModelAttribute attribute : entity.getAttributes()) { if (attribute.isNavigable()) { // two variables needed below String fieldVariableName = WikittyTransformerUtil.attributeToFielVariableName(attribute, true); @@ -176,6 +190,12 @@ }*/; setOperationBody(equals, equalsBody); + + + + + // finally, adding isExtention and addExtension + ObjectModelOperation isExtension = addOperation(helper, "isExtension", "boolean", ObjectModelModifier.STATIC); addParameter(isExtension, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty"); setDocumentation(isExtension, "Check if wikitty has current extension"); @@ -187,7 +207,7 @@ ObjectModelOperation addExtension = addOperation(helper, "addExtension", "void", ObjectModelModifier.STATIC); addParameter(addExtension, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty"); setDocumentation(addExtension, "ajout les extensions static de cette classe au wikitty en argument"); - String contractName = WikittyTransformerUtil.businessEntityToAbstractName(clazz); + String contractName = WikittyTransformerUtil.businessEntityToAbstractName(entity); setOperationBody(addExtension, "" /*{ for (WikittyExtension ext : <%=contractName%>.extensions) { @@ -195,4 +215,54 @@ } }*/); } + + /** add needed operations if input model element has stereotype "meta" */ + protected void createOperationForMetaExtension(ObjectModelClass metaExtension, + ObjectModelClass helper) { + + ObjectModelOperation addMetaExtension = addOperation(helper, "addMetaExtension", "void", ObjectModelModifier.STATIC); + addParameter(addMetaExtension, WikittyTransformerUtil.WIKITTY_EXTENSION_CLASS_FQN, "extension"); + addParameter(addMetaExtension, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty"); + setDocumentation(addMetaExtension, String.format( + "add %s meta-extension on given extension to the given wikitty", + metaExtension.getName())); + String abstractName = WikittyTransformerUtil.businessEntityToAbstractName(metaExtension); + String contractName = WikittyTransformerUtil.businessEntityToContractName(metaExtension); + setOperationBody(addMetaExtension, "" +/*{ + wikitty.addMetaExtension(<%=abstractName%>.extension<%=contractName%>, extension); +}*/); + + + + // now adding getMetaFielName, both implementations + + ObjectModelOperation getMetaFieldNameFromExtension = addOperation(helper, "getMetaFieldName", "String", ObjectModelModifier.STATIC); + addParameter(getMetaFieldNameFromExtension, WikittyTransformerUtil.WIKITTY_EXTENSION_CLASS_FQN, "extension"); + addParameter(getMetaFieldNameFromExtension, "String", "fieldName"); + setDocumentation(getMetaFieldNameFromExtension, String.format( + "for extension 'Ext' and field 'f', return 'Ext:%s.f'", + metaExtension.getName())); + setOperationBody(getMetaFieldNameFromExtension, "" +/*{ + String metaFieldName = getMetaFieldName(extension.getName(), fieldName); + return metaFieldName; +}*/); + + ObjectModelOperation getMetaFieldNameFromExtensionName = addOperation(helper, "getMetaFieldName", "String", ObjectModelModifier.STATIC); + addParameter(getMetaFieldNameFromExtensionName, "String", "extensionName"); + addParameter(getMetaFieldNameFromExtensionName, "String", "fieldName"); + setDocumentation(getMetaFieldNameFromExtensionName, String.format( + "for extension 'Ext' and field 'f', return 'Ext:%s.f'", + metaExtension.getName())); + setOperationBody(getMetaFieldNameFromExtensionName, "" +/*{ + String metaFieldName = String.format("%s<%=META_EXTENSION_SEPARATOR%><%=metaExtension.getName()%>.%s", extensionName, fieldName); + return metaFieldName; +}*/); + + + + // now, adding all + } } Modified: branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyImplementationGenerator.java =================================================================== --- branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyImplementationGenerator.java 2010-09-27 07:49:11 UTC (rev 344) +++ branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyImplementationGenerator.java 2010-09-27 08:49:33 UTC (rev 345) @@ -1,5 +1,7 @@ package org.nuiton.wikitty.generator; +import java.util.HashMap; +import java.util.Map; import java.util.Random; import org.nuiton.eugene.java.ObjectModelTransformerToJava; @@ -16,38 +18,73 @@ */ public class WikittyImplementationGenerator extends ObjectModelTransformerToJava { + protected Map<ObjectModelClass, ObjectModelClass> processedClasses = + new HashMap<ObjectModelClass, ObjectModelClass>(); + @Override public void transformFromClass(ObjectModelClass clazz) { + + if ( WikittyTransformerUtil.isBusinessEntity(clazz) ) { + ObjectModelClass implementation = prepareImplementation(clazz); + processBusinessEntity(clazz, implementation); + } + + if ( WikittyTransformerUtil.isBusinessEntity(clazz) ) { + ObjectModelClass implementation = prepareImplementation(clazz); + processMetaExtension(clazz, implementation); + } + } + + protected ObjectModelClass prepareImplementation(ObjectModelClass clazz) { + ObjectModelClass implementation; - if (! WikittyTransformerUtil.isBusinessEntity(clazz)) { - return ; + if (processedClasses.containsKey(clazz)) { + // class has been already processed, return the implementation + implementation = processedClasses.get(clazz); + } else { + implementation = createClass( + WikittyTransformerUtil.businessEntityToImplementationName(clazz), + clazz.getPackageName()); + + // TODO 20100811 bleny remove unused imports + addImport(implementation, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN); + addImport(implementation, WikittyTransformerUtil.BUSINESS_ENTITY_WIKITTY_CLASS_FQN); + addImport(implementation, WikittyTransformerUtil.WIKITTY_CLASS_FQN); + addImport(implementation, "org.nuiton.wikitty.WikittyExtension"); + addImport(implementation, "org.nuiton.wikitty.WikittyUtil"); + addImport(implementation, "org.nuiton.wikitty.WikittyUser"); + addImport(implementation, "org.nuiton.wikitty.WikittyUserAbstract"); + addImport(implementation, "org.nuiton.wikitty.WikittyUserImpl"); + addImport(implementation, "org.nuiton.wikitty.TreeNode"); + addImport(implementation, "org.nuiton.wikitty.TreeNodeAbstract"); + addImport(implementation, "org.nuiton.wikitty.TreeNodeImpl"); + addImport(implementation, java.util.List.class); + addImport(implementation, java.util.ArrayList.class); + addImport(implementation, java.util.Collection.class); + addImport(implementation, java.util.Collections.class); + addImport(implementation, java.util.Set.class); + addImport(implementation, java.util.Date.class); + addImport(implementation, java.util.LinkedHashSet.class); + + setSuperClass(implementation, WikittyTransformerUtil.businessEntityToAbstractName(clazz)); + + // adding a generated serialVersionUID + Random random = new Random(); + Long serialVersionUIDs = random.nextLong(); + addConstant(implementation, + "serialVersionUID", + "long", + serialVersionUIDs.toString() + "L", + ObjectModelModifier.PRIVATE); + } - ObjectModelClass implementation = createClass(WikittyTransformerUtil.businessEntityToImplementationName(clazz), - clazz.getPackageName()); + return implementation; + } + + protected void processBusinessEntity(ObjectModelClass clazz, + ObjectModelClass implementation) { - // TODO 20100811 bleny remove unused imports - addImport(implementation, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN); - addImport(implementation, WikittyTransformerUtil.BUSINESS_ENTITY_WIKITTY_CLASS_FQN); - addImport(implementation, WikittyTransformerUtil.WIKITTY_CLASS_FQN); - addImport(implementation, "org.nuiton.wikitty.WikittyExtension"); - addImport(implementation, "org.nuiton.wikitty.WikittyUtil"); - addImport(implementation, "org.nuiton.wikitty.WikittyUser"); - addImport(implementation, "org.nuiton.wikitty.WikittyUserAbstract"); - addImport(implementation, "org.nuiton.wikitty.WikittyUserImpl"); - addImport(implementation, "org.nuiton.wikitty.TreeNode"); - addImport(implementation, "org.nuiton.wikitty.TreeNodeAbstract"); - addImport(implementation, "org.nuiton.wikitty.TreeNodeImpl"); - addImport(implementation, java.util.List.class); - addImport(implementation, java.util.ArrayList.class); - addImport(implementation, java.util.Collection.class); - addImport(implementation, java.util.Collections.class); - addImport(implementation, java.util.Set.class); - addImport(implementation, java.util.Date.class); - addImport(implementation, java.util.LinkedHashSet.class); - - setSuperClass(implementation, WikittyTransformerUtil.businessEntityToAbstractName(clazz)); - // adding constructor ObjectModelOperation constructor = addConstructor(implementation, ObjectModelModifier.PUBLIC); setOperationBody(constructor, "" @@ -69,14 +106,20 @@ super(businessEntityWikitty.getWikitty()); }*/); - // adding a generated serialVersionUID - Random random = new Random(); - Long serialVersionUIDs = random.nextLong(); - addConstant(implementation, - "serialVersionUID", - "long", - serialVersionUIDs.toString() + "L", - ObjectModelModifier.PRIVATE); } - + + protected void processMetaExtension(ObjectModelClass metaExtension, + ObjectModelClass implementation) { + + + ObjectModelOperation constructor = addConstructor(implementation, ObjectModelModifier.PUBLIC); + addParameter(constructor, WikittyTransformerUtil.WIKITTY_EXTENSION_CLASS_FQN, "extension"); + addParameter(constructor, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty"); + String contractName = WikittyTransformerUtil.businessEntityToContractName(metaExtension); + setOperationBody(constructor, "" +/*{ + this.wikitty = wikitty; + addMetaExtension(extension<%=contractName%>, extension); +}*/); + } } 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-09-27 07:49:11 UTC (rev 344) +++ branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTransformerUtil.java 2010-09-27 08:49:33 UTC (rev 345) @@ -16,6 +16,7 @@ protected static final String BUSINESS_ENTITY_CLASS_FQN = "org.nuiton.wikitty.BusinessEntity"; protected static final String BUSINESS_ENTITY_WIKITTY_CLASS_FQN = "org.nuiton.wikitty.BusinessEntityWikitty"; protected static final String WIKITTY_CLASS_FQN = "org.nuiton.wikitty.Wikitty"; + protected static final String WIKITTY_EXTENSION_CLASS_FQN = "org.nuiton.wikitty.WikittyExtension"; protected static final String TAG_VERSION = "version"; protected static final String TAG_ALTERNATIVE_NAME = "alternativeName"; @@ -28,6 +29,9 @@ /** user will use this stereotype in his model */ protected static final String BUSINESS_ENTITY_STEREOTYPE_NAME = "entity"; + + /** user will use this stereotype to make an extension a meta-extension */ + protected static final String META_EXTENSION_STEREOTYPE_NAME = "meta"; /** given a class called Client will return "EXT_CLIENT" * should be used as a variable name to store the extension name @@ -73,6 +77,11 @@ return result; } + public static boolean isMetaExtension(ObjectModelClass clazz) { + boolean result = clazz.hasStereotype(META_EXTENSION_STEREOTYPE_NAME); + return result; + } + /** * wikitty interface provide getFieldAsString, getFieldAsDate etc. methods * this method returns the good name of the method to call depending the