diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoCredentialPropertyEditor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoCredentialPropertyEditor.java index 093ca89f8..32fbbdec3 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoCredentialPropertyEditor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoCredentialPropertyEditor.java @@ -17,6 +17,7 @@ package org.springframework.data.mongodb.config; import java.beans.PropertyEditorSupport; import java.io.UnsupportedEncodingException; +import java.lang.reflect.Method; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Arrays; @@ -26,6 +27,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.springframework.lang.Nullable; +import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; import com.mongodb.MongoCredential; @@ -78,12 +80,23 @@ public class MongoCredentialPropertyEditor extends PropertyEditorSupport { verifyUserNamePresent(userNameAndPassword); credentials.add(MongoCredential.createGSSAPICredential(userNameAndPassword[0])); - } else if (MongoCredential.MONGODB_CR_MECHANISM.equals(authMechanism)) { + } else if ("MONGODB-CR".equals(authMechanism)) { verifyUsernameAndPasswordPresent(userNameAndPassword); verifyDatabasePresent(database); - credentials.add(MongoCredential.createMongoCRCredential(userNameAndPassword[0], database, - userNameAndPassword[1].toCharArray())); + + Method createCRCredentialMethod = ReflectionUtils.findMethod(MongoCredential.class, + "createMongoCRCredential", String.class, String.class, char[].class); + + if (createCRCredentialMethod == null) { + throw new IllegalArgumentException("MONGODB-CR is no longer supported."); + } + + MongoCredential credential = MongoCredential.class + .cast(ReflectionUtils.invokeMethod(createCRCredentialMethod, null, userNameAndPassword[0], database, + userNameAndPassword[1].toCharArray())); + credentials.add(credential); + } else if (MongoCredential.MONGODB_X509_MECHANISM.equals(authMechanism)) { verifyUserNamePresent(userNameAndPassword); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/EntityOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/EntityOperations.java index e990ce587..06e91afce 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/EntityOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/EntityOperations.java @@ -38,11 +38,10 @@ import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import com.mongodb.util.JSONParseException; - /** * Common operations performed on an entity in the context of it's mapping metadata. * @@ -165,8 +164,15 @@ class EntityOperations { try { return Document.parse(source); - } catch (JSONParseException | org.bson.json.JsonParseException o_O) { + } catch (org.bson.json.JsonParseException o_O) { throw new MappingException("Could not parse given String to save into a JSON document!", o_O); + } catch (RuntimeException o_O) { + + // legacy 3.x exception + if (ClassUtils.matchesTypeName(o_O.getClass(), "JSONParseException")) { + throw new MappingException("Could not parse given String to save into a JSON document!", o_O); + } + throw o_O; } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoClientOptionsFactoryBean.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoClientOptionsFactoryBean.java index d1fe18801..9f7e85bd7 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoClientOptionsFactoryBean.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoClientOptionsFactoryBean.java @@ -41,7 +41,7 @@ public class MongoClientOptionsFactoryBean extends AbstractFactoryBean criteriaChain; private LinkedHashMap criteria = new LinkedHashMap(); @@ -450,7 +463,7 @@ public class Criteria implements CriteriaDefinition { Assert.notNull(regex, "Regex string must not be null!"); - return Pattern.compile(regex, options == null ? 0 : BSON.regexFlags(options)); + return Pattern.compile(regex, regexFlags(options)); } /** @@ -905,6 +918,47 @@ public class Criteria implements CriteriaDefinition { || (value instanceof GeoCommand && ((GeoCommand) value).getShape() instanceof GeoJson); } + /** + * Lookup the MongoDB specific flags for a given regex option string. + * + * @param s the Regex option/flag to look up. Can be {@literal null}. + * @return zero if given {@link String} is {@literal null} or empty. + * @since 2.2 + */ + private static int regexFlags(@Nullable String s) { + + int flags = 0; + + if (s == null) { + return flags; + } + + for (final char f : s.toLowerCase().toCharArray()) { + flags |= regexFlag(f); + } + + return flags; + } + + /** + * Lookup the MongoDB specific flags for a given character. + * + * @param c the Regex option/flag to look up. + * @return + * @throws IllegalArgumentException for unkown flags + * @since 2.2 + */ + private static int regexFlag(final char c) { + + int flag = FLAG_LOOKUP[c]; + + if (flag == 0) { + throw new IllegalArgumentException(String.format("Unrecognized flag [%c]", c)); + } + + return flag; + } + /** * MongoDB specific bitwise query * operators like {@code $bitsAllClear, $bitsAllSet,...} for usage with {@link Criteria#bits()} and {@link Query}. diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/SerializationUtils.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/SerializationUtils.java index 56f0d328f..818269f36 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/SerializationUtils.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/SerializationUtils.java @@ -15,6 +15,7 @@ */ package org.springframework.data.mongodb.core.query; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Iterator; @@ -22,10 +23,11 @@ import java.util.LinkedHashMap; import java.util.Map; import org.bson.Document; +import org.bson.json.JsonMode; +import org.bson.json.JsonWriterSettings; import org.springframework.core.convert.converter.Converter; import org.springframework.lang.Nullable; - -import com.mongodb.util.JSON; +import org.springframework.util.ObjectUtils; /** * Utility methods for JSON serialization. @@ -118,19 +120,34 @@ public abstract class SerializationUtils { } try { - return value instanceof Document ? ((Document) value).toJson() : JSON.serialize(value); + String json = value instanceof Document ? ((Document) value).toJson() : serializeValue(value); + return json.replaceAll("\"\\:", "\" :").replaceAll("\\{\"", "{ \""); //.replaceAll("\\]\\}", "] }"); } catch (Exception e) { if (value instanceof Collection) { return toString((Collection) value); } else if (value instanceof Map) { return toString((Map) value); - } else { + } else if (ObjectUtils.isArray(value)) { + return toString(Arrays.asList(ObjectUtils.toObjectArray(value))); + } + + else { return String.format("{ \"$java\" : %s }", value.toString()); } } } + public static String serializeValue(@Nullable Object value) { + + if(value == null) { + return "null"; + } + + String documentJson = new Document("toBeEncoded", value).toJson(); + return documentJson.substring(documentJson.indexOf(':') + 1, documentJson.length() - 1).trim(); + } + private static String toString(Map source) { return iterableToDelimitedString(source.entrySet(), "{ ", " }", entry -> String.format("\"%s\" : %s", entry.getKey(), serializeToJsonSafely(entry.getValue()))); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ExpressionEvaluatingParameterBinder.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ExpressionEvaluatingParameterBinder.java index 27b0c3416..0c46d4d8a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ExpressionEvaluatingParameterBinder.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ExpressionEvaluatingParameterBinder.java @@ -39,6 +39,7 @@ import org.bson.codecs.UuidCodec; import org.bson.json.JsonWriter; import org.bson.types.Binary; import org.springframework.data.mongodb.CodecRegistryProvider; +import org.springframework.data.mongodb.core.query.SerializationUtils; import org.springframework.data.mongodb.repository.query.StringBasedMongoQuery.ParameterBinding; import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; import org.springframework.expression.EvaluationContext; @@ -52,7 +53,6 @@ import org.springframework.util.StringUtils; import com.mongodb.DBObject; import com.mongodb.MongoClient; -import com.mongodb.util.JSON; /** * {@link ExpressionEvaluatingParameterBinder} allows to evaluate, convert and bind parameters to placeholders within a @@ -221,7 +221,8 @@ class ExpressionEvaluatingParameterBinder { return (String) value; } - return binding.isExpression() ? JSON.serialize(value) : QuotedString.unquote(JSON.serialize(value)); + String encodedValue = serialize(value); + return binding.isExpression() ? encodedValue : QuotedString.unquote(encodedValue); } return EncodableValue.create(value).encode(codecRegistryProvider, binding.isQuoted()); @@ -660,7 +661,11 @@ class ExpressionEvaluatingParameterBinder { */ @Override public String encode(CodecRegistryProvider provider, boolean quoted) { - return JSON.serialize(this.value); + return serialize(this.value); } } + + static String serialize(Object value) { + return SerializationUtils.serializeValue(value); + } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java index 02a653765..09f7572b0 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java @@ -270,6 +270,7 @@ public class MongoQueryMethod extends QueryMethod { } if (meta.maxScanDocuments() > 0) { + // TODO: Mongo 4 - removal metaAttributes.setMaxScan(meta.maxScanDocuments()); } @@ -282,6 +283,8 @@ public class MongoQueryMethod extends QueryMethod { } if (meta.snapshot()) { + + // TODO: Mongo 4 - removal metaAttributes.setSnapshot(meta.snapshot()); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQuery.java index 36f95795d..615ba1464 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQuery.java @@ -16,6 +16,7 @@ package org.springframework.data.mongodb.repository.query; import org.bson.Document; +import org.bson.json.JsonParseException; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.MongoTemplate; @@ -31,10 +32,6 @@ import org.springframework.data.repository.query.ReturnedType; import org.springframework.data.repository.query.parser.PartTree; import org.springframework.util.StringUtils; -import com.mongodb.BasicDBObject; -import com.mongodb.util.JSON; -import com.mongodb.util.JSONParseException; - /** * {@link RepositoryQuery} implementation for Mongo. * @@ -114,12 +111,12 @@ public class PartTreeMongoQuery extends AbstractMongoQuery { try { - BasicQuery result = new BasicQuery(query.getQueryObject(), new Document((BasicDBObject) JSON.parse(fieldSpec))); + BasicQuery result = new BasicQuery(query.getQueryObject(), Document.parse(fieldSpec)); result.setSortObject(query.getSortObject()); return result; - } catch (JSONParseException o_O) { + } catch (JsonParseException o_O) { throw new IllegalStateException(String.format("Invalid query or field specification in %s!", getQueryMethod()), o_O); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ReactivePartTreeMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ReactivePartTreeMongoQuery.java index 1512c892a..6db96e1c8 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ReactivePartTreeMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ReactivePartTreeMongoQuery.java @@ -16,6 +16,7 @@ package org.springframework.data.mongodb.repository.query; import org.bson.Document; +import org.bson.json.JsonParseException; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.ReactiveMongoOperations; @@ -30,8 +31,6 @@ import org.springframework.data.repository.query.ReturnedType; import org.springframework.data.repository.query.parser.PartTree; import org.springframework.util.StringUtils; -import com.mongodb.util.JSONParseException; - /** * Reactive PartTree {@link RepositoryQuery} implementation for Mongo. * @@ -110,7 +109,7 @@ public class ReactivePartTreeMongoQuery extends AbstractReactiveMongoQuery { return result; - } catch (JSONParseException o_O) { + } catch (JsonParseException o_O) { throw new IllegalStateException(String.format("Invalid query or field specification in %s!", getQueryMethod()), o_O); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java index d64b0afd5..bd0116dff 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java @@ -228,6 +228,8 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { String transformedInput = transformQueryAndCollectExpressionParametersIntoBindings(input, bindings); String parseableInput = makeParameterReferencesParseable(transformedInput); +// Document.parse(parseableInput) + collectParameterReferencesIntoBindings(bindings, JSON.parse(parseableInput, new LenientPatternDecodingCallback())); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfigurationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfigurationUnitTests.java index f6c1905c2..d1de46df1 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfigurationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfigurationUnitTests.java @@ -86,8 +86,12 @@ public class AbstractReactiveMongoConfigurationUnitTests { assertThat(context.getBean(SimpleReactiveMongoDatabaseFactory.class), is(notNullValue())); exception.expect(NoSuchBeanDefinitionException.class); - context.getBean(Mongo.class); - context.close(); + + try { + context.getBean(Mongo.class); + } finally { + context.close(); + } } @Test // DATAMONGO-1444 diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoClientParserIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoClientParserIntegrationTests.java index 2a275c44a..4a0888d71 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoClientParserIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoClientParserIntegrationTests.java @@ -62,7 +62,7 @@ public class MongoClientParserIntegrationTests { assertThat(factory.getBean("mongo-client-with-host-and-port"), instanceOf(MongoClient.class)); } - @Test // DATAMONGO-1158 + @Test // DATAMONGO-1158, DATAMONGO-2199 public void createsMongoClientWithOptionsCorrectly() { reader.loadBeanDefinitions(new ClassPathResource("namespace/mongoClient-bean.xml")); @@ -75,7 +75,7 @@ public class MongoClientParserIntegrationTests { MongoClient.class); assertThat(client.getReadPreference(), is(ReadPreference.secondary())); - assertThat(client.getWriteConcern(), is(WriteConcern.NORMAL)); + assertThat(client.getWriteConcern(), is(WriteConcern.UNACKNOWLEDGED)); } finally { context.close(); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoDbFactoryParserIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoDbFactoryParserIntegrationTests.java index 9f12c1864..3b821944b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoDbFactoryParserIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MongoDbFactoryParserIntegrationTests.java @@ -23,7 +23,6 @@ import org.junit.Test; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConstructorArgumentValues; import org.springframework.beans.factory.config.ConstructorArgumentValues.ValueHolder; -import org.springframework.beans.factory.parsing.BeanDefinitionParsingException; import org.springframework.beans.factory.support.BeanDefinitionReader; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; @@ -58,23 +57,23 @@ public class MongoDbFactoryParserIntegrationTests { reader = new XmlBeanDefinitionReader(factory); } - @Test + @Test // DATAMONGO-2199 public void testWriteConcern() throws Exception { SimpleMongoDbFactory dbFactory = new SimpleMongoDbFactory(new MongoClient("localhost"), "database"); - dbFactory.setWriteConcern(WriteConcern.SAFE); + dbFactory.setWriteConcern(WriteConcern.ACKNOWLEDGED); dbFactory.getDb(); - assertThat(ReflectionTestUtils.getField(dbFactory, "writeConcern"), is((Object) WriteConcern.SAFE)); + assertThat(ReflectionTestUtils.getField(dbFactory, "writeConcern"), is((Object) WriteConcern.ACKNOWLEDGED)); } - @Test + @Test // DATAMONGO-2199 public void parsesWriteConcern() { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("namespace/db-factory-bean.xml"); - assertWriteConcern(ctx, WriteConcern.SAFE); + assertWriteConcern(ctx, WriteConcern.ACKNOWLEDGED); } - @Test + @Test // DATAMONGO-2199 public void parsesCustomWriteConcern() { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext( "namespace/db-factory-bean-custom-write-concern.xml"); @@ -89,7 +88,7 @@ public class MongoDbFactoryParserIntegrationTests { MongoDbFactory factory = ctx.getBean("second", MongoDbFactory.class); MongoDatabase db = factory.getDb(); - assertThat(db.getWriteConcern(), is(WriteConcern.REPLICAS_SAFE)); + assertThat(db.getWriteConcern(), is(WriteConcern.W2)); ctx.close(); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/StringToWriteConcernConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/StringToWriteConcernConverterUnitTests.java index 220edb4cb..0c1eafcb0 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/StringToWriteConcernConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/StringToWriteConcernConverterUnitTests.java @@ -26,14 +26,15 @@ import com.mongodb.WriteConcern; * Unit tests for {@link StringToWriteConcernConverter}. * * @author Oliver Gierke + * @author Christoph Strobl */ public class StringToWriteConcernConverterUnitTests { StringToWriteConcernConverter converter = new StringToWriteConcernConverter(); - @Test + @Test // DATAMONGO-2199 public void createsWellKnownConstantsCorrectly() { - assertThat(converter.convert("SAFE"), is(WriteConcern.SAFE)); + assertThat(converter.convert("ACKNOWLEDGED"), is(WriteConcern.ACKNOWLEDGED)); } @Test diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/WriteConcernPropertyEditorUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/WriteConcernPropertyEditorUnitTests.java index 4333c30c3..fc2e66a2d 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/WriteConcernPropertyEditorUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/WriteConcernPropertyEditorUnitTests.java @@ -27,6 +27,7 @@ import com.mongodb.WriteConcern; * Unit tests for {@link WriteConcernPropertyEditor}. * * @author Oliver Gierke + * @author Christoph Strobl */ public class WriteConcernPropertyEditorUnitTests { @@ -37,11 +38,11 @@ public class WriteConcernPropertyEditorUnitTests { editor = new WriteConcernPropertyEditor(); } - @Test + @Test // DATAMONGO-2199 public void createsWriteConcernForWellKnownConstants() { - editor.setAsText("SAFE"); - assertThat(editor.getValue(), is((Object) WriteConcern.SAFE)); + editor.setAsText("JOURNALED"); + assertThat(editor.getValue(), is((Object) WriteConcern.JOURNALED)); } @Test 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 ee2d8d360..b746a7f21 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 @@ -26,6 +26,7 @@ import static org.springframework.data.mongodb.core.query.Criteria.*; import static org.springframework.data.mongodb.core.query.Query.*; import static org.springframework.data.mongodb.core.query.Update.*; +import com.mongodb.MongoClient; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -108,7 +109,6 @@ import org.springframework.util.StringUtils; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mongodb.DBRef; -import com.mongodb.Mongo; import com.mongodb.MongoException; import com.mongodb.ReadPreference; import com.mongodb.WriteConcern; @@ -160,7 +160,7 @@ public class MongoTemplateTests { } @Autowired - public void setMongo(Mongo mongo) throws Exception { + public void setMongoClient(MongoClient mongo) throws Exception { CustomConversions conversions = new MongoCustomConversions( Arrays.asList(DateToDateTimeConverter.INSTANCE, DateTimeToDateConverter.INSTANCE)); @@ -2820,9 +2820,9 @@ public class MongoTemplateTests { assertThat(result, hasSize(2)); - assertThat(template.getDb().getCollection("sample").count( + assertThat(template.getDb().getCollection("sample").countDocuments( new org.bson.Document("field", new org.bson.Document("$in", Arrays.asList("spring", "mongodb")))), is(0L)); - assertThat(template.getDb().getCollection("sample").count(new org.bson.Document("field", "data")), is(1L)); + assertThat(template.getDb().getCollection("sample").countDocuments(new org.bson.Document("field", "data")), is(1L)); } @Test // DATAMONGO-1001 diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTransactionTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTransactionTests.java index bcd3f96fb..b6c6b0b33 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTransactionTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTransactionTests.java @@ -116,7 +116,7 @@ public class MongoTemplateTransactionTests { assertionList.forEach(it -> { - boolean isPresent = collection.count(Filters.eq("_id", it.getId())) != 0; + boolean isPresent = collection.countDocuments(Filters.eq("_id", it.getId())) != 0; assertThat(isPresent).isEqualTo(it.shouldBePresent()) .withFailMessage(String.format("After transaction entity %s should %s.", it.getPersistable(), diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java index 41699e641..7da8e4eca 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java @@ -140,7 +140,7 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests { when(db.runCommand(any(), any(Class.class))).thenReturn(commandResultDocument); when(collection.find(any(org.bson.Document.class), any(Class.class))).thenReturn(findIterable); when(collection.mapReduce(any(), any(), eq(Document.class))).thenReturn(mapReduceIterable); - when(collection.count(any(Bson.class), any(CountOptions.class))).thenReturn(1L); + when(collection.count(any(Bson.class), any(CountOptions.class))).thenReturn(1L); // TODO: MongoDB 4 - fix me decprecated when(collection.getNamespace()).thenReturn(new MongoNamespace("db.mock-collection")); when(collection.aggregate(any(List.class), any())).thenReturn(aggregateIterable); when(collection.withReadPreference(any())).thenReturn(collection); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/SerializationUtilsUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/SerializationUtilsUnitTests.java index 492d80d01..337852643 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/SerializationUtilsUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/SerializationUtilsUnitTests.java @@ -41,7 +41,7 @@ public class SerializationUtilsUnitTests { public void writesSimpleDocument() { Document document = new Document("foo", "bar"); - assertThat(serializeToJsonSafely(document), is(document.toJson())); + assertThat(serializeToJsonSafely(document), is("{ \"foo\" : \"bar\"}")); } @Test diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/AbstractGeoSpatialTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/AbstractGeoSpatialTests.java index c4ec50987..90df43827 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/AbstractGeoSpatialTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/AbstractGeoSpatialTests.java @@ -75,7 +75,7 @@ public abstract class AbstractGeoSpatialTests { @Before public void setUp() { - template.setWriteConcern(WriteConcern.FSYNC_SAFE); + template.setWriteConcern(WriteConcern.JOURNALED); createIndex(); addVenues(); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoJsonTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoJsonTests.java index f3d35e0d1..c6154bf49 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoJsonTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoJsonTests.java @@ -82,7 +82,7 @@ public class GeoJsonTests { @Before public void setUp() { - template.setWriteConcern(WriteConcern.FSYNC_SAFE); + template.setWriteConcern(WriteConcern.JOURNALED); createIndex(); addVenues(); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoSpatialIndexTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoSpatialIndexTests.java index 0afcb9692..2c466b3c3 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoSpatialIndexTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoSpatialIndexTests.java @@ -56,7 +56,7 @@ public class GeoSpatialIndexTests extends AbstractIntegrationTests { @Before public void setUp() { - template.setWriteConcern(WriteConcern.FSYNC_SAFE); + template.setWriteConcern(WriteConcern.JOURNALED); template.setWriteResultChecking(WriteResultChecking.EXCEPTION); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/index/TextIndexTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/index/TextIndexTests.java index f7073ecf2..dc45f382a 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/index/TextIndexTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/index/TextIndexTests.java @@ -47,7 +47,7 @@ public class TextIndexTests extends AbstractIntegrationTests { @Before public void setUp() throws Exception { - template.setWriteConcern(WriteConcern.FSYNC_SAFE); + template.setWriteConcern(WriteConcern.JOURNALED); this.indexOps = template.indexOps(TextIndexedDocumentRoot.class); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/GeoIndexedTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/GeoIndexedTests.java index ed72ed895..1af98d2b0 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/GeoIndexedTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/GeoIndexedTests.java @@ -21,6 +21,7 @@ import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; +import org.bson.Document; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -33,12 +34,10 @@ import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import com.mongodb.DB; -import org.bson.Document; -import com.mongodb.Mongo; import com.mongodb.MongoClient; import com.mongodb.MongoException; import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; /** * @author Jon Brisbin @@ -66,8 +65,8 @@ public class GeoIndexedTests { private void cleanDb() throws UnknownHostException { - Mongo mongo = new MongoClient(); - DB db = mongo.getDB(GeoIndexedAppConfig.GEO_DB); + MongoClient mongo = new MongoClient(); + MongoDatabase db = mongo.getDatabase(GeoIndexedAppConfig.GEO_DB); for (String coll : collectionsToDrop) { db.getCollection(coll).drop(); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ApplicationContextEventTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ApplicationContextEventTests.java index de36b20a8..af16af6c6 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ApplicationContextEventTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ApplicationContextEventTests.java @@ -90,7 +90,7 @@ public class ApplicationContextEventTests { applicationContext = new AnnotationConfigApplicationContext(ApplicationContextEventTestsAppConfig.class); template = applicationContext.getBean(MongoTemplate.class); - template.setWriteConcern(WriteConcern.FSYNC_SAFE); + template.setWriteConcern(WriteConcern.JOURNALED); listener = applicationContext.getBean(SimpleMappingEventListener.class); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/UpdateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/UpdateTests.java index a191bef86..2ff894183 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/UpdateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/UpdateTests.java @@ -467,11 +467,11 @@ public class UpdateTests { assertThat(update.getUpdateObject()).isEqualTo(new Document("$min", new Document("key", date))); } - @Test // DATAMONGO-1777 + @Test // DATAMONGO-1777, DATAMONGO-2199 public void toStringShouldPrettyPrintModifiers() { assertThat(new Update().push("key").atPosition(Position.FIRST).value("Arya").toString()).isEqualTo( - "{ \"$push\" : { \"key\" : { \"$java\" : { \"$position\" : { \"$java\" : { \"$position\" : 0} }, \"$each\" : { \"$java\" : { \"$each\" : [ \"Arya\"]} } } } } }"); + "{ \"$push\" : { \"key\" : { \"$java\" : { \"$position\" : { \"$java\" : { \"$position\" : 0} }, \"$each\" : { \"$java\" : { \"$each\" : [ \"Arya\" ] } } } } } }"); } @Test // DATAMONGO-1777, DATAMONGO-2198 diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/performance/PerformanceTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/performance/PerformanceTests.java index 95a17358c..53d3fb132 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/performance/PerformanceTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/performance/PerformanceTests.java @@ -19,20 +19,12 @@ import static org.springframework.data.mongodb.core.query.Criteria.*; import static org.springframework.data.mongodb.core.query.Query.*; import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.Set; +import java.util.*; import java.util.regex.Pattern; import java.util.stream.Collectors; +import com.mongodb.client.FindIterable; +import com.mongodb.client.model.CreateCollectionOptions; import org.bson.Document; import org.bson.types.ObjectId; import org.junit.Before; @@ -53,12 +45,13 @@ import org.springframework.util.StringUtils; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; -import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.MongoClient; import com.mongodb.WriteConcern; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; /** * Test class to execute performance tests for plain MongoDB driver usage, {@link MongoTemplate} and the repositories @@ -76,7 +69,7 @@ public class PerformanceTests { private static final StopWatch watch = new StopWatch(); private static final Collection IGNORED_WRITE_CONCERNS = Arrays.asList("MAJORITY", "REPLICAS_SAFE", "FSYNC_SAFE", "FSYNCED", "JOURNAL_SAFE", "JOURNALED", "REPLICA_ACKNOWLEDGED", "W2", "W3"); - private static final int COLLECTION_SIZE = 1024-2018 * 1024-2018 * 256; // 256 MB + private static final int COLLECTION_SIZE = 1024 - 2018 * 1024 - 2018 * 256; // 256 MB private static final Collection COLLECTION_NAMES = Arrays.asList("template", "driver", "person"); MongoClient mongo; @@ -149,7 +142,7 @@ public class PerformanceTests { List persons = new ArrayList(); for (Document document : documents) { - persons.add(Person.from(new BasicDBObject(document))); + persons.add(Person.from(document)); } return persons; @@ -182,7 +175,7 @@ public class PerformanceTests { @Test public void writeAndRead() throws Exception { - mongo.setWriteConcern(WriteConcern.SAFE); + mongo.setWriteConcern(WriteConcern.ACKNOWLEDGED); readsAndWrites(NUMBER_OF_PERSONS, ITERATIONS); } @@ -257,19 +250,26 @@ public class PerformanceTests { private void setupCollections() { - DB db = this.mongo.getDB(DATABASE_NAME); + MongoDatabase db = this.mongo.getDatabase(DATABASE_NAME); for (String collectionName : COLLECTION_NAMES) { - DBCollection collection = db.getCollection(collectionName); + + MongoCollection collection = db.getCollection(collectionName); collection.drop(); - collection.getDB().command(getCreateCollectionCommand(collectionName)); - collection.createIndex(new BasicDBObject("firstname", -1)); - collection.createIndex(new BasicDBObject("lastname", -1)); + + CreateCollectionOptions collectionOptions = new CreateCollectionOptions(); + collectionOptions.capped(false); + collectionOptions.sizeInBytes(COLLECTION_SIZE); + + db.createCollection(collectionName, collectionOptions); + + collection.createIndex(new Document("firstname", -1)); + collection.createIndex(new Document("lastname", -1)); } } - private DBObject getCreateCollectionCommand(String name) { - DBObject document = new BasicDBObject(); + private Document getCreateCollectionCommand(String name) { + Document document = new Document(); document.put("createCollection", name); document.put("capped", false); document.put("size", COLLECTION_SIZE); @@ -278,10 +278,14 @@ public class PerformanceTests { private long writingObjectsUsingPlainDriver(int numberOfPersons) { - DBCollection collection = mongo.getDB(DATABASE_NAME).getCollection("driver"); + MongoCollection collection = mongo.getDatabase(DATABASE_NAME).getCollection("driver"); List persons = getPersonObjects(numberOfPersons); - executeWatched(() -> persons.stream().map(it -> collection.save(new BasicDBObject(it.toDocument())))); + executeWatched(() -> persons.stream().map(Person::toDocument).map(it -> { + + collection.insertOne(it); + return true; + })); return watch.getLastTaskTimeMillis(); } @@ -308,7 +312,7 @@ public class PerformanceTests { private long readingUsingPlainDriver() { - executeWatched(() -> toPersons(mongo.getDB(DATABASE_NAME).getCollection("driver").find())); + executeWatched(() -> toPersons(mongo.getDatabase(DATABASE_NAME).getCollection("driver").find())); return watch.getLastTaskTimeMillis(); } @@ -329,10 +333,10 @@ public class PerformanceTests { executeWatched(() -> { - DBCollection collection = mongo.getDB(DATABASE_NAME).getCollection("driver"); + MongoCollection collection = mongo.getDatabase(DATABASE_NAME).getCollection("driver"); - BasicDBObject regex = new BasicDBObject("$regex", Pattern.compile(".*1.*")); - BasicDBObject query = new BasicDBObject("addresses.zipCode", regex); + Document regex = new Document("$regex", Pattern.compile(".*1.*")); + Document query = new Document("addresses.zipCode", regex); return toPersons(collection.find(query)); }); @@ -385,12 +389,13 @@ public class PerformanceTests { } } - private static List toPersons(DBCursor cursor) { + private static List toPersons(FindIterable cursor) { List persons = new ArrayList(); - while (cursor.hasNext()) { - persons.add(Person.from(cursor.next())); + Iterator it = cursor.iterator(); + while (it.hasNext()) { + persons.add(Person.from(it.next())); } return persons; @@ -410,15 +415,15 @@ public class PerformanceTests { this.orders = new HashSet(); } - public static Person from(DBObject source) { + public static Person from(Document source) { - BasicDBList addressesSource = (BasicDBList) source.get("addresses"); + List addressesSource = (List) source.get("addresses"); List
addresses = new ArrayList
(addressesSource.size()); for (Object addressSource : addressesSource) { addresses.add(Address.from((Document) addressSource)); } - BasicDBList ordersSource = (BasicDBList) source.get("orders"); + List ordersSource = (List) source.get("orders"); Set orders = new HashSet(ordersSource.size()); for (Object orderSource : ordersSource) { orders.add(Order.from((Document) orderSource)); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/performance/ReactivePerformanceTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/performance/ReactivePerformanceTests.java index 66b51ef06..114d298a1 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/performance/ReactivePerformanceTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/performance/ReactivePerformanceTests.java @@ -196,7 +196,7 @@ public class ReactivePerformanceTests { @Test // DATAMONGO-1444 public void writeAndRead() throws Exception { - readsAndWrites(NUMBER_OF_PERSONS, ITERATIONS, WriteConcern.SAFE); + readsAndWrites(NUMBER_OF_PERSONS, ITERATIONS, WriteConcern.ACKNOWLEDGED); } private void readsAndWrites(int numberOfPersons, int iterations, WriteConcern concern) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQueryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQueryUnitTests.java index f47ec1f4b..c63337353 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQueryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQueryUnitTests.java @@ -25,6 +25,7 @@ import java.lang.reflect.Method; import java.util.List; import org.bson.Document; +import org.bson.json.JsonParseException; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -51,8 +52,6 @@ import org.springframework.data.projection.ProjectionFactory; import org.springframework.data.projection.SpelAwareProxyProjectionFactory; import org.springframework.data.repository.core.support.DefaultRepositoryMetadata; -import com.mongodb.util.JSONParseException; - /** * Unit tests for {@link PartTreeMongoQuery}. * @@ -130,7 +129,7 @@ public class PartTreeMongoQueryUnitTests { public void propagatesRootExceptionForInvalidQuery() { exception.expect(IllegalStateException.class); - exception.expectCause(is(instanceOf(JSONParseException.class))); + exception.expectCause(is(instanceOf(JsonParseException.class))); deriveQueryFromMethod("findByAge", 1); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/ReactiveStringBasedMongoQueryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/ReactiveStringBasedMongoQueryUnitTests.java index 264402c97..83b6e903b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/ReactiveStringBasedMongoQueryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/ReactiveStringBasedMongoQueryUnitTests.java @@ -218,7 +218,7 @@ public class ReactiveStringBasedMongoQueryUnitTests { org.springframework.data.mongodb.core.query.Query query = mongoQuery.createQuery(accesor); org.springframework.data.mongodb.core.query.Query reference = new BasicQuery("{'lastname' : { '$binary' : '" - + Base64Utils.encodeToString(binaryData) + "', '$type' : '" + BSON.B_GENERAL + "'}}"); + + Base64Utils.encodeToString(binaryData) + "', '$type' : '" + 0 + "'}}"); assertThat(query.getQueryObject().toJson(), is(reference.getQueryObject().toJson())); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/test/util/CleanMongoDB.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/test/util/CleanMongoDB.java index fcb37e29f..217b9b78a 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/test/util/CleanMongoDB.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/test/util/CleanMongoDB.java @@ -20,8 +20,10 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; +import org.bson.Document; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; @@ -33,6 +35,8 @@ import org.springframework.util.StringUtils; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; /** * {@link CleanMongoDB} is a junit {@link TestRule} implementation to be used as for wiping data from MongoDB instance. @@ -55,7 +59,7 @@ public class CleanMongoDB implements TestRule { DATABASE, COLLECTION, INDEX; } - @SuppressWarnings("serial")// + @SuppressWarnings("serial") // private Set preserveDatabases = new HashSet() { { add("admin"); @@ -274,7 +278,7 @@ public class CleanMongoDB implements TestRule { continue; } - DB db = client.getDB(dbName); + MongoDatabase db = client.getDatabase(dbName); dropCollectionsOrIndexIfRequried(db, initCollectionNames(db)); } } @@ -290,13 +294,15 @@ public class CleanMongoDB implements TestRule { return true; } - private void dropCollectionsOrIndexIfRequried(DB db, Collection collectionsToUse) { + private void dropCollectionsOrIndexIfRequried(MongoDatabase db, Collection collectionsToUse) { + + Collection availableCollections = db.listCollectionNames().into(new LinkedHashSet<>()); for (String collectionName : collectionsToUse) { - if (db.collectionExists(collectionName)) { + if (availableCollections.contains(collectionName)) { - DBCollection collection = db.getCollectionFromString(collectionName); + MongoCollection collection = db.getCollection(collectionName); if (collection != null) { if (types.contains(Struct.COLLECTION)) { @@ -319,16 +325,16 @@ public class CleanMongoDB implements TestRule { Collection dbNamesToUse = dbNames; if (dbNamesToUse.isEmpty()) { - dbNamesToUse = client.getDatabaseNames(); + dbNamesToUse = client.listDatabaseNames().into(new LinkedHashSet<>()); } return dbNamesToUse; } - private Collection initCollectionNames(DB db) { + private Collection initCollectionNames(MongoDatabase db) { Collection collectionsToUse = collectionNames; if (CollectionUtils.isEmpty(collectionsToUse)) { - collectionsToUse = db.getCollectionNames(); + collectionsToUse = db.listCollectionNames().into(new LinkedHashSet<>()); } return collectionsToUse; } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/test/util/CleanMongoDBTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/test/util/CleanMongoDBTests.java index e229f8774..b8ef4ec6c 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/test/util/CleanMongoDBTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/test/util/CleanMongoDBTests.java @@ -18,9 +18,13 @@ package org.springframework.data.mongodb.test.util; import static org.mockito.Mockito.*; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.concurrent.TimeUnit; +import org.bson.Document; +import org.bson.conversions.Bson; import org.junit.Before; import org.junit.Test; import org.junit.runner.Description; @@ -30,9 +34,15 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.data.mongodb.test.util.CleanMongoDB.Struct; -import com.mongodb.DB; -import com.mongodb.DBCollection; +import com.mongodb.Block; +import com.mongodb.Function; import com.mongodb.MongoClient; +import com.mongodb.client.ListCollectionsIterable; +import com.mongodb.client.ListDatabasesIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.MongoIterable; /** * @author Christoph Strobl @@ -50,35 +60,152 @@ public class CleanMongoDBTests { private @Mock MongoClient mongoClientMock; // Some Mock DBs - private @Mock DB db1mock, db2mock; - private @Mock DBCollection db1collection1mock, db1collection2mock, db2collection1mock; + private @Mock MongoDatabase db1mock, db2mock; + private @Mock MongoCollection db1collection1mock, db1collection2mock, db2collection1mock; @SuppressWarnings("serial") @Before public void setUp() { // DB setup - when(mongoClientMock.getDatabaseNames()).thenReturn(Arrays.asList("admin", "db1", "db2")); - when(mongoClientMock.getDB(eq("db1"))).thenReturn(db1mock); - when(mongoClientMock.getDB(eq("db2"))).thenReturn(db2mock); + when(mongoClientMock.listDatabaseNames()).thenReturn(new ListDatabasesIterable() { + @Override + public ListDatabasesIterable maxTime(long maxTime, TimeUnit timeUnit) { + return null; + } - // collections have to exist - when(db1mock.collectionExists(anyString())).thenReturn(true); - when(db2mock.collectionExists(anyString())).thenReturn(true); + @Override + public ListDatabasesIterable batchSize(int batchSize) { + return null; + } - // init collection names per database - when(db1mock.getCollectionNames()).thenReturn(new HashSet() { - { - add("db1collection1"); - add("db1collection2"); + @Override + public ListDatabasesIterable filter(Bson filter) { + return null; + } + + @Override + public ListDatabasesIterable nameOnly(Boolean nameOnly) { + return null; + } + + @Override + public MongoCursor iterator() { + return null; + } + + @Override + public String first() { + return null; + } + + @Override + public MongoIterable map(Function mapper) { + return null; + } + + @Override + public void forEach(Block block) { + + } + + @Override + public > A into(A target) { + return (A) Arrays.asList("admin", "db1", "db2"); + } + }); + when(mongoClientMock.getDatabase(eq("db1"))).thenReturn(db1mock); + when(mongoClientMock.getDatabase(eq("db2"))).thenReturn(db2mock); + + // collections have to exist + when(db1mock.listCollectionNames()).thenReturn(new ListCollectionsIterable() { + @Override + public ListCollectionsIterable filter(Bson filter) { + return null; + } + + @Override + public ListCollectionsIterable maxTime(long maxTime, TimeUnit timeUnit) { + return null; + } + + @Override + public ListCollectionsIterable batchSize(int batchSize) { + return null; + } + + @Override + public MongoCursor iterator() { + return null; + } + + @Override + public String first() { + return null; + } + + @Override + public MongoIterable map(Function mapper) { + return null; + } + + @Override + public void forEach(Block block) { + + } + + @Override + public > A into(A target) { + return (A) Arrays.asList("db1collection1", "db1collection2"); + } + }); + + when(db2mock.listCollectionNames()).thenReturn(new ListCollectionsIterable() { + @Override + public ListCollectionsIterable filter(Bson filter) { + return null; + } + + @Override + public ListCollectionsIterable maxTime(long maxTime, TimeUnit timeUnit) { + return null; + } + + @Override + public ListCollectionsIterable batchSize(int batchSize) { + return null; + } + + @Override + public MongoCursor iterator() { + return null; + } + + @Override + public String first() { + return null; + } + + @Override + public MongoIterable map(Function mapper) { + return null; + } + + @Override + public void forEach(Block block) { + + } + + @Override + public > A into(A target) { + return (A) Arrays.asList("db2collection1"); } }); - when(db2mock.getCollectionNames()).thenReturn(Collections.singleton("db2collection1")); // return collections according to names - when(db1mock.getCollectionFromString(eq("db1collection1"))).thenReturn(db1collection1mock); - when(db1mock.getCollectionFromString(eq("db1collection2"))).thenReturn(db1collection2mock); - when(db2mock.getCollectionFromString(eq("db2collection1"))).thenReturn(db2collection1mock); + when(db1mock.getCollection(eq("db1collection1"))).thenReturn(db1collection1mock); + when(db1mock.getCollection(eq("db1collection2"))).thenReturn(db1collection2mock); + when(db2mock.getCollection(eq("db2collection1"))).thenReturn(db2collection1mock); cleaner = new CleanMongoDB(mongoClientMock); } diff --git a/spring-data-mongodb/src/test/resources/namespace/db-factory-bean-custom-write-concern.xml b/spring-data-mongodb/src/test/resources/namespace/db-factory-bean-custom-write-concern.xml index 469489df9..3d41fccf8 100644 --- a/spring-data-mongodb/src/test/resources/namespace/db-factory-bean-custom-write-concern.xml +++ b/spring-data-mongodb/src/test/resources/namespace/db-factory-bean-custom-write-concern.xml @@ -11,7 +11,7 @@ - + - \ No newline at end of file + diff --git a/spring-data-mongodb/src/test/resources/namespace/mongoClient-bean.xml b/spring-data-mongodb/src/test/resources/namespace/mongoClient-bean.xml index 4b157b561..c1fc2bd14 100644 --- a/spring-data-mongodb/src/test/resources/namespace/mongoClient-bean.xml +++ b/spring-data-mongodb/src/test/resources/namespace/mongoClient-bean.xml @@ -8,7 +8,7 @@ - +