From 5b82cbcddbdf106ad69bf87792f17dc56a2c0770 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 5 Mar 2025 11:04:35 +0100 Subject: [PATCH] Migrate to JSpecify annotations for nullability constraints. Closes #528 --- pom.xml | 5 +++++ .../data/ldap/config/package-info.java | 4 +--- .../mapping/BasicLdapPersistentEntity.java | 1 + .../ldap/core/mapping/LdapMappingContext.java | 1 + .../core/mapping/LdapPersistentProperty.java | 3 ++- .../ldap/core/mapping/LdapSimpleTypes.java | 1 + .../data/ldap/core/mapping/package-info.java | 3 +-- .../data/ldap/repository/LdapEncoder.java | 2 ++ .../data/ldap/repository/LdapRepository.java | 1 + .../data/ldap/repository/Query.java | 1 + .../repository/cdi/LdapRepositoryBean.java | 1 + .../cdi/LdapRepositoryExtension.java | 1 + .../ldap/repository/cdi/package-info.java | 2 +- .../config/LdapRepositoriesRegistrar.java | 1 + .../LdapRepositoryConfigurationExtension.java | 1 + .../ldap/repository/config/package-info.java | 4 +--- .../data/ldap/repository/package-info.java | 2 +- .../query/AbstractLdapRepositoryQuery.java | 5 ++++- .../query/LdapParameterAccessor.java | 1 + .../ldap/repository/query/LdapParameters.java | 3 ++- .../repository/query/LdapQueryCreator.java | 11 ++++++----- .../repository/query/LdapQueryExecution.java | 19 +++++++++++++++---- .../repository/query/LdapQueryMethod.java | 3 ++- .../query/PartTreeLdapRepositoryQuery.java | 1 + .../repository/query/StringBasedQuery.java | 11 ++++++++--- .../ldap/repository/query/package-info.java | 4 +--- ...tLdapAnnotationProcessorConfiguration.java | 4 +++- .../support/LdapAnnotationProcessor.java | 1 + .../support/LdapEntityInformation.java | 7 ++++--- .../support/LdapRepositoryFactory.java | 6 +++++- .../support/LdapRepositoryFactoryBean.java | 4 +++- .../repository/support/LdapSerializer.java | 1 + .../QuerydslLdapPredicateExecutor.java | 9 ++++----- .../repository/support/QuerydslLdapQuery.java | 1 + .../support/SimpleLdapRepository.java | 13 +++---------- .../ldap/repository/support/package-info.java | 4 +--- 36 files changed, 89 insertions(+), 53 deletions(-) diff --git a/pom.xml b/pom.xml index bb494b3..a006a44 100644 --- a/pom.xml +++ b/pom.xml @@ -95,6 +95,11 @@ ${cdi} true + + org.jspecify + jspecify + 1.0.0 + jakarta.annotation diff --git a/src/main/java/org/springframework/data/ldap/config/package-info.java b/src/main/java/org/springframework/data/ldap/config/package-info.java index 413d7df..9e8fb95 100644 --- a/src/main/java/org/springframework/data/ldap/config/package-info.java +++ b/src/main/java/org/springframework/data/ldap/config/package-info.java @@ -1,7 +1,5 @@ /** * XML configuration support for Spring Data LDAP repositories. */ -@NonNullApi +@org.jspecify.annotations.NullMarked package org.springframework.data.ldap.config; - -import org.springframework.lang.NonNullApi; diff --git a/src/main/java/org/springframework/data/ldap/core/mapping/BasicLdapPersistentEntity.java b/src/main/java/org/springframework/data/ldap/core/mapping/BasicLdapPersistentEntity.java index 8d581c8..1768f5b 100644 --- a/src/main/java/org/springframework/data/ldap/core/mapping/BasicLdapPersistentEntity.java +++ b/src/main/java/org/springframework/data/ldap/core/mapping/BasicLdapPersistentEntity.java @@ -35,4 +35,5 @@ public class BasicLdapPersistentEntity extends BasicPersistentEntity information) { super(information); } + } diff --git a/src/main/java/org/springframework/data/ldap/core/mapping/LdapMappingContext.java b/src/main/java/org/springframework/data/ldap/core/mapping/LdapMappingContext.java index 3948e4a..88825ba 100644 --- a/src/main/java/org/springframework/data/ldap/core/mapping/LdapMappingContext.java +++ b/src/main/java/org/springframework/data/ldap/core/mapping/LdapMappingContext.java @@ -45,4 +45,5 @@ public class LdapMappingContext extends AbstractMappingContext createAssociation() { - return null; + throw new UnsupportedOperationException("LDAP does not support associations"); } @Override public boolean isIdProperty() { return isId.get(); } + } diff --git a/src/main/java/org/springframework/data/ldap/core/mapping/LdapSimpleTypes.java b/src/main/java/org/springframework/data/ldap/core/mapping/LdapSimpleTypes.java index 5658942..9f9082e 100644 --- a/src/main/java/org/springframework/data/ldap/core/mapping/LdapSimpleTypes.java +++ b/src/main/java/org/springframework/data/ldap/core/mapping/LdapSimpleTypes.java @@ -44,4 +44,5 @@ public abstract class LdapSimpleTypes { public static final SimpleTypeHolder HOLDER = new SimpleTypeHolder(VAULT_SIMPLE_TYPES, true); private LdapSimpleTypes() {} + } diff --git a/src/main/java/org/springframework/data/ldap/core/mapping/package-info.java b/src/main/java/org/springframework/data/ldap/core/mapping/package-info.java index 6313446..b90b78c 100644 --- a/src/main/java/org/springframework/data/ldap/core/mapping/package-info.java +++ b/src/main/java/org/springframework/data/ldap/core/mapping/package-info.java @@ -1,6 +1,5 @@ /** * Infrastructure for the LDAP object mapping subsystem. */ -@org.springframework.lang.NonNullApi -@org.springframework.lang.NonNullFields +@org.jspecify.annotations.NullMarked package org.springframework.data.ldap.core.mapping; diff --git a/src/main/java/org/springframework/data/ldap/repository/LdapEncoder.java b/src/main/java/org/springframework/data/ldap/repository/LdapEncoder.java index f617ce5..108a6ca 100644 --- a/src/main/java/org/springframework/data/ldap/repository/LdapEncoder.java +++ b/src/main/java/org/springframework/data/ldap/repository/LdapEncoder.java @@ -49,6 +49,7 @@ public interface LdapEncoder { public String encode(String value) { return org.springframework.ldap.support.LdapEncoder.nameEncode(value); } + } /** @@ -79,6 +80,7 @@ public interface LdapEncoder { return buff.toString(); } + } } diff --git a/src/main/java/org/springframework/data/ldap/repository/LdapRepository.java b/src/main/java/org/springframework/data/ldap/repository/LdapRepository.java index 702c9a5..9086524 100644 --- a/src/main/java/org/springframework/data/ldap/repository/LdapRepository.java +++ b/src/main/java/org/springframework/data/ldap/repository/LdapRepository.java @@ -48,4 +48,5 @@ public interface LdapRepository extends ListCrudRepository { * @return the entries matching the query. */ List findAll(LdapQuery ldapQuery); + } diff --git a/src/main/java/org/springframework/data/ldap/repository/Query.java b/src/main/java/org/springframework/data/ldap/repository/Query.java index b12ed59..6e8b37a 100644 --- a/src/main/java/org/springframework/data/ldap/repository/Query.java +++ b/src/main/java/org/springframework/data/ldap/repository/Query.java @@ -75,4 +75,5 @@ public @interface Query { * @return the count limit. */ int countLimit() default 0; + } diff --git a/src/main/java/org/springframework/data/ldap/repository/cdi/LdapRepositoryBean.java b/src/main/java/org/springframework/data/ldap/repository/cdi/LdapRepositoryBean.java index ccf371d..b5dcf9f 100644 --- a/src/main/java/org/springframework/data/ldap/repository/cdi/LdapRepositoryBean.java +++ b/src/main/java/org/springframework/data/ldap/repository/cdi/LdapRepositoryBean.java @@ -70,4 +70,5 @@ public class LdapRepositoryBean extends CdiRepositoryBean { public Class getScope() { return operations.getScope(); } + } diff --git a/src/main/java/org/springframework/data/ldap/repository/cdi/LdapRepositoryExtension.java b/src/main/java/org/springframework/data/ldap/repository/cdi/LdapRepositoryExtension.java index d86129d..b878bc9 100644 --- a/src/main/java/org/springframework/data/ldap/repository/cdi/LdapRepositoryExtension.java +++ b/src/main/java/org/springframework/data/ldap/repository/cdi/LdapRepositoryExtension.java @@ -115,4 +115,5 @@ public class LdapRepositoryExtension extends CdiRepositoryExtensionSupport { return new LdapRepositoryBean<>(LdapOperations, qualifiers, repositoryType, beanManager, Optional.of(getCustomImplementationDetector())); } + } diff --git a/src/main/java/org/springframework/data/ldap/repository/cdi/package-info.java b/src/main/java/org/springframework/data/ldap/repository/cdi/package-info.java index 90e60bc..b4824f2 100644 --- a/src/main/java/org/springframework/data/ldap/repository/cdi/package-info.java +++ b/src/main/java/org/springframework/data/ldap/repository/cdi/package-info.java @@ -1,5 +1,5 @@ /** * CDI support for LDAP specific repository implementation. */ -@org.springframework.lang.NonNullApi +@org.jspecify.annotations.NullMarked package org.springframework.data.ldap.repository.cdi; diff --git a/src/main/java/org/springframework/data/ldap/repository/config/LdapRepositoriesRegistrar.java b/src/main/java/org/springframework/data/ldap/repository/config/LdapRepositoriesRegistrar.java index 3c8b076..c6052f1 100644 --- a/src/main/java/org/springframework/data/ldap/repository/config/LdapRepositoriesRegistrar.java +++ b/src/main/java/org/springframework/data/ldap/repository/config/LdapRepositoriesRegistrar.java @@ -36,4 +36,5 @@ class LdapRepositoriesRegistrar extends RepositoryBeanDefinitionRegistrarSupport protected RepositoryConfigurationExtension getExtension() { return new LdapRepositoryConfigurationExtension(); } + } diff --git a/src/main/java/org/springframework/data/ldap/repository/config/LdapRepositoryConfigurationExtension.java b/src/main/java/org/springframework/data/ldap/repository/config/LdapRepositoryConfigurationExtension.java index 782bb59..54d7df0 100644 --- a/src/main/java/org/springframework/data/ldap/repository/config/LdapRepositoryConfigurationExtension.java +++ b/src/main/java/org/springframework/data/ldap/repository/config/LdapRepositoryConfigurationExtension.java @@ -112,4 +112,5 @@ public class LdapRepositoryConfigurationExtension extends RepositoryConfiguratio protected boolean useRepositoryConfiguration(RepositoryMetadata metadata) { return !metadata.isReactiveRepository(); } + } diff --git a/src/main/java/org/springframework/data/ldap/repository/config/package-info.java b/src/main/java/org/springframework/data/ldap/repository/config/package-info.java index 79dacb3..4f86547 100644 --- a/src/main/java/org/springframework/data/ldap/repository/config/package-info.java +++ b/src/main/java/org/springframework/data/ldap/repository/config/package-info.java @@ -1,7 +1,5 @@ /** * Support infrastructure for the configuration of LDAP specific repositories. */ -@NonNullApi +@org.jspecify.annotations.NullMarked package org.springframework.data.ldap.repository.config; - -import org.springframework.lang.NonNullApi; diff --git a/src/main/java/org/springframework/data/ldap/repository/package-info.java b/src/main/java/org/springframework/data/ldap/repository/package-info.java index 4390d1e..ec8a36a 100644 --- a/src/main/java/org/springframework/data/ldap/repository/package-info.java +++ b/src/main/java/org/springframework/data/ldap/repository/package-info.java @@ -1,5 +1,5 @@ /** * LDAP specific repository implementation. */ -@org.springframework.lang.NonNullApi +@org.jspecify.annotations.NullMarked package org.springframework.data.ldap.repository; diff --git a/src/main/java/org/springframework/data/ldap/repository/query/AbstractLdapRepositoryQuery.java b/src/main/java/org/springframework/data/ldap/repository/query/AbstractLdapRepositoryQuery.java index 86d1fef..28f5312 100644 --- a/src/main/java/org/springframework/data/ldap/repository/query/AbstractLdapRepositoryQuery.java +++ b/src/main/java/org/springframework/data/ldap/repository/query/AbstractLdapRepositoryQuery.java @@ -17,6 +17,8 @@ package org.springframework.data.ldap.repository.query; import static org.springframework.data.ldap.repository.query.LdapQueryExecution.*; +import org.jspecify.annotations.Nullable; + import org.springframework.core.convert.converter.Converter; import org.springframework.data.ldap.repository.Query; import org.springframework.data.mapping.PersistentEntity; @@ -71,7 +73,7 @@ public abstract class AbstractLdapRepositoryQuery implements RepositoryQuery { @Override @SuppressWarnings("ConstantConditions") - public final Object execute(Object[] parameters) { + public final @Nullable Object execute(Object[] parameters) { LdapParametersParameterAccessor parameterAccessor = new LdapParametersParameterAccessor(queryMethod, parameters); LdapQuery query = createQuery(parameterAccessor); @@ -117,4 +119,5 @@ public abstract class AbstractLdapRepositoryQuery implements RepositoryQuery { public final QueryMethod getQueryMethod() { return queryMethod; } + } diff --git a/src/main/java/org/springframework/data/ldap/repository/query/LdapParameterAccessor.java b/src/main/java/org/springframework/data/ldap/repository/query/LdapParameterAccessor.java index 7137d6f..543e4b6 100644 --- a/src/main/java/org/springframework/data/ldap/repository/query/LdapParameterAccessor.java +++ b/src/main/java/org/springframework/data/ldap/repository/query/LdapParameterAccessor.java @@ -31,4 +31,5 @@ public interface LdapParameterAccessor extends ParameterAccessor { * @return */ Object[] getBindableParameterValues(); + } diff --git a/src/main/java/org/springframework/data/ldap/repository/query/LdapParameters.java b/src/main/java/org/springframework/data/ldap/repository/query/LdapParameters.java index 3186324..ee99baa 100644 --- a/src/main/java/org/springframework/data/ldap/repository/query/LdapParameters.java +++ b/src/main/java/org/springframework/data/ldap/repository/query/LdapParameters.java @@ -18,6 +18,8 @@ package org.springframework.data.ldap.repository.query; import java.lang.reflect.Method; import java.util.List; +import org.jspecify.annotations.Nullable; + import org.springframework.beans.BeanUtils; import org.springframework.core.MethodParameter; import org.springframework.data.geo.Distance; @@ -27,7 +29,6 @@ import org.springframework.data.repository.query.Parameter; import org.springframework.data.repository.query.Parameters; import org.springframework.data.repository.query.ParametersSource; import org.springframework.data.util.TypeInformation; -import org.springframework.lang.Nullable; /** * Custom extension of {@link Parameters} discovering additional diff --git a/src/main/java/org/springframework/data/ldap/repository/query/LdapQueryCreator.java b/src/main/java/org/springframework/data/ldap/repository/query/LdapQueryCreator.java index 6392a44..6dcb3bf 100644 --- a/src/main/java/org/springframework/data/ldap/repository/query/LdapQueryCreator.java +++ b/src/main/java/org/springframework/data/ldap/repository/query/LdapQueryCreator.java @@ -15,11 +15,11 @@ */ package org.springframework.data.ldap.repository.query; -import static org.springframework.ldap.query.LdapQueryBuilder.*; - import java.util.Iterator; import java.util.List; +import org.jspecify.annotations.Nullable; + import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.data.domain.Sort; import org.springframework.data.mapping.PropertyPath; @@ -73,7 +73,7 @@ class LdapQueryCreator extends AbstractQueryCreator extends AbstractEntityInformation { this.odm = odm; } - @Nullable @Override - public Name getId(T entity) { + public @Nullable Name getId(T entity) { return odm.getId(entity); } @@ -49,4 +49,5 @@ class LdapEntityInformation extends AbstractEntityInformation { public Class getIdType() { return Name.class; } + } diff --git a/src/main/java/org/springframework/data/ldap/repository/support/LdapRepositoryFactory.java b/src/main/java/org/springframework/data/ldap/repository/support/LdapRepositoryFactory.java index 838cffe..d68ddfd 100644 --- a/src/main/java/org/springframework/data/ldap/repository/support/LdapRepositoryFactory.java +++ b/src/main/java/org/springframework/data/ldap/repository/support/LdapRepositoryFactory.java @@ -22,6 +22,8 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.Optional; +import org.jspecify.annotations.Nullable; + import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.ldap.core.mapping.LdapMappingContext; import org.springframework.data.ldap.repository.query.AnnotatedLdapRepositoryQuery; @@ -149,7 +151,7 @@ public class LdapRepositoryFactory extends RepositoryFactorySupport { } @Override - protected Optional getQueryLookupStrategy(Key key, + protected Optional getQueryLookupStrategy(@Nullable Key key, ValueExpressionDelegate valueExpressionDelegate) { return Optional .of(new LdapQueryLookupStrategy(ldapOperations, instantiators, mappingContext, valueExpressionDelegate)); @@ -199,5 +201,7 @@ public class LdapRepositoryFactory extends RepositoryFactorySupport { return new PartTreeLdapRepositoryQuery(queryMethod, domainType, ldapOperations, mappingContext, instantiators); } } + } + } diff --git a/src/main/java/org/springframework/data/ldap/repository/support/LdapRepositoryFactoryBean.java b/src/main/java/org/springframework/data/ldap/repository/support/LdapRepositoryFactoryBean.java index c5c94bf..653535d 100644 --- a/src/main/java/org/springframework/data/ldap/repository/support/LdapRepositoryFactoryBean.java +++ b/src/main/java/org/springframework/data/ldap/repository/support/LdapRepositoryFactoryBean.java @@ -17,6 +17,8 @@ package org.springframework.data.ldap.repository.support; import javax.naming.Name; +import org.jspecify.annotations.Nullable; + import org.springframework.data.ldap.core.mapping.LdapMappingContext; import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.mapping.PersistentProperty; @@ -24,7 +26,6 @@ import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.repository.Repository; import org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport; import org.springframework.data.repository.core.support.RepositoryFactorySupport; -import org.springframework.lang.Nullable; import org.springframework.ldap.core.LdapOperations; import org.springframework.util.Assert; @@ -87,4 +88,5 @@ public class LdapRepositoryFactoryBean, S> setMappingContext(new LdapMappingContext()); } } + } diff --git a/src/main/java/org/springframework/data/ldap/repository/support/LdapSerializer.java b/src/main/java/org/springframework/data/ldap/repository/support/LdapSerializer.java index c193aea..d2462f5 100644 --- a/src/main/java/org/springframework/data/ldap/repository/support/LdapSerializer.java +++ b/src/main/java/org/springframework/data/ldap/repository/support/LdapSerializer.java @@ -126,4 +126,5 @@ class LdapSerializer implements Visitor { public Object visit(TemplateExpression expr, Void context) { throw new UnsupportedOperationException(); } + } diff --git a/src/main/java/org/springframework/data/ldap/repository/support/QuerydslLdapPredicateExecutor.java b/src/main/java/org/springframework/data/ldap/repository/support/QuerydslLdapPredicateExecutor.java index 187544a..0c4bed6 100644 --- a/src/main/java/org/springframework/data/ldap/repository/support/QuerydslLdapPredicateExecutor.java +++ b/src/main/java/org/springframework/data/ldap/repository/support/QuerydslLdapPredicateExecutor.java @@ -26,6 +26,8 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.jspecify.annotations.Nullable; + import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.data.convert.DtoInstantiatingConverter; import org.springframework.data.domain.Example; @@ -43,7 +45,6 @@ import org.springframework.data.querydsl.QuerydslPredicateExecutor; import org.springframework.data.repository.core.EntityInformation; import org.springframework.data.repository.query.FluentQuery; import org.springframework.data.support.PageableExecutionUtils; -import org.springframework.lang.Nullable; import org.springframework.ldap.core.LdapOperations; import org.springframework.ldap.query.LdapQueryBuilder; import org.springframework.util.Assert; @@ -247,9 +248,8 @@ public class QuerydslLdapPredicateExecutor implements ListQuerydslPredicateEx return new FluentQuerydsl<>(predicate, sort, resultType, new ArrayList<>(properties)); } - @Nullable @Override - public R oneValue() { + public @Nullable R oneValue() { List results = findTop(2); @@ -265,9 +265,8 @@ public class QuerydslLdapPredicateExecutor implements ListQuerydslPredicateEx return getConversionFunction().apply(one); } - @Nullable @Override - public R firstValue() { + public @Nullable R firstValue() { List results = findTop(2); diff --git a/src/main/java/org/springframework/data/ldap/repository/support/QuerydslLdapQuery.java b/src/main/java/org/springframework/data/ldap/repository/support/QuerydslLdapQuery.java index b3381bf..441fc6c 100644 --- a/src/main/java/org/springframework/data/ldap/repository/support/QuerydslLdapQuery.java +++ b/src/main/java/org/springframework/data/ldap/repository/support/QuerydslLdapQuery.java @@ -133,4 +133,5 @@ public class QuerydslLdapQuery implements FilteredClause return where != null ? builder.filter(filterGenerator.handle(where)) : builder.filter(new AbsoluteTrueFilter()); } + } diff --git a/src/main/java/org/springframework/data/ldap/repository/support/SimpleLdapRepository.java b/src/main/java/org/springframework/data/ldap/repository/support/SimpleLdapRepository.java index 0ac4534..ff061a0 100644 --- a/src/main/java/org/springframework/data/ldap/repository/support/SimpleLdapRepository.java +++ b/src/main/java/org/springframework/data/ldap/repository/support/SimpleLdapRepository.java @@ -24,6 +24,8 @@ import java.util.stream.StreamSupport; import javax.naming.Name; +import org.jspecify.annotations.Nullable; + import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.data.domain.Persistable; import org.springframework.data.ldap.repository.LdapRepository; @@ -31,7 +33,6 @@ import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.mapping.PersistentProperty; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.util.Optionals; -import org.springframework.lang.Nullable; import org.springframework.ldap.NameNotFoundException; import org.springframework.ldap.core.LdapOperations; import org.springframework.ldap.core.support.CountNameClassPairCallbackHandler; @@ -227,16 +228,8 @@ public class SimpleLdapRepository implements LdapRepository { return ldapOperations.find(ldapQuery, entityType); } - private boolean isNew(S entity, @Nullable Name id) { - - if (entity instanceof Persistable) { - Persistable persistable = (Persistable) entity; - return persistable.isNew(); - } else { - return id == null; - } + return entity instanceof Persistable p ? p.isNew() : id == null; } - } diff --git a/src/main/java/org/springframework/data/ldap/repository/support/package-info.java b/src/main/java/org/springframework/data/ldap/repository/support/package-info.java index b7b4cd0..6a32679 100644 --- a/src/main/java/org/springframework/data/ldap/repository/support/package-info.java +++ b/src/main/java/org/springframework/data/ldap/repository/support/package-info.java @@ -1,7 +1,5 @@ /** * Support infrastructure for query derivation of LDAP specific repositories. */ -@NonNullApi +@org.jspecify.annotations.NullMarked package org.springframework.data.ldap.repository.support; - -import org.springframework.lang.NonNullApi;