Skip to content

Commit

Permalink
Migrate to JSpecify annotations for nullability constraints.
Browse files Browse the repository at this point in the history
Closes #3170
  • Loading branch information
mp911de committed Feb 6, 2025
1 parent 9592c50 commit 44d119b
Show file tree
Hide file tree
Showing 344 changed files with 1,515 additions and 1,234 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
* @author Oliver Gierke
*/
@Documented
@Target({ ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, })
@Target({ ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessType {

Expand All @@ -40,4 +40,5 @@
enum Type {
FIELD, PROPERTY;
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Core annotations being used by Spring Data.
*/
@org.springframework.lang.NonNullApi
@org.jspecify.annotations.NullMarked
package org.springframework.data.annotation;
3 changes: 2 additions & 1 deletion src/main/java/org/springframework/data/aot/AotContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,15 @@
import java.util.Set;
import java.util.function.Consumer;

import org.jspecify.annotations.Nullable;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanReference;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.data.util.TypeScanner;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
package org.springframework.data.aot;

import org.jspecify.annotations.Nullable;

import org.springframework.aop.SpringProxy;
import org.springframework.aop.framework.Advised;
import org.springframework.aot.hint.RuntimeHints;
Expand All @@ -26,7 +28,6 @@
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.domain.ReactiveAuditorAware;
import org.springframework.data.util.ReactiveWrappers;
import org.springframework.lang.Nullable;
import org.springframework.util.ClassUtils;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import java.util.List;
import java.util.Optional;

import org.jspecify.annotations.Nullable;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanDefinition;
Expand Down Expand Up @@ -132,7 +134,7 @@ public RootBeanDefinition getRootBeanDefinition() throws NoSuchBeanDefinitionExc
}

@Override
public Class<?> resolveType() {
public @Nullable Class<?> resolveType() {
return factory.getType(beanName, false);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jspecify.annotations.Nullable;

import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution;
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor;
Expand All @@ -30,7 +31,6 @@
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.data.domain.ManagedTypes;
import org.springframework.lang.Contract;
import org.springframework.lang.Nullable;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

Expand All @@ -48,9 +48,9 @@ public class ManagedTypesBeanFactoryInitializationAotProcessor implements BeanFa
private static final Log logger = LogFactory.getLog(ManagedTypesBeanFactoryInitializationAotProcessor.class);

@Override
@Nullable
@Contract("_ -> null")
public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) {
public @Nullable BeanFactoryInitializationAotContribution processAheadOfTime(
ConfigurableListableBeanFactory beanFactory) {

processManagedTypes(beanFactory);
return null;
Expand Down Expand Up @@ -82,12 +82,15 @@ private void postProcessManagedTypes(ConfigurableListableBeanFactory beanFactory
}

Object value = potentiallyWrapToIterable(supplier.get());
String beanClassName = beanDefinition.getBeanClassName();

BeanDefinition beanDefinitionReplacement = newManagedTypeBeanDefinition(beanDefinition.getBeanClassName(),
value);
if (beanClassName != null) {

registry.removeBeanDefinition(beanName);
registry.registerBeanDefinition(beanName, beanDefinitionReplacement);
BeanDefinition beanDefinitionReplacement = newManagedTypeBeanDefinition(beanClassName, value);

registry.removeBeanDefinition(beanName);
registry.registerBeanDefinition(beanName, beanDefinitionReplacement);
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jspecify.annotations.Nullable;

import org.springframework.aot.generate.GenerationContext;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.BeanFactory;
Expand All @@ -34,7 +36,6 @@
import org.springframework.data.util.QTypeContributor;
import org.springframework.data.util.TypeContributor;
import org.springframework.data.util.TypeUtils;
import org.springframework.lang.Nullable;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;

Expand All @@ -61,7 +62,7 @@ public String getModuleIdentifier() {
}

@Override
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
public @Nullable BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {

if (!isMatch(registeredBean.getBeanClass(), registeredBean.getBeanName())) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

import javax.lang.model.element.Modifier;

import org.jspecify.annotations.Nullable;

import org.springframework.aot.generate.AccessControl;
import org.springframework.aot.generate.GeneratedMethod;
import org.springframework.aot.generate.GenerationContext;
Expand All @@ -41,7 +43,6 @@
import org.springframework.javapoet.ParameterizedTypeName;
import org.springframework.javapoet.TypeName;
import org.springframework.javapoet.WildcardTypeName;
import org.springframework.lang.Nullable;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.ReflectionUtils;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
* Support for registering the need for reflection, resources, java serialization and proxies at runtime for Ahead of
* Time compilation.
*/
@org.springframework.lang.NonNullApi
@org.jspecify.annotations.NullMarked
package org.springframework.data.aot;
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@
import java.time.temporal.TemporalAccessor;
import java.util.Optional;

import org.jspecify.annotations.Nullable;

import org.springframework.lang.Contract;
import org.springframework.lang.Nullable;

/**
* Interface to abstract the ways setting the auditing information can be implemented.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jspecify.annotations.Nullable;

import org.springframework.core.log.LogMessage;
import org.springframework.data.domain.Auditable;
import org.springframework.data.mapping.context.PersistentEntities;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

/**
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/org/springframework/data/auditing/Auditor.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@

import java.util.Optional;

import org.springframework.lang.Nullable;
import org.jspecify.annotations.Nullable;

import org.springframework.util.ObjectUtils;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,14 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Stream;

import org.jspecify.annotations.Nullable;

import org.springframework.core.ResolvableType;
import org.springframework.core.convert.ConversionService;
import org.springframework.data.convert.Jsr310Converters;
import org.springframework.data.domain.Auditable;
import org.springframework.data.util.ReflectionUtils;
import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

/**
Expand Down Expand Up @@ -115,7 +116,7 @@ public AuditableInterfaceBeanWrapper(ConversionService conversionService,
}

@Override
public Object setCreatedBy(@Nullable Object value) {
public @Nullable Object setCreatedBy(@Nullable Object value) {

auditable.setCreatedBy(value);
return value;
Expand All @@ -130,7 +131,7 @@ public TemporalAccessor setCreatedDate(TemporalAccessor value) {
}

@Override
public Object setLastModifiedBy(Object value) {
public @Nullable Object setLastModifiedBy(@Nullable Object value) {

auditable.setLastModifiedBy(value);

Expand Down Expand Up @@ -267,7 +268,7 @@ public ReflectionAuditingBeanWrapper(ConversionService conversionService, T targ
}

@Override
public Object setCreatedBy(@Nullable Object value) {
public @Nullable Object setCreatedBy(@Nullable Object value) {
return setField(metadata.getCreatedByField(), value);
}

Expand All @@ -277,7 +278,7 @@ public TemporalAccessor setCreatedDate(TemporalAccessor value) {
}

@Override
public Object setLastModifiedBy(@Nullable Object value) {
public @Nullable Object setLastModifiedBy(@Nullable Object value) {
return setField(metadata.getLastModifiedByField(), value);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import java.util.function.Predicate;
import java.util.stream.Stream;

import org.jspecify.annotations.Nullable;

import org.springframework.core.convert.ConversionService;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
Expand All @@ -41,7 +43,6 @@
import org.springframework.data.mapping.context.PersistentEntities;
import org.springframework.data.util.Lazy;
import org.springframework.lang.Contract;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

/**
Expand Down Expand Up @@ -195,7 +196,7 @@ public MappingMetadataAuditableBeanWrapper(
}

@Override
public Object setCreatedBy(Object value) {
public @Nullable Object setCreatedBy(@Nullable Object value) {
return setProperty(metadata.createdByPaths, value);
}

Expand All @@ -205,7 +206,7 @@ public TemporalAccessor setCreatedDate(TemporalAccessor value) {
}

@Override
public Object setLastModifiedBy(@Nullable Object value) {
public @Nullable Object setLastModifiedBy(@Nullable Object value) {
return setProperty(metadata.lastModifiedByPaths, value);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

import static org.springframework.beans.factory.support.BeanDefinitionBuilder.*;

import org.jspecify.annotations.Nullable;

import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.aop.target.LazyInitTargetSource;
import org.springframework.beans.factory.config.BeanDefinition;
Expand Down Expand Up @@ -45,7 +47,7 @@ public class AuditingHandlerBeanDefinitionParser extends AbstractSingleBeanDefin
private static final String AUDITOR_AWARE_REF = "auditor-aware-ref";

private final String mappingContextBeanName;
private String resolvedBeanName;
private @Nullable String resolvedBeanName;

/**
* Creates a new {@link AuditingHandlerBeanDefinitionParser} to point to a {@link MappingContext} with the given bean
Expand All @@ -65,7 +67,7 @@ public AuditingHandlerBeanDefinitionParser(String mappingContextBeanName) {
*
* @return the resolvedBeanName
*/
public String getResolvedBeanName() {
public @Nullable String getResolvedBeanName() {
return resolvedBeanName;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Types to abstract authentication concepts.
*/
@org.springframework.lang.NonNullApi
@org.jspecify.annotations.NullMarked
package org.springframework.data.auditing.config;
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* General support for entity auditing.
*/
@org.springframework.lang.NonNullApi
@org.jspecify.annotations.NullMarked
package org.springframework.data.auditing;
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,17 @@
*/
package org.springframework.data.config;

import org.jspecify.annotations.Nullable;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

import org.w3c.dom.Element;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import java.util.HashSet;
import java.util.regex.Pattern;

import org.jspecify.annotations.Nullable;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.FatalBeanException;
import org.springframework.beans.factory.parsing.ReaderContext;
Expand All @@ -30,7 +32,6 @@
import org.springframework.core.type.filter.AssignableTypeFilter;
import org.springframework.core.type.filter.RegexPatternTypeFilter;
import org.springframework.core.type.filter.TypeFilter;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

import org.w3c.dom.Element;
Expand Down Expand Up @@ -101,7 +102,8 @@ public Collection<TypeFilter> parseTypeFilters(Element element, Type type) {
try {
filters.add(createTypeFilter(childElement, classLoader));
} catch (RuntimeException e) {
readerContext.error(e.getMessage(), readerContext.extractSource(element), e.getCause());
readerContext.error("Failed creating type filter: " + e.getMessage(), readerContext.extractSource(element),
e.getCause());
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Basic support for creating custom Spring namespaces and JavaConfig.
*/
@org.springframework.lang.NonNullApi
@org.jspecify.annotations.NullMarked
package org.springframework.data.config;
Loading

0 comments on commit 44d119b

Please sign in to comment.