From 0468ba3ad92b6743675a3eb17ffedced0bf5ef09 Mon Sep 17 00:00:00 2001 From: Thomas Risberg Date: Fri, 25 Mar 2011 11:14:51 -0400 Subject: [PATCH] DATADOC-48 adding checks not to overwrite existing keys in changeset --- .../mongo/MongoChangeSetPersister.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/spring-data-mongodb-cross-store/src/main/java/org/springframework/data/persistence/document/mongo/MongoChangeSetPersister.java b/spring-data-mongodb-cross-store/src/main/java/org/springframework/data/persistence/document/mongo/MongoChangeSetPersister.java index ef8ca62cd..f793aea7a 100644 --- a/spring-data-mongodb-cross-store/src/main/java/org/springframework/data/persistence/document/mongo/MongoChangeSetPersister.java +++ b/spring-data-mongodb-cross-store/src/main/java/org/springframework/data/persistence/document/mongo/MongoChangeSetPersister.java @@ -6,7 +6,6 @@ import com.mongodb.DBObject; import com.mongodb.MongoException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.data.document.mongodb.CollectionCallback; @@ -43,27 +42,32 @@ public class MongoChangeSetPersister implements ChangeSetPersister { final DBObject dbk = new BasicDBObject(); dbk.put(ENTITY_ID, id); dbk.put(ENTITY_CLASS, entityClass.getName()); + if (log.isDebugEnabled()) { + log.debug("Loading MongoDB data for " + dbk); + } mongoTemplate.execute(collName, new CollectionCallback() { @Override public Object doInCollection(DBCollection collection) throws MongoException, DataAccessException { for (DBObject dbo : collection.find(dbk)) { String key = (String) dbo.get(ENTITY_FIELD_NAME); - String className = (String) dbo.get(ENTITY_FIELD_CLASS); - if (className == null) { - throw new DataIntegrityViolationException( - "Unble to convert property " + key - + ": Invalid metadata, " + ENTITY_FIELD_CLASS + " not available"); + if (log.isDebugEnabled()) { + log.debug("Processing key: " + key); } - Class clazz = null; - try { - clazz = Class.forName(className); - } catch (ClassNotFoundException e) { - throw new DataIntegrityViolationException( - "Unble to convert property " + key + " of type " + className, e); + if (!changeSet.getValues().containsKey(key)) { + String className = (String) dbo.get(ENTITY_FIELD_CLASS); + if (className == null) { + throw new DataIntegrityViolationException( + "Unble to convert property " + key + + ": Invalid metadata, " + ENTITY_FIELD_CLASS + " not available"); + } + Class clazz = ClassUtils.resolveClassName(className, ClassUtils.getDefaultClassLoader()); + Object value = mongoTemplate.getConverter().read(clazz, dbo); + if (log.isDebugEnabled()) { + log.debug("Adding to ChangeSet: " + key); + } + changeSet.set(key, value); } - Object value = mongoTemplate.getConverter().read(clazz, dbo); - changeSet.set(key, value); } return null; }