Author: jcouteau Date: 2010-11-24 13:42:33 +0100 (Wed, 24 Nov 2010) New Revision: 506 Url: http://nuiton.org/repositories/revision/wikitty/506 Log: Improve wikitty-dto generators Add unit test for dto-business entity conversions in wikitty-dto package Added: trunk/wikitty-dto/src/test/ trunk/wikitty-dto/src/test/java/ trunk/wikitty-dto/src/test/java/org/ trunk/wikitty-dto/src/test/java/org/nuiton/ trunk/wikitty-dto/src/test/java/org/nuiton/wikitty/ trunk/wikitty-dto/src/test/java/org/nuiton/wikitty/dto/ trunk/wikitty-dto/src/test/java/org/nuiton/wikitty/dto/WikittyDTOTest.java Modified: trunk/pom.xml trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java trunk/wikitty-api/src/main/resources/org/nuiton/WikittyAPI.gwt.xml trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java trunk/wikitty-dto/pom.xml trunk/wikitty-dto/src/main/java/org/nuiton/wikitty/dto/DTOHelper.java trunk/wikitty-dto/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2010-11-23 16:09:03 UTC (rev 505) +++ trunk/pom.xml 2010-11-24 12:42:33 UTC (rev 506) @@ -520,7 +520,7 @@ <projectId>wikitty</projectId> <!-- common versions used in sub-poms --> - <eugeneVersion>2.2</eugeneVersion> + <eugeneVersion>2.2.1-SNAPSHOT</eugeneVersion> <nuitonUtilsVersion>1.5.2-SNAPSHOT</nuitonUtilsVersion> <springVersion>3.0.1.RELEASE</springVersion> <jettyMorbayVersion>6.1.22</jettyMorbayVersion> Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java 2010-11-23 16:09:03 UTC (rev 505) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java 2010-11-24 12:42:33 UTC (rev 506) @@ -677,5 +677,5 @@ Wikitty result = WikittyUtil.getWikitty(wikittyService, securityToken, entity); return result; } - + } Modified: trunk/wikitty-api/src/main/resources/org/nuiton/WikittyAPI.gwt.xml =================================================================== --- trunk/wikitty-api/src/main/resources/org/nuiton/WikittyAPI.gwt.xml 2010-11-23 16:09:03 UTC (rev 505) +++ trunk/wikitty-api/src/main/resources/org/nuiton/WikittyAPI.gwt.xml 2010-11-24 12:42:33 UTC (rev 506) @@ -27,6 +27,17 @@ <!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.6.4//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.6.4/distro-source/core/src/gwt-module.dtd"> <module> - <source path="wikitty/entities" /> + <source path="wikitty/entities"> + <exclude name="*Impl.java"/> + <exclude name="*Abstract.java"/> + <exclude name="*Helper.java"/> + <exclude name="ExtensionFactory.java"/> + <exclude name="FieldFactory.java"/> + <exclude name="FieldType.java"/> + <exclude name="Wikitty.java"/> + <exclude name="WikittyCopyOnWrite.java"/> + <exclude name="WikittyExtension.java"/> + <exclude name="WikittyMetaExtensionUtil.java"/> + </source> </module> \ No newline at end of file Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java 2010-11-23 16:09:03 UTC (rev 505) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java 2010-11-24 12:42:33 UTC (rev 506) @@ -39,11 +39,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Assert; -import org.junit.Ignore; import org.junit.Test; import org.nuiton.util.ApplicationConfig; import org.nuiton.wikitty.WikittyConfig; -import org.nuiton.wikitty.WikittyService; import org.nuiton.wikitty.entities.FieldType; import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.entities.WikittyField; Modified: trunk/wikitty-dto/pom.xml =================================================================== --- trunk/wikitty-dto/pom.xml 2010-11-23 16:09:03 UTC (rev 505) +++ trunk/wikitty-dto/pom.xml 2010-11-24 12:42:33 UTC (rev 506) @@ -56,6 +56,13 @@ <artifactId>commons-beanutils</artifactId> </dependency> + + <!-- TEST --> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + </dependency> + </dependencies> <!-- ************************************************************* --> Modified: trunk/wikitty-dto/src/main/java/org/nuiton/wikitty/dto/DTOHelper.java =================================================================== --- trunk/wikitty-dto/src/main/java/org/nuiton/wikitty/dto/DTOHelper.java 2010-11-23 16:09:03 UTC (rev 505) +++ trunk/wikitty-dto/src/main/java/org/nuiton/wikitty/dto/DTOHelper.java 2010-11-24 12:42:33 UTC (rev 506) @@ -24,13 +24,17 @@ */ package org.nuiton.wikitty.dto; -import org.apache.commons.beanutils.BeanUtils; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.util.ObjectUtil; +import org.nuiton.wikitty.WikittyException; +import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.entities.BusinessEntity; import org.nuiton.wikitty.entities.Wikitty; -import org.nuiton.wikitty.entities.WikittyImpl; +import org.nuiton.wikitty.entities.WikittyField; /** * User: couteau @@ -41,30 +45,80 @@ static Log log = LogFactory.getLog(DTOHelper.class); public static <E extends BusinessEntity, F extends BusinessEntity> E toDto(F w) { - Class clazz = w.getClass(); + Class clazz = w.getClass(); String dtoClassName = clazz.getName().replace("Impl", "DTO").replace("CopyOnWrite", "DTO"); E result = null; try { - result = (E)ObjectUtil.newInstance(dtoClassName+"()"); - BeanUtils.copyProperties(result, w); + String wikittyId = w.getWikittyId(); + result = (E)ObjectUtil.newInstance(dtoClassName+"("+wikittyId+")"); + + result.setWikittyVersion(w.getWikittyVersion()); + + //get all fields + Class entityClass = result.getClass(); + Field[] fields = entityClass.getDeclaredFields(); + + for (Field field : fields) { + //for each field that got WikittyField annotation + if (field.isAnnotationPresent(WikittyField.class)) { + + //get the attribute's wikitty fqn + WikittyField annotation = field.getAnnotation(WikittyField.class); + String fieldFQN = annotation.fqn(); + + //extract extension and field name from fqn + String ext = fieldFQN.substring(0,fieldFQN.lastIndexOf(".")); + String fieldName = fieldFQN.substring(fieldFQN.lastIndexOf(".")+1); + + //set the value + Object value = w.getField(ext,fieldName); + Method m = entityClass.getMethod("set" + StringUtils.capitalize(field.getName()), field.getType()); + m.invoke(result,value); + } + } + + result.setWikittyVersion(w.getWikittyVersion()); + }catch (Exception eee){ log.error("Could not transform Wikitty to DTO", eee); } return result; } - public static <E extends BusinessEntity, F extends BusinessEntity> E fromDto(F dto) { - Class clazz = dto.getClass(); - String wClassName = clazz.getName().replace("DTO", "Impl"); - E result = null; + public static <E extends BusinessEntity, F extends BusinessEntity> E fromDto(WikittyProxy proxy, Class<E> clazz, F dto) { + + E result = proxy.restore(clazz, dto.getWikittyId()); + + try { - Class clazzImpl = Class.forName(wClassName); - Wikitty w = new WikittyImpl(dto.getWikittyId()); - result = (E)ObjectUtil.newInstance(clazzImpl+"(w)"); - BeanUtils.copyProperties(result, dto); - } catch (Exception eee){ - log.error("Could not transform DTO to Wikitty", eee); + + //get all fields + Class entityClass = dto.getClass(); + Class resultClass = result.getClass(); + Field[] fields = entityClass.getDeclaredFields(); + + for (Field field : fields) { + //for each field that got WikittyField annotation + if (field.isAnnotationPresent(WikittyField.class)) { + + //get the attribute's wikitty fqn + WikittyField annotation = field.getAnnotation(WikittyField.class); + + //get the value from dto + Method m = entityClass.getMethod("get" + StringUtils.capitalize(field.getName())); + Object value = m.invoke(dto); + + //set the value on entity + m = resultClass.getMethod("set" + StringUtils.capitalize(field.getName()), field.getType()); + m.invoke(result, value); + } + } + + } catch (Exception eee) { + log.error("Could not transform Wikitty to DTO", eee); } + + result.setWikittyVersion(dto.getWikittyVersion()); return result; } Modified: trunk/wikitty-dto/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java =================================================================== --- trunk/wikitty-dto/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java 2010-11-23 16:09:03 UTC (rev 505) +++ trunk/wikitty-dto/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java 2010-11-24 12:42:33 UTC (rev 506) @@ -25,6 +25,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; @@ -41,6 +42,7 @@ import org.nuiton.eugene.models.object.ObjectModelClass; import org.nuiton.eugene.models.object.ObjectModelModifier; import org.nuiton.eugene.models.object.ObjectModelOperation; +import org.nuiton.eugene.models.object.ObjectModelParameter; /*{generator option: writeString = }*/ @@ -99,7 +101,7 @@ } for (ObjectModelClass clazz : modelBoth) { - ObjectModelClass abstractClass = createAbstractClass( + ObjectModelClass abstractClass = createClass( businessEntityToDTOName(clazz), clazz.getPackageName()); processedClasses.put(clazz, abstractClass); @@ -127,6 +129,8 @@ ObjectModelClass abstractClassForThisEntity = processedClasses.get(clazz); addConstructors(abstractClassForThisEntity); addToString(clazz, abstractClassForThisEntity); + addBusinessEntityMethods(abstractClassForThisEntity); + addModelOperations(clazz, abstractClassForThisEntity); } processedClasses.clear(); @@ -150,6 +154,20 @@ /*{ }*/); + constructor = addConstructor(clazz, ObjectModelModifier.PUBLIC); + addParameter(constructor, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty"); + setOperationBody(constructor, "" +/*{ + wikittyId=wikitty.getId(); +}*/); + + constructor = addConstructor(clazz, ObjectModelModifier.PUBLIC); + addParameter(constructor, "String", "wikittyId"); + setOperationBody(constructor, "" +/*{ + this.wikittyId=wikittyId; +}*/); + } protected void addOperations(ObjectModelClass businessEntity, ObjectModelClass abstractClass) { @@ -185,8 +203,12 @@ String attributeTypeInSet = WikittyTransformerUtil.generateResultType(attribute, true); //adding the attribute - addAttribute(abstractClass, attributeName, attributeTypeInSet); + ObjectModelAttribute modelAttribute = addAttribute(abstractClass, attributeName, attributeTypeInSet); + String annotation = "WikittyField(fqn=\""+ businessEntity.getName() + "." + attributeName +"\")"; + addAnnotation(abstractClass, modelAttribute, annotation); + addImport(abstractClass, org.nuiton.wikitty.entities.WikittyField.class); + // adding the getter getterName = "get" + StringUtils.capitalize(attributeName); ObjectModelOperation getter = addOperation(abstractClass, getterName, attributeTypeInSet); @@ -247,7 +269,10 @@ addImport(abstractClass, attribute.getType()); //adding the attribute - addAttribute(abstractClass, attributeName, attributeType); + ObjectModelAttribute modelAttribute = addAttribute(abstractClass, attributeName, attributeType); + String annotation = "WikittyField(fqn=\"" + businessEntity.getName() + "."+attributeName + "\")"; + addAnnotation(abstractClass, modelAttribute, annotation); + addImport(abstractClass, org.nuiton.wikitty.entities.WikittyField.class); // adding getter getterName = "get" + StringUtils.capitalize(attributeName); @@ -382,4 +407,156 @@ protected String businessEntityToDTOName(ObjectModelClass clazz) { return clazz.getName() + "DTO"; } + + protected void addBusinessEntityMethods(ObjectModelClass dtoClass) { + + //adding wikittyId attribute + addAttribute(dtoClass, "wikittyId", "String"); + + //adding getWikittyId method + ObjectModelOperation getter = addOperation(dtoClass, "getWikittyId", "String"); + addAnnotation(dtoClass, getter, "Override"); + setOperationBody(getter, "" +/*{ + return wikittyId; +}*/); + + //adding setWikittyId method + ObjectModelOperation setter = addOperation(dtoClass, "setWikittyId", "void"); + addParameter(setter, "String", "wikittyId"); + setOperationBody(setter, "" +/*{ + this.wikittyId=wikittyId; +}*/); + + //adding wikittyVersion attribute + addAttribute(dtoClass, "wikittyVersion", "String"); + + + + //adding getWikittyVersion method + ObjectModelOperation getWikittyVersion = addOperation(dtoClass, + "getWikittyVersion", "String"); + addAnnotation(dtoClass, getWikittyVersion, "Override"); + setOperationBody(getWikittyVersion, "" +/*{ + return wikittyVersion; +}*/); + + //adding setWikittyVersion method + ObjectModelOperation setWikittyVersion = addOperation(dtoClass, + "setWikittyVersion", "void"); + addParameter(setWikittyVersion, "String", "wikittyVersion"); + setOperationBody(setWikittyVersion, "" +/*{ + this.wikittyVersion=wikittyVersion; +}*/); + + //adding necessary imports + addImport(dtoClass, java.beans.PropertyChangeListener.class); + addImport(dtoClass, java.util.Collection.class); + + // adding addPropertyChangeListener + ObjectModelOperation addPropertyChangeListener = addOperation(dtoClass, + "addPropertyChangeListener", "void"); + addAnnotation(dtoClass, addPropertyChangeListener, "Override"); + addParameter(addPropertyChangeListener, "PropertyChangeListener", "listener"); + setOperationBody(addPropertyChangeListener, "" +/*{ + throw new UnsupportedOperationException("Not supported yet."); +}*/); + + // adding removePropertyChangeListener + ObjectModelOperation removePropertyChangeListener = addOperation(dtoClass, + "removePropertyChangeListener", "void"); + addAnnotation(dtoClass, removePropertyChangeListener, "Override"); + addParameter(removePropertyChangeListener, "PropertyChangeListener", "listener"); + setOperationBody(removePropertyChangeListener, "" +/*{ + throw new UnsupportedOperationException("Not supported yet."); +}*/); + + // adding addPropertyChangeListener 2 parameters + ObjectModelOperation addPropertyChangeListener2 = addOperation(dtoClass, + "addPropertyChangeListener", "void"); + addAnnotation(dtoClass, addPropertyChangeListener2, "Override"); + addParameter(addPropertyChangeListener2, "String", "property"); + addParameter(addPropertyChangeListener2, "PropertyChangeListener", "listener"); + setOperationBody(addPropertyChangeListener2, "" +/*{ + throw new UnsupportedOperationException("Not supported yet."); +}*/); + + // adding removePropertyChangeListener 2 parameters + ObjectModelOperation removePropertyChangeListener2 = addOperation(dtoClass, + "removePropertyChangeListener", "void"); + addAnnotation(dtoClass, removePropertyChangeListener2, "Override"); + addParameter(removePropertyChangeListener2, "String", "property"); + addParameter(removePropertyChangeListener2, "PropertyChangeListener", "listener"); + setOperationBody(removePropertyChangeListener2, "" +/*{ + throw new UnsupportedOperationException("Not supported yet."); +}*/); + + //adding getExtensionFields method + ObjectModelOperation getExtensionFields = addOperation(dtoClass, + "getExtensionFields", "Collection<String>"); + addAnnotation(dtoClass, getExtensionFields, "Override"); + addParameter(getExtensionFields, "String", "ext"); + setOperationBody(getExtensionFields, "" +/*{ + throw new UnsupportedOperationException("Not supported yet."); +}*/); + + //adding getExtensionNames method + ObjectModelOperation getExtensionNames = addOperation(dtoClass, + "getExtensionNames", "Collection<String>"); + addAnnotation(dtoClass, getExtensionNames, "Override"); + setOperationBody(getExtensionNames, "" +/*{ + throw new UnsupportedOperationException("Not supported yet."); +}*/); + + //adding getField method + ObjectModelOperation getField = addOperation(dtoClass, "getField", "Object"); + addAnnotation(dtoClass, getField, "Override"); + addParameter(getField, "String", "ext"); + addParameter(getField, "String", "fieldName"); + setOperationBody(getField, "" +/*{ + throw new UnsupportedOperationException("Not supported yet."); +}*/); + + //adding setField method + ObjectModelOperation setField = addOperation(dtoClass, "setField", "void"); + addAnnotation(dtoClass, setField, "Override"); + addParameter(setField, "String", "ext"); + addParameter(setField, "String", "fieldName"); + addParameter(setField, "Object", "value"); + setOperationBody(setField, "" +/*{ + throw new UnsupportedOperationException("Not supported yet."); +}*/); + + } + + protected void addModelOperations(ObjectModelClass businessEntity, ObjectModelClass dtoClass){ + Collection<ObjectModelOperation> operations = businessEntity.getOperations(); + + for (ObjectModelOperation operation:operations){ + ObjectModelOperation dtoOperation = addOperation(dtoClass, + operation.getName(), operation.getReturnType()); + + Collection<ObjectModelParameter> parameters = operation.getParameters(); + for (ObjectModelParameter parameter:parameters){ + addParameter(dtoOperation, parameter.getType(), parameter.getName()); + } + addAnnotation(dtoClass, dtoOperation, "Override"); + setOperationBody(dtoOperation, "" +/*{ + throw new UnsupportedOperationException("Not supported yet."); +}*/); + } + } + } Added: trunk/wikitty-dto/src/test/java/org/nuiton/wikitty/dto/WikittyDTOTest.java =================================================================== --- trunk/wikitty-dto/src/test/java/org/nuiton/wikitty/dto/WikittyDTOTest.java (rev 0) +++ trunk/wikitty-dto/src/test/java/org/nuiton/wikitty/dto/WikittyDTOTest.java 2010-11-24 12:42:33 UTC (rev 506) @@ -0,0 +1,57 @@ +package org.nuiton.wikitty.dto; + +import org.junit.Test; +import org.nuiton.util.ApplicationConfig; +import org.nuiton.wikitty.WikittyConfig; +import org.nuiton.wikitty.WikittyProxy; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.nuiton.wikitty.entities.WikittyLabel; +import org.nuiton.wikitty.entities.WikittyLabelDTO; +import org.nuiton.wikitty.entities.WikittyLabelImpl; +import org.nuiton.wikitty.services.WikittyServiceInMemory; + +public class WikittyDTOTest { + + static private Log log = LogFactory.getLog(WikittyDTOTest.class); + + @Test + public void testConversions() { + + //create proxy as we can only use proxy when dealing with dtos + ApplicationConfig config = new WikittyConfig(); + WikittyServiceInMemory ws = new WikittyServiceInMemory(config); + WikittyProxy proxy = new WikittyProxy(ws); + + //create business entity with wikitty + WikittyLabel label = new WikittyLabelImpl(); + label.addLabels("Test"); + + //store entity + proxy.store(label); + + //make conversion + WikittyLabelDTO dto = DTOHelper.toDto(label); + + //check that dto fields are the same than the wikitty ones + Assert.assertNotNull(dto); + Assert.assertEquals(label.getWikittyId(),dto.getWikittyId()); + Assert.assertEquals(label.getWikittyVersion(),dto.getWikittyVersion()); + Assert.assertEquals(label.getLabels(), dto.getLabels()); + + //modify dto + dto.addLabels("toto"); + dto.setWikittyVersion("2.0"); + + //make conversion to wikitty + WikittyLabel secondLabel = DTOHelper.fromDto(proxy,WikittyLabel.class,dto); + + //check that dto fields are the same than the wikitty ones + Assert.assertNotNull(secondLabel); + Assert.assertEquals(dto.getWikittyId(),secondLabel.getWikittyId()); + Assert.assertEquals(dto.getWikittyVersion(), secondLabel.getWikittyVersion()); + Assert.assertEquals(dto.getLabels(), secondLabel.getLabels()); + + } +} \ No newline at end of file