Skip to content

Commit 2461575

Browse files
christophstroblodrotbohm
authored andcommitted
DATAMONGO-1176 - Switch to Document API.
We use the Document API when interacting with the MongoDB Java Driver. This allows us to make use of new features and enables us to use the Codec API and prepares the project for future enhancements concerning the drivers the reactive API.
1 parent 4371760 commit 2461575

File tree

213 files changed

+4323
-3688
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

213 files changed

+4323
-3688
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
<project.type>multi</project.type>
3030
<dist.id>spring-data-mongodb</dist.id>
3131
<springdata.commons>2.0.0.BUILD-SNAPSHOT</springdata.commons>
32-
<mongo>2.14.0</mongo>
32+
<mongo>3.2.2</mongo>
3333
</properties>
3434

3535
<developers>

spring-data-mongodb-cross-store/src/main/java/org/springframework/data/mongodb/crossstore/MongoChangeSetPersister.java

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import javax.persistence.EntityManagerFactory;
1919

20+
import org.bson.Document;
2021
import org.slf4j.Logger;
2122
import org.slf4j.LoggerFactory;
2223
import org.springframework.dao.DataAccessException;
@@ -29,10 +30,10 @@
2930
import org.springframework.data.mongodb.core.MongoTemplate;
3031
import org.springframework.util.ClassUtils;
3132

32-
import com.mongodb.BasicDBObject;
33-
import com.mongodb.DBCollection;
34-
import com.mongodb.DBObject;
3533
import com.mongodb.MongoException;
34+
import com.mongodb.client.MongoCollection;
35+
import com.mongodb.client.model.Filters;
36+
import com.mongodb.client.result.DeleteResult;
3637

3738
/**
3839
* @author Thomas Risberg
@@ -74,15 +75,15 @@ public void getPersistentState(Class<? extends ChangeSetBacked> entityClass, Obj
7475

7576
String collName = getCollectionNameForEntity(entityClass);
7677

77-
final DBObject dbk = new BasicDBObject();
78+
final Document dbk = new Document();
7879
dbk.put(ENTITY_ID, id);
7980
dbk.put(ENTITY_CLASS, entityClass.getName());
8081
if (log.isDebugEnabled()) {
8182
log.debug("Loading MongoDB data for {}", dbk);
8283
}
8384
mongoTemplate.execute(collName, new CollectionCallback<Object>() {
84-
public Object doInCollection(DBCollection collection) throws MongoException, DataAccessException {
85-
for (DBObject dbo : collection.find(dbk)) {
85+
public Object doInCollection(MongoCollection<Document> collection) throws MongoException, DataAccessException {
86+
for (Document dbo : collection.find(dbk)) {
8687
String key = (String) dbo.get(ENTITY_FIELD_NAME);
8788
if (log.isDebugEnabled()) {
8889
log.debug("Processing key: {}", key);
@@ -143,27 +144,31 @@ public Object persistState(ChangeSetBacked entity, ChangeSet cs) throws DataAcce
143144
for (String key : cs.getValues().keySet()) {
144145
if (key != null && !key.startsWith("_") && !key.equals(ChangeSetPersister.ID_KEY)) {
145146
Object value = cs.getValues().get(key);
146-
final DBObject dbQuery = new BasicDBObject();
147+
final Document dbQuery = new Document();
147148
dbQuery.put(ENTITY_ID, getPersistentId(entity, cs));
148149
dbQuery.put(ENTITY_CLASS, entity.getClass().getName());
149150
dbQuery.put(ENTITY_FIELD_NAME, key);
150-
DBObject dbId = mongoTemplate.execute(collName, new CollectionCallback<DBObject>() {
151-
public DBObject doInCollection(DBCollection collection) throws MongoException, DataAccessException {
152-
return collection.findOne(dbQuery);
151+
final Document dbId = mongoTemplate.execute(collName, new CollectionCallback<Document>() {
152+
public Document doInCollection(MongoCollection<Document> collection)
153+
throws MongoException, DataAccessException {
154+
Document id = collection.find(dbQuery).first();
155+
return id;
153156
}
154157
});
158+
155159
if (value == null) {
156160
if (log.isDebugEnabled()) {
157161
log.debug("Flush: removing: {}", dbQuery);
158162
}
159163
mongoTemplate.execute(collName, new CollectionCallback<Object>() {
160-
public Object doInCollection(DBCollection collection) throws MongoException, DataAccessException {
161-
collection.remove(dbQuery);
164+
public Object doInCollection(MongoCollection<Document> collection)
165+
throws MongoException, DataAccessException {
166+
DeleteResult dr = collection.deleteMany(dbQuery);
162167
return null;
163168
}
164169
});
165170
} else {
166-
final DBObject dbDoc = new BasicDBObject();
171+
final Document dbDoc = new Document();
167172
dbDoc.putAll(dbQuery);
168173
if (log.isDebugEnabled()) {
169174
log.debug("Flush: saving: {}", dbQuery);
@@ -174,8 +179,18 @@ public Object doInCollection(DBCollection collection) throws MongoException, Dat
174179
dbDoc.put("_id", dbId.get("_id"));
175180
}
176181
mongoTemplate.execute(collName, new CollectionCallback<Object>() {
177-
public Object doInCollection(DBCollection collection) throws MongoException, DataAccessException {
178-
collection.save(dbDoc);
182+
public Object doInCollection(MongoCollection<Document> collection)
183+
throws MongoException, DataAccessException {
184+
185+
if (dbId != null) {
186+
collection.replaceOne(Filters.eq("_id", dbId.get("_id")), dbDoc);
187+
} else {
188+
189+
if (dbDoc.containsKey("_id") && dbDoc.get("_id") == null) {
190+
dbDoc.remove("_id");
191+
}
192+
collection.insertOne(dbDoc);
193+
}
179194
return null;
180195
}
181196
});

spring-data-mongodb-cross-store/src/test/java/org/springframework/data/mongodb/crossstore/CrossStoreMongoTests.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import javax.persistence.EntityManager;
1919
import javax.persistence.PersistenceContext;
2020

21+
import org.bson.Document;
2122
import org.junit.After;
2223
import org.junit.Assert;
2324
import org.junit.Before;
@@ -36,8 +37,6 @@
3637
import org.springframework.transaction.support.TransactionCallback;
3738
import org.springframework.transaction.support.TransactionTemplate;
3839

39-
import com.mongodb.DBObject;
40-
4140
/**
4241
* Integration tests for MongoDB cross-store persistence (mainly {@link MongoChangeSetPersister}).
4342
*
@@ -48,14 +47,11 @@
4847
@ContextConfiguration("classpath:/META-INF/spring/applicationContext.xml")
4948
public class CrossStoreMongoTests {
5049

51-
@Autowired
52-
MongoTemplate mongoTemplate;
50+
@Autowired MongoTemplate mongoTemplate;
5351

54-
@PersistenceContext
55-
EntityManager entityManager;
52+
@PersistenceContext EntityManager entityManager;
5653

57-
@Autowired
58-
PlatformTransactionManager transactionManager;
54+
@Autowired PlatformTransactionManager transactionManager;
5955
TransactionTemplate txTemplate;
6056

6157
@Before
@@ -187,7 +183,7 @@ public Person doInTransaction(TransactionStatus status) {
187183

188184
boolean weFound3 = false;
189185

190-
for (DBObject dbo : this.mongoTemplate.getCollection(mongoTemplate.getCollectionName(Person.class)).find()) {
186+
for (Document dbo : this.mongoTemplate.getCollection(mongoTemplate.getCollectionName(Person.class)).find()) {
191187
Assert.assertTrue(!dbo.get("_entity_id").equals(2L));
192188
if (dbo.get("_entity_id").equals(3L)) {
193189
weFound3 = true;

spring-data-mongodb-cross-store/src/test/resources/META-INF/spring/applicationContext.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<mongo:mapping-converter/>
2121

2222
<!-- Mongo config -->
23-
<bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
23+
<bean id="mongo" class="org.springframework.data.mongodb.core.MongoClientFactoryBean">
2424
<property name="host" value="localhost"/>
2525
<property name="port" value="27017"/>
2626
</bean>

spring-data-mongodb/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<properties>
1919
<objenesis>1.3</objenesis>
2020
<equalsverifier>1.5</equalsverifier>
21+
<mongo>3.2.2</mongo>
2122
</properties>
2223

2324
<dependencies>

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/MongoDbFactory.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.springframework.data.mongodb.core.MongoExceptionTranslator;
2121

2222
import com.mongodb.DB;
23+
import com.mongodb.client.MongoDatabase;
2324

2425
/**
2526
* Interface for factories creating {@link DB} instances.
@@ -35,7 +36,7 @@ public interface MongoDbFactory {
3536
* @return
3637
* @throws DataAccessException
3738
*/
38-
DB getDb() throws DataAccessException;
39+
MongoDatabase getDb() throws DataAccessException;
3940

4041
/**
4142
* Creates a {@link DB} instance to access the database with the given name.
@@ -44,12 +45,14 @@ public interface MongoDbFactory {
4445
* @return
4546
* @throws DataAccessException
4647
*/
47-
DB getDb(String dbName) throws DataAccessException;
48+
MongoDatabase getDb(String dbName) throws DataAccessException;
4849

4950
/**
5051
* Exposes a shared {@link MongoExceptionTranslator}.
5152
*
5253
* @return will never be {@literal null}.
5354
*/
5455
PersistenceExceptionTranslator getExceptionTranslator();
56+
57+
DB getLegacyDb();
5558
}

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoDbFactoryParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import org.springframework.beans.factory.xml.ParserContext;
3333
import org.springframework.data.authentication.UserCredentials;
3434
import org.springframework.data.config.BeanComponentDefinitionBuilder;
35-
import org.springframework.data.mongodb.core.MongoFactoryBean;
35+
import org.springframework.data.mongodb.core.MongoClientFactoryBean;
3636
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
3737
import org.springframework.util.StringUtils;
3838
import org.w3c.dom.Element;
@@ -131,7 +131,7 @@ protected AbstractBeanDefinition parseInternal(Element element, ParserContext pa
131131
*/
132132
private BeanDefinition registerMongoBeanDefinition(Element element, ParserContext parserContext) {
133133

134-
BeanDefinitionBuilder mongoBuilder = BeanDefinitionBuilder.genericBeanDefinition(MongoFactoryBean.class);
134+
BeanDefinitionBuilder mongoBuilder = BeanDefinitionBuilder.genericBeanDefinition(MongoClientFactoryBean.class);
135135
setPropertyValue(mongoBuilder, element, "host");
136136
setPropertyValue(mongoBuilder, element, "port");
137137

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/BulkOperations.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
import org.springframework.data.mongodb.core.query.Update;
2222
import org.springframework.data.util.Pair;
2323

24-
import com.mongodb.BulkWriteResult;
25-
2624
/**
2725
* Bulk operations for insert/update/remove actions on a collection. These bulks operation are available since MongoDB
2826
* 2.6 and make use of low level bulk commands on the protocol level. This interface defines a fluent API to add
@@ -141,5 +139,5 @@ public enum BulkMode {
141139
* @return Result of the bulk operation providing counters for inserts/updates etc.
142140
* @throws {@link BulkOperationException} if an error occurred during bulk processing.
143141
*/
144-
BulkWriteResult execute();
142+
com.mongodb.bulk.BulkWriteResult execute();
145143
}

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CollectionCallback.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@
1515
*/
1616
package org.springframework.data.mongodb.core;
1717

18-
import com.mongodb.DBCollection;
19-
import com.mongodb.MongoException;
18+
import org.bson.Document;
2019
import org.springframework.dao.DataAccessException;
2120

21+
import com.mongodb.MongoException;
22+
import com.mongodb.client.MongoCollection;
23+
2224
public interface CollectionCallback<T> {
2325

24-
T doInCollection(DBCollection collection) throws MongoException, DataAccessException;
26+
T doInCollection(MongoCollection<Document> collection) throws MongoException, DataAccessException;
2527

2628
}

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CursorPreparer.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515
*/
1616
package org.springframework.data.mongodb.core;
1717

18+
import org.bson.Document;
19+
1820
import com.mongodb.DBCursor;
21+
import com.mongodb.client.FindIterable;
1922

2023
/**
2124
* Simple callback interface to allow customization of a {@link DBCursor}.
@@ -29,5 +32,5 @@ interface CursorPreparer {
2932
*
3033
* @param cursor
3134
*/
32-
DBCursor prepare(DBCursor cursor);
35+
FindIterable<Document> prepare(FindIterable<Document> cursor);
3336
}

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DbCallback.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@
1515
*/
1616
package org.springframework.data.mongodb.core;
1717

18-
import com.mongodb.DB;
19-
import com.mongodb.MongoException;
2018
import org.springframework.dao.DataAccessException;
2119

20+
import com.mongodb.MongoException;
21+
import com.mongodb.client.MongoDatabase;
22+
2223
public interface DbCallback<T> {
2324

24-
T doInDB(DB db) throws MongoException, DataAccessException;
25+
T doInDB(MongoDatabase db) throws MongoException, DataAccessException;
2526
}

0 commit comments

Comments
 (0)