diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfiguration.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfiguration.java index f25ab8ebd..6917f4aa6 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfiguration.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfiguration.java @@ -81,8 +81,7 @@ public abstract class AbstractReactiveMongoConfiguration extends MongoConfigurat @Bean public MappingMongoConverter mappingMongoConverter() throws Exception { - MappingMongoConverter converter = new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, - mongoMappingContext()); + MappingMongoConverter converter = new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mongoMappingContext()); converter.setCustomConversions(customConversions()); return converter; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 65f1ed71d..f27602ec6 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -1221,8 +1221,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, @Nullable private WriteConcern potentiallyForceAcknowledgedWrite(@Nullable WriteConcern wc) { - if (ObjectUtils.nullSafeEquals(WriteResultChecking.EXCEPTION, writeResultChecking) - && MongoClientVersion.isMongo3Driver()) { + if (ObjectUtils.nullSafeEquals(WriteResultChecking.EXCEPTION, writeResultChecking)) { if (wc == null || wc.getWObject() == null || (wc.getWObject() instanceof Number && ((Number) wc.getWObject()).intValue() < 1)) { return WriteConcern.ACKNOWLEDGED; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java index 4a73fb34a..8919dd796 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java @@ -2626,8 +2626,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati @Nullable private WriteConcern potentiallyForceAcknowledgedWrite(@Nullable WriteConcern wc) { - if (ObjectUtils.nullSafeEquals(WriteResultChecking.EXCEPTION, writeResultChecking) - && MongoClientVersion.isMongo3Driver()) { + if (ObjectUtils.nullSafeEquals(WriteResultChecking.EXCEPTION, writeResultChecking)) { if (wc == null || wc.getWObject() == null || (wc.getWObject() instanceof Number && ((Number) wc.getWObject()).intValue() < 1)) { return WriteConcern.ACKNOWLEDGED; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java index 161e0ca1c..6c43b692e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java @@ -43,7 +43,6 @@ import org.springframework.dao.support.PersistenceExceptionTranslator; import org.springframework.data.mongodb.ClientSessionException; import org.springframework.data.mongodb.LazyLoadingException; import org.springframework.data.mongodb.MongoDbFactory; -import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; import org.springframework.lang.Nullable; import org.springframework.objenesis.ObjenesisStd; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/NoOpDbRefResolver.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/NoOpDbRefResolver.java index 67920d3b1..8bdc0ddd5 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/NoOpDbRefResolver.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/NoOpDbRefResolver.java @@ -17,13 +17,9 @@ package org.springframework.data.mongodb.core.convert; import java.util.List; -import javax.annotation.Nonnull; - import org.bson.Document; -import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; import org.springframework.lang.Nullable; -import org.springframework.util.StringUtils; import com.mongodb.DBRef; @@ -32,6 +28,7 @@ import com.mongodb.DBRef; * {@link UnsupportedOperationException} when attempting to resolve database references. * * @author Mark Paluch + * @author Christoph Strobl * @since 2.1 */ public enum NoOpDbRefResolver implements DbRefResolver { @@ -40,13 +37,14 @@ public enum NoOpDbRefResolver implements DbRefResolver { /* * (non-Javadoc) - * @see org.springframework.data.mongodb.core.convert.DbRefResolver#resolveDbRef(org.springframework.data.mongodb.core.mapping.MongoPersistentProperty, org.springframework.data.mongodb.core.convert.DbRefResolverCallback) + * @see org.springframework.data.mongodb.core.convert.DbRefResolver#resolveDbRef(org.springframework.data.mongodb.core.mapping.MongoPersistentProperty, org.springframework.data.mongodb.core.convert.DbRefResolverCallback, org.springframework.data.mongodb.core.convert.DbRefProxyHandler) */ @Override @Nullable - public Object resolveDbRef(@Nonnull MongoPersistentProperty property, @Nonnull DBRef dbref, - @Nonnull DbRefResolverCallback callback, @Nonnull DbRefProxyHandler proxyHandler) { - throw new UnsupportedOperationException("DBRef resolution not supported!"); + public Object resolveDbRef(MongoPersistentProperty property, @Nullable DBRef dbref, DbRefResolverCallback callback, + DbRefProxyHandler proxyHandler) { + + return handle(); } /* @@ -54,8 +52,9 @@ public enum NoOpDbRefResolver implements DbRefResolver { * @see org.springframework.data.mongodb.core.convert.DbRefResolver#fetch(com.mongodb.DBRef) */ @Override + @Nullable public Document fetch(DBRef dbRef) { - throw new UnsupportedOperationException("DBRef resolution not supported!"); + return handle(); } /* @@ -64,6 +63,10 @@ public enum NoOpDbRefResolver implements DbRefResolver { */ @Override public List bulkFetch(List dbRefs) { - throw new UnsupportedOperationException("DBRef resolution not supported!"); + return handle(); + } + + private T handle() throws UnsupportedOperationException { + throw new UnsupportedOperationException("DBRef resolution is not supported!"); } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoSimpleTypes.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoSimpleTypes.java index 7e880e7fc..6b2202db4 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoSimpleTypes.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoSimpleTypes.java @@ -24,6 +24,9 @@ import java.util.regex.Pattern; import org.bson.BsonObjectId; import org.bson.types.Binary; +import org.bson.types.CodeWScope; +import org.bson.types.CodeWithScope; +import org.bson.types.Decimal128; import org.bson.types.ObjectId; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.mongodb.util.MongoClientVersion; @@ -36,40 +39,29 @@ import com.mongodb.DBRef; * * @author Oliver Gierke * @author Christoph Strobl - * @author Mark Paluch */ public abstract class MongoSimpleTypes { public static final Set> AUTOGENERATED_ID_TYPES; static { - Set> classes = new HashSet<>(); + Set> classes = new HashSet>(); classes.add(ObjectId.class); classes.add(String.class); classes.add(BigInteger.class); AUTOGENERATED_ID_TYPES = Collections.unmodifiableSet(classes); - Set> simpleTypes = new HashSet<>(); + Set> simpleTypes = new HashSet>(); simpleTypes.add(DBRef.class); simpleTypes.add(ObjectId.class); simpleTypes.add(BsonObjectId.class); + simpleTypes.add(CodeWScope.class); + simpleTypes.add(CodeWithScope.class); simpleTypes.add(org.bson.Document.class); simpleTypes.add(Pattern.class); simpleTypes.add(Binary.class); simpleTypes.add(UUID.class); - - if (ClassUtils.isPresent("org.bson.types.CodeWScope", MongoSimpleTypes.class.getClassLoader())) { - simpleTypes.add(resolveClassName("org.bson.types.CodeWScope")); - } - - if (ClassUtils.isPresent("org.bson.types.CodeWithScope", MongoSimpleTypes.class.getClassLoader())) { - simpleTypes.add(resolveClassName("org.bson.types.CodeWithScope")); - } - - if (MongoClientVersion.isMongo34Driver()) { - simpleTypes.add(resolveClassName("org.bson.types.Decimal128")); - } - + simpleTypes.add(Decimal128.class); MONGO_SIMPLE_TYPES = Collections.unmodifiableSet(simpleTypes); } @@ -77,8 +69,4 @@ public abstract class MongoSimpleTypes { public static final SimpleTypeHolder HOLDER = new SimpleTypeHolder(MONGO_SIMPLE_TYPES, true); private MongoSimpleTypes() {} - - private static Class resolveClassName(String className) { - return ClassUtils.resolveClassName(className, MongoSimpleTypes.class.getClassLoader()); - } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/MongoClientVersion.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/MongoClientVersion.java index 006a950fd..e5961ff41 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/MongoClientVersion.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/MongoClientVersion.java @@ -26,34 +26,54 @@ import org.springframework.util.ClassUtils; */ public class MongoClientVersion { - private static final boolean IS_MONGO_30 = ClassUtils.isPresent("com.mongodb.binding.SingleServerBinding", + private static final boolean SYNC_CLIENT_PRESENT = ClassUtils.isPresent("com.mongodb.MongoClient", MongoClientVersion.class.getClassLoader()); - private static final boolean IS_MONGO_34 = ClassUtils.isPresent("org.bson.types.Decimal128", + private static final boolean ASYNC_CLIENT_PRESENT = ClassUtils.isPresent("com.mongodb.async.client.MongoClient", MongoClientVersion.class.getClassLoader()); - private static final boolean IS_ASYNC_CLIENT = ClassUtils.isPresent("com.mongodb.async.client.MongoClient", - MongoClientVersion.class.getClassLoader()); + private static final boolean REACTIVE_CLIENT_PRESENT = ClassUtils + .isPresent("com.mongodb.reactivestreams.client.MongoClient", MongoClientVersion.class.getClassLoader()); /** * @return {@literal true} if MongoDB Java driver version 3.0 or later is on classpath. + * @deprecated since 2.1, which requires MongoDB Java driver 3.8. Returns {@literal true} by default. */ + @Deprecated public static boolean isMongo3Driver() { - return IS_MONGO_30; + return true; } /** * @return {@literal true} if MongoDB Java driver version 3.4 or later is on classpath. * @since 1.10 + * @deprecated since 2.1, which requires MongoDB Java driver 3.8. Returns {@literal true} by default. */ + @Deprecated public static boolean isMongo34Driver() { - return IS_MONGO_34; + return true; } /** - * @return {@literal true} if MongoDB Java driver is on classpath. + * @return {@literal true} if the async MongoDB Java driver is on classpath. */ public static boolean isAsyncClient() { - return IS_ASYNC_CLIENT; + return ASYNC_CLIENT_PRESENT; + } + + /** + * @return {@literal true} if the sync MongoDB Java driver is on classpath. + * @since 2.1 + */ + public static boolean isSyncClientPresent() { + return SYNC_CLIENT_PRESENT; + } + + /** + * @return {@literal true} if the reactive MongoDB Java driver is on classpath. + * @since 2.1 + */ + public static boolean isReactiveClientPresent() { + return REACTIVE_CLIENT_PRESENT; } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoOptionsFactoryBeanUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoOptionsFactoryBeanUnitTests.java deleted file mode 100644 index 7c866b01f..000000000 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoOptionsFactoryBeanUnitTests.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2011-2018 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.core; - -import static org.junit.Assert.*; -import static org.junit.Assume.*; -import static org.springframework.data.mongodb.util.MongoClientVersion.*; - -import javax.net.ssl.SSLSocketFactory; - -import org.junit.BeforeClass; -import org.junit.Test; - -import com.mongodb.MongoClientOptions; - -/** - * Unit tests for {@link MongoOptionsFactoryBean}. - * - * @author Oliver Gierke - * @author Mike Saavedra - * @author Christoph Strobl - */ -@SuppressWarnings("deprecation") -public class MongoOptionsFactoryBeanUnitTests { - - @BeforeClass - public static void validateMongoDriver() { - assumeFalse(isMongo3Driver()); - } - - @Test // DATAMONGO-764 - public void testSslConnection() throws Exception { - - MongoClientOptionsFactoryBean bean = new MongoClientOptionsFactoryBean(); - bean.setSsl(true); - bean.afterPropertiesSet(); - - MongoClientOptions options = bean.getObject(); - assertNotNull(options.getSocketFactory()); - assertTrue(options.getSocketFactory() instanceof SSLSocketFactory); - } -} 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 059026a88..26193ad48 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 @@ -3420,8 +3420,6 @@ public class MongoTemplateTests { public void decimal128TypeShouldBeSavedAndLoadedCorrectly() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { - assumeThat(MongoClientVersion.isMongo34Driver(), is(true)); - Class decimal128Type = ClassUtils.resolveClassName("org.bson.types.Decimal128", null); WithObjectTypeProperty source = new WithObjectTypeProperty(); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/DbRefMappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/DbRefMappingMongoConverterUnitTests.java index 793db31f7..7d78ff87b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/DbRefMappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/DbRefMappingMongoConverterUnitTests.java @@ -111,18 +111,14 @@ public class DbRefMappingMongoConverterUnitTests { when(dbRef.getId()).thenReturn(BigInteger.ONE); when(dbRef.getCollectionName()).thenReturn("collection-1"); - if (MongoClientVersion.isMongo3Driver()) { - MongoDatabase dbMock = mock(MongoDatabase.class); - MongoCollection collectionMock = mock(MongoCollection.class); - when(dbFactory.getDb()).thenReturn(dbMock); - when(dbMock.getCollection(anyString(), eq(Document.class))).thenReturn(collectionMock); - - FindIterable fi = mock(FindIterable.class); - when(fi.first()).thenReturn(mapValDocument); - when(collectionMock.find(Mockito.any(Bson.class))).thenReturn(fi); - } else { - when(dbRefResolver.fetch(dbRef)).thenReturn(mapValDocument); - } + MongoDatabase dbMock = mock(MongoDatabase.class); + MongoCollection collectionMock = mock(MongoCollection.class); + when(dbFactory.getDb()).thenReturn(dbMock); + when(dbMock.getCollection(anyString(), eq(Document.class))).thenReturn(collectionMock); + + FindIterable fi = mock(FindIterable.class); + when(fi.first()).thenReturn(mapValDocument); + when(collectionMock.find(Mockito.any(Bson.class))).thenReturn(fi); MapDBRef mapDBRef = new MapDBRef();