From dd02338b5e96c9546ef45bedc7eacd22bd2ea492 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Fri, 19 Aug 2011 21:28:25 +0200 Subject: [PATCH] DATADOC-246 - Added DBRef to Mongo simple types. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit General overhaul of default setup of custom Mongo simple types. MongoTemplate.doUpdate(…) transparently handles null queries now as well. --- .../data/mongodb/core/MongoTemplate.java | 3 +- .../core/convert/CustomConversions.java | 6 +-- .../core/mapping/MongoMappingContext.java | 25 ++-------- .../core/mapping/MongoSimpleTypes.java | 46 +++++++++++++++++++ .../data/mongodb/core/MongoTemplateTests.java | 17 +++++++ .../convert/CustomConversionsUnitTests.java | 9 ++++ .../src/test/resources/infrastructure.xml | 2 +- 7 files changed, 82 insertions(+), 26 deletions(-) create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoSimpleTypes.java diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index ad177c79d..eaa206b72 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -679,7 +679,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { MongoPersistentEntity entity = entityClass == null ? null : getPersistentEntity(entityClass); - DBObject queryObj = mapper.getMappedObject(query.getQueryObject(), entity); + DBObject queryObj = query == null ? new BasicDBObject() : mapper.getMappedObject(query.getQueryObject(), entity); DBObject updateObj = update.getUpdateObject(); for (String key : updateObj.keySet()) { @@ -1123,7 +1123,6 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { } private static final MongoConverter getDefaultMongoConverter(MongoDbFactory factory) { - // ToDo: maybe add some additional configurations to this very basic one MappingMongoConverter converter = new MappingMongoConverter(factory, new MongoMappingContext()); converter.afterPropertiesSet(); return converter; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java index 72d7f7e26..312515e50 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java @@ -34,6 +34,7 @@ import org.springframework.core.convert.support.GenericConversionService; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.mongodb.core.convert.MongoConverters.BigDecimalToStringConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigDecimalConverter; +import org.springframework.data.mongodb.core.mapping.MongoSimpleTypes; import org.springframework.util.Assert; import com.mongodb.DBObject; @@ -48,7 +49,7 @@ import com.mongodb.DBObject; * @author Oliver Gierke */ public class CustomConversions { - + @SuppressWarnings({ "unchecked" }) private static final List> MONGO_TYPES = Arrays.asList(Number.class, Date.class, ObjectId.class, String.class, DBObject.class); @@ -79,7 +80,6 @@ public class CustomConversions { this.readingPairs = new HashSet(); this.writingPairs = new HashSet(); this.customSimpleTypes = new HashSet>(); - this.customSimpleTypes.add(ObjectId.class); this.converters = new ArrayList(); this.converters.add(CustomToStringConverter.INSTANCE); @@ -91,7 +91,7 @@ public class CustomConversions { registerConversion(c); } - this.simpleTypeHolder = new SimpleTypeHolder(customSimpleTypes, true); + this.simpleTypeHolder = new SimpleTypeHolder(customSimpleTypes, MongoSimpleTypes.HOLDER); } /** diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoMappingContext.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoMappingContext.java index bd7741256..f6530928d 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoMappingContext.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoMappingContext.java @@ -18,11 +18,7 @@ package org.springframework.data.mongodb.core.mapping; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; -import java.util.HashSet; -import java.util.Set; -import org.bson.types.CodeWScope; -import org.bson.types.ObjectId; import org.springframework.data.mapping.context.AbstractMappingContext; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.util.TypeInformation; @@ -32,23 +28,12 @@ import org.springframework.data.util.TypeInformation; * @author Oliver Gierke ogierke@vmware.com */ public class MongoMappingContext extends AbstractMappingContext, MongoPersistentProperty> { - - private static final Set> MONGO_SIMPLE_TYPES = new HashSet>(); - - static { - MONGO_SIMPLE_TYPES.add(com.mongodb.DBRef.class); - MONGO_SIMPLE_TYPES.add(ObjectId.class); - MONGO_SIMPLE_TYPES.add(CodeWScope.class); - MONGO_SIMPLE_TYPES.add(Character.class); - } - - /* - * (non-Javadoc) - * @see org.springframework.data.mapping.AbstractMappingContext#setSimpleTypeHolder(org.springframework.data.mapping.SimpleTypeHolder) + + /** + * Creates a new {@link MongoMappingContext}. */ - @Override - public void setSimpleTypeHolder(SimpleTypeHolder simpleTypes) { - super.setSimpleTypeHolder(new SimpleTypeHolder(MONGO_SIMPLE_TYPES, simpleTypes)); + public MongoMappingContext() { + setSimpleTypeHolder(MongoSimpleTypes.HOLDER); } /* diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoSimpleTypes.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoSimpleTypes.java new file mode 100644 index 000000000..d049fb71c --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoSimpleTypes.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2011 by the original author(s). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.mongodb.core.mapping; + +import java.util.HashSet; +import java.util.Set; + +import org.bson.types.CodeWScope; +import org.bson.types.ObjectId; +import org.springframework.data.mapping.model.SimpleTypeHolder; + +import com.mongodb.DBRef; + +/** + * Simple constant holder for a {@link SimpleTypeHolder} enriched with Mongo specific simple types. + * + * @author Oliver Gierke + */ +public abstract class MongoSimpleTypes { + + private static final Set> MONGO_SIMPLE_TYPES = new HashSet>(); + + static { + MONGO_SIMPLE_TYPES.add(DBRef.class); + MONGO_SIMPLE_TYPES.add(ObjectId.class); + MONGO_SIMPLE_TYPES.add(CodeWScope.class); + } + + public static final SimpleTypeHolder HOLDER = new SimpleTypeHolder(MONGO_SIMPLE_TYPES, true); + + private MongoSimpleTypes() { + } +} diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index 8c06a9734..bf5a89e50 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -51,6 +51,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.mongodb.DBCollection; import com.mongodb.DBObject; +import com.mongodb.DBRef; import com.mongodb.Mongo; import com.mongodb.MongoException; import com.mongodb.WriteResult; @@ -772,4 +773,20 @@ public class MongoTemplateTests { assertThat(result.getId(), is(person.getId())); assertThat(result.getFirstName(), is("Carter")); } + + /** + * @see DATADOC-246 + */ + @Test + public void updatesDBRefsCorrectly() { + + DBRef first = new DBRef(factory.getDb(), "foo", new ObjectId()); + DBRef second = new DBRef(factory.getDb(), "bar", new ObjectId()); + + template.updateFirst(null, Update.update("dbRefs", Arrays.asList(first, second)), ClassWithDBRefs.class); + } + + class ClassWithDBRefs { + List dbrefs; + } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/CustomConversionsUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/CustomConversionsUnitTests.java index 2fcee5b38..7c55017af 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/CustomConversionsUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/CustomConversionsUnitTests.java @@ -13,6 +13,8 @@ import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.support.ConversionServiceFactory; import org.springframework.core.convert.support.GenericConversionService; +import com.mongodb.DBRef; + /** * Unit tests for {@link CustomConversions}. * @@ -82,6 +84,13 @@ public class CustomConversionsUnitTests { assertThat(conversions.hasCustomReadTarget(ObjectId.class, String.class), is(true)); assertThat(conversions.hasCustomReadTarget(ObjectId.class, Object.class), is(false)); } + + @Test + public void considersDBRefsToBeSimpleTypes() { + + CustomConversions conversions = new CustomConversions(); + assertThat(conversions.isSimpleType(DBRef.class), is(true)); + } @Test public void populatesConversionServiceCorrectly() { diff --git a/spring-data-mongodb/src/test/resources/infrastructure.xml b/spring-data-mongodb/src/test/resources/infrastructure.xml index a4803e4d0..2cd73b7bd 100644 --- a/spring-data-mongodb/src/test/resources/infrastructure.xml +++ b/spring-data-mongodb/src/test/resources/infrastructure.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> - +