From 9d5f8f3ba01b87c90a843ee5d693246996822606 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 17 Feb 2014 12:42:19 +0100 Subject: [PATCH] DATAMONGO-848 - Added tweaks to be compatible with Java driver 2.12. Added build profile to be able to build against next Mongo Java driver version (2.12.0-rc0) currently. Tweaked Bundlor version replacements to allow binding non-OSGi compatible Mongo driver versions. Exception translator now handles newly introduced MongoServerSelectionException which the driver throws to indicate it can't connect to a MongoDB instance as of driver version 2.12. GridFsTemplate now uses an empty query object instead of null to indicate that no query should be used. Adapted test cases to be able to deal with the slightly changed representation of serverUsed in command results (2.12 removed leading slash). --- pom.xml | 11 +++ spring-data-mongodb-cross-store/template.mf | 2 +- spring-data-mongodb-log4j/template.mf | 2 +- spring-data-mongodb/pom.xml | 2 +- .../core/MongoExceptionTranslator.java | 5 ++ .../data/mongodb/gridfs/GridFsTemplate.java | 2 +- .../MongoDbFactoryNoDatabaseRunningTests.java | 21 +++--- .../core/aggregation/AggregationTests.java | 6 +- .../mongodb/core/mapreduce/GroupByTests.java | 75 +++++++++++-------- spring-data-mongodb/template.mf | 2 +- 10 files changed, 77 insertions(+), 51 deletions(-) diff --git a/pom.xml b/pom.xml index 88f3dade9..442fe9148 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,7 @@ spring-data-mongodb 1.7.0.RC1 2.11.4 + ${mongo} @@ -102,6 +103,16 @@ + + + mongo-next + + 2.12.0-rc0 + 2.12.0 + + + + diff --git a/spring-data-mongodb-cross-store/template.mf b/spring-data-mongodb-cross-store/template.mf index 25a004b3a..b60ecf1fb 100644 --- a/spring-data-mongodb-cross-store/template.mf +++ b/spring-data-mongodb-cross-store/template.mf @@ -7,7 +7,7 @@ Import-Package: Export-Template: org.springframework.data.mongodb.crossstore.*;version="${project.version}" Import-Template: - com.mongodb.*;version="0", + com.mongodb.*;version="${mongo-osgi:[=.=.=,+1.0.0)}", javax.persistence.*;version="${jpa:[=.=.=,+1.0.0)}", org.aspectj.*;version="${aspectj:[1.0.0, 2.0.0)}", org.bson.*;version="0", diff --git a/spring-data-mongodb-log4j/template.mf b/spring-data-mongodb-log4j/template.mf index 00c0d3339..bee95d777 100644 --- a/spring-data-mongodb-log4j/template.mf +++ b/spring-data-mongodb-log4j/template.mf @@ -5,5 +5,5 @@ Bundle-ManifestVersion: 2 Import-Package: sun.reflect;version="0";resolution:=optional Import-Template: - com.mongodb.*;version="${mongo:[=.=,+1.0.0)}", + com.mongodb.*;version="${mongo-osgi:[=.=.=,+1.0.0)}", org.apache.log4j.*;version="${log4j:[=.=.=,+1.0.0)}" diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 8a93f7297..e7a4cb769 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -145,7 +145,7 @@ com.mysema.maven apt-maven-plugin - 1.0.8 + ${apt} com.mysema.querydsl diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoExceptionTranslator.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoExceptionTranslator.java index 674a2e1a9..9b591b56e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoExceptionTranslator.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoExceptionTranslator.java @@ -60,6 +60,11 @@ public class MongoExceptionTranslator implements PersistenceExceptionTranslator return new DataAccessResourceFailureException(ex.getMessage(), ex); } + // Driver 2.12 throws this to indicate connection problems. String comparison to avoid hard dependency + if (ex.getClass().getName().equals("com.mongodb.MongoServerSelectionException")) { + return new DataAccessResourceFailureException(ex.getMessage(), ex); + } + if (ex instanceof MongoInternalException) { return new InvalidDataAccessResourceUsageException(ex.getMessage(), ex); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsTemplate.java index dee25a529..89a931ed7 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsTemplate.java @@ -232,7 +232,7 @@ public class GridFsTemplate implements GridFsOperations, ResourcePatternResolver } private DBObject getMappedQuery(Query query) { - return query == null ? null : getMappedQuery(query.getQueryObject()); + return query == null ? new Query().getQueryObject() : getMappedQuery(query.getQueryObject()); } private DBObject getMappedQuery(DBObject query) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoDbFactoryNoDatabaseRunningTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoDbFactoryNoDatabaseRunningTests.java index 4e53cc0af..6e0972c5d 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoDbFactoryNoDatabaseRunningTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoDbFactoryNoDatabaseRunningTests.java @@ -1,11 +1,11 @@ /* - * Copyright (c) 2011 by the original author(s). + * Copyright 2011-2014 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 + * 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, @@ -15,33 +15,32 @@ */ package org.springframework.data.mongodb.config; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; import org.junit.Test; import org.junit.runner.RunWith; - -import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessResourceFailureException; +import org.springframework.data.mongodb.MongoDbFactory; +import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * Integration tests for {@link MongoDbFactory}. * - * @author Thomas Risbergf + * @author Thomas Risberg + * @author Oliver Gierke */ - @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class MongoDbFactoryNoDatabaseRunningTests { - @Autowired - MongoTemplate mongoTemplate; + @Autowired MongoTemplate mongoTemplate; /** - * @see DATADOC-139 + * @see DATAMONGO-139 */ @Test public void startsUpWithoutADatabaseRunning() { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java index be3672c25..6361985b7 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java @@ -189,7 +189,7 @@ public class AggregationTests { AggregationResults results = mongoTemplate.aggregate(agg, INPUT_COLLECTION, TagCount.class); assertThat(results, is(notNullValue())); - assertThat(results.getServerUsed(), is("/127.0.0.1:27017")); + assertThat(results.getServerUsed(), endsWith("127.0.0.1:27017")); List tagCount = results.getMappedResults(); @@ -217,7 +217,7 @@ public class AggregationTests { AggregationResults results = mongoTemplate.aggregate(aggregation, INPUT_COLLECTION, TagCount.class); assertThat(results, is(notNullValue())); - assertThat(results.getServerUsed(), is("/127.0.0.1:27017")); + assertThat(results.getServerUsed(), endsWith("127.0.0.1:27017")); List tagCount = results.getMappedResults(); @@ -241,7 +241,7 @@ public class AggregationTests { AggregationResults results = mongoTemplate.aggregate(aggregation, INPUT_COLLECTION, TagCount.class); assertThat(results, is(notNullValue())); - assertThat(results.getServerUsed(), is("/127.0.0.1:27017")); + assertThat(results.getServerUsed(), endsWith("127.0.0.1:27017")); List tagCount = results.getMappedResults(); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapreduce/GroupByTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapreduce/GroupByTests.java index 5c4ece731..2ffa472b0 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapreduce/GroupByTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapreduce/GroupByTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2012 the original author or authors. + * Copyright 2011-2014 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. @@ -15,6 +15,8 @@ */ package org.springframework.data.mongodb.core.mapreduce; +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; import static org.springframework.data.mongodb.core.mapreduce.GroupBy.*; import static org.springframework.data.mongodb.core.query.Criteria.*; @@ -42,6 +44,12 @@ import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mongodb.Mongo; +/** + * Integration tests for group-by operations. + * + * @author Mark Pollack + * @author Oliver Gierke + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:infrastructure.xml") public class GroupByTests { @@ -84,49 +92,46 @@ public class GroupByTests { @Test public void singleKeyCreation() { + DBObject gc = new GroupBy("a").getGroupByObject(); - // String expected = - // "{ \"group\" : { \"ns\" : \"test\" , \"key\" : { \"a\" : 1} , \"cond\" : null , \"$reduce\" : null , \"initial\" : null }}"; - String expected = "{ \"key\" : { \"a\" : 1} , \"$reduce\" : null , \"initial\" : null }"; - Assert.assertEquals(expected, gc.toString()); + + assertThat(gc.toString(), is("{ \"key\" : { \"a\" : 1} , \"$reduce\" : null , \"initial\" : null }")); } @Test public void multipleKeyCreation() { + DBObject gc = GroupBy.key("a", "b").getGroupByObject(); - // String expected = - // "{ \"group\" : { \"ns\" : \"test\" , \"key\" : { \"a\" : 1 , \"b\" : 1} , \"cond\" : null , \"$reduce\" : null , \"initial\" : null }}"; - String expected = "{ \"key\" : { \"a\" : 1 , \"b\" : 1} , \"$reduce\" : null , \"initial\" : null }"; - Assert.assertEquals(expected, gc.toString()); + + assertThat(gc.toString(), is("{ \"key\" : { \"a\" : 1 , \"b\" : 1} , \"$reduce\" : null , \"initial\" : null }")); } @Test public void keyFunctionCreation() { + DBObject gc = GroupBy.keyFunction("classpath:keyFunction.js").getGroupByObject(); - String expected = "{ \"$keyf\" : \"classpath:keyFunction.js\" , \"$reduce\" : null , \"initial\" : null }"; - Assert.assertEquals(expected, gc.toString()); + + assertThat(gc.toString(), + is("{ \"$keyf\" : \"classpath:keyFunction.js\" , \"$reduce\" : null , \"initial\" : null }")); } @Test public void SimpleGroup() { - createGroupByData(); - GroupByResults results; - results = mongoTemplate.group( + createGroupByData(); + GroupByResults results = mongoTemplate.group( "group_test_collection", GroupBy.key("x").initialDocument(new BasicDBObject("count", 0)) .reduceFunction("function(doc, prev) { prev.count += 1 }"), XObject.class); assertMapReduceResults(results); - } @Test public void SimpleGroupWithKeyFunction() { - createGroupByData(); - GroupByResults results; - results = mongoTemplate.group( + createGroupByData(); + GroupByResults results = mongoTemplate.group( "group_test_collection", GroupBy.keyFunction("function(doc) { return { x : doc.x }; }").initialDocument("{ count: 0 }") .reduceFunction("function(doc, prev) { prev.count += 1 }"), XObject.class); @@ -136,30 +141,35 @@ public class GroupByTests { @Test public void SimpleGroupWithFunctionsAsResources() { - createGroupByData(); - GroupByResults results; - results = mongoTemplate.group("group_test_collection", GroupBy.keyFunction("classpath:keyFunction.js") - .initialDocument("{ count: 0 }").reduceFunction("classpath:groupReduce.js"), XObject.class); + createGroupByData(); + GroupByResults results = mongoTemplate.group( + "group_test_collection", + GroupBy.keyFunction("classpath:keyFunction.js").initialDocument("{ count: 0 }") + .reduceFunction("classpath:groupReduce.js"), XObject.class); assertMapReduceResults(results); } @Test public void SimpleGroupWithQueryAndFunctionsAsResources() { - createGroupByData(); - GroupByResults results; - results = mongoTemplate.group(where("x").gt(0), "group_test_collection", keyFunction("classpath:keyFunction.js") - .initialDocument("{ count: 0 }").reduceFunction("classpath:groupReduce.js"), XObject.class); + createGroupByData(); + GroupByResults results = mongoTemplate.group( + where("x").gt(0), + "group_test_collection", + keyFunction("classpath:keyFunction.js").initialDocument("{ count: 0 }").reduceFunction( + "classpath:groupReduce.js"), XObject.class); assertMapReduceResults(results); } private void assertMapReduceResults(GroupByResults results) { + DBObject dboRawResults = results.getRawResults(); - String expected = "{ \"serverUsed\" : \"/127.0.0.1:27017\" , \"retval\" : [ { \"x\" : 1.0 , \"count\" : 2.0} , { \"x\" : 2.0 , \"count\" : 1.0} , { \"x\" : 3.0 , \"count\" : 3.0}] , \"count\" : 6.0 , \"keys\" : 3 , \"ok\" : 1.0}"; - Assert.assertEquals(expected, dboRawResults.toString()); + + assertThat(dboRawResults.containsField("serverUsed"), is(true)); + assertThat(dboRawResults.get("serverUsed").toString(), endsWith("127.0.0.1:27017")); int numResults = 0; for (XObject xObject : results) { @@ -174,13 +184,15 @@ public class GroupByTests { } numResults++; } - Assert.assertEquals(3, numResults); - Assert.assertEquals(6, results.getCount(), 0.001); - Assert.assertEquals(3, results.getKeys()); + assertThat(numResults, is(3)); + assertThat(results.getKeys(), is(3)); + assertEquals(6, results.getCount(), 0.001); } private void createGroupByData() { + DBCollection c = mongoTemplate.getDb().getCollection("group_test_collection"); + c.save(new BasicDBObject("x", 1)); c.save(new BasicDBObject("x", 1)); c.save(new BasicDBObject("x", 2)); @@ -188,5 +200,4 @@ public class GroupByTests { c.save(new BasicDBObject("x", 3)); c.save(new BasicDBObject("x", 3)); } - } diff --git a/spring-data-mongodb/template.mf b/spring-data-mongodb/template.mf index 5893f2718..ace44eab8 100644 --- a/spring-data-mongodb/template.mf +++ b/spring-data-mongodb/template.mf @@ -8,7 +8,7 @@ Export-Template: org.springframework.data.mongodb.*;version="${project.version}" Import-Template: com.google.common.base.*;version="[11.0.0,14.0.0)";resolution:=optional, - com.mongodb.*;version="0", + com.mongodb.*;version="${mongo-osgi:[=.=.=,+1.0.0)}", com.mysema.query.*;version="[2.1.1, 3.0.0)";resolution:=optional, javax.annotation.processing.*;version="0", javax.enterprise.*;version="${cdi:[=.=.=,+1.0.0)}";resolution:=optional,