DATAMONGO-310 - MappingMongoConverter now creates native Mongo types for Maps and Collections in convertToMongoType(…).

MappingMongoConverter.convertToMongoType(…) not only converts elements of collections and maps but also converts the wrapper into the appropriate MongoDB type (BasicDBList, BasicDBObject).
This commit is contained in:
Oliver Gierke
2011-11-23 13:13:40 +01:00
parent b26bb62a63
commit 4cf3567f42
3 changed files with 94 additions and 26 deletions

View File

@@ -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<Object, Object> m = new HashMap<Object, Object>();
DBObject result = new BasicDBObject();
for (Map.Entry<Object, Object> entry : ((Map<Object, Object>) 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<Object> newList = new ArrayList<Object>();
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;
}

View File

@@ -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;
}

View File

@@ -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));
}
}