Author: bpoussin Date: 2010-11-24 18:00:26 +0100 (Wed, 24 Nov 2010) New Revision: 513 Url: http://nuiton.org/repositories/revision/wikitty/513 Log: add copyFrom on BusinessEntity add copyBean on WikittyUtil add test for this methods Added: trunk/wikitty-api/src/test/java/entities/ trunk/wikitty-api/src/test/java/entities/BusinessEntityImplTest.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/BusinessEntity.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/BusinessEntityImpl.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2010-11-24 15:44:21 UTC (rev 512) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2010-11-24 17:00:26 UTC (rev 513) @@ -25,6 +25,7 @@ package org.nuiton.wikitty; +import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.apache.commons.lang.StringUtils; @@ -58,6 +59,7 @@ import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.beanutils.BeanUtilsBean; import org.apache.commons.lang.time.DateUtils; import org.apache.commons.lang.time.FastDateFormat; @@ -981,4 +983,44 @@ return result; } + /** + * Copy all properties (get/set) from source to destination, + * except wikitty property + * + * @param source + * @param dest + * @throws Exception + */ + static public void copyBean(Object source, Object dest) throws Exception { + BeanUtilsBean bu = BeanUtilsBean.getInstance(); + PropertyDescriptor[] origDescriptors = + bu.getPropertyUtils().getPropertyDescriptors(source); + + for (int i = 0; i < origDescriptors.length; i++) { + String name = origDescriptors[i].getName(); + if (log.isDebugEnabled()) { + log.debug("work on prop :" + name); + } + if ("class".equals(name)) { + continue; // No point in trying to set an object's class + } + if ("wikitty".equals(name)) { + continue; // No point in trying to set an wikitty + } + if (bu.getPropertyUtils().isReadable(source, name) + && bu.getPropertyUtils().isWriteable(dest, name)) { + if (log.isDebugEnabled()) { + log.debug("prop is copiable:" + name); + } + try { + Object value = + bu.getPropertyUtils().getSimpleProperty(source, name); + bu.copyProperty(dest, name, value); + } catch (NoSuchMethodException e) { + // Should not happen + } + } + } + } + } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/BusinessEntity.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/BusinessEntity.java 2010-11-24 15:44:21 UTC (rev 512) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/BusinessEntity.java 2010-11-24 17:00:26 UTC (rev 513) @@ -97,6 +97,13 @@ public void setField(String ext, String fieldName, Object value); /** + * Copy all field version included from source to current bean (only + * id is not copied, but must be the same) + * @param source + */ + public void copyFrom(BusinessEntity source); + + /** * Return the field type. * * @param ext extension Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/BusinessEntityImpl.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/BusinessEntityImpl.java 2010-11-24 15:44:21 UTC (rev 512) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/BusinessEntityImpl.java 2010-11-24 17:00:26 UTC (rev 513) @@ -28,6 +28,9 @@ import java.beans.PropertyChangeSupport; import java.util.Collection; import java.util.Collections; +import org.apache.commons.beanutils.BeanUtils; +import org.nuiton.wikitty.WikittyException; +import org.nuiton.wikitty.WikittyUtil; /** * @@ -97,6 +100,21 @@ public Wikitty getWikitty() { return wikitty; } + + /** + * this copy used introspection, you can override it in generated class + * to optimize it + * @param source + */ + @Override + public void copyFrom(BusinessEntity source) { + try { + WikittyUtil.copyBean(source, this); + } catch(Exception eee) { + throw new WikittyException(String.format( + "Can't copy source object %s", source), eee); + } + } @Override public Collection<String> getExtensionNames() { Added: trunk/wikitty-api/src/test/java/entities/BusinessEntityImplTest.java =================================================================== --- trunk/wikitty-api/src/test/java/entities/BusinessEntityImplTest.java (rev 0) +++ trunk/wikitty-api/src/test/java/entities/BusinessEntityImplTest.java 2010-11-24 17:00:26 UTC (rev 513) @@ -0,0 +1,43 @@ +package entities; + + +import java.beans.PropertyDescriptor; +import java.util.Arrays; +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.beanutils.BeanUtilsBean; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.Test; +import org.nuiton.wikitty.WikittyUtil; +import org.nuiton.wikitty.entities.WikittyLabel; +import org.nuiton.wikitty.entities.WikittyLabelImpl; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class BusinessEntityImplTest { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(BusinessEntityImplTest.class); + + @Test + public void testCopyFrom() throws Exception { + WikittyLabel source = new WikittyLabelImpl(); + source.addLabels("1erLabel"); + source.addLabels("2emeLabel"); + + WikittyLabel dest = new WikittyLabelImpl(); + + dest.copyFrom(source); + Assert.assertFalse(source.getWikittyId().equals(dest.getWikittyId())); + Assert.assertEquals(source.getWikittyVersion(), dest.getWikittyVersion()); + Assert.assertEquals(source.getLabels(), dest.getLabels()); + } + +} 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-24 15:44:21 UTC (rev 512) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java 2010-11-24 17:00:26 UTC (rev 513) @@ -25,6 +25,7 @@ package org.nuiton.wikitty.api; +import entities.BusinessEntityImplTest; import java.beans.PropertyChangeListener; import java.math.BigDecimal; import java.text.ParseException; @@ -35,6 +36,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Set; +import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -42,6 +44,8 @@ import org.junit.Test; import org.nuiton.util.ApplicationConfig; import org.nuiton.wikitty.WikittyConfig; +import org.nuiton.wikitty.WikittyException; +import org.nuiton.wikitty.entities.BusinessEntity; import org.nuiton.wikitty.entities.FieldType; import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.entities.WikittyField; @@ -519,9 +523,8 @@ ws.store(null, Collections.singleton(labelWikitty), false); - LabelDTO dto = new LabelDTO(); + LabelDTO dto = new LabelDTO(wikittyId); dto.addLabels("toto"); - dto.setWikittyId(wikittyId); dto.setWikittyVersion("2.0"); Wikitty w = WikittyUtil.getWikitty(ws, null, dto); @@ -532,14 +535,57 @@ Assert.assertEquals(dto.getLabels(), l.getLabels()); } + @Test + public void testCopyBean() throws Exception { + WikittyLabel source = new WikittyLabelImpl(); + source.addLabels("toto"); + WikittyLabel dest = new WikittyLabelImpl(); + + WikittyUtil.copyBean(source, dest); + + Assert.assertFalse(source.getWikittyId().equals(dest.getWikittyId())); + Assert.assertEquals(source.getWikittyVersion(), dest.getWikittyVersion()); + Assert.assertEquals(source.getLabels(), dest.getLabels()); + } + + @Test + public void testCopyFrom() throws Exception { + { +// System.out.println("Dto => W"); + WikittyLabel source = new LabelDTO(WikittyUtil.genUID()); + source.addLabels("toto"); + source.addLabels("titi"); + WikittyLabel dest = new WikittyLabelImpl(); + + dest.copyFrom(source); + Assert.assertFalse(source.getWikittyId().equals(dest.getWikittyId())); + Assert.assertEquals(source.getWikittyVersion(), dest.getWikittyVersion()); + Assert.assertEquals(source.getLabels(), dest.getLabels()); + } + { +// System.out.println("W => Dto"); + WikittyLabel source = new WikittyLabelImpl(); + source.addLabels("toto"); + source.addLabels("titi"); + WikittyLabel dest = new LabelDTO(WikittyUtil.genUID()); + + dest.copyFrom(source); + Assert.assertFalse(source.getWikittyId().equals(dest.getWikittyId())); + Assert.assertEquals(source.getWikittyVersion(), dest.getWikittyVersion()); + Assert.assertEquals(source.getLabels(), dest.getLabels()); + } + + + } + static public class LabelDTO implements WikittyLabel { protected String wikittyId; - protected String wikittyVersion; + protected String wikittyVersion = "0.0"; @WikittyField(fqn="WikittyLabel.labels") protected Set<String> labels = new HashSet<String>(); - public void setWikittyId(String wikittyId) { + public LabelDTO(String wikittyId) { this.wikittyId = wikittyId; } @@ -598,6 +644,16 @@ } @Override + public void copyFrom(BusinessEntity source) { + try { + BeanUtils.copyProperties(this, source); + } catch (Exception eee) { + throw new WikittyException(String.format( + "Can't copy source object %s", source), eee); + } + } + + @Override public Collection<String> getExtensionFields(String ext) { throw new UnsupportedOperationException("Not supported yet."); }