Author: sbavencoff Date: 2013-12-12 16:03:49 +0100 (Thu, 12 Dec 2013) New Revision: 2613 Url: http://nuiton.org/projects/nuiton-utils/repository/revisions/2613 Log: fixes #2967 : In Deep copy add factory for create a new instance Added: trunk/src/main/java/org/nuiton/util/beans/InstanceFactory.java Modified: trunk/src/main/java/org/nuiton/util/beans/Binder.java trunk/src/main/java/org/nuiton/util/beans/BinderModelBuilder.java Modified: trunk/src/main/java/org/nuiton/util/beans/Binder.java =================================================================== --- trunk/src/main/java/org/nuiton/util/beans/Binder.java 2013-12-12 13:12:36 UTC (rev 2612) +++ trunk/src/main/java/org/nuiton/util/beans/Binder.java 2013-12-12 15:03:49 UTC (rev 2613) @@ -555,7 +555,12 @@ protected Object bind(Binder binder, Object read) throws IllegalAccessException, InstantiationException { Object result = null; if (read != null) { - result = read.getClass().newInstance(); + InstanceFactory<O> instanceFactory = binder.model.getInstanceFactory(); + if (instanceFactory == null) { + result = read.getClass().newInstance(); + } else { + result = instanceFactory.newInstance(); + } binder.copy(read, result); } return result; @@ -597,6 +602,9 @@ /** mapping of extra binders to use to copy properties */ protected Map<String, Binder<?, ?>> binders; + /** factory of target Instance */ + protected InstanceFactory<T> instanceFactory; + private static final long serialVersionUID = 2L; public BinderModel(Class<S> sourceType, Class<T> targetType) { @@ -818,5 +826,13 @@ public Binder<?, ?> getBinder(String sourceProperty) { return binders.get(sourceProperty); } + + public void setInstanceFactory(InstanceFactory<T> instanceFactory) { + this.instanceFactory = instanceFactory; + } + + public InstanceFactory<T> getInstanceFactory() { + return instanceFactory; + } } } Modified: trunk/src/main/java/org/nuiton/util/beans/BinderModelBuilder.java =================================================================== --- trunk/src/main/java/org/nuiton/util/beans/BinderModelBuilder.java 2013-12-12 13:12:36 UTC (rev 2612) +++ trunk/src/main/java/org/nuiton/util/beans/BinderModelBuilder.java 2013-12-12 15:03:49 UTC (rev 2613) @@ -261,6 +261,12 @@ return binder; } + /** + * set factory of target instance + */ + public void setInstanceFactory(InstanceFactory<T> instanceFactory) { + model.setInstanceFactory(instanceFactory); + } /** * Add to the binder model some simple properties (says source property name Added: trunk/src/main/java/org/nuiton/util/beans/InstanceFactory.java =================================================================== --- trunk/src/main/java/org/nuiton/util/beans/InstanceFactory.java (rev 0) +++ trunk/src/main/java/org/nuiton/util/beans/InstanceFactory.java 2013-12-12 15:03:49 UTC (rev 2613) @@ -0,0 +1,10 @@ +package org.nuiton.util.beans; + +/** + * @author Sylvain Bavencoff <bavencoff@codelutin.com> + */ +public interface InstanceFactory<O> { + + public O newInstance(); + +}