diff --git a/spring-data-mongodb-cross-store/pom.xml b/spring-data-mongodb-cross-store/pom.xml
index 901c60de6..384fcd12d 100644
--- a/spring-data-mongodb-cross-store/pom.xml
+++ b/spring-data-mongodb-cross-store/pom.xml
@@ -68,24 +68,6 @@
log4j
log4j
-
-
- javax.mail
- mail
-
-
- javax.jms
- jms
-
-
- com.sun.jdmk
- jmxtools
-
-
- com.sun.jmx
- jmxri
-
-
runtime
@@ -95,17 +77,6 @@
true
-
- org.mockito
- mockito-all
- test
-
-
-
- junit
- junit
-
-
org.aspectj
aspectjrt
diff --git a/spring-data-mongodb-log4j/pom.xml b/spring-data-mongodb-log4j/pom.xml
index dc07dc40d..e04deca56 100644
--- a/spring-data-mongodb-log4j/pom.xml
+++ b/spring-data-mongodb-log4j/pom.xml
@@ -27,47 +27,9 @@
log4j
log4j
-
-
- javax.mail
- mail
-
-
- javax.jms
- jms
-
-
- com.sun.jdmk
- jmxtools
-
-
- com.sun.jmx
- jmxri
-
-
compile
-
-
- org.mockito
- mockito-all
- test
-
-
-
- org.hamcrest
- hamcrest-all
- 1.1
- test
-
-
-
- junit
- junit
- test
-
-
diff --git a/spring-data-mongodb-parent/pom.xml b/spring-data-mongodb-parent/pom.xml
index 9744c12e5..fa074ce75 100644
--- a/spring-data-mongodb-parent/pom.xml
+++ b/spring-data-mongodb-parent/pom.xml
@@ -11,9 +11,10 @@
UTF-8
- 4.8.1
+ 4.10
1.2.15
1.8.4
+ 1.2.1
1.5.10
1.6.1
3.0.7.RELEASE
@@ -289,14 +290,14 @@
org.mockito
- mockito-all
+ mockito-core
${org.mockito.version}
test
junit
- junit
+ junit-dep
${junit.version}
test
@@ -304,19 +305,34 @@
-
+
+
log4j
log4j
${log4j.version}
test
+
+
+ org.hamcrest
+ hamcrest-library
+ ${hamcrest.version}
+ test
+
+
+
+ org.mockito
+ mockito-core
+ test
+
+
+
+ junit
+ junit-dep
+ test
+
+
@@ -398,7 +414,7 @@
**/*Tests.java
- junit:junit
+ junit:junit-dep
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index 6d57ffefb..633213632 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -91,25 +91,6 @@
-
- org.mockito
- mockito-all
- test
-
-
-
- org.hamcrest
- hamcrest-all
- 1.1
- test
-
-
-
- junit
- junit
- test
-
-
joda-time
joda-time
@@ -120,8 +101,8 @@
org.slf4j
slf4j-api
- test
+
org.slf4j
jcl-over-slf4j
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/ServerAddressPropertyEditor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/ServerAddressPropertyEditor.java
index 1cddded9c..a38566db4 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/ServerAddressPropertyEditor.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/ServerAddressPropertyEditor.java
@@ -17,7 +17,11 @@ package org.springframework.data.mongodb.config;
import java.beans.PropertyEditorSupport;
import java.net.UnknownHostException;
+import java.util.HashSet;
+import java.util.Set;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.springframework.util.StringUtils;
import com.mongodb.ServerAddress;
@@ -30,6 +34,8 @@ import com.mongodb.ServerAddress;
*/
public class ServerAddressPropertyEditor extends PropertyEditorSupport {
+ private static final Log LOG = LogFactory.getLog(ServerAddressPropertyEditor.class);
+
/*
* (non-Javadoc)
* @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)
@@ -38,21 +44,49 @@ public class ServerAddressPropertyEditor extends PropertyEditorSupport {
public void setAsText(String replicaSetString) {
String[] replicaSetStringArray = StringUtils.commaDelimitedListToStringArray(replicaSetString);
- ServerAddress[] serverAddresses = new ServerAddress[replicaSetStringArray.length];
+ Set serverAddresses = new HashSet(replicaSetStringArray.length);
- for (int i = 0; i < replicaSetStringArray.length; i++) {
+ for (String element : replicaSetStringArray) {
- String[] hostAndPort = StringUtils.delimitedListToStringArray(replicaSetStringArray[i], ":");
+ ServerAddress address = parseServerAddress(element);
- try {
- serverAddresses[i] = new ServerAddress(hostAndPort[0], Integer.parseInt(hostAndPort[1]));
- } catch (NumberFormatException e) {
- throw new IllegalArgumentException("Could not parse port " + hostAndPort[1], e);
- } catch (UnknownHostException e) {
- throw new IllegalArgumentException("Could not parse host " + hostAndPort[0], e);
+ if (address != null) {
+ serverAddresses.add(address);
}
}
- setValue(serverAddresses);
+ if (serverAddresses.isEmpty()) {
+ throw new IllegalArgumentException(
+ "Could not resolve at least one server of the replica set configuration! Validate your config!");
+ }
+
+ setValue(serverAddresses.toArray(new ServerAddress[serverAddresses.size()]));
+ }
+
+ /**
+ * Parses the given source into a {@link ServerAddress}.
+ *
+ * @param source
+ * @return the
+ */
+ private ServerAddress parseServerAddress(String source) {
+
+ String[] hostAndPort = StringUtils.delimitedListToStringArray(source.trim(), ":");
+
+ if (!StringUtils.hasText(source) || hostAndPort.length > 2) {
+ LOG.warn(String.format("Could not parse address source '%s'. Check your replica set configuration!", source));
+ return null;
+ }
+
+ try {
+ return hostAndPort.length == 1 ? new ServerAddress(hostAndPort[0]) : new ServerAddress(hostAndPort[0],
+ Integer.parseInt(hostAndPort[1]));
+ } catch (UnknownHostException e) {
+ LOG.warn(String.format("Could not parse host '%s'. Check your replica set configuration!", hostAndPort[0]));
+ } catch (NumberFormatException e) {
+ LOG.warn(String.format("Could not parse port '%s'. Check your replica set configuration!", hostAndPort[1]));
+ }
+
+ return null;
}
}
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoNamespaceReplicaSetTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoNamespaceReplicaSetTests.java
index 0affa2f55..975812f77 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoNamespaceReplicaSetTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoNamespaceReplicaSetTests.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2010 the original author or authors.
+ * Copyright 2011-2012 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.
@@ -16,6 +16,7 @@
package org.springframework.data.mongodb.config;
+import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.util.List;
@@ -29,6 +30,7 @@ import org.springframework.data.mongodb.core.MongoFactoryBean;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.util.ReflectionTestUtils;
import com.mongodb.CommandResult;
import com.mongodb.Mongo;
@@ -36,47 +38,45 @@ import com.mongodb.ServerAddress;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
-public class MongoNamespaceReplicaSetTests extends NamespaceTestSupport {
+public class MongoNamespaceReplicaSetTests {
@Autowired
private ApplicationContext ctx;
@Test
+ @SuppressWarnings("unchecked")
public void testParsingMongoWithReplicaSets() throws Exception {
+
assertTrue(ctx.containsBean("replicaSetMongo"));
MongoFactoryBean mfb = (MongoFactoryBean) ctx.getBean("&replicaSetMongo");
- List replicaSetSeeds = readField("replicaSetSeeds", mfb);
- assertNotNull(replicaSetSeeds);
-
- assertEquals("127.0.0.1", replicaSetSeeds.get(0).getHost());
- assertEquals(10001, replicaSetSeeds.get(0).getPort());
-
- assertEquals("localhost", replicaSetSeeds.get(1).getHost());
- assertEquals(10002, replicaSetSeeds.get(1).getPort());
+ List replicaSetSeeds = (List) ReflectionTestUtils.getField(mfb, "replicaSetSeeds");
+ assertThat(replicaSetSeeds, is(notNullValue()));
+ assertThat(replicaSetSeeds, hasItems(new ServerAddress("127.0.0.1", 10001), new ServerAddress("localhost", 10002)));
}
@Test
+ @SuppressWarnings("unchecked")
public void testParsingWithPropertyPlaceHolder() throws Exception {
+
assertTrue(ctx.containsBean("manyReplicaSetMongo"));
MongoFactoryBean mfb = (MongoFactoryBean) ctx.getBean("&manyReplicaSetMongo");
- List replicaSetSeeds = readField("replicaSetSeeds", mfb);
- assertNotNull(replicaSetSeeds);
-
- assertEquals("192.168.174.130", replicaSetSeeds.get(0).getHost());
- assertEquals(27017, replicaSetSeeds.get(0).getPort());
- assertEquals("192.168.174.130", replicaSetSeeds.get(1).getHost());
- assertEquals(27018, replicaSetSeeds.get(1).getPort());
- assertEquals("192.168.174.130", replicaSetSeeds.get(2).getHost());
- assertEquals(27019, replicaSetSeeds.get(2).getPort());
+ List replicaSetSeeds = (List) ReflectionTestUtils.getField(mfb, "replicaSetSeeds");
+ assertThat(replicaSetSeeds, is(notNullValue()));
+ assertThat(replicaSetSeeds, hasSize(3));
+ assertThat(
+ replicaSetSeeds,
+ hasItems(new ServerAddress("192.168.174.130", 27017), new ServerAddress("192.168.174.130", 27018),
+ new ServerAddress("192.168.174.130", 27019)));
}
@Test
@Ignore("CI infrastructure does not yet support replica sets")
public void testMongoWithReplicaSets() {
+
Mongo mongo = ctx.getBean(Mongo.class);
assertEquals(2, mongo.getAllAddress().size());
List servers = mongo.getAllAddress();
@@ -88,6 +88,5 @@ public class MongoNamespaceReplicaSetTests extends NamespaceTestSupport {
MongoTemplate template = new MongoTemplate(mongo, "admin");
CommandResult result = template.executeCommand("{replSetGetStatus : 1}");
assertEquals("blort", result.getString("set"));
-
}
}
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/NamespaceTestSupport.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/NamespaceTestSupport.java
deleted file mode 100644
index bc5faf1fd..000000000
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/NamespaceTestSupport.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.config;
-
-import java.lang.reflect.Field;
-
-public class NamespaceTestSupport {
-
- @SuppressWarnings({ "unchecked" })
- public static T readField(String name, Object target) throws Exception {
- Field field = null;
- Class> clazz = target.getClass();
- do {
- try {
- field = clazz.getDeclaredField(name);
- } catch (Exception ex) {
- }
-
- clazz = clazz.getSuperclass();
- } while (field == null && !clazz.equals(Object.class));
-
- if (field == null)
- throw new IllegalArgumentException("Cannot find field '" + name + "' in the class hierarchy of "
- + target.getClass());
- field.setAccessible(true);
- return (T) field.get(target);
- }
-}
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/ServerAddressPropertyEditorUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/ServerAddressPropertyEditorUnitTests.java
new file mode 100644
index 000000000..3271b1da1
--- /dev/null
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/ServerAddressPropertyEditorUnitTests.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 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.config;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.mongodb.ServerAddress;
+
+/**
+ * Unit tests for {@link ServerAddressPropertyEditor}.
+ *
+ * @author Oliver Gierke
+ */
+public class ServerAddressPropertyEditorUnitTests {
+
+ ServerAddressPropertyEditor editor;
+
+ @Before
+ public void setUp() {
+ editor = new ServerAddressPropertyEditor();
+ }
+
+ /**
+ * @see DATAMONGO-454
+ */
+ @Test(expected = IllegalArgumentException.class)
+ public void rejectsAddressConfigWithoutASingleParsableServerAddress() {
+
+ editor.setAsText("foo, bar");
+ }
+
+ /**
+ * @see DATAMONGO-454
+ */
+ @Test
+ public void skipsUnparsableAddressIfAtLeastOneIsParsable() throws UnknownHostException {
+
+ editor.setAsText("foo, localhost");
+ assertSingleAddressOfLocalhost(editor.getValue());
+ }
+
+ /**
+ * @see DATAMONGO-454
+ */
+ @Test
+ public void handlesEmptyAddressAsParseError() throws UnknownHostException {
+
+ editor.setAsText(", localhost");
+ assertSingleAddressOfLocalhost(editor.getValue());
+ }
+
+ private static void assertSingleAddressOfLocalhost(Object result) throws UnknownHostException {
+
+ assertThat(result, is(instanceOf(ServerAddress[].class)));
+ Collection addresses = Arrays.asList((ServerAddress[]) result);
+ assertThat(addresses, hasSize(1));
+ assertThat(addresses, hasItem(new ServerAddress("localhost")));
+ }
+}
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 4f4d13f7f..dad91857f 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
@@ -907,8 +907,6 @@ public class MongoTemplateTests {
assertThat(lastMongoAction.getEntityClass().toString(), is(PersonWithIdPropertyOfTypeObjectId.class.toString()));
assertThat(lastMongoAction.getMongoActionOperation(), is(MongoActionOperation.UPDATE));
assertThat(lastMongoAction.getQuery(), equalTo(q.getQueryObject()));
- assertThat(lastMongoAction.getDocument(), equalTo(u.getUpdateObject()));
-
}
private class FsyncSafeWriteConcernResolver implements WriteConcernResolver {
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java
index 7591dc464..451b4d12e 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java
@@ -115,7 +115,7 @@ public class MappingMongoConverterUnitTests {
DBObject dbObject = new BasicDBObject();
converter.write(person, dbObject);
- assertThat(dbObject.get("birthDate"), is(Date.class));
+ assertThat(dbObject.get("birthDate"), is(instanceOf(Date.class)));
Person result = converter.read(Person.class, dbObject);
assertThat(result.birthDate, is(notNullValue()));
@@ -176,7 +176,7 @@ public class MappingMongoConverterUnitTests {
dbObject.put("birthDate", new LocalDate());
dbObject.put(DefaultMongoTypeMapper.DEFAULT_TYPE_KEY, Person.class.getName());
- assertThat(converter.read(Contact.class, dbObject), is(Person.class));
+ assertThat(converter.read(Contact.class, dbObject), is(instanceOf(Person.class)));
}
/**
@@ -189,7 +189,7 @@ public class MappingMongoConverterUnitTests {
dbObject.put("birthDate", new LocalDate());
dbObject.put(DefaultMongoTypeMapper.DEFAULT_TYPE_KEY, Person.class.getName());
- assertThat(converter.read(BirthDateContainer.class, dbObject), is(BirthDateContainer.class));
+ assertThat(converter.read(BirthDateContainer.class, dbObject), is(instanceOf(BirthDateContainer.class)));
}
@Test
@@ -217,7 +217,7 @@ public class MappingMongoConverterUnitTests {
DBObject result = new BasicDBObject();
converter.write(value, result);
- assertThat(result.get("sampleEnum"), is(String.class));
+ assertThat(result.get("sampleEnum"), is(instanceOf(String.class)));
assertThat(result.get("sampleEnum").toString(), is("FIRST"));
}
@@ -233,7 +233,7 @@ public class MappingMongoConverterUnitTests {
DBObject result = new BasicDBObject();
converter.write(value, result);
- assertThat(result.get("enums"), is(BasicDBList.class));
+ assertThat(result.get("enums"), is(instanceOf(BasicDBList.class)));
BasicDBList enums = (BasicDBList) result.get("enums");
assertThat(enums.size(), is(1));
@@ -263,7 +263,7 @@ public class MappingMongoConverterUnitTests {
ClassWithEnumProperty result = converter.read(ClassWithEnumProperty.class, dbObject);
- assertThat(result.enums, is(List.class));
+ assertThat(result.enums, is(instanceOf(List.class)));
assertThat(result.enums.size(), is(1));
assertThat(result.enums, hasItem(SampleEnum.FIRST));
}
@@ -328,7 +328,7 @@ public class MappingMongoConverterUnitTests {
converter.write(wrapper, dbObject);
Object result = dbObject.get("contacts");
- assertThat(result, is(BasicDBList.class));
+ assertThat(result, is(instanceOf(BasicDBList.class)));
BasicDBList contacts = (BasicDBList) result;
DBObject personDbObject = (DBObject) contacts.get(0);
assertThat(personDbObject.get("foo").toString(), is("Oliver"));
@@ -351,7 +351,7 @@ public class MappingMongoConverterUnitTests {
assertThat(result.contacts, is(notNullValue()));
assertThat(result.contacts.size(), is(1));
Contact contact = result.contacts.get(0);
- assertThat(contact, is(Person.class));
+ assertThat(contact, is(instanceOf(Person.class)));
assertThat(((Person) contact).firstname, is("Oliver"));
}
@@ -365,7 +365,7 @@ public class MappingMongoConverterUnitTests {
converter.write(wrapper, dbObject);
Object localeField = dbObject.get("locale");
- assertThat(localeField, is(String.class));
+ assertThat(localeField, is(instanceOf(String.class)));
assertThat((String) localeField, is("en_US"));
LocaleWrapper read = converter.read(LocaleWrapper.class, dbObject);
@@ -473,13 +473,13 @@ public class MappingMongoConverterUnitTests {
DBObject dbo1 = new BasicDBObject();
converter.write(p1, dbo1);
- assertThat(dbo1.get("_id"), is(String.class));
+ assertThat(dbo1.get("_id"), is(instanceOf(String.class)));
PersonPojoStringId p2 = new PersonPojoStringId(new ObjectId().toString(), "Text-1");
DBObject dbo2 = new BasicDBObject();
converter.write(p2, dbo2);
- assertThat(dbo2.get("_id"), is(ObjectId.class));
+ assertThat(dbo2.get("_id"), is(instanceOf(ObjectId.class)));
}
/**
@@ -493,8 +493,8 @@ public class MappingMongoConverterUnitTests {
ClassWithSortedMap result = converter.read(ClassWithSortedMap.class, wrapper);
- assertThat(result, is(ClassWithSortedMap.class));
- assertThat(result.map, is(SortedMap.class));
+ assertThat(result, is(instanceOf(ClassWithSortedMap.class)));
+ assertThat(result.map, is(instanceOf(SortedMap.class)));
}
/**
@@ -760,7 +760,7 @@ public class MappingMongoConverterUnitTests {
assertThat(result.containsField("Foo"), is(true));
assertThat(result.get("Foo"), is(notNullValue()));
- assertThat(result.get("Foo"), is(BasicDBList.class));
+ assertThat(result.get("Foo"), is(instanceOf(BasicDBList.class)));
BasicDBList list = (BasicDBList) result.get("Foo");
@@ -811,11 +811,11 @@ public class MappingMongoConverterUnitTests {
converter.write(wrapper, result);
Object mapObject = result.get("mapOfObjects");
- assertThat(mapObject, is(BasicDBObject.class));
+ assertThat(mapObject, is(instanceOf(BasicDBObject.class)));
DBObject map = (DBObject) mapObject;
Object valueObject = map.get("foo");
- assertThat(valueObject, is(BasicDBList.class));
+ assertThat(valueObject, is(instanceOf(BasicDBList.class)));
List