From 4e5fa30282279ec685e318723b5d269667ab7938 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 14 Jan 2014 10:11:33 +0100 Subject: [PATCH] DATAREST-130 - Code polish and JavaDoc. --- .../rest/core/support/DomainObjectMerger.java | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/support/DomainObjectMerger.java b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/support/DomainObjectMerger.java index ed2e5e6e1..2a75c2f7e 100644 --- a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/support/DomainObjectMerger.java +++ b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/support/DomainObjectMerger.java @@ -25,16 +25,26 @@ import org.springframework.data.mapping.SimplePropertyHandler; import org.springframework.data.mapping.model.BeanWrapper; import org.springframework.data.repository.support.Repositories; import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; /** + * Component to be able to merge the first level of two objects. + * * @author Jon Brisbin * @author Oliver Gierke + * @author Willie Wheeler */ public class DomainObjectMerger { private final Repositories repositories; private final ConversionService conversionService; + /** + * Creates a new {@link DomainObjectMerger} for the given {@link Repositories} and {@link ConversionService}. + * + * @param repositories must not be {@literal null}. + * @param conversionService must not be {@literal null}. + */ @Autowired public DomainObjectMerger(Repositories repositories, ConversionService conversionService) { @@ -45,6 +55,12 @@ public class DomainObjectMerger { this.conversionService = conversionService; } + /** + * Merges the given target object into the source one. + * + * @param from can be {@literal null}. + * @param target can be {@literal null}. + */ public void merge(Object from, Object target) { if (null == from || null == target) { @@ -53,8 +69,7 @@ public class DomainObjectMerger { final BeanWrapper fromWrapper = BeanWrapper.create(from, conversionService); final BeanWrapper targetWrapper = BeanWrapper.create(target, conversionService); - - PersistentEntity entity = repositories.getPersistentEntity(target.getClass()); + final PersistentEntity entity = repositories.getPersistentEntity(target.getClass()); entity.doWithProperties(new SimplePropertyHandler() { @@ -63,16 +78,17 @@ public class DomainObjectMerger { * @see org.springframework.data.mapping.SimplePropertyHandler#doWithPersistentProperty(org.springframework.data.mapping.PersistentProperty) */ @Override - public void doWithPersistentProperty(PersistentProperty persistentProperty) { - Object fromVal = fromWrapper.getProperty(persistentProperty); - - // Support PUTting null property values per DATAREST-130. - boolean mergeProperty = - !entity.isIdProperty(persistentProperty) - && (fromVal == null || !fromVal.equals(targetWrapper.getProperty(persistentProperty))); - - if (mergeProperty) { - targetWrapper.setProperty(persistentProperty, fromVal); + public void doWithPersistentProperty(PersistentProperty persistentProperty) { + + Object sourceValue = fromWrapper.getProperty(persistentProperty); + Object targetValue = targetWrapper.getProperty(persistentProperty); + + if (entity.isIdProperty(persistentProperty)) { + return; + } + + if (!ObjectUtils.nullSafeEquals(sourceValue, targetValue)) { + targetWrapper.setProperty(persistentProperty, sourceValue); } } });