From 4cf3567f42c8e0360cb20fe16fe395051cc8e681 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 23 Nov 2011 13:13:40 +0100 Subject: [PATCH] =?UTF-8?q?DATAMONGO-310=20-=20MappingMongoConverter=20now?= =?UTF-8?q?=20creates=20native=20Mongo=20types=20for=20Maps=20and=20Collec?= =?UTF-8?q?tions=20in=20convertToMongoType(=E2=80=A6).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MappingMongoConverter.convertToMongoType(…) not only converts elements of collections and maps but also converts the wrapper into the appropriate MongoDB type (BasicDBList, BasicDBObject). --- .../core/convert/MappingMongoConverter.java | 33 ++------ .../query/ConvertingParameterAccessor.java | 8 +- .../ConvertingParameterAccessorUnitTests.java | 79 +++++++++++++++++++ 3 files changed, 94 insertions(+), 26 deletions(-) create mode 100644 spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessorUnitTests.java diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java index b82f91fac..e198d8877 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java @@ -22,8 +22,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -888,24 +886,19 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App } if (obj instanceof Map) { - Map m = new HashMap(); + DBObject result = new BasicDBObject(); for (Map.Entry entry : ((Map) obj).entrySet()) { - m.put(entry.getKey(), convertToMongoType(entry.getValue())); + result.put(entry.getKey().toString(), convertToMongoType(entry.getValue())); } - return m; + return result; } if (obj instanceof List) { - List l = (List) obj; - List newList = new ArrayList(); - for (Object o : l) { - newList.add(convertToMongoType(o)); - } - return newList; + return maybeConvertList((List) obj); } if (obj.getClass().isArray()) { - return maybeConvertArray((Object[]) obj); + return maybeConvertList(Arrays.asList((Object[]) obj)); } DBObject newDbo = new BasicDBObject(); @@ -913,20 +906,10 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App return newDbo; } - public Object[] maybeConvertArray(Object[] src) { - Object[] newArr = new Object[src.length]; - for (int i = 0; i < src.length; i++) { - newArr[i] = convertToMongoType(src[i]); - } - return newArr; - } - - public BasicDBList maybeConvertList(BasicDBList dbl) { + public BasicDBList maybeConvertList(Iterable source) { BasicDBList newDbl = new BasicDBList(); - Iterator iter = dbl.iterator(); - while (iter.hasNext()) { - Object o = iter.next(); - newDbl.add(convertToMongoType(o)); + for (Object element : source) { + newDbl.add(convertToMongoType(element)); } return newDbl; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java index 66c3747e0..52e7417a4 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java @@ -24,6 +24,7 @@ import org.springframework.data.mongodb.core.convert.TypeKeyAware; import org.springframework.data.mongodb.core.geo.Distance; import org.springframework.data.mongodb.core.geo.Point; import org.springframework.data.repository.query.ParameterAccessor; +import org.springframework.util.Assert; import com.mongodb.BasicDBList; import com.mongodb.DBObject; @@ -41,9 +42,14 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor { /** * Creates a new {@link ConvertingParameterAccessor} with the given {@link MongoWriter} and delegate. * - * @param writer + * @param writer must not be {@literal null}. + * @param delegate must not be {@literal null}. */ public ConvertingParameterAccessor(MongoWriter writer, MongoParameterAccessor delegate) { + + Assert.notNull(writer); + Assert.notNull(delegate); + this.writer = writer; this.delegate = delegate; } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessorUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessorUnitTests.java new file mode 100644 index 000000000..42a17923a --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessorUnitTests.java @@ -0,0 +1,79 @@ +/* + * Copyright 2011 the original author or authors. + * + * 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.repository.query; + +import static org.mockito.Mockito.*; +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.*; + +import java.util.Arrays; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.data.mongodb.MongoDbFactory; +import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.mapping.MongoMappingContext; + +import com.mongodb.BasicDBList; + +/** + * Unit tests for {@link ConvertingParameterAccessor}. + * + * @author Oliver Gierke + */ +@RunWith(MockitoJUnitRunner.class) +public class ConvertingParameterAccessorUnitTests { + + @Mock + MongoDbFactory factory; + @Mock + MongoParameterAccessor accessor; + + MongoMappingContext context; + MappingMongoConverter converter; + + @Before + public void setUp() { + context = new MongoMappingContext(); + converter = new MappingMongoConverter(factory, context); + } + + @Test(expected = IllegalArgumentException.class) + public void rejectsNullWriter() { + new MappingMongoConverter(null, context); + } + + @Test(expected = IllegalArgumentException.class) + public void rejectsNullContext() { + new MappingMongoConverter(factory, null); + } + + @Test + public void convertsCollectionUponAccess() { + + when(accessor.getBindableValue(0)).thenReturn(Arrays.asList("Foo")); + + ConvertingParameterAccessor parameterAccessor = new ConvertingParameterAccessor(converter, accessor); + Object result = parameterAccessor.getBindableValue(0); + + BasicDBList reference = new BasicDBList(); + reference.add("Foo"); + + assertThat(result, is((Object) reference)); + } +}